From 82ba23d150bcf2c2c6204267734eba23248212ce Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Mon, 2 Dec 2024 19:01:00 -0500 Subject: [PATCH 01/77] Add ADMIN_ACTION types to manage peers and minting accounts --- src/qortalRequests/get.ts | 59 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index fa59def..c7f7046 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -3169,6 +3169,20 @@ export const adminAction = async (data, isFromExtension) => { missingFields.push(field); } }); + // For actions that require a value, check for 'value' field + const actionsRequiringValue = [ + "addpeer", + "removepeer", + "forcesync", + "addmintingaccount", + "removemintingaccount", + ]; + if ( + actionsRequiringValue.includes(data.type.toLowerCase()) && + !data.value + ) { + missingFields.push("value"); + } if (missingFields.length > 0) { const missingFieldsString = missingFields.join(", "); const errorMsg = `Missing fields: ${missingFieldsString}`; @@ -3180,6 +3194,8 @@ export const adminAction = async (data, isFromExtension) => { } let apiEndpoint = ""; + let method = "GET"; // Default method + let includeValueInBody = false; switch (data.type.toLowerCase()) { case "stop": apiEndpoint = await createEndpoint("/admin/stop"); @@ -3190,19 +3206,58 @@ export const adminAction = async (data, isFromExtension) => { case "bootstrap": apiEndpoint = await createEndpoint("/admin/bootstrap"); break; + case "addmintingaccount": + apiEndpoint = await createEndpoint("/admin/mintingaccounts"); + method = "POST"; + includeValueInBody = true; + break; + case "removemintingaccount": + apiEndpoint = await createEndpoint("/admin/mintingaccounts"); + method = "DELETE"; + includeValueInBody = true; + break; + case "forcesync": + apiEndpoint = await createEndpoint("/admin/forcesync"); + method = "POST"; + includeValueInBody = true; + break; + case "addpeer": + apiEndpoint = await createEndpoint("/peers"); + method = "POST"; + includeValueInBody = true; + break; + case "removepeer": + apiEndpoint = await createEndpoint("/peers"); + method = "DELETE"; + includeValueInBody = true; + break; default: throw new Error(`Unknown admin action type: ${data.type}`); } + // Prepare the permission prompt text + let permissionText = `Do you give this application permission to perform the admin action: ${data.type}`; + if (data.value) { + permissionText += ` with value: ${data.value}`; + } const resPermission = await getUserPermission( { - text1: `Do you give this application permission to perform a node ${data.type}?`, + text1: permissionText, }, isFromExtension ); const { accepted } = resPermission; if (accepted) { - const response = await fetch(apiEndpoint); + // Set up options for the API call + const options: RequestInit = { + method: method, + headers: {}, + }; + if (includeValueInBody) { + options.headers["Content-Type"] = "text/plain"; + options.body = data.value; + } + const response = await fetch(apiEndpoint, options); if (!response.ok) throw new Error("Failed to perform request"); let res; From 17f78c0e23e646ae46296570326802695e40bc29 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Tue, 3 Dec 2024 03:05:38 -0500 Subject: [PATCH 02/77] added popover for reactions --- src/components/Chat/MessageItem.tsx | 81 +++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/src/components/Chat/MessageItem.tsx b/src/components/Chat/MessageItem.tsx index 47d4417..507fc12 100644 --- a/src/components/Chat/MessageItem.tsx +++ b/src/components/Chat/MessageItem.tsx @@ -1,8 +1,8 @@ import { Message } from "@chatscope/chat-ui-kit-react"; -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import { useInView } from "react-intersection-observer"; import { MessageDisplay } from "./MessageDisplay"; -import { Avatar, Box, ButtonBase, Typography } from "@mui/material"; +import { Avatar, Box, Button, ButtonBase, List, ListItem, ListItemText, Popover, Typography } from "@mui/material"; import { formatTimestamp } from "../../utils/time"; import { getBaseApi } from "../../background"; import { getBaseApiReact } from "../../App"; @@ -40,6 +40,8 @@ export const MessageItem = ({ triggerOnce: false, // Only trigger once when it becomes visible }); + const [anchorEl, setAnchorEl] = useState(null); + const [selectedReaction, setSelectedReaction] = useState(null); useEffect(() => { @@ -246,17 +248,15 @@ export const MessageItem = ({ // const myReaction = reactions if(numberOfReactions === 0) return null return ( - { - if(reactions[reaction] && reactions[reaction]?.find((item)=> item?.sender === myAddress)){ - handleReaction(reaction, message, false) - } else { - handleReaction(reaction, message, true) - } + }} onClick={(event) => { + event.stopPropagation(); // Prevent event bubbling + setAnchorEl(event.currentTarget); + setSelectedReaction(reaction); }}>
+ {selectedReaction && ( + { + setAnchorEl(null); + setSelectedReaction(null); + }} + anchorOrigin={{ + vertical: "top", + horizontal: "center", + }} + transformOrigin={{ + vertical: "bottom", + horizontal: "center", + }} + PaperProps={{ + style: { + backgroundColor: "#232428", + color: "white", + }, + }} + > + + + People who reacted with {selectedReaction} + + + {reactions[selectedReaction]?.map((reactionItem) => ( + + + + ))} + + + + + )} Date: Tue, 3 Dec 2024 12:46:20 +0200 Subject: [PATCH 03/77] added max width and height to reaction list --- src/components/Chat/MessageItem.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/Chat/MessageItem.tsx b/src/components/Chat/MessageItem.tsx index 507fc12..bd2d86c 100644 --- a/src/components/Chat/MessageItem.tsx +++ b/src/components/Chat/MessageItem.tsx @@ -296,7 +296,11 @@ export const MessageItem = ({ People who reacted with {selectedReaction} - + {reactions[selectedReaction]?.map((reactionItem) => ( Date: Tue, 3 Dec 2024 04:08:59 -0500 Subject: [PATCH 04/77] show group chats without secret key --- src/components/Chat/ChatGroup.tsx | 1 - src/components/Group/Group.tsx | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/Chat/ChatGroup.tsx b/src/components/Chat/ChatGroup.tsx index 9d38ce8..f5039c0 100644 --- a/src/components/Chat/ChatGroup.tsx +++ b/src/components/Chat/ChatGroup.tsx @@ -182,7 +182,6 @@ const [messageSize, setMessageSize] = useState(0) try { if(!secretKeyRef.current){ checkForFirstSecretKeyNotification(encryptedMessages) - return } return new Promise((res, rej)=> { window.sendMessage("decryptSingle", { diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx index df1f0c3..5cf00ef 100644 --- a/src/components/Group/Group.tsx +++ b/src/components/Group/Group.tsx @@ -2487,8 +2487,7 @@ export const Group = ({ handleNewEncryptionNotification={ setNewEncryptionNotification } - hide={groupSection !== "chat" || !secretKey || selectedDirect || newChat} - hideView={!(desktopViewMode === 'chat' && selectedGroup)} + hide={groupSection !== "chat" || selectedDirect || newChat} handleSecretKeyCreationInProgress={ handleSecretKeyCreationInProgress } @@ -2542,6 +2541,10 @@ export const Group = ({ Wait until an admin re-encrypts the keys. + + Only unencrypted messages will be displayed. + + Try notifying an admin from the list of admins below: From e1b6fa39f945377d43af7cb6249ce9363df3074d Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Tue, 3 Dec 2024 04:14:01 -0500 Subject: [PATCH 05/77] restore unintentionally removed code --- src/components/Group/Group.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx index 5cf00ef..51cdc76 100644 --- a/src/components/Group/Group.tsx +++ b/src/components/Group/Group.tsx @@ -2488,6 +2488,7 @@ export const Group = ({ setNewEncryptionNotification } hide={groupSection !== "chat" || selectedDirect || newChat} + hideView={!(desktopViewMode === 'chat' && selectedGroup)} handleSecretKeyCreationInProgress={ handleSecretKeyCreationInProgress } From 5c340b99f2fc263fdcd12a749a75bc8f389798cc Mon Sep 17 00:00:00 2001 From: PhilReact Date: Tue, 3 Dec 2024 13:00:59 +0200 Subject: [PATCH 06/77] hide chat options and editor if no secretKey --- src/components/Chat/ChatGroup.tsx | 8 +++++--- src/components/Chat/ChatList.tsx | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/Chat/ChatGroup.tsx b/src/components/Chat/ChatGroup.tsx index f5039c0..4ff4f94 100644 --- a/src/components/Chat/ChatGroup.tsx +++ b/src/components/Chat/ChatGroup.tsx @@ -746,9 +746,9 @@ const clearEditorContent = () => { left: hide && '-100000px', }}> - + - + {!!secretKey && (
{ )} - + +
{messageSize > 750 && ( { {/* */}
+ )} {isOpenQManager !== null && ( { const parentRef = useRef(); const [messages, setMessages] = useState(initialMessages); @@ -406,7 +407,7 @@ export const ChatList = ({ )} - {enableMentions && ( + {enableMentions && hasSecretKey && ( Date: Tue, 3 Dec 2024 14:01:07 +0200 Subject: [PATCH 07/77] move send btn to the side, changed add group label --- src/components/Chat/ChatDirect.tsx | 39 +++++++++--------------------- src/components/Chat/ChatGroup.tsx | 37 ++++++++-------------------- src/components/Group/AddGroup.tsx | 2 +- src/components/Group/Group.tsx | 2 +- 4 files changed, 24 insertions(+), 56 deletions(-) diff --git a/src/components/Chat/ChatDirect.tsx b/src/components/Chat/ChatDirect.tsx index cbd5b6e..cb40066 100644 --- a/src/components/Chat/ChatDirect.tsx +++ b/src/components/Chat/ChatDirect.tsx @@ -580,7 +580,7 @@ useEffect(() => { backgroundColor: "#232428", minHeight: isMobile ? '0px' : '150px', display: 'flex', - flexDirection: 'column', + flexDirection: 'row', overflow: 'hidden', width: '100%', boxSizing: 'border-box', @@ -596,14 +596,17 @@ useEffect(() => { flexDirection: 'column', flexGrow: isMobile && 1, overflow: !isMobile && "auto", - flexShrink: 0 + flexShrink: 0, + width: 'calc(100% - 100px)', + justifyContent: 'flex-end' }}> {replyMessage && ( @@ -660,34 +663,14 @@ useEffect(() => { )} - {isFocusedParent && ( - { - if(isSending) return - setIsFocusedParent(false) - clearEditorContent() - // Unfocus the editor - }} - style={{ - marginTop: 'auto', - alignSelf: 'center', - cursor: isSending ? 'default' : 'pointer', - background: 'red', - flexShrink: 0, - padding: isMobile && '5px' - }} - > - - {` Close`} - - - )} + { if(messageSize > 4000) return @@ -701,7 +684,9 @@ useEffect(() => { cursor: isSending ? 'default' : 'pointer', background: isSending && 'rgba(0, 0, 0, 0.8)', flexShrink: 0, - padding: isMobile && '5px' + padding: '5px', + width: '100px', + minWidth: 'auto' }} > {isSending && ( diff --git a/src/components/Chat/ChatGroup.tsx b/src/components/Chat/ChatGroup.tsx index 4ff4f94..b7e15d8 100644 --- a/src/components/Chat/ChatGroup.tsx +++ b/src/components/Chat/ChatGroup.tsx @@ -755,7 +755,7 @@ const clearEditorContent = () => { backgroundColor: "#232428", minHeight: isMobile ? '0px' : '150px', display: 'flex', - flexDirection: 'column', + flexDirection: 'row', overflow: 'hidden', width: '100%', boxSizing: 'border-box', @@ -766,12 +766,15 @@ const clearEditorContent = () => { zIndex: isFocusedParent ? 5 : 'unset', flexShrink: 0 }}> +
{replyMessage && ( { )} - {isFocusedParent && ( - { - if(isSending) return - setIsFocusedParent(false) - clearEditorContent() - // Unfocus the editor - }} - style={{ - marginTop: 'auto', - alignSelf: 'center', - cursor: isSending ? 'default' : 'pointer', - background: 'red', - flexShrink: 0, - padding: isMobile && '5px' - }} - > - - {` Close`} - - - )} + { if(messageSize > 4000) return @@ -877,7 +859,9 @@ const clearEditorContent = () => { cursor: isSending ? 'default' : 'pointer', background: isSending && 'rgba(0, 0, 0, 0.8)', flexShrink: 0, - padding: isMobile && '5px', + padding: '5px', + width: '100px', + minWidth: 'auto' }} > @@ -898,7 +882,6 @@ const clearEditorContent = () => { - {/* */}
)} {isOpenQManager !== null && ( diff --git a/src/components/Group/AddGroup.tsx b/src/components/Group/AddGroup.tsx index f4c6e6d..ed90c8c 100644 --- a/src/components/Group/AddGroup.tsx +++ b/src/components/Group/AddGroup.tsx @@ -194,7 +194,7 @@ export const AddGroup = ({ address, open, setOpen }) => { - Add Group + Group Mgmt - Add Group + Group Mgmt
)} {chatMode === "directs" && ( From dc0dbc55dff5343530a19fc441be54cd60db3256 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Tue, 3 Dec 2024 15:21:42 +0200 Subject: [PATCH 08/77] added input for qortallinks --- src/components/Apps/AppsHomeDesktop.tsx | 80 ++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/src/components/Apps/AppsHomeDesktop.tsx b/src/components/Apps/AppsHomeDesktop.tsx index 6481871..ebae36a 100644 --- a/src/components/Apps/AppsHomeDesktop.tsx +++ b/src/components/Apps/AppsHomeDesktop.tsx @@ -7,20 +7,37 @@ import { AppsContainer, AppsParent, } from "./Apps-styles"; -import { Avatar, ButtonBase } from "@mui/material"; +import { Avatar, Box, ButtonBase, Input } from "@mui/material"; import { Add } from "@mui/icons-material"; import { getBaseApiReact, isMobile } from "../../App"; import LogoSelected from "../../assets/svgs/LogoSelected.svg"; import { executeEvent } from "../../utils/events"; import { Spacer } from "../../common/Spacer"; import { SortablePinnedApps } from "./SortablePinnedApps"; - +import { extractComponents } from "../Chat/MessageDisplay"; +import ArrowOutwardIcon from '@mui/icons-material/ArrowOutward'; export const AppsHomeDesktop = ({ setMode, myApp, myWebsite, availableQapps, }) => { + const [qortalUrl, setQortalUrl] = useState('') + + const openQortalUrl = ()=> { + try { + if(!qortalUrl) return + const res = extractComponents(qortalUrl); + if (res) { + const { service, name, identifier, path } = res; + executeEvent("addTab", { data: { service, name, identifier, path } }); + executeEvent("open-apps-mode", { }); + setQortalUrl('qortal://') + } + } catch (error) { + + } + } return ( <> + + + + { + setQortalUrl(e.target.value) + }} + disableUnderline + autoComplete='off' + autoCorrect='off' + placeholder="qortal://" + sx={{ + width: '100%', + color: 'white', + '& .MuiInput-input::placeholder': { + color: 'rgba(84, 84, 84, 0.70) !important', + fontSize: '20px', + fontStyle: 'normal', + fontWeight: 400, + lineHeight: '120%', // 24px + letterSpacing: '0.15px', + opacity: 1 + }, + '&:focus': { + outline: 'none', + }, + // Add any additional styles for the input here + }} + onKeyDown={(e) => { + if (e.key === 'Enter' && qortalUrl) { + console.log('hello') + openQortalUrl(); + } + }} + /> + openQortalUrl()}> + + + + Date: Wed, 4 Dec 2024 09:43:44 +0200 Subject: [PATCH 09/77] fix typo --- src/components/Chat/CreateCommonSecret.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Chat/CreateCommonSecret.tsx b/src/components/Chat/CreateCommonSecret.tsx index 2e2088a..c371c55 100644 --- a/src/components/Chat/CreateCommonSecret.tsx +++ b/src/components/Chat/CreateCommonSecret.tsx @@ -152,7 +152,7 @@ export const CreateCommonSecret = ({groupId, secretKey, isOwner, myAddress, sec maxWidth: '350px', background: '#444444' }}> - Re-encyrpt key + Re-encrypt key {noSecretKey ? ( There is no group secret key. Be the first admin to publish one! From f33b2db4d46f5ac76316ed0b920f0db408fec396 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Thu, 5 Dec 2024 14:11:29 +0200 Subject: [PATCH 10/77] fix scrolldown when new msg --- src/components/Chat/ChatList.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Chat/ChatList.tsx b/src/components/Chat/ChatList.tsx index 8c16c93..3cae591 100644 --- a/src/components/Chat/ChatList.tsx +++ b/src/components/Chat/ChatList.tsx @@ -37,6 +37,7 @@ export const ChatList = ({ const hasLoadedInitialRef = useRef(false); const scrollingIntervalRef = useRef(null); + const lastSeenUnreadMessageTimestamp = useRef(null); // Initialize the virtualizer @@ -108,7 +109,7 @@ export const ChatList = ({ setTimeout(() => { const hasUnreadMessages = totalMessages.some( - (msg) => msg.unread && !msg?.chatReference && !msg?.isTemp + (msg) => msg.unread && !msg?.chatReference && !msg?.isTemp && (!msg?.chatReference && msg?.timestamp > lastSeenUnreadMessageTimestamp.current || 0) ); if (parentRef.current) { const { scrollTop, scrollHeight, clientHeight } = parentRef.current; @@ -152,6 +153,7 @@ export const ChatList = ({ })) ); setShowScrollButton(false); + lastSeenUnreadMessageTimestamp.current = Date.now() }, []); const sentNewMessageGroupFunc = useCallback(() => { @@ -385,7 +387,7 @@ export const ChatList = ({ Scroll to Unread Messages )} - {showScrollDownButton && ( + {showScrollDownButton && !showScrollButton && ( + + + + + + )} + + {isLoadingPayments && ( + + + + )} + {!isLoadingPayments && addressInfo && ( + + 20 most recent payments + + {!isLoadingPayments && payments?.length === 0 && ( + + No payments + + )} + + + + Sender + Reciver + Amount + Time + + + + {payments.map((payment, index) => ( + + + + copy address + + } + placement="bottom" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, + }} + > + { + navigator.clipboard.writeText( + payment?.creatorAddress + ); + }} + > + {formatAddress(payment?.creatorAddress)} + + + + + + copy address + + } + placement="bottom" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, + }} + > + { + navigator.clipboard.writeText(payment?.recipient); + }} + > + {formatAddress(payment?.recipient)} + + + + + + {payment?.amount} + + {formatTimestamp(payment?.timestamp)} + + ))} + +
+
+ )} + +
+
+ + ); +}; diff --git a/src/components/WrapperUserAction.tsx b/src/components/WrapperUserAction.tsx index 8bcc03a..3bcb143 100644 --- a/src/components/WrapperUserAction.tsx +++ b/src/components/WrapperUserAction.tsx @@ -121,6 +121,42 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => { > Copy address + + + + +
diff --git a/src/utils/time.ts b/src/utils/time.ts index b0a27cf..c89c1cd 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -12,7 +12,7 @@ export function formatTimestamp(timestamp: number): string { } else if (elapsedTime < 1440) { return `${Math.floor(elapsedTime / 60)}h ago` } else { - return timestampMoment.format('MMM D') + return timestampMoment.format('MMM D, YYYY') } } export function formatTimestampForum(timestamp: number): string { From a3c6a7cf100490290dba3eb6beef8b47477da535 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Fri, 28 Feb 2025 17:42:13 +0200 Subject: [PATCH 14/77] autofocus --- src/components/UserLookup.tsx/UserLookup.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/UserLookup.tsx/UserLookup.tsx b/src/components/UserLookup.tsx/UserLookup.tsx index d8bb0ea..b2c6736 100644 --- a/src/components/UserLookup.tsx/UserLookup.tsx +++ b/src/components/UserLookup.tsx/UserLookup.tsx @@ -126,6 +126,7 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => { }} > setNameOrAddress(e.target.value)} size="small" From 55448ab8a7aae1555b32824e8ab686698ace0c88 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Fri, 28 Feb 2025 21:14:03 +0200 Subject: [PATCH 15/77] remove double --- src/components/WrapperUserAction.tsx | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/components/WrapperUserAction.tsx b/src/components/WrapperUserAction.tsx index 3bcb143..9aa5cbf 100644 --- a/src/components/WrapperUserAction.tsx +++ b/src/components/WrapperUserAction.tsx @@ -121,24 +121,6 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => { > Copy address - - + + + + ) +} diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx index c4c7622..c2a42df 100644 --- a/src/components/Group/Group.tsx +++ b/src/components/Group/Group.tsx @@ -2528,6 +2528,7 @@ export const Group = ({ { + const [checked1, setChecked1] = React.useState(false); + const [checked2, setChecked2] = React.useState(false); + React.useEffect(() => { + if (balance && +balance >= 6) { + setChecked1(true); + } + }, [balance]); + + + React.useEffect(() => { + if (name) setChecked2(true); + }, [name]); + + + const isLoaded = React.useMemo(()=> { + if(userInfo !== null) return true + return false + }, [ userInfo]) + + const hasDoneNameAndBalanceAndIsLoaded = React.useMemo(()=> { + if(isLoaded && checked1 && checked2) return true + return false + }, [checked1, isLoaded, checked2]) + + return ( */} - + )} + + + )} @@ -185,6 +216,9 @@ export const HomeDesktop = ({ {" "} + {!hasDoneNameAndBalanceAndIsLoaded && ( + + )} - + {hasDoneNameAndBalanceAndIsLoaded && ( + + + )} + + diff --git a/src/components/Group/ThingsToDoInitial.tsx b/src/components/Group/ThingsToDoInitial.tsx index 0a02f36..367b3b1 100644 --- a/src/components/Group/ThingsToDoInitial.tsx +++ b/src/components/Group/ThingsToDoInitial.tsx @@ -12,27 +12,17 @@ import { Box, Typography } from "@mui/material"; import { Spacer } from "../../common/Spacer"; import { isMobile } from "../../App"; import { QMailMessages } from "./QMailMessages"; +import { executeEvent } from "../../utils/events"; export const ThingsToDoInitial = ({ myAddress, name, hasGroups, balance, userInfo }) => { const [checked1, setChecked1] = React.useState(false); const [checked2, setChecked2] = React.useState(false); - const [checked3, setChecked3] = React.useState(false); + // const [checked3, setChecked3] = React.useState(false); - // const getAddressInfo = async (address) => { - // const response = await fetch(getBaseApiReact() + "/addresses/" + address); - // const data = await response.json(); - // if (data.error && data.error === 124) { - // setChecked1(false); - // } else if (data.address) { - // setChecked1(true); - // } - // }; + // React.useEffect(() => { + // if (hasGroups) setChecked3(true); + // }, [hasGroups]); - // const checkInfo = async () => { - // try { - // getAddressInfo(myAddress); - // } catch (error) {} - // }; React.useEffect(() => { if (balance && +balance >= 6) { @@ -40,9 +30,6 @@ export const ThingsToDoInitial = ({ myAddress, name, hasGroups, balance, userInf } }, [balance]); - React.useEffect(() => { - if (hasGroups) setChecked3(true); - }, [hasGroups]); React.useEffect(() => { if (name) setChecked2(true); @@ -120,11 +107,14 @@ if(!isLoaded) return null disableRipple role={undefined} dense + onClick={()=> { + executeEvent("openBuyQortInfo", {}) + }} > - { + executeEvent('openRegisterName', {}) + }} sx={{ "& .MuiTypography-root": { - fontSize: "13px", + fontSize: "1rem", fontWeight: 400, }, }} primary={`Register a name`} /> @@ -202,16 +194,7 @@ if(!isLoaded) return null - - // - // - // } + {/* - + */} )} diff --git a/src/components/RegisterName.tsx b/src/components/RegisterName.tsx new file mode 100644 index 0000000..35af458 --- /dev/null +++ b/src/components/RegisterName.tsx @@ -0,0 +1,312 @@ +import React, { useCallback, useContext, useEffect, useState } from 'react' +import { + Avatar, + Box, + Button, + ButtonBase, + Collapse, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + Input, + ListItem, + ListItemAvatar, + ListItemButton, + ListItemIcon, + ListItemText, + List, + MenuItem, + Popover, + Select, + TextField, + Typography, + } from "@mui/material"; +import { Label } from './Group/AddGroup'; +import { Spacer } from '../common/Spacer'; +import { LoadingButton } from '@mui/lab'; +import { getBaseApiReact, MyContext } from '../App'; +import { getFee } from '../background'; +import RadioButtonCheckedIcon from '@mui/icons-material/RadioButtonChecked'; +import { subscribeToEvent, unsubscribeFromEvent } from '../utils/events'; +import { BarSpinner } from '../common/Spinners/BarSpinner/BarSpinner'; +import CheckIcon from '@mui/icons-material/Check'; +import ErrorIcon from '@mui/icons-material/Error'; + +enum Availability { + NULL = 'null', + LOADING = 'loading', + AVAILABLE = 'available', + NOT_AVAILABLE = 'not-available' +} +export const RegisterName = ({setOpenSnack, setInfoSnack, userInfo, show, setTxList, balance}) => { + const [isOpen, setIsOpen] = useState(false) + const [registerNameValue, setRegisterNameValue] = useState('') + const [isLoadingRegisterName, setIsLoadingRegisterName] = useState(false) + const [isNameAvailable, setIsNameAvailable] = useState(Availability.NULL) + const [nameFee, setNameFee] = useState(null) + + const checkIfNameExisits = async (name)=> { + if(!name?.trim()){ + setIsNameAvailable(Availability.NULL) + + return + } + setIsNameAvailable(Availability.LOADING) + try { + const res = await fetch(`${getBaseApiReact()}/names/` + name); + const data = await res.json() + if(data?.message === 'name unknown'){ + setIsNameAvailable(Availability.AVAILABLE) + } else { + setIsNameAvailable(Availability.NOT_AVAILABLE) + } + } catch (error) { + console.error(error) + } finally { + } + } + // Debounce logic + useEffect(() => { + const handler = setTimeout(() => { + checkIfNameExisits(registerNameValue); + }, 500); + + // Cleanup timeout if searchValue changes before the timeout completes + return () => { + clearTimeout(handler); + }; + }, [registerNameValue]); + + const openRegisterNameFunc = useCallback((e) => { + setIsOpen(true) + + }, [ setIsOpen]); + + useEffect(() => { + subscribeToEvent("openRegisterName", openRegisterNameFunc); + + return () => { + unsubscribeFromEvent("openRegisterName", openRegisterNameFunc); + }; + }, [openRegisterNameFunc]); + + useEffect(()=> { + const nameRegistrationFee = async ()=> { + try { + const fee = await getFee("REGISTER_NAME"); + setNameFee(fee?.fee) + } catch (error) { + console.error(error) + } + } + nameRegistrationFee() + }, []) + + const registerName = async () => { + try { + if (!userInfo?.address) throw new Error("Your address was not found"); + if(!registerNameValue) throw new Error('Enter a name') + + const fee = await getFee("REGISTER_NAME"); + await show({ + message: "Would you like to register this name?", + publishFee: fee.fee + " QORT", + }); + setIsLoadingRegisterName(true); + new Promise((res, rej) => { + window + .sendMessage("registerName", { + name: registerNameValue, + }) + .then((response) => { + if (!response?.error) { + res(response); + setIsLoadingRegisterName(false); + setInfoSnack({ + type: "success", + message: + "Successfully registered. It may take a couple of minutes for the changes to propagate", + }); + setIsOpen(false); + setRegisterNameValue(""); + setOpenSnack(true); + setTxList((prev) => [ + { + ...response, + type: "register-name", + label: `Registered name: awaiting confirmation. This may take a couple minutes.`, + labelDone: `Registered name: success!`, + done: false, + }, + ...prev.filter((item) => !item.done), + ]); + return; + } + setInfoSnack({ + type: "error", + message: response?.error, + }); + setOpenSnack(true); + rej(response.error); + }) + .catch((error) => { + setInfoSnack({ + type: "error", + message: error.message || "An error occurred", + }); + setOpenSnack(true); + rej(error); + }); + }); + } catch (error) { + if (error?.message) { + setOpenSnack(true) + setInfoSnack({ + type: "error", + message: error?.message, + }); + } + } finally { + setIsLoadingRegisterName(false); + } + }; + + return ( + + + {"Register name"} + + + + + setRegisterNameValue(e.target.value)} + value={registerNameValue} + placeholder="Choose a name" + /> + {(!balance || (nameFee && balance && balance < nameFee))&& ( + <> + + + + Your balance is {balance ?? 0} QORT. A name registration requires a {nameFee} QORT fee + + + + + )} + + {isNameAvailable === Availability.AVAILABLE && ( + + + {registerNameValue} is available + + )} + {isNameAvailable === Availability.NOT_AVAILABLE && ( + + + {registerNameValue} is unavailable + + )} + {isNameAvailable === Availability.LOADING && ( + + + Checking if name already existis + + )} + + Benefits of a name + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/src/main.tsx b/src/main.tsx index 0531491..dcaf3ca 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -24,6 +24,10 @@ const theme = createTheme({ secondary: '#b0b0b0', // Light gray for secondary text disabled: '#808080', // Gray for disabled text }, + action: { + // disabledBackground: 'set color of background here', + disabled: 'rgb(255 255 255 / 70%)' + } }, typography: { fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', // Font family From b1b7114972a09fdbbb3bca3dc35eb0df1026e95b Mon Sep 17 00:00:00 2001 From: AlphaX-Qortal <67390536+AlphaX-Qortal@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:57:32 +0100 Subject: [PATCH 18/77] Update dependencies --- package-lock.json | 18 ++++++++++-------- package.json | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index e8c249f..df0b6dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@chatscope/chat-ui-kit-react": "^2.0.3", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", - "@electron/packager": "^18.3.5", + "@electron/packager": "^18.3.6", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@evva/capacitor-secure-storage-plugin": "^3.0.1", @@ -51,7 +51,7 @@ "cordova-plugin-android-permissions": "^1.1.5", "cordova-plugin-file": "^8.1.1", "dompurify": "^3.1.6", - "electron": "^33.0.2", + "electron": "^32.3.1", "electron-builder": "^25.1.8", "emoji-picker-react": "^4.12.0", "file-saver": "^2.0.5", @@ -914,9 +914,10 @@ } }, "node_modules/@electron/packager": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.5.tgz", - "integrity": "sha512-ClgTxXTt3MesWAcjIxIkgxELjTcllw1FRoVsihP7uT48kpDMqI71p4XvnMWbq8PvU57TcrKICAaLkxRhbc+/wQ==", + "version": "18.3.6", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.6.tgz", + "integrity": "sha512-1eXHB5t+SQKvUiDpWGpvr90ZSSbXj+isrh3YbjCTjKT4bE4SQrKSBfukEAaBvp67+GXHFtCHjQgN9qSTFIge+Q==", + "license": "BSD-2-Clause", "dependencies": { "@electron/asar": "^3.2.13", "@electron/get": "^3.0.0", @@ -7243,10 +7244,11 @@ } }, "node_modules/electron": { - "version": "33.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-33.0.2.tgz", - "integrity": "sha512-C2WksfP0COsMHbYXSJG68j6S3TjuGDrw/YT42B526yXalIlNQZ2GeAYKryg6AEMkIp3p8TUfDRD0+HyiyCt/nw==", + "version": "32.3.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.3.2.tgz", + "integrity": "sha512-pHEfoR6I7crJabEfWdPrdKqadWp7Ch1V3+gYDsMNIZ9FB3GNy91p0Z4gkyCop2LCd4ckAT1U8Z+UexhxsbPzWQ==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^20.9.0", diff --git a/package.json b/package.json index dcf359a..f8ba271 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@chatscope/chat-ui-kit-react": "^2.0.3", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", - "@electron/packager": "^18.3.5", + "@electron/packager": "^18.3.6", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@evva/capacitor-secure-storage-plugin": "^3.0.1", @@ -55,7 +55,7 @@ "cordova-plugin-android-permissions": "^1.1.5", "cordova-plugin-file": "^8.1.1", "dompurify": "^3.1.6", - "electron": "^33.0.2", + "electron": "^32.3.1", "electron-builder": "^25.1.8", "emoji-picker-react": "^4.12.0", "file-saver": "^2.0.5", From 680f9fbd3e313a3689851ab29eef4c4a58e4ca7b Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sun, 2 Mar 2025 20:05:35 +0200 Subject: [PATCH 19/77] fixes --- electron/src/setup.ts | 13 ++++--- src/App.tsx | 5 +-- src/background.ts | 4 +- .../Group/ListOfGroupPromotions.tsx | 1 + src/components/MainAvatar.tsx | 39 ++++++++++++++----- src/main.tsx | 18 +++++++++ 6 files changed, 60 insertions(+), 20 deletions(-) diff --git a/electron/src/setup.ts b/electron/src/setup.ts index 6fab164..d1fb925 100644 --- a/electron/src/setup.ts +++ b/electron/src/setup.ts @@ -249,11 +249,12 @@ export class ElectronCapacitorApp { export function setupContentSecurityPolicy(customScheme: string): void { session.defaultSession.webRequest.onHeadersReceived((details: any, callback) => { const allowedSources = ["'self'", customScheme, ...domainHolder.allowedDomains]; - const connectSources = [...allowedSources]; const frameSources = [ "'self'", 'http://localhost:*', 'https://localhost:*', + 'ws://localhost:*', + 'ws://127.0.0.1:*', 'http://127.0.0.1:*', 'https://127.0.0.1:*', ...allowedSources, @@ -261,13 +262,13 @@ export function setupContentSecurityPolicy(customScheme: string): void { // Create the Content Security Policy (CSP) string const csp = ` - default-src 'self' ${allowedSources.join(' ')}; + default-src 'self' ${frameSources.join(' ')}; frame-src ${frameSources.join(' ')}; - script-src 'self' 'wasm-unsafe-eval' 'unsafe-inline' 'unsafe-eval' ${allowedSources.join(' ')}; + script-src 'self' 'wasm-unsafe-eval' 'unsafe-inline' 'unsafe-eval' ${frameSources.join(' ')}; object-src 'self'; - connect-src 'self' blob: ${connectSources.join(' ')}; - img-src 'self' data: blob: ${allowedSources.join(' ')}; - media-src 'self' blob: ${allowedSources.join(' ')}; + connect-src 'self' blob: ${frameSources.join(' ')}; + img-src 'self' data: blob: ${frameSources.join(' ')}; + media-src 'self' blob: ${frameSources.join(' ')}; style-src 'self' 'unsafe-inline'; font-src 'self' data:; `.replace(/\s+/g, ' ').trim(); diff --git a/src/App.tsx b/src/App.tsx index 5eca049..f6a6a7d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1443,7 +1443,7 @@ function App() { ) : ( <> - + - {"Warning"} + {"LOGOUT"} {messageUnsavedChanges.message} @@ -3336,7 +3336,6 @@ function App() { flexDirection: "column", alignItems: "center", justifyContent: "flex-start", - minHeight: "400px", maxHeight: "90vh", overflow: "auto", }} diff --git a/src/background.ts b/src/background.ts index ad8ddf3..96febcd 100644 --- a/src/background.ts +++ b/src/background.ts @@ -941,7 +941,7 @@ export async function getBalanceInfo() { const validApi = await getBaseApi(); const response = await fetch(validApi + "/addresses/balance/" + address); - if (!response?.ok) throw new Error("Cannot fetch balance"); + if (!response?.ok) throw new Error("0 QORT in your balance"); const data = await response.json(); return data; } @@ -1101,7 +1101,7 @@ export const getLastRef = async () => { const response = await fetch( validApi + "/addresses/lastreference/" + address ); - if (!response?.ok) throw new Error("Cannot fetch balance"); + if (!response?.ok) throw new Error("0 QORT in your balance"); const data = await response.text(); return data; }; diff --git a/src/components/Group/ListOfGroupPromotions.tsx b/src/components/Group/ListOfGroupPromotions.tsx index a983f56..afeff14 100644 --- a/src/components/Group/ListOfGroupPromotions.tsx +++ b/src/components/Group/ListOfGroupPromotions.tsx @@ -809,6 +809,7 @@ export const ListOfGroupPromotions = () => { value={selectedGroup} label="Groups where you are an admin" onChange={(e) => setSelectedGroup(e.target.value)} + variant="outlined" > {myGroupsWhereIAmAdmin?.map((group) => { return ( diff --git a/src/components/MainAvatar.tsx b/src/components/MainAvatar.tsx index b5f8e44..faca10a 100644 --- a/src/components/MainAvatar.tsx +++ b/src/components/MainAvatar.tsx @@ -7,8 +7,9 @@ import ImageUploader from "../common/ImageUploader"; import { getFee } from "../background"; import { fileToBase64 } from "../utils/fileReading"; import { LoadingButton } from "@mui/lab"; +import ErrorIcon from '@mui/icons-material/Error'; -export const MainAvatar = ({ myName }) => { +export const MainAvatar = ({ myName, balance, setOpenSnack, setInfoSnack }) => { const [hasAvatar, setHasAvatar] = useState(false); const [avatarFile, setAvatarFile] = useState(null); const [tempAvatar, setTempAvatar] = useState(null) @@ -52,10 +53,11 @@ const [isLoading, setIsLoading] = useState(false) checkIfAvatarExists(); }, [myName]); + const publishAvatar = async ()=> { try { const fee = await getFee('ARBITRARY') - + if(+balance < +fee.fee) throw new Error(`Publishing an Avatar requires ${fee.fee}`) await show({ message: "Would you like to publish an avatar?" , publishFee: fee.fee + ' QORT' @@ -84,7 +86,13 @@ const [isLoading, setIsLoading] = useState(false) setTempAvatar(`data:image/webp;base64,${avatarBase64}`) handleClose() } catch (error) { - + if (error?.message) { + setOpenSnack(true) + setInfoSnack({ + type: "error", + message: error?.message, + }); + } } finally { setIsLoading(false); } @@ -113,7 +121,7 @@ const [isLoading, setIsLoading] = useState(false) change avatar
- + ); } @@ -141,7 +149,7 @@ const [isLoading, setIsLoading] = useState(false) change avatar - + ); } @@ -159,13 +167,13 @@ const [isLoading, setIsLoading] = useState(false) set avatar - + ); }; -const PopoverComp = ({avatarFile, setAvatarFile, id, open, anchorEl, handleClose, publishAvatar, isLoading}) => { +const PopoverComp = ({avatarFile, setAvatarFile, id, open, anchorEl, handleClose, publishAvatar, isLoading, myName}) => { return ( {avatarFile?.name} - - + {!myName && ( + + + A registered name is required to set an avatar + + )} + + + Publish avatar diff --git a/src/main.tsx b/src/main.tsx index dcaf3ca..22bba47 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -44,6 +44,24 @@ const theme = createTheme({ color: '#b0b0b0', // Lighter text for body2, often used for secondary text }, }, + components: { + MuiOutlinedInput: { + styleOverrides: { + root: { + ".MuiOutlinedInput-notchedOutline": { + borderColor: "white", // ⚪ Default outline color + }, + }, + }, + }, + MuiSelect: { + styleOverrides: { + icon: { + color: "white", // ✅ Caret (dropdown arrow) color + }, + }, + }, + }, }); export default theme; From a219aab98bd41fbe10942a15c475c941eb14963a Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sun, 2 Mar 2025 20:22:23 +0200 Subject: [PATCH 20/77] change gateway and wallet terminology --- src/App.tsx | 2 +- src/ExtStates/NotAuthenticated.tsx | 10 ++++------ src/Wallets.tsx | 12 ++++++------ src/components/CoreSyncStatus.tsx | 2 +- src/qortalRequests/get.ts | 22 +++++++++++----------- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index f6a6a7d..862a6d8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2769,7 +2769,7 @@ function App() { fontSize: "12px", }} > - {"Using gateway"} + {"Using public node"} )} diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index f693a38..89c3406 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -407,12 +407,10 @@ export const NotAuthenticated = ({ fontSize: '18px' }} > - WELCOME TO YOUR

+ WELCOME TO QORTAL WALLET + }}> QORTAL @@ -436,7 +434,7 @@ export const NotAuthenticated = ({ > setExtstate('wallets')}> {/* */} - Wallets + Accounts {/* @@ -482,7 +480,7 @@ export const NotAuthenticated = ({ } }} > - Create wallet + Create account diff --git a/src/Wallets.tsx b/src/Wallets.tsx index 8641a34..2c7b5e7 100644 --- a/src/Wallets.tsx +++ b/src/Wallets.tsx @@ -134,11 +134,11 @@ export const Wallets = ({ setExtState, setRawWallet, rawWallet }) => { setPassword('') setSeedError('') } else { - setSeedError('Could not create wallet.') + setSeedError('Could not create account.') } } catch (error) { - setSeedError(error?.message || 'Could not create wallet.') + setSeedError(error?.message || 'Could not create account.') } finally { setIsLoadingEncryptSeed(false) } @@ -176,19 +176,19 @@ export const Wallets = ({ setExtState, setRawWallet, rawWallet }) => { {(wallets?.length === 0 || !wallets) ? ( <> - No wallets saved + No accounts saved ): ( <> - Your saved wallets + Your saved accounts )} {rawWallet && ( - Selected Wallet: + Selected Account: {rawWallet?.name && {rawWallet.name}} {rawWallet?.address0 && ( {rawWallet?.address0} @@ -267,7 +267,7 @@ export const Wallets = ({ setExtState, setRawWallet, rawWallet }) => { padding: '10px' }} {...getRootProps()}> - Add wallets + Add account diff --git a/src/components/CoreSyncStatus.tsx b/src/components/CoreSyncStatus.tsx index 641996a..2334bef 100644 --- a/src/components/CoreSyncStatus.tsx +++ b/src/components/CoreSyncStatus.tsx @@ -97,7 +97,7 @@ export const CoreSyncStatus = ({imageSize, position}) => {

{message}

Block Height: {height || ''}

Connected Peers: {numberOfConnections || ''}

-

Using gateway: {isUsingGateway?.toString()}

+

Using public node: {isUsingGateway?.toString()}

diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index 956fa07..6e27f8a 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -679,7 +679,7 @@ export const decryptDataWithSharingKey = async (data, sender) => { export const getHostedData = async (data, isFromExtension) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const resPermission = await getUserPermission( { @@ -715,7 +715,7 @@ export const getHostedData = async (data, isFromExtension) => { export const deleteHostedData = async (data, isFromExtension) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["hostedData"]; const missingFields: string[] = []; @@ -800,7 +800,7 @@ export const decryptData = async (data) => { export const getListItems = async (data, isFromExtension) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["list_name"]; const missingFields: string[] = []; @@ -857,7 +857,7 @@ export const getListItems = async (data, isFromExtension) => { export const addListItems = async (data, isFromExtension) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["list_name", "items"]; const missingFields: string[] = []; @@ -915,7 +915,7 @@ export const addListItems = async (data, isFromExtension) => { export const deleteListItems = async (data, isFromExtension) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["list_name"]; const missingFields: string[] = []; @@ -2575,7 +2575,7 @@ export const getForeignFee = async (data) => { export const updateForeignFee = async (data) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["coin", "type", "value"]; const missingFields: string[] = []; @@ -2675,7 +2675,7 @@ export const getServerConnectionHistory = async (data) => { export const setCurrentForeignServer = async (data) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["coin"]; const missingFields: string[] = []; @@ -2735,7 +2735,7 @@ export const setCurrentForeignServer = async (data) => { export const addForeignServer = async (data) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["coin"]; const missingFields: string[] = []; @@ -2795,7 +2795,7 @@ export const addForeignServer = async (data) => { export const removeForeignServer = async (data) => { const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } const requiredFields = ["coin"]; const missingFields: string[] = []; @@ -3362,7 +3362,7 @@ export const createBuyOrder = async (data, isFromExtension) => { }, 0) )} ${` ${crosschainAtInfo?.[0]?.foreignBlockchain}`}`, - highlightedText: `Is using gateway: ${isGateway}`, + highlightedText: `Is using public node: ${isGateway}`, fee: "", foreignFee: `${sellerForeignFee[foreignBlockchain].value} ${sellerForeignFee[foreignBlockchain].ticker}`, }, @@ -3692,7 +3692,7 @@ export const adminAction = async (data, isFromExtension) => { } const isGateway = await isRunningGateway(); if (isGateway) { - throw new Error("This action cannot be done through a gateway"); + throw new Error("This action cannot be done through a public node"); } let apiEndpoint = ""; From d3af9bf726ae8a9414da9dfa561da55c018db31f Mon Sep 17 00:00:00 2001 From: PhilReact Date: Tue, 4 Mar 2025 17:27:19 +0200 Subject: [PATCH 21/77] added pwa for desktop --- package-lock.json | 3369 +++++++++++++++++++++++- package.json | 1 + public/qortal.png | Bin 0 -> 161247 bytes public/qortal192.png | Bin 0 -> 32392 bytes src/components/Group/QMailMessages.tsx | 1 - vite.config.ts | 30 +- 6 files changed, 3261 insertions(+), 140 deletions(-) create mode 100644 public/qortal.png create mode 100644 public/qortal192.png diff --git a/package-lock.json b/package-lock.json index df0b6dc..b43a338 100644 --- a/package-lock.json +++ b/package-lock.json @@ -85,6 +85,7 @@ "tippy.js": "^6.3.7", "tiptap-extension-resize-image": "^1.1.8", "ts-key-enum": "^2.0.12", + "vite-plugin-pwa": "^0.21.1", "vite-plugin-top-level-await": "^1.4.4", "vite-plugin-wasm": "^3.3.0" }, @@ -130,7 +131,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -140,9 +140,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", - "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -153,10 +153,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", - "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", - "dev": true, + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "engines": { "node": ">=6.9.0" } @@ -165,7 +164,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -195,18 +193,17 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", - "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dependencies": { - "@babel/parser": "^7.26.0", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -215,13 +212,23 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { + "node_modules/@babel/helper-annotate-as-pure": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dependencies": { + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -235,11 +242,89 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.26.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", @@ -256,7 +341,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -269,11 +353,65 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, "engines": { "node": ">=6.9.0" } @@ -298,7 +436,19 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, "engines": { "node": ">=6.9.0" } @@ -307,7 +457,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "dev": true, "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.0" @@ -317,11 +466,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", - "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -330,6 +479,697 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", @@ -360,6 +1200,283 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", @@ -372,28 +1489,28 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -402,9 +1519,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -2501,8 +3618,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "optional": true, - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -3011,6 +4126,50 @@ "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==" }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-virtual": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", @@ -3027,6 +4186,43 @@ } } }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", @@ -3213,6 +4409,25 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@swc/core": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.9.2.tgz", @@ -4202,7 +5417,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, + "devOptional": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -4215,7 +5430,7 @@ "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, + "devOptional": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -4224,7 +5439,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, + "devOptional": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -4234,7 +5449,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, + "devOptional": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -4428,6 +5643,11 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -4822,7 +6042,6 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -5270,6 +6489,21 @@ "dequal": "^2.0.3" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5279,6 +6513,26 @@ "node": ">=8" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asmcrypto.js": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-2.3.2.tgz", @@ -5324,6 +6578,14 @@ "node": ">=0.12.0" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5354,6 +6616,20 @@ "node": ">=0.8" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", @@ -5378,6 +6654,50 @@ "npm": ">=6" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -5537,10 +6857,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "dev": true, + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -5556,9 +6875,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -5872,15 +7191,41 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -5915,10 +7260,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001674", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001674.tgz", - "integrity": "sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw==", - "dev": true, + "version": "1.0.30001702", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", + "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", "funding": [ { "type": "opencollective", @@ -6442,6 +7786,14 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compare-version": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", @@ -6549,8 +7901,7 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/copy-to-clipboard": { "version": "3.3.3", @@ -6592,6 +7943,18 @@ } } }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -6693,6 +8056,14 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, "node_modules/css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -6762,6 +8133,54 @@ "node": ">=18" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dateformat": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", @@ -7224,6 +8643,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7628,10 +9060,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz", - "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==", - "dev": true + "version": "1.5.112", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.112.tgz", + "integrity": "sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==" }, "node_modules/electron/node_modules/@electron/get": { "version": "2.0.3", @@ -7749,13 +9180,74 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dependencies": { - "get-intrinsic": "^1.2.4" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -7768,6 +9260,47 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -8123,7 +9656,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8292,6 +9824,21 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -8515,6 +10062,20 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -8624,6 +10185,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -8705,7 +10285,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -8729,15 +10308,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8746,6 +10330,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, "node_modules/get-package-info": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", @@ -8773,6 +10362,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -8786,6 +10387,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8866,7 +10483,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "optional": true, "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -8899,11 +10515,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8949,6 +10565,17 @@ "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -8970,9 +10597,12 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -8981,9 +10611,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -9171,6 +10801,11 @@ "node": ">=0.10.0" } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -9361,6 +10996,19 @@ "node": ">=8" } }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -9421,11 +11069,59 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -9448,12 +11144,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -9476,12 +11198,29 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9522,6 +11261,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -9530,6 +11283,23 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -9569,6 +11339,22 @@ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9577,6 +11363,29 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -9613,12 +11422,47 @@ "peer": true }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": { + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9640,6 +11484,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -9651,6 +11540,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", @@ -9910,6 +11839,11 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9946,6 +11880,14 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jssha": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.1.tgz", @@ -10033,6 +11975,14 @@ "url": "https://ko-fi.com/killymxi" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10149,6 +12099,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -10184,6 +12139,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -10312,7 +12272,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -10478,6 +12437,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-compact": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", @@ -10948,10 +12915,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/nopt": { "version": "6.0.0", @@ -13405,6 +15371,17 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-is": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", @@ -13428,6 +15405,25 @@ "node": ">= 0.4" } }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -13606,6 +15602,22 @@ "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -13915,6 +15927,14 @@ "node": ">=10.4.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -13970,6 +15990,17 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -14403,6 +16434,14 @@ "raw-loader": "^0.5.1" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/raw-loader": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", @@ -14856,20 +16895,19 @@ "redux": "^5.0.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -14878,6 +16916,86 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/remark": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz", @@ -14997,6 +17115,14 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -15256,6 +17382,29 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -15275,6 +17424,42 @@ } ] }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -15399,6 +17584,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -15434,6 +17627,19 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -15467,6 +17673,74 @@ "suid": "bin/short-unique-id" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -15595,6 +17869,11 @@ "npm": ">= 3.0.0" } }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", @@ -15665,6 +17944,12 @@ "node": ">=0.10.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -15800,6 +18085,85 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/stringify-entities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", @@ -15812,6 +18176,19 @@ "is-hexadecimal": "^1.0.0" } }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15843,6 +18220,14 @@ "node": ">=4" } }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "engines": { + "node": ">=10" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -16037,6 +18422,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, "node_modules/temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", @@ -16078,12 +18471,49 @@ "node": ">= 10.0.0" } }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.36.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", - "optional": true, - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -16100,9 +18530,7 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "optional": true, - "peer": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/text-table": { "version": "0.2.0", @@ -16141,6 +18569,45 @@ "devOptional": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", @@ -16366,6 +18833,76 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", @@ -16390,6 +18927,23 @@ "devOptional": true, "license": "MIT" }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -16409,6 +18963,42 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, "node_modules/unified": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", @@ -16445,6 +19035,17 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", @@ -16508,11 +19109,19 @@ "node": ">=8" } }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -16720,6 +19329,35 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-plugin-pwa": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.21.1.tgz", + "integrity": "sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==", + "dependencies": { + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.10", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vite-pwa/assets-generator": "^0.2.6", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } + } + }, "node_modules/vite-plugin-top-level-await": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz", @@ -16904,12 +19542,97 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", @@ -16935,6 +19658,377 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/workbox-background-sync": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-build": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==" + }, + "node_modules/workbox-expiration": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "dependencies": { + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "dependencies": { + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==" + }, + "node_modules/workbox-window": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.3.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -17131,8 +20225,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index f8ba271..f5b6940 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "tippy.js": "^6.3.7", "tiptap-extension-resize-image": "^1.1.8", "ts-key-enum": "^2.0.12", + "vite-plugin-pwa": "^0.21.1", "vite-plugin-top-level-await": "^1.4.4", "vite-plugin-wasm": "^3.3.0" }, diff --git a/public/qortal.png b/public/qortal.png new file mode 100644 index 0000000000000000000000000000000000000000..005d3535846ab77f76db7b6aec684bf5a3774ef7 GIT binary patch literal 161247 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

BswZD%>-Qh0e*HWnw}=TA5fR0u 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 W*uIab3dxrM^ra-PE>|XF8uWj6>rp}g literal 0 HcmV?d00001 diff --git a/public/qortal192.png b/public/qortal192.png new file mode 100644 index 0000000000000000000000000000000000000000..1c68ff312708765bccc2116a727799b9a65153f7 GIT binary patch literal 32392 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 literal 0 HcmV?d00001 diff --git a/src/components/Group/QMailMessages.tsx b/src/components/Group/QMailMessages.tsx index ee62a4c..b4bfd4a 100644 --- a/src/components/Group/QMailMessages.tsx +++ b/src/components/Group/QMailMessages.tsx @@ -18,7 +18,6 @@ import { mailsAtom, qMailLastEnteredTimestampAtom } from '../../atoms/global'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import MarkEmailUnreadIcon from '@mui/icons-material/MarkEmailUnread'; -import { last } from 'slate'; export const isLessThanOneWeekOld = (timestamp) => { // Current time in milliseconds const now = Date.now(); diff --git a/vite.config.ts b/vite.config.ts index 5a7bb91..e515bea 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,6 +5,7 @@ import react from '@vitejs/plugin-react'; import fixReactVirtualized from 'esbuild-plugin-react-virtualized' import wasm from 'vite-plugin-wasm'; import topLevelAwait from 'vite-plugin-top-level-await'; +import { VitePWA } from 'vite-plugin-pwa'; export default defineConfig({ @@ -14,7 +15,34 @@ export default defineConfig({ setupFiles: ['./src/test/setup.ts'] }, assetsInclude: ['**/*.wasm'], - plugins: [react(), wasm(), topLevelAwait()], + plugins: [react(), wasm(), topLevelAwait(), VitePWA({ + registerType: 'prompt', + manifest: { + name: 'Qortal Hub', + short_name: 'Hub', + description: 'Your easy access to the Qortal blockchain', + start_url: '/', + display: 'standalone', + theme_color: '#ffffff', + background_color: '#ffffff', + icons: [ + { + src: '/qortal192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: '/qortal.png', + sizes: '512x512', + type: 'image/png', + }, + ], + }, + workbox: { + maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, // 5MB limit + disableDevLogs: true, // Suppresses logs in development + }, + })], optimizeDeps: { esbuildOptions: { plugins: [fixReactVirtualized], From 36d34a631daab24734d8b2e7f0a6860a802bfd30 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 5 Mar 2025 00:26:10 +0200 Subject: [PATCH 22/77] save new wallet --- src/App.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index 862a6d8..78fd701 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -88,10 +88,12 @@ import { cleanUrl, getFee, getProtocol, + getWallets, groupApi, groupApiLocal, groupApiSocket, groupApiSocketLocal, + storeWallets, } from "./background"; import { executeEvent, @@ -1007,6 +1009,26 @@ function App() { } }; + const saveWalletToLocalStorage = async (newWallet)=> { + try { + getWallets().then((res)=> { + + if(res && Array.isArray(res)){ + const wallets = [...res, newWallet] + storeWallets(wallets) + } else { + storeWallets([newWallet]) + } + setIsLoading(false) + }).catch((error)=> { + console.error(error) + setIsLoading(false) + }) + } catch (error) { + console.error(error) + } + } + const createAccountFunc = async () => { try { if (!walletToBeDownloadedPassword) { @@ -1043,6 +1065,7 @@ function App() { .then((response) => { if (response && !response.error) { setRawWallet(wallet); + saveWalletToLocalStorage(wallet) setWalletToBeDownloaded({ wallet, qortAddress: wallet.address0, From 2ffc62688c9f47af84f3d37a6c172955b556b928 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 5 Mar 2025 02:19:08 +0200 Subject: [PATCH 23/77] add hide to seedphrase --- src/App.tsx | 15 +++++++- src/Wallets.tsx | 20 +++++++--- src/atoms/global.ts | 10 ----- src/components/Apps/AppsCategory.tsx | 2 - src/components/Apps/AppsCategoryDesktop.tsx | 2 - src/components/Apps/AppsLibrary.tsx | 2 - src/components/Apps/AppsLibraryDesktop.tsx | 2 - src/components/Chat/MessageItem.tsx | 2 +- src/components/Group/Group.tsx | 37 +++++++++++-------- .../PasswordField/PasswordField.tsx | 11 ++++-- src/components/WrapperUserAction.tsx | 7 +++- 11 files changed, 62 insertions(+), 48 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 78fd701..c6ecb71 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -401,6 +401,7 @@ function App() { message: messageQortalRequestExtension, } = useModal(); + const [isRunningPublicNode, setIsRunningPublicNode] = useState(false) const [infoSnack, setInfoSnack] = useState(null); const [openSnack, setOpenSnack] = useState(false); @@ -450,6 +451,14 @@ function App() { } }, []); + useEffect(()=> { + isRunningGateway().then((res)=> { + setIsRunningPublicNode(res) + }).catch((error)=> { + console.error(error) + }) + }, [extState]) + useEffect(()=> { if(!shownTutorialsInitiated) return if(extState === 'not-authenticated'){ @@ -1868,7 +1877,8 @@ function App() { isUserBlocked, addToBlockList, removeBlockFromList, - getAllBlockedUsers + getAllBlockedUsers, + isRunningPublicNode }} > @@ -2046,7 +2056,8 @@ function App() { isUserBlocked, addToBlockList, removeBlockFromList, - getAllBlockedUsers + getAllBlockedUsers, + isRunningPublicNode }} > { /> - setSeedValue(e.target.value)} - /> - + setSeedValue(e.target.value)} + autoComplete="off" + sx={{ + width: '100%' + }} + /> + { value={password} onChange={(e) => setPassword(e.target.value)} autoComplete="off" + sx={{ + width: '100%' + }} /> diff --git a/src/atoms/global.ts b/src/atoms/global.ts index cb49bf7..95b7099 100644 --- a/src/atoms/global.ts +++ b/src/atoms/global.ts @@ -12,18 +12,12 @@ export const sortablePinnedAppsAtom = atom({ }, { name: 'Q-Share', service: 'APP' - }, { - name: 'qombo', - service: 'APP' }, { name: 'Q-Fund', service: 'APP' }, { name: 'Q-Shop', service: 'APP' - },{ - name: 'Qombo', - service: 'APP' }, { name: 'Q-Trade', @@ -33,10 +27,6 @@ export const sortablePinnedAppsAtom = atom({ name: 'Q-Support', service: 'APP' }, - { - name: 'NodeInfo', - service: 'APP' - }, { name: 'Q-Manager', service: 'APP' diff --git a/src/components/Apps/AppsCategory.tsx b/src/components/Apps/AppsCategory.tsx index 5045f1c..725ff1d 100644 --- a/src/components/Apps/AppsCategory.tsx +++ b/src/components/Apps/AppsCategory.tsx @@ -36,12 +36,10 @@ const officialAppList = [ "q-share", "q-support", "q-mail", - "qombo", "q-fund", "q-shop", "q-trade", "q-support", - "nodeinfo", "q-manager" ]; diff --git a/src/components/Apps/AppsCategoryDesktop.tsx b/src/components/Apps/AppsCategoryDesktop.tsx index ab4fef1..d41207a 100644 --- a/src/components/Apps/AppsCategoryDesktop.tsx +++ b/src/components/Apps/AppsCategoryDesktop.tsx @@ -44,12 +44,10 @@ const officialAppList = [ "q-share", "q-support", "q-mail", - "qombo", "q-fund", "q-shop", "q-trade", "q-support", - "nodeinfo", "q-manager" ]; diff --git a/src/components/Apps/AppsLibrary.tsx b/src/components/Apps/AppsLibrary.tsx index ba42c3e..26e7d81 100644 --- a/src/components/Apps/AppsLibrary.tsx +++ b/src/components/Apps/AppsLibrary.tsx @@ -38,12 +38,10 @@ const officialAppList = [ "q-share", "q-support", "q-mail", - "qombo", "q-fund", "q-shop", "q-trade", "q-support", - "nodeinfo", "q-manager" ]; diff --git a/src/components/Apps/AppsLibraryDesktop.tsx b/src/components/Apps/AppsLibraryDesktop.tsx index 8da2e28..b836ac8 100644 --- a/src/components/Apps/AppsLibraryDesktop.tsx +++ b/src/components/Apps/AppsLibraryDesktop.tsx @@ -53,12 +53,10 @@ const officialAppList = [ "q-share", "q-support", "q-mail", - "qombo", "q-fund", "q-shop", "q-trade", "q-support", - "nodeinfo", "q-manager", "q-mintership" ]; diff --git a/src/components/Chat/MessageItem.tsx b/src/components/Chat/MessageItem.tsx index 5123ee2..284ad96 100644 --- a/src/components/Chat/MessageItem.tsx +++ b/src/components/Chat/MessageItem.tsx @@ -188,7 +188,7 @@ const onSeenFunc = useCallback(()=> { - + (null); const [timestampEnterData, setTimestampEnterData] = useState({}); const [chatMode, setChatMode] = useState("groups"); @@ -457,6 +457,8 @@ export const Group = ({ return null }, [selectedGroup]) + + const setSelectedGroupId = useSetRecoilState(selectedGroupIdAtom) const toggleSideViewDirects = ()=> { @@ -2021,21 +2023,24 @@ export const Group = ({ /> Group Mgmt - { - setIsOpenBlockedUserModal(true); - }} - sx={{ - minWidth: 'unset', - padding: '10px' - }} - > - - + {!isRunningPublicNode && ( + { + setIsOpenBlockedUserModal(true); + }} + sx={{ + minWidth: 'unset', + padding: '10px' + }} + > + + + )} + )} {chatMode === "directs" && ( diff --git a/src/components/PasswordField/PasswordField.tsx b/src/components/PasswordField/PasswordField.tsx index 4ff4a80..89bc8b4 100644 --- a/src/components/PasswordField/PasswordField.tsx +++ b/src/components/PasswordField/PasswordField.tsx @@ -1,6 +1,7 @@ -import { Button, InputAdornment, TextField, TextFieldProps, styled } from "@mui/material"; +import { Button, ButtonBase, InputAdornment, TextField, TextFieldProps, styled } from "@mui/material"; import { forwardRef, useState } from 'react' - +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; +import VisibilityIcon from '@mui/icons-material/Visibility'; export const CustomInput = styled(TextField)({ width: "183px", // Adjust the width as needed borderRadius: "5px", @@ -51,7 +52,11 @@ export const PasswordField = forwardRef( ({ .. { setCanViewPassword((prevState) => !prevState) }}> - {canViewPassword ? : } + {canViewPassword ? : } ) }} diff --git a/src/components/WrapperUserAction.tsx b/src/components/WrapperUserAction.tsx index 9aa5cbf..a3bcc3f 100644 --- a/src/components/WrapperUserAction.tsx +++ b/src/components/WrapperUserAction.tsx @@ -4,6 +4,7 @@ import { executeEvent } from '../utils/events'; import { MyContext } from '../App'; export const WrapperUserAction = ({ children, address, name, disabled }) => { + const {isRunningPublicNode} = useContext(MyContext) const [anchorEl, setAnchorEl] = useState(null); // Handle child element click to open Popover @@ -138,8 +139,10 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => { User lookup - - + {!isRunningPublicNode && ( + + + )} )} From 45b32befb4370f42b84d23fde97c9c6770400cca Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 5 Mar 2025 03:20:31 +0200 Subject: [PATCH 24/77] fix --- src/App.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index c6ecb71..47b42f0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2862,7 +2862,7 @@ function App() { fontWeight: 600, }} > - Download Wallet + Download Account @@ -2894,11 +2894,11 @@ function App() { onClick={async () => { await saveFileToDiskFunc(); await showInfo({ - message: `Keep your wallet file secure.`, + message: `Keep your account file secure.`, }); }} > - Download wallet + Download account )} From 2a64a73f0bdf6f4a1537796687faa3f397c6a330 Mon Sep 17 00:00:00 2001 From: AlphaX-Qortal <67390536+AlphaX-Qortal@users.noreply.github.com> Date: Tue, 4 Mar 2025 11:49:39 +0100 Subject: [PATCH 25/77] Added node info and status qortal requests --- .../Apps/useQortalMessageListener.tsx | 149 +++++++++++++----- src/qortalRequests.ts | 42 ++++- src/qortalRequests/get.ts | 62 ++++++++ 3 files changed, 215 insertions(+), 38 deletions(-) diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index 635aba6..e3f5c52 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -175,52 +175,127 @@ export function openIndexedDB() { export const listOfAllQortalRequests = [ - 'GET_USER_ACCOUNT', 'DECRYPT_DATA', 'SEND_COIN', 'GET_LIST_ITEMS', - 'ADD_LIST_ITEMS', 'DELETE_LIST_ITEM', 'VOTE_ON_POLL', 'CREATE_POLL', - 'SEND_CHAT_MESSAGE', 'JOIN_GROUP', 'DEPLOY_AT', 'GET_USER_WALLET', - 'GET_WALLET_BALANCE', 'GET_USER_WALLET_INFO', 'GET_CROSSCHAIN_SERVER_INFO', - 'GET_TX_ACTIVITY_SUMMARY', 'GET_FOREIGN_FEE', 'UPDATE_FOREIGN_FEE', - 'GET_SERVER_CONNECTION_HISTORY', 'SET_CURRENT_FOREIGN_SERVER', - 'ADD_FOREIGN_SERVER', 'REMOVE_FOREIGN_SERVER', 'GET_DAY_SUMMARY', 'CREATE_TRADE_BUY_ORDER', 'CREATE_TRADE_SELL_ORDER', 'CANCEL_TRADE_SELL_ORDER', 'IS_USING_PUBLIC_NODE', 'ADMIN_ACTION', 'SIGN_TRANSACTION', 'OPEN_NEW_TAB', 'CREATE_AND_COPY_EMBED_LINK', 'DECRYPT_QORTAL_GROUP_DATA', 'DECRYPT_DATA_WITH_SHARING_KEY', 'DELETE_HOSTED_DATA', 'GET_HOSTED_DATA', 'PUBLISH_MULTIPLE_QDN_RESOURCES', + 'GET_USER_ACCOUNT', + 'DECRYPT_DATA', + 'SEND_COIN', + 'GET_LIST_ITEMS', + 'ADD_LIST_ITEMS', + 'DELETE_LIST_ITEM', + 'VOTE_ON_POLL', + 'CREATE_POLL', + 'SEND_CHAT_MESSAGE', + 'JOIN_GROUP', + 'DEPLOY_AT', + 'GET_USER_WALLET', + 'GET_WALLET_BALANCE', + 'GET_USER_WALLET_INFO', + 'GET_CROSSCHAIN_SERVER_INFO', + 'GET_TX_ACTIVITY_SUMMARY', + 'GET_FOREIGN_FEE', + 'UPDATE_FOREIGN_FEE', + 'GET_SERVER_CONNECTION_HISTORY', + 'SET_CURRENT_FOREIGN_SERVER', + 'ADD_FOREIGN_SERVER', + 'REMOVE_FOREIGN_SERVER', + 'GET_DAY_SUMMARY', + 'CREATE_TRADE_BUY_ORDER', + 'CREATE_TRADE_SELL_ORDER', + 'CANCEL_TRADE_SELL_ORDER', + 'IS_USING_PUBLIC_NODE', + 'ADMIN_ACTION', + 'SIGN_TRANSACTION', + 'OPEN_NEW_TAB', + 'CREATE_AND_COPY_EMBED_LINK', + 'DECRYPT_QORTAL_GROUP_DATA', + 'DECRYPT_DATA_WITH_SHARING_KEY', + 'DELETE_HOSTED_DATA', + 'GET_HOSTED_DATA', + 'PUBLISH_MULTIPLE_QDN_RESOURCES', 'PUBLISH_QDN_RESOURCE', 'ENCRYPT_DATA', 'ENCRYPT_DATA_WITH_SHARING_KEY', 'ENCRYPT_QORTAL_GROUP_DATA', 'SAVE_FILE', 'GET_ACCOUNT_DATA', - 'GET_ACCOUNT_NAMES', - 'SEARCH_NAMES', - 'GET_NAME_DATA', - 'GET_QDN_RESOURCE_URL', - 'LINK_TO_QDN_RESOURCE', - 'LIST_QDN_RESOURCES', - 'SEARCH_QDN_RESOURCES', - 'FETCH_QDN_RESOURCE', - 'GET_QDN_RESOURCE_STATUS', - 'GET_QDN_RESOURCE_PROPERTIES', - 'GET_QDN_RESOURCE_METADATA', - 'SEARCH_CHAT_MESSAGES', - 'LIST_GROUPS', - 'GET_BALANCE', - 'GET_AT', - 'GET_AT_DATA', - 'LIST_ATS', - 'FETCH_BLOCK', - 'FETCH_BLOCK_RANGE', - 'SEARCH_TRANSACTIONS', - 'GET_PRICE', - 'SHOW_ACTIONS', - 'GET_USER_WALLET_TRANSACTIONS' + 'GET_ACCOUNT_NAMES', + 'SEARCH_NAMES', + 'GET_NAME_DATA', + 'GET_QDN_RESOURCE_URL', + 'LINK_TO_QDN_RESOURCE', + 'LIST_QDN_RESOURCES', + 'SEARCH_QDN_RESOURCES', + 'FETCH_QDN_RESOURCE', + 'GET_QDN_RESOURCE_STATUS', + 'GET_QDN_RESOURCE_PROPERTIES', + 'GET_QDN_RESOURCE_METADATA', + 'SEARCH_CHAT_MESSAGES', + 'LIST_GROUPS', + 'GET_BALANCE', + 'GET_AT', + 'GET_AT_DATA', + 'LIST_ATS', + 'FETCH_BLOCK', + 'FETCH_BLOCK_RANGE', + 'SEARCH_TRANSACTIONS', + 'GET_PRICE', + 'SHOW_ACTIONS', + 'GET_USER_WALLET_TRANSACTIONS', + 'GET_NODE_INFO', + 'GET_NODE_STATUS' ] export const UIQortalRequests = [ - 'GET_USER_ACCOUNT', 'DECRYPT_DATA', 'SEND_COIN', 'GET_LIST_ITEMS', - 'ADD_LIST_ITEMS', 'DELETE_LIST_ITEM', 'VOTE_ON_POLL', 'CREATE_POLL', - 'SEND_CHAT_MESSAGE', 'JOIN_GROUP', 'DEPLOY_AT', 'GET_USER_WALLET', - 'GET_WALLET_BALANCE', 'GET_USER_WALLET_INFO', 'GET_CROSSCHAIN_SERVER_INFO', - 'GET_TX_ACTIVITY_SUMMARY', 'GET_FOREIGN_FEE', 'UPDATE_FOREIGN_FEE', - 'GET_SERVER_CONNECTION_HISTORY', 'SET_CURRENT_FOREIGN_SERVER', - 'ADD_FOREIGN_SERVER', 'REMOVE_FOREIGN_SERVER', 'GET_DAY_SUMMARY', 'CREATE_TRADE_BUY_ORDER', 'CREATE_TRADE_SELL_ORDER', 'CANCEL_TRADE_SELL_ORDER', 'IS_USING_PUBLIC_NODE', 'ADMIN_ACTION', 'SIGN_TRANSACTION', 'OPEN_NEW_TAB', 'CREATE_AND_COPY_EMBED_LINK', 'DECRYPT_QORTAL_GROUP_DATA', 'DECRYPT_DATA_WITH_SHARING_KEY', 'DELETE_HOSTED_DATA', 'GET_HOSTED_DATA', 'SHOW_ACTIONS', 'REGISTER_NAME', 'UPDATE_NAME', 'LEAVE_GROUP', 'INVITE_TO_GROUP', 'KICK_FROM_GROUP', 'BAN_FROM_GROUP', 'CANCEL_GROUP_BAN', 'ADD_GROUP_ADMIN', 'REMOVE_GROUP_ADMIN', 'DECRYPT_AESGCM', 'CANCEL_GROUP_INVITE', 'CREATE_GROUP', 'GET_USER_WALLET_TRANSACTIONS' + 'GET_USER_ACCOUNT', + 'DECRYPT_DATA', + 'SEND_COIN', + 'GET_LIST_ITEMS', + 'ADD_LIST_ITEMS', + 'DELETE_LIST_ITEM', + 'VOTE_ON_POLL', + 'CREATE_POLL', + 'SEND_CHAT_MESSAGE', + 'JOIN_GROUP', + 'DEPLOY_AT', + 'GET_USER_WALLET', + 'GET_WALLET_BALANCE', + 'GET_USER_WALLET_INFO', + 'GET_CROSSCHAIN_SERVER_INFO', + 'GET_TX_ACTIVITY_SUMMARY', + 'GET_FOREIGN_FEE', + 'UPDATE_FOREIGN_FEE', + 'GET_SERVER_CONNECTION_HISTORY', + 'SET_CURRENT_FOREIGN_SERVER', + 'ADD_FOREIGN_SERVER', + 'REMOVE_FOREIGN_SERVER', + 'GET_DAY_SUMMARY', + 'CREATE_TRADE_BUY_ORDER', + 'CREATE_TRADE_SELL_ORDER', + 'CANCEL_TRADE_SELL_ORDER', + 'IS_USING_PUBLIC_NODE', + 'ADMIN_ACTION', + 'SIGN_TRANSACTION', + 'OPEN_NEW_TAB', + 'CREATE_AND_COPY_EMBED_LINK', + 'DECRYPT_QORTAL_GROUP_DATA', + 'DECRYPT_DATA_WITH_SHARING_KEY', + 'DELETE_HOSTED_DATA', + 'GET_HOSTED_DATA', + 'SHOW_ACTIONS', + 'REGISTER_NAME', + 'UPDATE_NAME', + 'LEAVE_GROUP', + 'INVITE_TO_GROUP', + 'KICK_FROM_GROUP', + 'BAN_FROM_GROUP', + 'CANCEL_GROUP_BAN', + 'ADD_GROUP_ADMIN', + 'REMOVE_GROUP_ADMIN', + 'DECRYPT_AESGCM', + 'CANCEL_GROUP_INVITE', + 'CREATE_GROUP', + 'GET_USER_WALLET_TRANSACTIONS', + 'GET_NODE_INFO', + 'GET_NODE_STATUS' ]; // TODO listOfAllQortalRequests diff --git a/src/qortalRequests.ts b/src/qortalRequests.ts index 0397538..b2848c4 100644 --- a/src/qortalRequests.ts +++ b/src/qortalRequests.ts @@ -1,6 +1,6 @@ import { gateways, getApiKeyFromStorage } from "./background"; import { listOfAllQortalRequests } from "./components/Apps/useQortalMessageListener"; -import { addForeignServer, addGroupAdminRequest, addListItems, adminAction, banFromGroupRequest, cancelGroupBanRequest, cancelGroupInviteRequest, cancelSellOrder, createAndCopyEmbedLink, createBuyOrder, createGroupRequest, createPoll, createSellOrder, decryptAESGCMRequest, decryptData, decryptDataWithSharingKey, decryptQortalGroupData, deleteHostedData, deleteListItems, deployAt, encryptData, encryptDataWithSharingKey, encryptQortalGroupData, getCrossChainServerInfo, getDaySummary, getForeignFee, getHostedData, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getUserWalletTransactions, getWalletBalance, inviteToGroupRequest, joinGroup, kickFromGroupRequest, leaveGroupRequest, openNewTab, publishMultipleQDNResources, publishQDNResource, registerNameRequest, removeForeignServer, removeGroupAdminRequest, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, signTransaction, updateForeignFee, updateNameRequest, voteOnPoll } from "./qortalRequests/get"; +import { addForeignServer, addGroupAdminRequest, addListItems, adminAction, banFromGroupRequest, cancelGroupBanRequest, cancelGroupInviteRequest, cancelSellOrder, createAndCopyEmbedLink, createBuyOrder, createGroupRequest, createPoll, createSellOrder, decryptAESGCMRequest, decryptData, decryptDataWithSharingKey, decryptQortalGroupData, deleteHostedData, deleteListItems, deployAt, encryptData, encryptDataWithSharingKey, encryptQortalGroupData, getCrossChainServerInfo, getDaySummary, getNodeInfo, getNodeStatus, getForeignFee, getHostedData, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getUserWalletTransactions, getWalletBalance, inviteToGroupRequest, joinGroup, kickFromGroupRequest, leaveGroupRequest, openNewTab, publishMultipleQDNResources, publishQDNResource, registerNameRequest, removeForeignServer, removeGroupAdminRequest, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, signTransaction, updateForeignFee, updateNameRequest, voteOnPoll } from "./qortalRequests/get"; import { getData, storeData } from "./utils/chromeStorage"; @@ -635,6 +635,46 @@ export const isRunningGateway = async ()=> { break; } + case "GET_NODE_INFO": { + try { + const res = await getNodeInfo(request.payload); + event.source.postMessage({ + requestId: request.requestId, + action: request.action, + payload: res, + type: "backgroundMessageResponse", + }, event.origin); + } catch (error) { + event.source.postMessage({ + requestId: request.requestId, + action: request.action, + error: error.message, + type: "backgroundMessageResponse", + }, event.origin); + } + break; + } + + case "GET_NODE_STATUS": { + try { + const res = await getNodeStatus(request.payload); + event.source.postMessage({ + requestId: request.requestId, + action: request.action, + payload: res, + type: "backgroundMessageResponse", + }, event.origin); + } catch (error) { + event.source.postMessage({ + requestId: request.requestId, + action: request.action, + error: error.message, + type: "backgroundMessageResponse", + }, event.origin); + } + break; + } + case "SEND_COIN": { try { const res = await sendCoin(request.payload, isFromExtension); diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index 6e27f8a..66e3006 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -2883,6 +2883,68 @@ export const getDaySummary = async () => { } }; +export const getNodeInfo = async () => { + const url = `/admin/info`; // Simplified endpoint URL + + try { + const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL + const response = await fetch(endpoint, { + method: "GET", + headers: { + Accept: "*/*", + }, + }); + + if (!response.ok) throw new Error("Failed to retrieve node info"); + + let res; + try { + res = await response.clone().json(); + } catch (e) { + res = await response.text(); + } + + if (res?.error && res?.message) { + throw new Error(res.message); + } + + return res; // Return the full response + } catch (error) { + throw new Error(error?.message || "Error in retrieving node info"); + } +}; + +export const getNodeStatus = async () => { + const url = `/admin/status`; // Simplified endpoint URL + + try { + const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL + const response = await fetch(endpoint, { + method: "GET", + headers: { + Accept: "*/*", + }, + }); + + if (!response.ok) throw new Error("Failed to retrieve node status"); + + let res; + try { + res = await response.clone().json(); + } catch (e) { + res = await response.text(); + } + + if (res?.error && res?.message) { + throw new Error(res.message); + } + + return res; // Return the full response + } catch (error) { + throw new Error(error?.message || "Error in retrieving node status"); + } +}; + export const sendCoin = async (data, isFromExtension) => { const requiredFields = ["coin", "amount"]; const missingFields: string[] = []; From 548e325aa25b3891ec61b9589378bc96722b52c8 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Thu, 6 Mar 2025 17:46:38 +0200 Subject: [PATCH 26/77] added payment component --- src/App.tsx | 142 +-------------- .../Apps/useQortalMessageListener.tsx | 13 +- src/components/QortPayment.tsx | 167 ++++++++++++++++++ 3 files changed, 188 insertions(+), 134 deletions(-) create mode 100644 src/components/QortPayment.tsx diff --git a/src/App.tsx b/src/App.tsx index 47b42f0..221b8cb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -153,6 +153,7 @@ import { DrawerUserLookup } from "./components/Drawer/DrawerUserLookup"; import { UserLookup } from "./components/UserLookup.tsx/UserLookup"; import { RegisterName } from "./components/RegisterName"; import { BuyQortInformation } from "./components/BuyQortInformation"; +import { QortPayment } from "./components/QortPayment"; type extStates = | "not-authenticated" @@ -351,6 +352,8 @@ function App() { const [authenticatePassword, setAuthenticatePassword] = useState(""); const [sendqortState, setSendqortState] = useState(null); const [isLoading, setIsLoading] = useState(false); + const [isLoadingSendCoin, setIsLoadingSendCoin] = useState(false); + const [ walletToBeDownloadedPasswordConfirm, setWalletToBeDownloadedPasswordConfirm, @@ -775,52 +778,7 @@ function App() { setLtcBalanceLoading(false); }); }; - const sendCoinFunc = async() => { - try { - setSendPaymentError(""); - setSendPaymentSuccess(""); - if (!paymentTo) { - setSendPaymentError("Please enter a recipient"); - return; - } - if (!paymentAmount) { - setSendPaymentError("Please enter an amount greater than 0"); - return; - } - if (!paymentPassword) { - setSendPaymentError("Please enter your wallet password"); - return; - } - const fee = await getFee('PAYMENT') - - await show({ - message: `Would you like to transfer ${Number(paymentAmount)} QORT?` , - paymentFee: fee.fee + ' QORT' - }) - setIsLoading(true); - window - .sendMessage("sendCoin", { - amount: Number(paymentAmount), - receiver: paymentTo.trim(), - password: paymentPassword, - }) - .then((response) => { - if (response?.error) { - setSendPaymentError(response.error); - } else { - setIsOpenSendQort(false); - setIsOpenSendQortSuccess(true); - } - setIsLoading(false); - }) - .catch((error) => { - console.error("Failed to send coin:", error); - setIsLoading(false); - }); - } catch (error) { - // error - } - }; + const clearAllStates = () => { setRequestConnection(null); @@ -2119,94 +2077,12 @@ function App() { /> - - - Transfer QORT - - - - Balance: - - - {balance?.toFixed(2)} QORT - - - - - - To - - setPaymentTo(e.target.value)} - autoComplete="off" + { + setIsOpenSendQort(false); + setIsOpenSendQortSuccess(true); + }} + defaultPaymentTo={paymentTo} /> - - - Amount - - - setPaymentAmount(+e)} - /> - - - Confirm Wallet Password - - - setPaymentPassword(e.target.value)} - autoComplete="off" - /> - - - {sendPaymentError} - {/* {sendPaymentSuccess} */} - - { - sendCoinFunc(); - }} - > - Send - )} diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index e3f5c52..508d5bc 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -239,6 +239,18 @@ export const listOfAllQortalRequests = [ 'SEARCH_TRANSACTIONS', 'GET_PRICE', 'SHOW_ACTIONS', + 'REGISTER_NAME', + 'UPDATE_NAME', + 'LEAVE_GROUP', + 'INVITE_TO_GROUP', + 'KICK_FROM_GROUP', + 'BAN_FROM_GROUP', + 'CANCEL_GROUP_BAN', + 'ADD_GROUP_ADMIN', + 'REMOVE_GROUP_ADMIN', + 'DECRYPT_AESGCM', + 'CANCEL_GROUP_INVITE', + 'CREATE_GROUP', 'GET_USER_WALLET_TRANSACTIONS', 'GET_NODE_INFO', 'GET_NODE_STATUS' @@ -297,7 +309,6 @@ export const UIQortalRequests = [ 'GET_NODE_INFO', 'GET_NODE_STATUS' ]; -// TODO listOfAllQortalRequests diff --git a/src/components/QortPayment.tsx b/src/components/QortPayment.tsx new file mode 100644 index 0000000..6add9b2 --- /dev/null +++ b/src/components/QortPayment.tsx @@ -0,0 +1,167 @@ +import { Box, CircularProgress } from '@mui/material'; +import React, { useEffect, useState } from 'react' +import { CustomButton, CustomInput, CustomLabel, TextP } from '../App-styles'; +import { Spacer } from '../common/Spacer'; +import BoundedNumericTextField from '../common/BoundedNumericTextField'; +import { PasswordField } from './PasswordField/PasswordField'; +import { ErrorText } from './ErrorText/ErrorText'; +import { getFee } from '../background'; + +export const QortPayment = ({balance, show, onSuccess, defaultPaymentTo}) => { + const [paymentTo, setPaymentTo] = useState(defaultPaymentTo); + const [paymentAmount, setPaymentAmount] = useState(0); + const [paymentPassword, setPaymentPassword] = useState(""); + const [sendPaymentError, setSendPaymentError] = useState(""); + const [sendPaymentSuccess, setSendPaymentSuccess] = useState(""); + const [isLoadingSendCoin, setIsLoadingSendCoin] = useState(false); + + + + const sendCoinFunc = async() => { + try { + setSendPaymentError(""); + setSendPaymentSuccess(""); + if (!paymentTo) { + setSendPaymentError("Please enter a recipient"); + return; + } + if (!paymentAmount) { + setSendPaymentError("Please enter an amount greater than 0"); + return; + } + if (!paymentPassword) { + setSendPaymentError("Please enter your wallet password"); + return; + } + const fee = await getFee('PAYMENT') + + await show({ + message: `Would you like to transfer ${Number(paymentAmount)} QORT?` , + paymentFee: fee.fee + ' QORT' + }) + setIsLoadingSendCoin(true); + window + .sendMessage("sendCoin", { + amount: Number(paymentAmount), + receiver: paymentTo.trim(), + password: paymentPassword, + }) + .then((response) => { + if (response?.error) { + setSendPaymentError(response.error); + } else { + onSuccess() + + } + setIsLoadingSendCoin(false); + }) + .catch((error) => { + console.error("Failed to send coin:", error); + setIsLoadingSendCoin(false); + }); + } catch (error) { + // error + } + }; + return ( + <> + + + Transfer QORT + + + + Balance: + + + {balance?.toFixed(2)} QORT + + + + + + To + + setPaymentTo(e.target.value)} + autoComplete="off" + /> + + + Amount + + + setPaymentAmount(+e)} + /> + + + Confirm Wallet Password + + + setPaymentPassword(e.target.value)} + autoComplete="off" + /> + + + {sendPaymentError} + {/* {sendPaymentSuccess} */} + + { + if(isLoadingSendCoin) return + sendCoinFunc(); + }} + > + {isLoadingSendCoin && ( + + )} + Send + + + ) +} From 2dfe2c0cee6b8b6991af5bca4d460c2083bd2b23 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Fri, 7 Mar 2025 01:11:00 +0200 Subject: [PATCH 27/77] fix retrieving settings from localstorage --- src/App.tsx | 2 +- src/useRetrieveDataLocalStorage.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 221b8cb..3520489 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -428,7 +428,7 @@ function App() { const [creationStep, setCreationStep] = useState(1) const {getIndividualUserInfo} = useHandleUserInfo() const qortalRequestCheckbox1Ref = useRef(null); - useRetrieveDataLocalStorage(); + useRetrieveDataLocalStorage(userInfo?.address); useQortalGetSaveSettings(userInfo?.name, extState === "authenticated"); const [fullScreen, setFullScreen] = useRecoilState(fullScreenAtom); const [isEnabledDevMode, setIsEnabledDevMode] = diff --git a/src/useRetrieveDataLocalStorage.tsx b/src/useRetrieveDataLocalStorage.tsx index 2a248bd..fafcd5c 100644 --- a/src/useRetrieveDataLocalStorage.tsx +++ b/src/useRetrieveDataLocalStorage.tsx @@ -15,7 +15,7 @@ function fetchFromLocalStorage(key) { } } -export const useRetrieveDataLocalStorage = () => { +export const useRetrieveDataLocalStorage = (address) => { const setSortablePinnedApps = useSetRecoilState(sortablePinnedAppsAtom); const setSettingsLocalLastUpdated = useSetRecoilState(settingsLocalLastUpdatedAtom); const setIsUsingImportExportSettings = useSetRecoilState(isUsingImportExportSettingsAtom) @@ -50,6 +50,6 @@ export const useRetrieveDataLocalStorage = () => { getSortablePinnedApps() getSortablePinnedAppsImportExport() - }, [getSortablePinnedApps]) + }, [getSortablePinnedApps, address]) } From 2c40559044d39563c5b3e76524db17c6fcb0e0ff Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sat, 8 Mar 2025 03:24:58 +0200 Subject: [PATCH 28/77] added payment notification --- src/App.tsx | 9 ++ src/atoms/global.ts | 5 + src/background.ts | 142 ++++++++++++++++++++- src/components/GeneralNotifications.tsx | 132 +++++++++++++++++++ src/hooks/useHandlePaymentNotification.tsx | 116 +++++++++++++++++ 5 files changed, 402 insertions(+), 2 deletions(-) create mode 100644 src/components/GeneralNotifications.tsx create mode 100644 src/hooks/useHandlePaymentNotification.tsx diff --git a/src/App.tsx b/src/App.tsx index 3520489..777c25e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -120,6 +120,7 @@ import { hasSettingsChangedAtom, isDisabledEditorEnterAtom, isUsingImportExportSettingsAtom, + lastPaymentSeenTimestampAtom, mailsAtom, oldPinnedAppsAtom, qMailLastEnteredTimestampAtom, @@ -154,6 +155,7 @@ import { UserLookup } from "./components/UserLookup.tsx/UserLookup"; import { RegisterName } from "./components/RegisterName"; import { BuyQortInformation } from "./components/BuyQortInformation"; import { QortPayment } from "./components/QortPayment"; +import { GeneralNotifications } from "./components/GeneralNotifications"; type extStates = | "not-authenticated" @@ -508,6 +510,7 @@ function App() { const resetAtomQMailLastEnteredTimestampAtom = useResetRecoilState(qMailLastEnteredTimestampAtom) const resetAtomMailsAtom = useResetRecoilState(mailsAtom) const resetGroupPropertiesAtom = useResetRecoilState(groupsPropertiesAtom) + const resetLastPaymentSeenTimestampAtom = useResetRecoilState(lastPaymentSeenTimestampAtom) const resetAllRecoil = () => { resetAtomSortablePinnedAppsAtom(); resetAtomCanSaveSettingToQdnAtom(); @@ -518,6 +521,7 @@ function App() { resetAtomQMailLastEnteredTimestampAtom() resetAtomMailsAtom() resetGroupPropertiesAtom() + resetLastPaymentSeenTimestampAtom() }; useEffect(() => { @@ -1802,6 +1806,11 @@ function App() { + + {extState === 'authenticated' && ( + + )} + ({ + key: 'lastPaymentSeenTimestampAtom', + default: null, +}); + export const mailsAtom = atom({ key: 'mailsAtom', default: [], diff --git a/src/background.ts b/src/background.ts index 96febcd..c43dacf 100644 --- a/src/background.ts +++ b/src/background.ts @@ -262,11 +262,12 @@ export const getForeignKey = async (foreignBlockchain)=> { export const pauseAllQueues = () => controlAllQueues("pause"); export const resumeAllQueues = () => controlAllQueues("resume"); -const checkDifference = (createdTimestamp) => { +export const checkDifference = (createdTimestamp, diff = timeDifferenceForNotificationChatsBackground) => { return ( - Date.now() - createdTimestamp < timeDifferenceForNotificationChatsBackground + Date.now() - createdTimestamp < diff ); }; + export const getApiKeyFromStorage = async (): Promise => { return getData("apiKey").catch(() => null); }; @@ -518,6 +519,7 @@ const handleNotificationDirect = async (directs) => { `_from=${newestLatestTimestamp.address}`); const notification = new window.Notification(title, { body, + icon: window.location.origin + "/qortal192.png", data: { id: notificationId }, }); @@ -559,6 +561,7 @@ const handleNotificationDirect = async (directs) => { const notification = new window.Notification(title, { body, + icon: window.location.origin + "/qortal192.png", data: { id: notificationId }, }); @@ -746,6 +749,7 @@ const handleNotification = async (groups) => { const notification = new window.Notification(title, { body, + icon: window.location.origin + "/qortal192.png", data: { id: notificationId }, }); @@ -788,6 +792,7 @@ const handleNotification = async (groups) => { // Create and show the notification immediately const notification = new window.Notification(title, { body, + icon: window.location.origin + "/qortal192.png", data: { id: notificationId }, }); @@ -2739,6 +2744,31 @@ export async function addTimestampGroupAnnouncement({ }); } +export async function getTimestampLatestPayment() { + const wallet = await getSaveWallet(); + const address = wallet.address0; + const key = `latest-payment-${address}`; + const res = await getData(key).catch(() => null); + if (res) { + const parsedData = res; + return parsedData; + } else return 0 +} + +export async function addTimestampLatestPayment(timestamp) { + const wallet = await getSaveWallet(); + const address = wallet.address0; + + return await new Promise((resolve, reject) => { + storeData(`latest-payment-${address}`, timestamp) + .then(() => resolve(true)) + .catch((error) => { + reject(new Error(error.message || "Error saving data")); + }); + }); +} + + export async function addEnteredQmailTimestamp() { const wallet = await getSaveWallet(); const address = wallet.address0; @@ -3273,6 +3303,7 @@ export const checkNewMessages = async () => { // Create and show the notification const notification = new window.Notification(title, { body, + icon: window.location.origin + "/qortal192.png", data: { id: notificationId }, }); @@ -3302,6 +3333,95 @@ export const checkNewMessages = async () => { } }; +export const checkPaymentsForNotifications = async (address) => { + try { + const isDisableNotifications = + (await getUserSettings({ key: "disable-push-notifications" })) || false; + if(isDisableNotifications) return + let latestPayment = null + const savedtimestamp = await getTimestampLatestPayment(); + + const url = await createEndpoint( + `/transactions/search?txType=PAYMENT&address=${address}&confirmationStatus=CONFIRMED&limit=5&reverse=true` + ); + + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + const responseData = await response.json(); + + const latestTx = responseData.filter( + (tx) => tx?.creatorAddress !== address && tx?.recipient === address + )[0]; + if (!latestTx) { + return; // continue to the next group + } + if ( + checkDifference(latestTx.timestamp) && + (!savedtimestamp || + latestTx.timestamp > + savedtimestamp) + ) { + if(latestTx.timestamp){ + latestPayment = latestTx + await addTimestampLatestPayment(latestTx.timestamp); + } + + // save new timestamp + } + + + + if ( + latestPayment + ) { + // Create a unique notification ID with type and group announcement details + const notificationId = + encodeURIComponent("payment_notification_" + + Date.now() + + "_type=payment-announcement"); + + const title = "New payment!"; + const body = `You have received a new payment of ${latestPayment?.amount} QORT`; + + // Create and show the notification + const notification = new window.Notification(title, { + body, + icon: window.location.origin + "/qortal192.png", + data: { id: notificationId }, + }); + + // Handle notification click with specific actions based on `notificationId` + notification.onclick = () => { + handleNotificationClick(notificationId); + notification.close(); // Clean up the notification on click + }; + + // Automatically close the notification after 5 seconds if it’s not clicked + setTimeout(() => { + notification.close(); + }, 10000); // Close after 5 seconds + + const targetOrigin = window.location.origin; + + window.postMessage( + { + action: "SET_PAYMENT_ANNOUNCEMENT", + payload: latestPayment, + }, + targetOrigin + ); + } + + } catch (error) { + console.error(error) + } +}; + const checkActiveChatsForNotifications = async () => { try { checkGroupList(); @@ -3437,6 +3557,7 @@ export const checkThreads = async (bringBack) => { // Create and show the notification const notification = new window.Notification(title, { body, + icon: window.location.origin + "/qortal192.png", data: { id: notificationId }, }); @@ -3494,6 +3615,7 @@ export const checkThreads = async (bringBack) => { // }); let notificationCheckInterval +let paymentsCheckInterval const createNotificationCheck = () => { // Check if an interval already exists before creating it @@ -3513,6 +3635,22 @@ const createNotificationCheck = () => { } }, 10 * 60 * 1000); // 10 minutes } + + if (!paymentsCheckInterval) { + paymentsCheckInterval = setInterval(async () => { + try { + // This would replace the Chrome alarm callback + const wallet = await getSaveWallet(); + const address = wallet?.address0; + if (!address) return; + + checkPaymentsForNotifications(address); + + } catch (error) { + console.error('Error checking payments:', error); + } + }, 3 * 60 * 1000); // 3 minutes + } }; // Call this function when initializing your app diff --git a/src/components/GeneralNotifications.tsx b/src/components/GeneralNotifications.tsx new file mode 100644 index 0000000..532c0e6 --- /dev/null +++ b/src/components/GeneralNotifications.tsx @@ -0,0 +1,132 @@ +import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; + +import { + Box, + ButtonBase, + Card, + MenuItem, + Popover, + Tooltip, + Typography, +} from "@mui/material"; +import NotificationsIcon from "@mui/icons-material/Notifications"; +import AccountBalanceWalletIcon from "@mui/icons-material/AccountBalanceWallet"; +import { formatDate } from "../utils/time"; +import { useHandlePaymentNotification } from "../hooks/useHandlePaymentNotification"; + +export const GeneralNotifications = ({ address }) => { + const [anchorEl, setAnchorEl] = useState(null); + const {latestTx, + getNameOrAddressOfSenderMiddle, + hasNewPayment, setLastEnteredTimestampPayment, nameAddressOfSender} = useHandlePaymentNotification(address) + + const handlePopupClick = (event) => { + event.stopPropagation(); // Prevent parent onClick from firing + setAnchorEl(event.currentTarget); + }; + + return ( + <> + { + handlePopupClick(e); + + + }} + style={{}} + > + + + + { + if(hasNewPayment){ + setLastEnteredTimestampPayment(Date.now()) + } + setAnchorEl(null) + + }} // Close popover on click outside + > + + {!hasNewPayment && No new notifications} + {hasNewPayment && ( + { + // executeEvent("addTab", { data: { service: 'APP', name: 'q-mail' } }); + // executeEvent("open-apps-mode", { }); + }} + > + + + {" "} + {formatDate(latestTx?.timestamp)} + + + + {latestTx?.amount} + + {nameAddressOfSender.current[latestTx?.creatorAddress] || getNameOrAddressOfSenderMiddle(latestTx?.creatorAddress)} + + + + )} + + + + ); +}; diff --git a/src/hooks/useHandlePaymentNotification.tsx b/src/hooks/useHandlePaymentNotification.tsx new file mode 100644 index 0000000..cfed663 --- /dev/null +++ b/src/hooks/useHandlePaymentNotification.tsx @@ -0,0 +1,116 @@ +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { getBaseApiReact } from '../App'; +import { getData, storeData } from '../utils/chromeStorage'; +import { checkDifference, getNameInfoForOthers } from '../background'; +import { useRecoilState } from 'recoil'; +import { lastPaymentSeenTimestampAtom } from '../atoms/global'; + +export const useHandlePaymentNotification = (address) => { + const [latestTx, setLatestTx] = useState(null); + + const nameAddressOfSender = useRef({}) + const isFetchingName = useRef({}) + + + const [lastEnteredTimestampPayment, setLastEnteredTimestampPayment] = + useRecoilState(lastPaymentSeenTimestampAtom); + + useEffect(() => { + if (lastEnteredTimestampPayment && address) { + storeData(`last-seen-payment-${address}`, Date.now()).catch((error) => { + console.error(error); + }); + } + }, [lastEnteredTimestampPayment, address]); + + const getNameOrAddressOfSender = useCallback(async(senderAddress)=> { + if(isFetchingName.current[senderAddress]) return senderAddress + try { + isFetchingName.current[senderAddress] = true + const res = await getNameInfoForOthers(senderAddress) + nameAddressOfSender.current[senderAddress] = res || senderAddress + } catch (error) { + console.error(error) + } finally { + isFetchingName.current[senderAddress] = false + } + + }, []) + + const getNameOrAddressOfSenderMiddle = useCallback(async(senderAddress)=> { + getNameOrAddressOfSender(senderAddress) + return senderAddress + + }, [getNameOrAddressOfSender]) + + const hasNewPayment = useMemo(() => { + if (!latestTx) return false; + if (!checkDifference(latestTx?.timestamp)) return false; + if ( + !lastEnteredTimestampPayment || + lastEnteredTimestampPayment < latestTx?.timestamp + ) + return true; + + return false; + }, [lastEnteredTimestampPayment, latestTx]); + + const getLastSeenData = useCallback(async () => { + try { + if (!address) return; + const key = `last-seen-payment-${address}`; + + const res = await getData(key).catch(() => null); + if (res) { + setLastEnteredTimestampPayment(res); + } + + const response = await fetch( + `${getBaseApiReact()}/transactions/search?txType=PAYMENT&address=${address}&confirmationStatus=CONFIRMED&limit=5&reverse=true` + ); + + const responseData = await response.json(); + + const latestTx = responseData.filter( + (tx) => tx?.creatorAddress !== address && tx?.recipient === address + )[0]; + if (!latestTx) { + return; // continue to the next group + } + + setLatestTx(latestTx); + } catch (error) { + console.error(error); + } + }, [address, setLastEnteredTimestampPayment]); + + + useEffect(() => { + getLastSeenData(); + // Handler function for incoming messages + const messageHandler = (event) => { + if (event.origin !== window.location.origin) { + return; + } + const message = event.data; + if (message?.action === "SET_PAYMENT_ANNOUNCEMENT" && message?.payload) { + setLatestTx(message.payload); + } + }; + + // Attach the event listener + window.addEventListener("message", messageHandler); + + // Clean up the event listener on component unmount + return () => { + window.removeEventListener("message", messageHandler); + }; + }, [getLastSeenData]); + return { + latestTx, + getNameOrAddressOfSenderMiddle, + hasNewPayment, + setLastEnteredTimestampPayment, + nameAddressOfSender + } +} From d8d6650edcce9b683d493adc32bb97fc44fa124b Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sat, 8 Mar 2025 05:28:49 +0200 Subject: [PATCH 29/77] disable dev mode option when on web --- src/components/Chat/MessageDisplay.tsx | 6 +++++- src/components/Group/Settings.tsx | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/Chat/MessageDisplay.tsx b/src/components/Chat/MessageDisplay.tsx index a686a00..52d0d93 100644 --- a/src/components/Chat/MessageDisplay.tsx +++ b/src/components/Chat/MessageDisplay.tsx @@ -98,7 +98,11 @@ export const MessageDisplay = ({ htmlContent, isReply }) => { const target = e.target; if (target.tagName === 'A') { const href = target.getAttribute('href'); - window.electronAPI.openExternal(href); + if(window?.electronAPI){ + window.electronAPI.openExternal(href); + } else { + window.open(href, '_system'); + } } else if (target.getAttribute('data-url')) { const url = target.getAttribute('data-url'); diff --git a/src/components/Group/Settings.tsx b/src/components/Group/Settings.tsx index f14483c..2aba6f6 100644 --- a/src/components/Group/Settings.tsx +++ b/src/components/Group/Settings.tsx @@ -186,7 +186,8 @@ export const Settings = ({ } label="Disable all push notifications" /> - + )} From d62415e697eb42eec003f7d55bc6086b9e12195a Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sat, 8 Mar 2025 20:10:18 +0200 Subject: [PATCH 30/77] added wallets embed --- src/App.tsx | 106 ++++-------- src/atoms/global.ts | 4 + src/components/Apps/AppViewer.tsx | 4 +- src/components/Apps/AppViewerContainer.tsx | 4 +- src/components/Apps/AppsCategory.tsx | 3 +- src/components/Apps/AppsCategoryDesktop.tsx | 3 +- src/components/Apps/AppsLibrary.tsx | 3 +- src/components/Apps/AppsLibraryDesktop.tsx | 3 +- .../Apps/useQortalMessageListener.tsx | 6 +- src/components/Explore/Explore.tsx | 30 ++++ src/components/GeneralNotifications.tsx | 28 ++- src/components/Group/Group.tsx | 2 + src/components/Group/WalletsAppWrapper.tsx | 163 ++++++++++++++++++ src/hooks/useHandlePaymentNotification.tsx | 16 ++ src/messaging/messagesToBackground.tsx | 4 +- src/qortalRequests.ts | 3 +- src/qortalRequests/get.ts | 5 +- 17 files changed, 299 insertions(+), 88 deletions(-) create mode 100644 src/components/Group/WalletsAppWrapper.tsx diff --git a/src/App.tsx b/src/App.tsx index 777c25e..6678580 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -47,6 +47,7 @@ import Info from "./assets/svgs/Info.svg"; import CloseIcon from "@mui/icons-material/Close"; import './utils/seedPhrase/RandomSentenceGenerator'; import EngineeringIcon from '@mui/icons-material/Engineering'; +import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; import { createAccount, generateRandomSentence, @@ -1698,13 +1699,46 @@ function App() { /> + + { + executeEvent('openWalletsApp', {}) + }} + > + WALLETS} + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, + }} + > + + + + {desktopViewMode !== 'home' && ( <> WALLET} + title={YOUR ACCOUNT} placement="left" arrow sx={{ fontSize: "24" }} @@ -1733,75 +1767,7 @@ function App() { )} - {/* {authenticatedMode === "qort" && ( - LITECOIN WALLET} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, - }, - arrow: { - sx: { - color: "#444444", - }, - }, - }} - > - { - if(desktopViewMode !== 'home'){ - setIsOpenDrawerProfile((prev)=> !prev) - } - setAuthenticatedMode("ltc"); - }} - src={ltcLogo} - style={{ - cursor: "pointer", - width: "20px", - height: "auto", - }} - /> - - )} - {authenticatedMode === "ltc" && ( - QORTAL WALLET} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, - }, - arrow: { - sx: { - color: "#444444", - }, - }, - }} - > - { - setAuthenticatedMode("qort"); - }} - src={qortLogo} - style={{ - cursor: "pointer", - width: "20px", - height: "auto", - }} - /> - - )} */} + diff --git a/src/atoms/global.ts b/src/atoms/global.ts index f1946ef..d546bf0 100644 --- a/src/atoms/global.ts +++ b/src/atoms/global.ts @@ -38,6 +38,10 @@ export const sortablePinnedAppsAtom = atom({ { name: 'Q-Mintership', service: 'APP' + }, + { + name: 'Q-Wallets', + service: 'APP' } ], }); diff --git a/src/components/Apps/AppViewer.tsx b/src/components/Apps/AppViewer.tsx index 902c6d8..cd9cf94 100644 --- a/src/components/Apps/AppViewer.tsx +++ b/src/components/Apps/AppViewer.tsx @@ -11,11 +11,11 @@ import { useQortalMessageListener } from "./useQortalMessageListener"; -export const AppViewer = React.forwardRef(({ app , hide, isDevMode}, iframeRef) => { +export const AppViewer = React.forwardRef(({ app , hide, isDevMode, skipAuth}, iframeRef) => { const { rootHeight } = useContext(MyContext); // const iframeRef = useRef(null); const { document, window: frameWindow } = useFrame(); - const {path, history, changeCurrentIndex, resetHistory} = useQortalMessageListener(frameWindow, iframeRef, app?.tabId, isDevMode, app?.name, app?.service) + const {path, history, changeCurrentIndex, resetHistory} = useQortalMessageListener(frameWindow, iframeRef, app?.tabId, isDevMode, app?.name, app?.service, skipAuth) const [url, setUrl] = useState('') diff --git a/src/components/Apps/AppViewerContainer.tsx b/src/components/Apps/AppViewerContainer.tsx index 674a9a7..f258848 100644 --- a/src/components/Apps/AppViewerContainer.tsx +++ b/src/components/Apps/AppViewerContainer.tsx @@ -3,7 +3,7 @@ import { AppViewer } from './AppViewer'; import Frame from 'react-frame-component'; import { MyContext, isMobile } from '../../App'; -const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, customHeight }, ref) => { +const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, customHeight, skipAuth }, ref) => { const { rootHeight } = useContext(MyContext); @@ -42,7 +42,7 @@ const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, overflow: 'hidden', }} > - + ); }); diff --git a/src/components/Apps/AppsCategory.tsx b/src/components/Apps/AppsCategory.tsx index 725ff1d..d1a1420 100644 --- a/src/components/Apps/AppsCategory.tsx +++ b/src/components/Apps/AppsCategory.tsx @@ -40,7 +40,8 @@ const officialAppList = [ "q-shop", "q-trade", "q-support", - "q-manager" + "q-manager", + "q-wallets" ]; const ScrollerStyled = styled('div')({ diff --git a/src/components/Apps/AppsCategoryDesktop.tsx b/src/components/Apps/AppsCategoryDesktop.tsx index d41207a..f6ba48d 100644 --- a/src/components/Apps/AppsCategoryDesktop.tsx +++ b/src/components/Apps/AppsCategoryDesktop.tsx @@ -48,7 +48,8 @@ const officialAppList = [ "q-shop", "q-trade", "q-support", - "q-manager" + "q-manager", + "q-wallets" ]; const ScrollerStyled = styled("div")({ diff --git a/src/components/Apps/AppsLibrary.tsx b/src/components/Apps/AppsLibrary.tsx index 26e7d81..f9b58ea 100644 --- a/src/components/Apps/AppsLibrary.tsx +++ b/src/components/Apps/AppsLibrary.tsx @@ -42,7 +42,8 @@ const officialAppList = [ "q-shop", "q-trade", "q-support", - "q-manager" + "q-manager", + "q-wallets" ]; const ScrollerStyled = styled('div')({ diff --git a/src/components/Apps/AppsLibraryDesktop.tsx b/src/components/Apps/AppsLibraryDesktop.tsx index b836ac8..de356d4 100644 --- a/src/components/Apps/AppsLibraryDesktop.tsx +++ b/src/components/Apps/AppsLibraryDesktop.tsx @@ -58,7 +58,8 @@ const officialAppList = [ "q-trade", "q-support", "q-manager", - "q-mintership" + "q-mintership", + "q-wallets" ]; const ScrollerStyled = styled("div")({ diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index 508d5bc..6ff79ab 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -507,7 +507,7 @@ export const UIQortalRequests = [ return obj; // Updated object with references to stored files } -export const useQortalMessageListener = (frameWindow, iframeRef, tabId, isDevMode, appName, appService) => { +export const useQortalMessageListener = (frameWindow, iframeRef, tabId, isDevMode, appName, appService, skipAuth) => { const [path, setPath] = useState('') const [history, setHistory] = useState({ customQDNHistoryPaths: [], @@ -564,7 +564,7 @@ isDOMContentLoaded: false const sendMessageToRuntime = (message, eventPort) => { window.sendMessage(message.action, message.payload, 300000, message.isExtension, { name: appName, service: appService - }) + }, skipAuth) .then((response) => { if (response.error) { eventPort.postMessage({ @@ -633,6 +633,8 @@ isDOMContentLoaded: false window.sendMessage("addEnteredQmailTimestamp").catch((error) => { // error }); + } else if(appName?.toLowerCase() === 'q-wallets'){ + executeEvent('setLastEnteredTimestampPaymentEvent', {}) } } else if(event?.data?.action === 'NAVIGATION_HISTORY'){ if(event?.data?.payload?.isDOMContentLoaded){ diff --git a/src/components/Explore/Explore.tsx b/src/components/Explore/Explore.tsx index 7cc96a0..61037d7 100644 --- a/src/components/Explore/Explore.tsx +++ b/src/components/Explore/Explore.tsx @@ -4,6 +4,9 @@ import ChatIcon from "@mui/icons-material/Chat"; import qTradeLogo from "../../assets/Icons/q-trade-logo.webp"; import AppsIcon from "@mui/icons-material/Apps"; import { executeEvent } from "../../utils/events"; +import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; + + export const Explore = ({setDesktopViewMode}) => { return ( { General Chat + { + executeEvent("openWalletsApp", { + + }); + }} + > + + + Wallets + + ); }; diff --git a/src/components/GeneralNotifications.tsx b/src/components/GeneralNotifications.tsx index 532c0e6..c7336dc 100644 --- a/src/components/GeneralNotifications.tsx +++ b/src/components/GeneralNotifications.tsx @@ -13,6 +13,7 @@ import NotificationsIcon from "@mui/icons-material/Notifications"; import AccountBalanceWalletIcon from "@mui/icons-material/AccountBalanceWallet"; import { formatDate } from "../utils/time"; import { useHandlePaymentNotification } from "../hooks/useHandlePaymentNotification"; +import { executeEvent } from "../utils/events"; export const GeneralNotifications = ({ address }) => { const [anchorEl, setAnchorEl] = useState(null); @@ -35,11 +36,31 @@ export const GeneralNotifications = ({ address }) => { }} style={{}} > + PAYMENT NOTIFICATION} + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, + }} + > + { width: "100%", alignItems: "flex-start", textWrap: "auto", - cursor: 'default' }} - onClick={(e) => { - // executeEvent("addTab", { data: { service: 'APP', name: 'q-mail' } }); - // executeEvent("open-apps-mode", { }); + onClick={() => { + setAnchorEl(null) + executeEvent('openWalletsApp', {}) }} > { @@ -2579,6 +2580,7 @@ export const Group = ({ message: "Setting up groups... please wait.", }} /> + ); diff --git a/src/components/Group/WalletsAppWrapper.tsx b/src/components/Group/WalletsAppWrapper.tsx new file mode 100644 index 0000000..00218a7 --- /dev/null +++ b/src/components/Group/WalletsAppWrapper.tsx @@ -0,0 +1,163 @@ +import { Box, ButtonBase, Divider, Typography } from "@mui/material"; +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import CloseIcon from "@mui/icons-material/Close"; +import AppViewerContainer from "../Apps/AppViewerContainer"; +import { + executeEvent, + subscribeToEvent, + unsubscribeFromEvent, +} from "../../utils/events"; +import { useRecoilState } from "recoil"; +import { navigationControllerAtom } from "../../atoms/global"; +import { AppsNavBarLeft, AppsNavBarParent } from "../Apps/Apps-styles"; +import NavBack from "../../assets/svgs/NavBack.svg"; +import RefreshIcon from "@mui/icons-material/Refresh"; + +export const WalletsAppWrapper = () => { + const iframeRef = useRef(null); + const [isOpen, setIsOpen] = useState(false); + const [navigationController, setNavigationController] = useRecoilState( + navigationControllerAtom + ); + const [selectedTab, setSelectedTab] = useState({ + tabId: "5558589", + name: "Q-Wallets", + service: "APP", + path: '/qortal' + }); + + const isDisableBackButton = useMemo(() => { + if (selectedTab && navigationController[selectedTab?.tabId]?.hasBack) + return false; + if (selectedTab && !navigationController[selectedTab?.tabId]?.hasBack) + return true; + return false; + }, [navigationController, selectedTab]); + + const openWalletsAppFunc = useCallback( + (e) => { + setIsOpen(true); + }, + [setIsOpen] + ); + + useEffect(() => { + subscribeToEvent("openWalletsApp", openWalletsAppFunc); + + return () => { + unsubscribeFromEvent("openWalletsApp", openWalletsAppFunc); + }; + }, [openWalletsAppFunc]); + + const handleClose = ()=> { + setIsOpen(false); + iframeRef.current = null + } + + return ( + <> + {isOpen && ( + + + + Q-Wallets + + + + + + + + + { + executeEvent(`navigateBackApp-${selectedTab?.tabId}`, {}); + }} + disabled={isDisableBackButton} + sx={{ + opacity: !isDisableBackButton ? 1 : 0.1, + cursor: !isDisableBackButton ? "pointer" : "default", + }} + > + + + { + if (selectedTab?.refreshFunc) { + selectedTab.refreshFunc(selectedTab?.tabId); + + } else { + executeEvent("refreshApp", { + tabId: selectedTab?.tabId, + }); + } + + + }}> + + + + + + + )} + + ); +}; diff --git a/src/hooks/useHandlePaymentNotification.tsx b/src/hooks/useHandlePaymentNotification.tsx index cfed663..b5df816 100644 --- a/src/hooks/useHandlePaymentNotification.tsx +++ b/src/hooks/useHandlePaymentNotification.tsx @@ -4,6 +4,7 @@ import { getData, storeData } from '../utils/chromeStorage'; import { checkDifference, getNameInfoForOthers } from '../background'; import { useRecoilState } from 'recoil'; import { lastPaymentSeenTimestampAtom } from '../atoms/global'; +import { subscribeToEvent, unsubscribeFromEvent } from '../utils/events'; export const useHandlePaymentNotification = (address) => { const [latestTx, setLatestTx] = useState(null); @@ -106,6 +107,21 @@ export const useHandlePaymentNotification = (address) => { window.removeEventListener("message", messageHandler); }; }, [getLastSeenData]); + + const setLastEnteredTimestampPaymentEventFunc = useCallback( + (e) => { + setLastEnteredTimestampPayment(Date.now) + }, + [setLastEnteredTimestampPayment] + ); + + useEffect(() => { + subscribeToEvent("setLastEnteredTimestampPaymentEvent", setLastEnteredTimestampPaymentEventFunc); + + return () => { + unsubscribeFromEvent("setLastEnteredTimestampPaymentEvent", setLastEnteredTimestampPaymentEventFunc); + }; + }, [setLastEnteredTimestampPaymentEventFunc]); return { latestTx, getNameOrAddressOfSenderMiddle, diff --git a/src/messaging/messagesToBackground.tsx b/src/messaging/messagesToBackground.tsx index 7da16d4..0ba8f71 100644 --- a/src/messaging/messagesToBackground.tsx +++ b/src/messaging/messagesToBackground.tsx @@ -24,13 +24,13 @@ window.addEventListener("message", (event) => { } }); -export const sendMessageBackground = (action, data = {}, timeout = 180000, isExtension, appInfo) => { +export const sendMessageBackground = (action, data = {}, timeout = 180000, isExtension, appInfo, skipAuth) => { return new Promise((resolve, reject) => { const requestId = generateRequestId(); // Unique ID for each request callbackMap.set(requestId, { resolve, reject }); // Store both resolve and reject callbacks const targetOrigin = window.location.origin // Send the message with `backgroundMessage` type - window.postMessage({ type: "backgroundMessage", action, requestId, payload: data, isExtension, appInfo }, targetOrigin); + window.postMessage({ type: "backgroundMessage", action, requestId, payload: data, isExtension, appInfo, skipAuth }, targetOrigin); // Set up a timeout to automatically reject if no response is received const timeoutId = setTimeout(() => { diff --git a/src/qortalRequests.ts b/src/qortalRequests.ts index b2848c4..18457da 100644 --- a/src/qortalRequests.ts +++ b/src/qortalRequests.ts @@ -70,6 +70,7 @@ export const isRunningGateway = async ()=> { // Ensure the message is from a trusted source const isFromExtension = request?.isExtension; const appInfo = request?.appInfo; + const skipAuth = request?.skipAuth || false if (request?.type !== "backgroundMessage") return; // Only process messages of type 'backgroundMessage' @@ -77,7 +78,7 @@ export const isRunningGateway = async ()=> { switch (request.action) { case "GET_USER_ACCOUNT": { try { - const res = await getUserAccount({isFromExtension, appInfo}); + const res = await getUserAccount({isFromExtension, appInfo, skipAuth}); event.source.postMessage({ requestId: request.requestId, action: request.action, diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index 66e3006..30fd805 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -371,7 +371,7 @@ async function getUserPermission(payload, isFromExtension) { }); } -export const getUserAccount = async ({ isFromExtension, appInfo }) => { +export const getUserAccount = async ({ isFromExtension, appInfo, skipAuth }) => { try { const value = (await getPermission(`qAPPAutoAuth-${appInfo?.name}`)) || false; @@ -379,6 +379,9 @@ export const getUserAccount = async ({ isFromExtension, appInfo }) => { if (value) { skip = true; } + if(skipAuth){ + skip = true + } let resPermission; if (!skip) { resPermission = await getUserPermission( From 15f15f8172a6159829250ab12a0a04a03a7a5e55 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Mon, 10 Mar 2025 18:12:41 +0200 Subject: [PATCH 31/77] fix qmail notification --- src/components/Group/QMailMessages.tsx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/Group/QMailMessages.tsx b/src/components/Group/QMailMessages.tsx index b4bfd4a..c2d7370 100644 --- a/src/components/Group/QMailMessages.tsx +++ b/src/components/Group/QMailMessages.tsx @@ -103,16 +103,16 @@ export const QMailMessages = ({userName, userAddress}) => { }, [getMails, userName, userAddress]); - const anyUnread = useMemo(()=> { - let unread = false - - mails.forEach((mail)=> { - if(lastEnteredTimestamp && isLessThanOneWeekOld(mail?.created)){ - unread = true - } - }) - return unread - }, [mails, lastEnteredTimestamp]) + const anyUnread = useMemo(()=> { + let unread = false + + mails.forEach((mail)=> { + if(!lastEnteredTimestamp && isLessThanOneWeekOld(mail?.created) || (lastEnteredTimestamp && isLessThanOneWeekOld(mail?.created) && lastEnteredTimestamp < mail?.created)){ + unread = true + } + }) + return unread + }, [mails, lastEnteredTimestamp]) return ( { Latest Q-Mails {isExpanded ? : ( )} From f65e4e92ced97399a4fc02db63221d59157513b3 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Mon, 10 Mar 2025 19:45:05 +0200 Subject: [PATCH 32/77] fix showing edited messages --- src/components/Chat/ChatList.tsx | 4 ++++ src/components/Chat/MessageItem.tsx | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/Chat/ChatList.tsx b/src/components/Chat/ChatList.tsx index 9d5e42b..ef32e7e 100644 --- a/src/components/Chat/ChatList.tsx +++ b/src/components/Chat/ChatList.tsx @@ -245,6 +245,7 @@ export const ChatList = ({ if (chatReferences?.[reply?.signature]?.edit) { reply.decryptedData = chatReferences[reply?.signature]?.edit; reply.text = chatReferences[reply?.signature]?.edit?.message; + reply.editTimestamp = chatReferences[reply?.signature]?.edit?.timestamp } } @@ -271,10 +272,12 @@ export const ChatList = ({ if (chatReferences[message.signature]?.edit?.message && message?.text) { message.text = chatReferences[message.signature]?.edit?.message; message.isEdit = true + message.editTimestamp = chatReferences[message.signature]?.edit?.timestamp } if (chatReferences[message.signature]?.edit?.messageText && message?.messageText) { message.messageText = chatReferences[message.signature]?.edit?.messageText; message.isEdit = true + message.editTimestamp = chatReferences[message.signature]?.edit?.timestamp } } @@ -360,6 +363,7 @@ export const ChatList = ({ reactions={reactions} isUpdating={isUpdating} isPrivate={isPrivate} + /> diff --git a/src/components/Chat/MessageItem.tsx b/src/components/Chat/MessageItem.tsx index 284ad96..06db7f8 100644 --- a/src/components/Chat/MessageItem.tsx +++ b/src/components/Chat/MessageItem.tsx @@ -102,7 +102,7 @@ const htmlText = useMemo(()=> { ]) } -}, []) +}, [message?.editTimestamp]) @@ -118,7 +118,7 @@ const htmlReply = useMemo(()=> { ]) } -}, []) +}, [reply?.editTimestamp]) const userAvatarUrl = useMemo(()=> { return message?.senderName ? `${getBaseApiReact()}/arbitrary/THUMBNAIL/${ From cd9150749f468c35267a93e347da15cea5e8369a Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Wed, 2 Apr 2025 08:43:40 +0200 Subject: [PATCH 33/77] Remove dist.zip and put into gitignore --- .gitignore | 1 + dist.zip | Bin 2292270 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 dist.zip diff --git a/.gitignore b/.gitignore index e494b90..979a042 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ lerna-debug.log* node_modules dist +dist.zip dist-ssr *.local diff --git a/dist.zip b/dist.zip deleted file mode 100644 index 8f6f422188e0167b6318796aa83c9c7c6275c207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2292270 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

c(={0N>Rz|kG8lC_uG?`8 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�BHph3gp#TE>XW0IJxbdxJ{k{a7UVq9Eq>6iEPk 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

-)04&YoF!jK3luy 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 Pv=8430}czI(&G+u zLsGK}iwJF6r7?e?o_O=?~= zmsx79V?e59;StLoze5M16(hUG!Ph+*hsZ1=)6|cHd(I9a@}vB>_|t4dlc7k z9X<3MvbUYUsT70`aQ1AjqdKNNH|iG(Mve=Jt{d(f78G3hT=@>D+HLg|+J{y~@Cvf8 zC0xlI<6V3;=4IP@+j?)5&!x_#UV~i%Txz{%v=0Qz*6;K#^yWs|eeTy5d@j{p>26@x zuf1M#h32wLG@kY!_K%`p;9lSyYkgvUVk;i8p0V(D74D1D{e^n74e@;ng=U)G@O`4D z-sIlK1|A$~|hBaiv3@`a2hTb@f_fI3l#9 zl?R-4GXmGVRb=jSgb#-39c}0iH3&RJjewU(tLR4QMlo&O2;2a_Za1*D%UcpmLI23g z2fh!npGpuQ>n|(UxKXpgTB{NR`D2NviNC7QgPAVH#vQ^1!X}6t!hzK#|RQD86!D0H>iA87~_WsGj?#7A~vK)uiXP+ zr`7FmF?UG^7@e}@hc|A>s34->g9Ih8UO=7;SJrrMBJTi^fg4Fwz*yTIp1V(KE=WWc~! z?r||NUIg!eOYbqA{L8x_X?M?8AvpR*O~UY&s%6*AK(zEYUkEG`zQH*A66E4}5;^;4 z=JK6@QXBwUMHLni?i3#hyNj!+P9WNIk#2&#Cy5|I_RG86=DGa5xPxLtzSHnTVB z%>!!;Ht070DxNI~Ohl_Qx^WA*;MQ^CXSqCKqs0o5?Znoim%T z^_J(WAFE={LCNtDm+XduKXBsLD6JC>K7QpE8VB}!clhSAK*y7NAMG(q6@-S#?YYem z_eb4O^!$@IF&+fkU@L!kuIs3-TigL7Laq(D4Sc>4-|Le$1RsBw4c!MedW~3Fgr-^F zk#(2HXGWiyF_$UNGSX9jNHBmk^p03Oikt-dezfAeq)vYemHc_q+F9pYVmU`JZ=|s3rv6?s)V7jL_VTfI)$c6e#@b z4VmA&bEB;MsPaOk^1@FOA7{3%_u}f!GY6d3cGv(&FWpZ8+x&9hz*gPhg{ zk4xQn>(eCb)68Dk6b@%5EcC+nJ~fs(%qHInIJehNjF;ajmEV1uIH{eFxK?vX_Ia!5 z8R&e5K|M|@k5a2?aR2`FTCdNp-qG4Vr&T_0SwG)sRsKF@Mp79tuVsa%_v-!hPG@!7 zrR84_ZUr-sT1KHMTa{$M(5>~DDfsVXzXiMFDF3GPA8JUyvi#MdRO{f<`m?luQdD}R zs?kSS=&EOis|Z-?a{pE@w(Byq4$TFyqWi~6{L|06|9v(8)QEeT;jB(FD1SkN{HJF8 zS4%)GQ+pTl_@A^4M*3gcUjCv&`;SK|e>XZ8*vRKx_F2cN|5e}Jv;m53Y+NN?2`PF& z5I5-ol};#Zz$|SZtZ3to(0(s}AW-LvCJF_yKb! zrl0)}h!#T-JIwx>6(RNG2g;e4zu@*dtv+ZHXdfJFYVgNGl6Z@u&$z6qcSL{e{z38& zaNs=%&^&i^sw?_U$d;iOD zOete<<6Z1Dh~?>B^VQ^&(1T9|VmQhBOnu5-68zoXEsG{)@2!uGO~iYf{PpKXpR$<; zUV?WIv*gO-I;VG{UudN_Ldr!rIA`x4%aeF|-PpDF-%B~tV>jP?W^BI9TD+fgr0o-a z+R{FYZFfW9a;_X5vRkIZITI>hM}610P3P;SF#WOl#`YvHxw$Kybr&66*%+)ejQV*N>PG9yCA%6dP0!knNvq0FMnf;CE>NngSiy z&02+D213_OTZLN&u!z&2u?A>&b5;>}0zFWs0T$5Z__iAmEg~WM25ca6 z!$}*u%)*8n|0Z@A}Nl~pD}PgiA$)*#;X0dpbq23P{f-BIEe^=5K(*PT=?}s!TuBAgklhuorJA}v=P>xM681%5SE;T zafH+r)Kv;*RFrEYZr9%h!~7xR(qj(BFOvAY(SnwE4`y#U_IdRgH3e9U7!~D zv&TeT$-m6|!L>(#z=9Kl!VC!m&I4p}Sc^eR{4H}RixG}|TQTFg{>wb>mW{rJthH;;F-c^lMq!3(CRHc{lFG1!Z`c=GC*2{yYqY90O5v4 z^y}S#et^Y?80`A$Yel-17TQF))wq#nh5PK1(3k#X%!1(4I;1?jmqzK{(3oF*bou{6W!R%fREtP#5f;8qZi(PY3P@tFTU>Lb_2d zFt}l({I)mPr2y-`U%GKF2)Nt2NVaB0VfS*3mS z1Myt!TrJOze|_wnT>dm3wk|>pz607ULU@AIf9{!6O{XJ~o<@gf>!=pbb?FpaIP7ux z97Ctnyp>k?a-c`yoM)A0Ln2*QzFk_4W2KmLz9N66w#2&vCY{#~UJO89zthTzqFaqx zY`E__KQzEhLBjM+C!bP+%!%fK2HTszebHk`(*9;YZf(gW4DkW4Zu)BL>+4 z_alY|4?vEA+krHPL502YXO2M%41kUy67vVmAr1wd5{3v8HdF*hhv*mnstB3@{$1EY z5i$XSB?q4xiPraCSo}h;7@RhMHix#jFgqXdmE{(6jTmnTQLhR0P&Nj3TA0@kl%Po` z3>1J4Eewtt;|FTpg^1q;=Ne#5%qQFj&EpHKNhm%E2(f*ju3>^T8h{I8DIKVVnwun6Oo8$TjNSZK2$X*2|5FN8<&<>eu%#BEdZFa+gZdJ`kq!P% z{y^0&1oI|+q41xI`pN^F5|JBGx715uOZ?JuFpCk8M^KGEiPFo4n!r@klO$2})dXrL z{av_5-j^Qe8jt)1bxTgPO*)hd=8}@+KNT8JYceB_Lcw*BR$9Ct_ zyP~s0SqpWIE$sE!mXWk_rgYe+xn;yBz-)uZ6`<#@ z8Us1)hj!4ldsKle><98scin#+Zczg-@qc%B4b1&2j2Yv^Te6lUsweY48B%cWgVUZG zi?T8stgqc(=FzmpkpW-$O8SSL<}`pp+<<5k;fx`8@Wt=KdI0z!gV_5EBZK>kKo3FK z2k;Z4??4z56G20v5DSHZLkNo?L*)6v!us{(KvTnh^V`Y+r-qU7o6do!hBFf8Q6y9a zIrsav;iU+p3aKWnrih?QMInu#h&BsaFG8S*H4ApDE1mL%(y${n@X-`?Fa1ACh^58b zO@p3W{2vSaLfJkJoDW}k!KT0#`W+fTrofo`Eg2xDz$GPKsc&;Pt{bf0!EVV(K(A_i+vtgze#43o-(!*ucjzWUAY?`wg$nOR ztwN^<8&U$bPw>U3AeMyr4Fi4gNj%}keb2i-`DTz1n?bJ!goC(!5MD!$;R+<`R@k6z zg7k)5=8P=`fL_bW#w5rPE2*Y&Z5gNnG_ba5dCk@-I2Ak6LPQC!f2M_+YEKm&YMD&=V z*o-SjX0TE4+EChwfj8jA@gjgUI(SF=qW8PEVSr;j(k)X3>r)A7Rn?AZ-QR5Fsf5h+ zlX6*f3BJL%oV=(80e|og#tzjpvQxp2u7Z45()YNKm=nD(*nd&c?lpnxCCWt_?<&eB zk8U_vvz~<0=D4ceuec%7fUTjiX?(H4|Fr_E0Sv@A4Z%3=6r4NkRX=}~W|5_13Axqz z0GjVA+p7gQrV)G`4XC~r_vzVR&=1boM{Sq3&gd-`ZJ|Af! z+1`GvF3*DmOpQ;>A0@yo4lE4}Lo7XI*e5V7aY{$+9Xnvw zjMa}N!d>6;gkJ#Z3P_hg0;Xk`omcLDet&$*VDa=CzXDPTkSu|e1|%&YEdz-cNbW#F zdU(np0{&WP>)3&F2S~s7!16hFfwT>z{bPp)pu7PnZve`jH;)|#E)#iLf75j$kH-a& zcxicQN7^5LW_UgR%y^nw^{%+Eol04aZJVy+yS!8zKHJU zBC3N0@`S9s^;pjv`gSSM1BxfOVTtppXIC#NqODt$fmxlKAmoqMqM^v5VkF5iNGqG7 z7^Ki@EX&HdyaO7vvnaf%4O!>=t^{-+$)`l)n9){hnR}EC{i=KygMxZUwnxiHFJX zQ4#ZBP&T3I^M z-U!b$m*}yvP@VmEIG3<6C_a6~^8KY-YRWinm$vJZS@S=r~?JlMQ&lgIxmu|jTTU7*6h3$V(_%t3wq5Q3{NgsrkxK&k=RtlU3*3wsI zN}0o2Be?`ksf1*XxV|7wSx#B2go1;_Pnqop*U8WnIn>D1A|YL5|Jv7S?lvobcBG`o zX;5pX1k5<30`Y0YEr!zsXVj27IGKFpnn%5aC8|?0y=iX?p)gTXA*m~wknh`7*)j4l z(1!(%uy-@lJeuRO`-aWLy26?3vRF!2aW`Nm$=`{> zuf^GRduz8uF7QngY*D?^{_4LII21g3lzT#u^r05$YbBJ9-dH(T6y{;cdJzHV%oA=m z5Fa1{rDX~c1#4&8 z4}zs73mG=tA>+x;h)yu36N}HYr)Wl{8JG_n;FO>Q{y(M0t-(5AEA_j}1x-2{72yj{ z_FiqId~w0n3I0@(y90`!{PCHDBpi`v6XN=_Zo*jXhAP4MmT)`%MqN(h= zqy4QN*@n4tyo*4tvqt@eRD5Ub$~0k#^a}~bPWhF3-HWpuUqfd?r&wzH)$emg)OSbn zh`fBke1qG+=$57$ud;(~-t}dNO)+GBcs=&$>eC~A!^H5ufe=$RRsAm96@;?Jn_dU> zh{+@ConB&P9MY1eEUsZ$yFBgid)&Kt+A!A+UO}^`N(an{%_HZJiTM#qxt-Q4U1gOw z-M37317l{TMeK+LJBo~1l`FbOX=6^*cwFmK>qQpG_*HB8fn!!`*%E8z24o@=I`r?A z_BuRar7N6pq&3y4(06to z;9*^hIvK7@vWv1^Q7E{T*tuZ=k&}x9(2;T2xtDqolU2rn!4PEZ^w_!5BG2T{X0pL|Ecq`boN>^~^YL?kw^g%{MpG8k}!N1F#%AUwpwWC`m)}Rn@ z7>k8yU{8e&NjQowg+`s;6P$0?$K|8K*r__JQo0f3<15x%J5nKXwxFTpdwhvFOJr`T z{X)O^fPEg#(g6cQB6mqC6vkhr~+l!m%u=f%BJcvawC2$HER|IzYgpJ*06vmaLS8$zypuyJfC6Pi!kEefw^U(zxaGY@>Nmr$YVy$5#vZlPQ%y(K_Kw7 z_XfKmdS-jkG%bgD0bIO^atKcD0$I!N&=*t(O0fd$WD?+3MF7iT5Q0k`cv%ywh+f&B z3ok|;u#EkD3_bKnzJ1y~aW8rj+P z$3)TvZz;mlEWSa~k_c(Qs5ZeTB6q9#gVAnETC*i?Y&`jj67dHK`G`{N1j`63^tSC$ z{45Y*;cha@Nm(}_$HX`Yww^@Ln}l7<|whAfOa3 zW+xE)p^QpY<=bulQx!Whof5-AZyJb!VU*?r!8z@GCXaCrbu*bg>hx$r939Xf^&4nb29bP>^uFVTz5 z4MW5A{m1Tk91CdPItmZM(kGN6(}dJ8A3hXMlN=%+LQ?pli1LyWbT_>vf}79~Bu3>0 z8&6_B<}%0|oi8Y2BT`4qEXv0!SG`7pb1-?)iS$aF6|faw^BwYOj?0)C@<1_&He-g> zn4@55?V#Sh5sReDXpoC#-sFStQt2jE7(L@UN=sMB)`%pp_S`Wkl7niHqt`CBR;|XL ziD>)^0e)3Qr9$OgA?w-12(#Nlj@%L$Bb6$e8EEH(+BX*_q(OD=;G`T-8ZWPt znXqwGz`EDnT~Lls8qyU9hr8=lp=4aRc`|!~*qhlf;iM4jG;bC0bxs zlvM((H6lV{01vw!OUMA-3!pZ}%#0<;PfXJ8|VCy0{XZSXJOjqSYXuYa)f&`$q0-6$>oDzZnx|LyJ7+ zcS01j2^J<8_EUgOq3Abz4AkCRNxAU1;^A9Kr3xXVrZ?)JiIVIZgx{O4s1bHA5gtL< z9@r+$KKih4J>}CZ5Pi=PVib<`Wb#2$`zrkgNE*3{c3n`oQYb)JAR=gfD+U&)0W1fI z$kyY&#Bx7Id4@P{(vlNtkjU*oU4c#O0pG1bNRqrFo2HE?4O1kQGOG~Bt!)J@$OMKU zVkMf6(t;JTSJfV1Rh4S<@gODvHL>7yA;5=cUaCC7HXoAtm9kLr7D!2S!UOFXNS7#= zC{cWzvwdA1bhpmuDR92^rCY_GoakQ=*Vt6rFwt~7N$VY;MyNNSDN;@8{61w{V{_7a z#qq$a#!mvq_#QRXz~i%r*h#~>jZc%BEU^ZI-$@i`n2`(m#m^hqUHATwV~jT@@0^dp zdY501F$z`Je%}Qe|}r&hi8!pFl60 zXm~NW=7(IUO>5>wnshSsPj6C-Kz(q5N+i_r8T3tm!J)_6%4@D4qRTXVZXyYHhx*4t z#QE2a?)BSW5Q5u=Z|;0wlvw^hlCCl=%C74wqJTG{) z0}P$g&CoHFfH2h13_0-eyx+fbUHAR(?6db;YnRn%GBXunnpQ-Oqm4ddM(*@9Cgb9m zb8&@&Y*6FKfkxnHx#=`41Ku>cE#a<=Ui|%49W%|0kd(@u%FJ4JB|%-?;8Y2*{|~!k zRq2`yVTi~5n0sQG9(iakwkVaCgpy~AJGWJ#<4y9Ptk3#6S--rm8$T+JXQ(?)TbiFo z#!z$sYBlIbZ(>%(>i4b(Vg?2K4|rf@Qa=ao`?ri6rKpb&6{WCgk(i!WTeN~%sJ49!*g>AZd!qq)2$L$)=sK^PtNyTz#v6Np;6g++=Ktu@e+-OU zMW#^~b@iG=ExTkQ8S%P6>6e832z5LETZo;W>Rs+X9`WPTLB}RrZ@!Mr)CHQIyXq+% zDJ0vWq#U-j-A%wWhGmZ*BC3X{X+iaU0o&IQ2r;^L5+i@@{a;iI$2=`9Qg=BBx| znvtl5s@Ux{rV7BO?$TC-MdUeI#gfhkExSyM#x;U220g-I1p(lPi)0`X0Uo}B?0l(X zrB=V?QsxCj*)|Di`)#}P@|7-g`czy|+Lu;VZI@4+Z(Rh60YMK|ANk1M;%Wg-Evud3 zIro1KW93#76*Lc%SBSE-BE|ql;WDMM))A~KOj@m!=ZEV;0@mHTN86e6zYW`6f4-z| zBXPO^+)MY9rT@yAzsxA;EvFN^a^J*+A(u<`w5&PFP7F>}aqjM%ooqy->?_^&rPI>6*#c#Qa>=6SUyFBi@Ob7jerju`Yck8 zy#^VO^67VlE!oF5Q|F;qr%XL}K-0UMOBTz(T!%P2=)J_bpY`trl*C(P!}voyeq6f6 zc=NN6xMh>AFG&?aK3=G?Tm|y)3$RTUt8acfZeMRnPd)cf_a@Ma8QQXUOS4J3eNpv1 zk5=Bd3B*VvWw4uA0t-d_hq+55hDDnUq|n~^ThXqOF^&X6qv%3c#_#{EoJfyJGz>O- z3)#6;{SkakX~etM^3m|p(`(ACAMp8E!?)c6)fp!iw16|CQ{~KnMq?`QRUS$d z>H@JYmY7mYpaF3Q728Yx{M=5U+H+a?Z}ceZ}BZ+vy$D818526UBh)rPCt^CgR> zZ?=zR@gRmr(5UU1{XSQ$uIb#wE+71ji$lmnh6ai+Tg(_IUWVeKlhY#K2z4BO_(4d^ zy(@-)L&U(v^@BAC^K?~BFDtLh5he!i47~2unRS5dh9%}sVKIUtv+si|)l3xaxXP5k zoTUJY+aK)~(kB&~t3nzF>)~MG>g7fvYqU6S!K8?OSF$^?LXv|Kl#K)0p`Z5Px6Z)=M6@~1*zHaln* zXm6Cxf4kB4v~^4`X*HMU!O_ zSJjGdukE_Q6$v3@fDyi_e5c92Q3(3CT}UK|5rKn>d{2UyJDP2~j`qshq8x`|KiA5| zm^RI?VohGs_di=RTin_;qV@?D@2{=A0ciTcf51+{6dXoFbw- zf7o0|vE`#=AA?-LDFb+w1zb^k zm>=B(?8#r$L2WN(FFMwNh1(=~bMeHK^gafdX6L!qasns3?k~pAgvgKY#BjqG)&mq; zC=SkVH(;pW7fQyz8eYg@G=19+npwf5oYsF|B0gX5a8brcUl+>tWRisHa`mvMS4Zw; z16A1$o9tRe7N#E(Bx^a6y0UuM6hqiC3=XpBxSKA3_ zvByslW`s%tgKq*{ZFelKn@;sH35wl9< zA-&c7+wPIT?xuZE{ai$bLSy4J)rv{{Y3;(tD<%(R*Aa`X{HCAFdp~)9@Jau&L1!(X z_$~V|7k;!q{~D-@(iQu0g{=(!J{0&fqm{+21A(crjO`cnV56$vX2$W{^+d-Rz( zy%+kR;{q`-M7_2&%3ocy(7tte?3=LfLeV3jSJwsYe#XR$`sJv_V|`J{>d@~H&EAh5Lt#bTT*9IQk^vPL$);;T{VC;ce1 zaJjpu#&*c)*(dU|rJyN(%C%daDdMTt@`vh&wzuEv zW8ekDVoH89DJ8F02c(y4t_nxl|Fd%}|CRlE+$e$>37N&0SSNm{)AapZJJ{B)XH<3? zva|l@-}EZV-fd151*gK(@U~OBI$Mjb@LdJj1c^z|oS|5b+)Eg_lg@7UifN#c>vA6h zLhqp5!$#AtcN&A9BU_zt9KaW}MxVU5gHy*TdC6PYQOESh z*b=VKG5hab*iSu9auO#^G(PqT%VWk3kLdURYxA>T&W}sf*T!Mli5R(Pd7M07FhAcG z%?TAHj6I!9zca9<-pUugYM2xokoGuo$oGv7+gVwVnlS(cl-$~6cscy}wel4&i-+JlX050MzN3}#&Mi_7&*V+ZkYV8W7(L>#%9~RUtv6E;W zda!wYwmUSiHR1#_2Na|zlE_~Bsw#H%#FnaC4_XKBjh-En4xBEE8aH)x{SoEXUYG!U z3Xd4}aZ!^nfna~G%k3;VUfn1U!+~{qjjNG&8B5}|Cg`^Nj%k_gN77%bSH=T(Nl^dX zp+uYRmSmDa#-v5cuBQ#rB_|4dwUJAL-6lDsSymTl8`G?ei6(#^>di(MIFHSZhA#E; znojeD!AFw~B=b72XvXkCqlO7(Hv$5(KxWrSdMzh52g1C}XOFX&oz}Y%9$ja%T2oWu zOFyGlBnrPMHgzN~KO`-~-9+!*#<=$JBcEJ{O=Zqt&C>uyCo)wyvY2svsG(k&#Kz&y z<>)*l!|Y1CI8;tFYZLL;F}s{<@c~+i*mydL*8ueGok(mBR1iJLh1y13q~UTH!o}W+ zan{9&u@RKk&~XBE@HgvfpM*Itx;P0of^v&dnpss<;`7`ZrUcH^i&9o=7QUu$k}rn` zE=c!qn3XC2&c$Bshz&gK3I?!@t_i-cz%@hsn?K0yYSk^=$ytMMjAN~hA8twk*C}Q| zwQsHxmYrIGx&MBm!p}Q>_({W(l8*PbVEya0Xve!d$!`BTZ{Inuzw)P$$RkApZ|P06^x+cu z*?Z*$9}YdPKISvfSVvEj+C>V%y$dI0DHoKEaftq5f?A}D zeKP_pNo-h|C$9RuS^RTqqKdDq*kNPb$MmzvfUv7Vf=vU5#~|?~CQgBRB*h}U72#Bc zdWi(DAi3v(KUjSeuYw7BlpG$v8+$LuSzkm68V?E@d+&5zF#FmCeng zY>-h`*XHAwmayW0CrrTnINX*tm4P#pQ-*%RQ6kJ~Xh2}BB4DT=0S|J|rKW4QFamBg z3VJTXYrTb1+T{G!%xK2i1_DnpH;gSp2dS;wr4Ppu5JBI=mn+DJ_7b~lptWkuivKkg z>7da9CX{;l{TlYsn=oHvUg{*zWt(P%q{p3DocKY-$xcN{mOw1qzkio(Ya2%?BVudf zM>ESSou1MB#6-I4#I-9k{6PoXCDqIBdev{Zg-^A(C?){!Sw8*%Rhv||UnkjnHUMw> za8Nr2BH!n!rs~IQ_Gi^JMRR9C>4Hjdn$8xf^441ae%MX-0(7vP5tF977NXGCO9 z`xlQB-R*&dN!k|ERx&$C1}`=`-{PBx%NOgxCCHIJ?)|*KyCr7o2V11Y`fn^s{1TFn zqx~+Jo>A9w0$SE*SBOK?emM+*7SK6{|;cAQ=%Uq1c zT0mI&LOZN%;Y%Yo{d$ti&!lpeu$?!E8K z!#3SO0wN=)<>Aw_if8Y=KYTOY!e#I2*q6@C%>MmCvW@OYZElc&=a8u+Fq|vOGU*Al zpVn)qTzWFf|34Vv6{|`rf3VCvJ)yk&Fm5hiirB=;SJ`HS`PJaLQ+ZR@#%u}(pIf`} zrWug$dXum7`8o`it=*uaUe=S9kJUHom1OoHeH^x0O1CSA17mEe7lU8B2!+4F+mAtbI&oTfHR`5_53k7()A{j-j| zZdp@$B#^Aikt{v1^}4V0uVz&Dj^}qUvb^<-Tu)L-#e94#8e`%G%9@Z|=v1!&8x+%Y zf&h~3_C!@`AGZFcEz|~+Y^ZCr_dmZ4)n9KDN$K33E8h@pVF4xf7q*3-v%AUuK4rb+ zURC&tmc3;VOY9U?^$e-uhp;85JZYQ}snuGm_vmZOmL4=iD)mmEcLgu6q%R}CAwN%^ zbsyT5?BjQSpeylgX%eV2 zsQa~lI5~5KQ-_1A$RlY7bC_O)*=lYRjeddStbb7a%X;tE&{->jcNFZZENc~Ge?u8Y zUI|U0%R#ivtItbrxS~piZ8!59O{2tz>*MOH{+?qyL#+jBR|f^c(zZMNGm&7&il6q@ z;|kyT6^K1A7LkcqymWg16ur2Xp72Zdyw^aQUfy`cCzg zxDaH6#z(PH8DQ$vrre(UpJ#VOmyHnh0R_z}T-JqPaWU*W@kN_u>0;X?!+!85X+3(9 zOgmt-IEdW8YzS#uG7OG6h(BmtK(mOe2|7;SJlpV}uuwO<%83ksI$q@rRxihH9lUj>dW2C;)1%$82utU~%tZ0aRwxJ1U~qChs)N zO_4j;Bjj{B?z1hOKdGbKDY4Z@J}b2-uMisEeBJE-RrKCi{2Vxp-04a$F$H<3Y6OKq zYIE_xxU`=4Hw0=qyc5@7zu(I4=q=h|B*!c5gZ8pPkJ%i>OG#N|xLa#qPu-`BQdx7R z2@QhhOV-84eZqrNQf=5~x^59cz<~5SH->P(Xz2mohKC?wZr|7wF|845&ZjL3(tIQK zs6X_^Me84&oTkhT>pG{@8ux8tvnRWjrIf#!EH@qR<8Y3)7|Hz}}r z@4ri%7RI=9m*_WZ`c)nyo|aHdp-Fao&LKX%q*CN+Q@ot*lGs>pTl+1cQ-k9;nv!ls zp&~08a1@s#upxB+S>(zhfBwY{8I7ei_^!xK0}Q#uzMv*kCDaUj0MocICSL7wrq1tGj1el;MrrurEVPldkE_BJJrM167q zpq|fu!FkmGx@nyq`Ln9EQ`hBF;YX}nQO{>vdve(k!ftkcHg4r@#Ybn&WE-)WAm1JR z!@o}+`O6|NRO$wOhC25&Pp8B$lm)?#d=kqwTi`AHIR2G(3+Vm4k0YKdmfJ$y2oq}m zdNZ3XA^nZ?O~dst<_C|Qsm>V>CS0nv@MsgNZaVP{Vz$SUuQoBvsa{@2bSkq4sh%c8 zdoJ~%Q`HN*TIhf%Cq**E{?O$DWW|J_K_5!q-VzaGv+GphOM)p|(9IS}L!mT8OlyEc z-Q7j@{ZT8V6lyo#e`=FxAe^ardvdN5v(G_Y7&py0TA1BoOJG(G$pI>Ul{#M@=0WXr zCab5AjLWaz+4>o^2|Jmjkid(sh~a;mTilFjyh)&gE|X-q^<5i%dv+aIt7r6*Hf!Vf z%Ib`*5S$5Nc1P6~?ErUqs9=fJ)x>FJ z#qFy1zMlHzPAaJ25;y!T9cnXs^RLjJs)A%(gGc>Nk#X>7@-a;?DipYEqm+G{+vL1b z;cQ#HKkMeic$qD#_vlYh@bhk{kbjBl^2(Qx42eFomPvZ0PLNHoD4dS$_QV+e9nh}d zX;*S49b&rh0uu1w?E$=R3e!gzS(n+iU3?E4rAJgV_G|sYf`}_ZW81y*!AeP3*`Ocg z7VJG|9V#8HBO|=UgT5p4Q{u;XU<_S!TdS1H5{uN$nNG-V-GD4nS?4F1`oW{;PXW<< zz_+#Irr+Yl;@%(;+ecFhjs>j1B^uBH>s6mq^E*({O+iHR^cb2>!sk(ee>vvh!KtI*F7TS!0J>NCA= zktum!XIi&WR3r}9k#`b1hn(ENmn#T2kh#KkOdVqPd7lETx2Q^`b+wBDy}B*-0NcMY zbQHQaxdR5irpYgKK#+-f+7q>`Q5iT$FZ*U^tz)oF>rv0sOlTI``Z#|>RSHN;YI@wu zf|yVnf9QiXul~@ywR?Rx9X@_77LKx2(u4a1X23n(|6IM8#p5OMk;{O`rXTx^oiv@N zrNd*%wnov&d8!-k@n}~xC7yVKRCC+?w#s&5a-f{ArBoDE`boT*yyMqVb?t|L+~04V zh^|#XT=5dd=YaqG;%R(+Snn+0h@YQZWC9|CYA}@^Jdq}k-mbFjnBxih$W!c$Ph}qk z##y%pJ1t0hoh46c%2nM*t(QfC!o}$x?NcgPwK^B0{eI3AiNB^yD_O*iTmC*!XP#DJ z#GPf(H>#=vw(e6;y|xVBH1f_j3UFX;`cX@k5-zA3ii`T2WIx>>Y$MLIIrnQk=hQXC zPt!gl=YlGR=4AEXunoVcqPVZ>dM8NI$w#$1&5!YP_WSeFcT1lRTlX*_O$<2nF?IXq zUlhC992(&TbtPTbR>rC6q!h8 z1@X>+XOe$7BJ9-hUQy(Rwr_&k=N=uceO2n0ZDyg2L!qnHGG7nfN>)b&zLc55Ael(V z#yH-?6eQ*Edq-jL|MGw{sG@tp^!r>#T=!GPfo#bqxfW98w(M%a5?m66!L` z?ymO$xiUO@t=2dFv!_qJ%U`Q(lOKgE6Dnb3OLr;EB~BCova&;fwBxN_s`o;pIB9!# ziENx)`7&Uvpdcx=+nFQ#v8-$wGzqDbbcD<4_%AvV21N_H9QScnuqiJ~x1uU#0W%$551} zg&U>`QQVG}oC~4uxikeby`-b*IHCAh!kX26ODL+Sj+dx8ll{&xA%gD@A-G-~mtx>r z^f%^!e3lR3g^2nPg;c5F?Z#=IH9}6?vy*R)osCjdin)A!Sg$hhw)SGwoK~m@cZ_q0 z!TXAvBgyQEg>*zDuD|0yMEtdVp9!!OV(r}63D`*_y}s?$C$nLA%;=Bt+WOw-S;VOb z5h8tp4EcrqIc`#`!-T!D6I`&T96?=z(v!wOW8@AGo)DuU{m%>nZH2nx@jgX&GM|xJ zKvObQO_v`El;c%OE9#XL^AC6?Cbc-b&Qh;WqqYj-ETBSD%0K$zW_yzbdwGF{aQO#s z#w5Ovm#MpSy3@5Qs61JZi-b1=)U{aayvzLA$IMdUO*?DnqU*d1m(=S7Kd&6E;|xsW zPCsn5TQQ6m-e$m8q1hPgo>Z`&ig{-+@b4v?$=kLA+{KDId3ICDzPNU6Nwcg}4?qcP z{Co6Mi5gOu9P5i9pA=R4MLk?SrIs1zA>5fGrJJLXCfl2~a_JH-1{tE)F>LKgVcV;JPg)uCIoiTnLlr{Q~3a)5DRfo z5?GDSk8*n@7_tx2a6xIyj1Jgw7Q23Yxinn#;NV;O8)d)oPi)O{)_KOx`JttCu-a9W zAu7uux!CK0&*k#IpFsfoFM?=*I)wAMl<6#19S5wB+}@6eNC3eCZ@gf0r|^Y|^wqPD zSlK!JiH53=W4V+28TUyk4}06eXj{Z;cDeMK55XX=P5-=ul6IM4#n%b$hZ-AYOcMCN z(Si(9RQViVjwZAI(M`a-hzgImz?Tsi>c0+8`~3Osn_%k|nswhxU#ELm+&~Oz+xxgq z{Z;9Xl*_Khimpx`!@ggf9#_V&5wN1s0-EYOim{=EgSM8!1@E}w9Rj1@l{}`4d2$Sl zREOGLLrv$?(_P^Cu8)`Y{8jyGxp*L&r8dt@5x3PT!WBu;wiC`3lC|qkJvINaPRpwP zhp<8CHn|l1Mwa1Ea4Y2-+d{FfN$k3Sb!g5Ncbf&+u1k$L!SU&p)~|nvQuwZ~{$o#1 z%+94;vUg3iw^|IcE_mRpQhwk)vyMIkFp=m5ETEgLJDmrr8)3INn_udD`>&v3SaShd z()D|}dhub*Ln3OP>i7F~GX=gwgpc;@d+bMF%XT}T>oENDsfw*ZNgUc6U*h1mlHxfl z*LKSuOuR;dV>{venbH>JV;o2!;H1J7uq1hLG^82WP3)>Mf75@^IoW;DV8VJ`wVJZ-csqX8^kj7c+yNQ^RiaQ z!LxMLUOR>t>_`j2PS_Pn*tO%8r(#gT99prSP@ZRX04ZdCh1FI2zPyXJH2{>7=Qb_jUa?fGh&X^f^A^KWJzJW@p*29<@YukL!qOHuDdo zX|IX#H3YUv0$ucr`Nz-aEa9gQc0c>`>n{s(PzzqWt^D~LWjM6;`qwxpJA)#A13I{5 z&L2ZZY;%V(Df-5Cy}1mDTEN!^qnCmxVlS`MMeEg2uds^>X4K<;OMyl1_$p_N=t|Ys zgME#y&Ld?iuuSYjw4i-l-BN&*QZhFMzg{wseFoA%IrGPs9OL+#V++Up!3qJW_dl@? z3!CS#a=69#y|l4+5)+>lUZT-`n_%ZdJ45hj4d+H$$7o<~Jb(Ggf*NXm{~KSx^7Z(t zw8x~xZBO3hTIP8_r^}k-(qHvdL8nGKs03_I5ercVSsi-q$Kq>X=Hp;sdmXa`0S5|f z-p<+y%6Ah1ZI8^GH|V&XhsnGEGiz}xHH(iYi`=>oLxb)4c+zCsg)wJhh?t49KuQ0# z!9&MN&t-68R6r%);cyA+V@uzlQeh7I4A_TfR1*~1;T^iFn-!CMSeea4NRhSEb?4HCK+we7jIPAr#wKGZrEU6WoJSC3tlt_~8vHVXnuXziJy^ljT7!>cqhXBQ-M1KZk%@KJX7ZQq4;T}{%xDRonO89aNPAFIhswao2ig?vasdMrD)H~C~4aJ(H(se!VP(Vo1#gU z1pHg>#ZNu~h~e!E@qaplhablG$&D5_`A- zh7Cov_rAO@lc|mruP~&V1@U*-*RtVyNZW~c`NtL5hKUwrHGReote8_b7}{EMY~FWo zF=U>f@k`5$`J0*^IB#dCgMMe-8{3l7AKNmo+G8!5+w44y`%9yD^=9@u`U8^?-InDF z%{EiQ;;mlbRU=jX!#Il1+(IDm+us5x_dq>>H}7;PrL*42D@*U|YlPS1bA+4U=I9*C z2DhctbZT6k71zFz&WQ(hNdU+1eE&n?HJ*iRR1=k^niBXis@ZTIiKJg1UYBqGE#7tM zLgl(zcf;Zl&dF>gq48ard?=3c+RFvFuz=ep)c6ImoA<6|`N|auY}4E9J%CJH)Y>SM zB+sL!-BF@&gBI)It}V@w8u-?l54Wu+QG`SP`ypD%-2(STIDI4)Xv+KW7LGB7bg`&nhJ`jKW=NEu>=A0baN%V*D7nkc5&;+GtF;7M{j3r9CvRK55iRj z91lJ#SGiLsYL^xx^JJaooIiF6;ON9`m<1wY&97#BsEx$JeFpdr-7KGg&J#3;SV^e- zrvU6;>8He9CD{z}AH)g7-tD_JtCXGJu2V1l9d=8%3SI{(2w>hu2_A$3d~>5fkgaZ~(P4;xlj zd+!CnJ00MMRFF2?`uu8yg6AxGr`U?u+Xp5S@QeC`F%QgT%%N)E%?WeGa%*Jt{k&y* zCjM6BVDg6G-yTdjK2pasAx@q6W-w}?6sj?G=;gu34$m2e$e$LPzwXpRSGe09%>J$8 z{1t2x!%VXWvxb$fpP%X(2Xc;y2C(Xa58VQKN~nETHYOdEJ3o&a@Bsv_6NywaIZN3+ zTXdrQh(-dLSiZ3yu!2gG4I4XZI*;oFw!jSYKK@3e+|H%QqXfnQz>qroYu0&!yIuHs zdHE2}E&8i+nL@Ew%u!Uqvj$Dp`|0KPczz2`k{QDiQz&kM*aH;S9Z#Ye33SLCllw=| zQiR~Jx)Q-OL+HSXVIb+swzs_lgW_AoJ1q&s1wKTa205RDtnlF#Wxo~cu=GN0irT#K zNi+2W#`|;RTj5wiaiL2}89IyNg&c?YS!ZLsDvy1;XAdFkpD~g6^s-%;SL|cn%Cxb! zo~vp3NxD%SQ*_Q!dhlZc+{rwf#8#)>&vutZ73X)QVNoV_oLca%%PhMMHJw?y zV_Z=Y6M!(B^s+?UyUB3AZDYT@YN@UOw=b;z1mQ^&__&-I%-{^y zi%3QotSY?$9Q><=SWUhbcUslEO)O`?pv=@MHtZKTZ$koLXD<0*6Wg6}{M_{nv2A#t zSpZ8ByzcGWsiUCok6`*#BO+|863Z~k@VdyLv8%U^=|^PY#>e~1UWY~Bs#V>nXQt8m z?T#{^)gR1<$VE^|+s>SDUSgO5rWP6F@;+^LGQ5%_x&0v-KDDckt&YBpD6A4|YV z?S+8W`+d|7b6dhS?qOX8WM>Ig1R1-lL97OHIt^=DuYtyVr}l z#l_7>xD61hqG6w6SSz5>M7kQe|rZX zxUEpDba*Fo00y>ZPvBf&aA&O_DvnDK-I^qVM6x8!p~(doskjY^=bX8 z>YI5@{ldINOk{&E2pC363T~gv+Vj` z@{T9r%2~mze}b{&$cA_Hqzq}3$n!wZLZRz)CEP5kj;* z8`Ihc9?EdZi>< z1CPUaM#Fq%x;_LcN)!DDYVHspJV(Ie5MGhqfFr5Hp%YOb$VO(gut3Ia_wFjf!`*SI z!Qrh9yDY2l(F%c+VDC1}42LtHMm}yGT_rg3%Bo+D>sl5)nj?u=xYQ-R%UdZ#4FgS> zc4~-UB87}NN~`9bDyTa>$KSzsYDwnsMTMr)ntGJ#8{`43apB){>hL%>6LIJEt{Yw2 zPtk13fS7=p@B)iMrOzj{|=tdKBn8VY3eVt8eh?r(ZAAD&l6HgzqZ z3`U5%LcyC0tib61A{(Z3FVG`_f%Vj=73H%D9P|{UMV_SRl&zW3zHmi z*KaB%x;Zt5vS%Tuj5vP=+@D6)keth@5_8S{p=#W_%~6@JFY!f;eEzebqw{jqg8YxV z=|sLXmo^OZlq3=NvmBvJj4XO$jDWB=zT$@=mrsTnN?_{8wXPd4{GpeIBRuo5=5RMz zTvD}9p3l5P?mC$%w4_kQbg1@dqx$Dy3Low3$c3;Yfx|n-7pnY4{niL$K3lDuzDSLv z37yK=pXJZ-?`htDDeZ;x)KHOO=y`U%%;wg}ySNAnH%apFYb>PqQ~jNP z6cVt0xb_g=8H$CfLlS-*&iX6;!KPBo=ywibd|_eBYXIp3=n{>oZlouBtCDWh$2ACC z?6ct*n#nxTF6~+v2{(Lv@53Hh<%sikP#aSFSkLhuF<9Y)Gxlp)vc{oHTTC_~*1;^C zc)=#TErKQm#a?&AZ~1&Z_*pKinq|t7w>8~wdJ`*8G0#W>0eB-0<0@S&=u&@`YgJ}Yusv_^2|PEN;`0RJmyL8 zf#`AC;AtX=nZIn3QQ9kL2;djc9Zw>REoQEcg^kfixF>AS$+NUa^M@XtSP6`_#5nrW&y404M}`fLB7JQ(Jqx{lQ`I5Vii$8 z{Cqv3ifBH{Wk~nu=9_C#%ZfTh5h%{&m>jdZ9MrM9*;)W|;+c_2$Zje|`G^_d>P5_x zy3iIVa^2kI`_U$ANUXBD)fDYn$n#(P_|PKlLF|u#KsKmlN5iLXEZidWtC+^NU=cRy!TtKzEB(lmV2Q!HNod<&-Ys$?PSNry={SaAuiV zlNY$7ay7$WmnN?<+3D7yWm+#XBPi?QL)c}SBvRPT%e7Y6w(7)wt*D9Ik;#+Zg9wCk zlDETMB7`?rTIp~(d8(TSv_TvRAA&9PaLu2M2Cq5F*C>;VD!|ZG4uuw`5cAGW<@C;dpHi;GmkSQ5;* zs4?H276)JQyecf?Xb8`)!x(sj`)jUP;YO7;q|#7nGESP1CyR1S;9YO3%v;Fkm`#Pg zYD>hmCby#Q>4tFx{k^7}*gh;DQL3$yzbWMq^h)00^K<-ELCX+^0#&26?tjM5@KbS4 z0zY%^p;7kgGS(7o7?i)hM>X+~Gk1^7u|z!=9xvz@n|jSca&B1# zDv)%Jf9#E;2zZVazGV0gD%bOx_8P6;Pb_6}ZuWO5 zZERIH&b#vGVQ;Q{Hon>wfTb-z?~$6vbiAOu|1ooGjbK%iI#B)D&!JSq6tIb1IcWkW zRr-R#un}X~=llDvQz7A+z24>4>y)IWY{jFOd%c0Cdhk1`Ew7gf1*9i@sDvnGAu;ze?M)=#`D5mtvexJ*StG39*T zL=PU@4se*j8T8zy<<%7#&a%1 zTwRde5B|IQsL0s7l<|;q!bn=@QuI^CE|B}fAJTdbzo-JWxBV5;+U>M`9nkYVEXlcp z^sq3k#IJc<8%}zhy7z~C8PCFjqB*-of^&+;@BcaS2iC;Ad&K4n8hYNH?_B%&sn> z_4ocFmAU)NeU6`8OYbWXxJ7=BoFT{4e+Mf&(saMhReD?Myz$oN2l(qiXbcv&=F~;KfXuQQ{|LNbKwl#W~Y~}@c*j}$|^+#y=jhJHz3nZlt zM_*5wmf{UD+ZkB=Y~Ibo!>*Gus@Dn!{E~8npmHRn-z)me(<{)bIoul3UE_%esc9T! zYo`92j>uB6LwY>?;~db6xN-{W;*2yM^p!PQt2qs5mjAbEe3{2@)W!jJ<*#HDEM+5& z_KuNtc+{vd6>rC=ilcU4Pa<*Qw2g#wKshKhbJqA`Z|S8H0^V0HH3}BV8tqCvZwV$w zj7O^SUKfhHYy``zTaG$6Irxes+WOmd?7fTJ5e{j!Z$-VP2jRy$Hgs>ZXFdhJ9?Eu) zAXiu7wU;dirNmWea{62`Z}FIPCdr?fEX-CpPR0IQIW56SIiqErZf5zAA+5ld{~;wX zXcF7hP|CpjRkS~y8zD(wKEirMOFxf#w3q%Aa)wGdSvWQPT zB5zSB)uz{G{V7&^6>=(VHzdSqdGcs&cS7P)1g}o3-bhMKITYzt=yZ(qF%;R=M=}1$iM8D56z9nlRvG;1>+IcOet@R?I+UU6=KmW;O*V+oV<6^AfI!xGc zaROQTX$P_V{%)4Jc?0Rxd`h@mbG=`;y`ZF2%?|MT#{Jp_lf9$FXhUmH{K)x6G2qa_ zEC1edAY@c62l7QXo?yeXjzE8q>tAF5#k&PpIjt-_F)O^h_E7a}1r{H)QM>cLGT)f$ z(ogg3KcR*vR6X!Bt2C(9X#BIimw_E=L7QqBA1U^FH|;~F)Ga>SULUNVn5j93Tl%7r zm=B2iSa|R6gbC)dap{OvSe?G7B2KqvYW&p^jonn%9Fbn!O-7VElE&X0776FhwLi&c z$$2?VhRcY`bbI`2q*?WQSwnq6z{O_pv$}S}%^S%R*9J)@o_~_Es~I@LqSADg?=*Zw z@qelodGxztcWU>;qr&!N#RiOZ;`dkkuM|?mx{cM!udz^R{ZCz>Ln@;~@y>$i2xy4C;d-P*Jr3UAY|7Mi$@5$CSjgkI# z)!Lr2O%Yceb?Z_c-k(hy2Ipmr7Pi|$uV!zFh!{KNN@6RG`<=Aoai_sj%@tB}uamj| zzI@|RF@X@#82|)%sIU^Pm;U8oaOBfMps&C7;K#h2!LYJ9I>D`q-{08fhiI3N|k}E3iWkgjqkrx@S&r zWZ8!9aF=(STPPxc!IwTX=nhLUPH#v=ort^gD?@N@Ope@2%zS zOY39iCEOhF8Wxz64JO)>jbU!NbLd1b@0iK!aG)Sy2y6YN3i2#xxX07jP2qxaz0#x= z2xmLH=Hp`1b|kZL^lv^LI6fVC25!dLn)y3Ws-$GuDR%VHfQ<0PkJRHXl(s;X?#M^( zz0|U)=Nb_ec+T3V0gVuBM)LD_(gdRWjxLM06~g$iFvnQ3nR^ZIK}t)>U(B*FhHoCL zRA+G;C=rfgeJQJKXY>T_VGx4mUr4L&ZfC6GlsS{pau!ilUxVG$gwJ%is7al2+>V`+ zSVA;Of{M-Alt>+|*3nNy;^s1hZ(9t#G|m5&aO7KfKc^B}%Ri+VP9_NR7c*i1Z^%&z z!=?g_8vnnr=+klZ2yd4}M$yrjV{V=ff?)~or;)-eC+xeZq4Cduh=!04vrUOQi!(r% z2!WlVGHj$#-?x0)_XDSczqq%GK9wE0cBcuf-iugX48shw{&AB6ug1BrZ@}m9$5*$M zC>&3+fAlENdoUT~@pgB$D~cFZWpl*I|Iz-)dL01rB(TMO4Sqmddli&vuNUl$+eY;Y z>vBCfq>%q)i-zKF?bV)jCN2?b7FSe;^}IT3smR~+_IDX7?-|H~#9~{h-kH0f_2qNw zNlD({bcK7^`)vv&CNhbc(BwqtCDn@>q4`A$>}jsgt%sk&BG=7Dm8`ci;s@YAlKd?l zu`Dk`PcW{<$#v>4y`9?>Bw5TwgEcz&;loa0hRiLEPSM%Cr#0kLE<|8L-(Mgl?OP;a*QVb>~oQw&z%wP2g8C(xOb8m!9V!+O6gnWaX^~|2od~h}0)GLNGWu zZn?+H(FWME|C+qtk7G~VuTyJ*!%e;?zbL&tjXJ{~4ObJbaZmD;Vk76{QTY4pV0yn_ z@h@&6v(KFwxVbg3p{;Jy(vHUMxOjg%r0?s6gTy ztuz$c&?O6nTD{1a8v8CJ`a(o&MX=Q30TQuccQBy2RPXZUV6|PYxk*pzq3zGk^rimO zx#4f(ua($6ewOY+-~SJiKyAMgNM1SGG5QPm1IQx&zHeBFpK`nw5*iv48f}Pto)_l8 zLv9H(M^0Z4K-MfEUOWfDE_k61UWe5|U}Bq%Z!N6MGQq~5>j9_)0f&Jbh~Z6!?qi}e zQU;6+?Ai6q&XqsUyH(#I$7D*0PxX)Ka;duPJM(okdlucK_f_#a;>H%8J zq6M^#n-b?ALzd469D*{>t)d*ZXn{(fG5%I=#4 ze4yq0gZJLtkd+diWa%_B_Q;I<>cU>|KL6?eVHAt5!rxX#B?h04$um}EfYY4i=>tL9 zMD&7atC8wEdAd$fi;9}M6I3d}gO*X8GvAGI*4iw$&arDf8?4Z@HmZ0&SWR*1yj}ZJ zv6HR6Yj*|LeIkw}XDAd8RPh^P0mX4YYX4!hA1xhf321#Z63dv5eqMv7vLn*NXhTqU z9v>;|1W`xlR1o%{{|p~~4Zy~Nd6oVkBM80= zuhqc|)!>I8fndo3V8iscN_=_KXV=Z&l~rHr64SXL#bnCqP=9OQ&ntJH>Dn`JcjvaE#{LYcLo04WJVepBM1I(d@3DM+aB*YNp%^Vrg`n5gY&hJs0r(u+34E)% z#CAztuwZlvy!*x6fAz_JvD9oXA6Hm3F7oBb)zd7?gm)W93-5jd{Fj@rRloMu>#y~R zotQRz=bWYI=0t^pK;Ni|6H=y(&ssitcq)xFb=e9np055J|Jw0YL{Ps7iKxpCWK7!30ykC{7Hu$)18JIB zK<*>JQeYY#ADtXGxbuSTU(DY30q6vtS#a{l9{GFT$UV3?iCx!Jrps^S`wWlo*F7<6 z+Wxn`{pi=cA2uhiG{5{m)V&8-6iLu9JTh7v)kMX;rRm~|atma210%N9)5i^t*X5iV#z31nl>x!GLhR|ljc%NoHb`FYp@ov)e zeF5qC_|P-lMMK#i90dF9vMiK6VuN4Ef$<%q+ca(0ab8M?9>-oKC!Y^5Zuu5|T|)gw zEa~B$9z6YC!ncv_8}5&C?BY_}xlwS(?kPSnJJ)q+Y}TyOaL<{4kcKah&vCAL4Qprk#i*+pdas724)r3|llc!@yS*^_ z2OUbNc;W>A^vAu3Xtegy43$ z4Sjjxx=EY?9>Mj2O04|N66KTB5psEAYq%G~wS&}aWw>-q!yRSm%2O8 z&+fL28dMY=&Bh`mu<0nIJ7<7)P@r_raw$i*IgS*))?|s@ITPme<4g}Z*#X73geV&e z$6gG4ayD^X73m6u;wl40uyRU|#erh?jE9lC+s)Oj{}E}FQ|W>jNjR+_TdYdQccOK< z>JP)I&FYsia>NEdpjDJ{J~bxxq)Qp;g4S7=7?SSYKRuXYzZV)66{>qjIN%5eb=k>! zMP<+N$Fyte=3h~r`vKX)(?^eR)xSz}fkB!>wcK}5qoYLzk1@c9b7PF)oB#oa z%?$7n-0@;K4LVWaqhO#OE>>X&Dl$9>2C+$hzqFqiy~X%rXczkdJ)@23DP<_HEhlba zrw%gQz?arUTthvK6?(oJ;HAYga=i@x*#Ivqo@DS{-^gdYSl5W2SqAuIalgC>AV$j< zBl?py^Oa4x7bW0xHB}V&u@dl^;!PvIis?V7u4p9BeFnI{59%FsR7EcBq~@Q8e!>RfQKqKr5}-Q(y?fOCyDDgYNE9yC`s$e zxse^1i=t>F-Ngv$E=++yGZ@5N#<{{IRdmVXqm>-TE%~Z2m#>PGG2IMT($cEv!X#29 zE6Ye(#|RG%rG&JUZYterokB=EMhN+-{UH7@i!yw{ZZHZ=O~DGn!KxgTf=Kkl>G;4J z9}v>cs2UYsR5c_On-+d3Dw0t#EhT$BhfwplWEHKHM8;JWo;59CC(gkSruYWu<7-p= zgekBC#(}*x*fX9Qk!l(iUL@6hP?;Jki7`|%9OUMb;R_7#q0s4v@FDQQ2tL>Vj}YW; z)lRxei8a8JG~0^Hv*9blNAar|b7W1bzAdtg7CZ4QQ8WDykH8I@!end!H!%SZU@peN zHEbku(plbJ;v|l*L8c(0;0S7lf|0UaCIuF8#qa?NoM`>B1}Gs=WKf=k!YmR?5u1-D zGA1&u%(G44Zvm|s);kPEkeuw(4n)T?BxNVZheVhn&u%BaHkLEpl zCT^bG>K;smQPNQ9h)Sp1(Xwedyi;wi_Xz_XewD6591Jpp!4NMksWs< zvnvEj5+iT%3672$V(5UV`T+qw9mi~&*mag`$LbyITY5T4&syM@Z|ioOkT=%pSA1_~ zA*dooef_lO5^2*8L=5(9{Kc{T*GqKj zO&PjHQB88`Br+f0G+;3?z~jVCOxMa-IvB8o4(I;wcSb`!W`_DlD0$@mT^jU2a*xsX z9)@y3(146mMVV_`GD=w&qL&IOO3{N?9q2r%n%t&j0UC!Z&2R-y;)81^U(~j=Er(BS z`Oe;6UmvJu6vm4CWlBBB8kf!eDiejG9dfp71|ML6hj2+o@E!(u5Tx^Fq~GafXiC;v zY*W<9sk*I=4YlPRzL%+L-|);S0rusfb=`(*V|rJgs7w17A-e|6^{ugVLPG5-__Unu z563@n8AQ1)khSS(qZBb2LV1Z)M{~azCw3v6C@&BhU!a_5kQ;{|2%=0}p*}3KMAog? z;gmix3(IJ&O8(WmkM5aJN{6aby06gd6PVx%zm~Dx3|Ue>-Jvd?nM5G(MVb+h-a_Tv zkY%P;cExDIYD;~>7v3y!VopL(fB$ARyR|Mqq51By!KtH$M$8XxJP;ep^+3&@@$=() z{aV}VZIe*1gwzDD;W}XUzliIt2U;Hw1p}5fNiFRx?&6z$a`=Z#9%XOLSmW7r?(kc-59PNBnB|b zwqmZvLzENp$jNy0djZACc-VG8aW)=dC}d6>-}1M*eS&5LN^fT#pjmc?ZVI6}b|Q2R ztbI=F^7RRHj?VbE1UiI-V}$wu=4xMoZS^`>{_ujXV=x+%vw6!m&~eiy-1|m)!&}C0 z^zzymFTJ558e;4ke7R){zFG~x^++DzJKsy*GgH6QvP;?JrK9?tt{W!Hm-w)t4x(+8 z-2I9Dy4S@2f%ywFhylPvHdA1x)puh0}vLQ`=&9*5>S zYg?Vo6`_hy?Ha*BEIh4`mL5h{mG2qUZ}sR~+voyBy6aP!rrV=GEwMqetep=E;z}=SC8O&*jVDgGo2`K(g+A)PWHTP`7c?)unw# z9EbvUvlwDmmbn2zpiW7_LR@wOKjMTKGdv43>YoOywTGbg)}Wlf=d8uor|V;E5nIJ* z$I*)ygh$+TI{r;o71^*omy6^{M|yXw@Td>f7r}Ul!A}x+fYy$}!>PXLR#cna+}eV` zAJKbL38uFU)0(1g(kJ|2l*A|CA#lPa&^)Twh(=BR_hJz{SwW6nM2|T!wR^W%FerpDeU7l;Av4E! zVazQoV(w5yx5yI{<%tb@G8b>KC*)_ThRPF`lGJ1|vSV6`%_NoHrXf6n)$GaqqV`;U z<;f1^NiKV`M0rA+t

; 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�EFdNNA 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 z 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

wt-Qd=bNPIr~nr6U>iBc_LV3QyQ+rt6$n5(PL^ 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�CTwH!%KA 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 z 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

o8P=LRRb@pHqMght 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�r`Gk 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%0A)NX!j~)IKB(@z5-NMGHH*BGnE1J%rUk$ac?JIx) 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 z%0D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%0Dhxdzm6zu-IXMY}_K9QmoLt37-1t}XF!J#-~t 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 Date: Thu, 3 Apr 2025 09:24:25 +0200 Subject: [PATCH 34/77] Add noImplicitAny --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index e49f745..24c5d39 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "useDefineForClassFields": true, "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", + "noImplicitAny": false, "skipLibCheck": true, /* Bundler mode */ From d92d75040d79b6fe5ef11799e6381d93d116b284 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Thu, 3 Apr 2025 09:24:52 +0200 Subject: [PATCH 35/77] Add themeSelector component --- src/App.tsx | 2 +- src/ExtStates/NotAuthenticated.tsx | 361 ++++++++++++++----------- src/components/DesktopSideBar.tsx | 201 ++++++++------ src/components/Theme/ThemeContext.tsx | 23 ++ src/components/Theme/ThemeSelector.tsx | 18 ++ src/main.tsx | 208 +++++++++----- 6 files changed, 492 insertions(+), 321 deletions(-) create mode 100644 src/components/Theme/ThemeContext.tsx create mode 100644 src/components/Theme/ThemeSelector.tsx diff --git a/src/App.tsx b/src/App.tsx index 6678580..d7ba416 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1596,7 +1596,7 @@ function App() { }} > - + {!isMobile && ( <> diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index 89c3406..01ee93a 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -1,11 +1,16 @@ -import React, { useCallback, useContext, useEffect, useRef, useState } from "react"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; import { Spacer } from "../common/Spacer"; -import { CustomButton, TextItalic, TextP, TextSpan } from "../App-styles"; +import { CustomButton, TextP, TextSpan } from "../App-styles"; import { Box, Button, ButtonBase, - Checkbox, Dialog, DialogActions, DialogContent, @@ -16,37 +21,33 @@ import { Switch, Typography, } from "@mui/material"; -import Logo1 from "../assets/svgs/Logo1.svg"; import Logo1Dark from "../assets/svgs/Logo1Dark.svg"; -import Info from "../assets/svgs/Info.svg"; -import HelpIcon from '@mui/icons-material/Help'; +import HelpIcon from "@mui/icons-material/Help"; import { CustomizedSnackbars } from "../components/Snackbar/Snackbar"; -import { set } from "lodash"; -import { cleanUrl, gateways, isUsingLocal } from "../background"; +import { cleanUrl, gateways } from "../background"; import { GlobalContext } from "../App"; -import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; +import Tooltip, { TooltipProps, tooltipClasses } from "@mui/material/Tooltip"; +import ThemeSelector from "../components/Theme/ThemeSelector"; const manifestData = { version: "0.5.2", }; - export const HtmlTooltip = styled(({ className, ...props }: TooltipProps) => ( ))(({ theme }) => ({ [`& .${tooltipClasses.tooltip}`]: { - backgroundColor: '#232428', - color: 'white', + backgroundColor: "#232428", + color: "white", maxWidth: 320, - padding: '20px', + padding: "20px", fontSize: theme.typography.pxToRem(12), }, })); function removeTrailingSlash(url) { - return url.replace(/\/+$/, ''); + return url.replace(/\/+$/, ""); } - export const NotAuthenticated = ({ getRootProps, getInputProps, @@ -58,8 +59,8 @@ export const NotAuthenticated = ({ handleSetGlobalApikey, currentNode, setCurrentNode, - useLocalNode, - setUseLocalNode + useLocalNode, + setUseLocalNode, }) => { const [isValidApiKey, setIsValidApiKey] = useState(null); const [hasLocalNode, setHasLocalNode] = useState(null); @@ -78,7 +79,7 @@ export const NotAuthenticated = ({ const [customApikey, setCustomApiKey] = React.useState(""); const [customNodeToSaveIndex, setCustomNodeToSaveIndex] = React.useState(null); - const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext); + const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext); const importedApiKeyRef = useRef(null); const currentNodeRef = useRef(null); @@ -92,34 +93,32 @@ export const NotAuthenticated = ({ const text = e.target.result; // Get the file content setImportedApiKey(text); // Store the file content in the state - if(customNodes){ - setCustomNodes((prev)=> { - const copyPrev = [...prev] - const findLocalIndex = copyPrev?.findIndex((item)=> item?.url === 'http://127.0.0.1:12391') - if(findLocalIndex === -1){ + if (customNodes) { + setCustomNodes((prev) => { + const copyPrev = [...prev]; + const findLocalIndex = copyPrev?.findIndex( + (item) => item?.url === "http://127.0.0.1:12391" + ); + if (findLocalIndex === -1) { copyPrev.unshift({ url: "http://127.0.0.1:12391", - apikey: text - }) + apikey: text, + }); } else { copyPrev[findLocalIndex] = { url: "http://127.0.0.1:12391", - apikey: text - } + apikey: text, + }; } - window - .sendMessage("setCustomNodes", copyPrev) - .catch((error) => { + window.sendMessage("setCustomNodes", copyPrev).catch((error) => { console.error( "Failed to set custom nodes:", error.message || "An error occurred" ); }); - return copyPrev - }) - + return copyPrev; + }); } - }; reader.readAsText(file); // Read the file as text } @@ -137,14 +136,12 @@ export const NotAuthenticated = ({ const data = await response.json(); if (data?.height) { setHasLocalNode(true); - return true + return true; } - return false - + return false; } catch (error) { - return false - - } + return false; + } }, []); useEffect(() => { @@ -155,18 +152,20 @@ export const NotAuthenticated = ({ window .sendMessage("getCustomNodesFromStorage") .then((response) => { - - setCustomNodes(response || []); - if(window?.electronAPI?.setAllowedDomains){ - window.electronAPI.setAllowedDomains(response?.map((node)=> node.url)) + setCustomNodes(response || []); + if (window?.electronAPI?.setAllowedDomains) { + window.electronAPI.setAllowedDomains( + response?.map((node) => node.url) + ); + } + if (Array.isArray(response)) { + const findLocal = response?.find( + (item) => item?.url === "http://127.0.0.1:12391" + ); + if (findLocal && findLocal?.apikey) { + setImportedApiKey(findLocal?.apikey); } - if(Array.isArray(response)){ - const findLocal = response?.find((item)=> item?.url === 'http://127.0.0.1:12391') - if(findLocal && findLocal?.apikey){ - setImportedApiKey(findLocal?.apikey) - } - } - + } }) .catch((error) => { console.error( @@ -187,48 +186,50 @@ export const NotAuthenticated = ({ hasLocalNodeRef.current = hasLocalNode; }, [hasLocalNode]); - - const validateApiKey = useCallback(async (key, fromStartUp) => { try { - if(key === "isGateway") return + if (key === "isGateway") return; const isLocalKey = cleanUrl(key?.url) === "127.0.0.1:12391"; - if (fromStartUp && key?.url && key?.apikey && !isLocalKey && !gateways.some(gateway => key?.url?.includes(gateway))) { + if ( + fromStartUp && + key?.url && + key?.apikey && + !isLocalKey && + !gateways.some((gateway) => key?.url?.includes(gateway)) + ) { setCurrentNode({ url: key?.url, apikey: key?.apikey, }); - let isValid = false + let isValid = false; - const url = `${key?.url}/admin/settings/localAuthBypassEnabled`; const response = await fetch(url); // Assuming the response is in plain text and will be 'true' or 'false' const data = await response.text(); - if(data && data === 'true'){ - isValid = true + if (data && data === "true") { + isValid = true; } else { const url2 = `${key?.url}/admin/apikey/test?apiKey=${key?.apikey}`; const response2 = await fetch(url2); - + // Assuming the response is in plain text and will be 'true' or 'false' const data2 = await response2.text(); if (data2 === "true") { - isValid = true + isValid = true; } } - + if (isValid) { setIsValidApiKey(true); setUseLocalNode(true); - return + return; } - } if (!currentNodeRef.current) return; - const stillHasLocal = await checkIfUserHasLocalNode() + const stillHasLocal = await checkIfUserHasLocalNode(); if (isLocalKey && !stillHasLocal && !fromStartUp) { throw new Error("Please turn on your local node"); @@ -252,27 +253,25 @@ export const NotAuthenticated = ({ } else if (currentNodeRef.current) { payload = currentNodeRef.current; } - let isValid = false + let isValid = false; - const url = `${payload?.url}/admin/settings/localAuthBypassEnabled`; const response = await fetch(url); // Assuming the response is in plain text and will be 'true' or 'false' const data = await response.text(); - if(data && data === 'true'){ - isValid = true + if (data && data === "true") { + isValid = true; } else { const url2 = `${payload?.url}/admin/apikey/test?apiKey=${payload?.apikey}`; const response2 = await fetch(url2); - + // Assuming the response is in plain text and will be 'true' or 'false' const data2 = await response2.text(); if (data2 === "true") { - isValid = true + isValid = true; } } - if (isValid) { window @@ -296,14 +295,13 @@ export const NotAuthenticated = ({ } else { setIsValidApiKey(false); setUseLocalNode(false); - if(!fromStartUp){ + if (!fromStartUp) { setInfoSnack({ type: "error", message: "Select a valid apikey", }); setOpenSnack(true); } - } } catch (error) { setIsValidApiKey(false); @@ -326,15 +324,15 @@ export const NotAuthenticated = ({ error.message || "An error occurred" ); }); - return + return; + } + if (!fromStartUp) { + setInfoSnack({ + type: "error", + message: error?.message || "Select a valid apikey", + }); + setOpenSnack(true); } - if(!fromStartUp){ - setInfoSnack({ - type: "error", - message: error?.message || "Select a valid apikey", - }); - setOpenSnack(true); - } console.error("Error validating API key:", error); } }, []); @@ -363,7 +361,7 @@ export const NotAuthenticated = ({ } setCustomNodes(nodes); - + setCustomNodeToSaveIndex(null); if (!nodes) return; window @@ -373,9 +371,11 @@ export const NotAuthenticated = ({ setMode("list"); setUrl("https://"); setCustomApiKey(""); - if(window?.electronAPI?.setAllowedDomains){ - window.electronAPI.setAllowedDomains(nodes?.map((node) => node.url)) - } + if (window?.electronAPI?.setAllowedDomains) { + window.electronAPI.setAllowedDomains( + nodes?.map((node) => node.url) + ); + } // add alert if needed } }) @@ -404,15 +404,20 @@ export const NotAuthenticated = ({ sx={{ textAlign: "center", lineHeight: 1.2, - fontSize: '18px' + fontSize: "18px", }} > - WELCOME TO - QORTAL + WELCOME TO + + {" "} + QORTAL + - + - - Your wallet is like your digital ID on Qortal, and is how you will login to the Qortal User Interface. It holds your public address and the Qortal name you will eventually choose. Every transaction you make is linked to your ID, and this is where you manage all your QORT and other tradeable cryptocurrencies on Qortal. - - } - > - setExtstate('wallets')}> - {/* */} - Accounts - + + + Your wallet is like your digital ID on Qortal, and is how you + will login to the Qortal User Interface. It holds your public + address and the Qortal name you will eventually choose. Every + transaction you make is linked to your ID, and this is where you + manage all your QORT and other tradeable cryptocurrencies on + Qortal. + + + } + > + setExtstate("wallets")}> + {/* */} + Accounts + {/* @@ -448,42 +463,55 @@ export const NotAuthenticated = ({ display: "flex", gap: "10px", alignItems: "center", - }} > - New users start here! - - Creating an account means creating a new wallet and digital ID to start using Qortal. Once you have made your account, you can start doing things like obtaining some QORT, buying a name and avatar, publishing videos and blogs, and much more. - - } - > - { - setExtstate("create-wallet"); - }} - sx={{ - backgroundColor: hasSeenGettingStarted === false && 'var(--green)', - color: hasSeenGettingStarted === false && 'black', - "&:hover": { - backgroundColor: hasSeenGettingStarted === false && 'var(--green)', - color: hasSeenGettingStarted === false && 'black' - } - }} + disableHoverListener={hasSeenGettingStarted === true} + placement="right" + title={ + + + New users start here! + + + + Creating an account means creating a new wallet and digital ID + to start using Qortal. Once you have made your account, you can + start doing things like obtaining some QORT, buying a name and + avatar, publishing videos and blogs, and much more. + + + } > - Create account - + { + setExtstate("create-wallet"); + }} + sx={{ + backgroundColor: + hasSeenGettingStarted === false && "var(--green)", + color: hasSeenGettingStarted === false && "black", + "&:hover": { + backgroundColor: + hasSeenGettingStarted === false && "var(--green)", + color: hasSeenGettingStarted === false && "black", + }, + }} + > + Create account + - @@ -503,15 +531,19 @@ export const NotAuthenticated = ({ gap: "10px", alignItems: "center", flexDirection: "column", - outline: '0.5px solid rgba(255, 255, 255, 0.5)', - padding: '20px 30px', - borderRadius: '5px', + outline: "0.5px solid rgba(255, 255, 255, 0.5)", + padding: "20px 30px", + borderRadius: "5px", }} > <> - For advanced users + + For advanced users + )} - { - showTutorial('create-account', true) - }} sx={{ - position: 'fixed', - bottom: '25px', - right: '25px' - }}> - - + + + + { + showTutorial("create-account", true); + }} + sx={{ + position: "fixed", + bottom: "25px", + right: "25px", + }} + > + + ); }; diff --git a/src/components/DesktopSideBar.tsx b/src/components/DesktopSideBar.tsx index 76f2f2e..244370e 100644 --- a/src/components/DesktopSideBar.tsx +++ b/src/components/DesktopSideBar.tsx @@ -1,86 +1,110 @@ -import { Box, ButtonBase } from '@mui/material'; -import React from 'react' +import { Box, ButtonBase } from "@mui/material"; +import React from "react"; import { HomeIcon } from "../assets/Icons/HomeIcon"; import { MessagingIcon } from "../assets/Icons/MessagingIcon"; import { Save } from "./Save/Save"; import { HubsIcon } from "../assets/Icons/HubsIcon"; import { CoreSyncStatus } from "./CoreSyncStatus"; -import { IconWrapper } from './Desktop/DesktopFooter'; +import { IconWrapper } from "./Desktop/DesktopFooter"; import AppIcon from "./../assets/svgs/AppIcon.svg"; -import { useRecoilState } from 'recoil'; -import { enabledDevModeAtom } from '../atoms/global'; -import { AppsIcon } from '../assets/Icons/AppsIcon'; +import { useRecoilState } from "recoil"; +import { enabledDevModeAtom } from "../atoms/global"; +import { AppsIcon } from "../assets/Icons/AppsIcon"; +import ThemeSelector from "./Theme/ThemeSelector"; -export const DesktopSideBar = ({goToHome, setDesktopSideView, toggleSideViewDirects, hasUnreadDirects, isDirects, toggleSideViewGroups,hasUnreadGroups, isGroups, isApps, setDesktopViewMode, desktopViewMode, myName }) => { - const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom) +export const DesktopSideBar = ({ + goToHome, + setDesktopSideView, + toggleSideViewDirects, + hasUnreadDirects, + isDirects, + toggleSideViewGroups, + hasUnreadGroups, + isGroups, + isApps, + setDesktopViewMode, + desktopViewMode, + myName, +}) => { + const [isEnabledDevMode, setIsEnabledDevMode] = + useRecoilState(enabledDevModeAtom); return ( - - { - goToHome(); - - }} - > - - - - - { - setDesktopViewMode('apps') - // setIsOpenSideViewDirects(false) - // setIsOpenSideViewGroups(false) - }} - > - - - - - { - setDesktopViewMode('chat') - }} - > + + { + goToHome(); + }} + > + + + { + setDesktopViewMode("apps"); + // setIsOpenSideViewDirects(false) + // setIsOpenSideViewGroups(false) + }} + > - - - - {/* + + + + { + setDesktopViewMode("chat"); + }} + > + + + + + {/* { setDesktopSideView("groups"); toggleSideViewGroups() @@ -98,23 +122,32 @@ export const DesktopSideBar = ({goToHome, setDesktopSideView, toggleSideViewDire /> */} - - {/* */} - {isEnabledDevMode && ( - + {/* */} + {isEnabledDevMode && ( + { - setDesktopViewMode('dev') + setDesktopViewMode("dev"); }} > - + - )} - - ) -} + )} + + + + ); +}; diff --git a/src/components/Theme/ThemeContext.tsx b/src/components/Theme/ThemeContext.tsx new file mode 100644 index 0000000..249b718 --- /dev/null +++ b/src/components/Theme/ThemeContext.tsx @@ -0,0 +1,23 @@ +import { createContext, useContext, useState, useMemo } from 'react'; +import { ThemeProvider as MuiThemeProvider } from '@mui/material/styles'; +import { darkTheme, lightTheme } from '../../styles/theme'; + +const ThemeContext = createContext({ themeMode: 'light', toggleTheme: () => {} }); + +export const ThemeProvider = ({ children }: { children: React.ReactNode }) => { + const [themeMode, setThemeMode] = useState('light'); + + const theme = useMemo(() => (themeMode === 'light' ? lightTheme : darkTheme), [themeMode]); + + const toggleTheme = () => { + setThemeMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light')); + }; + + return ( + + {children} + + ); +}; + +export const useThemeContext = () => useContext(ThemeContext); \ No newline at end of file diff --git a/src/components/Theme/ThemeSelector.tsx b/src/components/Theme/ThemeSelector.tsx new file mode 100644 index 0000000..b9307f3 --- /dev/null +++ b/src/components/Theme/ThemeSelector.tsx @@ -0,0 +1,18 @@ +import { useThemeContext } from "./ThemeContext"; +import { Switch } from "@mui/material"; +import { Brightness4, Brightness7 } from "@mui/icons-material"; + +const ThemeSelector = ({ style }) => { + const { themeMode, toggleTheme } = useThemeContext(); + + return ( +

+ ); +}; + +export default ThemeSelector; diff --git a/src/main.tsx b/src/main.tsx index 22bba47..cddf0dd 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,81 +1,139 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.css' -import "./messaging/messagesToBackground"; -import { ThemeProvider, createTheme } from '@mui/material/styles'; -import { CssBaseline } from '@mui/material'; -import { MessageQueueProvider } from './MessageQueueContext.tsx'; -import { RecoilRoot } from 'recoil'; -const theme = createTheme({ - palette: { - primary: { - main: '#232428', // Primary color (e.g., used for buttons, headers, etc.) - }, - secondary: { - main: '#232428', // Secondary color - }, - background: { - default: '#27282c', // Default background color - paper: '#1d1d1d', // Paper component background (for dropdowns, dialogs, etc.) - }, - text: { - primary: '#ffffff', // White as the primary text color - secondary: '#b0b0b0', // Light gray for secondary text - disabled: '#808080', // Gray for disabled text - }, - action: { - // disabledBackground: 'set color of background here', - disabled: 'rgb(255 255 255 / 70%)' - } - }, - typography: { - fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', // Font family - h1: { - color: '#ffffff', // White color for h1 elements - }, - h2: { - color: '#ffffff', // White color for h2 elements - }, - body1: { - color: '#ffffff', // Default body text color - }, - body2: { - color: '#b0b0b0', // Lighter text for body2, often used for secondary text - }, - }, - components: { - MuiOutlinedInput: { - styleOverrides: { - root: { - ".MuiOutlinedInput-notchedOutline": { - borderColor: "white", // ⚪ Default outline color - }, - }, - }, - }, - MuiSelect: { - styleOverrides: { - icon: { - color: "white", // ✅ Caret (dropdown arrow) color - }, - }, - }, - }, -}); +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; +import "./messaging/messagesToBackground"; +import { CssBaseline } from "@mui/material"; +import { MessageQueueProvider } from "./MessageQueueContext.tsx"; +import { RecoilRoot } from "recoil"; +import { ThemeProvider } from "./components/Theme/ThemeContext.tsx"; -export default theme; +// const darkTheme: ThemeOptions = { +// palette: { +// primary: { +// main: "#232428", // Primary color (e.g., used for buttons, headers, etc.) +// }, +// secondary: { +// main: "#232428", // Secondary color +// }, +// background: { +// default: "#27282c", // Default background color +// paper: "#1d1d1d", // Paper component background (for dropdowns, dialogs, etc.) +// }, +// text: { +// primary: "#ffffff", // White as the primary text color +// secondary: "#b0b0b0", // Light gray for secondary text +// disabled: "#808080", // Gray for disabled text +// }, +// action: { +// // disabledBackground: 'set color of background here', +// disabled: "rgb(255 255 255 / 70%)", +// }, +// }, +// typography: { +// fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', // Font family +// h1: { +// color: "#ffffff", // White color for h1 elements +// }, +// h2: { +// color: "#ffffff", // White color for h2 elements +// }, +// body1: { +// color: "#ffffff", // Default body text color +// }, +// body2: { +// color: "#b0b0b0", // Lighter text for body2, often used for secondary text +// }, +// }, +// components: { +// MuiOutlinedInput: { +// styleOverrides: { +// root: { +// ".MuiOutlinedInput-notchedOutline": { +// borderColor: "white", // ⚪ Default outline color +// }, +// }, +// }, +// }, +// MuiSelect: { +// styleOverrides: { +// icon: { +// color: "white", // ✅ Caret (dropdown arrow) color +// }, +// }, +// }, +// }, +// } +// const lightTheme: ThemeOptions = { +// palette: { +// primary: { +// main: "#1976d2", // Primary color for buttons, headers, etc. +// }, +// secondary: { +// main: "#ff4081", // Secondary color with a vibrant pink touch +// }, +// background: { +// default: "#f5f5f5", // Light background color for the main UI +// paper: "#ffffff", // Background color for Paper components (dialogs, dropdowns, etc.) +// }, +// text: { +// primary: "#212121", // Dark text for contrast and readability +// secondary: "#616161", // Medium gray for secondary text +// disabled: "#9e9e9e", // Light gray for disabled text +// }, +// action: { +// disabled: "rgb(0 0 0 / 50%)", // Color for disabled actions +// }, +// }, +// typography: { +// fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', // Font family for consistency +// h1: { +// color: "#ffffff", // Dark color for main headings (h1) +// }, +// h2: { +// color: "#ffffff", // Dark color for subheadings (h2) +// }, +// body1: { +// color: "#ffffff", // Default body text color +// }, +// body2: { +// color: "#ffffff", // Lighter text for secondary content +// }, +// }, +// components: { +// MuiOutlinedInput: { +// styleOverrides: { +// root: { +// ".MuiOutlinedInput-notchedOutline": { +// borderColor: "#ffffff", // Darker outline for better input field visibility +// }, +// }, +// }, +// }, +// MuiSelect: { +// styleOverrides: { +// icon: { +// color: "#212121", // Dark dropdown arrow icon for contrast +// }, +// }, +// }, +// }, +// }; -ReactDOM.createRoot(document.getElementById('root')!).render( +// const theme = createTheme(lightTheme); + +// export default theme; + +ReactDOM.createRoot(document.getElementById("root")!).render( <> - + - - - - - + + + + + - , -) + +); From ff927e017b1989eec06d327836c47b1d86792919 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Fri, 4 Apr 2025 09:08:53 +0200 Subject: [PATCH 36/77] Remove unused import, add themeSelector --- src/App.tsx | 5 +- src/components/Apps/AppsHomeDesktop.tsx | 168 ++++++++++++------------ src/components/Theme/ThemeContext.tsx | 15 ++- src/components/Theme/ThemeSelector.tsx | 13 +- 4 files changed, 114 insertions(+), 87 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index d7ba416..3116fef 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1667,7 +1667,9 @@ function App() { /> + + { setIsOpenDrawerLookup(true); @@ -1699,7 +1701,9 @@ function App() { /> + + { executeEvent('openWalletsApp', {}) @@ -1732,7 +1736,6 @@ function App() { - {desktopViewMode !== 'home' && ( <> diff --git a/src/components/Apps/AppsHomeDesktop.tsx b/src/components/Apps/AppsHomeDesktop.tsx index 32f5abe..8be0afc 100644 --- a/src/components/Apps/AppsHomeDesktop.tsx +++ b/src/components/Apps/AppsHomeDesktop.tsx @@ -1,120 +1,122 @@ -import React, { useMemo, useState } from "react"; +import React, { useState } from "react"; import { AppCircle, AppCircleContainer, AppCircleLabel, AppLibrarySubTitle, AppsContainer, - AppsParent, } from "./Apps-styles"; -import { Avatar, Box, ButtonBase, Input } from "@mui/material"; +import { Box, ButtonBase, Input } from "@mui/material"; import { Add } from "@mui/icons-material"; -import { getBaseApiReact, isMobile } from "../../App"; -import LogoSelected from "../../assets/svgs/LogoSelected.svg"; +import { isMobile } from "../../App"; import { executeEvent } from "../../utils/events"; import { Spacer } from "../../common/Spacer"; import { SortablePinnedApps } from "./SortablePinnedApps"; import { extractComponents } from "../Chat/MessageDisplay"; -import ArrowOutwardIcon from '@mui/icons-material/ArrowOutward'; +import ArrowOutwardIcon from "@mui/icons-material/ArrowOutward"; import { AppsPrivate } from "./AppsPrivate"; +import ThemeSelector from "../Theme/ThemeSelector"; export const AppsHomeDesktop = ({ setMode, myApp, myWebsite, availableQapps, - myName + myName, }) => { - const [qortalUrl, setQortalUrl] = useState('') + const [qortalUrl, setQortalUrl] = useState(""); - const openQortalUrl = ()=> { + const openQortalUrl = () => { try { - if(!qortalUrl) return + if (!qortalUrl) return; const res = extractComponents(qortalUrl); if (res) { const { service, name, identifier, path } = res; executeEvent("addTab", { data: { service, name, identifier, path } }); - executeEvent("open-apps-mode", { }); - setQortalUrl('qortal://') + executeEvent("open-apps-mode", {}); + setQortalUrl("qortal://"); } - } catch (error) { - - } - } + } catch (error) {} + }; return ( <> - - - Apps Dashboard - - - - - { - setQortalUrl(e.target.value) - }} - disableUnderline - autoComplete='off' - autoCorrect='off' - placeholder="qortal://" + + Apps Dashboard + + + + + + + + { + setQortalUrl(e.target.value); + }} + disableUnderline + autoComplete="off" + autoCorrect="off" + placeholder="qortal://" + sx={{ + width: "100%", + color: "white", + "& .MuiInput-input::placeholder": { + color: "rgba(84, 84, 84, 0.70) !important", + fontSize: "20px", + fontStyle: "normal", + fontWeight: 400, + lineHeight: "120%", // 24px + letterSpacing: "0.15px", + opacity: 1, + }, + "&:focus": { + outline: "none", + }, + // Add any additional styles for the input here + }} + onKeyDown={(e) => { + if (e.key === "Enter" && qortalUrl) { + openQortalUrl(); + } + }} + /> + openQortalUrl()}> + { - if (e.key === 'Enter' && qortalUrl) { - openQortalUrl(); - } + color: qortalUrl ? "white" : "rgba(84, 84, 84, 0.70)", }} /> - openQortalUrl()}> - - - - + + + + + Library - + + + + + ); }; diff --git a/src/components/Theme/ThemeContext.tsx b/src/components/Theme/ThemeContext.tsx index 249b718..e21ab9f 100644 --- a/src/components/Theme/ThemeContext.tsx +++ b/src/components/Theme/ThemeContext.tsx @@ -1,6 +1,17 @@ import { createContext, useContext, useState, useMemo } from 'react'; -import { ThemeProvider as MuiThemeProvider } from '@mui/material/styles'; -import { darkTheme, lightTheme } from '../../styles/theme'; +import { createTheme, ThemeProvider as MuiThemeProvider } from '@mui/material/styles'; + +const darkTheme = createTheme({ + palette: { + mode: 'dark', + }, +}); + +const lightTheme = createTheme({ + palette: { + mode: 'light', + }, +}); const ThemeContext = createContext({ themeMode: 'light', toggleTheme: () => {} }); diff --git a/src/components/Theme/ThemeSelector.tsx b/src/components/Theme/ThemeSelector.tsx index b9307f3..b4ec35a 100644 --- a/src/components/Theme/ThemeSelector.tsx +++ b/src/components/Theme/ThemeSelector.tsx @@ -1,15 +1,22 @@ import { useThemeContext } from "./ThemeContext"; import { Switch } from "@mui/material"; -import { Brightness4, Brightness7 } from "@mui/icons-material"; +import LightModeIcon from '@mui/icons-material/LightMode'; +import NightlightIcon from '@mui/icons-material/Nightlight'; const ThemeSelector = ({ style }) => { const { themeMode, toggleTheme } = useThemeContext(); return (
- {themeMode === "dark" ? : } + {themeMode === "dark" ? : }
); From 2b4629ee51737158392ca1be6253c5012ef34b29 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Fri, 4 Apr 2025 14:04:32 +0200 Subject: [PATCH 37/77] Invert icons --- src/components/Theme/ThemeSelector.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Theme/ThemeSelector.tsx b/src/components/Theme/ThemeSelector.tsx index b4ec35a..6324b01 100644 --- a/src/components/Theme/ThemeSelector.tsx +++ b/src/components/Theme/ThemeSelector.tsx @@ -16,8 +16,8 @@ const ThemeSelector = ({ style }) => { ...style, }} > - {themeMode === "dark" ? : } - + {themeMode === "light" ? : } + ); }; From ee2548b84e462d8521666619ba556e318d341b8b Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Fri, 4 Apr 2025 14:08:31 +0200 Subject: [PATCH 38/77] Remove conflicting property defaultChecked --- src/ExtStates/NotAuthenticated.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index 01ee93a..cf734e4 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -596,7 +596,6 @@ export const NotAuthenticated = ({ } }} disabled={false} - defaultChecked /> } label={`Use ${isLocal ? "Local" : "Custom"} Node`} From 5ebf2ad3090059bfe44bd9a5affde17764003e07 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Fri, 4 Apr 2025 14:23:08 +0200 Subject: [PATCH 39/77] Switch with embedded icons --- src/components/Theme/ThemeSelector.tsx | 64 +++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/src/components/Theme/ThemeSelector.tsx b/src/components/Theme/ThemeSelector.tsx index 6324b01..3e18f49 100644 --- a/src/components/Theme/ThemeSelector.tsx +++ b/src/components/Theme/ThemeSelector.tsx @@ -1,11 +1,64 @@ import { useThemeContext } from "./ThemeContext"; -import { Switch } from "@mui/material"; -import LightModeIcon from '@mui/icons-material/LightMode'; -import NightlightIcon from '@mui/icons-material/Nightlight'; +import { styled, Switch } from "@mui/material"; + +const ThemeSwitch = styled(Switch)(({ theme }) => ({ + width: 62, + height: 34, + padding: 7, + "& .MuiSwitch-switchBase": { + margin: 1, + padding: 0, + transform: "translateX(6px)", + "&.Mui-checked": { + color: "#fff", + transform: "translateX(22px)", + "& .MuiSwitch-thumb:before": { + backgroundImage: `url('data:image/svg+xml;utf8,')`, + }, + "& + .MuiSwitch-track": { + opacity: 1, + backgroundColor: "#aab4be", + ...theme.applyStyles("dark", { + backgroundColor: "#8796A5", + }), + }, + }, + }, + "& .MuiSwitch-thumb": { + backgroundColor: "#001e3c", + width: 32, + height: 32, + "&::before": { + content: "''", + position: "absolute", + width: "100%", + height: "100%", + left: 0, + top: 0, + backgroundRepeat: "no-repeat", + backgroundPosition: "center", + backgroundImage: `url('data:image/svg+xml;utf8,')`, + }, + ...theme.applyStyles("dark", { + backgroundColor: "#003892", + }), + }, + "& .MuiSwitch-track": { + opacity: 1, + backgroundColor: "#aab4be", + borderRadius: 20 / 2, + ...theme.applyStyles("dark", { + backgroundColor: "#8796A5", + }), + }, +})); const ThemeSelector = ({ style }) => { const { themeMode, toggleTheme } = useThemeContext(); - return (
{ ...style, }} > - {themeMode === "light" ? : } - +
); }; From 661e181639cb758256651c39ee4a6e8273c8a727 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Fri, 4 Apr 2025 22:37:50 +0200 Subject: [PATCH 40/77] Format code --- index.html | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index 43b8b56..74f19fd 100644 --- a/index.html +++ b/index.html @@ -1,12 +1,9 @@ - + - - + - - Qortal Hub From 56b793cd1ec766e5da93312e32c499f235c6e3a9 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 17:58:42 +0200 Subject: [PATCH 41/77] Remove empty CSS --- src/App.css | 0 src/App.tsx | 1 - 2 files changed, 1 deletion(-) delete mode 100644 src/App.css diff --git a/src/App.css b/src/App.css deleted file mode 100644 index e69de29..0000000 diff --git a/src/App.tsx b/src/App.tsx index 3116fef..74e0b43 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,7 +6,6 @@ import { useRef, useState, } from "react"; -import "./App.css"; import { useDropzone } from "react-dropzone"; import { Box, From 80791358c5800cb199e4ee77bcee63cea1c52a92 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 17:59:14 +0200 Subject: [PATCH 42/77] Format css files --- src/common/Spinners/BarSpinner/barSpinner.css | 40 +++--- src/common/customloader.css | 6 +- src/components/CoreSyncStatus.css | 108 ++++++++-------- src/components/Group/Forum/texteditor.css | 117 +++++++++--------- src/components/ReactionPicker.css | 47 ++++--- src/index.css | 44 +++---- 6 files changed, 178 insertions(+), 184 deletions(-) diff --git a/src/common/Spinners/BarSpinner/barSpinner.css b/src/common/Spinners/BarSpinner/barSpinner.css index 529bc50..916b5f5 100644 --- a/src/common/Spinners/BarSpinner/barSpinner.css +++ b/src/common/Spinners/BarSpinner/barSpinner.css @@ -1,19 +1,27 @@ /* HTML:
*/ .loader-bar { - width: 45px; - aspect-ratio: .75; - --c:no-repeat linear-gradient(currentColor 0 0); - background: - var(--c) 0% 100%, - var(--c) 50% 100%, - var(--c) 100% 100%; - background-size: 20% 65%; - animation: l8 1s infinite linear; + width: 45px; + aspect-ratio: 0.75; + --c: no-repeat linear-gradient(currentColor 0 0); + background: var(--c) 0% 100%, var(--c) 50% 100%, var(--c) 100% 100%; + background-size: 20% 65%; + animation: l8 1s infinite linear; +} + +@keyframes l8 { + 16.67% { + background-position: 0% 0%, 50% 100%, 100% 100%; } - @keyframes l8 { - 16.67% {background-position: 0% 0% ,50% 100%,100% 100%} - 33.33% {background-position: 0% 0% ,50% 0% ,100% 100%} - 50% {background-position: 0% 0% ,50% 0% ,100% 0% } - 66.67% {background-position: 0% 100%,50% 0% ,100% 0% } - 83.33% {background-position: 0% 100%,50% 100%,100% 0% } - } \ No newline at end of file + 33.33% { + background-position: 0% 0%, 50% 0%, 100% 100%; + } + 50% { + background-position: 0% 0%, 50% 0%, 100% 0%; + } + 66.67% { + background-position: 0% 100%, 50% 0%, 100% 0%; + } + 83.33% { + background-position: 0% 100%, 50% 100%, 100% 0%; + } +} diff --git a/src/common/customloader.css b/src/common/customloader.css index ff3dfbc..b77864d 100644 --- a/src/common/customloader.css +++ b/src/common/customloader.css @@ -1,7 +1,6 @@ - .lds-ellipsis { - color: white - } + color: white; +} .lds-ellipsis, .lds-ellipsis div { box-sizing: border-box; @@ -61,4 +60,3 @@ transform: translate(24px, 0); } } - diff --git a/src/components/CoreSyncStatus.css b/src/components/CoreSyncStatus.css index 87bf9d7..6624845 100644 --- a/src/components/CoreSyncStatus.css +++ b/src/components/CoreSyncStatus.css @@ -1,59 +1,59 @@ - .lineHeight { - line-height: 33%; - } +.lineHeight { + line-height: 33%; +} - .tooltip { - display: inline-block; - position: relative; - text-align: left; - } +.tooltip { + display: inline-block; + position: relative; + text-align: left; +} - .tooltip .bottom { - min-width: 225px; - max-width: 250px; - top: 35px; - right: 0px; - /* transform: translate(-50%, 0); */ - padding: 10px 10px; - color: var(--black); - background-color: var(--bg-2); - font-weight: normal; - font-size: 13px; - border-radius: 8px; - position: absolute; - z-index: 99999999; - box-sizing: border-box; - box-shadow: 0 1px 8px rgba(0, 0, 0, 0.5); - border: 1px solid var(--black); - visibility: hidden; - opacity: 0; - transition: opacity 0.2s; - } +.tooltip .bottom { + min-width: 225px; + max-width: 250px; + top: 35px; + right: 0px; + /* transform: translate(-50%, 0); */ + padding: 10px 10px; + color: var(--black); + background-color: var(--bg-2); + font-weight: normal; + font-size: 13px; + border-radius: 8px; + position: absolute; + z-index: 99999999; + box-sizing: border-box; + box-shadow: 0 1px 8px rgba(0, 0, 0, 0.5); + border: 1px solid var(--black); + visibility: hidden; + opacity: 0; + transition: opacity 0.2s; +} - .tooltip:hover .bottom { - visibility: visible; - opacity: 1; - z-index: 100; - } +.tooltip:hover .bottom { + visibility: visible; + opacity: 1; + z-index: 100; +} - .tooltip .bottom i { - position: absolute; - bottom: 100%; - left: 50%; - margin-left: -12px; - width: 24px; - height: 12px; - overflow: hidden; - } +.tooltip .bottom i { + position: absolute; + bottom: 100%; + left: 50%; + margin-left: -12px; + width: 24px; + height: 12px; + overflow: hidden; +} - .tooltip .bottom i::after { - content: ''; - position: absolute; - width: 12px; - height: 12px; - left: 50%; - transform: translate(-50%, 50%) rotate(45deg); - background-color: var(--white); - border: 1px solid var(--black); - box-shadow: 0 1px 8px rgba(0, 0, 0, 0.5); - } \ No newline at end of file +.tooltip .bottom i::after { + content: ""; + position: absolute; + width: 12px; + height: 12px; + left: 50%; + transform: translate(-50%, 50%) rotate(45deg); + background-color: var(--white); + border: 1px solid var(--black); + box-shadow: 0 1px 8px rgba(0, 0, 0, 0.5); +} diff --git a/src/components/Group/Forum/texteditor.css b/src/components/Group/Forum/texteditor.css index e3bbd50..ac6d2ed 100644 --- a/src/components/Group/Forum/texteditor.css +++ b/src/components/Group/Forum/texteditor.css @@ -1,71 +1,70 @@ .ql-editor { - min-height: 200px; - width: 100%; - color: black; - font-size: 16px; - font-family: Roboto; - max-height: 225px; - overflow-y: scroll; - padding: 0px !important; - } + min-height: 200px; + width: 100%; + color: black; + font-size: 16px; + font-family: Roboto; + max-height: 225px; + overflow-y: scroll; + padding: 0px !important; +} - .ql-editor::-webkit-scrollbar-track { - background-color: transparent; - cursor: default; - } - .ql-editor::-webkit-scrollbar-track:hover { - background-color: transparent; - } - - .ql-editor::-webkit-scrollbar { - width: 16px; - height: 10px; - background-color: rgba(229, 229, 229, 0.70); - } - - .ql-editor::-webkit-scrollbar-thumb { - background-color: #B0B0B0; - border-radius: 8px; - background-clip: content-box; - border: 4px solid transparent; - } - - - .ql-editor img { - cursor: default; - } - - .ql-editor-display { - min-height: 20px; - width: 100%; - color: black; - font-size: 16px; - font-family: Roboto; - padding: 0px !important; - } - - .ql-editor-display img { - cursor: default; - } - - .ql-container { - font-size: 16px - } +.ql-editor::-webkit-scrollbar-track { + background-color: transparent; + cursor: default; +} +.ql-editor::-webkit-scrollbar-track:hover { + background-color: transparent; +} - .ql-toolbar .ql-stroke { - fill: none !important; - stroke: black !important; +.ql-editor::-webkit-scrollbar { + width: 16px; + height: 10px; + background-color: rgba(229, 229, 229, 0.7); +} + +.ql-editor::-webkit-scrollbar-thumb { + background-color: #b0b0b0; + border-radius: 8px; + background-clip: content-box; + border: 4px solid transparent; +} + +.ql-editor img { + cursor: default; +} + +.ql-editor-display { + min-height: 20px; + width: 100%; + color: black; + font-size: 16px; + font-family: Roboto; + padding: 0px !important; +} + +.ql-editor-display img { + cursor: default; +} + +.ql-container { + font-size: 16px; +} + +.ql-toolbar .ql-stroke { + fill: none !important; + stroke: black !important; } .ql-toolbar .ql-fill { - fill: black !important; - stroke: none !important; + fill: black !important; + stroke: none !important; } .ql-toolbar .ql-picker { - color: black !important; + color: black !important; } .ql-toolbar .ql-picker-options { - background-color: white !important; -} \ No newline at end of file + background-color: white !important; +} diff --git a/src/components/ReactionPicker.css b/src/components/ReactionPicker.css index 89dbe39..6d0a354 100644 --- a/src/components/ReactionPicker.css +++ b/src/components/ReactionPicker.css @@ -1,27 +1,26 @@ .reaction-container { - position: relative; /* Parent must be positioned relatively */ - } - - .emoji-picker { - position: absolute; /* Picker positioned absolutely relative to the parent */ - right: 0; - z-index: 9000000000; /* Ensure picker appears above other content */ - } - - .message-container { - overflow: visible; /* Ensure the message container doesn't cut off the picker */ - } - + position: relative; /* Parent must be positioned relatively */ +} - .reaction-container { - position: relative; - } - - .emoji-picker { - overflow: hidden; - width: auto - } +.emoji-picker { + position: absolute; /* Picker positioned absolutely relative to the parent */ + right: 0; + z-index: 9000000000; /* Ensure picker appears above other content */ +} - .EmojiPickerReact.epr-dark-theme { - --epr-emoji-size: 18px; /* Adjust emoji size for dark mode */ - } \ No newline at end of file +.message-container { + overflow: visible; /* Ensure the message container doesn't cut off the picker */ +} + +.reaction-container { + position: relative; +} + +.emoji-picker { + overflow: hidden; + width: auto; +} + +.EmojiPickerReact.epr-dark-theme { + --epr-emoji-size: 18px; /* Adjust emoji size for dark mode */ +} diff --git a/src/index.css b/src/index.css index 867382c..6b24232 100644 --- a/src/index.css +++ b/src/index.css @@ -1,43 +1,40 @@ @font-face { - font-family: 'Inter'; - src: url('./styles/fonts/Inter-SemiBold.ttf') format('truetype'); + font-family: "Inter"; + src: url("./styles/fonts/Inter-SemiBold.ttf") format("truetype"); font-weight: 600; } - @font-face { - font-family: 'Inter'; - src: url('./styles/fonts/Inter-ExtraBold.ttf') format('truetype'); + font-family: "Inter"; + src: url("./styles/fonts/Inter-ExtraBold.ttf") format("truetype"); font-weight: 800; } @font-face { - font-family: 'Inter'; - src: url('./styles/fonts/Inter-Bold.ttf') format('truetype'); + font-family: "Inter"; + src: url("./styles/fonts/Inter-Bold.ttf") format("truetype"); font-weight: 700; } @font-face { - font-family: 'Inter'; - src: url('./styles/fonts/Inter-Regular.ttf') format('truetype'); + font-family: "Inter"; + src: url("./styles/fonts/Inter-Regular.ttf") format("truetype"); font-weight: 400; } - :root { padding: 0px; margin: 0px; box-sizing: border-box !important; word-break: break-word; - --color-instance : #1E1E20; + --color-instance: #1e1e20; --color-instance-popover-bg: #222222; --Mail-Background: rgba(49, 51, 56, 1); --new-message-text: black; - - --bg-primary : rgba(31, 32, 35, 1); + --bg-primary: rgba(31, 32, 35, 1); --bg-2: #27282c; --bg-3: rgba(0, 0, 0, 0.1); - --unread: #4297e2; - --danger: #B14646; - --apps-circle: #1F2023; - --green: #5EB049; + --unread: #4297e2; + --danger: #b14646; + --apps-circle: #1f2023; + --green: #5eb049; } body { @@ -97,10 +94,8 @@ body { initial-value: transparent; } - .scrollable-container { transition: --var1 0.4s; - } .scrollable-container:hover { @@ -115,11 +110,6 @@ body { opacity: 0; } - - - - - /* Mobile-specific scrollbar styles */ @media only screen and (max-width: 600px) { ::-webkit-scrollbar { @@ -137,11 +127,11 @@ body { background-color: whitesmoke; } -html, body { - overscroll-behavior:none !important; +html, +body { + overscroll-behavior: none !important; } .swiper { width: 100%; } - From 716de3a4090bb88d9a34314bb6dcb08c88008761 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 19:57:00 +0200 Subject: [PATCH 43/77] Format --- .eslintrc.cjs | 18 +++++----- capacitor.config.ts | 20 +++++------ vite.config.ts | 84 ++++++++++++++++++++++++--------------------- 3 files changed, 63 insertions(+), 59 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 92d403a..6d98e04 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -2,17 +2,17 @@ module.exports = { root: true, env: { browser: true, es2020: true }, extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], rules: { - 'react-refresh/only-export-components': [ - 'off', + "react-refresh/only-export-components": [ + "off", { allowConstantExport: true }, ], }, -} +}; diff --git a/capacitor.config.ts b/capacitor.config.ts index c7f641f..87d927b 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -1,15 +1,15 @@ -import type { CapacitorConfig } from '@capacitor/cli'; +import type { CapacitorConfig } from "@capacitor/cli"; const config: CapacitorConfig = { - appId: 'org.Qortal.Qortal-Hub', - appName: 'Qortal-Hub', - webDir: 'dist', - "plugins": { - "LocalNotifications": { - "smallIcon": "qort", - "iconColor": "#09b6e8" - } - } + appId: "org.Qortal.Qortal-Hub", + appName: "Qortal-Hub", + webDir: "dist", + plugins: { + LocalNotifications: { + smallIcon: "qort", + iconColor: "#09b6e8", + }, + }, }; export default config; diff --git a/vite.config.ts b/vite.config.ts index e515bea..d902a5e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,51 +1,55 @@ /// -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // Import path module for resolving file paths -import fixReactVirtualized from 'esbuild-plugin-react-virtualized' -import wasm from 'vite-plugin-wasm'; -import topLevelAwait from 'vite-plugin-top-level-await'; -import { VitePWA } from 'vite-plugin-pwa'; +import fixReactVirtualized from "esbuild-plugin-react-virtualized"; +import wasm from "vite-plugin-wasm"; +import topLevelAwait from "vite-plugin-top-level-await"; +import { VitePWA } from "vite-plugin-pwa"; export default defineConfig({ - test: { - environment: 'jsdom', + environment: "jsdom", globals: true, - setupFiles: ['./src/test/setup.ts'] + setupFiles: ["./src/test/setup.ts"], }, - assetsInclude: ['**/*.wasm'], - plugins: [react(), wasm(), topLevelAwait(), VitePWA({ - registerType: 'prompt', - manifest: { - name: 'Qortal Hub', - short_name: 'Hub', - description: 'Your easy access to the Qortal blockchain', - start_url: '/', - display: 'standalone', - theme_color: '#ffffff', - background_color: '#ffffff', - icons: [ - { - src: '/qortal192.png', - sizes: '192x192', - type: 'image/png', - }, - { - src: '/qortal.png', - sizes: '512x512', - type: 'image/png', - }, - ], - }, - workbox: { - maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, // 5MB limit - disableDevLogs: true, // Suppresses logs in development - }, - })], + assetsInclude: ["**/*.wasm"], + plugins: [ + react(), + wasm(), + topLevelAwait(), + VitePWA({ + registerType: "prompt", + manifest: { + name: "Qortal Hub", + short_name: "Hub", + description: "Your easy access to the Qortal blockchain", + start_url: "/", + display: "standalone", + theme_color: "#ffffff", + background_color: "#ffffff", + icons: [ + { + src: "/qortal192.png", + sizes: "192x192", + type: "image/png", + }, + { + src: "/qortal.png", + sizes: "512x512", + type: "image/png", + }, + ], + }, + workbox: { + maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, // 5MB limit + disableDevLogs: true, // Suppresses logs in development + }, + }), + ], optimizeDeps: { esbuildOptions: { plugins: [fixReactVirtualized], - } - } + }, + }, }); From b58665d47816de2e72bd19dc130eaff55fcbe728 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 20:16:19 +0200 Subject: [PATCH 44/77] CamelCase to avoid DOM error --- src/assets/Icons/MessagingIcon.tsx | 37 ++++++++++++++++++++---------- src/assets/Icons/WalletIcon.tsx | 36 ++++++++++++++++++++--------- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/assets/Icons/MessagingIcon.tsx b/src/assets/Icons/MessagingIcon.tsx index 0de459b..c1e11a6 100644 --- a/src/assets/Icons/MessagingIcon.tsx +++ b/src/assets/Icons/MessagingIcon.tsx @@ -1,13 +1,26 @@ -import React from 'react'; +import React from "react"; -export const MessagingIcon= ({ color, height = 31, width = 31 }) => { - return ( - - - - - - - ); - }; - \ No newline at end of file +export const MessagingIcon = ({ color, height = 31, width = 31 }) => { + return ( + + + + + ); +}; diff --git a/src/assets/Icons/WalletIcon.tsx b/src/assets/Icons/WalletIcon.tsx index 7a0cc58..92223bf 100644 --- a/src/assets/Icons/WalletIcon.tsx +++ b/src/assets/Icons/WalletIcon.tsx @@ -1,12 +1,26 @@ -import React from 'react'; +import React from "react"; -export const WalletIcon= ({ color, height, width }) => { - return ( - - - - - - ); - }; - \ No newline at end of file +export const WalletIcon = ({ color, height, width }) => { + return ( + + + + + ); +}; From 0d138b97e8108b41bb2d970ee5d915d598d53fcd Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 21:08:45 +0200 Subject: [PATCH 45/77] CamelCase notation to avoid DOM error --- src/assets/Icons/LogoutIcon.tsx | 2 +- src/assets/Icons/MessagingIcon2.tsx | 2 +- src/assets/Icons/NotificationIcon2.tsx | 2 +- src/assets/Icons/ThreadsIcon.tsx | 2 +- src/assets/svgs/SaveIcon.tsx | 2 +- src/assets/svgs/SendNewMessage.tsx | 2 +- src/components/Apps/AppViewerContainer.tsx | 2 +- src/components/Apps/AppsCategory.tsx | 4 ++-- src/components/Apps/AppsCategoryDesktop.tsx | 4 ++-- src/components/Apps/AppsLibrary.tsx | 6 +++--- src/components/Apps/AppsLibraryDesktop.tsx | 4 ++-- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/assets/Icons/LogoutIcon.tsx b/src/assets/Icons/LogoutIcon.tsx index 9288de1..30334f4 100644 --- a/src/assets/Icons/LogoutIcon.tsx +++ b/src/assets/Icons/LogoutIcon.tsx @@ -3,7 +3,7 @@ import React from 'react'; export const LogoutIcon= ({ color, height = 20, width = 18}) => { return ( - + diff --git a/src/assets/Icons/MessagingIcon2.tsx b/src/assets/Icons/MessagingIcon2.tsx index 5cbdb98..da367cd 100644 --- a/src/assets/Icons/MessagingIcon2.tsx +++ b/src/assets/Icons/MessagingIcon2.tsx @@ -3,7 +3,7 @@ import React from 'react'; export const MessagingIcon2= ({ color = '#8F8F91', height = 24, width =24 }) => { return ( - + diff --git a/src/assets/Icons/NotificationIcon2.tsx b/src/assets/Icons/NotificationIcon2.tsx index 10d7a03..3626d71 100644 --- a/src/assets/Icons/NotificationIcon2.tsx +++ b/src/assets/Icons/NotificationIcon2.tsx @@ -3,7 +3,7 @@ import React from 'react'; export const NotificationIcon2= ({ color = 'white', height = 15, width = 15 }) => { return ( - + ); diff --git a/src/assets/Icons/ThreadsIcon.tsx b/src/assets/Icons/ThreadsIcon.tsx index 86dfeaa..3cf02cc 100644 --- a/src/assets/Icons/ThreadsIcon.tsx +++ b/src/assets/Icons/ThreadsIcon.tsx @@ -3,7 +3,7 @@ import React from 'react'; export const ThreadsIcon= ({ color = 'white', height = 11, width = 15 }) => { return ( - + diff --git a/src/assets/svgs/SaveIcon.tsx b/src/assets/svgs/SaveIcon.tsx index 12c4999..90f0a53 100644 --- a/src/assets/svgs/SaveIcon.tsx +++ b/src/assets/svgs/SaveIcon.tsx @@ -3,7 +3,7 @@ import React from 'react' export const SaveIcon = ({color = '#8F8F91'}) => { return ( - + ) diff --git a/src/assets/svgs/SendNewMessage.tsx b/src/assets/svgs/SendNewMessage.tsx index 33d7e86..5df8bbf 100644 --- a/src/assets/svgs/SendNewMessage.tsx +++ b/src/assets/svgs/SendNewMessage.tsx @@ -12,7 +12,7 @@ const SvgContainer = styled('svg')({ export const SendNewMessage:React.FC = ({ color, opacity }) => { return ( - + ); diff --git a/src/components/Apps/AppViewerContainer.tsx b/src/components/Apps/AppViewerContainer.tsx index f258848..d65121d 100644 --- a/src/components/Apps/AppViewerContainer.tsx +++ b/src/components/Apps/AppViewerContainer.tsx @@ -20,7 +20,7 @@ const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, padding: 0; } * { - -ms-overflow-style: none; /* IE and Edge */ + -msOverflowStyle: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ } *::-webkit-scrollbar { diff --git a/src/components/Apps/AppsCategory.tsx b/src/components/Apps/AppsCategory.tsx index d1a1420..dd8d5e5 100644 --- a/src/components/Apps/AppsCategory.tsx +++ b/src/components/Apps/AppsCategory.tsx @@ -55,7 +55,7 @@ const ScrollerStyled = styled('div')({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); const StyledVirtuosoContainer = styled('div')({ @@ -74,7 +74,7 @@ const ScrollerStyled = styled('div')({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); export const AppsCategory = ({ availableQapps, myName, category, isShow }) => { diff --git a/src/components/Apps/AppsCategoryDesktop.tsx b/src/components/Apps/AppsCategoryDesktop.tsx index f6ba48d..45e6c57 100644 --- a/src/components/Apps/AppsCategoryDesktop.tsx +++ b/src/components/Apps/AppsCategoryDesktop.tsx @@ -63,7 +63,7 @@ const ScrollerStyled = styled("div")({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); const StyledVirtuosoContainer = styled("div")({ @@ -82,7 +82,7 @@ const StyledVirtuosoContainer = styled("div")({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); export const AppsCategoryDesktop = ({ diff --git a/src/components/Apps/AppsLibrary.tsx b/src/components/Apps/AppsLibrary.tsx index f9b58ea..f3efe33 100644 --- a/src/components/Apps/AppsLibrary.tsx +++ b/src/components/Apps/AppsLibrary.tsx @@ -57,7 +57,7 @@ const ScrollerStyled = styled('div')({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); const StyledVirtuosoContainer = styled('div')({ @@ -76,7 +76,7 @@ const ScrollerStyled = styled('div')({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); export const AppsLibrary = ({ availableQapps, setMode, myName, hasPublishApp, isShow, categories={categories} }) => { @@ -289,7 +289,7 @@ export const AppsLibrary = ({ availableQapps, setMode, myName, hasPublishApp, i scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }}> {categories?.map((category)=> { return ( diff --git a/src/components/Apps/AppsLibraryDesktop.tsx b/src/components/Apps/AppsLibraryDesktop.tsx index de356d4..241cc01 100644 --- a/src/components/Apps/AppsLibraryDesktop.tsx +++ b/src/components/Apps/AppsLibraryDesktop.tsx @@ -73,7 +73,7 @@ const ScrollerStyled = styled("div")({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); const StyledVirtuosoContainer = styled("div")({ @@ -92,7 +92,7 @@ const StyledVirtuosoContainer = styled("div")({ scrollbarWidth: "none", // Hide scrollbar for IE and older Edge - "-ms-overflow-style": "none", + "-msOverflowStyle": "none", }); export const AppsLibraryDesktop = ({ From 214deea2d29dcd0b91466da16266a3432831d373 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 21:09:23 +0200 Subject: [PATCH 46/77] Set style --- src/components/Theme/ThemeSelector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Theme/ThemeSelector.tsx b/src/components/Theme/ThemeSelector.tsx index 3e18f49..5b55f53 100644 --- a/src/components/Theme/ThemeSelector.tsx +++ b/src/components/Theme/ThemeSelector.tsx @@ -69,7 +69,7 @@ const ThemeSelector = ({ style }) => { ...style, }} > - + ); }; From 807bc4e14670fbd4fe594b0c262f1fb26558c509 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 21:09:58 +0200 Subject: [PATCH 47/77] Bind color and background to selected theme --- src/App-styles.ts | 117 ++--- src/components/Apps/Apps-styles.tsx | 660 +++++++++++++++------------- 2 files changed, 426 insertions(+), 351 deletions(-) diff --git a/src/App-styles.ts b/src/App-styles.ts index 08773ea..3581347 100644 --- a/src/App-styles.ts +++ b/src/App-styles.ts @@ -1,7 +1,4 @@ import { - AppBar, - Button, - Toolbar, Typography, Box, TextField, @@ -12,34 +9,45 @@ import { styled } from "@mui/system"; export const AppContainer = styled(Box)(({ theme }) => ({ display: "flex", alignItems: "center", - flexDirection: 'column', + flexDirection: "column", width: "100vw", background: "rgba(39, 40, 44, 1)", height: "100vh", - radius: "15px" + radius: "15px", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); + export const AuthenticatedContainer = styled(Box)(({ theme }) => ({ display: "flex", width: "100%", height: "100%", - justifyContent: "space-between" + justifyContent: "space-between", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); + export const AuthenticatedContainerInnerLeft = styled(Box)(({ theme }) => ({ display: "flex", alignItems: "center", - flexDirection: 'column', + flexDirection: "column", height: "100%", - width: "100%" + width: "100%", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); + export const AuthenticatedContainerInnerRight = styled(Box)(({ theme }) => ({ display: "flex", alignItems: "center", - flexDirection: 'column', + flexDirection: "column", width: "60px", height: "100%", - background: "rgba(0, 0, 0, 0.1)" - + background: "rgba(0, 0, 0, 0.1)", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); + export const AuthenticatedContainerInnerTop = styled(Box)(({ theme }) => ({ display: "flex", alignItems: "center", @@ -47,72 +55,74 @@ export const AuthenticatedContainerInnerTop = styled(Box)(({ theme }) => ({ width: "100%px", height: "60px", background: "rgba(0, 0, 0, 0.1)", - padding: '20px' + padding: "20px", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); export const TextP = styled(Typography)(({ theme }) => ({ fontSize: "13px", fontWeight: 600, fontFamily: "Inter", - color: "white" + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); export const TextItalic = styled("span")(({ theme }) => ({ fontSize: "13px", fontWeight: 600, fontFamily: "Inter", - color: "white", - fontStyle: "italic" + fontStyle: "italic", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); export const TextSpan = styled("span")(({ theme }) => ({ fontSize: "13px", fontFamily: "Inter", fontWeight: 800, - color: "white" + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, })); export const AddressBox = styled(Box)` -display: flex; -border: 1px solid var(--50-white, rgba(255, 255, 255, 0.5)); -justify-content: space-between; -align-items: center; -width: auto; -height: 25px; -padding: 5px 15px 5px 15px; -gap: 5px; -border-radius: 100px; -font-family: Inter; -font-size: 12px; -font-weight: 600; -line-height: 14.52px; -text-align: left; -color: var(--50-white, rgba(255, 255, 255, 0.5)); -cursor: pointer; -transition: all 0.2s; -&:hover { + display: flex; + border: 1px solid var(--50-white, rgba(255, 255, 255, 0.5)); + justify-content: space-between; + align-items: center; + width: auto; + height: 25px; + padding: 5px 15px 5px 15px; + gap: 5px; + border-radius: 100px; + font-family: Inter; + font-size: 12px; + font-weight: 600; + line-height: 14.52px; + text-align: left; + color: var(--50-white, rgba(255, 255, 255, 0.5)); + cursor: pointer; + transition: all 0.2s; + &:hover { background-color: rgba(41, 41, 43, 1); color: white; svg path { fill: white; // Fill color changes to white on hover } } - -` +`; export const CustomButton = styled(Box)` + /* Authenticate */ -/* Authenticate */ + box-sizing: border-box; -box-sizing: border-box; + padding: 15px 20px; + gap: 10px; -padding: 15px 20px; -gap: 10px; - - -border: 0.5px solid rgba(255, 255, 255, 0.5); -filter: drop-shadow(1px 4px 10.5px rgba(0, 0, 0, 0.3)); -border-radius: 5px; + border: 0.5px solid rgba(255, 255, 255, 0.5); + filter: drop-shadow(1px 4px 10.5px rgba(0, 0, 0, 0.3)); + border-radius: 5px; display: inline-flex; @@ -140,6 +150,7 @@ interface CustomButtonProps { bgColor?: string; color?: string; } + export const CustomButtonAccept = styled(Box)( ({ bgColor, color }) => ({ boxSizing: "border-box", @@ -165,20 +176,17 @@ export const CustomButtonAccept = styled(Box)( "&:hover": { opacity: 1, - backgroundColor: bgColor - ? bgColor - : "rgba(41, 41, 43, 1)", // fallback hover bg + backgroundColor: bgColor ? bgColor : "rgba(41, 41, 43, 1)", // fallback hover bg color: color || "white", svg: { path: { - fill: color || "white", + fill: color || "white", }, }, }, }) ); - export const CustomInput = styled(TextField)({ width: "183px", // Adjust the width as needed borderRadius: "5px", @@ -198,13 +206,13 @@ export const CustomInput = styled(TextField)({ }, "& .MuiOutlinedInput-root": { "& fieldset": { - border: '0.5px solid rgba(255, 255, 255, 0.5)', + border: "0.5px solid rgba(255, 255, 255, 0.5)", }, "&:hover fieldset": { - border: '0.5px solid rgba(255, 255, 255, 0.5)', + border: "0.5px solid rgba(255, 255, 255, 0.5)", }, "&.Mui-focused fieldset": { - border: '0.5px solid rgba(255, 255, 255, 0.5)', + border: "0.5px solid rgba(255, 255, 255, 0.5)", }, }, "& .MuiInput-underline:before": { @@ -224,5 +232,4 @@ export const CustomLabel = styled(InputLabel)` font-size: 10px; line-height: 12px; color: rgba(255, 255, 255, 0.5); - -` \ No newline at end of file +`; diff --git a/src/components/Apps/Apps-styles.tsx b/src/components/Apps/Apps-styles.tsx index 995cd70..912c6d4 100644 --- a/src/components/Apps/Apps-styles.tsx +++ b/src/components/Apps/Apps-styles.tsx @@ -1,315 +1,383 @@ -import { - AppBar, - Button, - Toolbar, - Typography, - Box, - TextField, - InputLabel, - ButtonBase, - } from "@mui/material"; - import { styled } from "@mui/system"; - - export const AppsParent = styled(Box)(({ theme }) => ({ - display: "flex", - width: "100%", - flexDirection: "column", - height: "100%", - alignItems: "center", - overflow: 'auto', - // For WebKit-based browsers (Chrome, Safari, etc.) - "::-webkit-scrollbar": { - width: "0px", // Set the width to 0 to hide the scrollbar - height: "0px", // Set the height to 0 for horizontal scrollbar - }, - - // For Firefox - scrollbarWidth: "none", // Hides the scrollbar in Firefox - - // Optional for better cross-browser consistency - "-ms-overflow-style": "none" // Hides scrollbar in IE and Edge - })); - export const AppsContainer = styled(Box)(({ theme }) => ({ - display: "flex", - width: "90%", - justifyContent: 'space-evenly', - gap: '24px', - flexWrap: 'wrap', - alignItems: 'flex-start', - alignSelf: 'center' - - })); - export const AppsLibraryContainer = styled(Box)(({ theme }) => ({ - display: "flex", - width: "100%", - flexDirection: 'column', - justifyContent: 'flex-start', - alignItems: 'center', - })); - export const AppsWidthLimiter = styled(Box)(({ theme }) => ({ - display: "flex", - width: "90%", - flexDirection: 'column', - justifyContent: 'flex-start', - alignItems: 'flex-start', - })); - export const AppsSearchContainer = styled(Box)(({ theme }) => ({ - display: "flex", - width: "90%", - justifyContent: 'space-between', - alignItems: 'center', - backgroundColor: '#434343', - borderRadius: '8px', - padding: '0px 10px', - height: '36px' - })); - export const AppsSearchLeft = styled(Box)(({ theme }) => ({ - display: "flex", - width: "90%", - justifyContent: 'flex-start', - alignItems: 'center', - gap: '10px', - flexGrow: 1, - flexShrink: 0 - })); - export const AppsSearchRight = styled(Box)(({ theme }) => ({ - display: "flex", - width: "90%", - justifyContent: 'flex-end', - alignItems: 'center', - flexShrink: 1 - })); - export const AppCircleContainer = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - gap: '5px', - alignItems: 'center', - width: '100%' - })); - export const Add = styled(Typography)(({ theme }) => ({ - fontSize: '36px', - fontWeight: 500, - lineHeight: '43.57px', - textAlign: 'left' - - })); - export const AppCircleLabel = styled(Typography)(({ theme }) => ({ - fontSize: '14px', - fontWeight: 500, - lineHeight: 1.2, - // whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - width: '120%', - '-webkit-line-clamp': '2', - '-webkit-box-orient': 'vertical', - 'display': '-webkit-box', - - })); - export const AppLibrarySubTitle = styled(Typography)(({ theme }) => ({ - fontSize: '16px', - fontWeight: 500, - lineHeight: 1.2, - })); - export const AppCircle = styled(Box)(({ theme }) => ({ - display: "flex", - width: "75px", - flexDirection: "column", - height: "75px", - alignItems: 'center', - justifyContent: 'center', - borderRadius: '50%', - backgroundColor: "var(--apps-circle)", - border: '1px solid #FFFFFF' - })); +import { Typography, Box, ButtonBase } from "@mui/material"; +import { styled } from "@mui/system"; - export const AppInfoSnippetContainer = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'space-between', - alignItems: 'center', - width: '100%' - })); +export const AppsParent = styled(Box)(({ theme }) => ({ + display: "flex", + width: "100%", + flexDirection: "column", + height: "100%", + alignItems: "center", + overflow: "auto", + // For WebKit-based browsers (Chrome, Safari, etc.) + "::-webkit-scrollbar": { + width: "0px", // Set the width to 0 to hide the scrollbar + height: "0px", // Set the height to 0 for horizontal scrollbar + }, - export const AppInfoSnippetLeft = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'flex-start', - alignItems: 'center', - gap: '12px' - })); - export const AppInfoSnippetRight = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'flex-end', - alignItems: 'center', - })); + // For Firefox + scrollbarWidth: "none", // Hides the scrollbar in Firefox - export const AppDownloadButton = styled(ButtonBase)(({ theme }) => ({ - backgroundColor: "#247C0E", - width: '101px', - height: '29px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - borderRadius: '25px', - alignSelf: 'center' - })); + // Optional for better cross-browser consistency + "-msOverflowStyle": "none", // Hides scrollbar in IE and Edge - export const AppDownloadButtonText = styled(Typography)(({ theme }) => ({ - fontSize: '14px', - fontWeight: 500, - lineHeight: 1.2, - })); + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const AppPublishTagsContainer = styled(Box)(({theme})=> ({ - gap: '10px', - flexWrap: 'wrap', - justifyContent: 'flex-start', - width: '100%', - display: 'flex' - })) +export const AppsContainer = styled(Box)(({ theme }) => ({ + display: "flex", + width: "90%", + justifyContent: "space-evenly", + gap: "24px", + flexWrap: "wrap", + alignItems: "flex-start", + alignSelf: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); +export const AppsLibraryContainer = styled(Box)(({ theme }) => ({ + display: "flex", + width: "100%", + flexDirection: "column", + justifyContent: "flex-start", + alignItems: "center", + backgroundColor: theme.palette.background.paper, +})); - export const AppInfoSnippetMiddle = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - justifyContent: 'center', - alignItems: 'flex-start', - })); +export const AppsWidthLimiter = styled(Box)(({ theme }) => ({ + display: "flex", + width: "90%", + flexDirection: "column", + justifyContent: "flex-start", + alignItems: "flex-start", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const AppInfoAppName = styled(Typography)(({ theme }) => ({ - fontSize: '16px', - fontWeight: 500, - lineHeight: 1.2, - textAlign: 'start' - })); - export const AppInfoUserName = styled(Typography)(({ theme }) => ({ - fontSize: '13px', - fontWeight: 400, - lineHeight: 1.2, - color: '#8D8F93', - textAlign: 'start' - })); +export const AppsSearchContainer = styled(Box)(({ theme }) => ({ + display: "flex", + width: "90%", + justifyContent: "space-between", + alignItems: "center", + borderRadius: "8px", + padding: "0px 10px", + height: "36px", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); +export const AppsSearchLeft = styled(Box)(({ theme }) => ({ + display: "flex", + width: "90%", + justifyContent: "flex-start", + alignItems: "center", + gap: "10px", + flexGrow: 1, + flexShrink: 0, + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const AppsNavBarParent = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'space-between', - alignItems: 'center', - width: '100%', - height: '60px', - backgroundColor: '#1F2023', - padding: '0px 10px', - position: "fixed", - bottom: 0, - zIndex: 1, - })); +export const AppsSearchRight = styled(Box)(({ theme }) => ({ + display: "flex", + width: "90%", + justifyContent: "flex-end", + alignItems: "center", + flexShrink: 1, + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const AppsNavBarLeft = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'flex-start', - alignItems: 'center', - flexGrow: 1 - })); - export const AppsNavBarRight = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'flex-end', - alignItems: 'center', - })); +export const AppCircleContainer = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + gap: "5px", + alignItems: "center", + width: "100%", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const TabParent = styled(Box)(({ theme }) => ({ - height: '36px', - width: '36px', - backgroundColor: '#434343', - position: 'relative', - borderRadius: '50%', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - })); +export const Add = styled(Typography)(({ theme }) => ({ + fontSize: "36px", + fontWeight: 500, + lineHeight: "43.57px", + textAlign: "left", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const PublishQAppCTAParent = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'space-between', - alignItems: 'center', - width: '100%', - backgroundColor: '#181C23' - })); +export const AppCircleLabel = styled(Typography)(({ theme }) => ({ + fontSize: "14px", + fontWeight: 500, + lineHeight: 1.2, + // whiteSpace: 'nowrap', + overflow: "hidden", + textOverflow: "ellipsis", + width: "120%", + "-webkit-line-clamp": "2", + "-webkit-box-orient": "vertical", + display: "-webkit-box", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const PublishQAppCTALeft = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'flex-start', - alignItems: 'center', - })); - export const PublishQAppCTARight = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'flex-end', - alignItems: 'center', - })); +export const AppLibrarySubTitle = styled(Typography)(({ theme }) => ({ + fontSize: "16px", + fontWeight: 500, + lineHeight: 1.2, + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const PublishQAppCTAButton = styled(ButtonBase)(({ theme }) => ({ - width: '101px', - height: '29px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - borderRadius: '25px', - border: '1px solid #FFFFFF' - })); - export const PublishQAppDotsBG = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: 'center', - alignItems: 'center', - width: '60px', - height: '60px', - backgroundColor: '#4BBCFE' - })); - - export const PublishQAppInfo = styled(Typography)(({ theme }) => ({ - fontSize: '10px', - fontWeight: 400, - lineHeight: 1.2, - fontStyle: 'italic' - })); +export const AppCircle = styled(Box)(({ theme }) => ({ + display: "flex", + width: "75px", + flexDirection: "column", + height: "75px", + alignItems: "center", + justifyContent: "center", + borderRadius: "50%", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, + border: "1px solid #FFFFFF", +})); - export const PublishQAppChoseFile = styled(ButtonBase)(({ theme }) => ({ - width: '101px', - height: '30px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - borderRadius: '5px', - backgroundColor: '#0091E1', - color: 'white', - fontWeight: 600, - fontSize: '10px' - })); +export const AppInfoSnippetContainer = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "space-between", + alignItems: "center", + width: "100%", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); +export const AppInfoSnippetLeft = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "flex-start", + alignItems: "center", + gap: "12px", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const AppsCategoryInfo = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: 'center', - width: '100%', - })); +export const AppInfoSnippetRight = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "flex-end", + alignItems: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); - export const AppsCategoryInfoSub = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: 'column', - })); - export const AppsCategoryInfoLabel = styled(Typography)(({ theme }) => ({ - fontSize: '12px', - fontWeight: 700, - lineHeight: 1.2, - color: '#8D8F93', - })); - export const AppsCategoryInfoValue = styled(Typography)(({ theme }) => ({ - fontSize: '12px', - fontWeight: 500, - lineHeight: 1.2, - color: '#8D8F93', - })); - export const AppsInfoDescription = styled(Typography)(({ theme }) => ({ - fontSize: '13px', - fontWeight: 300, - lineHeight: 1.2, - width: '90%', - textAlign: 'start' - })); \ No newline at end of file +export const AppDownloadButton = styled(ButtonBase)(({ theme }) => ({ + backgroundColor: "#247C0E", + color: theme.palette.text.primary, + width: "101px", + height: "29px", + display: "flex", + justifyContent: "center", + alignItems: "center", + borderRadius: "25px", + alignSelf: "center", +})); + +export const AppDownloadButtonText = styled(Typography)(({ theme }) => ({ + fontSize: "14px", + fontWeight: 500, + lineHeight: 1.2, + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppPublishTagsContainer = styled(Box)(({ theme }) => ({ + gap: "10px", + flexWrap: "wrap", + justifyContent: "flex-start", + width: "100%", + display: "flex", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppInfoSnippetMiddle = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "flex-start", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppInfoAppName = styled(Typography)(({ theme }) => ({ + fontSize: "16px", + fontWeight: 500, + lineHeight: 1.2, + textAlign: "start", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppInfoUserName = styled(Typography)(({ theme }) => ({ + fontSize: "13px", + fontWeight: 400, + lineHeight: 1.2, + textAlign: "start", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsNavBarParent = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "space-between", + alignItems: "center", + width: "100%", + height: "60px", + padding: "0px 10px", + position: "fixed", + bottom: 0, + zIndex: 1, + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsNavBarLeft = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "flex-start", + alignItems: "center", + flexGrow: 1, + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsNavBarRight = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "flex-end", + alignItems: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const TabParent = styled(Box)(({ theme }) => ({ + height: "36px", + width: "36px", + position: "relative", + borderRadius: "50%", + display: "flex", + alignItems: "center", + justifyContent: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppCTAParent = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "space-between", + alignItems: "center", + width: "100%", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppCTALeft = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "flex-start", + alignItems: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppCTARight = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "flex-end", + alignItems: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppCTAButton = styled(ButtonBase)(({ theme }) => ({ + width: "101px", + height: "29px", + display: "flex", + justifyContent: "center", + alignItems: "center", + borderRadius: "25px", + border: "1px solid #FFFFFF", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppDotsBG = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "center", + alignItems: "center", + width: "60px", + height: "60px", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppInfo = styled(Typography)(({ theme }) => ({ + fontSize: "10px", + fontWeight: 400, + lineHeight: 1.2, + fontStyle: "italic", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const PublishQAppChoseFile = styled(ButtonBase)(({ theme }) => ({ + width: "101px", + height: "30px", + display: "flex", + justifyContent: "center", + alignItems: "center", + borderRadius: "5px", + fontWeight: 600, + fontSize: "10px", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsCategoryInfo = styled(Box)(({ theme }) => ({ + display: "flex", + alignItems: "center", + width: "100%", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsCategoryInfoSub = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsCategoryInfoLabel = styled(Typography)(({ theme }) => ({ + fontSize: "12px", + fontWeight: 700, + lineHeight: 1.2, + color: "#8D8F93", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsCategoryInfoValue = styled(Typography)(({ theme }) => ({ + fontSize: "12px", + fontWeight: 500, + lineHeight: 1.2, + color: "#8D8F93", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); + +export const AppsInfoDescription = styled(Typography)(({ theme }) => ({ + fontSize: "13px", + fontWeight: 300, + lineHeight: 1.2, + width: "90%", + textAlign: "start", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, +})); From 88fcbe8ad2cb1415c6f3b69bc3dd4301fec978e7 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 21:10:09 +0200 Subject: [PATCH 48/77] Remove unused --- src/App.tsx | 23 ----------------------- src/main.tsx | 2 -- 2 files changed, 25 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 74e0b43..c8a3e22 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -18,9 +18,6 @@ import { DialogContent, DialogContentText, DialogTitle, - Input, - InputLabel, - Popover, Tooltip, Typography, } from "@mui/material"; @@ -28,10 +25,8 @@ import { JsonView, allExpanded, darkStyles } from 'react-json-view-lite'; import 'react-json-view-lite/dist/index.css'; import { decryptStoredWallet } from "./utils/decryptWallet"; import { CountdownCircleTimer } from "react-countdown-circle-timer"; -import Logo1 from "./assets/svgs/Logo1.svg"; import Logo1Dark from "./assets/svgs/Logo1Dark.svg"; import RefreshIcon from "@mui/icons-material/Refresh"; -import Logo2 from "./assets/svgs/Logo2.svg"; import Copy from "./assets/svgs/Copy.svg"; import ltcLogo from "./assets/ltc.png"; import PersonSearchIcon from '@mui/icons-material/PersonSearch'; @@ -42,19 +37,16 @@ import Logout from "./assets/svgs/Logout.svg"; import Return from "./assets/svgs/Return.svg"; import WarningIcon from '@mui/icons-material/Warning'; import Success from "./assets/svgs/Success.svg"; -import Info from "./assets/svgs/Info.svg"; import CloseIcon from "@mui/icons-material/Close"; import './utils/seedPhrase/RandomSentenceGenerator'; import EngineeringIcon from '@mui/icons-material/Engineering'; import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; import { createAccount, - generateRandomSentence, saveFileToDisk, saveSeedPhraseToDisk, } from "./utils/generateWallet/generateWallet"; import { kdf } from "./deps/kdf"; -import { generateSaveWalletData } from "./utils/generateWallet/storeWallet"; import { crypto, walletVersion } from "./constants/decryptWallet"; import PhraseWallet from "./utils/generateWallet/phrase-wallet"; import { @@ -65,7 +57,6 @@ import { AuthenticatedContainerInnerRight, CustomButton, CustomButtonAccept, - CustomInput, CustomLabel, TextItalic, TextP, @@ -74,25 +65,19 @@ import { import { Spacer } from "./common/Spacer"; import { Loader } from "./components/Loader"; import { PasswordField, ErrorText } from "./components"; -import { ChatGroup } from "./components/Chat/ChatGroup"; import { Group, requestQueueMemberNames } from "./components/Group/Group"; import { TaskManager } from "./components/TaskManager/TaskManger"; import { useModal } from "./common/useModal"; -import { LoadingButton } from "@mui/lab"; -import { Label } from "./components/Group/AddGroup"; import { CustomizedSnackbars } from "./components/Snackbar/Snackbar"; import SettingsIcon from "@mui/icons-material/Settings"; import HelpIcon from '@mui/icons-material/Help'; import { cleanUrl, - getFee, getProtocol, getWallets, groupApi, - groupApiLocal, groupApiSocket, - groupApiSocketLocal, storeWallets, } from "./background"; import { @@ -130,19 +115,12 @@ import { } from "./atoms/global"; import { useAppFullScreen } from "./useAppFullscreen"; import { NotAuthenticated } from "./ExtStates/NotAuthenticated"; -import { - openIndexedDB, - showSaveFilePicker, -} from "./components/Apps/useQortalMessageListener"; -import { fileToBase64 } from "./utils/fileReading"; import { handleGetFileFromIndexedDB } from "./utils/indexedDB"; import { CoreSyncStatus } from "./components/CoreSyncStatus"; import { Wallets } from "./Wallets"; -import { RandomSentenceGenerator } from "./utils/seedPhrase/RandomSentenceGenerator"; import { useFetchResources } from "./common/useFetchResources"; import { Tutorials } from "./components/Tutorials/Tutorials"; import { useHandleTutorials } from "./components/Tutorials/useHandleTutorials"; -import BoundedNumericTextField from "./common/BoundedNumericTextField"; import { useHandleUserInfo } from "./components/Group/useHandleUserInfo"; import { Minting } from "./components/Minting/Minting"; import { isRunningGateway } from "./qortalRequests"; @@ -150,7 +128,6 @@ import { QMailStatus } from "./components/QMailStatus"; import { GlobalActions } from "./components/GlobalActions/GlobalActions"; import { useBlockedAddresses } from "./components/Group/useBlockUsers"; import { WalletIcon } from "./assets/Icons/WalletIcon"; -import { DrawerUserLookup } from "./components/Drawer/DrawerUserLookup"; import { UserLookup } from "./components/UserLookup.tsx/UserLookup"; import { RegisterName } from "./components/RegisterName"; import { BuyQortInformation } from "./components/BuyQortInformation"; diff --git a/src/main.tsx b/src/main.tsx index cddf0dd..b26cb01 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,7 +3,6 @@ import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import "./index.css"; import "./messaging/messagesToBackground"; -import { CssBaseline } from "@mui/material"; import { MessageQueueProvider } from "./MessageQueueContext.tsx"; import { RecoilRoot } from "recoil"; import { ThemeProvider } from "./components/Theme/ThemeContext.tsx"; @@ -128,7 +127,6 @@ import { ThemeProvider } from "./components/Theme/ThemeContext.tsx"; ReactDOM.createRoot(document.getElementById("root")!).render( <> - From 7c46a67183db6123c7ce85241f3b9490c9a2b33b Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 5 Apr 2025 21:18:08 +0200 Subject: [PATCH 49/77] Refactor --- src/App-styles.ts | 171 ++++++++++++++++------------ src/components/Apps/Apps-styles.tsx | 2 - src/main.tsx | 117 ------------------- 3 files changed, 96 insertions(+), 194 deletions(-) diff --git a/src/App-styles.ts b/src/App-styles.ts index 3581347..d3f2903 100644 --- a/src/App-styles.ts +++ b/src/App-styles.ts @@ -1,9 +1,4 @@ -import { - Typography, - Box, - TextField, - InputLabel, -} from "@mui/material"; +import { Typography, Box, TextField, InputLabel } from "@mui/material"; import { styled } from "@mui/system"; export const AppContainer = styled(Box)(({ theme }) => ({ @@ -85,78 +80,99 @@ export const TextSpan = styled("span")(({ theme }) => ({ color: theme.palette.text.primary, })); -export const AddressBox = styled(Box)` - display: flex; - border: 1px solid var(--50-white, rgba(255, 255, 255, 0.5)); - justify-content: space-between; - align-items: center; - width: auto; - height: 25px; - padding: 5px 15px 5px 15px; - gap: 5px; - border-radius: 100px; - font-family: Inter; - font-size: 12px; - font-weight: 600; - line-height: 14.52px; - text-align: left; - color: var(--50-white, rgba(255, 255, 255, 0.5)); - cursor: pointer; - transition: all 0.2s; - &:hover { - background-color: rgba(41, 41, 43, 1); - color: white; - svg path { - fill: white; // Fill color changes to white on hover - } - } -`; +export const AddressBox = styled(Box)(({ theme }) => ({ + display: "flex", + border: `1px solid ${ + theme.palette.mode === "dark" + ? "rgba(255, 255, 255, 0.5)" + : "rgba(0, 0, 0, 0.3)" + }`, + justifyContent: "space-between", + alignItems: "center", + width: "auto", + height: "25px", + padding: "5px 15px", + gap: "5px", + borderRadius: "100px", + fontFamily: "Inter", + fontSize: "12px", + fontWeight: 600, + lineHeight: "14.52px", + textAlign: "left", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, + cursor: "pointer", + transition: "all 0.2s", -export const CustomButton = styled(Box)` - /* Authenticate */ + "&:hover": { + backgroundColor: + theme.palette.mode === "dark" + ? "rgba(41, 41, 43, 1)" + : "rgba(240, 240, 240, 1)", + color: theme.palette.mode === "dark" ? "#fff" : "#000", - box-sizing: border-box; + "svg path": { + fill: theme.palette.mode === "dark" ? "#fff" : "#000", + }, + }, +})); - padding: 15px 20px; - gap: 10px; +export const CustomButton = styled(Box)(({ theme }) => ({ + boxSizing: "border-box", + padding: "15px 20px", + gap: "10px", - border: 0.5px solid rgba(255, 255, 255, 0.5); - filter: drop-shadow(1px 4px 10.5px rgba(0, 0, 0, 0.3)); - border-radius: 5px; + border: `0.5px solid ${ + theme.palette.mode === "dark" + ? "rgba(255, 255, 255, 0.5)" + : "rgba(0, 0, 0, 0.3)" + }`, + filter: "drop-shadow(1px 4px 10.5px rgba(0, 0, 0, 0.3))", + borderRadius: "5px", - display: inline-flex; + display: "inline-flex", + justifyContent: "center", + alignItems: "center", - justify-content: center; - align-items: center; + width: "fit-content", + minWidth: "160px", + cursor: "pointer", + transition: "all 0.2s", + + fontWeight: 600, + fontFamily: "Inter", + textAlign: "center", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, + + "&:hover": { + backgroundColor: + theme.palette.mode === "dark" + ? "rgba(41, 41, 43, 1)" + : "rgba(230, 230, 230, 1)", + color: "#fff", + + "svg path": { + fill: "#fff", + }, + }, +})); - width: fit-content; - transition: all 0.2s; - color: black; - min-width: 160px; - cursor: pointer; - font-weight: 600; - font-family: Inter; - color: white; - text-align: center; - &:hover { - background-color: rgba(41, 41, 43, 1); - color: white; - svg path { - fill: white; // Fill color changes to white on hover - } - } -`; interface CustomButtonProps { bgColor?: string; color?: string; } export const CustomButtonAccept = styled(Box)( - ({ bgColor, color }) => ({ + ({ bgColor, color, theme }) => ({ boxSizing: "border-box", padding: "15px 20px", gap: "10px", - border: "0.5px solid rgba(255, 255, 255, 0.5)", + border: `0.5px solid ${ + theme.palette.mode === "dark" + ? "rgba(255, 255, 255, 0.5)" + : "rgba(0, 0, 0, 0.3)" + }`, filter: "drop-shadow(1px 4px 10.5px rgba(0,0,0,0.3))", borderRadius: 5, display: "inline-flex", @@ -170,17 +186,18 @@ export const CustomButtonAccept = styled(Box)( fontFamily: "Inter", textAlign: "center", opacity: 0.7, - // Use the passed-in props or fallback defaults - backgroundColor: bgColor || "transparent", - color: color || "white", + + // Color and backgroundColor with fallbacks + backgroundColor: bgColor || (theme.palette.mode === "dark" ? "#1d1d1d" : "#f5f5f5"), + color: color || (theme.palette.mode === "dark" ? "#fff" : "#000"), "&:hover": { opacity: 1, - backgroundColor: bgColor ? bgColor : "rgba(41, 41, 43, 1)", // fallback hover bg - color: color || "white", + backgroundColor: bgColor || (theme.palette.mode === "dark" ? "rgba(41, 41, 43, 1)" : "rgba(230, 230, 230, 1)"), + color: color || "#fff", svg: { path: { - fill: color || "white", + fill: color || "#fff", }, }, }, @@ -226,10 +243,14 @@ export const CustomInput = styled(TextField)({ }, }); -export const CustomLabel = styled(InputLabel)` - font-weight: 400; - font-family: Inter; - font-size: 10px; - line-height: 12px; - color: rgba(255, 255, 255, 0.5); -`; +export const CustomLabel = styled(InputLabel)(({ theme }) => ({ + fontWeight: 400, + fontFamily: "Inter", + fontSize: "10px", + lineHeight: "12px", + color: + theme.palette.mode === "dark" + ? "rgba(255, 255, 255, 0.5)" + : "rgba(0, 0, 0, 0.5)", +})); + diff --git a/src/components/Apps/Apps-styles.tsx b/src/components/Apps/Apps-styles.tsx index 912c6d4..631186b 100644 --- a/src/components/Apps/Apps-styles.tsx +++ b/src/components/Apps/Apps-styles.tsx @@ -358,7 +358,6 @@ export const AppsCategoryInfoLabel = styled(Typography)(({ theme }) => ({ fontSize: "12px", fontWeight: 700, lineHeight: 1.2, - color: "#8D8F93", backgroundColor: theme.palette.background.default, color: theme.palette.text.primary, })); @@ -367,7 +366,6 @@ export const AppsCategoryInfoValue = styled(Typography)(({ theme }) => ({ fontSize: "12px", fontWeight: 500, lineHeight: 1.2, - color: "#8D8F93", backgroundColor: theme.palette.background.default, color: theme.palette.text.primary, })); diff --git a/src/main.tsx b/src/main.tsx index b26cb01..881d4c1 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -7,123 +7,6 @@ import { MessageQueueProvider } from "./MessageQueueContext.tsx"; import { RecoilRoot } from "recoil"; import { ThemeProvider } from "./components/Theme/ThemeContext.tsx"; -// const darkTheme: ThemeOptions = { -// palette: { -// primary: { -// main: "#232428", // Primary color (e.g., used for buttons, headers, etc.) -// }, -// secondary: { -// main: "#232428", // Secondary color -// }, -// background: { -// default: "#27282c", // Default background color -// paper: "#1d1d1d", // Paper component background (for dropdowns, dialogs, etc.) -// }, -// text: { -// primary: "#ffffff", // White as the primary text color -// secondary: "#b0b0b0", // Light gray for secondary text -// disabled: "#808080", // Gray for disabled text -// }, -// action: { -// // disabledBackground: 'set color of background here', -// disabled: "rgb(255 255 255 / 70%)", -// }, -// }, -// typography: { -// fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', // Font family -// h1: { -// color: "#ffffff", // White color for h1 elements -// }, -// h2: { -// color: "#ffffff", // White color for h2 elements -// }, -// body1: { -// color: "#ffffff", // Default body text color -// }, -// body2: { -// color: "#b0b0b0", // Lighter text for body2, often used for secondary text -// }, -// }, -// components: { -// MuiOutlinedInput: { -// styleOverrides: { -// root: { -// ".MuiOutlinedInput-notchedOutline": { -// borderColor: "white", // ⚪ Default outline color -// }, -// }, -// }, -// }, -// MuiSelect: { -// styleOverrides: { -// icon: { -// color: "white", // ✅ Caret (dropdown arrow) color -// }, -// }, -// }, -// }, -// } - -// const lightTheme: ThemeOptions = { -// palette: { -// primary: { -// main: "#1976d2", // Primary color for buttons, headers, etc. -// }, -// secondary: { -// main: "#ff4081", // Secondary color with a vibrant pink touch -// }, -// background: { -// default: "#f5f5f5", // Light background color for the main UI -// paper: "#ffffff", // Background color for Paper components (dialogs, dropdowns, etc.) -// }, -// text: { -// primary: "#212121", // Dark text for contrast and readability -// secondary: "#616161", // Medium gray for secondary text -// disabled: "#9e9e9e", // Light gray for disabled text -// }, -// action: { -// disabled: "rgb(0 0 0 / 50%)", // Color for disabled actions -// }, -// }, -// typography: { -// fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', // Font family for consistency -// h1: { -// color: "#ffffff", // Dark color for main headings (h1) -// }, -// h2: { -// color: "#ffffff", // Dark color for subheadings (h2) -// }, -// body1: { -// color: "#ffffff", // Default body text color -// }, -// body2: { -// color: "#ffffff", // Lighter text for secondary content -// }, -// }, -// components: { -// MuiOutlinedInput: { -// styleOverrides: { -// root: { -// ".MuiOutlinedInput-notchedOutline": { -// borderColor: "#ffffff", // Darker outline for better input field visibility -// }, -// }, -// }, -// }, -// MuiSelect: { -// styleOverrides: { -// icon: { -// color: "#212121", // Dark dropdown arrow icon for contrast -// }, -// }, -// }, -// }, -// }; - -// const theme = createTheme(lightTheme); - -// export default theme; - ReactDOM.createRoot(document.getElementById("root")!).render( <> From c3b14fa60ecc0381c0a3e78543401af2fb4092c0 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 6 Apr 2025 21:07:14 +0200 Subject: [PATCH 50/77] Remove unused import --- src/main.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.tsx b/src/main.tsx index 881d4c1..bc98a9a 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,4 +1,3 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import "./index.css"; From afdc52dd61fc178b77bce6e1d8365e166306a629 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 6 Apr 2025 21:07:34 +0200 Subject: [PATCH 51/77] Format code --- src/assets/svgs/CreateThreadIcon.tsx | 31 +++++++---- src/components/Apps/TabComponent.tsx | 82 +++++++++++++++------------- 2 files changed, 63 insertions(+), 50 deletions(-) diff --git a/src/assets/svgs/CreateThreadIcon.tsx b/src/assets/svgs/CreateThreadIcon.tsx index 549ec2e..13b2442 100644 --- a/src/assets/svgs/CreateThreadIcon.tsx +++ b/src/assets/svgs/CreateThreadIcon.tsx @@ -1,20 +1,27 @@ -import React from 'react'; -import { styled } from '@mui/system'; -import { SVGProps } from './interfaces'; +import React from "react"; +import { styled } from "@mui/system"; +import { SVGProps } from "./interfaces"; // Create a styled container with hover effects -const SvgContainer = styled('svg')({ - '& path': { - fill: 'rgba(41, 41, 43, 1)', // Default to red if no color prop - } +const SvgContainer = styled("svg")({ + "& path": { + fill: "rgba(41, 41, 43, 1)", // Default to red if no color prop + }, }); -export const CreateThreadIcon:React.FC = ({ color, opacity }) => { +export const CreateThreadIcon: React.FC = ({ color, opacity }) => { return ( - - + + - - ); }; diff --git a/src/components/Apps/TabComponent.tsx b/src/components/Apps/TabComponent.tsx index ecf17a7..d13d992 100644 --- a/src/components/Apps/TabComponent.tsx +++ b/src/components/Apps/TabComponent.tsx @@ -1,41 +1,43 @@ -import React from 'react' -import { TabParent } from './Apps-styles' +import { TabParent } from "./Apps-styles"; import NavCloseTab from "../../assets/svgs/NavCloseTab.svg"; -import { getBaseApiReact } from '../../App'; -import { Avatar, ButtonBase } from '@mui/material'; +import { getBaseApiReact } from "../../App"; +import { Avatar, ButtonBase } from "@mui/material"; import LogoSelected from "../../assets/svgs/LogoSelected.svg"; -import { executeEvent } from '../../utils/events'; +import { executeEvent } from "../../utils/events"; import LockIcon from "@mui/icons-material/Lock"; -const TabComponent = ({isSelected, app}) => { +const TabComponent = ({ isSelected, app }) => { return ( - { - if(isSelected){ - executeEvent('removeTab', { - data: app - }) - return + { + if (isSelected) { + executeEvent("removeTab", { + data: app, + }); + return; } - executeEvent('setSelectedTab', { - data: app - }) - }}> - + executeEvent("setSelectedTab", { + data: app, + }); + }} + > + {isSelected && ( - - - - ) } - {app?.isPrivate && !app?.privateAppProperties?.logo ? ( + + )} + {app?.isPrivate && !app?.privateAppProperties?.logo ? ( { width: "28px", }} alt={app?.name} - src={app?.privateAppProperties?.logo ? app?.privateAppProperties?.logo :`${getBaseApiReact()}/arbitrary/THUMBNAIL/${ - app?.name - }/qortal_avatar?async=true`} + src={ + app?.privateAppProperties?.logo + ? app?.privateAppProperties?.logo + : `${getBaseApiReact()}/arbitrary/THUMBNAIL/${ + app?.name + }/qortal_avatar?async=true` + } > { /> )} - + - ) -} + ); +}; -export default TabComponent \ No newline at end of file +export default TabComponent; From f51242959af5cf93af0d6d519b756c0e7de2f004 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 6 Apr 2025 21:08:11 +0200 Subject: [PATCH 52/77] Add theme parameter --- .../PasswordField/PasswordField.tsx | 134 +++++++++++------- 1 file changed, 82 insertions(+), 52 deletions(-) diff --git a/src/components/PasswordField/PasswordField.tsx b/src/components/PasswordField/PasswordField.tsx index 89bc8b4..0c3e8b7 100644 --- a/src/components/PasswordField/PasswordField.tsx +++ b/src/components/PasswordField/PasswordField.tsx @@ -1,67 +1,97 @@ -import { Button, ButtonBase, InputAdornment, TextField, TextFieldProps, styled } from "@mui/material"; -import { forwardRef, useState } from 'react' -import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; -import VisibilityIcon from '@mui/icons-material/Visibility'; -export const CustomInput = styled(TextField)({ - width: "183px", // Adjust the width as needed +import { + ButtonBase, + InputAdornment, + TextField, + TextFieldProps, + styled, +} from "@mui/material"; +import { forwardRef, useState } from "react"; +import VisibilityOffIcon from "@mui/icons-material/VisibilityOff"; +import VisibilityIcon from "@mui/icons-material/Visibility"; + +export const CustomInput = styled(TextField)(({ theme }) => ({ + width: "183px", borderRadius: "5px", - // backgroundColor: "rgba(30, 30, 32, 1)", + backgroundColor: theme.palette.background.paper, outline: "none", input: { - fontSize: 10, - fontFamily: "Inter", - fontWeight: 400, - color: "white", - "&::placeholder": { - fontSize: 16, - color: "rgba(255, 255, 255, 0.2)", - }, - outline: "none", - padding: "10px", + fontSize: 10, + fontFamily: "Inter", + fontWeight: 400, + color: theme.palette.text.primary, + "&::placeholder": { + fontSize: 16, + color: theme.palette.text.disabled, + }, + outline: "none", + padding: "10px", }, "& .MuiOutlinedInput-root": { - "& fieldset": { - border: '0.5px solid rgba(255, 255, 255, 0.5)', - }, - "&:hover fieldset": { - border: '0.5px solid rgba(255, 255, 255, 0.5)', - }, - "&.Mui-focused fieldset": { - border: '0.5px solid rgba(255, 255, 255, 0.5)', - }, + "& fieldset": { + border: `0.5px solid ${theme.palette.divider}`, + }, + "&:hover fieldset": { + border: `0.5px solid ${theme.palette.divider}`, + }, + "&.Mui-focused fieldset": { + border: `0.5px solid ${theme.palette.divider}`, + }, }, "& .MuiInput-underline:before": { - borderBottom: "none", + borderBottom: "none", }, "& .MuiInput-underline:hover:not(.Mui-disabled):before": { - borderBottom: "none", + borderBottom: "none", }, "& .MuiInput-underline:after": { - borderBottom: "none", + borderBottom: "none", }, -}); + })); - -export const PasswordField = forwardRef( ({ ...props }, ref) => { +export const PasswordField = forwardRef( + ({ ...props }, ref) => { const [canViewPassword, setCanViewPassword] = useState(false); return ( - { - setCanViewPassword((prevState) => !prevState) - }}> - {canViewPassword ? : } - - ) - }} - inputRef={ref} - {...props} - /> - ) -}); \ No newline at end of file + { + setCanViewPassword((prevState) => !prevState); + }} + > + {canViewPassword ? ( + + + + ) : ( + + + + )} + + ), + }} + inputRef={ref} + {...props} + /> + ); + } +); From a943e72ecf903734915ca6a851fae6fe0d29efaa Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 6 Apr 2025 21:08:47 +0200 Subject: [PATCH 53/77] Add theme parameter --- src/App-styles.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/App-styles.ts b/src/App-styles.ts index d3f2903..21b911d 100644 --- a/src/App-styles.ts +++ b/src/App-styles.ts @@ -204,11 +204,13 @@ export const CustomButtonAccept = styled(Box)( }) ); -export const CustomInput = styled(TextField)({ +export const CustomInput = styled(TextField)(({ theme }) => ({ width: "183px", // Adjust the width as needed borderRadius: "5px", // backgroundColor: "rgba(30, 30, 32, 1)", outline: "none", + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, input: { fontSize: 10, fontFamily: "Inter", @@ -241,7 +243,7 @@ export const CustomInput = styled(TextField)({ "& .MuiInput-underline:after": { borderBottom: "none", }, -}); +})); export const CustomLabel = styled(InputLabel)(({ theme }) => ({ fontWeight: 400, From 768d959d788914b68ac710a6be61f6f93ae5e25f Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 6 Apr 2025 21:08:56 +0200 Subject: [PATCH 54/77] Format code --- src/App.tsx | 4001 +++++++++++++++++++++++++++------------------------ 1 file changed, 2098 insertions(+), 1903 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index c8a3e22..8237a7b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -21,32 +21,31 @@ import { Tooltip, Typography, } from "@mui/material"; -import { JsonView, allExpanded, darkStyles } from 'react-json-view-lite'; -import 'react-json-view-lite/dist/index.css'; +import { JsonView, allExpanded, darkStyles } from "react-json-view-lite"; +import "react-json-view-lite/dist/index.css"; import { decryptStoredWallet } from "./utils/decryptWallet"; import { CountdownCircleTimer } from "react-countdown-circle-timer"; import Logo1Dark from "./assets/svgs/Logo1Dark.svg"; import RefreshIcon from "@mui/icons-material/Refresh"; import Copy from "./assets/svgs/Copy.svg"; import ltcLogo from "./assets/ltc.png"; -import PersonSearchIcon from '@mui/icons-material/PersonSearch'; +import PersonSearchIcon from "@mui/icons-material/PersonSearch"; import qortLogo from "./assets/qort.png"; import { CopyToClipboard } from "react-copy-to-clipboard"; import Download from "./assets/svgs/Download.svg"; import Logout from "./assets/svgs/Logout.svg"; import Return from "./assets/svgs/Return.svg"; -import WarningIcon from '@mui/icons-material/Warning'; +import WarningIcon from "@mui/icons-material/Warning"; import Success from "./assets/svgs/Success.svg"; import CloseIcon from "@mui/icons-material/Close"; -import './utils/seedPhrase/RandomSentenceGenerator'; -import EngineeringIcon from '@mui/icons-material/Engineering'; -import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; +import "./utils/seedPhrase/RandomSentenceGenerator"; +import EngineeringIcon from "@mui/icons-material/Engineering"; +import AccountBalanceWalletIcon from "@mui/icons-material/AccountBalanceWallet"; import { createAccount, saveFileToDisk, saveSeedPhraseToDisk, } from "./utils/generateWallet/generateWallet"; -import { kdf } from "./deps/kdf"; import { crypto, walletVersion } from "./constants/decryptWallet"; import PhraseWallet from "./utils/generateWallet/phrase-wallet"; import { @@ -70,7 +69,7 @@ import { TaskManager } from "./components/TaskManager/TaskManger"; import { useModal } from "./common/useModal"; import { CustomizedSnackbars } from "./components/Snackbar/Snackbar"; import SettingsIcon from "@mui/icons-material/Settings"; -import HelpIcon from '@mui/icons-material/Help'; +import HelpIcon from "@mui/icons-material/Help"; import { cleanUrl, @@ -133,6 +132,7 @@ import { RegisterName } from "./components/RegisterName"; import { BuyQortInformation } from "./components/BuyQortInformation"; import { QortPayment } from "./components/QortPayment"; import { GeneralNotifications } from "./components/GeneralNotifications"; +import ThemeSelector from "./components/Theme/ThemeSelector"; type extStates = | "not-authenticated" @@ -220,7 +220,6 @@ const controlAllQueues = (action) => { }); }; - export const clearAllQueues = () => { Object.keys(allQueues).forEach((key) => { const val = allQueues[key]; @@ -251,13 +250,13 @@ export const resumeAllQueues = () => { }); }; - const defaultValuesGlobal = { openTutorialModal: null, - setOpenTutorialModal: ()=> {} -} + setOpenTutorialModal: () => {}, +}; export const MyContext = createContext(defaultValues); -export const GlobalContext = createContext(defaultValuesGlobal); +export const GlobalContext = + createContext(defaultValuesGlobal); export let globalApiKey: string | null = null; @@ -347,11 +346,17 @@ function App() { const [hasSettingsChanged, setHasSettingsChanged] = useRecoilState( hasSettingsChangedAtom ); - const balanceSetIntervalRef = useRef(null) - const {downloadResource} = useFetchResources() + const balanceSetIntervalRef = useRef(null); + const { downloadResource } = useFetchResources(); const holdRefExtState = useRef("not-authenticated"); const isFocusedRef = useRef(true); - const {showTutorial, openTutorialModal, shownTutorialsInitiated, setOpenTutorialModal, hasSeenGettingStarted} = useHandleTutorials() + const { + showTutorial, + openTutorialModal, + shownTutorialsInitiated, + setOpenTutorialModal, + hasSeenGettingStarted, + } = useHandleTutorials(); const { isShow, onCancel, onOk, show, message } = useModal(); const { isShow: isShowUnsavedChanges, @@ -367,7 +372,7 @@ function App() { show: showInfo, message: messageInfo, } = useModal(); - + const { onCancel: onCancelQortalRequest, onOk: onOkQortalRequest, @@ -383,43 +388,46 @@ function App() { message: messageQortalRequestExtension, } = useModal(); - const [isRunningPublicNode, setIsRunningPublicNode] = useState(false) + const [isRunningPublicNode, setIsRunningPublicNode] = useState(false); const [infoSnack, setInfoSnack] = useState(null); const [openSnack, setOpenSnack] = useState(false); const [hasLocalNode, setHasLocalNode] = useState(false); const [isOpenDrawerProfile, setIsOpenDrawerProfile] = useState(false); - const [isOpenDrawerLookup, setIsOpenDrawerLookup] = useState(false) + const [isOpenDrawerLookup, setIsOpenDrawerLookup] = useState(false); const [apiKey, setApiKey] = useState(""); const [isOpenSendQort, setIsOpenSendQort] = useState(false); const [isOpenSendQortSuccess, setIsOpenSendQortSuccess] = useState(false); const [rootHeight, setRootHeight] = useState("100%"); - const {isUserBlocked, + const { + isUserBlocked, addToBlockList, - removeBlockFromList, getAllBlockedUsers} = useBlockedAddresses() - const [currentNode, setCurrentNode] = useState({ - url: "http://127.0.0.1:12391", - }); - const [useLocalNode, setUseLocalNode] = useState(false); - + removeBlockFromList, + getAllBlockedUsers, + } = useBlockedAddresses(); + const [currentNode, setCurrentNode] = useState({ + url: "http://127.0.0.1:12391", + }); + const [useLocalNode, setUseLocalNode] = useState(false); + const [isSettingsOpen, setIsSettingsOpen] = useState(false); - const [showSeed, setShowSeed] = useState(false) - const [creationStep, setCreationStep] = useState(1) - const {getIndividualUserInfo} = useHandleUserInfo() + const [showSeed, setShowSeed] = useState(false); + const [creationStep, setCreationStep] = useState(1); + const { getIndividualUserInfo } = useHandleUserInfo(); const qortalRequestCheckbox1Ref = useRef(null); useRetrieveDataLocalStorage(userInfo?.address); useQortalGetSaveSettings(userInfo?.name, extState === "authenticated"); const [fullScreen, setFullScreen] = useRecoilState(fullScreenAtom); const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom); - const setIsDisabledEditorEnter = useSetRecoilState(isDisabledEditorEnterAtom) - const [isOpenMinting, setIsOpenMinting] = useState(false) + const setIsDisabledEditorEnter = useSetRecoilState(isDisabledEditorEnterAtom); + const [isOpenMinting, setIsOpenMinting] = useState(false); const { toggleFullScreen } = useAppFullScreen(setFullScreen); - const generatorRef = useRef(null) - const exportSeedphrase = ()=> { - const seedPhrase = generatorRef.current.parsedString - saveSeedPhraseToDisk(seedPhrase) - } + const generatorRef = useRef(null); + const exportSeedphrase = () => { + const seedPhrase = generatorRef.current.parsedString; + saveSeedPhraseToDisk(seedPhrase); + }; const passwordRef = useRef(null); useEffect(() => { if (extState === "wallet-dropped" && passwordRef.current) { @@ -433,24 +441,26 @@ function App() { } }, []); - useEffect(()=> { - isRunningGateway().then((res)=> { - setIsRunningPublicNode(res) - }).catch((error)=> { - console.error(error) + useEffect(() => { + isRunningGateway() + .then((res) => { + setIsRunningPublicNode(res); }) - }, [extState]) + .catch((error) => { + console.error(error); + }); + }, [extState]); - useEffect(()=> { - if(!shownTutorialsInitiated) return - if(extState === 'not-authenticated'){ - showTutorial('create-account') - } else if(extState === "create-wallet" && walletToBeDownloaded){ - showTutorial('important-information') - } else if(extState === "authenticated"){ - showTutorial('getting-started') + useEffect(() => { + if (!shownTutorialsInitiated) return; + if (extState === "not-authenticated") { + showTutorial("create-account"); + } else if (extState === "create-wallet" && walletToBeDownloaded) { + showTutorial("important-information"); + } else if (extState === "authenticated") { + showTutorial("getting-started"); } - }, [extState, walletToBeDownloaded, shownTutorialsInitiated]) + }, [extState, walletToBeDownloaded, shownTutorialsInitiated]); useEffect(() => { // Attach a global event listener for double-click @@ -473,7 +483,9 @@ function App() { const resetAtomSortablePinnedAppsAtom = useResetRecoilState( sortablePinnedAppsAtom ); - const resetAtomIsUsingImportExportSettingsAtom = useResetRecoilState(isUsingImportExportSettingsAtom) + const resetAtomIsUsingImportExportSettingsAtom = useResetRecoilState( + isUsingImportExportSettingsAtom + ); const resetAtomCanSaveSettingToQdnAtom = useResetRecoilState( canSaveSettingToQdnAtom ); @@ -484,22 +496,25 @@ function App() { settingsLocalLastUpdatedAtom ); const resetAtomOldPinnedAppsAtom = useResetRecoilState(oldPinnedAppsAtom); - const resetAtomQMailLastEnteredTimestampAtom = useResetRecoilState(qMailLastEnteredTimestampAtom) - const resetAtomMailsAtom = useResetRecoilState(mailsAtom) - const resetGroupPropertiesAtom = useResetRecoilState(groupsPropertiesAtom) - const resetLastPaymentSeenTimestampAtom = useResetRecoilState(lastPaymentSeenTimestampAtom) + const resetAtomQMailLastEnteredTimestampAtom = useResetRecoilState( + qMailLastEnteredTimestampAtom + ); + const resetAtomMailsAtom = useResetRecoilState(mailsAtom); + const resetGroupPropertiesAtom = useResetRecoilState(groupsPropertiesAtom); + const resetLastPaymentSeenTimestampAtom = useResetRecoilState( + lastPaymentSeenTimestampAtom + ); const resetAllRecoil = () => { resetAtomSortablePinnedAppsAtom(); resetAtomCanSaveSettingToQdnAtom(); resetAtomSettingsQDNLastUpdatedAtom(); resetAtomSettingsLocalLastUpdatedAtom(); resetAtomOldPinnedAppsAtom(); - resetAtomIsUsingImportExportSettingsAtom() - resetAtomQMailLastEnteredTimestampAtom() - resetAtomMailsAtom() - resetGroupPropertiesAtom() - resetLastPaymentSeenTimestampAtom() - + resetAtomIsUsingImportExportSettingsAtom(); + resetAtomQMailLastEnteredTimestampAtom(); + resetAtomMailsAtom(); + resetGroupPropertiesAtom(); + resetLastPaymentSeenTimestampAtom(); }; useEffect(() => { if (!isMobile) return; @@ -533,48 +548,46 @@ function App() { try { setIsLoading(true); window - .sendMessage("getApiKey") - .then((response) => { - if (response) { - handleSetGlobalApikey(response); - setApiKey(response); - } - }) - .catch((error) => { - console.error( - "Failed to get API key:", - error?.message || "An error occurred" - ); - }).finally(()=> { - window - .sendMessage("getWalletInfo") + .sendMessage("getApiKey") .then((response) => { - if (response && response?.walletInfo) { - setRawWallet(response?.walletInfo); - if ( - holdRefExtState.current === "web-app-request-payment" || - holdRefExtState.current === "web-app-request-connection" || - holdRefExtState.current === "web-app-request-buy-order" - ) - return; - if (response?.hasKeyPair) { - setExtstate("authenticated"); - } else { - setExtstate("wallet-dropped"); - } + if (response) { + handleSetGlobalApikey(response); + setApiKey(response); } }) .catch((error) => { - console.error("Failed to get wallet info:", error); + console.error( + "Failed to get API key:", + error?.message || "An error occurred" + ); + }) + .finally(() => { + window + .sendMessage("getWalletInfo") + .then((response) => { + if (response && response?.walletInfo) { + setRawWallet(response?.walletInfo); + if ( + holdRefExtState.current === "web-app-request-payment" || + holdRefExtState.current === "web-app-request-connection" || + holdRefExtState.current === "web-app-request-buy-order" + ) + return; + if (response?.hasKeyPair) { + setExtstate("authenticated"); + } else { + setExtstate("wallet-dropped"); + } + } + }) + .catch((error) => { + console.error("Failed to get wallet info:", error); + }); }); - }) } catch (error) { - } finally { setIsLoading(false); - } - }, []); useEffect(() => { if (extState) { @@ -582,19 +595,17 @@ function App() { } }, [extState]); - useEffect(()=> { + useEffect(() => { try { - const val = localStorage.getItem('settings-disable-editor-enter'); - if(val){ - const parsedVal = JSON.parse(val) - if(parsedVal === false || parsedVal === true){ - setIsDisabledEditorEnter(parsedVal) + const val = localStorage.getItem("settings-disable-editor-enter"); + if (val) { + const parsedVal = JSON.parse(val); + if (parsedVal === false || parsedVal === true) { + setIsDisabledEditorEnter(parsedVal); } } - } catch (error) { - - } - }, []) + } catch (error) {} + }, []); useEffect(() => { isFocusedRef.current = isFocused; @@ -697,34 +708,33 @@ function App() { }; }; - - const balanceSetInterval = ()=> { + const balanceSetInterval = () => { try { - if(balanceSetIntervalRef?.current){ + if (balanceSetIntervalRef?.current) { clearInterval(balanceSetIntervalRef?.current); } let isCalling = false; - balanceSetIntervalRef.current = setInterval(async () => { + balanceSetIntervalRef.current = setInterval(async () => { if (isCalling) return; isCalling = true; window - .sendMessage("balance") - .then((response) => { - if (!response?.error && !isNaN(+response)) { - setBalance(response); - } - isCalling = false; - }) - .catch((error) => { - console.error("Failed to get balance:", error); - isCalling = false; - }); + .sendMessage("balance") + .then((response) => { + if (!response?.error && !isNaN(+response)) { + setBalance(response); + } + isCalling = false; + }) + .catch((error) => { + console.error("Failed to get balance:", error); + isCalling = false; + }); }, 40000); } catch (error) { - console.error(error) + console.error(error); } - } + }; const getBalanceFunc = () => { setQortBalanceLoading(true); @@ -734,14 +744,15 @@ function App() { if (!response?.error && !isNaN(+response)) { setBalance(response); } - + setQortBalanceLoading(false); }) .catch((error) => { console.error("Failed to get balance:", error); setQortBalanceLoading(false); - }).finally(()=> { - balanceSetInterval() + }) + .finally(() => { + balanceSetInterval(); }); }; const getLtcBalanceFunc = () => { @@ -759,7 +770,6 @@ function App() { setLtcBalanceLoading(false); }); }; - const clearAllStates = () => { setRequestConnection(null); @@ -878,7 +888,6 @@ function App() { // REMOVED FOR MOBILE APP }; - const getUserInfo = useCallback(async (useTimer?: boolean) => { try { if (useTimer) { @@ -957,25 +966,26 @@ function App() { } }; - const saveWalletToLocalStorage = async (newWallet)=> { + const saveWalletToLocalStorage = async (newWallet) => { try { - getWallets().then((res)=> { - - if(res && Array.isArray(res)){ - const wallets = [...res, newWallet] - storeWallets(wallets) - } else { - storeWallets([newWallet]) - } - setIsLoading(false) - }).catch((error)=> { - console.error(error) - setIsLoading(false) - }) + getWallets() + .then((res) => { + if (res && Array.isArray(res)) { + const wallets = [...res, newWallet]; + storeWallets(wallets); + } else { + storeWallets([newWallet]); + } + setIsLoading(false); + }) + .catch((error) => { + console.error(error); + setIsLoading(false); + }); } catch (error) { - console.error(error) + console.error(error); } - } + }; const createAccountFunc = async () => { try { @@ -1013,7 +1023,7 @@ function App() { .then((response) => { if (response && !response.error) { setRawWallet(wallet); - saveWalletToLocalStorage(wallet) + saveWalletToLocalStorage(wallet); setWalletToBeDownloaded({ wallet, qortAddress: wallet.address0, @@ -1055,10 +1065,9 @@ function App() { message: "Your settings have changed. If you logout you will lose your changes. Click on the save button in the header to keep your changed settings.", }); - } else if(extState === 'authenticated') { + } else if (extState === "authenticated") { await showUnsavedChanges({ - message: - "Are you sure you would like to logout?", + message: "Are you sure you would like to logout?", }); } window @@ -1087,8 +1096,8 @@ function App() { setCountdown(null); setWalletToBeDownloaded(null); setWalletToBeDownloadedPassword(""); - setShowSeed(false) - setCreationStep(1) + setShowSeed(false); + setCreationStep(1); setExtstate("authenticated"); setIsOpenSendQort(false); setIsOpenSendQortSuccess(false); @@ -1114,8 +1123,8 @@ function App() { setCountdown(null); setWalletToBeDownloaded(null); setWalletToBeDownloadedPassword(""); - setShowSeed(false) - setCreationStep(1) + setShowSeed(false); + setCreationStep(1); setWalletToBeDownloadedPasswordConfirm(""); setWalletToBeDownloadedError(""); @@ -1124,7 +1133,7 @@ function App() { setTxList([]); setMemberGroups([]); resetAllRecoil(); - if(balanceSetIntervalRef?.current){ + if (balanceSetIntervalRef?.current) { clearInterval(balanceSetIntervalRef?.current); } }; @@ -1254,7 +1263,7 @@ function App() { setOpenSnack(true); setInfoSnack({ type, - message + message, }); }; @@ -1281,244 +1290,261 @@ function App() { }; }, []); - - - const renderProfileLeft = ()=> { - - return - - - {authenticatedMode === "qort" && ( - LITECOIN WALLET} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, + const renderProfileLeft = () => { + return ( + + + + {authenticatedMode === "qort" && ( + + LITECOIN WALLET + + } + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", }, - arrow: { - sx: { - color: "#444444", - }, + }, + arrow: { + sx: { + color: "#444444", }, + }, + }} + > + { + setAuthenticatedMode("ltc"); + }} + src={ltcLogo} + style={{ + cursor: "pointer", + width: "20px", + height: "auto", + }} + /> + + )} + {authenticatedMode === "ltc" && ( + + QORTAL WALLET + + } + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, + }} + > + { + setAuthenticatedMode("qort"); + }} + src={qortLogo} + style={{ + cursor: "pointer", + width: "20px", + height: "auto", + }} + /> + + )} + + + + {authenticatedMode === "ltc" ? ( + <> + + + + + {rawWallet?.ltcAddress?.slice(0, 6)}... + {rawWallet?.ltcAddress?.slice(-4)} + + + + {ltcBalanceLoading && ( + + )} + {!isNaN(+ltcBalance) && !ltcBalanceLoading && ( + - { - - setAuthenticatedMode("ltc"); + + {ltcBalance} LTC + + - + )} - {authenticatedMode === "ltc" && ( - QORTAL WALLET} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, - }, - arrow: { - sx: { - color: "#444444", - }, - }, - }} - > - { - setAuthenticatedMode("qort"); - }} - src={qortLogo} - style={{ - cursor: "pointer", - width: "20px", - height: "auto", - }} - /> - - )} - - - - {authenticatedMode === "ltc" ? ( - <> - - - - - {rawWallet?.ltcAddress?.slice(0, 6)}... - {rawWallet?.ltcAddress?.slice(-4)} - - - - {ltcBalanceLoading && ( - - )} - {!isNaN(+ltcBalance) && !ltcBalanceLoading && ( - + + + ) : ( + <> + + - {ltcBalance} LTC + {userInfo?.name} - + + + {rawWallet?.address0?.slice(0, 6)}... + {rawWallet?.address0?.slice(-4)} + + + + {qortBalanceLoading && ( + + )} + {!qortBalanceLoading && balance >= 0 && ( + + + {balance?.toFixed(2)} QORT + + + + )} + + + {userInfo && !userInfo?.name && ( + { + executeEvent("openRegisterName", {}); + }} + > + REGISTER NAME + + )} + + { + setIsOpenSendQort(true); + // setExtstate("send-qort"); + setIsOpenDrawerProfile(false); }} - /> - + > + Transfer QORT + + + )} - - - ) : ( - <> - - { + executeEvent("addTab", { + data: { service: "APP", name: "q-trade" }, + }); + executeEvent("open-apps-mode", {}); }} > - {userInfo?.name} + Get QORT at Q-Trade - - - - {rawWallet?.address0?.slice(0, 6)}... - {rawWallet?.address0?.slice(-4)} - - - - {qortBalanceLoading && ( - - )} - {!qortBalanceLoading && balance >= 0 && ( - - - {balance?.toFixed(2)} QORT - - - - )} - - - {userInfo && !userInfo?.name && ( - { - executeEvent('openRegisterName', {}) - }} - > - REGISTER NAME - - )} - - { - setIsOpenSendQort(true); - // setExtstate("send-qort"); - setIsOpenDrawerProfile(false); - }} - > - Transfer QORT - - - - )} - { - executeEvent("addTab", { - data: { service: "APP", name: "q-trade" }, - }); - executeEvent("open-apps-mode", {}); - }} - > - Get QORT at Q-Trade - - - } + + ); + }; const renderProfile = () => { return ( @@ -1551,11 +1577,7 @@ function App() { )} {desktopViewMode !== "apps" && desktopViewMode !== "dev" && - desktopViewMode !== "chat" && ( - <> - {renderProfileLeft()} - - )} + desktopViewMode !== "chat" && <>{renderProfileLeft()}} @@ -1577,7 +1599,17 @@ function App() { <> LOG OUT} + title={ + + LOG OUT + + } placement="left" arrow sx={{ fontSize: "24" }} @@ -1603,8 +1635,8 @@ function App() { }} style={{ cursor: "pointer", - width: '20px', - height: 'auto' + width: "20px", + height: "auto", }} /> @@ -1618,7 +1650,17 @@ function App() { }} > SETTINGS} + title={ + + SETTINGS + + } placement="left" arrow sx={{ fontSize: "24" }} @@ -1652,7 +1694,17 @@ function App() { }} > USER LOOKUP} + title={ + + USER LOOKUP + + } placement="left" arrow sx={{ fontSize: "24" }} @@ -1682,11 +1734,21 @@ function App() { { - executeEvent('openWalletsApp', {}) + executeEvent("openWalletsApp", {}); }} > WALLETS} + title={ + + WALLETS + + } placement="left" arrow sx={{ fontSize: "24" }} @@ -1711,110 +1773,131 @@ function App() { /> - - {desktopViewMode !== 'home' && ( + + {desktopViewMode !== "home" && ( <> - - YOUR ACCOUNT} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, - }, - arrow: { - sx: { - color: "#444444", - }, - }, - }} - > - { - setIsOpenDrawerProfile(true); - }}> - - - - + + YOUR ACCOUNT + + } + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, + }} + > + { + setIsOpenDrawerProfile(true); + }} + > + + + )} - - + - - {extState === 'authenticated' && ( + + {extState === "authenticated" && ( )} - {extState === "authenticated" && isMainWindow && ( - - - - - + + + + )} - - { - try { - const res = await isRunningGateway() - if(res) throw new Error('Cannot view minting details on the gateway') - setIsOpenMinting(true) - - } catch (error) { - setOpenSnack(true) - setInfoSnack({ - type: 'error', - message: error?.message - }) - } - }}> + + { + try { + const res = await isRunningGateway(); + if (res) + throw new Error( + "Cannot view minting details on the gateway" + ); + setIsOpenMinting(true); + } catch (error) { + setOpenSnack(true); + setInfoSnack({ + type: "error", + message: error?.message, + }); + } + }} + > MINTING STATUS} + title={ + + MINTING STATUS + + } placement="left" arrow sx={{ fontSize: "24" }} @@ -1832,77 +1915,95 @@ function App() { }, }} > - + - + {(desktopViewMode === "apps" || desktopViewMode === "home") && ( - { - if(desktopViewMode === "apps"){ - showTutorial('qapps', true) - } else { - showTutorial('getting-started', true) - } - }} > - TUTORIAL} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, + { + if (desktopViewMode === "apps") { + showTutorial("qapps", true); + } else { + showTutorial("getting-started", true); + } + }} + > + + TUTORIAL + + } + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", }, - arrow: { - sx: { - color: "#444444", - }, + }, + arrow: { + sx: { + color: "#444444", }, - }} - > - - - - )} - - - BACKUP WALLET} - placement="left" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, - }, - arrow: { - sx: { - color: "#444444", - }, - }, - }} - > - { - setExtstate("download-wallet"); - setIsOpenDrawerProfile(false); + }, + }} + > + + + + )} + + + + BACKUP WALLET + + } + placement="left" + arrow + sx={{ fontSize: "24" }} + slotProps={{ + tooltip: { + sx: { + color: "#ffffff", + backgroundColor: "#444444", + }, + }, + arrow: { + sx: { + color: "#444444", + }, + }, }} - src={Download} - style={{ - cursor: "pointer", - width: '20px' - }} - /> - + > + { + setExtstate("download-wallet"); + setIsOpenDrawerProfile(false); + }} + src={Download} + style={{ + cursor: "pointer", + width: "20px", + }} + /> + - + ); @@ -1918,1292 +2019,134 @@ function App() { // backgroundRepeat: desktopViewMode === "apps" && "no-repeat", }} > - - - {extState === "not-authenticated" && ( - - )} - {/* {extState !== "not-authenticated" && ( + + + {extState === "not-authenticated" && ( + + )} + {/* {extState !== "not-authenticated" && ( )} */} - {extState === "authenticated" && isMainWindow && ( - - - - {!isMobile && renderProfile()} - - - - - )} - {isOpenSendQort && isMainWindow && ( - - - - - - - { - setIsOpenSendQort(false); - setIsOpenSendQortSuccess(true); - }} - defaultPaymentTo={paymentTo} - /> - - )} - - {isShowQortalRequest && !isMainWindow && ( - <> - - - - {messageQortalRequest?.text1} - - - {messageQortalRequest?.text2 && ( - <> - - - - {messageQortalRequest?.text2} - - - - - )} - {messageQortalRequest?.text3 && ( - <> - - - {messageQortalRequest?.text3} - - - - - )} - - {messageQortalRequest?.text4 && ( + + {!isMobile && renderProfile()} + + + )} + {isOpenSendQort && isMainWindow && ( + + - - {messageQortalRequest?.text4} - - - )} - - {messageQortalRequest?.html && ( -
- )} - - - - {messageQortalRequest?.highlightedText} - - - {messageQortalRequest?.fee && ( - <> - - - - {"Fee: "} - {messageQortalRequest?.fee} - {" QORT"} - - - - )} - {messageQortalRequest?.checkbox1 && ( - - { - qortalRequestCheckbox1Ref.current = e.target.checked; - }} - edge="start" - tabIndex={-1} - disableRipple - defaultChecked={messageQortalRequest?.checkbox1?.value} - sx={{ - "&.Mui-checked": { - color: "white", // Customize the color when checked - }, - "& .MuiSvgIcon-root": { - color: "white", - }, - }} - /> - - - {messageQortalRequest?.checkbox1?.label} - - - )} - - - - onOkQortalRequest("accepted")} - > - accept - - onCancelQortalRequest()} - > - decline - - - {sendPaymentError} - - )} - {extState === "web-app-request-buy-order" && !isMainWindow && ( - <> - - - - The Application

{" "} - {requestBuyOrder?.hostname}

- - is requesting {requestBuyOrder?.crosschainAtInfo?.length}{" "} - {`buy order${ - requestBuyOrder?.crosschainAtInfo.length === 1 ? "" : "s" - }`} - -
- - - {requestBuyOrder?.crosschainAtInfo?.reduce((latest, cur) => { - return latest + +cur?.qortAmount; - }, 0)}{" "} - QORT - - - - FOR - - - - {roundUpToDecimals( - requestBuyOrder?.crosschainAtInfo?.reduce((latest, cur) => { - return latest + +cur?.expectedForeignAmount; - }, 0) - )} - {` ${requestBuyOrder?.crosschainAtInfo?.[0]?.foreignBlockchain}`} - - {/* - - - Confirm Wallet Password - - - setPaymentPassword(e.target.value)} - /> */} - - - confirmBuyOrder(false)} - > - accept - - confirmBuyOrder(true)} - > - decline - - - {sendPaymentError} - - )} - - {extState === "web-app-request-payment" && !isMainWindow && ( - <> - - - - The Application

{" "} - {sendqortState?.hostname}

- is requesting a payment -
- - - {sendqortState?.description} - - - - {sendqortState?.amount} QORT - - {/* - - - Confirm Wallet Password - - - setPaymentPassword(e.target.value)} - /> */} - - - confirmPayment(false)} - > - accept - - confirmPayment(true)} - > - decline - - - {sendPaymentError} - - )} - {extState === "web-app-request-connection" && !isMainWindow && ( - <> - -
- -
- - - The Application

{" "} - {requestConnection?.hostname}

- is requestion a connection -
- - - - responseToConnectionRequest( - true, - requestConnection?.hostname, - requestConnection.interactionId - ) - } - > - accept - - - responseToConnectionRequest( - false, - requestConnection?.hostname, - requestConnection.interactionId - ) - } - > - decline - - - - )} - {extState === "web-app-request-authentication" && !isMainWindow && ( - <> - -
- -
- - - The Application

{" "} - {requestConnection?.hostname}

- requests authentication -
- - - - - - Authenticate - - - { - setExtstate("create-wallet"); - }} - > - Create account - - - )} - {extState === "wallets" && ( - <> - - - { - setRawWallet(null); - setExtstate("not-authenticated"); - logoutFunc(); - }} - src={Return} - /> - - - - - )} - {rawWallet && extState === "wallet-dropped" && ( - <> - - - { - setRawWallet(null); - setExtstate("wallets"); - logoutFunc(); - }} - src={Return} - /> - - -
- -
- - - {rawWallet?.name ? rawWallet?.name : rawWallet?.address0} - - - Authenticate - - - - - <> - - Wallet Password - - - setAuthenticatePassword(e.target.value)} - onKeyDown={(e) => { - if (e.key === "Enter") { - authenticateWallet(); - } - }} - ref={passwordRef} - /> - {useLocalNode ? ( - <> - - - {"Using node: "} {currentNode?.url} - - - ) : ( - <> - - - {"Using public node"} - - - )} - - - - Authenticate - - {walletToBeDecryptedError} - - - )} - {extState === "download-wallet" && ( - <> - - - - - -
- -
- - - - Download Account - - - - {!walletToBeDownloaded && ( - <> - - Confirm Wallet Password - - - - setWalletToBeDownloadedPassword(e.target.value) - - } - /> - - - Confirm password - - {walletToBeDownloadedError} - - )} - - {walletToBeDownloaded && ( - <> - { - await saveFileToDiskFunc(); - await showInfo({ - message: `Keep your account file secure.`, - }); - }} - > - Download account - - - )} - - )} - {extState === "create-wallet" && ( - <> - {!walletToBeDownloaded && ( - <> - - - { - if(creationStep === 2){ - setCreationStep(1) - return - } - setExtstate("not-authenticated"); - setShowSeed(false) - setCreationStep(1) - setWalletToBeDownloadedPasswordConfirm('') - setWalletToBeDownloadedPassword('') - }} - src={Return} - /> - - -
- -
- - - Set up your Qortal account - - - - - - A ‘ { - setShowSeed(true) - }} style={{ - fontSize: '14px', - color: 'steelblue', - cursor: 'pointer' - }}>SEEDPHRASE ’ has been randomly generated in the background. - - - - - If you wish to VIEW THE SEEDPHRASE, click the word 'SEEDPHRASE' in this text. Seedphrases are used to generate the private key for your Qortal account. For security by default, seedphrases are NOT displayed unless specifically chosen. - - - Create your Qortal account by clicking NEXT below. - - - - { - setCreationStep(2) - }}> - Next - - -
- -
- - - - Your seedphrase - - - {generatorRef.current?.parsedString} - - - - Export Seedphrase - - - - - - - - - - -
- - - - Wallet Password - - - - setWalletToBeDownloadedPassword(e.target.value) - } + onClick={returnToMain} + src={Return} /> - - - Confirm Wallet Password - - - - setWalletToBeDownloadedPasswordConfirm(e.target.value) - } - /> - - There is no minimum length requirement - + + + { + setIsOpenSendQort(false); + setIsOpenSendQortSuccess(true); + }} + defaultPaymentTo={paymentTo} + /> + + )} - - Create Account - - - {walletToBeDownloadedError} - - )} - - {walletToBeDownloaded && ( - <> - - - - - Congrats, you’re all set up! - - - - - Save your account in a place where you will remember it! - - - { - await saveFileToDiskFunc(); - returnToMain(); - await showInfo({ - message: `Keep your wallet file secure.`, - }); - }} - > - Backup Account - - - )} - - )} - {isOpenSendQortSuccess && ( - - - - - - The transfer was succesful! - - - { - returnToMain(); - }} - > - Continue - - - )} - {extState === "transfer-success-request" && ( - <> - - - - - The transfer was succesful! - - - { - window.close(); - }} - > - Continue - - - )} - {extState === "buy-order-submitted" && ( - <> - - - - - Your buy order was submitted - - - { - window.close(); - }} - > - Close - - - )} - {countdown && ( - - {/* */} - { - window.close(); - }} - size={75} - strokeWidth={8} - > - {({ remainingTime }) => {remainingTime}} - - - )} - {isLoading && } - {isShow && ( - - {message.paymentFee ? "Payment" : "Publish"} - - - {message.message} - - {message?.paymentFee && ( - - payment fee: {message.paymentFee} - - )} - {message?.publishFee && ( - - publish fee: {message.publishFee} - - )} - - - - - - - - )} - {isShowInfo && ( - - {"Important Info"} - - - {messageInfo.message} - - - - - - - )} - {isShowUnsavedChanges && ( - - {"LOGOUT"} - - - {messageUnsavedChanges.message} - - - - - - - - )} - {isShowQortalRequestExtension && isMainWindow && ( - - { - onCancelQortalRequestExtension(); - }} - size={50} - strokeWidth={5} - > - {({ remainingTime }) => {remainingTime}} - - + {isShowQortalRequest && !isMainWindow && ( + <> + - {messageQortalRequestExtension?.text1} + {messageQortalRequest?.text1} - {messageQortalRequestExtension?.text2 && ( + {messageQortalRequest?.text2 && ( <> - {messageQortalRequestExtension?.text2} + {messageQortalRequest?.text2} )} - {messageQortalRequestExtension?.text3 && ( + {messageQortalRequest?.text3 && ( <> - {messageQortalRequestExtension?.text3} + {messageQortalRequest?.text3} )} - {messageQortalRequestExtension?.text4 && ( + {messageQortalRequest?.text4 && ( - {messageQortalRequestExtension?.text4} + {messageQortalRequest?.text4} )} - {messageQortalRequestExtension?.html && ( + {messageQortalRequest?.html && (
)} @@ -3305,20 +2246,10 @@ function App() { maxWidth: "90%", }} > - {messageQortalRequestExtension?.highlightedText} + {messageQortalRequest?.highlightedText} - {messageQortalRequestExtension?.json && ( - <> - - - - - - - )} - - {messageQortalRequestExtension?.fee && ( + {messageQortalRequest?.fee && ( <> @@ -3332,53 +2263,17 @@ function App() { }} > {"Fee: "} - {messageQortalRequestExtension?.fee} + {messageQortalRequest?.fee} {" QORT"} )} - {messageQortalRequestExtension?.appFee && ( - <> - - {"App Fee: "} - {messageQortalRequestExtension?.appFee} - {" QORT"} - - - - )} - {messageQortalRequestExtension?.foreignFee && ( - <> - - - - {"Foreign Fee: "} - {messageQortalRequestExtension?.foreignFee} - - - - )} - {messageQortalRequestExtension?.checkbox1 && ( + {messageQortalRequest?.checkbox1 && ( - {messageQortalRequestExtension?.checkbox1?.label} + {messageQortalRequest?.checkbox1?.label} )} @@ -3423,66 +2316,1368 @@ function App() { gap: "14px", }} > - onOkQortalRequestExtension("accepted")} + onClick={() => onOkQortalRequest("accepted")} > accept - - + onCancelQortalRequestExtension()} + onClick={() => onCancelQortalRequest()} > decline - + {sendPaymentError} + + )} + {extState === "web-app-request-buy-order" && !isMainWindow && ( + <> + + + + The Application

{" "} + {requestBuyOrder?.hostname}

+ + is requesting {requestBuyOrder?.crosschainAtInfo?.length}{" "} + {`buy order${ + requestBuyOrder?.crosschainAtInfo.length === 1 ? "" : "s" + }`} + +
+ + + {requestBuyOrder?.crosschainAtInfo?.reduce((latest, cur) => { + return latest + +cur?.qortAmount; + }, 0)}{" "} + QORT + + + + FOR + + + + {roundUpToDecimals( + requestBuyOrder?.crosschainAtInfo?.reduce((latest, cur) => { + return latest + +cur?.expectedForeignAmount; + }, 0) + )} + {` ${requestBuyOrder?.crosschainAtInfo?.[0]?.foreignBlockchain}`} + + {/* + + + Confirm Wallet Password + + + setPaymentPassword(e.target.value)} + /> */} + + + confirmBuyOrder(false)} + > + accept + + confirmBuyOrder(true)} + > + decline + + + {sendPaymentError} + + )} + + {extState === "web-app-request-payment" && !isMainWindow && ( + <> + + + + The Application

{" "} + {sendqortState?.hostname}

+ is requesting a payment +
+ + + {sendqortState?.description} + + + + {sendqortState?.amount} QORT + + {/* + + + Confirm Wallet Password + + + setPaymentPassword(e.target.value)} + /> */} + + + confirmPayment(false)} + > + accept + + confirmPayment(true)} + > + decline + + + {sendPaymentError} + + )} + {extState === "web-app-request-connection" && !isMainWindow && ( + <> + +
+ +
+ + + The Application

{" "} + {requestConnection?.hostname}

+ is requestion a connection +
+ + + + responseToConnectionRequest( + true, + requestConnection?.hostname, + requestConnection.interactionId + ) + } + > + accept + + + responseToConnectionRequest( + false, + requestConnection?.hostname, + requestConnection.interactionId + ) + } + > + decline + + + + )} + {extState === "web-app-request-authentication" && !isMainWindow && ( + <> + +
+ +
+ + + The Application

{" "} + {requestConnection?.hostname}

+ requests authentication +
+ + + + + + Authenticate + + + { + setExtstate("create-wallet"); + }} + > + Create account + + + )} + {extState === "wallets" && ( + <> + + + { + setRawWallet(null); + setExtstate("not-authenticated"); + logoutFunc(); + }} + src={Return} + /> + + + + )} + {rawWallet && extState === "wallet-dropped" && ( + <> + + + { + setRawWallet(null); + setExtstate("wallets"); + logoutFunc(); + }} + src={Return} + /> + + +
+ +
+ + + + {rawWallet?.name ? rawWallet?.name : rawWallet?.address0} + + + + Authenticate + + + + + <> + + Wallet Password + + + setAuthenticatePassword(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + authenticateWallet(); + } + }} + ref={passwordRef} + /> + {useLocalNode ? ( + <> + + + {"Using node: "} {currentNode?.url} + + + ) : ( + <> + + + {"Using public node"} + + + )} + + + + Authenticate + + {walletToBeDecryptedError} + + + )} + {extState === "download-wallet" && ( + <> + + + + + +
+ +
+ + + + Download Account + + + + {!walletToBeDownloaded && ( + <> + + Confirm Wallet Password + + + + setWalletToBeDownloadedPassword(e.target.value) + } + /> + + + Confirm password + + {walletToBeDownloadedError} + + )} + + {walletToBeDownloaded && ( + <> + { + await saveFileToDiskFunc(); + await showInfo({ + message: `Keep your account file secure.`, + }); + }} + > + Download account + + + )} + + )} + {extState === "create-wallet" && ( + <> + {!walletToBeDownloaded && ( + <> + + + { + if (creationStep === 2) { + setCreationStep(1); + return; + } + setExtstate("not-authenticated"); + setShowSeed(false); + setCreationStep(1); + setWalletToBeDownloadedPasswordConfirm(""); + setWalletToBeDownloadedPassword(""); + }} + src={Return} + /> + + +
+ +
+ + + Set up your Qortal account + + + + + + A ‘{" "} + { + setShowSeed(true); + }} + style={{ + fontSize: "14px", + color: "steelblue", + cursor: "pointer", + }} + > + SEEDPHRASE + {" "} + ’ has been randomly generated in the background. + + + If you wish to VIEW THE SEEDPHRASE, click the word + 'SEEDPHRASE' in this text. Seedphrases are used to + generate the private key for your Qortal account. For + security by default, seedphrases are NOT displayed unless + specifically chosen. + + + Create your Qortal account by clicking{" "} + + NEXT + {" "} + below. + + + { + setCreationStep(2); + }} + > + Next + + +
+ +
+ + + + + Your seedphrase + + + + {generatorRef.current?.parsedString} + + + + Export Seedphrase + + + + + + + +
+ + + + Wallet Password + + + + setWalletToBeDownloadedPassword(e.target.value) + } + /> + + + Confirm Wallet Password + + + + setWalletToBeDownloadedPasswordConfirm(e.target.value) + } + /> + + + There is no minimum length requirement + + + + + Create Account + + + {walletToBeDownloadedError} + + )} + + {walletToBeDownloaded && ( + <> + + + + + Congrats, you’re all set up! + + + + + + Save your account in a place where you will remember it! + + + + { + await saveFileToDiskFunc(); + returnToMain(); + await showInfo({ + message: `Keep your wallet file secure.`, + }); + }} + > + Backup Account + + + )} + + )} + {isOpenSendQortSuccess && ( + + + + + + The transfer was succesful! + + + { + returnToMain(); + }} + > + Continue + -
- )} - {isSettingsOpen && ( - - )} - - - {renderProfileLeft()} - - - - + )} + {extState === "transfer-success-request" && ( + <> + + + + + The transfer was succesful! + + + { + window.close(); + }} + > + Continue + + + )} + {extState === "buy-order-submitted" && ( + <> + + + + + Your buy order was submitted + + + { + window.close(); + }} + > + Close + + + )} + {countdown && ( + + {/* */} + { + window.close(); + }} + size={75} + strokeWidth={8} + > + {({ remainingTime }) => {remainingTime}} + + + )} + {isLoading && } + {isShow && ( + + + {message.paymentFee ? "Payment" : "Publish"} + + + + {message.message} + + {message?.paymentFee && ( + + payment fee: {message.paymentFee} + + )} + {message?.publishFee && ( + + publish fee: {message.publishFee} + + )} + + + + + + + )} + {isShowInfo && ( + + + {"Important Info"} + + + + {messageInfo.message} + + + + + + + )} + {isShowUnsavedChanges && ( + + {"LOGOUT"} + + + {messageUnsavedChanges.message} + + + + + + + + )} + {isShowQortalRequestExtension && isMainWindow && ( + + { + onCancelQortalRequestExtension(); + }} + size={50} + strokeWidth={5} + > + {({ remainingTime }) => {remainingTime}} + + + + + {messageQortalRequestExtension?.text1} + + + {messageQortalRequestExtension?.text2 && ( + <> + + + + {messageQortalRequestExtension?.text2} + + + + + )} + {messageQortalRequestExtension?.text3 && ( + <> + + + {messageQortalRequestExtension?.text3} + + + + + )} + + {messageQortalRequestExtension?.text4 && ( + + + {messageQortalRequestExtension?.text4} + + + )} + + {messageQortalRequestExtension?.html && ( +
+ )} + + + + {messageQortalRequestExtension?.highlightedText} + + + {messageQortalRequestExtension?.json && ( + <> + + + + + + )} + + {messageQortalRequestExtension?.fee && ( + <> + + + + {"Fee: "} + {messageQortalRequestExtension?.fee} + {" QORT"} + + + + )} + {messageQortalRequestExtension?.appFee && ( + <> + + {"App Fee: "} + {messageQortalRequestExtension?.appFee} + {" QORT"} + + + + )} + {messageQortalRequestExtension?.foreignFee && ( + <> + + + + {"Foreign Fee: "} + {messageQortalRequestExtension?.foreignFee} + + + + )} + {messageQortalRequestExtension?.checkbox1 && ( + + { + qortalRequestCheckbox1Ref.current = e.target.checked; + }} + edge="start" + tabIndex={-1} + disableRipple + defaultChecked={ + messageQortalRequestExtension?.checkbox1?.value + } + sx={{ + "&.Mui-checked": { + color: "white", // Customize the color when checked + }, + "& .MuiSvgIcon-root": { + color: "white", + }, + }} + /> + + + {messageQortalRequestExtension?.checkbox1?.label} + + + )} + + + + onOkQortalRequestExtension("accepted")} + > + accept + + onCancelQortalRequestExtension()} + > + decline + + + {sendPaymentError} + +
+ )} + {isSettingsOpen && ( + + )} + + + {renderProfileLeft()} + + + + {extState === "create-wallet" && walletToBeDownloaded && ( - { - showTutorial('important-information', true) - }} sx={{ - position: 'fixed', - bottom: '25px', - right: '25px' - }}> - - + { + showTutorial("important-information", true); + }} + sx={{ + position: "fixed", + bottom: "25px", + right: "25px", + }} + > + + )} - {isOpenMinting && ( - - )} + {isOpenMinting && ( + + )} + ); } From a792474f556b747c4078bbc8bc6b08c46ffb3af9 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 6 Apr 2025 22:00:38 +0200 Subject: [PATCH 55/77] Adapt to theme --- src/assets/Icons/AppsIcon.tsx | 24 +- src/assets/Icons/HomeIcon.tsx | 28 +- src/assets/Icons/MessagingIcon.tsx | 10 +- src/assets/svgs/SaveIcon.tsx | 30 +- src/components/Apps/AppsDesktop.tsx | 331 ++++++++------- src/components/Desktop/DesktopFooter.tsx | 124 ++---- src/components/DesktopSideBar.tsx | 28 +- src/components/Mobile/MobileHeader.tsx | 388 +++++++++-------- src/components/Save/Save.tsx | 504 +++++++++++------------ 9 files changed, 766 insertions(+), 701 deletions(-) diff --git a/src/assets/Icons/AppsIcon.tsx b/src/assets/Icons/AppsIcon.tsx index 753fe17..d2ad47c 100644 --- a/src/assets/Icons/AppsIcon.tsx +++ b/src/assets/Icons/AppsIcon.tsx @@ -1,6 +1,8 @@ -import React from "react"; +import { useTheme } from "@mui/material"; + +export const AppsIcon = ({ height = 31, width = 31 }) => { + const theme = useTheme(); -export const AppsIcon = ({ color, height = 31, width = 31 }) => { return ( { > ); diff --git a/src/assets/Icons/HomeIcon.tsx b/src/assets/Icons/HomeIcon.tsx index 38f880d..7659119 100644 --- a/src/assets/Icons/HomeIcon.tsx +++ b/src/assets/Icons/HomeIcon.tsx @@ -1,12 +1,20 @@ -import React from 'react'; +import { useTheme } from "@mui/material"; -export const HomeIcon= ({ color, height = 20, width = 23 }) => { - return ( - - - - +export const HomeIcon = ({ height = 20, width = 23 }) => { + const theme = useTheme(); - ); - }; - \ No newline at end of file + return ( + + + + ); +}; diff --git a/src/assets/Icons/MessagingIcon.tsx b/src/assets/Icons/MessagingIcon.tsx index c1e11a6..c14d1d3 100644 --- a/src/assets/Icons/MessagingIcon.tsx +++ b/src/assets/Icons/MessagingIcon.tsx @@ -1,6 +1,10 @@ -import React from "react"; +import { useTheme } from "@mui/material"; export const MessagingIcon = ({ color, height = 31, width = 31 }) => { + const theme = useTheme(); + + const setColor = color ? color : theme.palette.text.primary + return ( { > { + const theme = useTheme(); + + const setColor = color ? color : theme.palette.text.primary -export const SaveIcon = ({color = '#8F8F91'}) => { return ( - - - - - ) -} + + + + ); +}; diff --git a/src/components/Apps/AppsDesktop.tsx b/src/components/Apps/AppsDesktop.tsx index 20a3d54..756a1d9 100644 --- a/src/components/Apps/AppsDesktop.tsx +++ b/src/components/Apps/AppsDesktop.tsx @@ -1,7 +1,13 @@ -import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; +import React, { + useContext, + useEffect, + useMemo, + useRef, + useState, +} from "react"; import { AppsHomeDesktop } from "./AppsHomeDesktop"; import { Spacer } from "../../common/Spacer"; -import { GlobalContext, MyContext, getBaseApiReact } from "../../App"; +import { GlobalContext, getBaseApiReact } from "../../App"; import { AppInfo } from "./AppInfo"; import { executeEvent, @@ -15,47 +21,58 @@ import { AppPublish } from "./AppPublish"; import { AppsLibraryDesktop } from "./AppsLibraryDesktop"; import { AppsCategoryDesktop } from "./AppsCategoryDesktop"; import { AppsNavBarDesktop } from "./AppsNavBarDesktop"; -import { Box, ButtonBase } from "@mui/material"; +import { Box, ButtonBase, useTheme } from "@mui/material"; import { HomeIcon } from "../../assets/Icons/HomeIcon"; import { MessagingIcon } from "../../assets/Icons/MessagingIcon"; import { Save } from "../Save/Save"; -import { HubsIcon } from "../../assets/Icons/HubsIcon"; -import { CoreSyncStatus } from "../CoreSyncStatus"; import { IconWrapper } from "../Desktop/DesktopFooter"; -import AppIcon from "../../assets/svgs/AppIcon.svg"; import { useRecoilState } from "recoil"; import { enabledDevModeAtom } from "../../atoms/global"; import { AppsIcon } from "../../assets/Icons/AppsIcon"; const uid = new ShortUniqueId({ length: 8 }); -export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktopSideView, hasUnreadDirects, isDirects, isGroups, hasUnreadGroups, toggleSideViewGroups, toggleSideViewDirects, setDesktopViewMode, isApps, desktopViewMode}) => { +export const AppsDesktop = ({ + mode, + setMode, + show, + myName, + goToHome, + hasUnreadDirects, + hasUnreadGroups, + setDesktopViewMode, + desktopViewMode, +}) => { const [availableQapps, setAvailableQapps] = useState([]); const [selectedAppInfo, setSelectedAppInfo] = useState(null); - const [selectedCategory, setSelectedCategory] = useState(null) + const [selectedCategory, setSelectedCategory] = useState(null); const [tabs, setTabs] = useState([]); const [selectedTab, setSelectedTab] = useState(null); const [isNewTabWindow, setIsNewTabWindow] = useState(false); - const [categories, setCategories] = useState([]) + const [categories, setCategories] = useState([]); const iframeRefs = useRef({}); - const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom) + const [isEnabledDevMode, setIsEnabledDevMode] = + useRecoilState(enabledDevModeAtom); const { showTutorial } = useContext(GlobalContext); + const theme = useTheme(); - const myApp = useMemo(()=> { - - return availableQapps.find((app)=> app.name === myName && app.service === 'APP') - }, [myName, availableQapps]) - const myWebsite = useMemo(()=> { - - return availableQapps.find((app)=> app.name === myName && app.service === 'WEBSITE') - }, [myName, availableQapps]) + const myApp = useMemo(() => { + return availableQapps.find( + (app) => app.name === myName && app.service === "APP" + ); + }, [myName, availableQapps]); + const myWebsite = useMemo(() => { + return availableQapps.find( + (app) => app.name === myName && app.service === "WEBSITE" + ); + }, [myName, availableQapps]); - useEffect(()=> { - if(show){ - showTutorial('qapps') + useEffect(() => { + if (show) { + showTutorial("qapps"); } - }, [show]) + }, [show]); useEffect(() => { setTimeout(() => { @@ -81,10 +98,10 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop }); if (!response?.ok) return; const responseData = await response.json(); - + setCategories(responseData); - } catch (error) { + console.log(error); } finally { // dispatch(setIsLoadingGlobal(false)) } @@ -115,18 +132,19 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop }); if (!responseWebsites?.ok) return; const responseDataWebsites = await responseWebsites.json(); - + apps = responseData; websites = responseDataWebsites; const combine = [...apps, ...websites]; setAvailableQapps(combine); } catch (error) { + console.log(error); } finally { // dispatch(setIsLoadingGlobal(false)) } }, []); useEffect(() => { - getCategories() + getCategories(); }, [getCategories]); useEffect(() => { @@ -163,12 +181,13 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop subscribeToEvent("selectedAppInfoCategory", selectedAppInfoCategoryFunc); return () => { - unsubscribeFromEvent("selectedAppInfoCategory", selectedAppInfoCategoryFunc); + unsubscribeFromEvent( + "selectedAppInfoCategory", + selectedAppInfoCategoryFunc + ); }; }, []); - - const selectedCategoryFunc = (e) => { const data = e.detail?.data; setSelectedCategory(data); @@ -183,35 +202,37 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop }; }, []); - - - - - const navigateBackFunc = (e) => { - if (['category', 'appInfo-from-category', 'appInfo', 'library', 'publish'].includes(mode)) { + if ( + [ + "category", + "appInfo-from-category", + "appInfo", + "library", + "publish", + ].includes(mode) + ) { // Handle the various modes as needed - if (mode === 'category') { - setMode('library'); + if (mode === "category") { + setMode("library"); setSelectedCategory(null); - } else if (mode === 'appInfo-from-category') { - setMode('category'); - } else if (mode === 'appInfo') { - setMode('library'); - } else if (mode === 'library') { + } else if (mode === "appInfo-from-category") { + setMode("category"); + } else if (mode === "appInfo") { + setMode("library"); + } else if (mode === "library") { if (isNewTabWindow) { - setMode('viewer'); + setMode("viewer"); } else { - setMode('home'); + setMode("home"); } - } else if (mode === 'publish') { - setMode('library'); + } else if (mode === "publish") { + setMode("library"); } - } else if(selectedTab?.tabId) { - executeEvent(`navigateBackApp-${selectedTab?.tabId}`, {}) + } else if (selectedTab?.tabId) { + executeEvent(`navigateBackApp-${selectedTab?.tabId}`, {}); } }; - useEffect(() => { subscribeToEvent("navigateBack", navigateBackFunc); @@ -234,8 +255,6 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop setIsNewTabWindow(false); }; - - useEffect(() => { subscribeToEvent("addTab", addTabFunc); @@ -245,7 +264,7 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop }, [tabs]); const setSelectedTabFunc = (e) => { const data = e.detail?.data; - if(e.detail?.isDevMode) return + if (e.detail?.isDevMode) return; setSelectedTab(data); setTimeout(() => { @@ -259,7 +278,6 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop }, 100); setIsNewTabWindow(false); }; - useEffect(() => { subscribeToEvent("setSelectedTab", setSelectedTabFunc); @@ -299,7 +317,7 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop const setNewTabWindowFunc = (e) => { setIsNewTabWindow(true); - setSelectedTab(null) + setSelectedTab(null); }; useEffect(() => { @@ -314,70 +332,65 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop - - + { goToHome(); - }} > - - - + + { - setDesktopViewMode('apps') + setDesktopViewMode("apps"); + }} + > + + + + + + { + setDesktopViewMode("chat"); }} > - - - - { - setDesktopViewMode('chat') - }} - > - - + {/* { @@ -416,65 +429,78 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop /> */} - + {isEnabledDevMode && ( - { - setDesktopViewMode('dev') - }} - > - - - - + { + setDesktopViewMode("dev"); + }} + > + + + + )} - {mode !== 'home' && ( - - + {mode !== "home" && ( + )} + - - - {mode === "home" && ( - - - - + + + )} - - - - {mode === "appInfo" && !selectedTab && } - {mode === "appInfo-from-category" && !selectedTab && } - - {mode === "publish" && !selectedTab && } + availableQapps={availableQapps} + setMode={setMode} + myName={myName} + hasPublishApp={!!(myApp || myWebsite)} + categories={categories} + getQapps={getQapps} + /> + + {mode === "appInfo" && !selectedTab && ( + + )} + {mode === "appInfo-from-category" && !selectedTab && ( + + )} + + {mode === "publish" && !selectedTab && ( + + )} {tabs.map((tab) => { if (!iframeRefs.current[tab.tabId]) { iframeRefs.current[tab.tabId] = React.createRef(); } return ( - - - - + + + )} diff --git a/src/components/Desktop/DesktopFooter.tsx b/src/components/Desktop/DesktopFooter.tsx index 6da8f4e..aa2e864 100644 --- a/src/components/Desktop/DesktopFooter.tsx +++ b/src/components/Desktop/DesktopFooter.tsx @@ -1,17 +1,6 @@ -import * as React from "react"; -import { - BottomNavigation, - BottomNavigationAction, - ButtonBase, - Typography, -} from "@mui/material"; -import { Home, Groups, Message, ShowChart } from "@mui/icons-material"; +import { ButtonBase, Typography, useTheme } from "@mui/material"; import Box from "@mui/material/Box"; -import BottomLogo from "../../assets/svgs/BottomLogo5.svg"; -import { CustomSvg } from "../../common/CustomSvg"; -import { WalletIcon } from "../../assets/Icons/WalletIcon"; import { HubsIcon } from "../../assets/Icons/HubsIcon"; -import { TradingIcon } from "../../assets/Icons/TradingIcon"; import { MessagingIcon } from "../../assets/Icons/MessagingIcon"; import AppIcon from "../../assets/svgs/AppIcon.svg"; @@ -20,19 +9,31 @@ import { Save } from "../Save/Save"; import { useRecoilState } from "recoil"; import { enabledDevModeAtom } from "../../atoms/global"; -export const IconWrapper = ({ children, label, color, selected, disableWidth, customWidth }) => { +export const IconWrapper = ({ + children, + label, + color, + selected, + disableWidth, + customWidth, +}) => { + const theme = useTheme(); + return ( {children} @@ -41,7 +42,7 @@ export const IconWrapper = ({ children, label, color, selected, disableWidth, cu fontFamily: "Inter", fontSize: "12px", fontWeight: 500, - color: color, + color: theme.palette.text.primary, }} > {label} @@ -51,24 +52,7 @@ export const IconWrapper = ({ children, label, color, selected, disableWidth, cu }; export const DesktopFooter = ({ - selectedGroup, - groupSection, - isUnread, - goToAnnouncements, - isUnreadChat, - goToChat, - goToThreads, - setOpenManageMembers, - groupChatHasUnread, - groupsAnnHasUnread, - directChatHasUnread, - chatMode, - openDrawerGroups, goToHome, - setIsOpenDrawerProfile, - mobileViewMode, - setMobileViewMode, - setMobileViewModeKeepOpen, hasUnreadGroups, hasUnreadDirects, isHome, @@ -77,15 +61,14 @@ export const DesktopFooter = ({ setDesktopSideView, isApps, setDesktopViewMode, - desktopViewMode, hide, setIsOpenSideViewDirects, - setIsOpenSideViewGroups - + setIsOpenSideViewGroups, }) => { - const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom) + const [isEnabledDevMode, setIsEnabledDevMode] = + useRecoilState(enabledDevModeAtom); - if(hide) return + if (hide) return; return ( - + + { - setDesktopViewMode('apps') - setIsOpenSideViewDirects(false) - setIsOpenSideViewGroups(false) + setDesktopViewMode("apps"); + setIsOpenSideViewDirects(false); + setIsOpenSideViewGroups(false); }} > - - + + + { setDesktopSideView("groups"); }} > - + + { setDesktopSideView("directs"); }} > - + - + {isEnabledDevMode && ( { - setDesktopViewMode('dev') - setIsOpenSideViewDirects(false) - setIsOpenSideViewGroups(false) - }} - > - { + setDesktopViewMode("dev"); + setIsOpenSideViewDirects(false); + setIsOpenSideViewGroups(false); + }} > - - - + + + + )} - ); diff --git a/src/components/DesktopSideBar.tsx b/src/components/DesktopSideBar.tsx index 244370e..5c5ec01 100644 --- a/src/components/DesktopSideBar.tsx +++ b/src/components/DesktopSideBar.tsx @@ -1,12 +1,8 @@ -import { Box, ButtonBase } from "@mui/material"; -import React from "react"; +import { Box, ButtonBase, useTheme } from "@mui/material"; import { HomeIcon } from "../assets/Icons/HomeIcon"; import { MessagingIcon } from "../assets/Icons/MessagingIcon"; import { Save } from "./Save/Save"; -import { HubsIcon } from "../assets/Icons/HubsIcon"; -import { CoreSyncStatus } from "./CoreSyncStatus"; import { IconWrapper } from "./Desktop/DesktopFooter"; -import AppIcon from "./../assets/svgs/AppIcon.svg"; import { useRecoilState } from "recoil"; import { enabledDevModeAtom } from "../atoms/global"; import { AppsIcon } from "../assets/Icons/AppsIcon"; @@ -28,6 +24,8 @@ export const DesktopSideBar = ({ }) => { const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom); + + const theme = useTheme(); return ( + { setDesktopViewMode("chat"); @@ -85,9 +79,7 @@ export const DesktopSideBar = ({ color={ hasUnreadDirects || hasUnreadGroups ? "var(--unread)" - : desktopViewMode === "chat" - ? "white" - : "rgba(250, 250, 250, 0.5)" + : theme.palette.text.primary } label="Chat" disableWidth @@ -97,9 +89,7 @@ export const DesktopSideBar = ({ color={ hasUnreadDirects || hasUnreadGroups ? "var(--unread)" - : desktopViewMode === "chat" - ? "white" - : "rgba(250, 250, 250, 0.5)" + : theme.palette.text.primary } /> @@ -131,16 +121,10 @@ export const DesktopSideBar = ({ }} > diff --git a/src/components/Mobile/MobileHeader.tsx b/src/components/Mobile/MobileHeader.tsx index cd98ba9..1ab74dc 100644 --- a/src/components/Mobile/MobileHeader.tsx +++ b/src/components/Mobile/MobileHeader.tsx @@ -20,7 +20,7 @@ import { MessagingIcon } from "../../assets/Icons/MessagingIcon"; import { MessagingIcon2 } from "../../assets/Icons/MessagingIcon2"; import { HubsIcon } from "../../assets/Icons/HubsIcon"; import { Save } from "../Save/Save"; -import CloseFullscreenIcon from '@mui/icons-material/CloseFullscreen'; +import CloseFullscreenIcon from "@mui/icons-material/CloseFullscreen"; import { useRecoilState } from "recoil"; import { fullScreenAtom, hasSettingsChangedAtom } from "../../atoms/global"; import { useAppFullScreen } from "../../useAppFullscreen"; @@ -36,12 +36,12 @@ const Header = ({ setMobileViewMode, myName, setSelectedDirect, - setNewChat + setNewChat, }) => { const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); const [fullScreen, setFullScreen] = useRecoilState(fullScreenAtom); - const {exitFullScreen} = useAppFullScreen(setFullScreen) + const { exitFullScreen } = useAppFullScreen(setFullScreen); const handleClick = (event) => { setAnchorEl(event.currentTarget); }; @@ -77,34 +77,39 @@ const Header = ({ }} > { setMobileViewModeKeepOpen(""); goToHome(); }} // onClick={onHomeClick} > - + - - + + {fullScreen && ( - { - exitFullScreen() - setFullScreen(false) - }}> - - + { + exitFullScreen(); + setFullScreen(false); + }} + > + + )} - {/* Center Title */} @@ -135,14 +140,15 @@ const Header = ({ setMobileViewModeKeepOpen("messaging"); }} > - - + - { - setSelectedDirect(null) - setNewChat(false) - setMobileViewMode("groups"); - setMobileViewModeKeepOpen("") - handleClose(); + marginTop: "10px", }} > - - - - - - { - setMobileViewModeKeepOpen("messaging"); + { + setSelectedDirect(null); + setNewChat(false); + setMobileViewMode("groups"); + setMobileViewModeKeepOpen(""); + handleClose(); + }} + > + + + + + + { + setMobileViewModeKeepOpen("messaging"); - handleClose(); - }} - > - - - - - - + handleClose(); + }} + > + + + + + + ); } @@ -255,24 +282,27 @@ const Header = ({ width: "75px", }} > - - - - {fullScreen && ( - { - exitFullScreen() - setFullScreen(false) - }}> - - + + + + {fullScreen && ( + { + exitFullScreen(); + setFullScreen(false); + }} + > + + )} - + {/* Center Title */} - {/* Right Logout Icon */} - - + - - + // onClick={onLogoutClick} + > + + @@ -357,8 +386,14 @@ const Header = ({ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.3)", // Optional shadow for the circle }} > - - + + @@ -389,6 +424,7 @@ const Header = ({ */} + { setMobileViewMode("groups"); - setMobileViewModeKeepOpen("") + setMobileViewModeKeepOpen(""); handleClose(); }} > - - + + - + + { setMobileViewModeKeepOpen("messaging"); @@ -450,21 +495,32 @@ const Header = ({ handleClose(); }} > - - + + - + - + ); }; diff --git a/src/components/Save/Save.tsx b/src/components/Save/Save.tsx index 0c01315..273da15 100644 --- a/src/components/Save/Save.tsx +++ b/src/components/Save/Save.tsx @@ -22,20 +22,22 @@ import { LoadingButton } from "@mui/lab"; import { saveToLocalStorage } from "../Apps/AppsNavBar"; import { decryptData, encryptData } from "../../qortalRequests/get"; import { saveFileToDiskGeneric } from "../../utils/generateWallet/generateWallet"; -import { base64ToUint8Array, uint8ArrayToObject } from "../../backgroundFunctions/encryption"; - +import { + base64ToUint8Array, + uint8ArrayToObject, +} from "../../backgroundFunctions/encryption"; export const handleImportClick = async () => { - const fileInput = document.createElement('input'); - fileInput.type = 'file'; - fileInput.accept = '.base64,.txt'; + const fileInput = document.createElement("input"); + fileInput.type = "file"; + fileInput.accept = ".base64,.txt"; // Create a promise to handle file selection and reading synchronously return await new Promise((resolve, reject) => { fileInput.onchange = () => { const file = fileInput.files[0]; if (!file) { - reject(new Error('No file selected')); + reject(new Error("No file selected")); return; } @@ -44,7 +46,7 @@ export const handleImportClick = async () => { resolve(e.target.result); // Resolve with the file content }; reader.onerror = () => { - reject(new Error('Error reading file')); + reject(new Error("Error reading file")); }; reader.readAsText(file); // Read the file as text (Base64 string) @@ -53,8 +55,7 @@ export const handleImportClick = async () => { // Trigger the file input dialog fileInput.click(); }); - -} +}; export const Save = ({ isDesktop, disableWidth, myName }) => { const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom); @@ -65,7 +66,8 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { settingsLocalLastUpdatedAtom ); const setHasSettingsChangedAtom = useSetRecoilState(hasSettingsChangedAtom); - const [isUsingImportExportSettings, setIsUsingImportExportSettings] = useRecoilState(isUsingImportExportSettingsAtom); + const [isUsingImportExportSettings, setIsUsingImportExportSettings] = + useRecoilState(isUsingImportExportSettingsAtom); const [canSave] = useRecoilState(canSaveSettingToQdnAtom); const [openSnack, setOpenSnack] = useState(false); @@ -104,8 +106,6 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { settingsLocalLastUpdated, ]); - - useEffect(() => { setHasSettingsChangedAtom(hasChanged); }, [hasChanged]); @@ -176,7 +176,7 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { message: "Sucessfully published to QDN", }); setOpenSnack(true); - setAnchorEl(null) + setAnchorEl(null); } } } catch (error) { @@ -197,7 +197,7 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { const revertChanges = () => { setPinnedApps(oldPinnedApps); saveToLocalStorage("ext_saved_settings", "sortablePinnedApps", null); - setAnchorEl(null) + setAnchorEl(null); }; return ( @@ -207,37 +207,22 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { disabled={ // !hasChanged || // !canSave || - isLoading + isLoading // settingsQdnLastUpdated === -100 } > {isDesktop ? ( ) : ( - + )} { > {isUsingImportExportSettings && ( - + { - - + opacity: 1, + }, + }} + > + Use QDN saving + + + )} {!isUsingImportExportSettings && ( - {!myName ? ( - - - You need a registered Qortal name to save your pinned apps to QDN. - - - ) : ( - <> - {hasChanged && ( { fontSize: "14px", }} > - You have unsaved changes to your pinned apps. Save them to QDN. + You need a registered Qortal name to save your pinned apps to + QDN. - - - Save to QDN - - - {!isNaN(settingsQdnLastUpdated) && settingsQdnLastUpdated > 0 && ( - <> + + ) : ( + <> + {hasChanged && ( + - Don't like your current local changes? Would you like to - reset to your saved QDN pinned apps? + You have unsaved changes to your pinned apps. Save them to + QDN. - Revert to QDN + Save to QDN - + + {!isNaN(settingsQdnLastUpdated) && + settingsQdnLastUpdated > 0 && ( + <> + + Don't like your current local changes? Would you + like to reset to your saved QDN pinned apps? + + + + Revert to QDN + + + )} + {!isNaN(settingsQdnLastUpdated) && + settingsQdnLastUpdated === 0 && ( + <> + + Don't like your current local changes? Would you + like to reset to the default pinned apps? + + + + Revert to default + + + )} + )} - {!isNaN(settingsQdnLastUpdated) && settingsQdnLastUpdated === 0 && ( - <> + {!isNaN(settingsQdnLastUpdated) && + settingsQdnLastUpdated === -100 && + isUsingImportExportSettings !== true && ( + + + The app was unable to download your existing QDN-saved + pinned apps. Would you like to overwrite those changes? + + + + Overwrite to QDN + + + )} + {!hasChanged && ( + - Don't like your current local changes? Would you like to - reset to the default pinned apps? + You currently do not have any changes to your pinned apps - - - Revert to default - - + )} - - )} - {!isNaN(settingsQdnLastUpdated) && settingsQdnLastUpdated === -100 && isUsingImportExportSettings !== true && ( - - - The app was unable to download your existing QDN-saved pinned - apps. Would you like to overwrite those changes? - - - - Overwrite to QDN - - - )} - {!hasChanged && ( - - - You currently do not have any changes to your pinned apps - - - - )} )} - )} - + - - { - try { - const fileContent = await handleImportClick(); - const decryptedData = await decryptData({ - encryptedData: fileContent, - }); - const decryptToUnit8ArraySubject = - base64ToUint8Array(decryptedData); - const responseData = uint8ArrayToObject( - decryptToUnit8ArraySubject - ); - if(Array.isArray(responseData)){ - saveToLocalStorage("ext_saved_settings_import_export", "sortablePinnedApps", responseData, { - isUsingImportExport: true - }); - setPinnedApps(responseData) - setOldPinnedApps(responseData) - setIsUsingImportExportSettings(true) - } - - } catch (error) { - console.log("error", error); + { + try { + const fileContent = await handleImportClick(); + const decryptedData = await decryptData({ + encryptedData: fileContent, + }); + const decryptToUnit8ArraySubject = + base64ToUint8Array(decryptedData); + const responseData = uint8ArrayToObject( + decryptToUnit8ArraySubject + ); + if (Array.isArray(responseData)) { + saveToLocalStorage( + "ext_saved_settings_import_export", + "sortablePinnedApps", + responseData, + { + isUsingImportExport: true, } - }}> - - Import - - { - try { - const data64 = await objectToBase64(pinnedApps); - - const encryptedData = await encryptData({ - data64, - }); - const blob = new Blob([encryptedData], { - type: "text/plain", - }); - - const timestamp = new Date() - .toISOString() - .replace(/:/g, "-"); // Safe timestamp for filenames - const filename = `qortal-new-ui-backup-settings-${timestamp}.txt`; - await saveFileToDiskGeneric(blob, filename) - - } catch (error) { - console.log('error', error) - } - }}> - Export + ); + setPinnedApps(responseData); + setOldPinnedApps(responseData); + setIsUsingImportExportSettings(true); + } + } catch (error) { + console.log("error", error); + } + }} + > + Import - - + { + try { + const data64 = await objectToBase64(pinnedApps); + + const encryptedData = await encryptData({ + data64, + }); + const blob = new Blob([encryptedData], { + type: "text/plain", + }); + + const timestamp = new Date().toISOString().replace(/:/g, "-"); // Safe timestamp for filenames + const filename = `qortal-new-ui-backup-settings-${timestamp}.txt`; + await saveFileToDiskGeneric(blob, filename); + } catch (error) { + console.log("error", error); + } + }} + > + Export + + + Date: Sun, 16 Mar 2025 17:31:25 +0100 Subject: [PATCH 56/77] Added qortal request arrr sync status --- .../Apps/useQortalMessageListener.tsx | 6 ++- src/qortalRequests.ts | 48 ++++++++++++++++--- src/qortalRequests/get.ts | 30 ++++++++++++ 3 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index 6ff79ab..ffc0ccd 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -253,7 +253,8 @@ export const listOfAllQortalRequests = [ 'CREATE_GROUP', 'GET_USER_WALLET_TRANSACTIONS', 'GET_NODE_INFO', - 'GET_NODE_STATUS' + 'GET_NODE_STATUS', + 'GET_ARRR_SYNC_STATUS' ] export const UIQortalRequests = [ @@ -307,7 +308,8 @@ export const UIQortalRequests = [ 'CREATE_GROUP', 'GET_USER_WALLET_TRANSACTIONS', 'GET_NODE_INFO', - 'GET_NODE_STATUS' + 'GET_NODE_STATUS', + 'GET_ARRR_SYNC_STATUS' ]; diff --git a/src/qortalRequests.ts b/src/qortalRequests.ts index 18457da..0c890ba 100644 --- a/src/qortalRequests.ts +++ b/src/qortalRequests.ts @@ -1,10 +1,8 @@ import { gateways, getApiKeyFromStorage } from "./background"; import { listOfAllQortalRequests } from "./components/Apps/useQortalMessageListener"; -import { addForeignServer, addGroupAdminRequest, addListItems, adminAction, banFromGroupRequest, cancelGroupBanRequest, cancelGroupInviteRequest, cancelSellOrder, createAndCopyEmbedLink, createBuyOrder, createGroupRequest, createPoll, createSellOrder, decryptAESGCMRequest, decryptData, decryptDataWithSharingKey, decryptQortalGroupData, deleteHostedData, deleteListItems, deployAt, encryptData, encryptDataWithSharingKey, encryptQortalGroupData, getCrossChainServerInfo, getDaySummary, getNodeInfo, getNodeStatus, getForeignFee, getHostedData, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getUserWalletTransactions, getWalletBalance, inviteToGroupRequest, joinGroup, kickFromGroupRequest, leaveGroupRequest, openNewTab, publishMultipleQDNResources, publishQDNResource, registerNameRequest, removeForeignServer, removeGroupAdminRequest, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, signTransaction, updateForeignFee, updateNameRequest, voteOnPoll } from "./qortalRequests/get"; +import { addForeignServer, addGroupAdminRequest, addListItems, adminAction, banFromGroupRequest, cancelGroupBanRequest, cancelGroupInviteRequest, cancelSellOrder, createAndCopyEmbedLink, createBuyOrder, createGroupRequest, createPoll, createSellOrder, decryptAESGCMRequest, decryptData, decryptDataWithSharingKey, decryptQortalGroupData, deleteHostedData, deleteListItems, deployAt, encryptData, encryptDataWithSharingKey, encryptQortalGroupData, getCrossChainServerInfo, getDaySummary, getNodeInfo, getNodeStatus, getForeignFee, getHostedData, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getUserWalletTransactions, getWalletBalance, inviteToGroupRequest, joinGroup, kickFromGroupRequest, leaveGroupRequest, openNewTab, publishMultipleQDNResources, publishQDNResource, registerNameRequest, removeForeignServer, removeGroupAdminRequest, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, signTransaction, updateForeignFee, updateNameRequest, voteOnPoll, getArrrSyncStatus } from "./qortalRequests/get"; import { getData, storeData } from "./utils/chromeStorage"; - - function getLocalStorage(key) { return getData(key).catch((error) => { console.error("Error retrieving data:", error); @@ -19,6 +17,7 @@ function setLocalStorage(key, data) { throw error; }); } + export const isRunningGateway = async ()=> { let isGateway = true; const apiKey = await getApiKeyFromStorage(); @@ -115,6 +114,7 @@ export const isRunningGateway = async ()=> { } break; } + case "ENCRYPT_QORTAL_GROUP_DATA": { try { const res = await encryptQortalGroupData(request.payload, event.source); @@ -134,6 +134,7 @@ export const isRunningGateway = async ()=> { } break; } + case "DECRYPT_QORTAL_GROUP_DATA": { try { const res = await decryptQortalGroupData(request.payload, event.source); @@ -353,9 +354,7 @@ export const isRunningGateway = async ()=> { } break; } - - - + case "DEPLOY_AT": { try { const res = await deployAt(request.payload, isFromExtension); @@ -715,6 +714,7 @@ export const isRunningGateway = async ()=> { } break; } + case "CREATE_TRADE_SELL_ORDER": { try { const res = await createSellOrder(request.payload, isFromExtension); @@ -734,6 +734,7 @@ export const isRunningGateway = async ()=> { } break; } + case "CANCEL_TRADE_SELL_ORDER": { try { const res = await cancelSellOrder(request.payload, isFromExtension); @@ -753,6 +754,7 @@ export const isRunningGateway = async ()=> { } break; } + case "IS_USING_PUBLIC_NODE": { try { let isGateway = await isRunningGateway() @@ -772,6 +774,7 @@ export const isRunningGateway = async ()=> { } break; } + case "ADMIN_ACTION": { try { const res = await adminAction(request.payload, isFromExtension) @@ -791,6 +794,7 @@ export const isRunningGateway = async ()=> { } break; } + case "SIGN_TRANSACTION": { try { const res = await signTransaction(request.payload, isFromExtension) @@ -810,6 +814,7 @@ export const isRunningGateway = async ()=> { } break; } + case "OPEN_NEW_TAB": { try { const res = await openNewTab(request.payload, isFromExtension) @@ -928,6 +933,7 @@ export const isRunningGateway = async ()=> { } break; } + case "SHOW_ACTIONS" : { try { @@ -947,6 +953,7 @@ export const isRunningGateway = async ()=> { } break; } + case "REGISTER_NAME" : { try { const res = await registerNameRequest(request.payload, isFromExtension) @@ -966,6 +973,7 @@ export const isRunningGateway = async ()=> { } break; } + case "UPDATE_NAME" : { try { const res = await updateNameRequest(request.payload, isFromExtension) @@ -1025,6 +1033,7 @@ export const isRunningGateway = async ()=> { } break; } + case "KICK_FROM_GROUP" : { try { const res = await kickFromGroupRequest(request.payload, isFromExtension) @@ -1044,6 +1053,7 @@ export const isRunningGateway = async ()=> { } break; } + case "BAN_FROM_GROUP" : { try { const res = await banFromGroupRequest(request.payload, isFromExtension) @@ -1083,6 +1093,7 @@ export const isRunningGateway = async ()=> { } break; } + case "ADD_GROUP_ADMIN" : { try { const res = await addGroupAdminRequest(request.payload, isFromExtension) @@ -1103,6 +1114,7 @@ export const isRunningGateway = async ()=> { } break; } + case "DECRYPT_AESGCM" : { try { const res = await decryptAESGCMRequest(request.payload, isFromExtension) @@ -1122,6 +1134,7 @@ export const isRunningGateway = async ()=> { } break; } + case "REMOVE_GROUP_ADMIN" : { try { const res = await removeGroupAdminRequest(request.payload, isFromExtension) @@ -1161,6 +1174,7 @@ export const isRunningGateway = async ()=> { } break; } + case "CREATE_GROUP" : { try { const res = await createGroupRequest(request.payload, isFromExtension) @@ -1180,6 +1194,27 @@ export const isRunningGateway = async ()=> { } break; } + + case "GET_ARRR_SYNC_STATUS": { + try { + const res = await getArrrSyncStatus(request.payload); + event.source.postMessage({ + requestId: request.requestId, + action: request.action, + payload: res, + type: "backgroundMessageResponse", + }, event.origin); + } catch (error) { + event.source.postMessage({ + requestId: request.requestId, + action: request.action, + error: error.message, + type: "backgroundMessageResponse", + }, event.origin); + } + break; + } + default: break; } @@ -1188,4 +1223,3 @@ export const isRunningGateway = async ()=> { // Initialize the message listener setupMessageListenerQortalRequest(); - diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index 30fd805..f220276 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -2948,6 +2948,36 @@ export const getNodeStatus = async () => { } }; +export const getArrrSyncStatus = async () => { + const resKeyPair = await getKeyPair(); + const parsedData = resKeyPair; + const arrrSeed = parsedData.arrrSeed58; + const url = `/crosschain/arrr/syncstatus`; // Simplified endpoint URL + + try { + const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL + const response = await fetch(endpoint, { + method: "POST", + headers: { + Accept: "*/*", + }, + body: arrrSeed + }); + + let res; + + try { + res = await response.clone().json(); + } catch (e) { + res = await response.text(); + } + + return res; // Return the full response + } catch (error) { + throw new Error(error?.message || "Error in retrieving arrr sync status"); + } +}; + export const sendCoin = async (data, isFromExtension) => { const requiredFields = ["coin", "amount"]; const missingFields: string[] = []; From c516c36425b0f3694a7c1980ee5ba63bb31e39bd Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sun, 16 Mar 2025 22:42:28 +0200 Subject: [PATCH 57/77] fixes --- src/ExtStates/NotAuthenticated.tsx | 65 +++++++++++++++++++--- src/components/Apps/AppViewerContainer.tsx | 3 +- src/components/Apps/AppsDevMode.tsx | 5 +- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index cf734e4..bdb452f 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -19,6 +19,7 @@ import { Input, styled, Switch, + TextField, Typography, } from "@mui/material"; import Logo1Dark from "../assets/svgs/Logo1Dark.svg"; @@ -77,6 +78,8 @@ export const NotAuthenticated = ({ //add and edit states const [url, setUrl] = React.useState("https://"); const [customApikey, setCustomApiKey] = React.useState(""); + const [showSelectApiKey, setShowSelectApiKey] = useState(false) + const [enteredApiKey, setEnteredApiKey] = useState('') const [customNodeToSaveIndex, setCustomNodeToSaveIndex] = React.useState(null); const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext); @@ -86,6 +89,7 @@ export const NotAuthenticated = ({ const hasLocalNodeRef = useRef(null); const isLocal = cleanUrl(currentNode?.url) === "127.0.0.1:12391"; const handleFileChangeApiKey = (event) => { + setShowSelectApiKey(false) const file = event.target.files[0]; // Get the selected file if (file) { const reader = new FileReader(); @@ -250,6 +254,57 @@ export const NotAuthenticated = ({ apikey: importedApiKeyRef.current || key?.apikey, url: currentNodeRef.current?.url, }; + if(!payload?.apikey){ + try { + const generateUrl = "http://127.0.0.1:12391/admin/apikey/generate"; + const generateRes = await fetch(generateUrl, { + method: "POST", + }) + let res; + try { + res = await generateRes.clone().json(); + } catch (e) { + res = await generateRes.text(); + } + if (res != null && !res.error && res.length >= 8) { + payload = { + apikey: res, + url: currentNodeRef.current?.url, + }; + + setImportedApiKey(res); // Store the file content in the state + + setCustomNodes((prev)=> { + const copyPrev = [...prev] + const findLocalIndex = copyPrev?.findIndex((item)=> item?.url === 'http://127.0.0.1:12391') + if(findLocalIndex === -1){ + copyPrev.unshift({ + url: "http://127.0.0.1:12391", + apikey: res + }) + } else { + copyPrev[findLocalIndex] = { + url: "http://127.0.0.1:12391", + apikey: res + } + } + window + .sendMessage("setCustomNodes", copyPrev) + .catch((error) => { + console.error( + "Failed to set custom nodes:", + error.message || "An error occurred" + ); + }); + return copyPrev + }) + + + } + } catch (error) { + console.error(error) + } + } } else if (currentNodeRef.current) { payload = currentNodeRef.current; } @@ -603,14 +658,8 @@ export const NotAuthenticated = ({ {currentNode?.url === "http://127.0.0.1:12391" && ( <> - } style={{ - display: (!isSelected || hide) && 'none', + position: (!isSelected || hide) && 'absolute', + left: (!isSelected || hide) && '10000000px', height: customHeight ? customHeight : !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px)`, border: 'none', width: '100%', diff --git a/src/components/Apps/AppsDevMode.tsx b/src/components/Apps/AppsDevMode.tsx index 7bc7d4f..d569741 100644 --- a/src/components/Apps/AppsDevMode.tsx +++ b/src/components/Apps/AppsDevMode.tsx @@ -216,8 +216,9 @@ export const AppsDevMode = ({ mode, setMode, show , myName, goToHome, setDesktop return ( From 4b5f3f1c02efb97344629a7843b815c0c785bc50 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 19 Mar 2025 07:17:40 +0200 Subject: [PATCH 58/77] fix query --- src/components/Apps/AppViewer.tsx | 10 ++++++---- src/components/Group/WalletsAppWrapper.tsx | 9 +++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/components/Apps/AppViewer.tsx b/src/components/Apps/AppViewer.tsx index cd9cf94..11188a9 100644 --- a/src/components/Apps/AppViewer.tsx +++ b/src/components/Apps/AppViewer.tsx @@ -25,8 +25,12 @@ export const AppViewer = React.forwardRef(({ app , hide, isDevMode, skipAuth}, i setUrl(app?.url) return } - - setUrl(`${getBaseApiReact()}/render/${app?.service}/${app?.name}${app?.path != null ? `/${app?.path}` : ''}?theme=dark&identifier=${(app?.identifier != null && app?.identifier != 'null') ? app?.identifier : ''}`) + let hasQueryParam = false + if(app?.path && app.path.includes('?')){ + hasQueryParam = true + } + + setUrl(`${getBaseApiReact()}/render/${app?.service}/${app?.name}${app?.path != null ? `/${app?.path}` : ''}${hasQueryParam ? "&": "?" }theme=dark&identifier=${(app?.identifier != null && app?.identifier != 'null') ? app?.identifier : ''}`) }, [app?.service, app?.name, app?.identifier, app?.path, app?.isPreview]) useEffect(()=> { @@ -44,7 +48,6 @@ export const AppViewer = React.forwardRef(({ app , hide, isDevMode, skipAuth}, i const {tabId} = e.detail if(tabId === app?.tabId){ if(isDevMode){ - resetHistory() if(!app?.isPreview || app?.isPrivate){ setUrl(app?.url + `?time=${Date.now()}`) @@ -52,7 +55,6 @@ export const AppViewer = React.forwardRef(({ app , hide, isDevMode, skipAuth}, i return } - const constructUrl = `${getBaseApiReact()}/render/${app?.service}/${app?.name}${path != null ? path : ''}?theme=dark&identifier=${app?.identifier != null ? app?.identifier : ''}&time=${new Date().getMilliseconds()}` setUrl(constructUrl) } diff --git a/src/components/Group/WalletsAppWrapper.tsx b/src/components/Group/WalletsAppWrapper.tsx index 00218a7..788a36a 100644 --- a/src/components/Group/WalletsAppWrapper.tsx +++ b/src/components/Group/WalletsAppWrapper.tsx @@ -29,7 +29,7 @@ export const WalletsAppWrapper = () => { tabId: "5558589", name: "Q-Wallets", service: "APP", - path: '/qortal' + path: 'qortal?authOnMount=true' }); const isDisableBackButton = useMemo(() => { @@ -66,11 +66,8 @@ export const WalletsAppWrapper = () => { Date: Wed, 19 Mar 2025 17:17:36 +0200 Subject: [PATCH 59/77] update version --- electron/package.json | 2 +- src/ExtStates/NotAuthenticated.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/electron/package.json b/electron/package.json index b520190..31f5372 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "qortal-hub", - "version": "0.5.2", + "version": "0.5.3", "description": "A desktop app that gives you access to the Qortal network", "author": { "name": "", diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index bdb452f..fc2eaa1 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -31,7 +31,7 @@ import Tooltip, { TooltipProps, tooltipClasses } from "@mui/material/Tooltip"; import ThemeSelector from "../components/Theme/ThemeSelector"; const manifestData = { - version: "0.5.2", + version: "0.5.3", }; export const HtmlTooltip = styled(({ className, ...props }: TooltipProps) => ( From 7446ca967788c7be7f1c2801b4d279da95f9c7de Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 19 Mar 2025 18:05:54 +0200 Subject: [PATCH 60/77] update plist --- electron/buildmac/entitlements.mac.plist | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/electron/buildmac/entitlements.mac.plist b/electron/buildmac/entitlements.mac.plist index d6b93bc..0afbf6a 100644 --- a/electron/buildmac/entitlements.mac.plist +++ b/electron/buildmac/entitlements.mac.plist @@ -2,7 +2,23 @@ - com.apple.security.cs.allow-unsigned-executable-memory + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.inherit + + com.apple.security.automation.apple-events + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.device.microphone + + com.apple.security.device.bluetooth - + \ No newline at end of file From 11abb116ec95b66131d9d6926ff19b516de8b0ad Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 19 Mar 2025 19:13:55 +0200 Subject: [PATCH 61/77] fix overflow --- src/components/Apps/AppViewerContainer.tsx | 4 ++-- src/components/Apps/AppsDevMode.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Apps/AppViewerContainer.tsx b/src/components/Apps/AppViewerContainer.tsx index 2029b0b..9eda840 100644 --- a/src/components/Apps/AppViewerContainer.tsx +++ b/src/components/Apps/AppViewerContainer.tsx @@ -35,8 +35,8 @@ const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, } style={{ - position: (!isSelected || hide) && 'absolute', - left: (!isSelected || hide) && '10000000px', + position: (!isSelected || hide) && 'fixed', + left: (!isSelected || hide) && '-10000000px', height: customHeight ? customHeight : !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px)`, border: 'none', width: '100%', diff --git a/src/components/Apps/AppsDevMode.tsx b/src/components/Apps/AppsDevMode.tsx index d569741..612d1b3 100644 --- a/src/components/Apps/AppsDevMode.tsx +++ b/src/components/Apps/AppsDevMode.tsx @@ -217,8 +217,8 @@ export const AppsDevMode = ({ mode, setMode, show , myName, goToHome, setDesktop From da95b3435ff119ca9b20593783523fd29b1f7630 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 19 Mar 2025 19:50:52 +0200 Subject: [PATCH 62/77] Revert "fix overflow" This reverts commit 0240c1636141883106ac2a485775974beb2c831e. --- src/components/Apps/AppViewerContainer.tsx | 4 ++-- src/components/Apps/AppsDevMode.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Apps/AppViewerContainer.tsx b/src/components/Apps/AppViewerContainer.tsx index 9eda840..2029b0b 100644 --- a/src/components/Apps/AppViewerContainer.tsx +++ b/src/components/Apps/AppViewerContainer.tsx @@ -35,8 +35,8 @@ const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, } style={{ - position: (!isSelected || hide) && 'fixed', - left: (!isSelected || hide) && '-10000000px', + position: (!isSelected || hide) && 'absolute', + left: (!isSelected || hide) && '10000000px', height: customHeight ? customHeight : !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px)`, border: 'none', width: '100%', diff --git a/src/components/Apps/AppsDevMode.tsx b/src/components/Apps/AppsDevMode.tsx index 612d1b3..d569741 100644 --- a/src/components/Apps/AppsDevMode.tsx +++ b/src/components/Apps/AppsDevMode.tsx @@ -217,8 +217,8 @@ export const AppsDevMode = ({ mode, setMode, show , myName, goToHome, setDesktop From d9c49fc2643f0db0d0d92ca1bf19bb8f96d2dbe7 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Thu, 20 Mar 2025 18:26:01 +0200 Subject: [PATCH 63/77] fix app container overflow --- src/App-styles.ts | 1 + src/components/Apps/AppViewerContainer.tsx | 4 ++-- src/components/Apps/AppsDevMode.tsx | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/App-styles.ts b/src/App-styles.ts index 21b911d..6100951 100644 --- a/src/App-styles.ts +++ b/src/App-styles.ts @@ -11,6 +11,7 @@ export const AppContainer = styled(Box)(({ theme }) => ({ radius: "15px", backgroundColor: theme.palette.background.default, color: theme.palette.text.primary, + overflow: 'hidden' })); export const AuthenticatedContainer = styled(Box)(({ theme }) => ({ diff --git a/src/components/Apps/AppViewerContainer.tsx b/src/components/Apps/AppViewerContainer.tsx index 2029b0b..194ae68 100644 --- a/src/components/Apps/AppViewerContainer.tsx +++ b/src/components/Apps/AppViewerContainer.tsx @@ -35,8 +35,8 @@ const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, isDevMode, } style={{ - position: (!isSelected || hide) && 'absolute', - left: (!isSelected || hide) && '10000000px', + position: (!isSelected || hide) && 'fixed', + left: (!isSelected || hide) && '-200vw', height: customHeight ? customHeight : !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px)`, border: 'none', width: '100%', diff --git a/src/components/Apps/AppsDevMode.tsx b/src/components/Apps/AppsDevMode.tsx index d569741..d4edc0c 100644 --- a/src/components/Apps/AppsDevMode.tsx +++ b/src/components/Apps/AppsDevMode.tsx @@ -217,8 +217,8 @@ export const AppsDevMode = ({ mode, setMode, show , myName, goToHome, setDesktop From 0a16655acb5c7cf32b244de47d96a4a49f8fd73a Mon Sep 17 00:00:00 2001 From: PhilReact Date: Tue, 1 Apr 2025 02:54:52 +0300 Subject: [PATCH 64/77] fix going back to public node --- src/App.tsx | 4 ++-- src/background.ts | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 8237a7b..75181e9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -265,7 +265,7 @@ export const getBaseApiReact = (customApi?: string) => { return customApi; } - if (globalApiKey) { + if (globalApiKey?.url) { return globalApiKey?.url; } else { return groupApi; @@ -291,7 +291,7 @@ export const getBaseApiReactSocket = (customApi?: string) => { return customApi; } - if (globalApiKey) { + if (globalApiKey?.url) { return `${ getProtocol(globalApiKey?.url) === "http" ? "ws://" : "wss://" }${cleanUrl(globalApiKey?.url)}`; diff --git a/src/background.ts b/src/background.ts index c43dacf..eab57c7 100644 --- a/src/background.ts +++ b/src/background.ts @@ -291,7 +291,8 @@ export const getBaseApi = async (customApi?: string) => { } const apiKey = await getApiKeyFromStorage(); // Retrieve apiKey asynchronously - if (apiKey) { + + if (apiKey?.url) { return apiKey?.url; } else { return groupApi; @@ -299,7 +300,7 @@ export const getBaseApi = async (customApi?: string) => { }; export const isUsingLocal = async () => { const apiKey = await getApiKeyFromStorage(); // Retrieve apiKey asynchronously - if (apiKey) { + if (apiKey?.url) { return true; } else { return false; @@ -313,7 +314,7 @@ export const createEndpoint = async (endpoint, customApi?: string) => { const apiKey = await getApiKeyFromStorage(); // Retrieve apiKey asynchronously - if (apiKey) { + if (apiKey?.url) { // Check if the endpoint already contains a query string const separator = endpoint.includes("?") ? "&" : "?"; return `${apiKey?.url}${endpoint}${separator}apiKey=${apiKey?.apikey}`; @@ -944,6 +945,7 @@ export async function getBalanceInfo() { const wallet = await getSaveWallet(); const address = wallet.address0; const validApi = await getBaseApi(); + const response = await fetch(validApi + "/addresses/balance/" + address); if (!response?.ok) throw new Error("0 QORT in your balance"); From 3611f5d33a6b6a4fb8b450a9fcdd1d2a59418990 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 2 Apr 2025 05:58:17 +0300 Subject: [PATCH 65/77] added pdf viewer and optimizations --- public/pdfjs/build/pdf.mjs | 21576 ++++++ public/pdfjs/build/pdf.sandbox.mjs | 242 + public/pdfjs/build/pdf.worker.mjs | 56979 ++++++++++++++++ public/pdfjs/web/debugger.css | 111 + public/pdfjs/web/debugger.mjs | 623 + public/pdfjs/web/images/altText_add.svg | 3 + .../pdfjs/web/images/altText_disclaimer.svg | 3 + public/pdfjs/web/images/altText_done.svg | 3 + public/pdfjs/web/images/altText_spinner.svg | 30 + public/pdfjs/web/images/altText_warning.svg | 3 + public/pdfjs/web/images/annotation-check.svg | 11 + .../pdfjs/web/images/annotation-comment.svg | 16 + public/pdfjs/web/images/annotation-help.svg | 26 + public/pdfjs/web/images/annotation-insert.svg | 10 + public/pdfjs/web/images/annotation-key.svg | 11 + .../web/images/annotation-newparagraph.svg | 11 + public/pdfjs/web/images/annotation-noicon.svg | 7 + public/pdfjs/web/images/annotation-note.svg | 42 + .../pdfjs/web/images/annotation-paperclip.svg | 6 + .../pdfjs/web/images/annotation-paragraph.svg | 16 + .../pdfjs/web/images/annotation-pushpin.svg | 7 + .../web/images/cursor-editorFreeHighlight.svg | 6 + .../web/images/cursor-editorFreeText.svg | 3 + public/pdfjs/web/images/cursor-editorInk.svg | 4 + .../web/images/cursor-editorTextHighlight.svg | 8 + .../web/images/editor-toolbar-delete.svg | 5 + .../pdfjs/web/images/findbarButton-next.svg | 3 + .../web/images/findbarButton-previous.svg | 3 + .../web/images/gv-toolbarButton-download.svg | 3 + public/pdfjs/web/images/loading-icon.gif | Bin 0 -> 2545 bytes public/pdfjs/web/images/loading.svg | 1 + .../web/images/messageBar_closingButton.svg | 3 + .../pdfjs/web/images/messageBar_warning.svg | 3 + ...ondaryToolbarButton-documentProperties.svg | 3 + .../secondaryToolbarButton-firstPage.svg | 3 + .../secondaryToolbarButton-handTool.svg | 3 + .../secondaryToolbarButton-lastPage.svg | 3 + .../secondaryToolbarButton-rotateCcw.svg | 3 + .../secondaryToolbarButton-rotateCw.svg | 3 + ...econdaryToolbarButton-scrollHorizontal.svg | 3 + .../secondaryToolbarButton-scrollPage.svg | 3 + .../secondaryToolbarButton-scrollVertical.svg | 3 + .../secondaryToolbarButton-scrollWrapped.svg | 3 + .../secondaryToolbarButton-selectTool.svg | 3 + .../secondaryToolbarButton-spreadEven.svg | 3 + .../secondaryToolbarButton-spreadNone.svg | 3 + .../secondaryToolbarButton-spreadOdd.svg | 3 + .../web/images/toolbarButton-bookmark.svg | 3 + .../toolbarButton-currentOutlineItem.svg | 3 + .../web/images/toolbarButton-download.svg | 4 + .../images/toolbarButton-editorFreeText.svg | 5 + .../images/toolbarButton-editorHighlight.svg | 6 + .../web/images/toolbarButton-editorInk.svg | 4 + .../web/images/toolbarButton-editorStamp.svg | 8 + .../web/images/toolbarButton-menuArrow.svg | 3 + .../web/images/toolbarButton-openFile.svg | 3 + .../web/images/toolbarButton-pageDown.svg | 3 + .../pdfjs/web/images/toolbarButton-pageUp.svg | 3 + .../images/toolbarButton-presentationMode.svg | 3 + .../pdfjs/web/images/toolbarButton-print.svg | 3 + .../pdfjs/web/images/toolbarButton-search.svg | 3 + .../toolbarButton-secondaryToolbarToggle.svg | 3 + .../images/toolbarButton-sidebarToggle.svg | 3 + .../images/toolbarButton-viewAttachments.svg | 3 + .../web/images/toolbarButton-viewLayers.svg | 3 + .../web/images/toolbarButton-viewOutline.svg | 3 + .../images/toolbarButton-viewThumbnail.svg | 3 + .../pdfjs/web/images/toolbarButton-zoomIn.svg | 3 + .../web/images/toolbarButton-zoomOut.svg | 3 + .../pdfjs/web/images/treeitem-collapsed.svg | 1 + public/pdfjs/web/images/treeitem-expanded.svg | 1 + public/pdfjs/web/locale/ach/viewer.ftl | 225 + public/pdfjs/web/locale/af/viewer.ftl | 212 + public/pdfjs/web/locale/an/viewer.ftl | 257 + public/pdfjs/web/locale/ar/viewer.ftl | 425 + public/pdfjs/web/locale/ast/viewer.ftl | 201 + public/pdfjs/web/locale/az/viewer.ftl | 257 + public/pdfjs/web/locale/be/viewer.ftl | 518 + public/pdfjs/web/locale/bg/viewer.ftl | 418 + public/pdfjs/web/locale/bn/viewer.ftl | 247 + public/pdfjs/web/locale/bo/viewer.ftl | 247 + public/pdfjs/web/locale/br/viewer.ftl | 340 + public/pdfjs/web/locale/brx/viewer.ftl | 218 + public/pdfjs/web/locale/bs/viewer.ftl | 223 + public/pdfjs/web/locale/ca/viewer.ftl | 313 + public/pdfjs/web/locale/cak/viewer.ftl | 291 + public/pdfjs/web/locale/ckb/viewer.ftl | 242 + public/pdfjs/web/locale/cs/viewer.ftl | 521 + public/pdfjs/web/locale/cy/viewer.ftl | 527 + public/pdfjs/web/locale/da/viewer.ftl | 515 + public/pdfjs/web/locale/de/viewer.ftl | 515 + public/pdfjs/web/locale/dsb/viewer.ftl | 521 + public/pdfjs/web/locale/el/viewer.ftl | 515 + public/pdfjs/web/locale/en-CA/viewer.ftl | 515 + public/pdfjs/web/locale/en-GB/viewer.ftl | 515 + public/pdfjs/web/locale/en-US/viewer.ftl | 526 + public/pdfjs/web/locale/eo/viewer.ftl | 515 + public/pdfjs/web/locale/es-AR/viewer.ftl | 515 + public/pdfjs/web/locale/es-CL/viewer.ftl | 515 + public/pdfjs/web/locale/es-ES/viewer.ftl | 515 + public/pdfjs/web/locale/es-MX/viewer.ftl | 515 + public/pdfjs/web/locale/et/viewer.ftl | 268 + public/pdfjs/web/locale/eu/viewer.ftl | 515 + public/pdfjs/web/locale/fa/viewer.ftl | 348 + public/pdfjs/web/locale/ff/viewer.ftl | 247 + public/pdfjs/web/locale/fi/viewer.ftl | 515 + public/pdfjs/web/locale/fr/viewer.ftl | 511 + public/pdfjs/web/locale/fur/viewer.ftl | 485 + public/pdfjs/web/locale/fy-NL/viewer.ftl | 515 + public/pdfjs/web/locale/ga-IE/viewer.ftl | 213 + public/pdfjs/web/locale/gd/viewer.ftl | 313 + public/pdfjs/web/locale/gl/viewer.ftl | 385 + public/pdfjs/web/locale/gn/viewer.ftl | 515 + public/pdfjs/web/locale/gu-IN/viewer.ftl | 247 + public/pdfjs/web/locale/he/viewer.ftl | 515 + public/pdfjs/web/locale/hi-IN/viewer.ftl | 267 + public/pdfjs/web/locale/hr/viewer.ftl | 473 + public/pdfjs/web/locale/hsb/viewer.ftl | 521 + public/pdfjs/web/locale/hu/viewer.ftl | 515 + public/pdfjs/web/locale/hy-AM/viewer.ftl | 272 + public/pdfjs/web/locale/hye/viewer.ftl | 268 + public/pdfjs/web/locale/ia/viewer.ftl | 515 + public/pdfjs/web/locale/id/viewer.ftl | 374 + public/pdfjs/web/locale/is/viewer.ftl | 515 + public/pdfjs/web/locale/it/viewer.ftl | 515 + public/pdfjs/web/locale/ja/viewer.ftl | 503 + public/pdfjs/web/locale/ka/viewer.ftl | 515 + public/pdfjs/web/locale/kab/viewer.ftl | 438 + public/pdfjs/web/locale/kk/viewer.ftl | 515 + public/pdfjs/web/locale/km/viewer.ftl | 223 + public/pdfjs/web/locale/kn/viewer.ftl | 213 + public/pdfjs/web/locale/ko/viewer.ftl | 503 + public/pdfjs/web/locale/lij/viewer.ftl | 247 + public/pdfjs/web/locale/lo/viewer.ftl | 313 + public/pdfjs/web/locale/locale.json | 1 + public/pdfjs/web/locale/lt/viewer.ftl | 268 + public/pdfjs/web/locale/ltg/viewer.ftl | 246 + public/pdfjs/web/locale/lv/viewer.ftl | 247 + public/pdfjs/web/locale/meh/viewer.ftl | 87 + public/pdfjs/web/locale/mk/viewer.ftl | 215 + public/pdfjs/web/locale/mr/viewer.ftl | 239 + public/pdfjs/web/locale/ms/viewer.ftl | 247 + public/pdfjs/web/locale/my/viewer.ftl | 206 + public/pdfjs/web/locale/nb-NO/viewer.ftl | 495 + public/pdfjs/web/locale/ne-NP/viewer.ftl | 234 + public/pdfjs/web/locale/nl/viewer.ftl | 515 + public/pdfjs/web/locale/nn-NO/viewer.ftl | 498 + public/pdfjs/web/locale/oc/viewer.ftl | 409 + public/pdfjs/web/locale/pa-IN/viewer.ftl | 515 + public/pdfjs/web/locale/pl/viewer.ftl | 518 + public/pdfjs/web/locale/pt-BR/viewer.ftl | 515 + public/pdfjs/web/locale/pt-PT/viewer.ftl | 515 + public/pdfjs/web/locale/rm/viewer.ftl | 515 + public/pdfjs/web/locale/ro/viewer.ftl | 251 + public/pdfjs/web/locale/ru/viewer.ftl | 518 + public/pdfjs/web/locale/sat/viewer.ftl | 325 + public/pdfjs/web/locale/sc/viewer.ftl | 367 + public/pdfjs/web/locale/scn/viewer.ftl | 74 + public/pdfjs/web/locale/sco/viewer.ftl | 264 + public/pdfjs/web/locale/si/viewer.ftl | 271 + public/pdfjs/web/locale/sk/viewer.ftl | 521 + public/pdfjs/web/locale/skr/viewer.ftl | 498 + public/pdfjs/web/locale/sl/viewer.ftl | 521 + public/pdfjs/web/locale/son/viewer.ftl | 206 + public/pdfjs/web/locale/sq/viewer.ftl | 506 + public/pdfjs/web/locale/sr/viewer.ftl | 421 + public/pdfjs/web/locale/sv-SE/viewer.ftl | 515 + public/pdfjs/web/locale/szl/viewer.ftl | 257 + public/pdfjs/web/locale/ta/viewer.ftl | 223 + public/pdfjs/web/locale/te/viewer.ftl | 239 + public/pdfjs/web/locale/tg/viewer.ftl | 515 + public/pdfjs/web/locale/th/viewer.ftl | 503 + public/pdfjs/web/locale/tl/viewer.ftl | 257 + public/pdfjs/web/locale/tr/viewer.ftl | 515 + public/pdfjs/web/locale/trs/viewer.ftl | 197 + public/pdfjs/web/locale/uk/viewer.ftl | 518 + public/pdfjs/web/locale/ur/viewer.ftl | 248 + public/pdfjs/web/locale/uz/viewer.ftl | 187 + public/pdfjs/web/locale/vi/viewer.ftl | 503 + public/pdfjs/web/locale/wo/viewer.ftl | 127 + public/pdfjs/web/locale/xh/viewer.ftl | 212 + public/pdfjs/web/locale/zh-CN/viewer.ftl | 503 + public/pdfjs/web/locale/zh-TW/viewer.ftl | 503 + .../web/standard_fonts/FoxitDingbats.pfb | Bin 0 -> 29513 bytes .../pdfjs/web/standard_fonts/FoxitFixed.pfb | Bin 0 -> 17597 bytes .../web/standard_fonts/FoxitFixedBold.pfb | Bin 0 -> 18055 bytes .../standard_fonts/FoxitFixedBoldItalic.pfb | Bin 0 -> 19151 bytes .../web/standard_fonts/FoxitFixedItalic.pfb | Bin 0 -> 18746 bytes .../pdfjs/web/standard_fonts/FoxitSerif.pfb | Bin 0 -> 19469 bytes .../web/standard_fonts/FoxitSerifBold.pfb | Bin 0 -> 19395 bytes .../standard_fonts/FoxitSerifBoldItalic.pfb | Bin 0 -> 20733 bytes .../web/standard_fonts/FoxitSerifItalic.pfb | Bin 0 -> 21227 bytes .../pdfjs/web/standard_fonts/FoxitSymbol.pfb | Bin 0 -> 16729 bytes public/pdfjs/web/standard_fonts/LICENSE_FOXIT | 27 + .../web/standard_fonts/LICENSE_LIBERATION | 102 + .../standard_fonts/LiberationSans-Bold.ttf | Bin 0 -> 137052 bytes .../LiberationSans-BoldItalic.ttf | Bin 0 -> 135124 bytes .../standard_fonts/LiberationSans-Italic.ttf | Bin 0 -> 162036 bytes .../standard_fonts/LiberationSans-Regular.ttf | Bin 0 -> 139512 bytes public/pdfjs/web/viewer.css | 5193 ++ public/pdfjs/web/viewer.html | 637 + public/pdfjs/web/viewer.mjs | 15365 +++++ src/App.tsx | 52 +- src/common/PdfViewer.tsx | 80 + .../Apps/useQortalMessageListener.tsx | 6 +- src/components/Chat/MessageItem.tsx | 6 + src/components/Group/ManageMembers.tsx | 10 +- src/qortalRequests.ts | 25 +- src/qortalRequests/get.ts | 32 +- 209 files changed, 143827 insertions(+), 34 deletions(-) create mode 100644 public/pdfjs/build/pdf.mjs create mode 100644 public/pdfjs/build/pdf.sandbox.mjs create mode 100644 public/pdfjs/build/pdf.worker.mjs create mode 100644 public/pdfjs/web/debugger.css create mode 100644 public/pdfjs/web/debugger.mjs create mode 100644 public/pdfjs/web/images/altText_add.svg create mode 100644 public/pdfjs/web/images/altText_disclaimer.svg create mode 100644 public/pdfjs/web/images/altText_done.svg create mode 100644 public/pdfjs/web/images/altText_spinner.svg create mode 100644 public/pdfjs/web/images/altText_warning.svg create mode 100644 public/pdfjs/web/images/annotation-check.svg create mode 100644 public/pdfjs/web/images/annotation-comment.svg create mode 100644 public/pdfjs/web/images/annotation-help.svg create mode 100644 public/pdfjs/web/images/annotation-insert.svg create mode 100644 public/pdfjs/web/images/annotation-key.svg create mode 100644 public/pdfjs/web/images/annotation-newparagraph.svg create mode 100644 public/pdfjs/web/images/annotation-noicon.svg create mode 100644 public/pdfjs/web/images/annotation-note.svg create mode 100644 public/pdfjs/web/images/annotation-paperclip.svg create mode 100644 public/pdfjs/web/images/annotation-paragraph.svg create mode 100644 public/pdfjs/web/images/annotation-pushpin.svg create mode 100644 public/pdfjs/web/images/cursor-editorFreeHighlight.svg create mode 100644 public/pdfjs/web/images/cursor-editorFreeText.svg create mode 100644 public/pdfjs/web/images/cursor-editorInk.svg create mode 100644 public/pdfjs/web/images/cursor-editorTextHighlight.svg create mode 100644 public/pdfjs/web/images/editor-toolbar-delete.svg create mode 100644 public/pdfjs/web/images/findbarButton-next.svg create mode 100644 public/pdfjs/web/images/findbarButton-previous.svg create mode 100644 public/pdfjs/web/images/gv-toolbarButton-download.svg create mode 100644 public/pdfjs/web/images/loading-icon.gif create mode 100644 public/pdfjs/web/images/loading.svg create mode 100644 public/pdfjs/web/images/messageBar_closingButton.svg create mode 100644 public/pdfjs/web/images/messageBar_warning.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-handTool.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg create mode 100644 public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg create mode 100644 public/pdfjs/web/images/toolbarButton-bookmark.svg create mode 100644 public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg create mode 100644 public/pdfjs/web/images/toolbarButton-download.svg create mode 100644 public/pdfjs/web/images/toolbarButton-editorFreeText.svg create mode 100644 public/pdfjs/web/images/toolbarButton-editorHighlight.svg create mode 100644 public/pdfjs/web/images/toolbarButton-editorInk.svg create mode 100644 public/pdfjs/web/images/toolbarButton-editorStamp.svg create mode 100644 public/pdfjs/web/images/toolbarButton-menuArrow.svg create mode 100644 public/pdfjs/web/images/toolbarButton-openFile.svg create mode 100644 public/pdfjs/web/images/toolbarButton-pageDown.svg create mode 100644 public/pdfjs/web/images/toolbarButton-pageUp.svg create mode 100644 public/pdfjs/web/images/toolbarButton-presentationMode.svg create mode 100644 public/pdfjs/web/images/toolbarButton-print.svg create mode 100644 public/pdfjs/web/images/toolbarButton-search.svg create mode 100644 public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg create mode 100644 public/pdfjs/web/images/toolbarButton-sidebarToggle.svg create mode 100644 public/pdfjs/web/images/toolbarButton-viewAttachments.svg create mode 100644 public/pdfjs/web/images/toolbarButton-viewLayers.svg create mode 100644 public/pdfjs/web/images/toolbarButton-viewOutline.svg create mode 100644 public/pdfjs/web/images/toolbarButton-viewThumbnail.svg create mode 100644 public/pdfjs/web/images/toolbarButton-zoomIn.svg create mode 100644 public/pdfjs/web/images/toolbarButton-zoomOut.svg create mode 100644 public/pdfjs/web/images/treeitem-collapsed.svg create mode 100644 public/pdfjs/web/images/treeitem-expanded.svg create mode 100644 public/pdfjs/web/locale/ach/viewer.ftl create mode 100644 public/pdfjs/web/locale/af/viewer.ftl create mode 100644 public/pdfjs/web/locale/an/viewer.ftl create mode 100644 public/pdfjs/web/locale/ar/viewer.ftl create mode 100644 public/pdfjs/web/locale/ast/viewer.ftl create mode 100644 public/pdfjs/web/locale/az/viewer.ftl create mode 100644 public/pdfjs/web/locale/be/viewer.ftl create mode 100644 public/pdfjs/web/locale/bg/viewer.ftl create mode 100644 public/pdfjs/web/locale/bn/viewer.ftl create mode 100644 public/pdfjs/web/locale/bo/viewer.ftl create mode 100644 public/pdfjs/web/locale/br/viewer.ftl create mode 100644 public/pdfjs/web/locale/brx/viewer.ftl create mode 100644 public/pdfjs/web/locale/bs/viewer.ftl create mode 100644 public/pdfjs/web/locale/ca/viewer.ftl create mode 100644 public/pdfjs/web/locale/cak/viewer.ftl create mode 100644 public/pdfjs/web/locale/ckb/viewer.ftl create mode 100644 public/pdfjs/web/locale/cs/viewer.ftl create mode 100644 public/pdfjs/web/locale/cy/viewer.ftl create mode 100644 public/pdfjs/web/locale/da/viewer.ftl create mode 100644 public/pdfjs/web/locale/de/viewer.ftl create mode 100644 public/pdfjs/web/locale/dsb/viewer.ftl create mode 100644 public/pdfjs/web/locale/el/viewer.ftl create mode 100644 public/pdfjs/web/locale/en-CA/viewer.ftl create mode 100644 public/pdfjs/web/locale/en-GB/viewer.ftl create mode 100644 public/pdfjs/web/locale/en-US/viewer.ftl create mode 100644 public/pdfjs/web/locale/eo/viewer.ftl create mode 100644 public/pdfjs/web/locale/es-AR/viewer.ftl create mode 100644 public/pdfjs/web/locale/es-CL/viewer.ftl create mode 100644 public/pdfjs/web/locale/es-ES/viewer.ftl create mode 100644 public/pdfjs/web/locale/es-MX/viewer.ftl create mode 100644 public/pdfjs/web/locale/et/viewer.ftl create mode 100644 public/pdfjs/web/locale/eu/viewer.ftl create mode 100644 public/pdfjs/web/locale/fa/viewer.ftl create mode 100644 public/pdfjs/web/locale/ff/viewer.ftl create mode 100644 public/pdfjs/web/locale/fi/viewer.ftl create mode 100644 public/pdfjs/web/locale/fr/viewer.ftl create mode 100644 public/pdfjs/web/locale/fur/viewer.ftl create mode 100644 public/pdfjs/web/locale/fy-NL/viewer.ftl create mode 100644 public/pdfjs/web/locale/ga-IE/viewer.ftl create mode 100644 public/pdfjs/web/locale/gd/viewer.ftl create mode 100644 public/pdfjs/web/locale/gl/viewer.ftl create mode 100644 public/pdfjs/web/locale/gn/viewer.ftl create mode 100644 public/pdfjs/web/locale/gu-IN/viewer.ftl create mode 100644 public/pdfjs/web/locale/he/viewer.ftl create mode 100644 public/pdfjs/web/locale/hi-IN/viewer.ftl create mode 100644 public/pdfjs/web/locale/hr/viewer.ftl create mode 100644 public/pdfjs/web/locale/hsb/viewer.ftl create mode 100644 public/pdfjs/web/locale/hu/viewer.ftl create mode 100644 public/pdfjs/web/locale/hy-AM/viewer.ftl create mode 100644 public/pdfjs/web/locale/hye/viewer.ftl create mode 100644 public/pdfjs/web/locale/ia/viewer.ftl create mode 100644 public/pdfjs/web/locale/id/viewer.ftl create mode 100644 public/pdfjs/web/locale/is/viewer.ftl create mode 100644 public/pdfjs/web/locale/it/viewer.ftl create mode 100644 public/pdfjs/web/locale/ja/viewer.ftl create mode 100644 public/pdfjs/web/locale/ka/viewer.ftl create mode 100644 public/pdfjs/web/locale/kab/viewer.ftl create mode 100644 public/pdfjs/web/locale/kk/viewer.ftl create mode 100644 public/pdfjs/web/locale/km/viewer.ftl create mode 100644 public/pdfjs/web/locale/kn/viewer.ftl create mode 100644 public/pdfjs/web/locale/ko/viewer.ftl create mode 100644 public/pdfjs/web/locale/lij/viewer.ftl create mode 100644 public/pdfjs/web/locale/lo/viewer.ftl create mode 100644 public/pdfjs/web/locale/locale.json create mode 100644 public/pdfjs/web/locale/lt/viewer.ftl create mode 100644 public/pdfjs/web/locale/ltg/viewer.ftl create mode 100644 public/pdfjs/web/locale/lv/viewer.ftl create mode 100644 public/pdfjs/web/locale/meh/viewer.ftl create mode 100644 public/pdfjs/web/locale/mk/viewer.ftl create mode 100644 public/pdfjs/web/locale/mr/viewer.ftl create mode 100644 public/pdfjs/web/locale/ms/viewer.ftl create mode 100644 public/pdfjs/web/locale/my/viewer.ftl create mode 100644 public/pdfjs/web/locale/nb-NO/viewer.ftl create mode 100644 public/pdfjs/web/locale/ne-NP/viewer.ftl create mode 100644 public/pdfjs/web/locale/nl/viewer.ftl create mode 100644 public/pdfjs/web/locale/nn-NO/viewer.ftl create mode 100644 public/pdfjs/web/locale/oc/viewer.ftl create mode 100644 public/pdfjs/web/locale/pa-IN/viewer.ftl create mode 100644 public/pdfjs/web/locale/pl/viewer.ftl create mode 100644 public/pdfjs/web/locale/pt-BR/viewer.ftl create mode 100644 public/pdfjs/web/locale/pt-PT/viewer.ftl create mode 100644 public/pdfjs/web/locale/rm/viewer.ftl create mode 100644 public/pdfjs/web/locale/ro/viewer.ftl create mode 100644 public/pdfjs/web/locale/ru/viewer.ftl create mode 100644 public/pdfjs/web/locale/sat/viewer.ftl create mode 100644 public/pdfjs/web/locale/sc/viewer.ftl create mode 100644 public/pdfjs/web/locale/scn/viewer.ftl create mode 100644 public/pdfjs/web/locale/sco/viewer.ftl create mode 100644 public/pdfjs/web/locale/si/viewer.ftl create mode 100644 public/pdfjs/web/locale/sk/viewer.ftl create mode 100644 public/pdfjs/web/locale/skr/viewer.ftl create mode 100644 public/pdfjs/web/locale/sl/viewer.ftl create mode 100644 public/pdfjs/web/locale/son/viewer.ftl create mode 100644 public/pdfjs/web/locale/sq/viewer.ftl create mode 100644 public/pdfjs/web/locale/sr/viewer.ftl create mode 100644 public/pdfjs/web/locale/sv-SE/viewer.ftl create mode 100644 public/pdfjs/web/locale/szl/viewer.ftl create mode 100644 public/pdfjs/web/locale/ta/viewer.ftl create mode 100644 public/pdfjs/web/locale/te/viewer.ftl create mode 100644 public/pdfjs/web/locale/tg/viewer.ftl create mode 100644 public/pdfjs/web/locale/th/viewer.ftl create mode 100644 public/pdfjs/web/locale/tl/viewer.ftl create mode 100644 public/pdfjs/web/locale/tr/viewer.ftl create mode 100644 public/pdfjs/web/locale/trs/viewer.ftl create mode 100644 public/pdfjs/web/locale/uk/viewer.ftl create mode 100644 public/pdfjs/web/locale/ur/viewer.ftl create mode 100644 public/pdfjs/web/locale/uz/viewer.ftl create mode 100644 public/pdfjs/web/locale/vi/viewer.ftl create mode 100644 public/pdfjs/web/locale/wo/viewer.ftl create mode 100644 public/pdfjs/web/locale/xh/viewer.ftl create mode 100644 public/pdfjs/web/locale/zh-CN/viewer.ftl create mode 100644 public/pdfjs/web/locale/zh-TW/viewer.ftl create mode 100644 public/pdfjs/web/standard_fonts/FoxitDingbats.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitFixed.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitSerif.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb create mode 100644 public/pdfjs/web/standard_fonts/FoxitSymbol.pfb create mode 100644 public/pdfjs/web/standard_fonts/LICENSE_FOXIT create mode 100644 public/pdfjs/web/standard_fonts/LICENSE_LIBERATION create mode 100644 public/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf create mode 100644 public/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf create mode 100644 public/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf create mode 100644 public/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf create mode 100644 public/pdfjs/web/viewer.css create mode 100644 public/pdfjs/web/viewer.html create mode 100644 public/pdfjs/web/viewer.mjs create mode 100644 src/common/PdfViewer.tsx diff --git a/public/pdfjs/build/pdf.mjs b/public/pdfjs/build/pdf.mjs new file mode 100644 index 0000000..0d201af --- /dev/null +++ b/public/pdfjs/build/pdf.mjs @@ -0,0 +1,21576 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = globalThis.pdfjsLib = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + AbortException: () => (/* reexport */ AbortException), + AnnotationEditorLayer: () => (/* reexport */ AnnotationEditorLayer), + AnnotationEditorParamsType: () => (/* reexport */ AnnotationEditorParamsType), + AnnotationEditorType: () => (/* reexport */ AnnotationEditorType), + AnnotationEditorUIManager: () => (/* reexport */ AnnotationEditorUIManager), + AnnotationLayer: () => (/* reexport */ AnnotationLayer), + AnnotationMode: () => (/* reexport */ AnnotationMode), + ColorPicker: () => (/* reexport */ ColorPicker), + DOMSVGFactory: () => (/* reexport */ DOMSVGFactory), + DrawLayer: () => (/* reexport */ DrawLayer), + FeatureTest: () => (/* reexport */ util_FeatureTest), + GlobalWorkerOptions: () => (/* reexport */ GlobalWorkerOptions), + ImageKind: () => (/* reexport */ util_ImageKind), + InvalidPDFException: () => (/* reexport */ InvalidPDFException), + MissingPDFException: () => (/* reexport */ MissingPDFException), + OPS: () => (/* reexport */ OPS), + OutputScale: () => (/* reexport */ OutputScale), + PDFDataRangeTransport: () => (/* reexport */ PDFDataRangeTransport), + PDFDateString: () => (/* reexport */ PDFDateString), + PDFWorker: () => (/* reexport */ PDFWorker), + PasswordResponses: () => (/* reexport */ PasswordResponses), + PermissionFlag: () => (/* reexport */ PermissionFlag), + PixelsPerInch: () => (/* reexport */ PixelsPerInch), + RenderingCancelledException: () => (/* reexport */ RenderingCancelledException), + TextLayer: () => (/* reexport */ TextLayer), + TouchManager: () => (/* reexport */ TouchManager), + UnexpectedResponseException: () => (/* reexport */ UnexpectedResponseException), + Util: () => (/* reexport */ Util), + VerbosityLevel: () => (/* reexport */ VerbosityLevel), + XfaLayer: () => (/* reexport */ XfaLayer), + build: () => (/* reexport */ build), + createValidAbsoluteUrl: () => (/* reexport */ createValidAbsoluteUrl), + fetchData: () => (/* reexport */ fetchData), + getDocument: () => (/* reexport */ getDocument), + getFilenameFromUrl: () => (/* reexport */ getFilenameFromUrl), + getPdfFilenameFromUrl: () => (/* reexport */ getPdfFilenameFromUrl), + getXfaPageViewport: () => (/* reexport */ getXfaPageViewport), + isDataScheme: () => (/* reexport */ isDataScheme), + isPdfFile: () => (/* reexport */ isPdfFile), + noContextMenu: () => (/* reexport */ noContextMenu), + normalizeUnicode: () => (/* reexport */ normalizeUnicode), + setLayerDimensions: () => (/* reexport */ setLayerDimensions), + shadow: () => (/* reexport */ shadow), + stopEvent: () => (/* reexport */ stopEvent), + version: () => (/* reexport */ version) +}); + +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const util_ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch {} + return null; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class util_FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get platform() { + if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { + return shadow(this, "platform", { + isMac: navigator.platform.includes("Mac"), + isWindows: navigator.platform.includes("Win"), + isFirefox: typeof navigator?.userAgent === "string" && navigator.userAgent.includes("Firefox") + }); + } + return shadow(this, "platform", { + isMac: false, + isWindows: false, + isFirefox: false + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = this.applyTransform(r, m); + const p2 = this.applyTransform(r.slice(2, 4), m); + const p3 = this.applyTransform([r[0], r[3]], m); + const p4 = this.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + if (minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + } else { + minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; + } + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + return minMax; + } +} +const PDFStringTranslateTable = (/* unused pure expression or super */ null && ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac])); +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, num => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} +if (typeof Promise.try !== "function") { + Promise.try = function (fn, ...args) { + return new Promise(resolve => { + resolve(fn(...args)); + }); + }; +} + +;// ./src/display/display_utils.js + +const SVG_NS = "http://www.w3.org/2000/svg"; +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + switch (type) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "json": + return response.json(); + } + return response.text(); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "arraybuffer": + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class PageViewport { + constructor({ + viewBox, + userUnit, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.userUnit = userUnit; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + scale *= userUnit; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + case 0: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; + this.width = width; + this.height = height; + } + get rawDims() { + const { + userUnit, + viewBox + } = this; + const dims = viewBox.map(x => x * userUnit); + return shadow(this, "rawDims", { + pageWidth: dims[2] - dims[0], + pageHeight: dims[3] - dims[1], + pageX: dims[0], + pageY: dims[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + return Util.applyTransform([x, y], this.transform); + } + convertToViewportRectangle(rect) { + const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform); + const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform); + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; + } + convertToPdfPoint(x, y) { + return Util.applyInverseTransform([x, y], this.transform); + } +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + [url] = url.split(/[#?]/, 1); + return url.substring(url.lastIndexOf("/") + 1); +} +function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const splitURI = reURI.exec(url); + let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.includes("%")) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch {} + } + } + return suggestedFilename || defaultFilename; +} +class StatTimer { + started = Object.create(null); + times = []; + time(name) { + if (name in this.started) { + warn(`Timer is already running for ${name}`); + } + this.started[name] = Date.now(); + } + timeEnd(name) { + if (!(name in this.started)) { + warn(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.started[name], + end: Date.now() + }); + delete this.started[name]; + } + toString() { + const outBuf = []; + let longest = 0; + for (const { + name + } of this.times) { + longest = Math.max(name.length, longest); + } + for (const { + name, + start, + end + } of this.times) { + outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); + } + return outBuf.join(""); + } +} +function isValidFetchUrl(url, baseUrl) { + try { + const { + protocol + } = baseUrl ? new URL(url, baseUrl) : new URL(url); + return protocol === "http:" || protocol === "https:"; + } catch { + return false; + } +} +function noContextMenu(e) { + e.preventDefault(); +} +function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +class PDFDateString { + static #regex; + static toDateObject(input) { + if (!input || typeof input !== "string") { + return null; + } + this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = this.#regex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +function getXfaPageViewport(xfaPage, { + scale = 1, + rotation = 0 +}) { + const { + width, + height + } = xfaPage.attributes.style; + const viewBox = [0, 0, parseInt(width), parseInt(height)]; + return new PageViewport({ + viewBox, + userUnit: 1, + scale, + rotation + }); +} +function getRGB(color) { + if (color.startsWith("#")) { + const colorRGB = parseInt(color.slice(1), 16); + return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; + } + if (color.startsWith("rgb(")) { + return color.slice(4, -1).split(",").map(x => parseInt(x)); + } + if (color.startsWith("rgba(")) { + return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); + } + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { + if (viewport instanceof PageViewport) { + const { + pageWidth, + pageHeight + } = viewport.rawDims; + const { + style + } = div; + const useRound = util_FeatureTest.isCSSRoundSupported; + const w = `var(--scale-factor) * ${pageWidth}px`, + h = `var(--scale-factor) * ${pageHeight}px`; + const widthStr = useRound ? `round(down, ${w}, var(--scale-round-x, 1px))` : `calc(${w})`, + heightStr = useRound ? `round(down, ${h}, var(--scale-round-y, 1px))` : `calc(${h})`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; + } else { + style.width = heightStr; + style.height = widthStr; + } + } + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} +class OutputScale { + constructor() { + const pixelRatio = window.devicePixelRatio || 1; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + get symmetric() { + return this.sx === this.sy; + } +} + +;// ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + #altText = null; + static #l10nRemove = null; + constructor(editor) { + this.#editor = editor; + EditorToolbar.#l10nRemove ||= Object.freeze({ + freetext: "pdfjs-editor-remove-freetext-button", + highlight: "pdfjs-editor-remove-highlight-button", + ink: "pdfjs-editor-remove-ink-button", + stamp: "pdfjs-editor-remove-stamp-button" + }); + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.classList.add("editToolbar", "hidden"); + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + this.#addDeleteButton(); + return editToolbar; + } + get div() { + return this.#toolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + this.#altText?.shown(); + } + #addDeleteButton() { + const { + editorType, + _uiManager + } = this.#editor; + const button = document.createElement("button"); + button.className = "delete"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]); + this.#addListenersToElement(button); + button.addEventListener("click", e => { + _uiManager.delete(); + }, { + signal: _uiManager._signal + }); + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + async addAltText(altText) { + const button = await altText.render(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + this.#altText = altText; + } + addColorPicker(colorPicker) { + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class HighlightToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal: this.#uiManager._signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + this.#addHighlightButton(); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; + } + } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); + const { + style + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #addHighlightButton() { + const button = document.createElement("button"); + button.className = "highlightButton"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", `pdfjs-highlight-floating-button1`); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label"); + const signal = this.#uiManager._signal; + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", () => { + this.#uiManager.highlightSelection("floating_button"); + }, { + signal + }); + this.#buttons.append(button); + } +} + +;// ./src/display/editor/tools.js + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +function opacityToHex(opacity) { + return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0"); +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else if (rawData instanceof File) { + image = data.file = rawData; + } else if (rawData instanceof Blob) { + image = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + warn(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromBlob(id, blobPromise) { + const blob = await blobPromise; + return this.#get(id, blob); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + if (data.blobPromise) { + const { + blobPromise + } = data; + delete data.blobPromise; + return this.getFromBlob(data.id, blobPromise); + } + return this.getFromUrl(data.url); + } + getFromCanvas(id, canvas) { + this.#cache ||= new Map(); + let data = this.#cache.get(id); + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + const offscreen = new OffscreenCanvas(canvas.width, canvas.height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(canvas, 0, 0); + data = { + bitmap: offscreen.transferToImageBitmap(), + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 1, + isSvg: false + }; + this.#cache.set(id, data); + this.#cache.set(data.id, data); + return data; + } + getSvgUrl(id) { + const data = this.#cache.get(id); + if (!data?.isSvg) { + return null; + } + return data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; + } + const { + bitmap + } = data; + if (!data.url && !data.file) { + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const ctx = canvas.getContext("bitmaprenderer"); + ctx.transferFromImageBitmap(bitmap); + data.blobPromise = canvas.convertToBlob(); + } + bitmap.close?.(); + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); + } + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + type + }; + if (this.#position === -1) { + if (this.#commands.length > 0) { + this.#commands.length = 0; + } + this.#position = 0; + this.#commands.push(save); + return; + } + if (overwriteIfSameType && this.#commands[this.#position].type === type) { + if (keepUndo) { + save.undo = this.#commands[this.#position].undo; + } + this.#commands[this.#position] = save; + return; + } + const next = this.#position + 1; + if (next === this.#maxSize) { + this.#commands.splice(0, 1); + } else { + this.#position = next; + if (next < this.#commands.length) { + this.#commands.splice(next); + } + } + this.#commands.push(save); + } + undo() { + if (this.#position === -1) { + return; + } + this.#locked = true; + const { + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; + } + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } + } + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + cleanType(type) { + if (this.#position === -1) { + return; + } + for (let i = this.#position; i >= 0; i--) { + if (this.#commands[i].type !== type) { + this.#commands.splice(i + 1, this.#position - i); + this.#position = i; + return; + } + } + this.#commands.length = 0; + this.#position = -1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + constructor(callbacks) { + this.buffer = []; + this.callbacks = new Map(); + this.allKeys = new Set(); + const { + isMac + } = util_FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + for (const key of keys) { + const isMacKey = key.startsWith("mac+"); + if (isMac && isMacKey) { + this.callbacks.set(key.slice(4), { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } else if (!isMac && !isMacKey) { + this.callbacks.set(key, { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } + } + } + } + #serialize(event) { + if (event.altKey) { + this.buffer.push("alt"); + } + if (event.ctrlKey) { + this.buffer.push("ctrl"); + } + if (event.metaKey) { + this.buffer.push("meta"); + } + if (event.shiftKey) { + this.buffer.push("shift"); + } + this.buffer.push(event.key); + const str = this.buffer.join("+"); + this.buffer.length = 0; + return str; + } + exec(self, event) { + if (!this.allKeys.has(event.key)) { + return; + } + const info = this.callbacks.get(this.#serialize(event)); + if (!info) { + return; + } + const { + callback, + options: { + bubbles = false, + args = [], + checker = null + } + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + stopEvent(event); + } + } +} +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return shadow(this, "_colors", colors); + } + convert(color) { + const rgb = getRGB(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + if (!rgb) { + return name; + } + return Util.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditors = new Map(); + #allLayers = new Map(); + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #copyPasteAC = null; + #currentDrawingSession = null; + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + _editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #focusManagerAC = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #highlightToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isWaiting = false; + #keyboardManagerAC = null; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #pageColors = null; + #showAllStates = null; + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + #updateModeCapability = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) { + const signal = this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#altTextManager = altTextManager; + this._eventBus = eventBus; + eventBus._on("editingaction", this.onEditingAction.bind(this), { + signal + }); + eventBus._on("pagechanging", this.onPageChanging.bind(this), { + signal + }); + eventBus._on("scalechanging", this.onScaleChanging.bind(this), { + signal + }); + eventBus._on("rotationchanging", this.onRotationChanging.bind(this), { + signal + }); + eventBus._on("setpreference", this.onSetPreference.bind(this), { + signal + }); + eventBus._on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), { + signal + }); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; + this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + this._editorUndoBar = editorUndoBar || null; + this._supportsPinchToZoom = supportsPinchToZoom !== false; + } + destroy() { + this.#updateModeCapability?.resolve(); + this.#updateModeCapability = null; + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#highlightToolbar?.hide(); + this.#highlightToolbar = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + this._editorUndoBar?.destroy(); + } + combinedSignal(ac) { + return AbortSignal.any([this._signal, ac.signal]); + } + get mlManager() { + return this.#mlManager; + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; + } + get useNewAltTextWhenAddingImage() { + return this.#enableNewAltTextWhenAddingImage; + } + get hcmFilter() { + return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get highlightColors() { + return shadow(this, "highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => pair.split("=").map(x => x.trim()))) : null); + } + get highlightColorNames() { + return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + setCurrentDrawingSession(layer) { + if (layer) { + this.unselectAll(); + this.disableUserSelect(true); + } else { + this.disableUserSelect(false); + } + this.#currentDrawingSession = layer; + } + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; + } + editAltText(editor, firstTime = false) { + this.#altTextManager?.editAltText(this, editor, firstTime); + } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + onSetPreference({ + name, + value + }) { + switch (name) { + case "enableNewAltTextWhenAddingImage": + this.#enableNewAltTextWhenAddingImage = value; + break; + } + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; + } + } + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); + } + this.#currentDrawingSession?.onScaleChanging(); + } + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; + } + } + return null; + } + highlightSelection(methodOfCreation = "") { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + if (isNoneMode) { + this.showAllEditors("highlight", true, true); + } + }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; + } + callback(); + } + #displayHighlightToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#highlightToolbar ||= new HighlightToolbar(this); + this.#highlightToolbar.show(textLayer, boxes, this.direction === "ltr"); + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); + } + } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#highlightToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + const ac = new AbortController(); + const signal = this.combinedSignal(ac); + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { + return; + } + ac.abort(); + activeLayer?.toggleDrawing(true); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); + } + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayHighlightToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + if (this.#focusManagerAC) { + return; + } + this.#focusManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#focusManagerAC); + window.addEventListener("focus", this.focus.bind(this), { + signal + }); + window.addEventListener("blur", this.blur.bind(this), { + signal + }); + } + #removeFocusManager() { + this.#focusManagerAC?.abort(); + this.#focusManagerAC = null; + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + if (this.#keyboardManagerAC) { + return; + } + this.#keyboardManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#keyboardManagerAC); + window.addEventListener("keydown", this.keydown.bind(this), { + signal + }); + window.addEventListener("keyup", this.keyup.bind(this), { + signal + }); + } + #removeKeyboardManager() { + this.#keyboardManagerAC?.abort(); + this.#keyboardManagerAC = null; + } + #addCopyPasteListeners() { + if (this.#copyPasteAC) { + return; + } + this.#copyPasteAC = new AbortController(); + const signal = this.combinedSignal(this.#copyPasteAC); + document.addEventListener("copy", this.copy.bind(this), { + signal + }); + document.addEventListener("cut", this.cut.bind(this), { + signal + }); + document.addEventListener("paste", this.paste.bind(this), { + signal + }); + } + #removeCopyPasteListeners() { + this.#copyPasteAC?.abort(); + this.#copyPasteAC = null; + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.#addCopyPasteListeners(); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.#removeCopyPasteListeners(); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + async paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; + } + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = await layer.deserialize(editor); + if (!deserializedEditor) { + return; + } + newEditors.push(deserializedEditor); + } + const cmd = () => { + for (const editor of newEditors) { + this.#addEditorToLayer(editor); + } + this.#selectEditors(newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + warn(`paste: "${ex.message}".`); + } + } + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + } + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + } + } + #dispatchUpdateStates(details) { + const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); + if (hasChanged) { + this._eventBus.dispatch("annotationeditorstateschanged", { + source: this, + details: Object.assign(this.#previousStates, details) + }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } + } + } + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + get currentPageIndex() { + return this.#currentPageIndex; + } + addLayer(layer) { + this.#allLayers.set(layer.pageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + this.#allLayers.delete(layer.pageIndex); + } + async updateMode(mode, editId = null, isFromKeyboard = false) { + if (this.#mode === mode) { + return; + } + if (this.#updateModeCapability) { + await this.#updateModeCapability.promise; + if (!this.#updateModeCapability) { + return; + } + } + this.#updateModeCapability = Promise.withResolvers(); + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + this._editorUndoBar?.hide(); + this.#updateModeCapability.resolve(); + return; + } + this.setEditingState(true); + await this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (!editId) { + if (isFromKeyboard) { + this.addNewEditorFromKeyboard(); + } + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.annotationElementId === editId) { + this.setSelected(editor); + editor.enterInEditMode(); + } else { + editor.unselect(); + } + } + this.#updateModeCapability.resolve(); + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(mode) { + if (mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + mode + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(); + return; + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + this.#mainHighlightColorPicker?.updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" + } + } + }); + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); + } + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); + } + } + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } + } + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } + } + async #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + const promises = []; + for (const layer of this.#allLayers.values()) { + promises.push(layer.enable()); + } + await Promise.all(promises); + for (const editor of this.#allEditors.values()) { + editor.enable(); + } + } + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } + } + } + getEditors(pageIndex) { + const editors = []; + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + editors.push(editor); + } + } + return editors; + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + updateUIForDefaultProperties(editorType) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + toggleSelected(editor) { + if (this.#selectedEditors.has(editor)) { + this.#selectedEditors.delete(editor); + editor.unselect(); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + return; + } + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + setSelected(editor) { + this.#currentDrawingSession?.commitOrRemove(); + for (const ed of this.#selectedEditors) { + if (ed !== editor) { + ed.unselect(); + } + } + this.#selectedEditors.clear(); + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + isSelected(editor) { + return this.#selectedEditors.has(editor); + } + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + this._editorUndoBar?.hide(); + } + redo() { + this.#commandManager.redo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + isEmpty: this.#isEmpty() + }); + } + addCommands(params) { + this.#commandManager.add(params); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: this.#isEmpty() + }); + } + cleanUndoStack(type) { + this.#commandManager.cleanType(type); + } + #isEmpty() { + if (this.#allEditors.size === 0) { + return true; + } + if (this.#allEditors.size === 1) { + for (const editor of this.#allEditors.values()) { + return editor.isEmpty(); + } + } + return false; + } + delete() { + this.commitOrRemove(); + const drawingEditor = this.currentLayer?.endDrawingSession(true); + if (!this.hasSelection && !drawingEditor) { + return; + } + const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors]; + const cmd = () => { + this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length); + for (const editor of editors) { + editor.remove(); + } + }; + const undo = () => { + for (const editor of editors) { + this.#addEditorToLayer(editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + commitOrRemove() { + this.#activeEditor?.commitOrRemove(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (this.#currentDrawingSession?.commitOrRemove()) { + return; + } + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + } + } + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + } + } + }, + mustExec: false + }); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + } + } + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true + }); + return true; + } + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; + } + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + get imageManager() { + return shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } +} + +;// ./src/display/editor/alt_text.js + +class AltText { + #altText = null; + #altTextDecorative = false; + #altTextButton = null; + #altTextButtonLabel = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #badge = null; + #editor = null; + #guessedText = null; + #textWithDisclaimer = null; + #useNewAltTextFlow = false; + static #l10nNewButton = null; + static _l10n = null; + constructor(editor) { + this.#editor = editor; + this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow; + AltText.#l10nNewButton ||= Object.freeze({ + added: "pdfjs-editor-new-alt-text-added-button", + "added-label": "pdfjs-editor-new-alt-text-added-button-label", + missing: "pdfjs-editor-new-alt-text-missing-button", + "missing-label": "pdfjs-editor-new-alt-text-missing-button-label", + review: "pdfjs-editor-new-alt-text-to-review-button", + "review-label": "pdfjs-editor-new-alt-text-to-review-button-label" + }); + } + static initialize(l10n) { + AltText._l10n ??= l10n; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + altText.tabIndex = "0"; + const label = this.#altTextButtonLabel = document.createElement("span"); + altText.append(label); + if (this.#useNewAltTextFlow) { + altText.classList.add("new"); + altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing); + label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]); + } else { + altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"); + label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"); + } + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + if (this.#useNewAltTextFlow) { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_clicked", + data: { + label: this.#label + } + }); + } + }; + altText.addEventListener("click", onClick, { + capture: true, + signal + }); + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + await this.#setState(); + return altText; + } + get #label() { + return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing"; + } + finish() { + if (!this.#altTextButton) { + return; + } + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + if (this.#useNewAltTextFlow) { + return this.#altText === null; + } + return !this.#altText && !this.#altTextDecorative; + } + hasData() { + if (this.#useNewAltTextFlow) { + return this.#altText !== null || !!this.#guessedText; + } + return this.isEmpty(); + } + get guessedText() { + return this.#guessedText; + } + async setGuessedText(guessedText) { + if (this.#altText !== null) { + return; + } + this.#guessedText = guessedText; + this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", { + generatedAltText: guessedText + }); + this.#setState(); + } + toggleAltTextBadge(visibility = false) { + if (!this.#useNewAltTextFlow || this.#altText) { + this.#badge?.remove(); + this.#badge = null; + return; + } + if (!this.#badge) { + const badge = this.#badge = document.createElement("div"); + badge.className = "noAltTextBadge"; + this.#editor.div.append(badge); + } + this.#badge.classList.toggle("hidden", !visibility); + } + serialize(isForCopying) { + let altText = this.#altText; + if (!isForCopying && this.#guessedText === altText) { + altText = this.#textWithDisclaimer; + } + return { + altText, + decorative: this.#altTextDecorative, + guessedText: this.#guessedText, + textWithDisclaimer: this.#textWithDisclaimer + }; + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative + }; + } + set data({ + altText, + decorative, + guessedText, + textWithDisclaimer, + cancel = false + }) { + if (guessedText) { + this.#guessedText = guessedText; + this.#textWithDisclaimer = textWithDisclaimer; + } + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + if (!cancel) { + this.#altText = altText; + this.#altTextDecorative = decorative; + } + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + shown() { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_displayed", + data: { + label: this.#label + } + }); + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextButtonLabel = null; + this.#altTextTooltip = null; + this.#badge?.remove(); + this.#badge = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (this.#useNewAltTextFlow) { + button.classList.toggle("done", !!this.#altText); + button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]); + this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]); + if (!this.#altText) { + this.#altTextTooltip?.remove(); + return; + } + } else { + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button"); + } + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal + }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal + }); + } + if (this.#altTextDecorative) { + tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip"); + } else { + tooltip.removeAttribute("data-l10n-id"); + tooltip.textContent = this.#altText; + } + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getImageForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); + } +} + +;// ./src/display/touch_manager.js + + +class TouchManager { + #container; + #isPinching = false; + #isPinchingStopped = null; + #isPinchingDisabled; + #onPinchStart; + #onPinching; + #onPinchEnd; + #signal; + #touchInfo = null; + #touchManagerAC; + #touchMoveAC = null; + constructor({ + container, + isPinchingDisabled = null, + isPinchingStopped = null, + onPinchStart = null, + onPinching = null, + onPinchEnd = null, + signal + }) { + this.#container = container; + this.#isPinchingStopped = isPinchingStopped; + this.#isPinchingDisabled = isPinchingDisabled; + this.#onPinchStart = onPinchStart; + this.#onPinching = onPinching; + this.#onPinchEnd = onPinchEnd; + this.#touchManagerAC = new AbortController(); + this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]); + container.addEventListener("touchstart", this.#onTouchStart.bind(this), { + passive: false, + signal: this.#signal + }); + } + get MIN_TOUCH_DISTANCE_TO_PINCH() { + return shadow(this, "MIN_TOUCH_DISTANCE_TO_PINCH", 35 / (window.devicePixelRatio || 1)); + } + #onTouchStart(evt) { + if (this.#isPinchingDisabled?.() || evt.touches.length < 2) { + return; + } + if (!this.#touchMoveAC) { + this.#touchMoveAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]); + const container = this.#container; + const opt = { + signal, + passive: false + }; + container.addEventListener("touchmove", this.#onTouchMove.bind(this), opt); + container.addEventListener("touchend", this.#onTouchEnd.bind(this), opt); + container.addEventListener("touchcancel", this.#onTouchEnd.bind(this), opt); + this.#onPinchStart?.(); + } + stopEvent(evt); + if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) { + this.#touchInfo = null; + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + this.#touchInfo = { + touch0X: touch0.screenX, + touch0Y: touch0.screenY, + touch1X: touch1.screenX, + touch1Y: touch1.screenY + }; + } + #onTouchMove(evt) { + if (!this.#touchInfo || evt.touches.length !== 2) { + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + const { + screenX: screen0X, + screenY: screen0Y + } = touch0; + const { + screenX: screen1X, + screenY: screen1Y + } = touch1; + const touchInfo = this.#touchInfo; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y + } = touchInfo; + const prevGapX = pTouch1X - pTouch0X; + const prevGapY = pTouch1Y - pTouch0Y; + const currGapX = screen1X - screen0X; + const currGapY = screen1Y - screen0Y; + const distance = Math.hypot(currGapX, currGapY) || 1; + const pDistance = Math.hypot(prevGapX, prevGapY) || 1; + if (!this.#isPinching && Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH) { + return; + } + touchInfo.touch0X = screen0X; + touchInfo.touch0Y = screen0Y; + touchInfo.touch1X = screen1X; + touchInfo.touch1Y = screen1Y; + evt.preventDefault(); + if (!this.#isPinching) { + this.#isPinching = true; + return; + } + const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2]; + this.#onPinching?.(origin, pDistance, distance); + } + #onTouchEnd(evt) { + this.#touchMoveAC.abort(); + this.#touchMoveAC = null; + this.#onPinchEnd?.(); + if (!this.#touchInfo) { + return; + } + evt.preventDefault(); + this.#touchInfo = null; + this.#isPinching = false; + } + destroy() { + this.#touchManagerAC?.abort(); + this.#touchManagerAC = null; + } +} + +;// ./src/display/editor/editor.js + + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #disabled = false; + #dragPointerId = null; + #dragPointerType = ""; + #keepAspectRatio = false; + #resizersDiv = null; + #lastPointerCoords = null; + #savedDimensions = null; + #focusAC = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialRect = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + #touchManager = null; + _editToolbar = null; + _initialOptions = Object.create(null); + _initialData = null; + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + static _l10n = null; + static _l10nResizer = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight", "mac+ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp", "mac+ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown", "mac+ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape", "mac+Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + this.deleted = false; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + static get isDrawer() { + return false; + } + static get _defaultLineColor() { + return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor.parent.getNextId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager) { + AnnotationEditor._l10n ??= l10n; + AnnotationEditor._l10nResizer ||= Object.freeze({ + topLeft: "pdfjs-editor-resizer-top-left", + topMiddle: "pdfjs-editor-resizer-top-middle", + topRight: "pdfjs-editor-resizer-top-right", + middleRight: "pdfjs-editor-resizer-middle-right", + bottomRight: "pdfjs-editor-resizer-bottom-right", + bottomMiddle: "pdfjs-editor-resizer-bottom-middle", + bottomLeft: "pdfjs-editor-resizer-bottom-left", + middleLeft: "pdfjs-editor-resizer-middle-left" + }); + if (AnnotationEditor._borderLineWidth !== -1) { + return; + } + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; + } + this.fixAndSetPosition(); + } + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = this.#zIndex; + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; + } else { + this.#stopResizing(); + } + this.parent = parent; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; + } + } + focusout(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target?.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!this.parent?.isMultipleSelection) { + this.commitOrRemove(); + } + } + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.fixAndSetPosition(); + } + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this._onTranslating(this.x, this.y); + this.fixAndSetPosition(); + } + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" + }); + } + drag(tx, ty) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + const { + div, + parentDimensions: [parentWidth, parentHeight] + } = this; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); + } + } + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this._onTranslating(x, y); + div.scrollIntoView({ + block: "nearest" + }); + } + _onTranslating(x, y) {} + _onTranslated(x, y) {} + get _hasBeenMoved() { + return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y); + } + get _hasBeenResized() { + return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height); + } + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const { + div: { + style + }, + pageDimensions: [pageWidth, pageHeight] + } = this; + let { + x, + y, + width, + height + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = Math.max(0, Math.min(pageWidth - width, x)); + y = Math.max(0, Math.min(pageHeight - height, y)); + break; + case 90: + x = Math.max(0, Math.min(pageWidth - height, x)); + y = Math.min(pageHeight, Math.max(width, y)); + break; + case 180: + x = Math.min(pageWidth, Math.max(width, x)); + y = Math.min(pageHeight, Math.max(height, y)); + break; + case 270: + x = Math.min(pageWidth, Math.max(height, x)); + y = Math.max(0, Math.min(pageHeight - width, y)); + break; + } + } + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); + } + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + } + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + } + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; + } + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + return [pageWidth * parentScale, pageHeight * parentScale]; + } + setDims(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + style + } = this.div; + style.width = `${(100 * width / parentWidth).toFixed(2)}%`; + if (!this.#keepAspectRatio) { + style.height = `${(100 * height / parentHeight).toFixed(2)}%`; + } + } + fixDims() { + const { + style + } = this.div; + const { + height, + width + } = style; + const widthPercent = width.endsWith("%"); + const heightPercent = !this.#keepAspectRatio && height.endsWith("%"); + if (widthPercent && heightPercent) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + if (!widthPercent) { + style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`; + } + if (!this.#keepAspectRatio && !heightPercent) { + style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`; + } + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; + } + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); + } + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + this.#lastPointerCoords = [event.screenX, event.screenY]; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), { + passive: true, + capture: true, + signal + }); + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + ac.abort(); + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + #resize(x, y, width, height) { + this.width = width; + this.height = height; + this.x = x; + this.y = y; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(parentWidth * width, parentHeight * height); + this.fixAndSetPosition(); + this._onResized(); + } + _onResized() {} + #addResizeToUndoStack() { + if (!this.#savedDimensions) { + return; + } + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#savedDimensions = null; + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight), + undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight), + mustExec: true + }); + } + static _round(x) { + return Math.round(x * 10000) / 10000; + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]); + const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let deltaX, deltaY; + if (!event.fromKeyboard) { + const { + screenX, + screenY + } = event; + const [lastScreenX, lastScreenY] = this.#lastPointerCoords; + [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY); + this.#lastPointerCoords[0] = screenX; + this.#lastPointerCoords[1] = screenY; + } else { + ({ + deltaX, + deltaY + } = event); + } + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = Math.max(minWidth, Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))) / savedWidth; + } else { + ratioY = Math.max(minHeight, Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))) / savedHeight; + } + const newWidth = AnnotationEditor._round(savedWidth * ratioX); + const newHeight = AnnotationEditor._round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + this._onResizing(); + } + _onResizing() {} + altTextFinish() { + this.#altText?.finish(); + } + async addEditToolbar() { + if (this._editToolbar || this.#isInEditMode) { + return this._editToolbar; + } + this._editToolbar = new EditorToolbar(this); + this.div.append(this._editToolbar.render()); + if (this.#altText) { + await this._editToolbar.addAltText(this.#altText); + } + return this._editToolbar; + } + removeEditToolbar() { + if (!this._editToolbar) { + return; + } + this._editToolbar.remove(); + this._editToolbar = null; + this.#altText?.destroy(); + } + addContainer(container) { + const editToolbarDiv = this._editToolbar?.div; + if (editToolbarDiv) { + editToolbarDiv.before(container); + } else { + this.div.append(container); + } + } + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + async addAltTextButton() { + if (this.#altText) { + return; + } + AltText.initialize(AnnotationEditor._l10n); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } + await this.addEditToolbar(); + } + get altTextData() { + return this.#altText?.data; + } + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + get guessedAltText() { + return this.#altText?.guessedText; + } + async setGuessedAltText(text) { + await this.#altText?.setGuessedText(text); + } + serializeAltText(isForCopying) { + return this.#altText?.serialize(isForCopying); + } + hasAltText() { + return !!this.#altText && !this.#altText.isEmpty(); + } + hasAltTextData() { + return this.#altText?.hasData() ?? false; + } + render() { + this.div = document.createElement("div"); + this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + this.div.className = this.name; + this.div.setAttribute("id", this.id); + this.div.tabIndex = this.#disabled ? -1 : 0; + if (!this._isVisible) { + this.div.classList.add("hidden"); + } + this.setInForeground(); + this.#addFocusListeners(); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + this.div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, this.div, ["pointerdown"]); + if (this.isResizable && this._uiManager._supportsPinchToZoom) { + this.#touchManager ||= new TouchManager({ + container: this.div, + isPinchingDisabled: () => !this.isSelected, + onPinchStart: this.#touchPinchStartCallback.bind(this), + onPinching: this.#touchPinchCallback.bind(this), + onPinchEnd: this.#touchPinchEndCallback.bind(this), + signal: this._uiManager._signal + }); + } + this._uiManager._editorUndoBar?.hide(); + return this.div; + } + #touchPinchStartCallback() { + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + this.#altText?.toggle(false); + this.parent.togglePointerEvents(false); + } + #touchPinchCallback(_origin, prevDistance, distance) { + const slowDownFactor = 0.7; + let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor; + if (factor === 1) { + return; + } + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + const newWidth = AnnotationEditor._round(savedWidth * factor); + const newHeight = AnnotationEditor._round(savedHeight * factor); + if (newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight]; + const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2); + const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]); + const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]); + const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2); + this.x = centerX - newTransfCenterPoint[0]; + this.y = centerY - newTransfCenterPoint[1]; + this.width = newWidth; + this.height = newHeight; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + this._onResizing(); + } + #touchPinchEndCallback() { + this.#altText?.toggle(true); + this.parent.togglePointerEvents(true); + this.#addResizeToUndoStack(); + } + pointerdown(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); + } + get isSelected() { + return this._uiManager.isSelected(this); + } + #selectOnPointerEvent(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + } + #setUpDragSession(event) { + const { + isSelected + } = this; + this._uiManager.setUpDragSession(); + let hasDraggingStarted = false; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + const opts = { + capture: true, + passive: false, + signal + }; + const cancelDrag = e => { + ac.abort(); + this.#dragPointerId = null; + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(e); + } + if (hasDraggingStarted) { + this._onStopDragging(); + } + }; + if (isSelected) { + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + this.#dragPointerId = event.pointerId; + this.#dragPointerType = event.pointerType; + window.addEventListener("pointermove", e => { + if (!hasDraggingStarted) { + hasDraggingStarted = true; + this._onStartDragging(); + } + const { + clientX: x, + clientY: y, + pointerId + } = e; + if (pointerId !== this.#dragPointerId) { + stopEvent(e); + return; + } + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + }, opts); + window.addEventListener("touchmove", stopEvent, opts); + window.addEventListener("pointerdown", e => { + if (e.pointerType === this.#dragPointerType) { + if (this.#touchManager || e.isPrimary) { + cancelDrag(e); + } + } + stopEvent(e); + }, opts); + } + const pointerUpCallback = e => { + if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) { + cancelDrag(e); + return; + } + stopEvent(e); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + _onStartDragging() {} + _onStopDragging() {} + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + } + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); + } + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + this._onTranslated(); + } + getRect(tx, ty, rotation = this.rotation) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } + } + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } + } + onceAdded(focus) {} + isEmpty() { + return false; + } + enableEditMode() { + this.#isInEditMode = true; + } + disableEditMode() { + this.#isInEditMode = false; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + get isOnScreen() { + const { + top, + left, + bottom, + right + } = this.getClientDimensions(); + const { + innerHeight, + innerWidth + } = window; + return left < innerWidth && right > 0 && top < innerHeight && bottom > 0; + } + #addFocusListeners() { + if (this.#focusAC || !this.div) { + return; + } + this.#focusAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#focusAC); + this.div.addEventListener("focusin", this.focusin.bind(this), { + signal + }); + this.div.addEventListener("focusout", this.focusout.bind(this), { + signal + }); + } + rebuild() { + this.#addFocusListeners(); + } + rotate(_angle) {} + resize() {} + serializeDeleted() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex, + popupRef: this._initialData?.popupRef || "" + }; + } + serialize(isForCopying = false, context = null) { + unreachable("An editor must be serializable"); + } + static async deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: parent.getNextId(), + uiManager + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.#focusAC?.abort(); + this.#focusAC = null; + if (!this.isEmpty()) { + this.commit(); + } + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); + } + this.#telemetryTimeouts = null; + } + this.parent = null; + this.#touchManager?.destroy(); + this.#touchManager = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + bindEvents(this, this.div, ["keydown"]); + } + } + get toolbarPosition() { + return null; + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; + } + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + } + } + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); + } + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + deltaX: x, + deltaY: y, + fromKeyboard: true + }); + } + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + this.#addResizeToUndoStack(); + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this._editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this._editToolbar?.show(); + } + }); + return; + } + this._editToolbar?.show(); + this.#altText?.toggleAltTextBadge(false); + } + unselect() { + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this._editToolbar?.hide(); + this.#altText?.toggleAltTextBadge(true); + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + enterInEditMode() {} + getImageForAltText() { + return null; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + setAspectRatio(width, height) { + this.#keepAspectRatio = true; + const aspectRatio = width / height; + const { + style + } = this.div; + style.aspectRatio = aspectRatio; + style.height = "auto"; + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); + const { + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; + } + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; + } + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + renderAnnotationElement(annotation) { + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstChild + } = annotation.container; + if (firstChild?.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) { + firstChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return this.serializeDeleted(); + } +} + +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/display/annotation_storage.js + + + +const SerializableEmpty = Object.freeze({ + map: null, + hash: "", + transfer: undefined +}); +class AnnotationStorage { + #modified = false; + #modifiedIds = null; + #storage = new Map(); + constructor() { + this.onSetModified = null; + this.onResetModified = null; + this.onAnnotationEditor = null; + } + getValue(key, defaultValue) { + const value = this.#storage.get(key); + if (value === undefined) { + return defaultValue; + } + return Object.assign(defaultValue, value); + } + getRawValue(key) { + return this.#storage.get(key); + } + remove(key) { + this.#storage.delete(key); + if (this.#storage.size === 0) { + this.resetModified(); + } + if (typeof this.onAnnotationEditor === "function") { + for (const value of this.#storage.values()) { + if (value instanceof AnnotationEditor) { + return; + } + } + this.onAnnotationEditor(null); + } + } + setValue(key, value) { + const obj = this.#storage.get(key); + let modified = false; + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + modified = true; + this.#storage.set(key, value); + } + if (modified) { + this.#setModified(); + } + if (value instanceof AnnotationEditor && typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } + } + has(key) { + return this.#storage.has(key); + } + getAll() { + return this.#storage.size > 0 ? objectFromMap(this.#storage) : null; + } + setAll(obj) { + for (const [key, val] of Object.entries(obj)) { + this.setValue(key, val); + } + } + get size() { + return this.#storage.size; + } + #setModified() { + if (!this.#modified) { + this.#modified = true; + if (typeof this.onSetModified === "function") { + this.onSetModified(); + } + } + } + resetModified() { + if (this.#modified) { + this.#modified = false; + if (typeof this.onResetModified === "function") { + this.onResetModified(); + } + } + } + get print() { + return new PrintAnnotationStorage(this); + } + get serializable() { + if (this.#storage.size === 0) { + return SerializableEmpty; + } + const map = new Map(), + hash = new MurmurHash3_64(), + transfer = []; + const context = Object.create(null); + let hasBitmap = false; + for (const [key, val] of this.#storage) { + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (serialized) { + map.set(key, serialized); + hash.update(`${key}:${JSON.stringify(serialized)}`); + hasBitmap ||= !!serialized.bitmap; + } + } + if (hasBitmap) { + for (const value of map.values()) { + if (value.bitmap) { + transfer.push(value.bitmap); + } + } + } + return map.size > 0 ? { + map, + hash: hash.hexdigest(), + transfer + } : SerializableEmpty; + } + get editorStats() { + let stats = null; + const typeToEditor = new Map(); + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor)) { + continue; + } + const editorStats = value.telemetryFinalData; + if (!editorStats) { + continue; + } + const { + type + } = editorStats; + if (!typeToEditor.has(type)) { + typeToEditor.set(type, Object.getPrototypeOf(value).constructor); + } + stats ||= Object.create(null); + const map = stats[type] ||= new Map(); + for (const [key, val] of Object.entries(editorStats)) { + if (key === "type") { + continue; + } + let counters = map.get(key); + if (!counters) { + counters = new Map(); + map.set(key, counters); + } + const count = counters.get(val) ?? 0; + counters.set(val, count + 1); + } + } + for (const [type, editor] of typeToEditor) { + stats[type] = editor.computeTelemetryFinalData(stats[type]); + } + return stats; + } + resetModifiedIds() { + this.#modifiedIds = null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor) || !value.annotationElementId || !value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + return this.#modifiedIds = { + ids: new Set(ids), + hash: ids.join(",") + }; + } +} +class PrintAnnotationStorage extends AnnotationStorage { + #serializable; + constructor(parent) { + super(); + const { + map, + hash, + transfer + } = parent.serializable; + const clone = structuredClone(map, transfer ? { + transfer + } : null); + this.#serializable = { + map: clone, + hash, + transfer + }; + } + get print() { + unreachable("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return this.#serializable; + } + get modifiedIds() { + return shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } +} + +;// ./src/display/font_loader.js + +class FontLoader { + #systemFonts = new Set(); + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.nativeFontFaces = new Set(); + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + removeNativeFontFace(nativeFontFace) { + this.nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(nativeFontFace); + } + insertRule(rule) { + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); + } + const styleSheet = this.styleElement.sheet; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + clear() { + for (const nativeFontFace of this.nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); + } + this.nativeFontFaces.clear(); + this.#systemFonts.clear(); + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; + } + } + async loadSystemFont({ + systemFontInfo: info, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + assert(!this.disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); + } + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } + } + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { + return; + } + await new Promise(resolve => { + const request = this._queueLoadingCallback(resolve); + this._prepareFontLoadEvent(font, request); + }); + } + } + get isFontLoadingAPISupported() { + const hasFonts = !!this._document?.fonts; + return shadow(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + let supported = false; + if (isNodeJS) { + supported = true; + } else if (typeof navigator !== "undefined" && typeof navigator?.userAgent === "string" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) { + supported = true; + } + return shadow(this, "isSyncFontLoadingSupported", supported); + } + _queueLoadingCallback(callback) { + function completeRequest() { + assert(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.callback, 0); + } + } + const { + loadingRequests + } = this; + const request = { + done: false, + complete: completeRequest, + callback + }; + loadingRequests.push(request); + return request; + } + get _loadTestFont() { + const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + return shadow(this, "_loadTestFont", testFont); + } + _prepareFontLoadEvent(font, request) { + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function spliceString(s, offset, remove, insert) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + warn("Load test font never loaded."); + callback(); + return; + } + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + request.complete(); + }); + } +} +class FontFaceObject { + constructor(translatedData, { + disableFontFace = false, + fontExtraProperties = false, + inspectFont = null + }) { + this.compiledGlyphs = Object.create(null); + for (const i in translatedData) { + this[i] = translatedData[i]; + } + this.disableFontFace = disableFontFace === true; + this.fontExtraProperties = fontExtraProperties === true; + this._inspectFont = inspectFont; + } + createNativeFontFace() { + if (!this.data || this.disableFontFace) { + return null; + } + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, this.data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); + } + this._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + if (!this.data || this.disableFontFace) { + return null; + } + const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } + rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; + } + this._inspectFont?.(this, url); + return rule; + } + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; + } + const objId = this.loadedName + "_path_" + character; + let cmds; + try { + cmds = objs.get(objId); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + const path = new Path2D(cmds || ""); + if (!this.fontExtraProperties) { + objs.delete(objId); + } + return this.compiledGlyphs[character] = path; + } +} + +;// ./src/shared/message_handler.js + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof MissingPDFException || ex instanceof PasswordException || ex instanceof UnexpectedResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "MissingPDFException": + return new MissingPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "UnexpectedResponseException": + return new UnexpectedResponseException(ex.message, ex.status); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/display/canvas_factory.js + +class BaseCanvasFactory { + #enableHWA = false; + constructor({ + enableHWA = false + }) { + this.#enableHWA = enableHWA; + } + create(width, height) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + const canvas = this._createCanvas(width, height); + return { + canvas, + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) + }; + } + reset(canvasAndContext, width, height) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + canvasAndContext.canvas.width = width; + canvasAndContext.canvas.height = height; + } + destroy(canvasAndContext) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + canvasAndContext.canvas.width = 0; + canvasAndContext.canvas.height = 0; + canvasAndContext.canvas = null; + canvasAndContext.context = null; + } + _createCanvas(width, height) { + unreachable("Abstract method `_createCanvas` called."); + } +} +class DOMCanvasFactory extends BaseCanvasFactory { + constructor({ + ownerDocument = globalThis.document, + enableHWA = false + }) { + super({ + enableHWA + }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} + +;// ./src/display/cmap_reader_factory.js + + +class BaseCMapReaderFactory { + constructor({ + baseUrl = null, + isCompressed = true + }) { + this.baseUrl = baseUrl; + this.isCompressed = isCompressed; + } + async fetch({ + name + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided."); + } + if (!name) { + throw new Error("CMap name must be specified."); + } + const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); + return this._fetch(url).then(cMapData => ({ + cMapData, + isCompressed: this.isCompressed + })).catch(reason => { + throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + const data = await fetchData(url, this.isCompressed ? "arraybuffer" : "text"); + return data instanceof ArrayBuffer ? new Uint8Array(data) : stringToBytes(data); + } +} + +;// ./src/display/filter_factory.js + + +class BaseFilterFactory { + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + destroy(keepHCM = false) {} +} +class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + }) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #createTables(maps) { + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + const table = buffer.join(","); + return [table, table, table]; + } + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; + } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = url.split("#", 1)[0]; + } + } + } + return `url(${this.#baseUrl}#${id})`; + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; + } + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; + } + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; + } + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#defs.style.color = ""; + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#_hcmCache?.size) { + return; + } + this.#_defs?.parentNode.parentNode.remove(); + this.#_defs = null; + this.#_cache?.clear(); + this.#_cache = null; + this.#_hcmCache?.clear(); + this.#_hcmCache = null; + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + } +} + +;// ./src/display/standard_fontdata_factory.js + + +class BaseStandardFontDataFactory { + constructor({ + baseUrl = null + }) { + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided."); + } + if (!filename) { + throw new Error("Font filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetch(url).catch(reason => { + throw new Error(`Unable to load font data at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + const data = await fetchData(url, "arraybuffer"); + return new Uint8Array(data); + } +} + +;// ./src/display/node_utils.js + + + + + +if (isNodeJS) { + warn("Please use the `legacy` build in Node.js environments."); +} +async function node_utils_fetchData(url) { + const fs = process.getBuiltinModule("fs"); + const data = await fs.promises.readFile(url); + return new Uint8Array(data); +} +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + const canvas = require("@napi-rs/canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} +class NodeStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} + +;// ./src/display/pattern_helper.js + + +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +function applyBoundingBox(ctx, bbox) { + if (!bbox) { + return; + } + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const region = new Path2D(); + region.rect(bbox[0], bbox[1], width, height); + ctx.clip(region); +} +class BaseShadingPattern { + getPattern() { + unreachable("Abstract method `getPattern` called."); + } +} +class RadialAxialShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._type = IR[1]; + this._bbox = IR[2]; + this._colorStops = IR[3]; + this._p0 = IR[4]; + this._p1 = IR[5]; + this._r0 = IR[6]; + this._r1 = IR[7]; + this.matrix = null; + } + _createGradient(ctx) { + let grad; + if (this._type === "axial") { + grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); + } else if (this._type === "radial") { + grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); + } + for (const colorStop of this._colorStops) { + grad.addColorStop(colorStop[0], colorStop[1]); + } + return grad; + } + getPattern(ctx, owner, inverse, pathType) { + let pattern; + if (pathType === PathType.STROKE || pathType === PathType.FILL) { + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0]; + const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; + const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.beginPath(); + tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); + inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); + tmpCtx.transform(...owner.baseTransform); + if (this.matrix) { + tmpCtx.transform(...this.matrix); + } + applyBoundingBox(tmpCtx, this._bbox); + tmpCtx.fillStyle = this._createGradient(tmpCtx); + tmpCtx.fill(); + pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + const domMatrix = new DOMMatrix(inverse); + pattern.setTransform(domMatrix); + } else { + applyBoundingBox(ctx, this._bbox); + pattern = this._createGradient(ctx); + } + return pattern; + } +} +function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let tmp; + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + if (coords[p2 + 1] > coords[p3 + 1]) { + tmp = p2; + p2 = p3; + p3 = tmp; + tmp = c2; + c2 = c3; + c3 = tmp; + } + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + const x1 = (coords[p1] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + const c1r = colors[c1], + c1g = colors[c1 + 1], + c1b = colors[c1 + 2]; + const c2r = colors[c2], + c2g = colors[c2 + 1], + c2b = colors[c2 + 2]; + const c3r = colors[c3], + c3g = colors[c3 + 1], + c3b = colors[c3 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + for (let y = minY; y <= maxY; y++) { + if (y < y2) { + const k = y < y1 ? 0 : (y1 - y) / (y1 - y2); + xa = x1 - (x1 - x2) * k; + car = c1r - (c1r - c2r) * k; + cag = c1g - (c1g - c2g) * k; + cab = c1b - (c1b - c2b) * k; + } else { + let k; + if (y > y3) { + k = 1; + } else if (y2 === y3) { + k = 0; + } else { + k = (y2 - y) / (y2 - y3); + } + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + let k; + if (y < y1) { + k = 0; + } else if (y > y3) { + k = 1; + } else { + k = (y1 - y) / (y1 - y3); + } + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; + for (let x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + if (k < 0) { + k = 0; + } else if (k > 1) { + k = 1; + } + bytes[j++] = car - (car - cbr) * k | 0; + bytes[j++] = cag - (cag - cbg) * k | 0; + bytes[j++] = cab - (cab - cbb) * k | 0; + bytes[j++] = 255; + } + } +} +function drawFigure(data, figure, context) { + const ps = figure.coords; + const cs = figure.colors; + let i, ii; + switch (figure.type) { + case "lattice": + const verticesPerRow = figure.verticesPerRow; + const rows = Math.floor(ps.length / verticesPerRow) - 1; + const cols = verticesPerRow - 1; + for (i = 0; i < rows; i++) { + let q = i * verticesPerRow; + for (let j = 0; j < cols; j++, q++) { + drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); + drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); + } + } + break; + case "triangles": + for (i = 0, ii = ps.length; i < ii; i += 3) { + drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); + } + break; + default: + throw new Error("illegal figure"); + } +} +class MeshShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._coords = IR[2]; + this._colors = IR[3]; + this._figures = IR[4]; + this._bounds = IR[5]; + this._bbox = IR[7]; + this._background = IR[8]; + this.matrix = null; + } + _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(this._bounds[0]); + const offsetY = Math.floor(this._bounds[1]); + const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; + const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const scaleX = boundsWidth / width; + const scaleY = boundsHeight / height; + const context = { + coords: this._coords, + colors: this._colors, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight); + const tmpCtx = tmpCanvas.context; + const data = tmpCtx.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } + } + for (const figure of this._figures) { + drawFigure(data, figure, context); + } + tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); + const canvas = tmpCanvas.canvas; + return { + canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX, + scaleY + }; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + let scale; + if (pathType === PathType.SHADING) { + scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx)); + } else { + scale = Util.singularValueDecompose2dScale(owner.baseTransform); + if (this.matrix) { + const matrixScale = Util.singularValueDecompose2dScale(this.matrix); + scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; + } + } + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); + if (pathType !== PathType.SHADING) { + ctx.setTransform(...owner.baseTransform); + if (this.matrix) { + ctx.transform(...this.matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + } +} +class DummyShadingPattern extends BaseShadingPattern { + getPattern() { + return "hotpink"; + } +} +function getShadingPattern(IR) { + switch (IR[0]) { + case "RadialAxial": + return new RadialAxialShadingPattern(IR); + case "Mesh": + return new MeshShadingPattern(IR); + case "Dummy": + return new DummyShadingPattern(); + } + throw new Error(`Unknown IR type: ${IR[0]}`); +} +const PaintType = { + COLORED: 1, + UNCOLORED: 2 +}; +class TilingPattern { + static MAX_PATTERN_SIZE = 3000; + constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) { + this.operatorList = IR[2]; + this.matrix = IR[3]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.color = color; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + } + createPatternCanvas(owner) { + const { + bbox, + operatorList, + paintType, + tilingType, + color, + canvasGraphicsFactory + } = this; + let { + xstep, + ystep + } = this; + xstep = Math.abs(xstep); + ystep = Math.abs(ystep); + info("TilingType: " + tilingType); + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; + const width = x1 - x0; + const height = y1 - y0; + const matrixScale = Util.singularValueDecompose2dScale(this.matrix); + const curMatrixScale = Util.singularValueDecompose2dScale(this.baseTransform); + const combinedScaleX = matrixScale[0] * curMatrixScale[0]; + const combinedScaleY = matrixScale[1] * curMatrixScale[1]; + let canvasWidth = width, + canvasHeight = height, + redrawHorizontally = false, + redrawVertically = false; + const xScaledStep = Math.ceil(xstep * combinedScaleX); + const yScaledStep = Math.ceil(ystep * combinedScaleY); + const xScaledWidth = Math.ceil(width * combinedScaleX); + const yScaledHeight = Math.ceil(height * combinedScaleY); + if (xScaledStep >= xScaledWidth) { + canvasWidth = xstep; + } else { + redrawHorizontally = true; + } + if (yScaledStep >= yScaledHeight) { + canvasHeight = ystep; + } else { + redrawVertically = true; + } + const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(graphics, paintType, color); + tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0); + graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + this.clipBbox(graphics, x0, y0, x1, y1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(operatorList); + graphics.endDrawing(); + tmpCtx.restore(); + if (redrawHorizontally || redrawVertically) { + const image = tmpCanvas.canvas; + if (redrawHorizontally) { + canvasWidth = xstep; + } + if (redrawVertically) { + canvasHeight = ystep; + } + const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const xSize = dimx2.size; + const ySize = dimy2.size; + const tmpCanvas2 = owner.cachedCanvases.getCanvas("pattern-workaround", xSize, ySize); + const tmpCtx2 = tmpCanvas2.context; + const ii = redrawHorizontally ? Math.floor(width / xstep) : 0; + const jj = redrawVertically ? Math.floor(height / ystep) : 0; + for (let i = 0; i <= ii; i++) { + for (let j = 0; j <= jj; j++) { + tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize); + } + } + return { + canvas: tmpCanvas2.canvas, + scaleX: dimx2.scale, + scaleY: dimy2.scale, + offsetX: x0, + offsetY: y0 + }; + } + return { + canvas: tmpCanvas.canvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: x0, + offsetY: y0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + return { + scale, + size + }; + } + clipBbox(graphics, x0, y0, x1, y1) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); + graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [x0, y0, x1, y1]); + graphics.clip(); + graphics.endPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + const context = graphics.ctx, + current = graphics.current; + switch (paintType) { + case PaintType.COLORED: + const ctx = this.ctx; + context.fillStyle = ctx.fillStyle; + context.strokeStyle = ctx.strokeStyle; + current.fillColor = ctx.fillStyle; + current.strokeColor = ctx.strokeStyle; + break; + case PaintType.UNCOLORED: + const cssColor = Util.makeHexColor(color[0], color[1], color[2]); + context.fillStyle = cssColor; + context.strokeStyle = cssColor; + current.fillColor = cssColor; + current.strokeColor = cssColor; + break; + default: + throw new FormatError(`Unsupported paint type: ${paintType}`); + } + } + getPattern(ctx, owner, inverse, pathType) { + let matrix = inverse; + if (pathType !== PathType.SHADING) { + matrix = Util.transform(matrix, owner.baseTransform); + if (this.matrix) { + matrix = Util.transform(matrix, this.matrix); + } + } + const temporaryPatternCanvas = this.createPatternCanvas(owner); + let domMatrix = new DOMMatrix(matrix); + domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + pattern.setTransform(domMatrix); + return pattern; + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/display/canvas.js + + + + +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const MAX_SIZE_TO_COMPILE = 1000; +const FULL_CHUNK_HEIGHT = 16; +function mirrorContextOperations(ctx, destCtx) { + if (ctx._removeMirroring) { + throw new Error("Context is already forwarding operations."); + } + ctx.__originalSave = ctx.save; + ctx.__originalRestore = ctx.restore; + ctx.__originalRotate = ctx.rotate; + ctx.__originalScale = ctx.scale; + ctx.__originalTranslate = ctx.translate; + ctx.__originalTransform = ctx.transform; + ctx.__originalSetTransform = ctx.setTransform; + ctx.__originalResetTransform = ctx.resetTransform; + ctx.__originalClip = ctx.clip; + ctx.__originalMoveTo = ctx.moveTo; + ctx.__originalLineTo = ctx.lineTo; + ctx.__originalBezierCurveTo = ctx.bezierCurveTo; + ctx.__originalRect = ctx.rect; + ctx.__originalClosePath = ctx.closePath; + ctx.__originalBeginPath = ctx.beginPath; + ctx._removeMirroring = () => { + ctx.save = ctx.__originalSave; + ctx.restore = ctx.__originalRestore; + ctx.rotate = ctx.__originalRotate; + ctx.scale = ctx.__originalScale; + ctx.translate = ctx.__originalTranslate; + ctx.transform = ctx.__originalTransform; + ctx.setTransform = ctx.__originalSetTransform; + ctx.resetTransform = ctx.__originalResetTransform; + ctx.clip = ctx.__originalClip; + ctx.moveTo = ctx.__originalMoveTo; + ctx.lineTo = ctx.__originalLineTo; + ctx.bezierCurveTo = ctx.__originalBezierCurveTo; + ctx.rect = ctx.__originalRect; + ctx.closePath = ctx.__originalClosePath; + ctx.beginPath = ctx.__originalBeginPath; + delete ctx._removeMirroring; + }; + ctx.save = function ctxSave() { + destCtx.save(); + this.__originalSave(); + }; + ctx.restore = function ctxRestore() { + destCtx.restore(); + this.__originalRestore(); + }; + ctx.translate = function ctxTranslate(x, y) { + destCtx.translate(x, y); + this.__originalTranslate(x, y); + }; + ctx.scale = function ctxScale(x, y) { + destCtx.scale(x, y); + this.__originalScale(x, y); + }; + ctx.transform = function ctxTransform(a, b, c, d, e, f) { + destCtx.transform(a, b, c, d, e, f); + this.__originalTransform(a, b, c, d, e, f); + }; + ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { + destCtx.setTransform(a, b, c, d, e, f); + this.__originalSetTransform(a, b, c, d, e, f); + }; + ctx.resetTransform = function ctxResetTransform() { + destCtx.resetTransform(); + this.__originalResetTransform(); + }; + ctx.rotate = function ctxRotate(angle) { + destCtx.rotate(angle); + this.__originalRotate(angle); + }; + ctx.clip = function ctxRotate(rule) { + destCtx.clip(rule); + this.__originalClip(rule); + }; + ctx.moveTo = function (x, y) { + destCtx.moveTo(x, y); + this.__originalMoveTo(x, y); + }; + ctx.lineTo = function (x, y) { + destCtx.lineTo(x, y); + this.__originalLineTo(x, y); + }; + ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + }; + ctx.rect = function (x, y, width, height) { + destCtx.rect(x, y, width, height); + this.__originalRect(x, y, width, height); + }; + ctx.closePath = function () { + destCtx.closePath(); + this.__originalClosePath(); + }; + ctx.beginPath = function () { + destCtx.beginPath(); + this.__originalBeginPath(); + }; +} +class CachedCanvases { + constructor(canvasFactory) { + this.canvasFactory = canvasFactory; + this.cache = Object.create(null); + } + getCanvas(id, width, height) { + let canvasEntry; + if (this.cache[id] !== undefined) { + canvasEntry = this.cache[id]; + this.canvasFactory.reset(canvasEntry, width, height); + } else { + canvasEntry = this.canvasFactory.create(width, height); + this.cache[id] = canvasEntry; + } + return canvasEntry; + } + delete(id) { + delete this.cache[id]; + } + clear() { + for (const id in this.cache) { + const canvasEntry = this.cache[id]; + this.canvasFactory.destroy(canvasEntry); + delete this.cache[id]; + } + } +} +function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { + const [a, b, c, d, tx, ty] = getCurrentTransform(ctx); + if (b === 0 && c === 0) { + const tlX = destX * a + tx; + const rTlX = Math.round(tlX); + const tlY = destY * d + ty; + const rTlY = Math.round(tlY); + const brX = (destX + destW) * a + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destY + destH) * d + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); + ctx.setTransform(a, b, c, d, tx, ty); + return [rWidth, rHeight]; + } + if (a === 0 && d === 0) { + const tlX = destY * c + tx; + const rTlX = Math.round(tlX); + const tlY = destX * b + ty; + const rTlY = Math.round(tlY); + const brX = (destY + destH) * c + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destX + destW) * b + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); + ctx.setTransform(a, b, c, d, tx, ty); + return [rHeight, rWidth]; + } + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + const scaleX = Math.hypot(a, b); + const scaleY = Math.hypot(c, d); + return [scaleX * destW, scaleY * destH]; +} +function compileType3Glyph(imgData) { + const { + width, + height + } = imgData; + if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { + return null; + } + const POINT_TO_PROCESS_LIMIT = 1000; + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const width1 = width + 1; + let points = new Uint8Array(width1 * (height + 1)); + let i, j, j0; + const lineSize = width + 7 & ~7; + let data = new Uint8Array(lineSize * height), + pos = 0; + for (const elem of imgData.data) { + let mask = 128; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + let count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const path = new Path2D(); + for (i = 0; count && i <= height; i++) { + let p = i * width1; + const end = p + width; + while (p < end && !points[p]) { + p++; + } + if (p === end) { + continue; + } + path.moveTo(p % width1, i); + const p0 = p; + let type = points[p]; + do { + const step = steps[type]; + do { + p += step; + } while (!points[p]); + const pp = points[p]; + if (pp !== 5 && pp !== 10) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + points[p] &= type >> 2 | type << 2; + } + path.lineTo(p % width1, p / width1 | 0); + if (!points[p]) { + --count; + } + } while (p0 !== p); + --i; + } + data = null; + points = null; + const drawOutline = function (c) { + c.save(); + c.scale(1 / width, -1 / height); + c.translate(0, -height); + c.fill(path); + c.beginPath(); + c.restore(); + }; + return drawOutline; +} +class CanvasExtraState { + constructor(width, height) { + this.alphaIsShape = false; + this.fontSize = 0; + this.fontSizeScale = 1; + this.textMatrix = IDENTITY_MATRIX; + this.textMatrixScale = 1; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.leading = 0; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRenderingMode = TextRenderingMode.FILL; + this.textRise = 0; + this.fillColor = "#000000"; + this.strokeColor = "#000000"; + this.patternFill = false; + this.patternStroke = false; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.activeSMask = null; + this.transferMaps = "none"; + this.startNewPathAndClipBox([0, 0, width, height]); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + return clone; + } + setCurrentPoint(x, y) { + this.x = x; + this.y = y; + } + updatePathMinMax(transform, x, y) { + [x, y] = Util.applyTransform([x, y], transform); + this.minX = Math.min(this.minX, x); + this.minY = Math.min(this.minY, y); + this.maxX = Math.max(this.maxX, x); + this.maxY = Math.max(this.maxY, y); + } + updateRectMinMax(transform, rect) { + const p1 = Util.applyTransform(rect, transform); + const p2 = Util.applyTransform(rect.slice(2), transform); + const p3 = Util.applyTransform([rect[0], rect[3]], transform); + const p4 = Util.applyTransform([rect[2], rect[1]], transform); + this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]); + this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]); + this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]); + this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]); + } + updateScalingPathMinMax(transform, minMax) { + Util.scaleMinMax(transform, minMax); + this.minX = Math.min(this.minX, minMax[0]); + this.minY = Math.min(this.minY, minMax[1]); + this.maxX = Math.max(this.maxX, minMax[2]); + this.maxY = Math.max(this.maxY, minMax[3]); + } + updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + const box = Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax); + if (minMax) { + return; + } + this.updateRectMinMax(transform, box); + } + getPathBoundingBox(pathType = PathType.FILL, transform = null) { + const box = [this.minX, this.minY, this.maxX, this.maxY]; + if (pathType === PathType.STROKE) { + if (!transform) { + unreachable("Stroke bounding box must include transform."); + } + const scale = Util.singularValueDecompose2dScale(transform); + const xStrokePad = scale[0] * this.lineWidth / 2; + const yStrokePad = scale[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minX === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox = box; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = 0; + this.maxY = 0; + } + getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + if (imgData instanceof ImageData) { + ctx.putImageData(imgData, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0, + destPos; + const src = imgData.data; + const dest = chunkImgData.data; + let i, j, thisChunkHeight, elemsInThisChunk; + if (imgData.kind === util_ImageKind.GRAYSCALE_1BPP) { + const srcLength = src.byteLength; + const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); + const dest32DataLength = dest32.length; + const fullSrcDiff = width + 7 >> 3; + const white = 0xffffffff; + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + for (i = 0; i < totalChunks; i++) { + thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + destPos = 0; + for (j = 0; j < thisChunkHeight; j++) { + const srcDiff = srcLength - srcPos; + let k = 0; + const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + const kEndUnrolled = kEnd & ~7; + let mask = 0; + let srcByte = 0; + for (; k < kEndUnrolled; k += 8) { + srcByte = src[srcPos++]; + dest32[destPos++] = srcByte & 128 ? white : black; + dest32[destPos++] = srcByte & 64 ? white : black; + dest32[destPos++] = srcByte & 32 ? white : black; + dest32[destPos++] = srcByte & 16 ? white : black; + dest32[destPos++] = srcByte & 8 ? white : black; + dest32[destPos++] = srcByte & 4 ? white : black; + dest32[destPos++] = srcByte & 2 ? white : black; + dest32[destPos++] = srcByte & 1 ? white : black; + } + for (; k < kEnd; k++) { + if (mask === 0) { + srcByte = src[srcPos++]; + mask = 128; + } + dest32[destPos++] = srcByte & mask ? white : black; + mask >>= 1; + } + } + while (destPos < dest32DataLength) { + dest32[destPos++] = 0; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (imgData.kind === util_ImageKind.RGBA_32BPP) { + j = 0; + elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + ctx.putImageData(chunkImgData, 0, j); + } + } else if (imgData.kind === util_ImageKind.RGB_24BPP) { + thisChunkHeight = FULL_CHUNK_HEIGHT; + elemsInThisChunk = width * thisChunkHeight; + for (i = 0; i < totalChunks; i++) { + if (i >= fullChunks) { + thisChunkHeight = partialChunkHeight; + elemsInThisChunk = width * thisChunkHeight; + } + destPos = 0; + for (j = elemsInThisChunk; j--;) { + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = 255; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else { + throw new Error(`bad image kind: ${imgData.kind}`); + } +} +function putBinaryImageMask(ctx, imgData) { + if (imgData.bitmap) { + ctx.drawImage(imgData.bitmap, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + for (let i = 0; i < totalChunks; i++) { + const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: thisChunkHeight, + nonBlackColor: 0 + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; + for (const property of properties) { + if (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } +} +function resetCtxToDefault(ctx) { + ctx.strokeStyle = ctx.fillStyle = "#000000"; + ctx.fillRule = "nonzero"; + ctx.globalAlpha = 1; + ctx.lineWidth = 1; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 10; + ctx.globalCompositeOperation = "source-over"; + ctx.font = "10px sans-serif"; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([]); + ctx.lineDashOffset = 0; + } + if (!isNodeJS) { + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + } +} +function getImageSmoothingEnabled(transform, interpolate) { + if (interpolate) { + return true; + } + const scale = Util.singularValueDecompose2dScale(transform); + scale[0] = Math.fround(scale[0]); + scale[1] = Math.fround(scale[1]); + const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * PixelsPerInch.PDF_TO_CSS_UNITS); + return scale[0] <= actualScale && scale[1] <= actualScale; +} +const LINE_CAP_STYLES = ["butt", "round", "square"]; +const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; +const NORMAL_CLIP = {}; +const EO_CLIP = {}; +class CanvasGraphics { + constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { + optionalContentConfig, + markedContentStack = null + }, annotationCanvasMap, pageColors) { + this.ctx = canvasCtx; + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.stateStack = []; + this.pendingClip = null; + this.pendingEOFill = false; + this.res = null; + this.xobjs = null; + this.commonObjs = commonObjs; + this.objs = objs; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this.groupStack = []; + this.processingType3 = null; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.smaskCounter = 0; + this.tempSMask = null; + this.suspendedCtx = null; + this.contentVisible = true; + this.markedContentStack = markedContentStack || []; + this.optionalContentConfig = optionalContentConfig; + this.cachedCanvases = new CachedCanvases(this.canvasFactory); + this.cachedPatterns = new Map(); + this.annotationCanvasMap = annotationCanvasMap; + this.viewportScale = 1; + this.outputScaleX = 1; + this.outputScaleY = 1; + this.pageColors = pageColors; + this._cachedScaleForStroking = [-1, 0]; + this._cachedGetSinglePixelWidth = null; + this._cachedBitmapsMap = new Map(); + } + getObject(data, fallback = null) { + if (typeof data === "string") { + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + beginDrawing({ + transform, + viewport, + transparency = false, + background = null + }) { + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; + const savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.fillStyle = savedFillStyle; + if (transparency) { + const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); + this.compositeCtx = this.ctx; + this.transparentCanvas = transparentCanvas.canvas; + this.ctx = transparentCanvas.context; + this.ctx.save(); + this.ctx.transform(...getCurrentTransform(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx); + if (transform) { + this.ctx.transform(...transform); + this.outputScaleX = transform[0]; + this.outputScaleY = transform[0]; + } + this.ctx.transform(...viewport.transform); + this.viewportScale = viewport.scale; + this.baseTransform = getCurrentTransform(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; + if (argsArrayLen === i) { + return i; + } + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let fnId; + while (true) { + if (stepper !== undefined && i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + fnId = fnArray[i]; + if (fnId !== OPS.dependency) { + this[fnId].apply(this, argsArray[i]); + } else { + for (const depObjId of argsArray[i]) { + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + } + #restoreInitialState() { + while (this.stateStack.length || this.inSMaskMode) { + this.restore(); + } + this.current.activeSMask = null; + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.transparentCanvas = null; + } + } + endDrawing() { + this.#restoreInitialState(); + this.cachedCanvases.clear(); + this.cachedPatterns.clear(); + for (const cache of this._cachedBitmapsMap.values()) { + for (const canvas of cache.values()) { + if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { + canvas.width = canvas.height = 0; + } + } + cache.clear(); + } + this._cachedBitmapsMap.clear(); + this.#drawFilter(); + } + #drawFilter() { + if (this.pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } + } + _scaleImage(img, inverseTransform) { + const width = img.width ?? img.displayWidth; + const height = img.height ?? img.displayHeight; + let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + let paintWidth = width, + paintHeight = height; + let tmpCanvasId = "prescale1"; + let tmpCanvas, tmpCtx; + while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { + let newWidth = paintWidth, + newHeight = paintHeight; + if (widthScale > 2 && paintWidth > 1) { + newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); + widthScale /= paintWidth / newWidth; + } + if (heightScale > 2 && paintHeight > 1) { + newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2; + heightScale /= paintHeight / newHeight; + } + tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); + tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, newWidth, newHeight); + tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + img = tmpCanvas.canvas; + paintWidth = newWidth; + paintHeight = newHeight; + tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; + } + return { + img, + paintWidth, + paintHeight + }; + } + _createMaskCanvas(img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const currentTransform = getCurrentTransform(ctx); + let cache, cacheKey, scaled, maskCanvas; + if ((img.bitmap || img.data) && img.count > 1) { + const mainKey = img.bitmap || img.data.buffer; + cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); + cache = this._cachedBitmapsMap.get(mainKey); + if (!cache) { + cache = new Map(); + this._cachedBitmapsMap.set(mainKey, cache); + } + const cachedImage = cache.get(cacheKey); + if (cachedImage && !isPatternFill) { + const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); + const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox([0, 0, width, height], maskToCanvas); + const drawnWidth = Math.round(maxX - minX) || 1; + const drawnHeight = Math.round(maxY - minY) || 1; + const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = minX; + const offsetY = minY; + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + if (!scaled) { + scaled = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaled.img; + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + fillCtx.globalCompositeOperation = "source-in"; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + this.cachedCanvases.delete("fillCanvas"); + cache.set(cacheKey, fillCanvas.canvas); + } + return { + canvas: fillCanvas.canvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(width) { + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking[0] = -1; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(style) { + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(style) { + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(limit) { + this.ctx.miterLimit = limit; + } + setDash(dashArray, dashPhase) { + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(intent) {} + setFlatness(flatness) {} + setGState(states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(value); + break; + case "LC": + this.setLineCap(value); + break; + case "LJ": + this.setLineJoin(value); + break; + case "ML": + this.setMiterLimit(value); + break; + case "D": + this.setDash(value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(value); + break; + case "FL": + this.setFlatness(value); + break; + case "Font": + this.setFont(value[0], value[1]); + break; + case "CA": + this.current.strokeAlpha = value; + break; + case "ca": + this.current.fillAlpha = value; + this.ctx.globalAlpha = value; + break; + case "BM": + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.current.activeSMask = value ? this.tempSMask : null; + this.tempSMask = null; + this.checkSMaskState(); + break; + case "TR": + this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); + break; + } + } + } + get inSMaskMode() { + return !!this.suspendedCtx; + } + checkSMaskState() { + const inSMaskMode = this.inSMaskMode; + if (this.current.activeSMask && !inSMaskMode) { + this.beginSMaskMode(); + } else if (!this.current.activeSMask && inSMaskMode) { + this.endSMaskMode(); + } + } + beginSMaskMode() { + if (this.inSMaskMode) { + throw new Error("beginSMaskMode called while already in smask mode"); + } + const drawnWidth = this.ctx.canvas.width; + const drawnHeight = this.ctx.canvas.height; + const cacheId = "smaskGroupAt" + this.groupLevel; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + this.suspendedCtx = this.ctx; + this.ctx = scratchCanvas.context; + const ctx = this.ctx; + ctx.setTransform(...getCurrentTransform(this.suspendedCtx)); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + } + endSMaskMode() { + if (!this.inSMaskMode) { + throw new Error("endSMaskMode called while not in smask mode"); + } + this.ctx._removeMirroring(); + copyCtxState(this.ctx, this.suspendedCtx); + this.ctx = this.suspendedCtx; + this.suspendedCtx = null; + } + compose(dirtyBox) { + if (!this.current.activeSMask) { + return; + } + if (!dirtyBox) { + dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; + } else { + dirtyBox[0] = Math.floor(dirtyBox[0]); + dirtyBox[1] = Math.floor(dirtyBox[1]); + dirtyBox[2] = Math.ceil(dirtyBox[2]); + dirtyBox[3] = Math.ceil(dirtyBox[3]); + } + const smask = this.current.activeSMask; + const suspendedCtx = this.suspendedCtx; + this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + this.ctx.restore(); + } + composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + this.genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, 0, 0); + ctx.restore(); + } + genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { + let maskCanvas = maskCtx.canvas; + let maskX = layerOffsetX - maskOffsetX; + let maskY = layerOffsetY - maskOffsetY; + if (backdrop) { + const backdropRGB = Util.makeHexColor(...backdrop); + if (maskX < 0 || maskY < 0 || maskX + width > maskCanvas.width || maskY + height > maskCanvas.height) { + const canvas = this.cachedCanvases.getCanvas("maskExtension", width, height); + const ctx = canvas.context; + ctx.drawImage(maskCanvas, -maskX, -maskY); + ctx.globalCompositeOperation = "destination-atop"; + ctx.fillStyle = backdropRGB; + ctx.fillRect(0, 0, width, height); + ctx.globalCompositeOperation = "source-over"; + maskCanvas = canvas.canvas; + maskX = maskY = 0; + } else { + maskCtx.save(); + maskCtx.globalAlpha = 1; + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(maskX, maskY, width, height); + maskCtx.clip(clip); + maskCtx.globalCompositeOperation = "destination-atop"; + maskCtx.fillStyle = backdropRGB; + maskCtx.fillRect(maskX, maskY, width, height); + maskCtx.restore(); + } + } + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + if (subtype === "Alpha" && transferMap) { + layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap); + } else if (subtype === "Luminosity") { + layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap); + } + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save() { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + this.suspendedCtx.save(); + } else { + this.ctx.save(); + } + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + } + restore() { + if (this.stateStack.length === 0 && this.inSMaskMode) { + this.endSMaskMode(); + } + if (this.stateStack.length !== 0) { + this.current = this.stateStack.pop(); + if (this.inSMaskMode) { + this.suspendedCtx.restore(); + copyCtxState(this.suspendedCtx, this.ctx); + } else { + this.ctx.restore(); + } + this.checkSMaskState(); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + } + transform(a, b, c, d, e, f) { + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + constructPath(ops, args, minMax) { + const ctx = this.ctx; + const current = this.current; + let x = current.x, + y = current.y; + let startX, startY; + const currentTransform = getCurrentTransform(ctx); + const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0; + const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null; + for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { + switch (ops[i] | 0) { + case OPS.rectangle: + x = args[j++]; + y = args[j++]; + const width = args[j++]; + const height = args[j++]; + const xw = x + width; + const yh = y + height; + ctx.moveTo(x, y); + if (width === 0 || height === 0) { + ctx.lineTo(xw, yh); + } else { + ctx.lineTo(xw, y); + ctx.lineTo(xw, yh); + ctx.lineTo(x, yh); + } + if (!isScalingMatrix) { + current.updateRectMinMax(currentTransform, [x, y, xw, yh]); + } + ctx.closePath(); + break; + case OPS.moveTo: + x = args[j++]; + y = args[j++]; + ctx.moveTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case OPS.lineTo: + x = args[j++]; + y = args[j++]; + ctx.lineTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case OPS.curveTo: + startX = x; + startY = y; + x = args[j + 4]; + y = args[j + 5]; + ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier); + j += 6; + break; + case OPS.curveTo2: + startX = x; + startY = y; + ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); + current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier); + x = args[j + 2]; + y = args[j + 3]; + j += 4; + break; + case OPS.curveTo3: + startX = x; + startY = y; + x = args[j + 2]; + y = args[j + 3]; + ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier); + j += 4; + break; + case OPS.closePath: + ctx.closePath(); + break; + } + } + if (isScalingMatrix) { + current.updateScalingPathMinMax(currentTransform, minMaxForBezier); + } + current.setCurrentPoint(x, y); + } + closePath() { + this.ctx.closePath(); + } + stroke(consumePath = true) { + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; + ctx.globalAlpha = this.current.strokeAlpha; + if (this.contentVisible) { + if (typeof strokeColor === "object" && strokeColor?.getPattern) { + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + this.rescaleAndStroke(false); + ctx.restore(); + } else { + this.rescaleAndStroke(true); + } + } + if (consumePath) { + this.consumePath(this.current.getClippedPathBoundingBox()); + } + ctx.globalAlpha = this.current.fillAlpha; + } + closeStroke() { + this.closePath(); + this.stroke(); + } + fill(consumePath = true) { + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + if (isPatternFill) { + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + needRestore = true; + } + const intersect = this.current.getClippedPathBoundingBox(); + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill("evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(); + } + } + if (needRestore) { + ctx.restore(); + } + if (consumePath) { + this.consumePath(intersect); + } + } + eoFill() { + this.pendingEOFill = true; + this.fill(); + } + fillStroke() { + this.fill(false); + this.stroke(false); + this.consumePath(); + } + eoFillStroke() { + this.pendingEOFill = true; + this.fillStroke(); + } + closeFillStroke() { + this.closePath(); + this.fillStroke(); + } + closeEOFillStroke() { + this.pendingEOFill = true; + this.closePath(); + this.fillStroke(); + } + endPath() { + this.consumePath(); + } + clip() { + this.pendingClip = NORMAL_CLIP; + } + eoClip() { + this.pendingClip = EO_CLIP; + } + beginText() { + this.current.textMatrix = IDENTITY_MATRIX; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + endText() { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (paths === undefined) { + ctx.beginPath(); + return; + } + const newPath = new Path2D(); + const invTransf = ctx.getTransform().invertSelf(); + for (const { + transform, + x, + y, + fontSize, + path + } of paths) { + newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize)); + } + ctx.clip(newPath); + ctx.beginPath(); + delete this.pendingTextPaths; + } + setCharSpacing(spacing) { + this.current.charSpacing = spacing; + } + setWordSpacing(spacing) { + this.current.wordSpacing = spacing; + } + setHScale(scale) { + this.current.textHScale = scale / 100; + } + setLeading(leading) { + this.current.leading = -leading; + } + setFont(fontRefName, size) { + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; + if (!fontObj) { + throw new Error(`Can't find font for ${fontRefName}`); + } + current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + warn("Invalid font matrix for font " + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + const name = fontObj.loadedName || "sans-serif"; + const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + let browserFontSize = size; + if (size < MIN_FONT_SIZE) { + browserFontSize = MIN_FONT_SIZE; + } else if (size > MAX_FONT_SIZE) { + browserFontSize = MAX_FONT_SIZE; + } + this.current.fontSizeScale = size / browserFontSize; + this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; + } + setTextRenderingMode(mode) { + this.current.textRenderingMode = mode; + } + setTextRise(rise) { + this.current.textRise = rise; + } + moveText(x, y) { + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + } + setTextMatrix(a, b, c, d, e, f) { + this.current.textMatrix = [a, b, c, d, e, f]; + this.current.textMatrixScale = Math.hypot(a, b); + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + nextLine() { + this.moveText(0, this.current.leading); + } + #getScaledPath(path, currentTransform, transform) { + const newPath = new Path2D(); + newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)); + return newPath; + } + paintChar(character, x, y, patternFillTransform, patternStrokeTransform) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + const patternStroke = current.patternStroke && !font.missingFile; + let path; + if (font.disableFontFace || isAddToPathSet || patternFill || patternStroke) { + path = font.getPathGenerator(this.commonObjs, character); + } + if (font.disableFontFace || patternFill || patternStroke) { + ctx.save(); + ctx.translate(x, y); + ctx.scale(fontSize, -fontSize); + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternFillTransform) { + const currentTransform = ctx.getTransform(); + ctx.setTransform(...patternFillTransform); + ctx.fill(this.#getScaledPath(path, currentTransform, patternFillTransform)); + } else { + ctx.fill(path); + } + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternStrokeTransform) { + const currentTransform = ctx.getTransform(); + ctx.setTransform(...patternStrokeTransform); + ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform)); + } else { + ctx.lineWidth /= fontSize; + ctx.stroke(path); + } + } + ctx.restore(); + } else { + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.fillText(character, x, y); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.strokeText(character, x, y); + } + } + if (isAddToPathSet) { + const paths = this.pendingTextPaths ||= []; + paths.push({ + transform: getCurrentTransform(ctx), + x, + y, + fontSize, + path + }); + } + } + get isFontSubpixelAAEnabled() { + const { + context: ctx + } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); + ctx.scale(1.5, 1); + ctx.fillText("I", 0, 10); + const data = ctx.getImageData(0, 0, 10, 10).data; + let enabled = false; + for (let i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return shadow(this, "isFontSubpixelAAEnabled", enabled); + } + showText(glyphs) { + const current = this.current; + const font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + const fontSize = current.fontSize; + if (fontSize === 0) { + return undefined; + } + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + let patternFillTransform, patternStrokeTransform; + if (current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + patternFillTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + if (current.patternStroke) { + ctx.save(); + const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + patternStrokeTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.strokeStyle = pattern; + } + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + lineWidth = this.getSinglePixelWidth(); + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + if (font.isInvalidPDFjsFont) { + const chars = []; + let width = 0; + for (const glyph of glyphs) { + chars.push(glyph.unicode); + width += glyph.width; + } + ctx.fillText(chars.join(""), 0, 0); + current.x += width * widthAdvanceScale * textHScale; + ctx.restore(); + this.compose(); + return undefined; + } + let x = 0, + i; + for (i = 0; i < glyphsLength; ++i) { + const glyph = glyphs[i]; + if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + const vmetric = glyph.vmetric || defaultVMetrics; + const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + if (font.remeasure && width > 0) { + const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + const characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (this.contentVisible && (glyph.isInFont || font.missingFile)) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + } else { + this.paintChar(character, scaledX, scaledY, patternFillTransform, patternStrokeTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform); + } + } + } + const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + return undefined; + } + showType3Text(glyphs) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y); + ctx.scale(textHScale, fontDirection); + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (typeof glyph === "number") { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList[glyph.operatorListId]; + if (!operatorList) { + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + continue; + } + if (this.contentVisible) { + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const transformed = Util.applyTransform([glyph.width, 0], fontMatrix); + width = transformed[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + this.processingType3 = null; + } + setCharWidth(xWidth, yWidth) {} + setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { + this.ctx.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(); + this.endPath(); + } + getColorN_Pattern(IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const color = IR[1]; + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: ctx => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }) + }; + pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN() { + this.current.strokeColor = this.getColorN_Pattern(arguments); + this.current.patternStroke = true; + } + setFillColorN() { + this.current.fillColor = this.getColorN_Pattern(arguments); + this.current.patternFill = true; + } + setStrokeRGBColor(r, g, b) { + this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(r, g, b); + this.current.patternStroke = false; + } + setStrokeTransparent() { + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; + this.current.patternStroke = false; + } + setFillRGBColor(r, g, b) { + this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b); + this.current.patternFill = false; + } + setFillTransparent() { + this.ctx.fillStyle = this.current.fillColor = "transparent"; + this.current.patternFill = false; + } + _getPattern(objId, matrix = null) { + let pattern; + if (this.cachedPatterns.has(objId)) { + pattern = this.cachedPatterns.get(objId); + } else { + pattern = getShadingPattern(this.getObject(objId)); + this.cachedPatterns.set(objId, pattern); + } + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(objId) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + this.save(); + const pattern = this._getPattern(objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING); + const inv = getCurrentTransformInverse(ctx); + if (inv) { + const { + width, + height + } = ctx.canvas; + const [x0, y0, x1, y1] = Util.getAxialAlignedBoundingBox([0, 0, width, height], inv); + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(); + } + beginInlineImage() { + unreachable("Should not call beginInlineImage"); + } + beginImageData() { + unreachable("Should not call beginImageData"); + } + paintFormXObjectBegin(matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(); + this.baseTransformStack.push(this.baseTransform); + if (matrix) { + this.transform(...matrix); + } + this.baseTransform = getCurrentTransform(this.ctx); + if (bbox) { + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + this.ctx.rect(bbox[0], bbox[1], width, height); + this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox); + this.clip(); + this.endPath(); + } + } + paintFormXObjectEnd() { + if (!this.contentVisible) { + return; + } + this.restore(); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(group) { + if (!this.contentVisible) { + return; + } + this.save(); + if (this.inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if (!group.isolated) { + info("TODO: Support non-isolated groups."); + } + if (group.knockout) { + warn("Knockout groups not supported."); + } + const currentTransform = getCurrentTransform(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + if (!group.bbox) { + throw new Error("Bounding box is required."); + } + let bounds = Util.getAxialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx)); + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); + let cacheId = "groupAt" + this.groupLevel; + if (group.smask) { + cacheId += "_smask_" + this.smaskCounter++ % 2; + } + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + const groupCtx = scratchCanvas.context; + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } else { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.groupStack.push(currentCtx); + this.groupLevel++; + } + endGroup(group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(); + } else { + this.ctx.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx); + this.ctx.drawImage(groupCtx.canvas, 0, 0); + this.ctx.restore(); + this.compose(dirtyBox); + } + } + beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { + this.#restoreInitialState(); + resetCtxToDefault(this.ctx); + this.ctx.save(); + this.save(); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (rect) { + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; + if (hasOwnCanvas && this.annotationCanvasMap) { + transform = transform.slice(); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + rect = rect.slice(); + rect[0] = rect[1] = 0; + rect[2] = width; + rect[3] = height; + const [scaleX, scaleY] = Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx)); + const { + viewportScale + } = this; + const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); + const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); + this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); + const { + canvas, + context + } = this.annotationCanvas; + this.annotationCanvasMap.set(id, canvas); + this.annotationCanvas.savedCtx = this.ctx; + this.ctx = context; + this.ctx.save(); + this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); + resetCtxToDefault(this.ctx); + } else { + resetCtxToDefault(this.ctx); + this.endPath(); + this.ctx.rect(rect[0], rect[1], width, height); + this.ctx.clip(); + this.ctx.beginPath(); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.transform(...transform); + this.transform(...matrix); + } + endAnnotation() { + if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + } + paintImageMaskXObject(img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(img.data, img); + img.count = count; + const ctx = this.ctx; + const glyph = this.processingType3; + if (glyph) { + if (glyph.compiled === undefined) { + glyph.compiled = compileType3Glyph(img); + } + if (glyph.compiled) { + glyph.compiled(ctx); + return; + } + } + const mask = this._createMaskCanvas(img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + if (!this.contentVisible) { + return; + } + img = this.getObject(img.data, img); + const ctx = this.ctx; + ctx.save(); + const currentTransform = getCurrentTransform(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + const [x, y] = Util.applyTransform([0, 0], trans); + ctx.drawImage(mask.canvas, x, y); + } + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectGroup(images) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + for (const image of images) { + const { + data, + width, + height, + transform + } = image; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; + maskCtx.save(); + const img = this.getObject(data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform(...transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintImageXObject(objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(imgData); + } + paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + const width = imgData.width; + const height = imgData.height; + const map = []; + for (let i = 0, ii = positions.length; i < ii; i += 2) { + map.push({ + transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], + x: 0, + y: 0, + w: width, + h: height + }); + } + this.paintInlineImageXObjectGroup(imgData, map); + } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + if (this.current.transferMaps === "none") { + return imgData.bitmap; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = this.current.transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + return tmpCanvas.canvas; + } + paintInlineImageXObject(imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; + this.save(); + if (!isNodeJS) { + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + } + ctx.scale(1 / width, -1 / height); + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = this.applyTransferMapsToBitmap(imgData); + } else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { + imgToPaint = imgData; + } else { + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + this.compose(); + this.restore(); + } + paintInlineImageXObjectGroup(imgData, map) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = imgData.bitmap; + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintSolidColorImageMask() { + if (!this.contentVisible) { + return; + } + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + } + markPoint(tag) {} + markPointProps(tag, properties) {} + beginMarkedContent(tag) { + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(tag, properties) { + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent() { + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat() {} + endCompat() {} + consumePath(clipBox) { + const isEmpty = this.current.isEmptyClip(); + if (this.pendingClip) { + this.current.updateClipFromPath(); + } + if (!this.pendingClip) { + this.compose(clipBox); + } + const ctx = this.ctx; + if (this.pendingClip) { + if (!isEmpty) { + if (this.pendingClip === EO_CLIP) { + ctx.clip("evenodd"); + } else { + ctx.clip(); + } + } + this.pendingClip = null; + } + this.current.startNewPathAndClipBox(this.current.clipBox); + ctx.beginPath(); + } + getSinglePixelWidth() { + if (!this._cachedGetSinglePixelWidth) { + const m = getCurrentTransform(this.ctx); + if (m[1] === 0 && m[2] === 0) { + this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); + } else { + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[2]); + const normY = Math.hypot(m[1], m[3]); + this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet; + } + } + return this._cachedGetSinglePixelWidth; + } + getScaleForStroking() { + if (this._cachedScaleForStroking[0] === -1) { + const { + lineWidth + } = this.current; + const { + a, + b, + c, + d + } = this.ctx.getTransform(); + let scaleX, scaleY; + if (b === 0 && c === 0) { + const normX = Math.abs(a); + const normY = Math.abs(d); + if (normX === normY) { + if (lineWidth === 0) { + scaleX = scaleY = 1 / normX; + } else { + const scaledLineWidth = normX * lineWidth; + scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1; + } + } else if (lineWidth === 0) { + scaleX = 1 / normX; + scaleY = 1 / normY; + } else { + const scaledXLineWidth = normX * lineWidth; + const scaledYLineWidth = normY * lineWidth; + scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; + scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; + } + } else { + const absDet = Math.abs(a * d - b * c); + const normX = Math.hypot(a, b); + const normY = Math.hypot(c, d); + if (lineWidth === 0) { + scaleX = normY / absDet; + scaleY = normX / absDet; + } else { + const baseArea = lineWidth * absDet; + scaleX = normY > baseArea ? normY / baseArea : 1; + scaleY = normX > baseArea ? normX / baseArea : 1; + } + } + this._cachedScaleForStroking[0] = scaleX; + this._cachedScaleForStroking[1] = scaleY; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(saveRestore) { + const { + ctx + } = this; + const { + lineWidth + } = this.current; + const [scaleX, scaleY] = this.getScaleForStroking(); + ctx.lineWidth = lineWidth || 1; + if (scaleX === 1 && scaleY === 1) { + ctx.stroke(); + return; + } + const dashes = ctx.getLineDash(); + if (saveRestore) { + ctx.save(); + } + ctx.scale(scaleX, scaleY); + if (dashes.length > 0) { + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(dashes.map(x => x / scale)); + ctx.lineDashOffset /= scale; + } + ctx.stroke(); + if (saveRestore) { + ctx.restore(); + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +for (const op in OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +;// ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; + } + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); + } + this.#port = val; + } + static get workerSrc() { + return this.#src; + } + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); + } + this.#src = val; + } +} + +;// ./src/display/metadata.js + +class Metadata { + #metadataMap; + #data; + constructor({ + parsedData, + rawData + }) { + this.#metadataMap = parsedData; + this.#data = rawData; + } + getRaw() { + return this.#data; + } + get(name) { + return this.#metadataMap.get(name) ?? null; + } + getAll() { + return objectFromMap(this.#metadataMap); + } + has(name) { + return this.#metadataMap.has(name); + } +} + +;// ./src/display/optional_content_config.js + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage, + rbGroups + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + this.rbGroups = rbGroups; + } + get visible() { + if (this.#userSet) { + return this.#visible; + } + if (!this.#visible) { + return false; + } + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; + } + return true; + } + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); + } + this.#userSet = userSet; + this.#visible = visible; + } +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) { + this.renderingIntent = renderingIntent; + this.name = null; + this.creator = null; + if (data === null) { + return; + } + this.name = data.name; + this.creator = data.creator; + this.#order = data.order; + for (const group of data.groups) { + this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); + } + if (data.baseState === "OFF") { + for (const group of this.#groups.values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + this.#groups.get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + this.#groups.get(off)._setVisible(INTERNAL, false); + } + this.#initialHash = this.getHash(); + } + #evaluateVisibilityExpression(array) { + const length = array.length; + if (length < 2) { + return true; + } + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = this.#evaluateVisibilityExpression(element); + } else if (this.#groups.has(element)) { + state = this.#groups.get(element).visible; + } else { + warn(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } + } + return operator === "And"; + } + isVisible(group) { + if (this.#groups.size === 0) { + return true; + } + if (!group) { + info("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + warn(`Optional content group not found: ${group.id}`); + return true; + } + return this.#groups.get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return this.#evaluateVisibilityExpression(group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; + } + warn(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id, visible = true, preserveRB = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; + } + if (preserveRB && visible && group.rbGroups.length) { + for (const rbGroup of group.rbGroups) { + for (const otherId of rbGroup) { + if (otherId !== id) { + this.#groups.get(otherId)?._setVisible(INTERNAL, false, true); + } + } + } + } + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; + } + setOCGState({ + state, + preserveRB + }) { + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + this.setVisibility(elem, true, preserveRB); + break; + case "OFF": + this.setVisibility(elem, false, preserveRB); + break; + case "Toggle": + this.setVisibility(elem, !group.visible, preserveRB); + break; + } + } + this.#cachedGetHash = null; + } + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; + } + if (this.#order) { + return this.#order.slice(); + } + return [...this.#groups.keys()]; + } + getGroups() { + return this.#groups.size > 0 ? objectFromMap(this.#groups) : null; + } + getGroup(id) { + return this.#groups.get(id) || null; + } + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); + } +} + +;// ./src/display/transport_stream.js + + +class PDFDataTransportStream { + constructor(pdfDataRangeTransport, { + disableRange = false, + disableStream = false + }) { + assert(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); + const { + length, + initialData, + progressiveDone, + contentDispositionFilename + } = pdfDataRangeTransport; + this._queuedChunks = []; + this._progressiveDone = progressiveDone; + this._contentDispositionFilename = contentDispositionFilename; + if (initialData?.length > 0) { + const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer; + this._queuedChunks.push(buffer); + } + this._pdfDataRangeTransport = pdfDataRangeTransport; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + this._contentLength = length; + this._fullRequestReader = null; + this._rangeReaders = []; + pdfDataRangeTransport.addRangeListener((begin, chunk) => { + this._onReceiveData({ + begin, + chunk + }); + }); + pdfDataRangeTransport.addProgressListener((loaded, total) => { + this._onProgress({ + loaded, + total + }); + }); + pdfDataRangeTransport.addProgressiveReadListener(chunk => { + this._onReceiveData({ + chunk + }); + }); + pdfDataRangeTransport.addProgressiveDoneListener(() => { + this._onProgressiveDone(); + }); + pdfDataRangeTransport.transportReady(); + } + _onReceiveData({ + begin, + chunk + }) { + const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer; + if (begin === undefined) { + if (this._fullRequestReader) { + this._fullRequestReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const found = this._rangeReaders.some(function (rangeReader) { + if (rangeReader._begin !== begin) { + return false; + } + rangeReader._enqueue(buffer); + return true; + }); + assert(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + } + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + _onProgress(evt) { + if (evt.total === undefined) { + this._rangeReaders[0]?.onProgress?.({ + loaded: evt.loaded + }); + } else { + this._fullRequestReader?.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + } + } + _onProgressiveDone() { + this._fullRequestReader?.progressiveDone(); + this._progressiveDone = true; + } + _removeRangeReader(reader) { + const i = this._rangeReaders.indexOf(reader); + if (i >= 0) { + this._rangeReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); + const queuedChunks = this._queuedChunks; + this._queuedChunks = null; + return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFDataTransportStreamRangeReader(this, begin, end); + this._pdfDataRangeTransport.requestDataRange(begin, end); + this._rangeReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeReaders.slice(0)) { + reader.cancel(reason); + } + this._pdfDataRangeTransport.abort(); + } +} +class PDFDataTransportStreamReader { + constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { + this._stream = stream; + this._done = progressiveDone || false; + this._filename = isPdfFile(contentDispositionFilename) ? contentDispositionFilename : null; + this._queuedChunks = queuedChunks || []; + this._loaded = 0; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; + } + this._requests = []; + this._headersReady = Promise.resolve(); + stream._fullRequestReader = this; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); + } + this._loaded += chunk.byteLength; + } + get headersReady() { + return this._headersReady; + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._stream._isRangeSupported; + } + get isStreamingSupported() { + return this._stream._isStreamingSupported; + } + get contentLength() { + return this._stream._contentLength; + } + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + progressiveDone() { + if (this._done) { + return; + } + this._done = true; + } +} +class PDFDataTransportStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const requestsCapability = this._requests.shift(); + requestsCapability.resolve({ + value: chunk, + done: false + }); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + this._done = true; + this._stream._removeRangeReader(this); + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._stream._removeRangeReader(this); + } +} + +;// ./src/display/content_disposition.js + +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} + } + return value; + } + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); + } + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; + } + continue; + } + matches[n] = [quot, part]; + } + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { + break; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); + } + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + } + value = parts.join('"'); + } + return value; + } + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); + } + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); + }); + } + return ""; +} + +;// ./src/display/network_utils.js + + + +function createHeaders(isHttp, httpHeaders) { + const headers = new Headers(); + if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") { + return headers; + } + for (const key in httpHeaders) { + const val = httpHeaders[key]; + if (val !== undefined) { + headers.append(key, val); + } + } + return headers; +} +function getResponseOrigin(url) { + try { + return new URL(url).origin; + } catch {} + return null; +} +function validateRangeRequestCapabilities({ + responseHeaders, + isHttp, + rangeChunkSize, + disableRange +}) { + const returnValues = { + allowRangeRequests: false, + suggestedLength: undefined + }; + const length = parseInt(responseHeaders.get("Content-Length"), 10); + if (!Number.isInteger(length)) { + return returnValues; + } + returnValues.suggestedLength = length; + if (length <= 2 * rangeChunkSize) { + return returnValues; + } + if (disableRange || !isHttp) { + return returnValues; + } + if (responseHeaders.get("Accept-Ranges") !== "bytes") { + return returnValues; + } + const contentEncoding = responseHeaders.get("Content-Encoding") || "identity"; + if (contentEncoding !== "identity") { + return returnValues; + } + returnValues.allowRangeRequests = true; + return returnValues; +} +function extractFilenameFromHeader(responseHeaders) { + const contentDisposition = responseHeaders.get("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} + } + if (isPdfFile(filename)) { + return filename; + } + } + return null; +} +function createResponseStatusError(status, url) { + if (status === 404 || status === 0 && url.startsWith("file:")) { + return new MissingPDFException('Missing PDF "' + url + '".'); + } + return new UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status); +} +function validateResponseStatus(status) { + return status === 200 || status === 206; +} + +;// ./src/display/fetch_stream.js + + +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }; +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; + } + if (val instanceof ArrayBuffer) { + return val; + } + warn(`getArrayBuffer - unexpected data format: ${val}`); + return new Uint8Array(val).buffer; +} +class PDFFetchStream { + _responseOrigin = null; + constructor(source) { + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.headers = createHeaders(this.isHttp, source.httpHeaders); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFFetchStreamReader(this); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFFetchStreamRangeReader(this, begin, end); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFFetchStreamReader { + constructor(stream) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + this._filename = null; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._contentLength = source.length; + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._abortController = new AbortController(); + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + const headers = new Headers(stream.headers); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + stream._responseOrigin = getResponseOrigin(response.url); + if (!validateResponseStatus(response.status)) { + throw createResponseStatusError(response.status, url); + } + this._reader = response.body.getReader(); + this._headersCapability.resolve(); + const responseHeaders = response.headers; + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + }).catch(this._headersCapability.reject); + this.onProgress = null; + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} +class PDFFetchStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._readCapability = Promise.withResolvers(); + this._isStreamingSupported = !source.disableStream; + this._abortController = new AbortController(); + const headers = new Headers(stream.headers); + headers.append("Range", `bytes=${begin}-${end - 1}`); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + const responseOrigin = getResponseOrigin(response.url); + if (responseOrigin !== stream._responseOrigin) { + throw new Error(`Expected range response-origin "${responseOrigin}" to match "${stream._responseOrigin}".`); + } + if (!validateResponseStatus(response.status)) { + throw createResponseStatusError(response.status, url); + } + this._readCapability.resolve(); + this._reader = response.body.getReader(); + }).catch(this._readCapability.reject); + this.onProgress = null; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} + +;// ./src/display/network.js + + +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(xhr) { + const data = xhr.response; + if (typeof data !== "string") { + return data; + } + return stringToBytes(data).buffer; +} +class NetworkManager { + _responseOrigin = null; + constructor({ + url, + httpHeaders, + withCredentials + }) { + this.url = url; + this.isHttp = /^https?:/i.test(url); + this.headers = createHeaders(this.isHttp, httpHeaders); + this.withCredentials = withCredentials || false; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + request(args) { + const xhr = new XMLHttpRequest(); + const xhrId = this.currXhrId++; + const pendingRequest = this.pendingRequests[xhrId] = { + xhr + }; + xhr.open("GET", this.url); + xhr.withCredentials = this.withCredentials; + for (const [key, val] of this.headers) { + xhr.setRequestHeader(key, val); + } + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + } else { + pendingRequest.expectedStatus = OK_RESPONSE; + } + xhr.responseType = "arraybuffer"; + assert(args.onError, "Expected `onError` callback to be provided."); + xhr.onerror = () => { + args.onError(xhr.status); + }; + xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); + xhr.onprogress = this.onProgress.bind(this, xhrId); + pendingRequest.onHeadersReceived = args.onHeadersReceived; + pendingRequest.onDone = args.onDone; + pendingRequest.onError = args.onError; + pendingRequest.onProgress = args.onProgress; + xhr.send(null); + return xhrId; + } + onProgress(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + pendingRequest.onProgress?.(evt); + } + onStateChange(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + const xhr = pendingRequest.xhr; + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!(xhrId in this.pendingRequests)) { + return; + } + delete this.pendingRequests[xhrId]; + if (xhr.status === 0 && this.isHttp) { + pendingRequest.onError(xhr.status); + return; + } + const xhrStatus = xhr.status || OK_RESPONSE; + const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + pendingRequest.onError(xhr.status); + return; + } + const chunk = network_getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + if (matches) { + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk + }); + } else { + warn(`Missing or invalid "Content-Range" header.`); + pendingRequest.onError(0); + } + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk + }); + } else { + pendingRequest.onError(xhr.status); + } + } + getRequestXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + } + isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + } + abortRequest(xhrId) { + const xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } +} +class PDFNetworkStream { + constructor(source) { + this._source = source; + this._manager = new NetworkManager(source); + this._rangeChunkSize = source.rangeChunkSize; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + _onRangeRequestReaderClosed(reader) { + const i = this._rangeRequestReaders.indexOf(reader); + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNetworkStreamFullRequestReader { + constructor(manager, source) { + this._manager = manager; + this._url = source.url; + this._fullRequestId = manager.request({ + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }); + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._contentLength = source.length; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this._filename = null; + this.onProgress = null; + } + _onHeadersReceived() { + const fullRequestXhrId = this._fullRequestId; + const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + this._manager._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); + const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); + const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map(x => { + const [key, ...val] = x.split(": "); + return [key, val.join(": ")]; + }) : []); + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + if (allowRangeRequests) { + this._isRangeSupported = true; + } + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); + } + this._headersCapability.resolve(); + } + _onDone(data) { + if (data) { + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: data.chunk, + done: false + }); + } else { + this._cachedChunks.push(data.chunk); + } + } + this._done = true; + if (this._cachedChunks.length > 0) { + return; + } + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + _onError(status) { + this._storedError = createResponseStatusError(status, this._url); + this._headersCapability.reject(this._storedError); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._cachedChunks.length = 0; + } + _onProgress(evt) { + this.onProgress?.({ + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get contentLength() { + return this._contentLength; + } + get headersReady() { + return this._headersCapability.promise; + } + async read() { + await this._headersCapability.promise; + if (this._storedError) { + throw this._storedError; + } + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + this._headersCapability.reject(reason); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); + } + this._fullRequestReader = null; + } +} +class PDFNetworkStreamRangeRequestReader { + constructor(manager, begin, end) { + this._manager = manager; + this._url = manager.url; + this._requestId = manager.request({ + begin, + end, + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + this.onClosed = null; + } + _onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._manager.getRequestXhr(this._requestId)?.responseURL); + if (responseOrigin !== this._manager._responseOrigin) { + this._storedError = new Error(`Expected range response-origin "${responseOrigin}" to match "${this._manager._responseOrigin}".`); + this._onError(0); + } + } + _close() { + this.onClosed?.(this); + } + _onDone(data) { + const chunk = data.chunk; + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._close(); + } + _onError(status) { + this._storedError ??= createResponseStatusError(status, this._url); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._queuedChunk = null; + } + _onProgress(evt) { + if (!this.isStreamingSupported) { + this.onProgress?.({ + loaded: evt.loaded + }); + } + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); + } + this._close(); + } +} + +;// ./src/display/node_stream.js + +const urlRegex = /^[a-z][a-z0-9\-+.]+:/i; +function parseUrlOrPath(sourceUrl) { + if (urlRegex.test(sourceUrl)) { + return new URL(sourceUrl); + } + const url = process.getBuiltinModule("url"); + return new URL(url.pathToFileURL(sourceUrl)); +} +class PDFNodeStream { + constructor(source) { + this.source = source; + this.url = parseUrlOrPath(source.url); + assert(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNodeStreamFsFullReader(this); + return this._fullRequestReader; + } + getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end); + this._rangeRequestReaders.push(rangeReader); + return rangeReader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNodeStreamFsFullReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + const source = stream.source; + this._contentLength = source.length; + this._loaded = 0; + this._filename = null; + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + this._headersCapability = Promise.withResolvers(); + const fs = process.getBuiltinModule("fs"); + fs.promises.lstat(this._url).then(stat => { + this._contentLength = stat.size; + this._setReadableStream(fs.createReadStream(this._url)); + this._headersCapability.resolve(); + }, error => { + if (error.code === "ENOENT") { + error = new MissingPDFException(`Missing PDF "${this._url}".`); + } + this._storedError = error; + this._headersCapability.reject(error); + }); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (!this._isStreamingSupported && this._isRangeSupported) { + this._error(new AbortException("streaming is disabled")); + } + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +class PDFNodeStreamFsRangeReader { + constructor(stream, start, end) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + this._loaded = 0; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + const source = stream.source; + this._isStreamingSupported = !source.disableStream; + const fs = process.getBuiltinModule("fs"); + this._setReadableStream(fs.createReadStream(this._url, { + start, + end: end - 1 + })); + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} + +;// ./src/display/text_layer.js + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +const DEFAULT_FONT_ASCENT = 0.8; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #canvasCtxFonts = new WeakMap(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } + }); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + this.#container = this.#rootContainer = container; + this.#scale = viewport.scale * (globalThis.devicePixelRatio || 1); + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + setLayerDimensions(container, viewport); + this.#capability.promise.finally(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }).catch(() => {}); + } + static get fontFamilyMap() { + const { + isWindows, + isFirefox + } = util_FeatureTest.platform; + return shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]])); + } + render() { + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; + } + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * (globalThis.devicePixelRatio || 1); + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + const params = { + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } + } + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); + } + get textDivs() { + return this.#textDivs; + } + get textContentItemsStr() { + return this.#textContentItemsStr; + } + #processItems(items) { + if (this.#disableProcessItems) { + return; + } + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this.#container; + this.#container = document.createElement("span"); + this.#container.classList.add("markedContent"); + if (item.id !== null) { + this.#container.setAttribute("id", `${item.id}`); + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); + } + } + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, this.#lang); + let left, top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + const scaleFactorStr = "calc(var(--scale-factor)*"; + const divStyle = textDiv.style; + if (this.#container === this.#rootContainer) { + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + } else { + divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; + divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + } + divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; + } + } + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#layout(this.#layoutTextParams); + if (textDivProperties.hasText) { + this.#container.append(textDiv); + } + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this.#container.append(br); + } + } + #layout(params) { + const { + div, + properties, + ctx + } = params; + const { + style + } = div; + let transform = ""; + if (TextLayer.#minFontSize > 1) { + transform = `scale(${1 / TextLayer.#minFontSize})`; + } + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily); + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; + } + } + if (properties.angle !== 0) { + transform = `rotate(${properties.angle}deg) ${transform}`; + } + if (transform.length > 0) { + style.transform = transform; + } + } + static cleanup() { + if (this.#pendingTextLayers.size > 0) { + return; + } + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let ctx = this.#canvasContexts.get(lang ||= ""); + if (!ctx) { + const canvas = document.createElement("canvas"); + canvas.className = "hiddenCanvasElement"; + canvas.lang = lang; + document.body.append(canvas); + ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, ctx); + this.#canvasCtxFonts.set(ctx, { + size: 0, + family: "" + }); + } + return ctx; + } + static #ensureCtxFont(ctx, size, family) { + const cached = this.#canvasCtxFonts.get(ctx); + if (size === cached.size && family === cached.family) { + return; + } + ctx.font = `${size}px ${family}`; + cached.size = size; + cached.family = family; + } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; + this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily); + const metrics = ctx.measureText(""); + let ascent = metrics.fontBoundingBoxAscent; + let descent = Math.abs(metrics.fontBoundingBoxDescent); + if (ascent) { + const ratio = ascent / (ascent + descent); + this.#ascentCache.set(fontFamily, ratio); + ctx.canvas.width = ctx.canvas.height = 0; + return ratio; + } + ctx.strokeStyle = "red"; + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("g", 0, 0); + let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + descent = 0; + for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) { + if (pixels[i] > 0) { + descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("A", 0, DEFAULT_FONT_SIZE); + pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + ascent = 0; + for (let i = 0, ii = pixels.length; i < ii; i += 4) { + if (pixels[i] > 0) { + ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.canvas.width = ctx.canvas.height = 0; + const ratio = ascent ? ascent / (ascent + descent) : DEFAULT_FONT_ASCENT; + this.#ascentCache.set(fontFamily, ratio); + return ratio; + } +} + +;// ./src/display/xfa_text.js +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node?.attributes?.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); + } + } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} + +;// ./src/display/api.js + + + + + + + + + + + + + + + + + + + + +const DEFAULT_RANGE_CHUNK_SIZE = 65536; +const RENDERING_CANCELLED_TIMEOUT = 100; +const DELAYED_CLEANUP_TIMEOUT = 5000; +const DefaultCanvasFactory = isNodeJS ? NodeCanvasFactory : DOMCanvasFactory; +const DefaultCMapReaderFactory = isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory; +const DefaultFilterFactory = isNodeJS ? NodeFilterFactory : DOMFilterFactory; +const DefaultStandardFontDataFactory = isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory; +function getDocument(src = {}) { + if (typeof src === "string" || src instanceof URL) { + src = { + url: src + }; + } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) { + src = { + data: src + }; + } + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = typeof src.cMapUrl === "string" ? src.cMapUrl : null; + const cMapPacked = src.cMapPacked !== false; + const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory; + const standardFontDataUrl = typeof src.standardFontDataUrl === "string" ? src.standardFontDataUrl : null; + const StandardFontDataFactory = src.StandardFontDataFactory || DefaultStandardFontDataFactory; + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isEvalSupported = src.isEvalSupported !== false; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS && (util_FeatureTest.platform.isFirefox || !globalThis.chrome); + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const CanvasFactory = src.CanvasFactory || DefaultCanvasFactory; + const FilterFactory = src.FilterFactory || DefaultFilterFactory; + const enableHWA = src.enableHWA === true; + const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI); + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory: new CanvasFactory({ + ownerDocument, + enableHWA + }), + filterFactory: new FilterFactory({ + docId, + ownerDocument + }), + cMapReaderFactory: useWorkerFetch ? null : new CMapReaderFactory({ + baseUrl: cMapUrl, + isCompressed: cMapPacked + }), + standardFontDataFactory: useWorkerFetch ? null : new StandardFontDataFactory({ + baseUrl: standardFontDataUrl + }) + }; + if (!worker) { + const workerParams = { + verbosity, + port: GlobalWorkerOptions.workerPort + }; + worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); + task._worker = worker; + } + const docParams = { + docId, + apiVersion: "4.10.38", + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isEvalSupported, + isOffscreenCanvasSupported, + isImageDecoderSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + cMapUrl: useWorkerFetch ? cMapUrl : null, + standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null + } + }; + const transportParams = { + disableFontFace, + fontExtraProperties, + ownerDocument, + pdfBug, + styleElement, + loadingParams: { + disableAutoFetch, + enableXfa + } + }; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (rangeTransport) { + networkStream = new PDFDataTransportStream(rangeTransport, { + disableRange, + disableStream + }); + } else if (!data) { + if (!url) { + throw new Error("getDocument - no `url` parameter provided."); + } + let NetworkStream; + if (isNodeJS) { + if (isValidFetchUrl(url)) { + if (typeof fetch === "undefined" || typeof Response === "undefined" || !("body" in Response.prototype)) { + throw new Error("getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`."); + } + NetworkStream = PDFFetchStream; + } else { + NetworkStream = PDFNodeStream; + } + } else { + NetworkStream = isValidFetchUrl(url) ? PDFFetchStream : PDFNetworkStream; + } + networkStream = new NetworkStream({ + url, + length, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } + return workerIdPromise.then(workerId => { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory); + task._transport = transport; + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject); + return task; +} +function getUrlProp(val) { + if (val instanceof URL) { + return val.href; + } + try { + return new URL(val, window.location).href; + } catch { + if (isNodeJS && typeof val === "string") { + return val; + } + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); + } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); +} +function isRefProxy(ref) { + return typeof ref === "object" && Number.isInteger(ref?.num) && ref.num >= 0 && Number.isInteger(ref?.gen) && ref.gen >= 0; +} +class PDFDocumentLoadingTask { + static #docId = 0; + constructor() { + this._capability = Promise.withResolvers(); + this._transport = null; + this._worker = null; + this.docId = `d${PDFDocumentLoadingTask.#docId++}`; + this.destroyed = false; + this.onPassword = null; + this.onProgress = null; + } + get promise() { + return this._capability.promise; + } + async destroy() { + this.destroyed = true; + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; + } + this._transport = null; + this._worker?.destroy(); + this._worker = null; + } +} +class PDFDataRangeTransport { + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + this._rangeListeners = []; + this._progressListeners = []; + this._progressiveReadListeners = []; + this._progressiveDoneListeners = []; + this._readyCapability = Promise.withResolvers(); + } + addRangeListener(listener) { + this._rangeListeners.push(listener); + } + addProgressListener(listener) { + this._progressListeners.push(listener); + } + addProgressiveReadListener(listener) { + this._progressiveReadListeners.push(listener); + } + addProgressiveDoneListener(listener) { + this._progressiveDoneListeners.push(listener); + } + onDataRange(begin, chunk) { + for (const listener of this._rangeListeners) { + listener(begin, chunk); + } + } + onDataProgress(loaded, total) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressListeners) { + listener(loaded, total); + } + }); + } + onDataProgressiveRead(chunk) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveReadListeners) { + listener(chunk); + } + }); + } + onDataProgressiveDone() { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveDoneListeners) { + listener(); + } + }); + } + transportReady() { + this._readyCapability.resolve(); + } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get canvasFactory() { + return this._transport.canvasFactory; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument() { + return this._transport.saveDocument(); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + cleanup(keepLoadedFonts = false) { + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + destroy() { + return this.loadingTask.destroy(); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +class PDFPageProxy { + #delayedCleanupTimeout = null; + #pendingCleanup = false; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._maybeCleanupAfterRender = false; + this._intentStates = new Map(); + this.destroyed = false; + } + get pageNumber() { + return this._pageIndex + 1; + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport({ + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.view, + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null, + isEditing = false + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + let intentState = this._intentStates.get(cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(cacheKey, intentState); + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (this._maybeCleanupAfterRender || intentPrint) { + this.#pendingCleanup = true; + } + this.#tryCleanup(!intentPrint); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvasContext, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null, + isEditing = false + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true); + let intentState = this._intentStates.get(intentArgs.cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(intentArgs.cacheKey, intentState); + } + let opListTask; + if (!intentState.opListReadCapability) { + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = Promise.withResolvers(); + (intentState.renderTasks ||= new Set()).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + return intentState.opListReadCapability.promise; + } + streamTextContent({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } + }); + } + getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => XfaText.textContent(xfa)); + } + const readableStream = this.streamTextContent(params); + return new Promise(function (resolve, reject) { + function pump() { + reader.read().then(function ({ + value, + done + }) { + if (done) { + resolve(textContent); + return; + } + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + pump(); + }, reject); + } + const reader = readableStream.getReader(); + const textContent = { + items: [], + styles: Object.create(null), + lang: null + }; + pump(); + }); + } + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; + } + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); + } + } + this.objs.clear(); + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); + return Promise.all(waitOn); + } + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(false); + if (resetStats && success) { + this._stats &&= new StatTimer(); + } + return success; + } + #tryCleanup(delayed = false) { + this.#abortDelayedCleanup(); + if (!this.#pendingCleanup || this.destroyed) { + return false; + } + if (delayed) { + this.#delayedCleanupTimeout = setTimeout(() => { + this.#delayedCleanupTimeout = null; + this.#tryCleanup(false); + }, DELAYED_CLEANUP_TIMEOUT); + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.clear(); + this.#pendingCleanup = false; + return true; + } + #abortDelayedCleanup() { + if (this.#delayedCleanupTimeout) { + clearTimeout(this.#delayedCleanupTimeout); + this.#delayedCleanupTimeout = null; + } + } + _startRenderPage(transparency, cacheKey) { + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + this._stats?.timeEnd("Page Request"); + intentState.displayReadyCapability?.resolve(transparency); + } + _renderPageChunk(operatorListChunk, intentState) { + for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); + } + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + this.#tryCleanup(true); + } + } + _pumpOperatorList({ + renderingIntent, + cacheKey, + annotationStorageSerializable, + modifiedIds + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: map, + modifiedIds + }, transfer); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(({ + value, + done + }) => { + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this.#tryCleanup(true); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); + }; + pump(); + } + _abortOperatorList({ + intentState, + reason, + force = false + }) { + if (!intentState.streamReader) { + return; + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } + } + intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; + } + } + this.cleanup(); + } + get stats() { + return this._stats; + } +} +class LoopbackPort { + #listeners = new Map(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const [listener] of this.#listeners) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + warn("LoopbackPort - cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.removeEventListener(name, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + this.#listeners.set(listener, rmAbort); + } + removeEventListener(name, listener) { + const rmAbort = this.#listeners.get(listener); + rmAbort?.(); + this.#listeners.delete(listener); + } + terminate() { + for (const [, rmAbort] of this.#listeners) { + rmAbort?.(); + } + this.#listeners.clear(); + } +} +class PDFWorker { + static #fakeWorkerId = 0; + static #isWorkerDisabled = false; + static #workerPorts; + static { + if (isNodeJS) { + this.#isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + this._isSameOrigin = (baseUrl, otherUrl) => { + let base; + try { + base = new URL(baseUrl); + if (!base.origin || base.origin === "null") { + return false; + } + } catch { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + this._createCDNWrapper = url => { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; + } + constructor({ + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + this._readyCapability = Promise.withResolvers(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + if (port) { + if (PDFWorker.#workerPorts?.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this); + this._initializeFromPort(port); + return; + } + this._initialize(); + } + get promise() { + return this._readyCapability.promise; + } + #resolve() { + this._readyCapability.resolve(); + this._messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + get port() { + return this._port; + } + get messageHandler() { + return this._messageHandler; + } + _initializeFromPort(port) { + this._port = port; + this._messageHandler = new MessageHandler("main", "worker", port); + this._messageHandler.on("ready", function () {}); + this.#resolve(); + } + _initialize() { + if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this._setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorker._isSameOrigin(window.location.href, workerSrc)) { + workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + } else { + this._setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this._webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); + return; + } + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this._setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); + } + this._setupFakeWorker(); + } + _setupFakeWorker() { + if (!PDFWorker.#isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorker.#isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this._port = port; + const id = `fake${PDFWorker.#fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this._messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + this._webWorker?.terminate(); + this._webWorker = null; + PDFWorker.#workerPorts?.delete(this._port); + this._port = null; + this._messageHandler?.destroy(); + this._messageHandler = null; + } + static fromPort(params) { + if (!params?.port) { + throw new Error("PDFWorker.fromPort - invalid method signature."); + } + const cachedPort = this.#workerPorts?.get(params.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.fromPort - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + } + return cachedPort; + } + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; + } + const worker = await import(/*webpackIgnore: true*/this.workerSrc); + return worker.WorkerMessageHandler; + }; + return shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + #methodPromises = new Map(); + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + constructor(messageHandler, loadingTask, networkStream, params, factory) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.cMapReaderFactory = factory.cMapReaderFactory; + this.standardFontDataFactory = factory.standardFontDataFactory; + this.destroyed = false; + this.destroyCapability = null; + this._networkStream = networkStream; + this._fullReader = null; + this._lastProgress = null; + this.downloadInfoCapability = Promise.withResolvers(); + this.setupMessageHandler(); + } + #cacheSimpleMethod(name, data = null) { + const cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, data); + this.#methodPromises.set(name, promise); + return promise; + } + get annotationStorage() { + return shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); + } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; + } + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; + } + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; + return { + renderingIntent, + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); + const waitOn = []; + for (const page of this.#pageCache.values()) { + waitOn.push(page._destroy()); + } + this.#pageCache.clear(); + this.#pagePromises.clear(); + this.#pageRefCache.clear(); + if (this.hasOwnProperty("annotationStorage")) { + this.annotationStorage.resetModified(); + } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + this.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this._networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + this.messageHandler?.destroy(); + this.messageHandler = null; + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + } + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + assert(this._networkStream, "GetReader - no `IPDFStream` instance available."); + this._fullReader = this._networkStream.getFullReader(); + this._fullReader.onProgress = evt => { + this._lastProgress = { + loaded: evt.loaded, + total: evt.total + }; + }; + sink.onPull = () => { + this._fullReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this._fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", async data => { + await this._fullReader.headersReady; + const { + isStreamingSupported, + isRangeSupported, + contentLength + } = this._fullReader; + if (!isStreamingSupported || !isRangeSupported) { + if (this._lastProgress) { + loadingTask.onProgress?.(this._lastProgress); + } + this._fullReader.onProgress = evt => { + loadingTask.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + }; + } + return { + isStreamingSupported, + isRangeSupported, + contentLength + }; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + assert(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); + const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = () => { + rangeReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", ({ + pdfInfo + }) => { + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", ex => { + loadingTask._capability.reject(wrapReason(ex)); + }); + messageHandler.on("PasswordRequest", ex => { + this.#passwordCapability = Promise.withResolvers(); + try { + if (!loadingTask.onPassword) { + throw wrapReason(ex); + } + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + loadingTask.onPassword(updatePassword, ex.code); + } catch (err) { + this.#passwordCapability.reject(err); + } + return this.#passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + loadingTask.onProgress?.({ + loaded: data.length, + total: data.length + }); + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = this.#pageCache.get(data.pageIndex); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", ([id, type, exportedData]) => { + if (this.destroyed) { + return null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + const { + disableFontFace, + fontExtraProperties, + pdfBug + } = this._params; + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const inspectFont = pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(exportedData, { + disableFontFace, + fontExtraProperties, + inspectFont + }); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!fontExtraProperties && font.data) { + font.data = null; + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + this.commonObjs.resolve(id, structuredClone(data)); + return data.dataLen; + } + } + break; + case "FontPath": + case "Image": + case "Pattern": + this.commonObjs.resolve(id, exportedData); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + pageProxy.objs.resolve(id, imageData); + if (imageData?.dataLen > MAX_IMAGE_SIZE_TO_CACHE) { + pageProxy._maybeCleanupAfterRender = true; + } + break; + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + if (this.destroyed) { + return; + } + loadingTask.onProgress?.({ + loaded: data.loaded, + total: data.total + }); + }); + messageHandler.on("FetchBuiltInCMap", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + if (!this.cMapReaderFactory) { + throw new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter."); + } + return this.cMapReaderFactory.fetch(data); + }); + messageHandler.on("FetchStandardFontData", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + if (!this.standardFontDataFactory) { + throw new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter."); + } + return this.standardFontDataFactory.fetch(data); + }); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument() { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + const { + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + filename: this._fullReader?.filename ?? null + }, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); + } + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { + return Promise.reject(new Error("Invalid page request.")); + } + const pageIndex = pageNumber - 1, + cachedPromise = this.#pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, pageNumber); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); + this.#pageCache.set(pageIndex, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + getPageIndex(ref) { + if (!isRefProxy(ref)) { + return Promise.reject(new Error("Invalid pageIndex request.")); + } + return this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + } + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex, + intent + }); + } + getFieldObjects() { + return this.#cacheSimpleMethod("GetFieldObjects"); + } + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + if (typeof id !== "string") { + return Promise.reject(new Error("Invalid destination request.")); + } + return this.messageHandler.sendWithPromise("GetDestination", { + id + }); + } + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); + } + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); + } + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); + } + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + } + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + const name = "GetMetadata", + cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this._fullReader?.filename ?? null, + contentLength: this._fullReader?.contentLength ?? null + })); + this.#methodPromises.set(name, promise); + return promise; + } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + async startCleanup(keepLoadedFonts = false) { + if (this.destroyed) { + return; + } + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of this.#pageCache.values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } + } + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); + } + this.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; + } + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + return this.#pageRefCache.get(refStr) ?? null; + } +} +const INITIAL_DATA = Symbol("INITIAL_DATA"); +class PDFObjects { + #objs = Object.create(null); + #ensureObj(objId) { + return this.#objs[objId] ||= { + ...Promise.withResolvers(), + data: INITIAL_DATA + }; + } + get(objId, callback = null) { + if (callback) { + const obj = this.#ensureObj(objId); + obj.promise.then(() => callback(obj.data)); + return null; + } + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = this.#objs[objId]; + return !!obj && obj.data !== INITIAL_DATA; + } + delete(objId) { + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + return false; + } + delete this.#objs[objId]; + return true; + } + resolve(objId, data = null) { + const obj = this.#ensureObj(objId); + obj.data = data; + obj.resolve(); + } + clear() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + data?.bitmap?.close(); + } + this.#objs = Object.create(null); + } + *[Symbol.iterator]() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + if (data === INITIAL_DATA) { + continue; + } + yield [objId, data]; + } + } +} +class RenderTask { + #internalRenderTask = null; + constructor(internalRenderTask) { + this.#internalRenderTask = internalRenderTask; + this.onContinue = null; + } + get promise() { + return this.#internalRenderTask.capability.promise; + } + cancel(extraDelay = 0) { + this.#internalRenderTask.cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = this.#internalRenderTask.operatorList; + if (!separateAnnots) { + return false; + } + const { + annotationCanvasMap + } = this.#internalRenderTask; + return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null + }) { + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = Promise.withResolvers(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvasContext.canvas; + } + get completed() { + return this.capability.promise.catch(function () {}); + } + initializeGraphics({ + transparency = false, + optionalContentConfig + }) { + if (this.cancelled) { + return; + } + if (this._canvas) { + if (InternalRenderTask.#canvasInUse.has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + InternalRenderTask.#canvasInUse.add(this._canvas); + } + if (this._pdfBug && globalThis.StepperManager?.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + } + const { + canvasContext, + viewport, + transform, + background + } = this.params; + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + this.graphicsReadyCallback?.(); + } + cancel(error = null, extraDelay = 0) { + this.running = false; + this.cancelled = true; + this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(error || new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay)); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; + } + this.stepper?.updateOperatorList(this.operatorList); + if (this.running) { + return; + } + this._continue(); + } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + } + _scheduleNext() { + if (this._useRequestAnimationFrame) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); + } + } + async _next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); + } + } + } +} +const version = "4.10.38"; +const build = "f9bea397f"; + +;// ./src/shared/scripting_utils.js +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return Math.max(0, Math.min(255, 255 * x)); +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} + +;// ./src/display/svg_factory.js + + +class BaseSVGFactory { + create(width, height, skipDimensions = false) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + unreachable("Abstract method `_createSVG` called."); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} + +;// ./src/display/xfa_layer.js + +class XfaLayer { + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (option.attributes.hasOwnProperty("selected")) { + delete option.attributes.selected; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes({ + html, + element, + storage = null, + intent, + linkService + }) { + const { + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined) { + continue; + } + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } + break; + case "dataId": + break; + case "id": + html.setAttribute("data-element-id", value); + break; + case "style": + Object.assign(html.style, value); + break; + case "textContent": + html.textContent = value; + break; + default: + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } + } + } + if (isHTMLAnchorElement) { + linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = document.createElement(root.name); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + while (stack.length > 0) { + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); + } + } + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } +} + +;// ./src/display/annotation_layer.js + + + + + + +const DEFAULT_TAB_INDEX = 1000; +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +function getRectDims(rect) { + return { + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; +} +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + if (isRenderable) { + this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } + } + static _hasPopupData({ + titleObj, + contentsObj, + richText + }) { + return !!(titleObj?.str || contentsObj?.str || richText?.str); + } + get _isEditable() { + return this.data.isEditable; + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data); + } + updateEdited(params) { + if (!this.container) { + return; + } + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + const { + rect + } = params; + if (rect) { + this.#setRectEdited(rect); + } + this.#popupElement?.popup.updateEdited(params); + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + const { + width, + height + } = getRectDims(rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement)) { + container.tabIndex = DEFAULT_TAB_INDEX; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex++; + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = getRectDims(data.rect); + if (!ignoreBorder && data.borderStyle.width > 0) { + style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`; + style.borderRadius = radius; + } else if (this instanceof RadioButtonWidgetAnnotationElement) { + const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + style.borderStyle = "dashed"; + break; + case AnnotationBorderStyleType.BEVELED: + warn("Unimplemented border style: beveled"); + break; + case AnnotationBorderStyleType.INSET: + warn("Unimplemented border style: inset"); + break; + case AnnotationBorderStyleType.UNDERLINE: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); + } else { + style.borderWidth = 0; + } + } + const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + const { + width, + height + } = getRectDims(this.data.rect); + let elementWidth, elementHeight; + if (angle % 180 === 0) { + elementWidth = 100 * width / pageWidth; + elementHeight = 100 * height / pageHeight; + } else { + elementWidth = 100 * height / pageWidth; + elementHeight = 100 * width / pageHeight; + } + container.style.width = `${elementWidth}%`; + container.style.height = `${elementHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); + }; + return shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.readonly; + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); + } + }); + } + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action?.(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { + return; + } + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup() { + const { + data + } = this; + const popup = this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate: data.modificationDate, + contentsObj: data.contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation + }, + parent: this.parent, + elements: [this] + }); + this.parent.div.append(popup.render()); + } + render() { + unreachable("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name, skipId = null) { + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects[name]; + if (fieldObj) { + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1) { + continue; + } + if (id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + warn(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId) { + continue; + } + if (!GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + _editOnDoubleClick() { + if (!this._isEditable) { + return; + } + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId + }); + }); + } +} +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters, options = null) { + super(parameters, { + isRenderable: true, + ignoreBorder: !!options?.ignoreBorder, + createQuadrilaterals: true + }); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachment, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest); + isBound = true; + } else { + if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination) { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + } + _bindNamedAction(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + this.#setInternalLink(); + } + #bindAttachment(link, attachment, dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } + link.onclick = () => { + this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + this.#setInternalLink(); + } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + if (!link.onclick) { + link.onclick = () => false; + } + this.#setInternalLink(); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + this.#setInternalLink(); + if (!this._fieldObjects) { + warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } + return; + } + link.onclick = () => { + otherClickAction?.(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects[fieldName] || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + for (const fields of Object.values(this._fieldObjects)) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of Object.values(this._fieldObjects)) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + warn(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + showElementAndHideCanvas(element) { + if (this.data.hasOwnCanvas) { + if (element.previousSibling?.nodeName === "CANVAS") { + element.previousSibling.hidden = true; + } + element.hidden = false; + } + } + _getKeyModifier(event) { + return util_FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !this.data.actions?.Blur) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !this.data.actions?.Focus) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(color[0], color[1], color[2]); + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`; + style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable + }); + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = DEFAULT_TAB_INDEX; + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + elementData.formattedValue = null; + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (elementData.userValue) { + target.value = elementData.userValue; + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.Focus) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.showElementAndHideCanvas(jsEvent.target); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + storage.setValue(id, { + value: elementData.userValue.toString() + }); + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + storage.setValue(id, { + formattedValue + }); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.Blur) { + elementData.focused = false; + } + const { + value + } = event.target; + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if (this.data.actions?.Keystroke) { + element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); + if (match) { + selStart -= match[0].length; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^[^\w]*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`; + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value + }); + } + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; + } + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); + } + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.classList.add("buttonWidgetAnnotation", "pushButton"); + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("choiceWidgetAnnotation"); + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = DEFAULT_TAB_INDEX; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + optionElement.textContent = option.displayValue; + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => ({ + displayValue: option.textContent, + exportValue: option.value + })); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + removeEmptyEntry?.(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + const exportValue = getValue(true); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; + } +} +class PopupAnnotationElement extends AnnotationElement { + constructor(parameters) { + const { + data, + elements + } = parameters; + super(parameters, { + isRenderable: AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + this.popup = null; + } + render() { + this.container.classList.add("popupAnnotation"); + const popup = this.popup = new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open + }); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + element.container.ariaHasPopup = "dialog"; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #position = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle); + element.addEventListener("mouseenter", this.#boundShow); + element.addEventListener("mouseleave", this.#boundHide); + element.classList.add("popupTriggerArea"); + } + for (const element of elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown); + } + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + render() { + if (this.#popup) { + return; + } + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + if (CSS.supports("background-color", "color-mix(in srgb, red 30%, white)")) { + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } else { + const BACKGROUND_ENLIGHT = 0.7; + popup.style.backgroundColor = Util.makeHexColor(...this.#color.map(c => Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c))); + } + } + const header = document.createElement("span"); + header.className = "header"; + const title = document.createElement("h1"); + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("span"); + modificationDate.classList.add("popupDate"); + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: this.#dateObj.valueOf() + })); + header.append(modificationDate); + } + const html = this.#html; + if (html) { + XfaLayer.render({ + xfaHtml: html, + intent: "richText", + div: popup + }); + popup.lastChild.classList.add("richText", "popupContent"); + } else { + const contents = this._formatContents(this.#contentsObj); + popup.append(contents); + } + this.#container.append(popup); + } + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; + } + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; + } + get #fontColor() { + return this.#html?.attributes?.style?.color || null; + } + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); + } + return popupContent; + } + _formatContents({ + str, + dir + }) { + const p = document.createElement("p"); + p.classList.add("popupContent"); + p.dir = dir; + const lines = str.split(/(?:\r\n?|\n)/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + return p; + } + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); + } + } + updateEdited({ + rect, + popupContent + }) { + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popupContent) { + this.#richText = this.#makePopupContent(popupContent); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { + return; + } + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); + } else { + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); + } + } + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } + } + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000; + } + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; + } + maybeShow() { + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; + } + get isVisible() { + return this.#container.hidden === false; + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; + } + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = document.createElement("div"); + content.classList.add("annotationTextContent"); + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); + } + this.container.append(content); + } + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("lineAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const line = this.#line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#line; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + } + } = this; + if (!vertices) { + return this.container; + } + const { + width, + height + } = getRectDims(rect); + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#polyline; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylinesGroupElement = null; + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK; + } + #getTransform(rotation, rect) { + switch (rotation) { + case 90: + return { + transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + case 180: + return { + transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + case 270: + return { + transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + default: + return { + transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + } + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + rotation, + inkLists, + borderStyle, + popupRef + } + } = this; + const { + transform, + width, + height + } = this.#getTransform(rotation, rect); + const svg = this.svgFactory.create(width, height, true); + const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g"); + svg.append(g); + g.setAttribute("stroke-width", borderStyle.width || 1); + g.setAttribute("stroke-linecap", "round"); + g.setAttribute("stroke-linejoin", "round"); + g.setAttribute("stroke-miterlimit", 10); + g.setAttribute("stroke", "transparent"); + g.setAttribute("fill", "transparent"); + g.setAttribute("transform", transform); + for (let i = 0, ii = inkLists.length; i < ii; i++) { + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", inkLists[i].join(",")); + g.append(polyline); + } + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(svg); + this._editOnDoubleClick(); + return this.container; + } + updateEdited(params) { + super.updateEdited(params); + const { + thickness, + points, + rect + } = params; + const g = this.#polylinesGroupElement; + if (thickness >= 0) { + g.setAttribute("stroke-width", thickness || 1); + } + if (points) { + for (let i = 0, ii = this.#polylines.length; i < ii; i++) { + this.#polylines[i].setAttribute("points", points[i].join(",")); + } + } + if (rect) { + const { + transform, + width, + height + } = this.#getTransform(this.data.rotation, rect); + const root = g.parentElement; + root.setAttribute("viewBox", `0 0 ${width} ${height}`); + g.setAttribute("transform", transform); + } + } + getElementsToTriggerPopup() { + return this.#polylines; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + this.annotationEditorType = AnnotationEditorType.HIGHLIGHT; + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("highlightAnnotation"); + this._editOnDoubleClick(); + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("underlineAnnotation"); + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("squigglyAnnotation"); + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("strikeoutAnnotation"); + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.annotationEditorType = AnnotationEditorType.STAMP; + } + render() { + this.container.classList.add("stampAnnotation"); + this.container.setAttribute("role", "img"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + ...file + }); + } + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = util_FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); + } + container.append(trigger); + return container; + } + getElementsToTriggerPopup() { + return this.#trigger; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + #download() { + this.downloadManager?.openOrDownloadData(this.content, this.filename); + } +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #editableAnnotations = new Map(); + #structTreeLayer = null; + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport, + structTreeLayer + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.#structTreeLayer = structTreeLayer || null; + this.page = page; + this.viewport = viewport; + this.zIndex = 0; + this._annotationEditorUIManager = annotationEditorUIManager; + } + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; + } + async #appendElement(element, id) { + const contentElement = element.firstChild || element; + const annotationId = contentElement.id = `${AnnotationPrefix}${id}`; + const ariaAttributes = await this.#structTreeLayer?.getAriaAttributes(annotationId); + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + this.div.append(element); + this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false); + } + async render(params) { + const { + annotations + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const elementParams = { + data: null, + layer, + linkService: params.linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: params.annotationStorage || new AnnotationStorage(), + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + const { + width, + height + } = getRectDims(data.rect); + if (width <= 0 || height <= 0) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation && data.popupRef) { + const elements = popupToElements.get(data.popupRef); + if (!elements) { + popupToElements.set(data.popupRef, [element]); + } else { + elements.push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + await this.#appendElement(rendered, data.id); + if (element._isEditable) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + this.#setAnnotationCanvasMap(); + } + update({ + viewport + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + this.#setAnnotationCanvasMap(); + layer.hidden = false; + } + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { + return; + } + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + canvas.className = "annotationContent"; + const { + firstChild + } = element; + if (!firstChild) { + element.append(canvas); + } else if (firstChild.nodeName === "CANVAS") { + firstChild.replaceWith(canvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(canvas); + } else { + firstChild.after(canvas); + } + } + this.#annotationCanvasMap.clear(); + } + getEditableAnnotations() { + return Array.from(this.#editableAnnotations.values()); + } + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); + } +} + +;// ./src/display/editor/freetext.js + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #color; + #content = ""; + #editorDivId = `${this.id}-editor`; + #editModeAC = null; + #fontSize; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.#color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]]; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + #updateColor(color) { + const setColor = col => { + this.#color = this.editorDiv.style.color = col; + }; + const savedColor = this.#color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (this.isInEditMode()) { + return; + } + this.parent.setEditingState(false); + this.parent.updateToolbar(AnnotationEditorType.FREETEXT); + super.enableEditMode(); + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.#editModeAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#editModeAC); + this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), { + signal + }); + this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), { + signal + }); + this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), { + signal + }); + this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), { + signal + }); + this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), { + signal + }); + } + disableEditMode() { + if (!this.isInEditMode()) { + return; + } + this.parent.setEditingState(true); + super.disableEditMode(); + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.#editModeAC?.abort(); + this.#editModeAC = null; + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded(focus) { + if (this.width) { + return; + } + this.enableEditMode(); + if (focus) { + this.editorDiv.focus(); + } + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + let prevChild = null; + for (const child of this.editorDiv.childNodes) { + if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") { + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + prevChild = child; + } + return buffer.join("\n"); + } + #setEditorDimensions() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; + } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false + }); + this.#setEditorDimensions(); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); + } + dblclick(event) { + this.enterInEditMode(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); + } + } + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); + } + editorDivFocus(event) { + this.isEditing = true; + } + editorDivBlur(event) { + this.isEditing = false; + } + editorDivInput(event) { + this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"); + this.editorDiv.setAttribute("data-l10n-attrs", "default-content"); + this.enableEditing(); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; + style.color = this.#color; + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + bindEvents(this, this.div, ["dblclick", "keydown"]); + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this._initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); + } else { + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; + } + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; + } + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = bufferBefore.reduce((acc, line) => acc + line.length, 0); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; + } + } + selection.removeAllRanges(); + selection.addRange(newRange); + } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; + } + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); + } + } + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id, + popupRef + }, + textContent, + textPosition, + parent: { + page: { + pageNumber + } + } + } = data; + if (!textContent || textContent.length === 0) { + return null; + } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.#color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + const rect = this.getRect(padding, padding); + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color); + const serialized = { + annotationType: AnnotationEditorType.FREETEXT, + color, + fontSize: this.#fontSize, + value: this.#serializeContent(), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this._initialData; + return this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (this.deleted) { + return content; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; + style.color = this.#color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + annotation.updateEdited({ + rect: this.getRect(padding, padding), + popupContent: this.#content + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); + } +} + +;// ./src/display/editor/drawers/outline.js + +class Outline { + static PRECISION = 1e-4; + toSVGPath() { + unreachable("Abstract method `toSVGPath` must be implemented."); + } + get box() { + unreachable("Abstract getter `box` must be implemented."); + } + serialize(_bbox, _rotation) { + unreachable("Abstract method `serialize` must be implemented."); + } + static _rescale(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; + } + static _rescaleAndSwap(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; + } + static _translate(src, tx, ty, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i]; + dest[i + 1] = ty + src[i + 1]; + } + return dest; + } + static svgRound(x) { + return Math.round(x * 10000); + } + static _normalizePoint(x, y, parentWidth, parentHeight, rotation) { + switch (rotation) { + case 90: + return [1 - y / parentWidth, x / parentHeight]; + case 180: + return [1 - x / parentWidth, 1 - y / parentHeight]; + case 270: + return [y / parentWidth, 1 - x / parentHeight]; + default: + return [x / parentWidth, y / parentHeight]; + } + } + static _normalizePagePoint(x, y, rotation) { + switch (rotation) { + case 90: + return [1 - y, x]; + case 180: + return [1 - x, 1 - y]; + case 270: + return [y, 1 - x]; + default: + return [x, y]; + } + } + static createBezierPoints(x1, y1, x2, y2, x3, y3) { + return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2]; + } +} + +;// ./src/display/editor/drawers/freedraw.js + + +class FreeDrawOutliner { + #box; + #bottom = []; + #innerMargin; + #isLTR; + #top = []; + #last = new Float32Array(18); + #lastX; + #lastY; + #min; + #min_dist; + #scaleFactor; + #thickness; + #points = []; + static #MIN_DIST = 8; + static #MIN_DIFF = 2; + static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF; + constructor({ + x, + y + }, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + this.#box = box; + this.#thickness = thickness * scaleFactor; + this.#isLTR = isLTR; + this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); + this.#innerMargin = innerMargin; + this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeDrawOutliner.#MIN * scaleFactor; + this.#scaleFactor = scaleFactor; + this.#points.push(x, y); + } + isEmpty() { + return isNaN(this.#last[8]); + } + #getLastCoords() { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height]; + } + add({ + x, + y + }) { + this.#lastX = x; + this.#lastY = y; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + let [x1, y1, x2, y2] = this.#last.subarray(8, 12); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(diffX, diffY); + if (d < this.#min) { + return false; + } + const diffD = d - this.#min_dist; + const K = diffD / d; + const shiftX = K * diffX; + const shiftY = K * diffY; + let x0 = x1; + let y0 = y1; + x1 = x2; + y1 = y2; + x2 += shiftX; + y2 += shiftY; + this.#points?.push(x, y); + const nX = -shiftY / diffD; + const nY = shiftX / diffD; + const thX = nX * this.#thickness; + const thY = nY * this.#thickness; + this.#last.set(this.#last.subarray(2, 8), 0); + this.#last.set([x2 + thX, y2 + thY], 4); + this.#last.set(this.#last.subarray(14, 18), 12); + this.#last.set([x2 - thX, y2 - thY], 16); + if (isNaN(this.#last[6])) { + if (this.#top.length === 0) { + this.#last.set([x1 + thX, y1 + thY], 2); + this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight); + this.#last.set([x1 - thX, y1 - thY], 14); + this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + return !this.isEmpty(); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)); + if (angle < Math.PI / 2) { + [x1, y1, x2, y2] = this.#last.subarray(2, 6); + this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x1, y1, x0, y0] = this.#last.subarray(14, 18); + this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight); + return true; + } + [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6); + this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18); + this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + return true; + } + toSVGPath() { + if (this.isEmpty()) { + return ""; + } + const top = this.#top; + const bottom = this.#bottom; + if (isNaN(this.#last[6]) && !this.isEmpty()) { + return this.#toSVGPathTwoPoints(); + } + const buffer = []; + buffer.push(`M${top[4]} ${top[5]}`); + for (let i = 6; i < top.length; i += 6) { + if (isNaN(top[i])) { + buffer.push(`L${top[i + 4]} ${top[i + 5]}`); + } else { + buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); + } + } + this.#toSVGPathEnd(buffer); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + if (isNaN(bottom[i])) { + buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); + } else { + buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); + } + } + this.#toSVGPathStart(buffer); + return buffer.join(" "); + } + #toSVGPathTwoPoints() { + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + #toSVGPathStart(buffer) { + const bottom = this.#bottom; + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + } + #toSVGPathEnd(buffer) { + const [x, y, width, height] = this.#box; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + } + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } + getOutlines() { + const top = this.#top; + const bottom = this.#bottom; + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const points = new Float32Array((this.#points?.length ?? 0) + 2); + for (let i = 0, ii = points.length - 2; i < ii; i += 2) { + points[i] = (this.#points[i] - layerX) / layerWidth; + points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; + } + points[points.length - 2] = (this.#lastX - layerX) / layerWidth; + points[points.length - 1] = (this.#lastY - layerY) / layerHeight; + if (isNaN(last[6]) && !this.isEmpty()) { + return this.#getOutlineTwoPoints(points); + } + const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length); + let N = top.length; + for (let i = 0; i < N; i += 2) { + if (isNaN(top[i])) { + outline[i] = outline[i + 1] = NaN; + continue; + } + outline[i] = top[i]; + outline[i + 1] = top[i + 1]; + } + N = this.#getOutlineEnd(outline, N); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + for (let j = 0; j < 6; j += 2) { + if (isNaN(bottom[i + j])) { + outline[N] = outline[N + 1] = NaN; + N += 2; + continue; + } + outline[N] = bottom[i + j]; + outline[N + 1] = bottom[i + j + 1]; + N += 2; + } + } + this.#getOutlineStart(outline, N); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineTwoPoints(points) { + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + const outline = new Float32Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineStart(outline, pos) { + const bottom = this.#bottom; + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos); + return pos += 6; + } + #getOutlineEnd(outline, pos) { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos); + return pos += 24; + } +} +class FreeDrawOutline extends Outline { + #box; + #bbox = new Float32Array(4); + #innerMargin; + #isLTR; + #points; + #scaleFactor; + #outline; + constructor(outline, points, box, scaleFactor, innerMargin, isLTR) { + super(); + this.#outline = outline; + this.#points = points; + this.#box = box; + this.#scaleFactor = scaleFactor; + this.#innerMargin = innerMargin; + this.#isLTR = isLTR; + this.lastPoint = [NaN, NaN]; + this.#computeMinMax(isLTR); + const [x, y, width, height] = this.#bbox; + for (let i = 0, ii = outline.length; i < ii; i += 2) { + outline[i] = (outline[i] - x) / width; + outline[i + 1] = (outline[i + 1] - y) / height; + } + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = (points[i] - x) / width; + points[i + 1] = (points[i + 1] - y) / height; + } + } + toSVGPath() { + const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`]; + for (let i = 6, ii = this.#outline.length; i < ii; i += 6) { + if (isNaN(this.#outline[i])) { + buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + continue; + } + buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + } + buffer.push("Z"); + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], rotation) { + const width = trX - blX; + const height = trY - blY; + let outline; + let points; + switch (rotation) { + case 0: + outline = Outline._rescale(this.#outline, blX, trY, width, -height); + points = Outline._rescale(this.#points, blX, trY, width, -height); + break; + case 90: + outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height); + points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height); + break; + case 180: + outline = Outline._rescale(this.#outline, trX, blY, -width, height); + points = Outline._rescale(this.#points, trX, blY, -width, height); + break; + case 270: + outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height); + break; + } + return { + outline: Array.from(outline), + points: [Array.from(points)] + }; + } + #computeMinMax(isLTR) { + const outline = this.#outline; + let lastX = outline[4]; + let lastY = outline[5]; + let minX = lastX; + let minY = lastY; + let maxX = lastX; + let maxY = lastY; + let lastPointX = lastX; + let lastPointY = lastY; + const ltrCallback = isLTR ? Math.max : Math.min; + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + minX = Math.min(minX, outline[i + 4]); + minY = Math.min(minY, outline[i + 5]); + maxX = Math.max(maxX, outline[i + 4]); + maxY = Math.max(maxY, outline[i + 5]); + if (lastPointY < outline[i + 5]) { + lastPointX = outline[i + 4]; + lastPointY = outline[i + 5]; + } else if (lastPointY === outline[i + 5]) { + lastPointX = ltrCallback(lastPointX, outline[i + 4]); + } + } else { + const bbox = Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6)); + minX = Math.min(minX, bbox[0]); + minY = Math.min(minY, bbox[1]); + maxX = Math.max(maxX, bbox[2]); + maxY = Math.max(maxY, bbox[3]); + if (lastPointY < bbox[3]) { + lastPointX = bbox[2]; + lastPointY = bbox[3]; + } else if (lastPointY === bbox[3]) { + lastPointX = ltrCallback(lastPointX, bbox[2]); + } + } + lastX = outline[i + 4]; + lastY = outline[i + 5]; + } + const bbox = this.#bbox; + bbox[0] = minX - this.#innerMargin; + bbox[1] = minY - this.#innerMargin; + bbox[2] = maxX - minX + 2 * this.#innerMargin; + bbox[3] = maxY - minY + 2 * this.#innerMargin; + this.lastPoint = [lastPointX, lastPointY]; + } + get box() { + return this.#bbox; + } + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } + getNewOutline(thickness, innerMargin) { + const [x, y, width, height] = this.#bbox; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const sx = width * layerWidth; + const sy = height * layerHeight; + const tx = x * layerWidth + layerX; + const ty = y * layerHeight + layerY; + const outliner = this.newOutliner({ + x: this.#points[0] * sx + tx, + y: this.#points[1] * sy + ty + }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); + for (let i = 2; i < this.#points.length; i += 2) { + outliner.add({ + x: this.#points[i] * sx + tx, + y: this.#points[i + 1] * sy + ty + }); + } + return outliner.getOutlines(); + } +} + +;// ./src/display/editor/drawers/highlight.js + + +class HighlightOutliner { + #box; + #lastPoint; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + minX = Math.min(minX, x1); + maxX = Math.max(maxX, x2); + minY = Math.min(minY, y1); + maxY = Math.max(maxY, y2); + } + const bboxWidth = maxX - minX + 2 * innerMargin; + const bboxHeight = maxY - minY + 2 * innerMargin; + const shiftedMinX = minX - innerMargin; + const shiftedMinY = minY - innerMargin; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2] = edge; + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; + } + this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]); + this.#lastPoint = lastPoint; + } + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); + } else { + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); + } + } + return this.#getOutlines(outlineVerticalEdges); + } + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); + } + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); + } + const outlines = []; + let outline; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); + } + return new HighlightOutline(outlines, this.#box, this.#lastPoint); + } + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } + } + return end + 1; + } + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); + } + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + } + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } + } + return results; + } +} +class HighlightOutline extends Outline { + #box; + #outlines; + constructor(outlines, box, lastPoint) { + super(); + this.#outlines = outlines; + this.#box = box; + this.lastPoint = lastPoint; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; + } + } + buffer.push("Z"); + } + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; + } + outlines.push(points); + } + return outlines; + } + get box() { + return this.#box; + } + get classNamesForOutlining() { + return ["highlightOutline"]; + } +} +class FreeHighlightOutliner extends FreeDrawOutliner { + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } +} +class FreeHighlightOutline extends FreeDrawOutline { + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } +} + +;// ./src/display/editor/color_picker.js + + + +class ColorPicker { + #button = null; + #buttonSwatch = null; + #defaultColor; + #dropdown = null; + #dropdownWasFromKeyboard = false; + #isMainColorPicker = false; + #editor = null; + #eventBus; + #openDropdownAC = null; + #uiManager = null; + #type; + static #l10nColor = null; + static get _keyboardManager() { + return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape", "mac+Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], ColorPicker.prototype._moveToEnd]])); + } + constructor({ + editor = null, + uiManager = null + }) { + if (editor) { + this.#isMainColorPicker = false; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_COLOR; + this.#editor = editor; + } else { + this.#isMainColorPicker = true; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR; + } + this.#uiManager = editor?._uiManager || uiManager; + this.#eventBus = this.#uiManager._eventBus; + this.#defaultColor = editor?.color || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + ColorPicker.#l10nColor ||= Object.freeze({ + blue: "pdfjs-editor-colorpicker-blue", + green: "pdfjs-editor-colorpicker-green", + pink: "pdfjs-editor-colorpicker-pink", + red: "pdfjs-editor-colorpicker-red", + yellow: "pdfjs-editor-colorpicker-yellow" + }); + } + renderButton() { + const button = this.#button = document.createElement("button"); + button.className = "colorPicker"; + button.tabIndex = "0"; + button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); + button.setAttribute("aria-haspopup", true); + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + const swatch = this.#buttonSwatch = document.createElement("span"); + swatch.className = "swatch"; + swatch.setAttribute("aria-hidden", true); + swatch.style.backgroundColor = this.#defaultColor; + button.append(swatch); + return button; + } + renderMainDropdown() { + const dropdown = this.#dropdown = this.#getDropdownRoot(); + dropdown.setAttribute("aria-orientation", "horizontal"); + dropdown.setAttribute("aria-labelledby", "highlightColorPickerLabel"); + return dropdown; + } + #getDropdownRoot() { + const div = document.createElement("div"); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.className = "dropdown"; + div.role = "listbox"; + div.setAttribute("aria-multiselectable", false); + div.setAttribute("aria-orientation", "vertical"); + div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + for (const [name, color] of this.#uiManager.highlightColors) { + const button = document.createElement("button"); + button.tabIndex = "0"; + button.role = "option"; + button.setAttribute("data-color", color); + button.title = name; + button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]); + const swatch = document.createElement("span"); + button.append(swatch); + swatch.className = "swatch"; + swatch.style.backgroundColor = color; + button.setAttribute("aria-selected", color === this.#defaultColor); + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); + div.append(button); + } + div.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + return div; + } + #colorSelect(color, event) { + event.stopPropagation(); + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: this.#type, + value: color + }); + } + _colorSelectFromKeyboard(event) { + if (event.target === this.#button) { + this.#openDropdown(event); + return; + } + const color = event.target.getAttribute("data-color"); + if (!color) { + return; + } + this.#colorSelect(color, event); + } + _moveToNext(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + if (event.target === this.#button) { + this.#dropdown.firstChild?.focus(); + return; + } + event.target.nextSibling?.focus(); + } + _moveToPrevious(event) { + if (event.target === this.#dropdown?.firstChild || event.target === this.#button) { + if (this.#isDropdownVisible) { + this._hideDropdownFromKeyboard(); + } + return; + } + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + } + event.target.previousSibling?.focus(); + } + _moveToBeginning(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.firstChild?.focus(); + } + _moveToEnd(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.lastChild?.focus(); + } + #keyDown(event) { + ColorPicker._keyboardManager.exec(this, event); + } + #openDropdown(event) { + if (this.#isDropdownVisible) { + this.hideDropdown(); + return; + } + this.#dropdownWasFromKeyboard = event.detail === 0; + if (!this.#openDropdownAC) { + this.#openDropdownAC = new AbortController(); + window.addEventListener("pointerdown", this.#pointerDown.bind(this), { + signal: this.#uiManager.combinedSignal(this.#openDropdownAC) + }); + } + if (this.#dropdown) { + this.#dropdown.classList.remove("hidden"); + return; + } + const root = this.#dropdown = this.#getDropdownRoot(); + this.#button.append(root); + } + #pointerDown(event) { + if (this.#dropdown?.contains(event.target)) { + return; + } + this.hideDropdown(); + } + hideDropdown() { + this.#dropdown?.classList.add("hidden"); + this.#openDropdownAC?.abort(); + this.#openDropdownAC = null; + } + get #isDropdownVisible() { + return this.#dropdown && !this.#dropdown.classList.contains("hidden"); + } + _hideDropdownFromKeyboard() { + if (this.#isMainColorPicker) { + return; + } + if (!this.#isDropdownVisible) { + this.#editor?.unselect(); + return; + } + this.hideDropdown(); + this.#button.focus({ + preventScroll: true, + focusVisible: this.#dropdownWasFromKeyboard + }); + } + updateColor(color) { + if (this.#buttonSwatch) { + this.#buttonSwatch.style.backgroundColor = color; + } + if (!this.#dropdown) { + return; + } + const i = this.#uiManager.highlightColors.values(); + for (const child of this.#dropdown.children) { + child.setAttribute("aria-selected", i.next().value === color); + } + } + destroy() { + this.#button?.remove(); + this.#button = null; + this.#buttonSwatch = null; + this.#dropdown?.remove(); + this.#dropdown = null; + } +} + +;// ./src/display/editor/highlight.js + + + + + + + +class HighlightEditor extends AnnotationEditor { + #anchorNode = null; + #anchorOffset = 0; + #boxes; + #clipPathId = null; + #colorPicker = null; + #focusOutlines = null; + #focusNode = null; + #focusOffset = 0; + #highlightDiv = null; + #highlightOutlines = null; + #id = null; + #isFreeHighlight = false; + #lastPoint = null; + #opacity; + #outlineId = null; + #text = ""; + #thickness; + #methodOfCreation = ""; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 12; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static _freeHighlightId = -1; + static _freeHighlight = null; + static _freeHighlightClipId = ""; + static get _keyboardManager() { + const proto = HighlightEditor.prototype; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, { + args: [3] + }]])); + } + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.color = params.color || HighlightEditor._defaultColor; + this.#thickness = params.thickness || HighlightEditor._defaultThickness; + this.#opacity = params.opacity || HighlightEditor._defaultOpacity; + this.#boxes = params.boxes || null; + this.#methodOfCreation = params.methodOfCreation || ""; + this.#text = params.text || ""; + this._isDraggable = false; + if (params.highlightId > -1) { + this.#isFreeHighlight = true; + this.#createFreeOutlines(params); + this.#addToDrawLayer(); + } else if (this.#boxes) { + this.#anchorNode = params.anchorNode; + this.#anchorOffset = params.anchorOffset; + this.#focusNode = params.focusNode; + this.#focusOffset = params.focusOffset; + this.#createOutlines(); + this.#addToDrawLayer(); + this.rotate(this.rotation); + } + } + get telemetryInitialData() { + return { + action: "added", + type: this.#isFreeHighlight ? "free_highlight" : "highlight", + color: this._uiManager.highlightColorNames.get(this.color), + thickness: this.#thickness, + methodOfCreation: this.#methodOfCreation + }; + } + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.highlightColorNames.get(this.color) + }; + } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; + } + #createOutlines() { + const outliner = new HighlightOutliner(this.#boxes, 0.001); + this.#highlightOutlines = outliner.getOutlines(); + [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box; + const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); + this.#focusOutlines = outlinerForOutline.getOutlines(); + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; + } + #createFreeOutlines({ + highlightOutlines, + highlightId, + clipPathId + }) { + this.#highlightOutlines = highlightOutlines; + const extraThickness = 1.5; + this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); + if (highlightId >= 0) { + this.#id = highlightId; + this.#clipPathId = clipPathId; + this.parent.drawLayer.finalizeDraw(highlightId, { + bbox: highlightOutlines.box, + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.#outlineId = this.parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: true + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, true); + } else if (this.parent) { + const angle = this.parent.viewport.rotation; + this.parent.drawLayer.updateProperties(this.#id, { + bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360), + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + path: { + d: this.#focusOutlines.toSVGPath() + } + }); + } + const [x, y, width, height] = highlightOutlines.box; + switch (this.rotation) { + case 0: + this.x = x; + this.y = y; + this.width = width; + this.height = height; + break; + case 90: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = y; + this.y = 1 - x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + case 180: + this.x = 1 - x; + this.y = 1 - y; + this.width = width; + this.height = height; + break; + case 270: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = 1 - y; + this.y = x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + } + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + HighlightEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + HighlightEditor._defaultThickness = value; + break; + } + } + translateInPage(x, y) {} + get toolbarPosition() { + return this.#lastPoint; + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + this.#updateThickness(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; + } + #updateColor(color) { + const setColorAndOpacity = (col, opa) => { + this.color = col; + this.#opacity = opa; + this.parent?.drawLayer.updateProperties(this.#id, { + root: { + fill: col, + "fill-opacity": opa + } + }); + this.#colorPicker?.updateColor(col); + }; + const savedColor = this.color; + const savedOpacity = this.#opacity; + this.addCommands({ + cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity), + undo: setColorAndOpacity.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.highlightColorNames.get(color) + }, true); + } + #updateThickness(thickness) { + const savedThickness = this.#thickness; + const setThickness = th => { + this.#thickness = th; + this.#changeThickness(th); + }; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "thickness_changed", + thickness + }, true); + } + async addEditToolbar() { + const toolbar = await super.addEditToolbar(); + if (!toolbar) { + return null; + } + if (this._uiManager.highlightColors) { + this.#colorPicker = new ColorPicker({ + editor: this + }); + toolbar.addColorPicker(this.#colorPicker); + } + return toolbar; + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + fixAndSetPosition() { + return super.fixAndSetPosition(this.#getRotation()); + } + getBaseTranslation() { + return [0, 0]; + } + getRect(tx, ty) { + return super.getRect(tx, ty, this.#getRotation()); + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + if (focus) { + this.div.focus(); + } + } + remove() { + this.#cleanDrawLayer(); + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this.#cleanDrawLayer(); + } else if (parent) { + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.show(this._isVisible); + if (mustBeSelected) { + this.select(); + } + } + #changeThickness(thickness) { + if (!this.#isFreeHighlight) { + return; + } + this.#createFreeOutlines({ + highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) + }); + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + #cleanDrawLayer() { + if (this.#id === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this.#id); + this.#id = null; + this.parent.drawLayer.remove(this.#outlineId); + this.#outlineId = null; + } + #addToDrawLayer(parent = this.parent) { + if (this.#id !== null) { + return; + } + ({ + id: this.#id, + clipPathId: this.#clipPathId + } = parent.drawLayer.draw({ + bbox: this.#highlightOutlines.box, + root: { + viewBox: "0 0 1 1", + fill: this.color, + "fill-opacity": this.#opacity + }, + rootClass: { + highlight: true, + free: this.#isFreeHighlight + }, + path: { + d: this.#highlightOutlines.toSVGPath() + } + }, false, true)); + this.#outlineId = parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: this.#isFreeHighlight + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, this.#isFreeHighlight); + if (this.#highlightDiv) { + this.#highlightDiv.style.clipPath = this.#clipPathId; + } + } + static #rotateBbox([x, y, width, height], angle) { + switch (angle) { + case 90: + return [1 - y - height, x, height, width]; + case 180: + return [1 - x - width, 1 - y - height, width, height]; + case 270: + return [y, 1 - x - width, height, width]; + } + return [x, y, width, height]; + } + rotate(angle) { + const { + drawLayer + } = this.parent; + let box; + if (this.#isFreeHighlight) { + angle = (angle - this.rotation + 360) % 360; + box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); + } else { + box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle); + } + drawLayer.updateProperties(this.#id, { + bbox: box, + root: { + "data-main-rotation": angle + } + }); + drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + root: { + "data-main-rotation": angle + } + }); + } + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); + } + if (this.#isFreeHighlight) { + div.classList.add("free"); + } else { + this.div.addEventListener("keydown", this.#keydown.bind(this), { + signal: this._uiManager._signal + }); + } + const highlightDiv = this.#highlightDiv = document.createElement("div"); + div.append(highlightDiv); + highlightDiv.setAttribute("aria-hidden", "true"); + highlightDiv.className = "internal"; + highlightDiv.style.clipPath = this.#clipPathId; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); + this.enableEditing(); + return div; + } + pointerover() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: true + } + }); + } + } + pointerleave() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false + } + }); + } + } + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); + } + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } + } + #setCaret(start) { + if (!this.#anchorNode) { + return; + } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); + } + } + select() { + super.select(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false, + selected: true + } + }); + } + unselect() { + super.unselect(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + selected: false + } + }); + if (!this.#isFreeHighlight) { + this.#setCaret(false); + } + } + get _mustFixPosition() { + return !this.#isFreeHighlight; + } + show(visible = this._isVisible) { + super.show(visible); + if (this.parent) { + this.parent.drawLayer.updateProperties(this.#id, { + rootClass: { + hidden: !visible + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hidden: !visible + } + }); + } + } + #getRotation() { + return this.#isFreeHighlight ? this.rotation : 0; + } + #serializeBoxes() { + if (this.#isFreeHighlight) { + return null; + } + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { + x, + y, + width, + height + } of boxes) { + const sx = x * pageWidth + pageX; + const sy = (1 - y) * pageHeight + pageY; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight; + i += 8; + } + return quadPoints; + } + #serializeOutlines(rect) { + return this.#highlightOutlines.serialize(rect, this.#getRotation()); + } + static startHighlighting(parent, isLTR, { + target: textLayer, + x, + y + }) { + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + const ac = new AbortController(); + const signal = parent.combinedSignal(ac); + const pointerUpCallback = e => { + ac.abort(); + this.#endHighlight(parent, e); + }; + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", this.#highlightMove.bind(this, parent), { + signal + }); + this._freeHighlight = new FreeHighlightOutliner({ + x, + y + }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); + ({ + id: this._freeHighlightId, + clipPathId: this._freeHighlightClipId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: this._defaultColor, + "fill-opacity": this._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: this._freeHighlight.toSVGPath() + } + }, true, true)); + } + static #highlightMove(parent, event) { + if (this._freeHighlight.add(event)) { + parent.drawLayer.updateProperties(this._freeHighlightId, { + path: { + d: this._freeHighlight.toSVGPath() + } + }); + } + } + static #endHighlight(parent, event) { + if (!this._freeHighlight.isEmpty()) { + parent.createAndAddNewEditor(event, false, { + highlightId: this._freeHighlightId, + highlightOutlines: this._freeHighlight.getOutlines(), + clipPathId: this._freeHighlightClipId, + methodOfCreation: "main_toolbar" + }); + } else { + parent.drawLayer.remove(this._freeHighlightId); + } + this._freeHighlightId = -1; + this._freeHighlight = null; + this._freeHighlightClipId = ""; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof HighlightAnnotationElement) { + const { + data: { + quadPoints, + rect, + rotation, + id, + color, + opacity, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + opacity, + quadPoints, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } else if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + borderStyle: { + rawWidth: thickness + }, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + thickness, + inkLists, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const { + color, + quadPoints, + inkLists, + opacity + } = data; + const editor = await super.deserialize(data, parent, uiManager); + editor.color = Util.makeHexColor(...color); + editor.#opacity = opacity || 1; + if (inkLists) { + editor.#thickness = data.thickness; + } + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [pageX, pageY] = editor.pageTranslation; + if (quadPoints) { + const boxes = editor.#boxes = []; + for (let i = 0; i < quadPoints.length; i += 8) { + boxes.push({ + x: (quadPoints[i] - pageX) / pageWidth, + y: 1 - (quadPoints[i + 1] - pageY) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight + }); + } + editor.#createOutlines(); + editor.#addToDrawLayer(); + editor.rotate(editor.rotation); + } else if (inkLists) { + editor.#isFreeHighlight = true; + const points = inkLists[0]; + const point = { + x: points[0] - pageX, + y: pageHeight - (points[1] - pageY) + }; + const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001); + for (let i = 0, ii = points.length; i < ii; i += 2) { + point.x = points[i] - pageX; + point.y = pageHeight - (points[i + 1] - pageY); + outliner.add(point); + } + const { + id, + clipPathId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: editor.color, + "fill-opacity": editor._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: outliner.toSVGPath() + } + }, true, true); + editor.#createFreeOutlines({ + highlightOutlines: outliner.getOutlines(), + highlightId: id, + clipPathId + }); + editor.#addToDrawLayer(); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const rect = this.getRect(0, 0); + const color = AnnotationEditor._colorManager.convert(this.color); + const serialized = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color, + opacity: this.#opacity, + thickness: this.#thickness, + quadPoints: this.#serializeBoxes(), + outlines: this.#serializeOutlines(rect), + pageIndex: this.pageIndex, + rect, + rotation: this.#getRotation(), + structTreeParentId: this._structTreeParentId + }; + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color + } = this._initialData; + return serialized.color.some((c, i) => c !== color[i]); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/draw.js + + + +class DrawingOptions { + #svgProperties = Object.create(null); + updateProperty(name, value) { + this[name] = value; + this.updateSVGProperty(name, value); + } + updateProperties(properties) { + if (!properties) { + return; + } + for (const [name, value] of Object.entries(properties)) { + this.updateProperty(name, value); + } + } + updateSVGProperty(name, value) { + this.#svgProperties[name] = value; + } + toSVGProperties() { + const root = this.#svgProperties; + this.#svgProperties = Object.create(null); + return { + root + }; + } + reset() { + this.#svgProperties = Object.create(null); + } + updateAll(options = this) { + this.updateProperties(options); + } + clone() { + unreachable("Not implemented"); + } +} +class DrawingEditor extends AnnotationEditor { + #drawOutlines = null; + #mustBeCommitted; + _drawId = null; + static _currentDrawId = -1; + static _currentParent = null; + static #currentDraw = null; + static #currentDrawingAC = null; + static #currentDrawingOptions = null; + static #currentPointerId = NaN; + static #currentPointerType = null; + static #currentPointerIds = null; + static #currentMoveTimestamp = NaN; + static _INNER_MARGIN = 3; + constructor(params) { + super(params); + this.#mustBeCommitted = params.mustBeCommitted || false; + if (params.drawOutlines) { + this.#createDrawOutlines(params); + this.#addToDrawLayer(); + } + } + #createDrawOutlines({ + drawOutlines, + drawId, + drawingOptions + }) { + this.#drawOutlines = drawOutlines; + this._drawingOptions ||= drawingOptions; + if (drawId >= 0) { + this._drawId = drawId; + this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties); + } else { + this._drawId = this.#createDrawing(drawOutlines, this.parent); + } + this.#updateBbox(drawOutlines.box); + } + #createDrawing(drawOutlines, parent) { + const { + id + } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false); + return id; + } + static _mergeSVGProperties(p1, p2) { + const p1Keys = new Set(Object.keys(p1)); + for (const [key, value] of Object.entries(p2)) { + if (p1Keys.has(key)) { + Object.assign(p1[key], value); + } else { + p1[key] = value; + } + } + return p1; + } + static getDefaultDrawingOptions(_options) { + unreachable("Not implemented"); + } + static get typesMap() { + unreachable("Not implemented"); + } + static get isDrawer() { + return true; + } + static get supportMultipleDrawings() { + return false; + } + static updateDefaultParams(type, value) { + const propertyName = this.typesMap.get(type); + if (propertyName) { + this._defaultDrawingOptions.updateProperty(propertyName, value); + } + if (this._currentParent) { + DrawingEditor.#currentDraw.updateProperty(propertyName, value); + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + } + updateParams(type, value) { + const propertyName = this.constructor.typesMap.get(type); + if (propertyName) { + this._updateProperty(type, propertyName, value); + } + } + static get defaultPropertiesToUpdate() { + const properties = []; + const options = this._defaultDrawingOptions; + for (const [type, name] of this.typesMap) { + properties.push([type, options[name]]); + } + return properties; + } + get propertiesToUpdate() { + const properties = []; + const { + _drawingOptions + } = this; + for (const [type, name] of this.constructor.typesMap) { + properties.push([type, _drawingOptions[name]]); + } + return properties; + } + _updateProperty(type, name, value) { + const options = this._drawingOptions; + const savedValue = options[name]; + const setter = val => { + options.updateProperty(name, val); + const bbox = this.#drawOutlines.updateProperty(name, val); + if (bbox) { + this.#updateBbox(bbox); + } + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + }; + this.addCommands({ + cmd: setter.bind(this, value), + undo: setter.bind(this, savedValue), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true + }); + } + _onResizing() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onResized() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onTranslating(x, y) { + this.parent?.drawLayer.updateProperties(this._drawId, { + bbox: this.#rotateBox(x, y) + }); + } + _onTranslated() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), { + bbox: this.#rotateBox() + })); + } + _onStartDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: true + } + }); + } + _onStopDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: false + } + }); + } + commit() { + super.commit(); + this.disableEditMode(); + this.disableEditing(); + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + getBaseTranslation() { + return [0, 0]; + } + get isResizable() { + return true; + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + this._isDraggable = true; + if (this.#mustBeCommitted) { + this.#mustBeCommitted = false; + this.commit(); + this.parent.setSelected(this); + if (focus && this.isOnScreen) { + this.div.focus(); + } + } + } + remove() { + this.#cleanDrawLayer(); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + this.#updateBbox(this.#drawOutlines.box); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + } else if (parent) { + this._uiManager.addShouldRescale(this); + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + if (mustBeSelected) { + this.select(); + } + } + #cleanDrawLayer() { + if (this._drawId === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this._drawId); + this._drawId = null; + this._drawingOptions.reset(); + } + #addToDrawLayer(parent = this.parent) { + if (this._drawId !== null && this.parent === parent) { + return; + } + if (this._drawId !== null) { + this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer); + return; + } + this._drawingOptions.updateAll(); + this._drawId = this.#createDrawing(this.#drawOutlines, parent); + } + #convertToParentSpace([x, y, width, height]) { + const { + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [y, 1 - x, width * (pH / pW), height * (pW / pH)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [1 - y, x, width * (pH / pW), height * (pW / pH)]; + default: + return [x, y, width, height]; + } + } + #convertToDrawSpace() { + const { + x, + y, + width, + height, + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + #updateBbox(bbox) { + [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox); + if (this.div) { + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + this._onResized(); + } + #rotateBox() { + const { + x, + y, + width, + height, + rotation, + parentRotation, + parentDimensions: [pW, pH] + } = this; + switch ((rotation * 4 + parentRotation) / 90) { + case 1: + return [1 - y - height, x, height, width]; + case 2: + return [1 - x - width, 1 - y - height, width, height]; + case 3: + return [y, 1 - x - width, height, width]; + case 4: + return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 5: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 6: + return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)]; + case 7: + return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 8: + return [x - width, y - height, width, height]; + case 9: + return [1 - y, x - width, height, width]; + case 10: + return [1 - x, 1 - y, width, height]; + case 11: + return [y - height, 1 - x, height, width]; + case 12: + return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)]; + case 13: + return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 14: + return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 15: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + rotate() { + if (!this.parent) { + return; + } + this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({ + bbox: this.#rotateBox() + }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360))); + } + onScaleChanging() { + if (!this.parent) { + return; + } + this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale)); + } + static onScaleChangingWhenDrawing() {} + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + div.classList.add("draw"); + const drawDiv = document.createElement("div"); + div.append(drawDiv); + drawDiv.setAttribute("aria-hidden", "true"); + drawDiv.className = "internal"; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + this._uiManager.addShouldRescale(this); + this.disableEditing(); + return div; + } + static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) { + unreachable("Not implemented"); + } + static startDrawing(parent, uiManager, _isLTR, event) { + const { + target, + offsetX: x, + offsetY: y, + pointerId, + pointerType + } = event; + if (DrawingEditor.#currentPointerType && DrawingEditor.#currentPointerType !== pointerType) { + return; + } + const { + viewport: { + rotation + } + } = parent; + const { + width: parentWidth, + height: parentHeight + } = target.getBoundingClientRect(); + const ac = DrawingEditor.#currentDrawingAC = new AbortController(); + const signal = parent.combinedSignal(ac); + DrawingEditor.#currentPointerId ||= pointerId; + DrawingEditor.#currentPointerType ??= pointerType; + window.addEventListener("pointerup", e => { + if (DrawingEditor.#currentPointerId === e.pointerId) { + this._endDraw(e); + } else { + DrawingEditor.#currentPointerIds?.delete(e.pointerId); + } + }, { + signal + }); + window.addEventListener("pointercancel", e => { + if (DrawingEditor.#currentPointerId === e.pointerId) { + this._currentParent.endDrawingSession(); + } else { + DrawingEditor.#currentPointerIds?.delete(e.pointerId); + } + }, { + signal + }); + window.addEventListener("pointerdown", e => { + if (DrawingEditor.#currentPointerType !== e.pointerType) { + return; + } + (DrawingEditor.#currentPointerIds ||= new Set()).add(e.pointerId); + if (DrawingEditor.#currentDraw.isCancellable()) { + DrawingEditor.#currentDraw.removeLastElement(); + if (DrawingEditor.#currentDraw.isEmpty()) { + this._currentParent.endDrawingSession(true); + } else { + this._endDraw(null); + } + } + }, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + target.addEventListener("pointermove", this._drawMove.bind(this), { + signal + }); + target.addEventListener("touchmove", e => { + if (e.timeStamp === DrawingEditor.#currentMoveTimestamp) { + stopEvent(e); + } + }, { + signal + }); + parent.toggleDrawing(); + uiManager._editorUndoBar?.hide(); + if (DrawingEditor.#currentDraw) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation)); + return; + } + uiManager.updateUIForDefaultProperties(this); + DrawingEditor.#currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation); + DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions(); + this._currentParent = parent; + ({ + id: this._currentDrawId + } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, false)); + } + static _drawMove(event) { + DrawingEditor.#currentMoveTimestamp = -1; + if (!DrawingEditor.#currentDraw) { + return; + } + const { + offsetX, + offsetY, + pointerId + } = event; + if (DrawingEditor.#currentPointerId !== pointerId) { + return; + } + if (DrawingEditor.#currentPointerIds?.size >= 1) { + this._endDraw(event); + return; + } + this._currentParent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.add(offsetX, offsetY)); + DrawingEditor.#currentMoveTimestamp = event.timeStamp; + stopEvent(event); + } + static _cleanup(all) { + if (all) { + this._currentDrawId = -1; + this._currentParent = null; + DrawingEditor.#currentDraw = null; + DrawingEditor.#currentDrawingOptions = null; + DrawingEditor.#currentPointerType = null; + DrawingEditor.#currentMoveTimestamp = NaN; + } + if (DrawingEditor.#currentDrawingAC) { + DrawingEditor.#currentDrawingAC.abort(); + DrawingEditor.#currentDrawingAC = null; + DrawingEditor.#currentPointerId = NaN; + DrawingEditor.#currentPointerIds = null; + } + } + static _endDraw(event) { + const parent = this._currentParent; + if (!parent) { + return; + } + parent.toggleDrawing(true); + this._cleanup(false); + if (event) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY)); + } + if (this.supportMultipleDrawings) { + const draw = DrawingEditor.#currentDraw; + const drawId = this._currentDrawId; + const lastElement = draw.getLastElement(); + parent.addCommands({ + cmd: () => { + parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement)); + }, + undo: () => { + parent.drawLayer.updateProperties(drawId, draw.removeLastElement()); + }, + mustExec: false, + type: AnnotationEditorParamsType.DRAW_STEP + }); + return; + } + this.endDrawing(false); + } + static endDrawing(isAborted) { + const parent = this._currentParent; + if (!parent) { + return null; + } + parent.toggleDrawing(true); + parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP); + if (!DrawingEditor.#currentDraw.isEmpty()) { + const { + pageDimensions: [pageWidth, pageHeight], + scale + } = parent; + const editor = parent.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false, { + drawId: this._currentDrawId, + drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN), + drawingOptions: DrawingEditor.#currentDrawingOptions, + mustBeCommitted: !isAborted + }); + this._cleanup(true); + return editor; + } + parent.drawLayer.remove(this._currentDrawId); + this._cleanup(true); + return null; + } + createDrawingOptions(_data) {} + static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) { + unreachable("Not implemented"); + } + static async deserialize(data, parent, uiManager) { + const { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = parent.viewport; + const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data); + const editor = await super.deserialize(data, parent, uiManager); + editor.createDrawingOptions(data); + editor.#createDrawOutlines({ + drawOutlines + }); + editor.#addToDrawLayer(); + editor.onScaleChanging(); + editor.rotate(); + return editor; + } + serializeDraw(isForCopying) { + const [pageX, pageY] = this.pageTranslation; + const [pageWidth, pageHeight] = this.pageDimensions; + return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/drawers/inkdraw.js + + +class InkDrawOutliner { + #last = new Float64Array(6); + #line; + #lines; + #rotation; + #thickness; + #points; + #lastSVGPath = ""; + #lastIndex = 0; + #outlines = new InkDrawOutline(); + #parentWidth; + #parentHeight; + constructor(x, y, parentWidth, parentHeight, rotation, thickness) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + this.#thickness = thickness; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#lines = [{ + line, + points: this.#points + }]; + this.#last.set(line, 0); + } + updateProperty(name, value) { + if (name === "stroke-width") { + this.#thickness = value; + } + } + #normalizePoint(x, y) { + return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation); + } + isEmpty() { + return !this.#lines || this.#lines.length === 0; + } + isCancellable() { + return this.#points.length <= 10; + } + add(x, y) { + [x, y] = this.#normalizePoint(x, y); + const [x1, y1, x2, y2] = this.#last.subarray(2, 6); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY); + if (d <= 2) { + return null; + } + this.#points.push(x, y); + if (isNaN(x1)) { + this.#last.set([x2, y2, x, y], 2); + this.#line.push(NaN, NaN, NaN, NaN, x, y); + return { + path: { + d: this.toSVGPath() + } + }; + } + if (isNaN(this.#last[0])) { + this.#line.splice(6, 6); + } + this.#last.set([x1, y1, x2, y2, x, y], 0); + this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y)); + return { + path: { + d: this.toSVGPath() + } + }; + } + end(x, y) { + const change = this.add(x, y); + if (change) { + return change; + } + if (this.#points.length === 2) { + return { + path: { + d: this.toSVGPath() + } + }; + } + return null; + } + startNew(x, y, parentWidth, parentHeight, rotation) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + const last = this.#lines.at(-1); + if (last) { + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + } + this.#lines.push({ + line, + points: this.#points + }); + this.#last.set(line, 0); + this.#lastIndex = 0; + this.toSVGPath(); + return null; + } + getLastElement() { + return this.#lines.at(-1); + } + setLastElement(element) { + if (!this.#lines) { + return this.#outlines.setLastElement(element); + } + this.#lines.push(element); + this.#line = element.line; + this.#points = element.points; + this.#lastIndex = 0; + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + if (!this.#lines) { + return this.#outlines.removeLastElement(); + } + this.#lines.pop(); + this.#lastSVGPath = ""; + for (let i = 0, ii = this.#lines.length; i < ii; i++) { + const { + line, + points + } = this.#lines[i]; + this.#line = line; + this.#points = points; + this.#lastIndex = 0; + this.toSVGPath(); + } + return { + path: { + d: this.#lastSVGPath + } + }; + } + toSVGPath() { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + if (this.#points.length === 2) { + this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`; + return this.#lastSVGPath; + } + if (this.#points.length <= 6) { + const i = this.#lastSVGPath.lastIndexOf("M"); + this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`; + this.#lastIndex = 6; + } + if (this.#points.length === 4) { + const secondX = Outline.svgRound(this.#line[10]); + const secondY = Outline.svgRound(this.#line[11]); + this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`; + this.#lastIndex = 12; + return this.#lastSVGPath; + } + const buffer = []; + if (this.#lastIndex === 0) { + buffer.push(`M ${firstX} ${firstY}`); + this.#lastIndex = 6; + } + for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + this.#lastSVGPath += buffer.join(" "); + this.#lastIndex = this.#line.length; + return this.#lastSVGPath; + } + getOutlines(parentWidth, parentHeight, scale, innerMargin) { + const last = this.#lines.at(-1); + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin); + this.#last = null; + this.#line = null; + this.#lines = null; + this.#lastSVGPath = null; + return this.#outlines; + } + get defaultSVGProperties() { + return { + root: { + viewBox: "0 0 10000 10000" + }, + rootClass: { + draw: true + }, + bbox: [0, 0, 1, 1] + }; + } +} +class InkDrawOutline extends Outline { + #bbox; + #currentRotation = 0; + #innerMargin; + #lines; + #parentWidth; + #parentHeight; + #parentScale; + #rotation; + #thickness; + build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#parentScale = parentScale; + this.#rotation = rotation; + this.#thickness = thickness; + this.#innerMargin = innerMargin ?? 0; + this.#lines = lines; + this.#computeBbox(); + } + setLastElement(element) { + this.#lines.push(element); + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + this.#lines.pop(); + return { + path: { + d: this.toSVGPath() + } + }; + } + toSVGPath() { + const buffer = []; + for (const { + line + } of this.#lines) { + buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`); + if (line.length === 6) { + buffer.push("Z"); + continue; + } + if (line.length === 12) { + buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`); + continue; + } + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + } + return buffer.join(""); + } + serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) { + const serializedLines = []; + const serializedPoints = []; + const [x, y, width, height] = this.#getBBoxWithNoMargin(); + let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn; + switch (this.#rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = pageX; + ty = pageY + pageHeight; + sx = pageWidth; + sy = -pageHeight; + x1 = pageX + x * pageWidth; + y1 = pageY + (1 - y - height) * pageHeight; + x2 = pageX + (x + width) * pageWidth; + y2 = pageY + (1 - y) * pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX; + ty = pageY; + sx = pageWidth; + sy = pageHeight; + x1 = pageX + y * pageWidth; + y1 = pageY + x * pageHeight; + x2 = pageX + (y + height) * pageWidth; + y2 = pageY + (x + width) * pageHeight; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX + pageWidth; + ty = pageY; + sx = -pageWidth; + sy = pageHeight; + x1 = pageX + (1 - x - width) * pageWidth; + y1 = pageY + y * pageHeight; + x2 = pageX + (1 - x) * pageWidth; + y2 = pageY + (y + height) * pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX + pageWidth; + ty = pageY + pageHeight; + sx = -pageWidth; + sy = -pageHeight; + x1 = pageX + (1 - y - height) * pageWidth; + y1 = pageY + (1 - x - width) * pageHeight; + x2 = pageX + (1 - y) * pageWidth; + y2 = pageY + (1 - x) * pageHeight; + break; + } + for (const { + line, + points + } of this.#lines) { + serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null)); + serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null)); + } + return { + lines: serializedLines, + points: serializedPoints, + rect: [x1, y1, x2, y2] + }; + } + static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, { + paths: { + lines, + points + }, + rotation, + thickness + }) { + const newLines = []; + let tx, ty, sx, sy, rescaleFn; + switch (rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = -pageX / pageWidth; + ty = pageY / pageHeight + 1; + sx = 1 / pageWidth; + sy = -1 / pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = -pageY / pageHeight; + ty = -pageX / pageWidth; + sx = 1 / pageHeight; + sy = 1 / pageWidth; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX / pageWidth + 1; + ty = -pageY / pageHeight; + sx = -1 / pageWidth; + sy = 1 / pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageY / pageHeight + 1; + ty = pageX / pageWidth + 1; + sx = -1 / pageHeight; + sy = -1 / pageWidth; + break; + } + if (!lines) { + lines = []; + for (const point of points) { + const len = point.length; + if (len === 2) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])); + continue; + } + if (len === 4) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]])); + continue; + } + const line = new Float32Array(3 * (len - 2)); + lines.push(line); + let [x1, y1, x2, y2] = point.subarray(0, 4); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = point[i]; + const y = point[i + 1]; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + } + for (let i = 0, ii = lines.length; i < ii; i++) { + newLines.push({ + line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy), + points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy) + }); + } + const outlines = new InkDrawOutline(); + outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin); + return outlines; + } + #getMarginComponents(thickness = this.#thickness) { + const margin = this.#innerMargin + thickness / 2 * this.#parentScale; + return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth]; + } + #getBBoxWithNoMargin() { + const [x, y, width, height] = this.#bbox; + const [marginX, marginY] = this.#getMarginComponents(0); + return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY]; + } + #computeBbox() { + const bbox = this.#bbox = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); + for (const { + line + } of this.#lines) { + if (line.length <= 12) { + for (let i = 4, ii = line.length; i < ii; i += 6) { + const [x, y] = line.subarray(i, i + 2); + bbox[0] = Math.min(bbox[0], x); + bbox[1] = Math.min(bbox[1], y); + bbox[2] = Math.max(bbox[2], x); + bbox[3] = Math.max(bbox[3], y); + } + continue; + } + let lastX = line[4], + lastY = line[5]; + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6); + Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox); + lastX = x; + lastY = y; + } + } + const [marginX, marginY] = this.#getMarginComponents(); + bbox[0] = Math.min(1, Math.max(0, bbox[0] - marginX)); + bbox[1] = Math.min(1, Math.max(0, bbox[1] - marginY)); + bbox[2] = Math.min(1, Math.max(0, bbox[2] + marginX)); + bbox[3] = Math.min(1, Math.max(0, bbox[3] + marginY)); + bbox[2] -= bbox[0]; + bbox[3] -= bbox[1]; + } + get box() { + return this.#bbox; + } + updateProperty(name, value) { + if (name === "stroke-width") { + return this.#updateThickness(value); + } + return null; + } + #updateThickness(thickness) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#thickness = thickness; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY]; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateParentDimensions([width, height], scale) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#parentWidth = width; + this.#parentHeight = height; + this.#parentScale = scale; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const diffMarginX = newMarginX - oldMarginX; + const diffMarginY = newMarginY - oldMarginY; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateRotation(rotation) { + this.#currentRotation = rotation; + return { + path: { + transform: this.rotationTransform + } + }; + } + get viewBox() { + return this.#bbox.map(Outline.svgRound).join(" "); + } + get defaultProperties() { + const [x, y] = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}` + } + }; + } + get rotationTransform() { + const [,, width, height] = this.#bbox; + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0; + switch (this.#currentRotation) { + case 90: + b = height / width; + c = -width / height; + e = width; + break; + case 180: + a = -1; + d = -1; + e = width; + f = height; + break; + case 270: + b = -height / width; + c = width / height; + f = height; + break; + default: + return ""; + } + return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`; + } + getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const [x, y, width, height] = this.#bbox; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + return { + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: `${this.rotationTransform} translate(${tx} ${ty})` + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const s2x = width / newWidth; + const s2y = height / newHeight; + return { + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`, + transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})` + } + }; + } + getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const bbox = this.#bbox; + const [x, y, width, height] = bbox; + bbox[0] = newX; + bbox[1] = newY; + bbox[2] = newWidth; + bbox[3] = newHeight; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const tx = -s1x * (x + marginX) + newX + marginX; + const ty = -s1y * (y + marginY) + newY + marginY; + if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) { + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, s1x, s1y, line); + Outline._rescale(points, tx, ty, s1x, s1y, points); + } + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + getPathTranslatedSVGProperties([newX, newY], parentDimensions) { + const [newParentWidth, newParentHeight] = parentDimensions; + const bbox = this.#bbox; + const tx = newX - bbox[0]; + const ty = newY - bbox[1]; + if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) { + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + } else { + const sx = this.#parentWidth / newParentWidth; + const sy = this.#parentHeight / newParentHeight; + this.#parentWidth = newParentWidth; + this.#parentHeight = newParentHeight; + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, sx, sy, line); + Outline._rescale(points, tx, ty, sx, sy, points); + } + bbox[2] *= sx; + bbox[3] *= sy; + } + bbox[0] = newX; + bbox[1] = newY; + return { + root: { + viewBox: this.viewBox + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}` + } + }; + } + get defaultSVGProperties() { + const bbox = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + rootClass: { + draw: true + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`, + transform: this.rotationTransform || null + }, + bbox + }; + } +} + +;// ./src/display/editor/ink.js + + + + + +class InkDrawingOptions extends DrawingOptions { + #viewParameters; + constructor(viewerParameters) { + super(); + this.#viewParameters = viewerParameters; + super.updateProperties({ + fill: "none", + stroke: AnnotationEditor._defaultLineColor, + "stroke-opacity": 1, + "stroke-width": 1, + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-miterlimit": 10 + }); + } + updateSVGProperty(name, value) { + if (name === "stroke-width") { + value ??= this["stroke-width"]; + value *= this.#viewParameters.realScale; + } + super.updateSVGProperty(name, value); + } + clone() { + const clone = new InkDrawingOptions(this.#viewParameters); + clone.updateAll(this); + return clone; + } +} +class InkEditor extends DrawingEditor { + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this._willKeepAspectRatio = true; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return true; + } + static get typesMap() { + return shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]])); + } + static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) { + return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions["stroke-width"]); + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + opacity, + borderStyle: { + rawWidth: thickness + }, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.INK, + color: Array.from(color), + thickness, + opacity, + paths: { + points: inkLists + }, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + return editor; + } + onScaleChanging() { + if (!this.parent) { + return; + } + super.onScaleChanging(); + const { + _drawId, + _drawingOptions, + parent + } = this; + _drawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties()); + } + static onScaleChangingWhenDrawing() { + const parent = this._currentParent; + if (!parent) { + return; + } + super.onScaleChangingWhenDrawing(); + this._defaultDrawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + createDrawingOptions({ + color, + thickness, + opacity + }) { + this._drawingOptions = InkEditor.getDefaultDrawingOptions({ + stroke: Util.makeHexColor(...color), + "stroke-width": thickness, + "stroke-opacity": opacity + }); + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const { + lines, + points, + rect + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + stroke, + "stroke-opacity": opacity, + "stroke-width": thickness + } + } = this; + const serialized = { + annotationType: AnnotationEditorType.INK, + color: AnnotationEditor._colorManager.convert(stroke), + opacity, + thickness, + paths: { + lines, + points + }, + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color, + thickness, + opacity, + pageIndex + } = this._initialData; + return this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const { + points, + rect + } = this.serializeDraw(false); + annotation.updateEdited({ + rect, + thickness: this._drawingOptions["stroke-width"], + points + }); + return null; + } +} + +;// ./src/display/editor/stamp.js + + + + +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" + }); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static get supportedTypes() { + const types = ["apng", "avif", "bmp", "gif", "jpeg", "png", "svg+xml", "webp", "x-icon"]; + return shadow(this, "supportedTypes", types.map(type => `image/${type}`)); + } + static get supportedTypesStr() { + return shadow(this, "supportedTypesStr", this.supportedTypes.join(",")); + } + static isHandlingMimeForPasting(mime) { + return this.supportedTypes.includes(mime); + } + static paste(item, parent) { + parent.pasteEditor(AnnotationEditorType.STAMP, { + bitmapFile: item.getAsFile() + }); + } + altTextFinish() { + if (this._uiManager.useNewAltTextFlow) { + this.div.hidden = false; + } + super.altTextFinish(); + } + get telemetryFinalData() { + return { + type: "stamp", + hasAltText: !!this.altTextData?.altText + }; + } + static computeTelemetryFinalData(data) { + const hasAltTextStats = data.get("hasAltText"); + return { + hasAltText: hasAltTextStats.get(true) ?? 0, + hasNoAltText: hasAltTextStats.get(false) ?? 0 + }; + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); + } + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (!this.#canvas) { + return; + } + if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._editToolbar.hide(); + this._uiManager.editAltText(this, true); + return; + } + if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: false, + alt_text_type: "empty" + } + }); + try { + this.mlGuessAltText(); + } catch {} + } + this.div.focus(); + } + async mlGuessAltText(imageData = null, updateAltTextData = true) { + if (this.hasAltTextData()) { + return null; + } + const { + mlManager + } = this._uiManager; + if (!mlManager) { + throw new Error("No ML."); + } + if (!(await mlManager.isEnabledFor("altText"))) { + throw new Error("ML isn't enabled for alt text."); + } + const { + data, + width, + height + } = imageData || this.copyCanvas(null, null, true).imageData; + const response = await mlManager.guess({ + name: "altText", + request: { + data, + width, + height, + channels: data.length / (width * height) + } + }); + if (!response) { + throw new Error("No response from the AI service."); + } + if (response.error) { + throw new Error("Error from the AI service."); + } + if (response.cancel) { + return null; + } + if (!response.output) { + throw new Error("No valid response from the AI service."); + } + const altText = response.output; + await this.setGuessedAltText(altText); + if (updateAltTextData && !this.hasAltTextData()) { + this.altTextData = { + alt: altText, + decorative: false + }; + } + return altText; + } + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = StampEditor.supportedTypesStr; + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this._reportTelemetry({ + action: "pdfjs.image.image_selected", + data: { + alt_text_modal: this._uiManager.useNewAltTextFlow + } + }); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal + }); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } + } + super.remove(); + } + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + onceAdded(focus) { + this._isDraggable = true; + if (focus) { + this.div.focus(); + } + } + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId); + } + get isResizable() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.hidden = true; + this.div.setAttribute("role", "figure"); + this.addAltTextButton(); + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } + if (this.width && !this.annotationElementId) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + } + this._uiManager.addShouldRescale(this); + return this.div; + } + _onResized() { + this.onScaleChanging(); + } + onScaleChanging() { + if (!this.parent) { + return; + } + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); + } + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(); + }, TIME_TO_WAIT); + } + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight); + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + canvas.setAttribute("role", "img"); + this.addContainer(canvas); + this.width = width / pageWidth; + this.height = height / pageHeight; + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); + } + this._initialOptions = null; + if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) { + div.hidden = false; + } + this.#drawBitmap(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; + } + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + canvas.setAttribute("aria-label", this.#bitmapFileName); + } + } + copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) { + if (!maxDataDimension) { + maxDataDimension = 224; + } + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + const outputScale = new OutputScale(); + let bitmap = this.#bitmap; + let width = bitmapWidth, + height = bitmapHeight; + let canvas = null; + if (maxPreviewDimension) { + if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) { + const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight); + width = Math.floor(bitmapWidth * ratio); + height = Math.floor(bitmapHeight * ratio); + } + canvas = document.createElement("canvas"); + const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx); + const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(scaledWidth, scaledHeight); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + let white = "white", + black = "#cfcfd8"; + if (this._uiManager.hcmFilter !== "none") { + black = "black"; + } else if (window.matchMedia?.("(prefers-color-scheme: dark)").matches) { + white = "#8f8f9d"; + black = "#42414d"; + } + const boxDim = 15; + const boxDimWidth = boxDim * outputScale.sx; + const boxDimHeight = boxDim * outputScale.sy; + const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2); + const patternCtx = pattern.getContext("2d"); + patternCtx.fillStyle = white; + patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2); + patternCtx.fillStyle = black; + patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight); + patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight); + ctx.fillStyle = ctx.createPattern(pattern, "repeat"); + ctx.fillRect(0, 0, scaledWidth, scaledHeight); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + let imageData = null; + if (createImageData) { + let dataWidth, dataHeight; + if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) { + dataWidth = bitmap.width; + dataHeight = bitmap.height; + } else { + bitmap = this.#bitmap; + if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) { + const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight); + dataWidth = Math.floor(bitmapWidth * ratio); + dataHeight = Math.floor(bitmapHeight * ratio); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(dataWidth, dataHeight); + } + } + } + const offscreen = new OffscreenCanvas(dataWidth, dataHeight); + const offscreenCtx = offscreen.getContext("2d", { + willReadFrequently: true + }); + offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight); + imageData = { + width: dataWidth, + height: dataHeight, + data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data + }; + } + return { + canvas, + width, + height, + imageData + }; + } + #scaleBitmap(width, height) { + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); + } + return bitmap; + } + #drawBitmap() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + width, + height + } = this; + const outputScale = new OutputScale(); + const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx); + const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy); + const canvas = this.#canvas; + if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) { + return; + } + canvas.width = scaledWidth; + canvas.height = scaledHeight; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + getImageForAltText() { + return this.#canvas; + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } + } + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof StampAnnotationElement) { + const { + data: { + rect, + rotation, + id, + structParent, + popupRef + }, + container, + parent: { + page: { + pageNumber + } + } + } = data; + const canvas = container.querySelector("canvas"); + const imageData = uiManager.imageManager.getFromCanvas(container.id, canvas); + canvas.remove(); + const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || ""; + initialData = data = { + annotationType: AnnotationEditorType.STAMP, + bitmapId: imageData.id, + bitmap: imageData.bitmap, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + accessibilityData: { + decorative: false, + altText + }, + isSvg: false, + structParent, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + const { + rect, + bitmap, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + if (bitmap) { + editor.#bitmap = bitmap; + } + } else { + editor.#bitmapUrl = bitmapUrl; + } + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + editor.annotationElementId = data.id || null; + if (accessibilityData) { + editor.altTextData = accessibilityData; + } + editor._initialData = initialData; + editor.#hasBeenAddedInUndoStack = !!initialData; + return editor; + } + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const serialized = { + annotationType: AnnotationEditorType.STAMP, + bitmapId: this.#bitmapId, + pageIndex: this.pageIndex, + rect: this.getRect(0, 0), + rotation: this.rotation, + isSvg: this.#isSvg, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.serializeAltText(true); + return serialized; + } + const { + decorative, + altText + } = this.serializeAltText(false); + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText + }; + } + if (this.annotationElementId) { + const changes = this.#hasElementChanged(serialized); + if (changes.isSame) { + return null; + } + if (changes.isSameAltText) { + delete serialized.accessibilityData; + } else { + serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; + } + } + serialized.id = this.annotationElementId; + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } + } + return serialized; + } + #hasElementChanged(serialized) { + const { + pageIndex, + accessibilityData: { + altText + } + } = this._initialData; + const isSamePageIndex = serialized.pageIndex === pageIndex; + const isSameAltText = (serialized.accessibilityData?.alt || "") === altText; + return { + isSame: !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText, + isSameAltText + }; + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } +} + +;// ./src/display/editor/annotation_editor_layer.js + + + + + + + +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #clickAC = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isDisabling = false; + #isEnabling = false; + #drawingAC = null; + #focusedElement = null; + #textLayer = null; + #textSelectionAC = null; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + structTreeLayer, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this._structTree = structTreeLayer; + this.#uiManager.addLayer(this); + } + get isEmpty() { + return this.#editors.size === 0; + } + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(mode) { + this.#uiManager.updateToolbar(mode); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); + return; + case AnnotationEditorType.INK: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); + } + this.div.hidden = false; + } + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; + } + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); + } + addCommands(params) { + this.#uiManager.addCommands(params); + } + cleanUndoStack(type) { + this.#uiManager.cleanUndoStack(type); + } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + } + async enable() { + this.#isEnabling = true; + this.div.tabIndex = 0; + this.togglePointerEvents(true); + const annotationElementIds = new Set(); + for (const editor of this.#editors.values()) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); + } + } + if (!this.#annotationLayer) { + this.#isEnabling = false; + return; + } + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + this.#isEnabling = false; + } + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#editors.values()) { + editor.disableEditing(); + if (!editor.annotationElementId) { + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + if (this.#annotationLayer) { + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + continue; + } + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; + } + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + if (editor.renderAnnotationElement(editable)) { + editor.show(false); + } + } + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); + } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + this.#isDisabling = false; + } + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; + } + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); + } + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#textSelectionAC) { + this.#textSelectionAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textSelectionAC); + this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), { + signal + }); + this.#textLayer.div.classList.add("highlighting"); + } + } + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#textSelectionAC) { + this.#textSelectionAC.abort(); + this.#textSelectionAC = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + const { + target + } = event; + if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent")) && this.#textLayer.div.contains(target)) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + this.#textLayer.div.classList.add("free"); + this.toggleDrawing(); + HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", { + target: this.#textLayer.div, + x: event.x, + y: event.y + }); + this.#textLayer.div.addEventListener("pointerup", () => { + this.#textLayer.div.classList.remove("free"); + this.toggleDrawing(true); + }, { + once: true, + signal: this.#uiManager._signal + }); + event.preventDefault(); + } + } + enableClick() { + if (this.#clickAC) { + return; + } + this.#clickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#clickAC); + this.div.addEventListener("pointerdown", this.pointerdown.bind(this), { + signal + }); + const pointerup = this.pointerup.bind(this); + this.div.addEventListener("pointerup", pointerup, { + signal + }); + this.div.addEventListener("pointercancel", pointerup, { + signal + }); + } + disableClick() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + this.attach(editor); + editor.parent?.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } + } + add(editor) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(!this.#isEnabling); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); + } else { + editor._focusEventsAllowed = true; + } + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); + } else { + this.add(editor); + } + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getNextId() { + return this.#uiManager.getId(); + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + combinedSignal(ac) { + return this.#uiManager.combinedSignal(ac); + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + pasteEditor(mode, params) { + this.#uiManager.updateToolbar(mode); + this.#uiManager.updateMode(mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); + } + } + async deserialize(data) { + return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null; + } + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; + } + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.div.getBoundingClientRect(); + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; + } + addNewEditor() { + this.createAndAddNewEditor(this.#getCenterPoint(), true); + } + setSelected(editor) { + this.#uiManager.setSelected(editor); + } + toggleSelected(editor) { + this.#uiManager.toggleSelected(editor); + } + unselect(editor) { + this.#uiManager.unselect(editor); + } + pointerup(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!this.#hadPointerDown) { + return; + } + this.#hadPointerDown = false; + if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) { + return; + } + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + if (this.#uiManager.getMode() === AnnotationEditorType.STAMP) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + if (this.#currentEditorType?.isDrawer) { + this.startDrawingSession(event); + return; + } + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + startDrawingSession(event) { + this.div.focus(); + if (this.#drawingAC) { + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + return; + } + this.#uiManager.setCurrentDrawingSession(this); + this.#drawingAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#drawingAC); + this.div.addEventListener("blur", ({ + relatedTarget + }) => { + if (relatedTarget && !this.div.contains(relatedTarget)) { + this.#focusedElement = null; + this.commitOrRemove(); + } + }, { + signal + }); + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + } + pause(on) { + if (on) { + const { + activeElement + } = document; + if (this.div.contains(activeElement)) { + this.#focusedElement = activeElement; + } + return; + } + if (this.#focusedElement) { + setTimeout(() => { + this.#focusedElement?.focus(); + this.#focusedElement = null; + }, 0); + } + } + endDrawingSession(isAborted = false) { + if (!this.#drawingAC) { + return null; + } + this.#uiManager.setCurrentDrawingSession(null); + this.#drawingAC.abort(); + this.#drawingAC = null; + this.#focusedElement = null; + return this.#currentEditorType.endDrawing(isAborted); + } + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; + } + commitOrRemove() { + if (this.#drawingAC) { + this.endDrawingSession(); + return true; + } + return false; + } + onScaleChanging() { + if (!this.#drawingAC) { + return; + } + this.#currentEditorType.onScaleChangingWhenDrawing(this); + } + destroy() { + this.commitOrRemove(); + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = null; + } + for (const editor of this.#editors.values()) { + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + this.#editors.clear(); + this.#uiManager.removeLayer(this); + } + #cleanup() { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + } + render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + this.updateMode(); + } + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } + get scale() { + return this.#uiManager.viewParameters.realScale; + } +} + +;// ./src/display/draw_layer.js + + +class DrawLayer { + #parent = null; + #id = 0; + #mapping = new Map(); + #toUpdate = new Map(); + constructor({ + pageIndex + }) { + this.pageIndex = pageIndex; + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; + } + } + static get _svgFactory() { + return shadow(this, "_svgFactory", new DOMSVGFactory()); + } + static #setBox(element, [x, y, width, height]) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; + } + #createSVG() { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", true); + return svg; + } + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; + } + #updateProperties(element, properties) { + for (const [key, value] of Object.entries(properties)) { + if (value === null) { + element.removeAttribute(key); + } else { + element.setAttribute(key, value); + } + } + } + draw(properties, isPathUpdatable = false, hasClip = false) { + const id = this.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); + } + const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null; + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + use.setAttribute("href", `#${pathId}`); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; + } + drawOutline(properties, mustRemoveSelfIntersections) { + const id = this.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (mustRemoveSelfIntersections) { + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_p${this.pageIndex}_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); + } + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); + } + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return id; + } + finalizeDraw(id, properties) { + this.#toUpdate.delete(id); + this.updateProperties(id, properties); + } + updateProperties(elementOrId, properties) { + if (!properties) { + return; + } + const { + root, + bbox, + rootClass, + path + } = properties; + const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId; + if (!element) { + return; + } + if (root) { + this.#updateProperties(element, root); + } + if (bbox) { + DrawLayer.#setBox(element, bbox); + } + if (rootClass) { + const { + classList + } = element; + for (const [className, value] of Object.entries(rootClass)) { + classList.toggle(className, value); + } + } + if (path) { + const defs = element.firstChild; + const pathElement = defs.firstChild; + this.#updateProperties(pathElement, path); + } + } + updateParent(id, layer) { + if (layer === this) { + return; + } + const root = this.#mapping.get(id); + if (!root) { + return; + } + layer.#parent.append(root); + this.#mapping.delete(id); + layer.#mapping.set(id, root); + } + remove(id) { + this.#toUpdate.delete(id); + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); + } + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + this.#toUpdate.clear(); + } +} + +;// ./src/pdf.js + + + + + + + + + + + + + + +const pdfjsVersion = "4.10.38"; +const pdfjsBuild = "f9bea397f"; +{ + globalThis.pdfjsTestingUtils = { + HighlightOutliner: HighlightOutliner + }; +} + +var __webpack_exports__AbortException = __webpack_exports__.AbortException; +var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer; +var __webpack_exports__AnnotationEditorParamsType = __webpack_exports__.AnnotationEditorParamsType; +var __webpack_exports__AnnotationEditorType = __webpack_exports__.AnnotationEditorType; +var __webpack_exports__AnnotationEditorUIManager = __webpack_exports__.AnnotationEditorUIManager; +var __webpack_exports__AnnotationLayer = __webpack_exports__.AnnotationLayer; +var __webpack_exports__AnnotationMode = __webpack_exports__.AnnotationMode; +var __webpack_exports__ColorPicker = __webpack_exports__.ColorPicker; +var __webpack_exports__DOMSVGFactory = __webpack_exports__.DOMSVGFactory; +var __webpack_exports__DrawLayer = __webpack_exports__.DrawLayer; +var __webpack_exports__FeatureTest = __webpack_exports__.FeatureTest; +var __webpack_exports__GlobalWorkerOptions = __webpack_exports__.GlobalWorkerOptions; +var __webpack_exports__ImageKind = __webpack_exports__.ImageKind; +var __webpack_exports__InvalidPDFException = __webpack_exports__.InvalidPDFException; +var __webpack_exports__MissingPDFException = __webpack_exports__.MissingPDFException; +var __webpack_exports__OPS = __webpack_exports__.OPS; +var __webpack_exports__OutputScale = __webpack_exports__.OutputScale; +var __webpack_exports__PDFDataRangeTransport = __webpack_exports__.PDFDataRangeTransport; +var __webpack_exports__PDFDateString = __webpack_exports__.PDFDateString; +var __webpack_exports__PDFWorker = __webpack_exports__.PDFWorker; +var __webpack_exports__PasswordResponses = __webpack_exports__.PasswordResponses; +var __webpack_exports__PermissionFlag = __webpack_exports__.PermissionFlag; +var __webpack_exports__PixelsPerInch = __webpack_exports__.PixelsPerInch; +var __webpack_exports__RenderingCancelledException = __webpack_exports__.RenderingCancelledException; +var __webpack_exports__TextLayer = __webpack_exports__.TextLayer; +var __webpack_exports__TouchManager = __webpack_exports__.TouchManager; +var __webpack_exports__UnexpectedResponseException = __webpack_exports__.UnexpectedResponseException; +var __webpack_exports__Util = __webpack_exports__.Util; +var __webpack_exports__VerbosityLevel = __webpack_exports__.VerbosityLevel; +var __webpack_exports__XfaLayer = __webpack_exports__.XfaLayer; +var __webpack_exports__build = __webpack_exports__.build; +var __webpack_exports__createValidAbsoluteUrl = __webpack_exports__.createValidAbsoluteUrl; +var __webpack_exports__fetchData = __webpack_exports__.fetchData; +var __webpack_exports__getDocument = __webpack_exports__.getDocument; +var __webpack_exports__getFilenameFromUrl = __webpack_exports__.getFilenameFromUrl; +var __webpack_exports__getPdfFilenameFromUrl = __webpack_exports__.getPdfFilenameFromUrl; +var __webpack_exports__getXfaPageViewport = __webpack_exports__.getXfaPageViewport; +var __webpack_exports__isDataScheme = __webpack_exports__.isDataScheme; +var __webpack_exports__isPdfFile = __webpack_exports__.isPdfFile; +var __webpack_exports__noContextMenu = __webpack_exports__.noContextMenu; +var __webpack_exports__normalizeUnicode = __webpack_exports__.normalizeUnicode; +var __webpack_exports__setLayerDimensions = __webpack_exports__.setLayerDimensions; +var __webpack_exports__shadow = __webpack_exports__.shadow; +var __webpack_exports__stopEvent = __webpack_exports__.stopEvent; +var __webpack_exports__version = __webpack_exports__.version; +export { __webpack_exports__AbortException as AbortException, __webpack_exports__AnnotationEditorLayer as AnnotationEditorLayer, __webpack_exports__AnnotationEditorParamsType as AnnotationEditorParamsType, __webpack_exports__AnnotationEditorType as AnnotationEditorType, __webpack_exports__AnnotationEditorUIManager as AnnotationEditorUIManager, __webpack_exports__AnnotationLayer as AnnotationLayer, __webpack_exports__AnnotationMode as AnnotationMode, __webpack_exports__ColorPicker as ColorPicker, __webpack_exports__DOMSVGFactory as DOMSVGFactory, __webpack_exports__DrawLayer as DrawLayer, __webpack_exports__FeatureTest as FeatureTest, __webpack_exports__GlobalWorkerOptions as GlobalWorkerOptions, __webpack_exports__ImageKind as ImageKind, __webpack_exports__InvalidPDFException as InvalidPDFException, __webpack_exports__MissingPDFException as MissingPDFException, __webpack_exports__OPS as OPS, __webpack_exports__OutputScale as OutputScale, __webpack_exports__PDFDataRangeTransport as PDFDataRangeTransport, __webpack_exports__PDFDateString as PDFDateString, __webpack_exports__PDFWorker as PDFWorker, __webpack_exports__PasswordResponses as PasswordResponses, __webpack_exports__PermissionFlag as PermissionFlag, __webpack_exports__PixelsPerInch as PixelsPerInch, __webpack_exports__RenderingCancelledException as RenderingCancelledException, __webpack_exports__TextLayer as TextLayer, __webpack_exports__TouchManager as TouchManager, __webpack_exports__UnexpectedResponseException as UnexpectedResponseException, __webpack_exports__Util as Util, __webpack_exports__VerbosityLevel as VerbosityLevel, __webpack_exports__XfaLayer as XfaLayer, __webpack_exports__build as build, __webpack_exports__createValidAbsoluteUrl as createValidAbsoluteUrl, __webpack_exports__fetchData as fetchData, __webpack_exports__getDocument as getDocument, __webpack_exports__getFilenameFromUrl as getFilenameFromUrl, __webpack_exports__getPdfFilenameFromUrl as getPdfFilenameFromUrl, __webpack_exports__getXfaPageViewport as getXfaPageViewport, __webpack_exports__isDataScheme as isDataScheme, __webpack_exports__isPdfFile as isPdfFile, __webpack_exports__noContextMenu as noContextMenu, __webpack_exports__normalizeUnicode as normalizeUnicode, __webpack_exports__setLayerDimensions as setLayerDimensions, __webpack_exports__shadow as shadow, __webpack_exports__stopEvent as stopEvent, __webpack_exports__version as version }; + +//# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/public/pdfjs/build/pdf.sandbox.mjs b/public/pdfjs/build/pdf.sandbox.mjs new file mode 100644 index 0000000..9c5997d --- /dev/null +++ b/public/pdfjs/build/pdf.sandbox.mjs @@ -0,0 +1,242 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = globalThis.pdfjsSandbox = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + QuickJSSandbox: () => (/* binding */ QuickJSSandbox) +}); + +;// ./external/quickjs/quickjs-eval.js +var Module=(()=>{var _scriptDir=typeof document!=='undefined'&&document.currentScript?document.currentScript.src:undefined;return function(moduleArg={}){var d=moduleArg,k,n;d.ready=new Promise((a,b)=>{k=a;n=b;});var p=Object.assign({},d),q="";"undefined"!=typeof document&&document.currentScript&&(q=document.currentScript.src);_scriptDir&&(q=_scriptDir);q.startsWith("blob:")?q="":q=q.substr(0,q.replace(/[?#].*/,"").lastIndexOf("/")+1);var aa=d.print||console.log.bind(console),u=d.printErr||console.error.bind(console);Object.assign(d,p);p=null;var v;d.wasmBinary&&(v=d.wasmBinary);"object"!=typeof WebAssembly&&w("no native wasm support detected");var x,y=!1,z,A,B,C;function D(){var a=x.buffer;d.HEAP8=z=new Int8Array(a);d.HEAP16=new Int16Array(a);d.HEAPU8=A=new Uint8Array(a);d.HEAPU16=new Uint16Array(a);d.HEAP32=B=new Int32Array(a);d.HEAPU32=C=new Uint32Array(a);d.HEAPF32=new Float32Array(a);d.HEAPF64=new Float64Array(a);}var E=[],F=[],G=[];function ba(){var a=d.preRun.shift();E.unshift(a);}var H=0,I=null,J=null;function w(a){d.onAbort?.(a);a="Aborted("+a+")";u(a);y=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");n(a);throw a;}var K=a=>a.startsWith("data:application/octet-stream;base64,"),L;L="data:application/octet-stream;base64,AGFzbQEAAAABzgZtYAJ/fwBgA39/fwF/YAR/fn9/AX5gAn9/AX9gBX9+f39/AX5gAX8Bf2ADf39/AGAEf39/fwF/YAJ/fgF+YAF/AGABfAF8YAV/f39/fwF/YAJ/fgBgAn9+AX9gAn9/AX5gA39/fgF/YAN/fn8BfmAGf35/f39/AX5gA39+fwBgA39+fwF/YAZ/f39/f38Bf2AEf39/fwBgBn9+fn9/fwF+YAR/f35/AX9gA39+fgF+YAN/f38BfmADf35+AX9gBH9/f38BfmAFf35+fn4AYAJ8fAF8YAF/AX5gBH9/f34Bf2AFf35+f38BfmAFf39/f38AYAd/fn9+fn5/AX9gBX9/f35+AX9gB39/f39/f38Bf2AAAGAFf35/fn8Bf2AEf35+fwBgBH9+fn8BfmAFf35+fn8Bf2AFf39/f38BfmAEf39+fgF/YAF+AX9gBH9+f34BfmAEf35/fwBgBH9+fn8Bf2AJf39/f39/f39/AX9gCH9/f39/f39/AX9gA39+fgBgBH9+f38Bf2AGf35/fn5/AX9gBX9+fn9/AGABfgF+YAd/fn9/f39/AX5gAX8BfGADf39+AGAEf35/fgF/YAV/f35/fwF/YAR/fn5+AX9gBn9/f39/fwF+YAN+f38Bf2AHf39/f39/fwBgAnx/AXxgA39/fgF+YAJ+fwF/YAN8fH8BfGAEf39+fwBgBH9+fn4BfmAAAX9gBn98f39/fwF/YAABfGAFf35/fn8BfmAGf39+fn5+AX9gAn5/AGACf3wAYAV/f39/fgF+YAR/f35/AX5gBH9+f34AYAd/fn5+f39/AX5gBH5+fn4Bf2AKf39/f39/f39/fwF/YAd/f39/f39+AX5gBX9+f39/AGAHfH9/f39/fwBgBX98f39/AX5gAXwBf2AFf39+f38AYAZ/fn5+fn8Bf2AGf35/f39/AX9gBH98f38Bf2AGf39/f39/AGAEf39/fgF+YAV/fn9/fwF/YAV/fn5+fgF/YAJ/fwF8YAV/fn5/fwF/YAV/f35+fgF+YAV/f35+fwF/YAJ8fwF/YAJ8fAF/YAh/fn5+fn9+fgF+YAN/fnwBfmAAAX5gB39/f35+fn8Bf2ACfn4BfGADfn5+AX9gA39/fAACSQwBYQFhABUBYQFiACUBYQFjAAcBYQFkAAYBYQFlAEgBYQFmAAABYQFn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IAILLQEBfwJAIAAoAgAiAUUNACAAKAIQIgBFDQAgASgCACAAQQAgASgCBBEBABoLCzEAIAFBAE4EQCAAQbYBEA0gACABEDggACgCQCIAKAKkAiABQRRsaiAAKAKEAjYCBAsLJwEBfyMAQRBrIgIkACACIAE2AgwgACACQQxqQQQQchogAkEQaiQACxcAIAAgASACQoCAgIAwIAMgBEECENIBCxgBAX4gASkDACEDIAEgAjcDACAAIAMQDAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALwQUCAn4GfyMAQeAAayIJJAAgA0EAIANBAEobIQsDQCAKIAtHBEAgACACIApBBHRqIgMoAgAQsAUhBiADLQAEIQdCgICAgDAhBAJAAkACQAJAAkACQAJAAkACQAJAIAMtAAUOCgECAgUHAwQIBQAGCyAAIAMoAggQsAUhCAJ+AkACQAJAIAMoAgxBAWoOAwIAAQkLIAAgACkDwAEiBCAIIARBABARDAILIAAgACgCKCkDECIEIAggBEEAEBEMAQsgACABIAggAUEAEBELIQQgACAIEBAgBkHLAUYEQEEBIQcMCAsgBkHUAUcNB0EAIQcMBwsCQCAGQcsBRgRAQQEhBwwBCyAGQdQBRw0AQQAhBwsgACABIAZBAiADIAcQgAMaDAcLIAAgASAGQoCAgIAwIAMoAggEfiAJIAMoAgA2AhAgCUEgaiIIQcAAQeEqIAlBEGoQSBogACADKAIIIAhBAEEKQQggAy0ABUECRhsgAy4BBhCCAQVCgICAgDALIgQgAygCDAR+IAkgAygCADYCACAJQSBqIghBwABB2iogCRBIGiAAIAMoAgwgCEEBQQtBCSADLQAFQQJGGyADLgEGEIIBBUKAgICAMAsiBSAHQYA6chBqGiAAIAQQDCAAIAUQDAwGCyADKQMIIgRCgICAgAh8Qv////8PWARAIARC/////w+DIQQMBQtCgICAgMB+IAS5vSIEQoCAgIDAgYD8/wB9IARC////////////AINCgICAgICAgPj/AFYbIQQMBAtCgICAgMB+IAMpAwgiBEKAgICAwIGA/P8AfSAEQv///////////wCDQoCAgICAgID4/wBWGyEEDAMLIAAgASAGQQIgAyAHEIADGgwDCxABAAsgAzUCCCEECyAAIAEgBiAEIAcQFRoLIAAgBhAQIApBAWohCgwBCwsgCUHgAGokAAuMAgICfgF/AkACQAJAAkACQAJAAkACQAJAQQcgAUIgiKciBCAEQQdrQW5JG0EKag4SAgAGBAAAAAAAAQMFAAAAAAEDAAsgAEGbHkEAEBJCgICAgOAADwsgBEF1SQ0GIAGnIgAgACgCAEEBajYCAAwGCyAAQSEQhgEhAgwECyAAQQQQhgEhAgwDCyAAIABBBRCGASICQTAgAacpAgRC/////weDQQAQFRoMAgsgAEEGEIYBIQIMAQsgAEEHEIYBIQILQoCAgIDgACEDIAJCgICAgHCDQoCAgIDgAFIEfiAEQXVPBEAgAaciBCAEKAIAQQFqNgIACyAAIAIgARC9ASACBUKAgICA4AALDwsgAQsyAQF/AkAgAUIgiKdBdUkNACABpyICIAIoAgAiAkEBazYCACACQQFKDQAgACABEJcFCwsLACAAQeweQQAQEgujBAELfyAAKAIAIQUjAEEQayIIIAI2AgxBfyEJAkADQAJAIAggAiIDQQRqIgI2AgwgAygCACIHQX9GDQAgACgCBCEKA0AgASIEIApODQMgBCAEIAVqIgwtAAAiBkECdEHgrgFqIg0tAABqIgEgCkoNAyAGQcYBRgRAIAwoAAEhCQwBCwsgBiAHRwRAIAdBGHYgBkYgBiAHQRB2Qf8BcUZyIAYgB0H/AXFGckUgBiAHQQh2Qf8BcUdxIAZFIAdBgAJJcnINAyAAIAY2AhALIARBAWohBAJAAkACQAJAAkACQAJAAkAgDS0AA0EFaw4YAAkACQkBCQkBCQkBAQECAgICBAUGBwkDCQsgBCAFai0AACEEIAggA0EIaiICNgIMIAMoAgQiA0F/RgRAIAAgBDYCFAwJCyADIARGDQgMCQsgBCAFai8AACEEIAggA0EIaiICNgIMIAMoAgQiA0F/RgRAIAAgBDYCFAwICyADIARGDQcMCAsgACAEIAVqKAAANgIYDAYLIAAgBCAFaiIDKAAANgIYIAAgAy8ABDYCHAwFCyAAIAQgBWooAAA2AiAMBAsgACAEIAVqIgMoAAA2AiAgACADLQAENgIcDAMLIAAgBCAFaiIDKAAANgIgIAAgAy8ABDYCHAwCCyAAIAQgBWoiAygAADYCICAAIAMoAAQ2AhggACADLQAINgIcDAELCyAAIAk2AgwgACABNgIIQQEhCwsgCwskAQF/IAAoAhAiAkEQaiABIAIoAgARAwAiAUUEQCAAEHALIAELCwAgACABQQAQjQQLJwEBfyMAQRBrIgIkACACIAE7AQ4gACACQQ5qQQIQchogAkEQaiQAC9QBAgR/An5BfyECAkACQAJAAkACQAJAAkAgAUIgiKciA0EKag4RAwUFAgUFBQUFBAABAQEFBQYFCyABp0EARw8LIAGnDwsgAacpAgQhByAAIAEQDCAHQv////8Hg0IAUg8LIAGnKAIMIQQgACABEAwgBEH/////B2pBfkkPCyABpywABSEFIAAgARAMIAVBAE4PCyADQQdrQW1NBEAgAUKAgICAwIGA/P8AfEL///////////8Ag0IBfUKAgICAgICA+P8AVA8LIAAgARAMQQEhAgsgAgs/AQJ/IwBBEGsiAiQAAn8gASAAKAIQRwRAIAIgATYCACAAQcyQASACEBNBfwwBCyAAEA8LIQMgAkEQaiQAIAMLCwAgACABQQEQ6QULGQAgAEEAEFAaIABCgICAgPD/////ADcCBAvDCgIFfxF+IwBB4ABrIgUkACAEQv///////z+DIQwgAiAEhUKAgICAgICAgIB/gyEKIAJC////////P4MiDUIgiCEOIARCMIinQf//AXEhBwJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAdB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiC0KAgICAgIDA//8AVCALQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQoMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhCiADIQEMAgsgASALQoCAgICAgMD//wCFhFAEQCACIAOEUARAQoCAgICAgOD//wAhCkIAIQEMAwsgCkKAgICAgIDA//8AhCEKQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAIAEgC4QhGUIAIQEgGVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAG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////B4OENwIEIABBADYCBCABrUKAgICAkH+ECwsPACAAKAJAQYACaiABEBsLEwAgACABIAIgAyABQYCAARDQAQsNACAAIAEgAkEGEMgCCx8BAX8gACgCJCIBIAEoAgBBAWo2AgAgACABQQIQ5wULZwECfwJ/IAAoAggiAiAAKAIMTgRAQX8gACACQQFqIAEQxAINARoLIAAgACgCCCIDQQFqNgIIIAAoAgRBEGohAgJAIAAoAhAEQCACIANBAXRqIAE7AQAMAQsgAiADaiABOgAAC0EACwt6AQN/AkACQCAAIgFBA3FFDQAgAS0AAEUEQEEADwsDQCABQQFqIgFBA3FFDQEgAS0AAA0ACwwBCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALA0AgAiIBQQFqIQIgAS0AAA0ACwsgASAAawsNACAAIAEgAkEAEJkDCywBAX8jAEEQayIDJAAgAyACNgIMIABB3ABqQYABIAEgAhDJAhogA0EQaiQAC+gDAQl/IwBBIGsiBSQAIAEgAiABKAIMIAIoAgxJIgYbIgcoAgQgAiABIAYbIggoAgRzIQoCQAJAIAcoAgwiAkUEQAJAIAgoAggiAUH/////B0cEQCAHKAIIIgJB/////wdHDQELIAAQKkEAIQIMAwsgAUH+////B0cgAkH+////B0dxRQRAAkAgAUH+////B0YEQCACQYCAgIB4Rg0BDAQLIAFBgICAgHhHIAJB/v///wdHcg0DCyAAECpBASECDAMLIAAgChCAAUEAIQIMAgsgCCgCDCILIQkgAiEGIARBB3FBBkYEQCACIANBIWpBBXYiASABIAJKGyEGIAsgASABIAtKGyEJCwJ/AkAgACAIRg0AIAAgB0YNACAADAELIAAoAgAhASAFQgA3AhggBUKAgICAgICAgIB/NwIQIAUgATYCDCAAIQwgBUEMagshASAHKAIQIQAgCCgCECENAn8gASAGIAlqEFAEQCABECpBIAwBCyABKAIQIA0gC0ECdGogCUECdGsgCSAAIAJBAnRqIAZBAnRrIAYQ8AEgASAKNgIEIAEgBygCCCAIKAIIajYCCCABIAMgBBCbAgshAiABIAVBDGoiAEcNASAMIAAQvwQMAQsgACAKEH9BACECCyAFQSBqJAAgAgsKACAAIAFBARBHCygBAX8gAkIgiKdBdU8EQCACpyIDIAMoAgBBAWo2AgALIAAgASACEG0LlQUCA38BfgJAAkACQAJAAkACQANAIAIoAhAiBEEwaiEFIAQgBCgCGCADcUF/c0ECdGooAgAhBANAIARFDQQgAyAFIARBAWtBA3QiBmoiBCgCBEcEQCAEKAIAQf///x9xIQQMAQsLIAIoAhQgBmohBSAEKAIAIQYgAUUNASABQoCAgIAwNwMYIAFCgICAgDA3AxAgAUKAgICAMDcDCCABIAZBGnZBB3EiBjYCAAJAAkACQAJAIAQoAgBBHnZBAWsOAwABAgMLIAEgBkEQcjYCACAFKAIAIgAEQCAAIAAoAgBBAWo2AgAgASAArUKAgICAcIQ3AxALIAUoAgQiAEUNCSAAIAAoAgBBAWo2AgAgASAArUKAgICAcIQ3AxhBAQ8LIAUoAgAoAhApAwAiB0KAgICAcINCgICAgMAAUQ0EIAdCIIinQXVPBEAgB6ciACAAKAIAQQFqNgIACyABIAc3AwgMCAsgACACIAMgBSAEEMECRQ0BDAYLCyAFKQMAIgdCIIinQXVPBEAgB6ciACAAKAIAQQFqNgIACyABIAc3AwgMBQtBASEEIAZBgICAgHxxQYCAgIB4Rw0CIAUoAgAoAhA1AgRCIIZCgICAgMAAUg0CCyAAIAMQ0QEMAgtBACEEIAItAAUiBUEEcUUNACAFQQhxBEAgA0EATg0BIANB/////wdxIgMgAigCKCIFSSEEIAFFIAMgBU9yDQEgAUKAgICAMDcDGCABQoCAgIAwNwMQIAFBBzYCACABIAAgAq1CgICAgHCEIAMQpgE3AwgMAwsgACgCECgCRCACLwEGQRhsaigCFCIFRQ0AIAUoAgAiBUUNACAAIAEgAq1CgICAgHCEIAMgBREXACEECyAEDwtBfw8LQQELDQAgACABIAJBARDIAgsmAQF/AkAgACgCEEGDf0cNACAAKAIgIAFHDQAgACgCJEUhAgsgAgsdACAAIAEpAxAQDCAAIAEpAxgQDCAAIAEpAwgQDAumAQEDfyAAKAIQIgMoAuABIAGnQQAgAUL/////b1YbIgRBgYDc8XlsQf//o44GayIFQSAgAygC1AFrdkECdGohAwJAAkADQCADKAIAIgMEQAJAIAMoAhQgBUcNACADKAIsIARHDQAgAygCIEUNAwsgA0EoaiEDDAELCyAAIARBAhDyBCIDDQFCgICAgOAADwsgAyADKAIAQQFqNgIACyAAIAMgAhDnBQsqAQJ/IwBBEGsiBCQAIAQgAzYCDCAAIAEgAiADEMkCIQUgBEEQaiQAIAULSAAgACABRwRAIAAgASgCDBBQBEAgABAqQSAPCyAAIAEoAgQ2AgQgACABKAIINgIIIAAoAhAgASgCECABKAIMQQJ0EB4aC0EACywAIAFCgICAgGCDQoCAgIAgUQRAIABB6z9BABASQoCAgIDgAA8LIAAgARAlC6sCAQR/AkAgAiADTw0AIAMgAmshBSABQRBqIQQgAS0AB0GAAXEEQEEAIQMgBUEAIAVBAEobIQYgBCACQQF0aiEBQQAhAgNAIAIgBkZFBEAgAyABIAJBAXRqLwEAciEDIAJBAWohAgwBCwsCQCAAKAIIIAVqIgIgACgCDCIHSgRAQX8hBCAAIAIgAxDEAkUNAQwDCyAAKAIQIANBgAJIcg0AQX8hBCAAIAcQ4AMNAgsCQCAAKAIQRQRAQQAhAgNAIAIgBkYNAiAAKAIEIAAoAgggAmpqIAEgAkEBdGotAAA6ABAgAkEBaiECDAALAAsgACgCBCAAKAIIQQF0akEQaiABIAVBAXQQHhoLIAAgACgCCCAFajYCCEEADwsgACACIARqIAUQiwIhBAsgBAuJAQECfyABKAJ8IgRB//8DTgRAIABBlyhBABA6QX8PC0F/IQMgACABQfQAakEQIAFB+ABqIARBAWoQZAR/QX8FIAEgASgCfCIDQQFqNgJ8IAEoAnQgA0EEdGoiA0IANwIAIANCADcCCCADIAAgAhAWNgIAIAMgAygCDEGAfnI2AgwgASgCfEEBawsLRwEBfyABQiCIp0F1TwRAIAGnIgMgAygCAEEBajYCAAsgAkIgiKdBdU8EQCACpyIDIAMoAgBBAWo2AgALIAAgASACQQEQtAEL+wQBAn8CQAJAIAFCgICAgHBUIAJC/////w9Wcg0AIAKnIQMCQAJAAkACQAJAAkACQAJAAkACQAJAIAGnIgQvAQZBAmsOHgALCwsLCwALCwsLCwsLCwsLCwsCAQIDBAUGBwgJCgsLIAQoAiggA00NCiAEKAIkIANBA3RqKQMAIgFCIIinQXVJDQsgAaciACAAKAIAQQFqNgIAIAEPCyAEKAIoIANNDQkgBCgCJCADajAAAEL/////D4MPCyAEKAIoIANNDQggBCgCJCADajEAAA8LIAQoAiggA00NByAEKAIkIANBAXRqMgEAQv////8Pgw8LIAQoAiggA00NBiAEKAIkIANBAXRqMwEADwsgBCgCKCADTQ0FIAQoAiQgA0ECdGo1AgAPCyAEKAIoIANNDQQgBCgCJCADQQJ0aigCACIAQQBOBEAgAK0PC0KAgICAwH4gALi9IgFCgICAgMCBgPz/AH0gAUKAgICAgICA+P8AVhsPCyAEKAIoIANNDQMgACAEKAIkIANBA3RqKQMAEL8CDwsgBCgCKCADTQ0CIAAgBCgCJCADQQN0aikDABCIBA8LIAQoAiggA00NAUKAgICAwH4gBCgCJCADQQJ0aioCALu9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsPCyAEKAIoIANNDQBCgICAgMB+IAQoAiQgA0EDdGopAwAiAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGw8LIAAgAhAwIQMgACACEAwgA0UEQEKAgICA4AAPCyAAIAEgAyABQQAQESEBIAAgAxAQCyABC4IDAgR/An4CQCAAKQNwIgVQRSAFIAApA3ggACgCBCIBIAAoAiwiAmusfCIGV3FFBEAjAEEQayICJABBfyEBAkACfyAAIAAoAkgiA0EBayADcjYCSCAAKAIUIAAoAhxHBEAgAEEAQQAgACgCJBEBABoLIABBADYCHCAAQgA3AxAgACgCACIDQQRxBEAgACADQSByNgIAQX8MAQsgACAAKAIsIAAoAjBqIgQ2AgggACAENgIEIANBG3RBH3ULDQAgACACQQ9qQQEgACgCIBEBAEEBRw0AIAItAA8hAQsgAkEQaiQAIAEiA0EATg0BIAAoAgQhASAAKAIsIQILIABCfzcDcCAAIAE2AmggACAGIAIgAWusfDcDeEF/DwsgBkIBfCEGIAAoAgQhASAAKAIIIQICQCAAKQNwIgVQDQAgBSAGfSIFIAIgAWusWQ0AIAEgBadqIQILIAAgAjYCaCAAIAYgACgCLCIAIAFrrHw3A3ggACABTwRAIAFBAWsgAzoAAAsgAwtPAQF/An9BACAAKAIMIAFGDQAaIAAoAgAiAigCACAAKAIQIAFBAnQgAigCBBEBACECIAEEQEF/IAJFDQEaCyAAIAE2AgwgACACNgIQQQALC9EBAQZ/IABBAWohBQJAAkAgAC0AACIDwCIHQQBOBEAgBSEBDAELQX8hBCAHQUBrQf8BcSIDQT1LDQEgA0ECdEGU9gFqKAIAIgYgAU4NASAGQQFrIQggACAGakEBaiEBIAcgBkHz9QFqLQAAcSEDQQAhAANAIAAgBkcEQCAFLAAAIgRBv39KBEBBfw8FIARBP3EgA0EGdHIhAyAAQQFqIQAgBUEBaiEFDAILAAsLQX8hBCADIAhBAnRBgPYBaigCAEkNAQsgAiABNgIAIAMhBAsgBAsLACAAIAFBABDpBQsJACAAQQEQrQELugEBAn8CQAJAIAJC/////wdYBEAgACABIAKnQYCAgIB4chBuIgRBAEwNASAAIAEgAhBOIgJCgICAgHCDQoCAgIDgAFINAkF/IQQMAgsgACACEIsDIgVFBEBBfyEEDAELAkAgACABIAUQbiIEQQBMBEBCgICAgDAhAgwBCyAAIAEgBSABQQAQESICQoCAgIBwg0KAgICA4ABSDQBBfyEECyAAIAUQEAwBC0KAgICAMCECCyADIAI3AwAgBAsbAQF/IAAgARA1BH9BAAUgAEH7OUEAEBJBfwsLYwEBfyACQiCIp0F1TwRAIAKnIgUgBSgCAEEBajYCAAsCQCAAIAEgAhDTBSIFDQACQCABKAIAIgBBAEgEQCAAIARqIgBBACAAQQBKGyEDDAELIAAgA0wNAQsgASADNgIACyAFCxgAIAAtAABBIHFFBEAgASACIAAQlwQaCwsPACAAKAJAQYACaiABEA4LrgIAAkACQAJAAkAgAkEDTARAAkACQAJAAkACQAJAAkACQAJAIAFB2ABrDgkAAQIDBAUGBwgKCyAAIAJBO2tB/wFxEA4PCyAAIAJBN2tB/wFxEA4PCyAAIAJBM2tB/wFxEA4PCyAAIAJBL2tB/wFxEA4PCyAAIAJBK2tB/wFxEA4PCyAAIAJBJ2tB/wFxEA4PCyAAIAJBI2tB/wFxEA4PCyAAIAJBH2tB/wFxEA4PCyAAIAJBG2tB/wFxEA4PCyACQf8BSw0BAkACQAJAIAFB2ABrDgMAAQIECyAAQcIBEA4MBQsgAEHDARAODAQLIABBxAEQDgwDCyABQSJGDQELIAAgAUH/AXEQDiAAIAJB//8DcRAmDwsgACACQRJrQf8BcRAODwsgACACQf8BcRAOCzgBAX8CQAJAIAFCgICAgHBUDQAgAaciAy8BBiACRw0AIAMoAiAiAw0BCyAAIAIQigNBACEDCyADC0EBAX8gAQRAA0AgAiADRkUEQCAAIAEgA0EDdGooAgQQECADQQFqIQMMAQsLIAAoAhAiAEEQaiABIAAoAgQRAAALCywBAX8gACgCECICQRBqIAEgAigCABEDACICBEAgAkEAIAEQLA8LIAAQcCACC20BAX8jAEGAAmsiBSQAIARBgMAEcSACIANMckUEQCAFIAFB/wFxIAIgA2siA0GAAiADQYACSSIBGxAsGiABRQRAA0AgACAFQYACEFcgA0GAAmsiA0H/AUsNAAsLIAAgBSADEFcLIAVBgAJqJAALvgECAn4BfwJAAkAgAUKAgICAcINCgICAgDBRBEAgACgCKCACQQN0aikDACIDQiCIp0F0Sw0BDAILIAAgAUE8IAFBABARIgNCgICAgHCDQoCAgIDgAFEEQCADDwsgA0L/////b1YNASAAIAMQDCAAIAEQ/AIiBUUEQEKAgICA4AAPCyAFKAIoIAJBA3RqKQMAIgNCIIinQXVJDQELIAOnIgUgBSgCAEEBajYCAAsgACADIAIQRyEEIAAgAxAMIAQLDAAgAEHZ6gBBABASCw0AIAAgASABED0Q6gELdQEBfiAAIAEgBH4gAiADfnwgA0IgiCICIAFCIIgiBH58IANC/////w+DIgMgAUL/////D4MiAX4iBUIgiCADIAR+fCIDQiCIfCABIAJ+IANC/////w+DfCIBQiCIfDcDCCAAIAVC/////w+DIAFCIIaENwMAC1ABAX4CQCADQcAAcQRAIAEgA0FAaq2GIQJCACEBDAELIANFDQAgAiADrSIEhiABQcAAIANrrYiEIQIgASAEhiEBCyAAIAE3AwAgACACNwMIC2QAAkACQCABQQBIDQAgACgCrAIgAUwNACAAKAKkAiABQRRsaiIAIAAoAgAgAmoiADYCACAAQQBIDQEgAA8LQdwXQajsAEHzpwFBr8MAEAAAC0HphQFBqOwAQfanAUGvwwAQAAALcAECfyAEIAMoAgBKBH8jAEEQayIFJAAgACABKAIAIAQgAygCAEEDbEECbSIAIAAgBEgbIgAgAmwgBUEMahCnASIEBH8gAyAFKAIMIAJu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EGsiBCQAAkAgAkIgiKciA0ECTQRAIAEgAqe3OQMAQQAhAwwBCyADQQdrQW1NBEAgASACQoCAgIDAgYD8/wB8NwMAQQAhAwwBCwJ/IAAgAhCWASICQoCAgIBwg0KAgICA4ABRBEBEAAAAAAAA+H8hBUF/DAELAnwCQAJAQQcgAkIgiKciAyADQQdrQW5JGyIDQXZHBEAgA0EHRg0CIAMNASACp7cMAwsgAqdBBGogBEEIahCxBCAAIAIQDCAEKwMIIQVBAAwDCxABAAsgAkKAgICAwIGA/P8AfL8LIQVBAAshAyABIAU5AwALIARBEGokACADC90BAQN/AkAgAUKAgICAcFoEQCABpyEDA0ACQCADLQAFQQRxRQ0AIAAoAhAoAkQgAy8BBkEYbGooAhQiBEUNACAEKAIQIgRFDQAgAyADKAIAQQFqNgIAIAAgA61CgICAgHCEIgEgAiAEERMAIQUgACABEAwgBQ8LIAMgAygCAEEBajYCACAAQQAgAyACEEMhBCAAIAOtQoCAgIBwhBAMIAQNAgJAIAMvAQZBFWtB//8DcUEKSw0AIAAgAhCTAyIERQ0AIARBH3UPCyADKAIQKAIsIgMNAAsLQQAhBAsgBAvNCQIEfwV+IwBB8ABrIgYkACAEQv///////////wCDIQkCQAJAIAFQIgUgAkL///////////8AgyIKQoCAgICAgMD//wB9QoCAgICAgMCAgH9UIApQG0UEQCADQgBSIAlCgICAgICAwP//AH0iC0KAgICAgIDAgIB/ViALQoCAgICAgMCAgH9RGw0BCyAFIApCgICAgICAwP//AFQgCkKAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEEIAEhAwwCCyADUCAJQoCAgICAgMD//wBUIAlCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhBAwCCyABIApCgICAgICAwP//AIWEUARAQoCAgICAgOD//wAgAiABIAOFIAIgBIVCgICAgICAgICAf4WEUCIFGyEEQgAgASAFGyEDDAILIAMgCUKAgICAgIDA//8AhYRQDQEgASAKhFAEQCADIAmEQgBSDQIgASADgyEDIAIgBIMhBAwCCyADIAmEUEUNACABIQMgAiEEDAELIAMgASABIANUIAkgClYgCSAKURsiCBshCiAEIAIgCBsiDEL/////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/wBWGwsQTgtTAQF/IAAoAhAiBEEQaiABIAIgBCgCCBEBACIBIAJFckUEQCAAEHAgAQ8LIAMEQCADIAEgACgCECgCDBEFACIAIAJrIgJBACAAIAJPGzYCAAsgAQsNACAAQQAgAUEAEJoDC/kBAgN+An8jAEEQayIFJAACfiABvSIEQv///////////wCDIgJCgICAgICAgAh9Qv/////////v/wBYBEAgAkI8hiEDIAJCBIhCgICAgICAgIA8fAwBCyACQoCAgICAgID4/wBaBEAgBEI8hiEDIARCBIhCgICAgICAwP//AIQMAQsgAlAEQEIADAELIAUgAkIAIAKnZ0EgaiACQiCIp2cgAkKAgICAEFQbIgZBMWoQYiAFKQMAIQMgBSkDCEKAgICAgIDAAIVBjPgAIAZrrUIwhoQLIQIgACADNwMAIAAgAiAEQoCAgICAgICAgH+DhDcDCCAFQRBqJAALKgEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBpANBABCUBBogA0EQaiQAC0cAIAAgAUkEQCAAIAEgAhAeGg8LIAIEQCAAIAJqIQAgASACaiEBA0AgAEEBayIAIAFBAWsiAS0AADoAACACQQFrIgINAAsLCyABAX4gACAAIAIgASADQQRBABCCASIFIAEgBBC/ASAFC4sMAQZ/IwBBIGsiAyQAAkACQAJAAkACQAJ/IAAoAhAiAkGDf0cEQEEAIAJBV0cNARogACgCQCIELQBsQQFxRQRAIABBl+AAQQAQEwwDCyAEKAJkRQRAIABB6jtBABATDAMLQX8hBSAAEA8NBQJAAkACQAJAIAAoAhAiBEEpaw4EAgEBAgALIARB3QBGIARBOmtBAklyIARB/QBGcg0BCyAAKAIwDQBBACECIARBKkYEQCAAEA8NCEEBIQILIAAgARCtAUUNAQwHCyAAQQYQDUEAIQILIAAoAkAtAGwhASACBEAgABAtIQUgABAtIQIgAEGAAUH/ACABQQNGGxANIABBDhANIABBBhANIABBBhANIAAgBRAaIABBhgEQDSABQQNHIgdFBEAgAEGMARANCyAAQYMBEA0gAEHCABANIABB6gAQFyAAQesAQX8QGCEGIAAgAhAaQYoBIQQgACAHBH9BigEFIABBwQAQDSAAQcEAEBdBiwELEA0gAEEREA0gAEHrAEF/EBghBCAA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AqcQvAJFIQQMBgsgAacgAqdGIAVBeEZxIQQMBQsgBUF/Rw0EIAGnIAKnRiEEDAQLIAGntyEIIAVBB0cEQCAFDQQgAqe3DAILIAJCgICAgMCBgPz/AHy/DAELIAFCgICAgMCBgPz/AHy/IQggBQRAIAVBB0cNAyACQoCAgIDAgYD8/wB8vwwBCyACp7cLIQkCQCADBEACQAJAIAi9IgFC////////////AIMiAkKBgICAgICA+P8AWgRAIAm9Qv///////////wCDQoGAgICAgID4/wBUIQQMAQsgCb0iCkL///////////8Ag0KBgICAgICA+P8AVA0BCyAEIAJCgICAgICAgPj/AFZzIQQMBQsgA0ECRw0BCyAIIAlhIQQMAwsgASAKUSEEDAILIAVBdkcNACAAIAdBHGoiBiABEK0CIgMgACAHQQhqIAIQrQIiBRC9AiEEIAMgBkYEQCAGEBkLIAUgB0EIaiIDRw0AIAMQGQsgACABEAwgACACEAwLIAdBMGokACAECy8BAX8jAEHQAGsiAyQAIAMgACADQRBqIAEQgQE2AgAgACACIAMQEiADQdAAaiQACw0AIAAgASABED0QnQMLHQEBfyAAIAFB/wFxEA4gACgCBCEDIAAgAhAbIAMLEgAgACABIAIgAyAEQZQDELEDC1IBAX8gACgCDCIDRQRAQQAPCyAAIAAoAghB/////wNBgYCAgHwgASABQYGAgIB8TBsiASABQf////8DThtqNgIIIABB/////wMgAiADQQAQ3AILHwEBfyAAKAIMIgNFBEBBAA8LIAAgASACIANBABDcAgsgACABQgA3AgwgAUKAgICAgICAgIB/NwIEIAEgADYCAAtmAQF/An9BACAAKAIIIgIgAU8NABpBfyAAKAIMDQAaIAAoAhQgACgCACACQQNsQQF2IgIgASABIAJJGyIBIAAoAhARAQAiAkUEQCAAQQE2AgxBfw8LIAAgATYCCCAAIAI2AgBBAAsLZwECfwJAIAFCgICAgHBUDQAgAaciAy8BBkEEayIEQR1LQQEgBHRBz4CAgAJxRXINACAAIAMpAyAQDCADIAI3AyAPCyAAIAIQDCABQoCAgIBwg0KAgICA4ABSBEAgAEHu0gBBABASCwshAQF/IAAgASAAIAIQtgEiAiADIAQQFSEFIAAgAhAQIAULRwIBfgF/IAApA8ABIQQgAUIgiKdBdU8EQCABpyIFIAUoAgBBAWo2AgALIAAgBCACIAFBAxC+ARogACABIAMQrAQgACABEAwLhAEBAX8CQCACRSABQoCAgIBwg0KAgICAkH9SckUEQCABpyIDIAMoAgBBAWo2AgBBBCECIAAoAgAgAxCRBCIDQQBKDQELIAFCIIinQXVPBEAgAaciAiACKAIAQQFqNgIAC0ECIQIgACABEMcDIgNBAE4NAEF/DwsgACACEA0gACADEDhBAAv8AgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBxwBrDgQBDQ0CAAsgAUE8RwRAIAFBvwFHBEAgAUG4AUYNByABQcEARw0OC0EVIQQCQCAFQQJrDgMFBAAGC0EbIQQMBAsgACgCACADEBAgACAEEBoLQbMBIQQCQAJAAkAgBUEBaw4EBgABAgULQRYhBAwEC0EZIQQMAwtBHSEEDAILQRchAQJAIAVBAmsOAwkIAAoLQR8hAQwIC0EYIQQLIAAgBBANCwJAIAFBxwBrDgQDCAgHAAsgAUE8Rg0DIAFBwQBGDQggAUG/AUYNASABQbgBRw0HCyAFQQJPDQggAEG9AUG5ASAGGxANDAkLIABBwQEQDQwICyAAQckAEA0PCyAAQT0QDQ8LQRohAQsgACABEA0LIABBywAQDQ8LEAEACyAAQcMAEA0gACADEDgPC0He9gBBqOwAQZy5AUGXzwAQAAALIAAgAxA4IAAgAkH//wNxEBQLixMBCn8jAEFAaiIGJAAgBEEASARAIAAgBkEoakEAEJwBGiAGKAIoQQJxIQQLIAAQLSEKIAAQLSELIAAoAkAoAoQCIQ0CQCADBEAgAEEREA0gAEEGEA0gAEGsARANIABB6wAgChAYGiAAIAsQGgwBCyAAQewAIAoQGBogACALEBogAEEREA0LIAAoAkAoAoQCIQ4CQAJAAkACQAJAIAAoAhAiB0HbAEcEQCAHQfsARgRAQX8hByAAEA8NBiAAQfEAEA0gBARAIABBCxANIABBGxANCyABQUlGIAFBUUZyIQwgAUGxf0chDwNAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIQIgdBpX9HBEAgB0H9AEYNCyAAIAZBOGpBAEEBQQAQxgMiB0EASA0SIAZBuAE2AjAgBkEANgI0IAAoAkAiCSgCvAEhCCAGQX82AjwgBiAINgIsIAZBADYCCCAHDQIgABAPRQ0BIAYoAjghBwwGCyAERQRAIAAoAgBBuD9BABA6DBILQX8hByAAEA8NEgJAIAEEQCAGIAAgAhDFAyIINgI0IAhFDRQgBkG4ATYCMCAAKAJAKAK8ASEHIAZBfzYCPCAGIAc2AiwgBkEANgIIDAELIAAQogINEyAAIAZBMGogBkEsaiAGQTRqIAZBPGogBkEIakEAQfsAEK4BDRMLIAAoAhBB/QBGDQIgAEHjFUEAEBMMEAsCQCAAKAIQQSByQfsARw0AIAAgBkEoakEAEJwBIgdBLEYgB0H9AEZyRSAHQT1HcQ0AAkAgBigCOCIHRQRAIAQEQCAAQfIAEA0gAEEYEA0gAEEHEA0gAEHRABANIABBGBANCyAAQcgAEA0MAQsgBARAIABBGxANIABBBxANIABBzAAQDSAAIAcQFyAAQRsQDQsgAEHCABANIAAgBxA4C0F/IQcgACABIAJBAUF/QQEQwgFBAEgNEiAAKAIQQf0ARg0KIABBLBAoRQ0LDBILAkACfyAGKAI4IgdFBEAgAEHzABANIARFBEBBEiEIDAMLQRghCSAAQRgQDSAAQQcQDSAAQdEAEA1BEgwBCyAERQRAQREhCAwCC0EbIQkgAEEbEA0gAEEHEA0gAEHMABANIAAgBxAXQRELIQggACAJEA0LIAAgCBANIAEEQCAGIAAgAhDFAyIINgI0IAhFDQUgB0UNBAwGCyAAEKICDQQMAgsCQCACBH8gACAGKAI4IgcQ5gQNBSAAKAJABSAJCy0AbkEBcUUNACAGKAI4IgdBzgBHIAdBO0dxDQAgAEGLHUEAEBMMBAsgBARAIABBGxANIABBBxANIABBzAAQDSAAIAYoAjgQFyAAQRsQDQsgAUEAIA8bRQRAIABBERANIABBuAEQDSAAIAYoAjgiBxAXIAAgACgCQC8BvAEQFAwCCyAGIAAoAgAgBigCOBAWIgc2AjQgAEHCABANIAAgBxA4DAYLIABBCxANIABB0wAQDSAAIAYoAggiB0ECdEEEaiAHQQV0QUBrckH8AXEQWAwECyAAIAZBMGogBkEsaiAGQTRqIAZBPGogBkEIakEAQfsAEK4BDQEgBigCCCEIAkACQCAHRQRAQR4hBwJAIAhBAWsOAwMCAAQLQSAhByAAQSAQDQwCCyAIQQFrIghBA08NBCAAIAhBAXRBG2pB/wFxEA0MBAtBHCEHCyAAIAcQDQsgAEHHABANDAILIAAoAgAgBxAQDAoLIABBwQAQDSAAIAcQOAsgAUUNASAGKAI0IQcLIAAgByABEKMCDQcgBiAAKAJAKAK8ATYCLAsCQCAAKAIQQT1HBEAgBigCMCEHDAELIABBERANIABBBhANIABBrAEQDSAAQeoAQX8QGCEIIAAQDw0HIABBDhANIAAQUw0HIAYoAjAiB0G4AUcgB0E8R3FFBEAgACAGKAI0EJ4BCyAAIAgQGgsgACAHIAYoAiwgBigCNCAGKAI8QQEgDBDBASAAKAIQQf0ARg0AQX8hByAAQSwQKEUNAQwICwsgAEEOEA0gBARAIABBDhANC0F/IQcgABAPRQ0CDAYLIABB4A9BABATDAQLIAAQDw0DIAYgACgCQCIEKAKwAjYCCCAEIAZBCGo2ArACIAZBfzYCHCAGQv////8vNwIUIAZCgICAgHA3AgwgBCgCvAEhBCAGQQE2AiQgBiAENgIgIABB/wAQDSABQUlGIAFBUUZyIQwDQAJAIAAoAhAiB0HdAEYNACAHIgRBpX9HIglFBEAgABAPDQZB7YcBIQggACgCECIEQSxGIARB3QBGcg0ECwJAAkAgBEH7AEYgBEHbAEZyRQRAIARBLEcNASAAQYIBEA0gAEEAEFggAEEOEA0gAEEOEA0MAgsgACAGQShqQQAQnAEiBEEsRiAEQd0ARnJFIARBPUdxDQACQCAJRQRAIARBPUYEQEHBzwAhCAwICyAAQQAQ5QQMAQsgAEGCARANIABBABBYIABBDhANCyAAIAEgAkEBIAYoAihBAnFBARDCAUEASA0HDAELIAZBADYCOCAGQQA2AjQCQCABBEAgBiAAIAIQxQMiBDYCNCAERQ0HIAAgBCABEKMCDQcgBkG4ATYCMCAGIAAoAkAoArwBNgIsDAELIAAQogINByAAIAZBMGogBkEsaiAGQTRqIAZBPGogBkE4akEAQdsAEK4BDQcLAkAgCUUEQCAAIAYoAjgQ5QQMAQsgAEGCARANIAAgBi0AOBBYIABBDhANIAAoAhBBPUcNACAAQREQDSAAQQYQDSAAQawBEA0gAEHqAEF/EBghBCAAEA8NBiAAQQ4QDSAAEFMNBiAGKAIwIghBuAFHIAhBPEdxRQRAIAAgBigCNBCeAQsgACAEEBoLIAAgBigCMCAGKAIsIAYoAjQgBigCPEEBIAwQwQELIAAoAhBB3QBGDQAgB0Glf0YEQEGQ0wAhCAwECyAAQSwQKEUNAQwFCwsgAEGFARANIAAoAkAiASABKAKwAigCADYCsAIgABAPDQMLAkAgBUUNACAAKAIQQT1HDQBBfyEHIABB7ABBfxAYIQEgABAPDQQgACAKEBogAwRAIABBDhANCyAAEFMNBCAAQewAIAsQGBogACABEBpBASEHDAQLIANFBEAgAEHDPUEAEBMMAwsgACgCQCgCgAIgDWpBswEgDiANaxAsGiAAKAJAKAKkAiAKQRRsaiIAIAAoAgBBAWs2AgBBACEHDAMLIAAgCEEAEBMMAQsgACgCACAGKAI0EBALQX8hBwsgBkFAayQAIAcLKwAgACgCQCgCpAFBAE4EQCAAQQYQDSAAQdkAEA0gACAAKAJALwGkARAUCwsTACAAIAEgAiADIARBAEEAEN0BC6YBAQF/IwBBEGsiAyQAIAMgAjcDCAJAIAAgAUGHASABQQAQESICQoCAgIBwg0KAgICA4ABRDQAgACACEDUEQCAAIAIgAUEBIANBCGoQNiICQv////9vViACQoCAgICwf4NCgICAgCBRcg0BIAAgAhAMIABBpcEAQQAQEkKAgICA4AAhAgwBCyAAIAIQDCAAIAEgACADQQhqEIoFIQILIANBEGokACACC6MBAgN/AX4gAEEQaiECIAEoAgAiBEEBaiEDAkAgACkCBCIFQoCAgIAIg1BFBEAgAiAEQQF0ai8BACIAQYD4A3FBgLADRyADIAWnQf////8HcU5yDQEgAiADQQF0ai8BACICQYD4A3FBgLgDRw0BIABBCnRBgPg/cSACQf8HcXJBgIAEaiEAIARBAmohAwwBCyACIARqLQAAIQALIAEgAzYCACAACxIAIAFB2AFOBEAgACABEIYFCwthACAAIAEgAkKAgICACHxC/////w9YBH4gAkL/////D4MFQoCAgIDAfiACub0iAkKAgICAwIGA/P8AfSACQv///////////wCDQoCAgICAgID4/wBWGwsgAyAEQQdyEJQBCzkAIABB/wBNBEAgAEEDdkH8////AXFBsP8BaigCACAAdkEBcQ8LIABBfnFBjMAARiAAEJYGQQBHcgs1ACAAIAJBMCACQQAQESICQoCAgIBwg0KAgICA4ABRBEAgAUEANgIAQX8PCyAAIAEgAhCVAQufAwIEfgF/AkACQCACBEAgACABQdcBIAFBABARIgNCgICAgHCDIgRCgICAgCBSBEAgBEKAgICA4ABRDQMgBEKAgICAMFINAgsgACABQcwBIAFBABARIgNCgICAgHCDQoCAgIDgAFENAiAAIAEgAxDkAyEEIAAgAxAMIARCgICAgHCDQoCAgIDgAFEEQCAEDwtCgICAgOAAIQMCQCAAIARB6wAgBEEAEBEiBUKAgICAcINCgICAgOAAUQ0AIABBMxCGASIBQoCAgIBwg0KAgICA4ABRBEAgACAFEAwMAQsgAEEQEFwiAkUEQCAAIAEQDCAAIAUQDAwBCyAEQiCIp0F1TwRAIASnIgcgBygCAEEBajYCAAsgAiAFNwMIIAIgBDcDACABQoCAgIBwWgRAIAGnIAI2AiALIAEhAwsgACAEEAwgAw8LIAAgAUHMASABQQAQESIDQoCAgIBwg0KAgICA4ABRDQELIAAgAxA1RQRAIAAgAxAMIABBjNkAQQAQEkKAgICA4AAPCyAAIAEgAxDkAyEGIAAgAxAMIAYhAwsgAwtRAQN/AkADQCABQoCAgIBwVA0BIAGnIgIvAQYiBEEsRgRAIAIoAiAiAkUNAiACLQARBEAgABC4AkF/DwsgAikDACEBDAELCyAEQQJGIQMLIAMLewEBf0F/IQQCQCAAIAEQICIBQoCAgIBwg0KAgICA4ABRDQAgACABpyACEIQEIQQgACABEAwgBA0AIANBgIABcUUEQEEAIQQgA0GAgAJxRQ0BIAAoAhAoAowBIgJFDQEgAi0AKEEBcUUNAQsgAEGICkEAEBJBfyEECyAEC3sBAn8gASABKAIAQQFrIgI2AgACQCACDQAgAC0AaEECRg0AIAEoAggiAiABKAIMIgM2AgQgAyACNgIAIAFBADYCDCAAKAJcIQIgACABQQhqIgM2AlwgASACNgIMIAEgAEHYAGo2AgggAiADNgIAIAAtAGgNACAAEOYFCwvKBQEEfyMAQSBrIgckAAJAAkACQAJAAkAgAUKAgICAcFQgAkL/////D1ZyDQAgAqchBgJAAkACQAJAAkACQAJAAkACQCABpyIFLwEGQQJrDh4ACQkJCQkICQkJCQkJCQkJCQkJBwYGBQUEBAMDAgEJCyAFKAIoIgggBksNCiAGIAhHDQggBS0ABUEJcUEJRw0IIAUoAhAhBgNAAkAgBigCLCIIBEAgCCgCECEGAkAgCC8BBkEBaw4CAAIMCyAGLQARRQ0CDAsLIAAgBSADIAQQhgQhBAwOCyAILQAFQQhxDQALDAgLQX8hBCAAIAdBGGogAxBtDQtBASEEIAUoAiggBk0NCyAFKAIkIAZBA3RqIAcrAxg5AwAMCwtBfyEEIAAgB0EYaiADEG0NCkEBIQQgBSgCKCAGTQ0KIAUoAiQgBkECdGogBysDGLY4AgAMCgsgACAHQQhqIAMQhQQNBiAFKAIoIAZNDQggBSgCJCAGQQN0aiAHKQMINwMADAgLQX8hBCAAIAdBFGogAxCVAQ0IQQEhBCAFKAIoIAZNDQggBSgCJCAGQQJ0aiAHKAIUNgIADAgLQX8hBCAAIAdBFGogAxCVAQ0HIAUoAiggBk0NBkEBIQQgBSgCJCAGQQF0aiAHKAIUOwEADAcLQX8hBCAAIAdBFGogAxCVAQ0GQQEhBCAFKAIoIAZNDQYgBSgCJCAGaiAHKAIUOgAADAYLQX8hBCAAIAdBFGogAxDcBQ0FQQEhBCAFKAIoIAZNDQUgBSgCJCAGaiAHKAIUOgAADAULIAUoAiggBk0NACAAIAUoAiQgBkEDdGogAxAdDAMLIAAgAhAwIQUgACACEAwgBUUEQCAAIAMQDAwBCyAAIAEgBSADIAEgBBDQASEEIAAgBRAQDAMLQX8hBAwCCyAAIAUoAiQgBkEDdGogAxAdC0EBIQQLIAdBIGokACAEC+QMAgd/AX4jAEEwayIJJAACQAJAAkACQAJAAn8CQAJAIARCIIinIgdBf0cEQCABQoCAgIBwWgRAIAGnIQcMAgsCQAJAAkAgB0ECaw4CAAECCyAAIAMQDCAAIAJBgcIAELUBQX8hBgwKCyAAIAMQDCAAIAJBpugAELUBQX8hBgwJCyAAIAEQiwSnIQcMAQsgBKciCCABpyIHRw0BAkADQCAHKAIQIghBMGohCiAIIAgoAhggAnFBf3NBAnRqKAIAIQYDQCAGRQRAIAchCEEADAYLIAIgCiAGQQFrQQN0IghqIgYoAgRHBEAgBigCAEH///8fcSEGDAELCyAHKAIUIAhqIQggBigCACIKQYCAgMB+cUGAgIDAAEYEQCAAIAggAxAdDAgLAkAgCkGAgICAAnEEQCAHLwEGQQJHDQEgAkEwRw0DIAAgByADIAUQ3gUhBgwLCyAKQRp2QTBxIgpBMEcEQCAKQSBHBEAgCkEQRw0IIAAgCCgCBCAEIAMgBRCHBCEGDAwLIAcvAQZBC0YNByAAIAgoAgAoAhAgAxAdDAkLIAAgByACIAggBhDBAkUNAQwJCwtB6vAAQajsAEH7wQBB5MQAEAAAC0HzxgBBqOwAQfzBAEHkxAAQAAALQQEMAQtBAgshBgNAAkACQAJAAkACQAJAIAYOAgABAgsCQCAHLQAFIgZBBHFFDQACQCAGQQhxBEAgAkEASARAIAJB/////wdxIgYgBygCKE8NAiAHIAhHDQYgACAEIAatIAMgBRDPASEGDA4LIAcvAQZBFWtB//8DcUEKSw0CIAAgAhCTAyIGRQ0CIAZBAEgNDCAHLwEGIQYMCgsgACgCECgCRCAHLwEGQRhsaigCFCIGRQ0BIAYoAhgiCgRAIAcgBygCAEEBajYCACAAIAetQoCAgIBwhCIBIAIgAyAEIAUgChE0ACEGIAAgARAMDAYLIAYoAgAiBkUNASAHIAcoAgBBAWo2AgAgACAJQRBqIAetQoCAgIBwhCINIAIgBhEXACEGIAAgDRAMIAZBAEgNBSAGRQ0BIAktABBBEHEEQCAAIAkpAygiAadBACABQoCAgIBwg0KAgICAMFIbIAQgAyAFEIcEIQYgACAJKQMgEAwgACAJKQMoEAwMDQsgACAJKQMYEAwgCS0AEEECcUUNCCAHIAhHDQQgACAEIAIgA0KAgICAMEKAgICAMEGAwAAQaiEGDAULIAcvAQYiBkEVa0H//wNxQQtJDQgLIAcoAhAoAiwhB0EBIQYMBQsgB0UNAUECIQYMBAsDQCAHKAIQIgZBMGohCyAGIAYoAhggAnFBf3NBAnRqKAIAIQYDQCAGRQ0EIAIgCyAGQQFrQQN0IgZqIgooAgRHBEAgCigCAEH///8fcSEGDAELCyAHKAIUIAZqIQsCQCAKKAIAIgZBGnZBMHEiDEEwRwRAIAxBEEcNASAAIAsoAgQgBCADIAUQhwQhBgwLC0F/IQYgACAHIAIgCyAKEMECRQ0BDAoLCyAGQYCAgMAAcQ0CDAQLIAVBgIAEcQRAIAAgAxAMIAAgAhDAAkF/IQYMCAsgCEUEQCAAIAMQDCAAIAVB7B4QfCEGDAgLIAgtAAUiBkEBcUUEQCAAIAMQDCAAIAVBhdgAEHwhBgwICwJAIAGnIgcgCEYEQCAGQQRxBEAgBkEIcUUgAkEATnINAiAHLwEGQQJHDQIgBygCKCACQf////8HcUcNAiAAIAcgAyAFEIYEIQYMCgsgACAHIAJBBxB3IgJFDQggAiADNwMADAcLIAAgCUEQaiAIIAIQQyIGQQBIDQEgBkUNACAJLQAQQRBxBEAgACAJKQMgEAwgACAJKQMoEAwgACADEAwgACAFQdc/EHwhBgwJCyAAIAkpAxgQDCAJLQAQQQJxRQ0EIAgvAQZBC0YNBCAAIAQgAiADQoCAgIAwQoCAgIAwQYDAABBqIQYMAQsgACAIIAIgA0KAgICAMEKAgICAMCAFQYfOAHIQ3QUhBgsgACADEAwMBgtBACEGDAALAAsgACADEAwgACAFIAIQ5wEhBgwDCyAGQf7/A3FBHEYEQEF/IQYgACAJQQhqIAMQhQRFDQEMAwsgACAAIAMQlgEiARAMQX8hBiABQoCAgIBwg0KAgICA4ABRDQILQQEhBgwBCyAAIAMQDEF/IQYLIAlBMGokACAGCzwBAX8jAEHQAGsiAiQAIAIgAQR/IAAgAkEQaiABEIEBBUHe2QALNgIAIABBveQAIAIQwwIgAkHQAGokAAuuwwEDLn8HfgJ8IwBBoAFrIgghDiAIJAAgACgCECEWQoCAgIDgACE1AkAgABB2DQACfwJAAkACQAJAAkAgAUL/////b1gEQCAGQQRxRQ0BIAGnIgcoAmQhCCAHKAJAIhkoAiQhEyAZKAIgIhIoAjAhCSASLwEqIQwgB0EANgJkIAcgFigCjAE2AjggBygCSCEVIAcoAlghBiAHKAJMIREgFiAHQThqIhQ2AowBIBEgDEEDdGohFyAVIRggBiEMIAcoAhxFDQQMBQsgAaciGS8BBiIHQQ1GDQIgFigCRCAHQRhsaigCECIIDQELIABB+zlBABASDAULIAAgASACIAQgBSAGIAgRFgAhNQwECyAZKAIgIhIvAS4hCSASLwEqIRcgEi8BKCEHIA4gEi0AEDYCWCAOIA5ByABqIhU2AkwgDiAVNgJIIA4gATcDOCAOIAQ2AlQgGSgCJCETIAggByAHQQAgBCAHSCIIGyAGQQJxQQF2GyIGIAkgF2pqQQN0QQ9qQfD//wFxayIYJAAgBSEVIAYEQCAHIAQgByAIGyIIQQAgCEEAShsiCGsiCUEAIAcgCU8bIREDQAJAIAggCkYEQANAIAggEUYNAiAYIAhBA3RqQoCAgIAwNwMAIAhBAWohCAwACwALIAUgCkEDdCIJaikDACIBQiCIp0F1TwRAIAGnIhUgFSgCAEEBajYCAAsgCSAYaiABNwMAIBFBAWohESAKQQFqIQoMAQsLIA4gBzYCVCAYIRULIA4gFTYCQCAOIBggBkEDdGoiETYCREEAIQgDQCAIIBdHBEAgESAIQQN0akKAgICAMDcDACAIQQFqIQgMAQsLIBIoAhQhBiAOIBYoAowBNgIwIBYgDkEwaiIUNgKMASASKAIwIQkgESAXQQN0aiIIIRcLQQAMAQtBAQshBwNAAkACQAJAAkAgB0UEQCAEQQN0ISMgA0KAgICAcIMhOyARQQhqIRogEUEQaiEbIBFBGGohHCAVQQhqIR0gFUEQaiEeIBVBGGohHyAUQRhqISQgAkIgiKciIEF+cSElIANCIIinISYgBK0hOiADpyEhIA5BMGohJyAOQegAaiEiIAghBwJAA0ACQCAGQQFqIQxCgICAgDAhNQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJA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AAsgCCABNwMQIAhBGGohBwzeAQsgCCAIQQhrIgYpAwA3AwAgCEEQaykDACIBQiCIp0F1TwRAIAGnIgcgBygCAEEBajYCAAsgBiABNwMAIAhBCGohBwzdAQsgCCAIQQhrIgYpAwAiATcDACAGIAhBEGsiBikDADcDACABQiCIp0F1TwRAIAGnIgcgBygCAEEBajYCAAsgBiABNwMAIAhBCGohBwzcAQsgCCAIQQhrIgYpAwAiATcDACAIQRBrIgcpAwAhNSAHIAhBGGsiBykDADcDACAGIDU3AwAgAUIgiKdBdU8EQCABpyIGIAYoAgBBAWo2AgALIAcgATcDACAIQQhqIQcM2wELIAggCEEIayIGKQMAIgE3AwAgCEEQayIHKQMAITUgByAIQRhrIgcpAwA3AwAgBiA1NwMAIAcgCEEgayIGKQMANwMAIAFCIIinQXVPBEAgAaciByAHKAIAQQFqNgIACyAGIAE3AwAgCEEIaiEHDNoBCyAIQRBrIgYpAwAhASAGIAhBGGsiBikDADcDACAGIAE3AwAM0wELIAhBGGsiBikDACEBIAYgCEEQayIGKQMANwMAIAhBCGsiBykDACE1IAcgATcDACAGIDU3AwAM0gELIAhBIGsiBikDACEBIAYgCEEYayIGKQMANwMAIAhBEGsiBykDACE1IAcgCEEIayIHKQMANwMAIAYgNTcDACAHIAE3AwAM0QELIAhBKGsiBikDACEBIAYgCEEgayIGKQMANwMAIAhBGGsiBykDACE1IAcgCEEQayIHKQMANwMAIAYgNTcDACAHIAhBCGsiBikDADcDACAGIAE3AwAM0AELIAhBCGsiBikDACEBIAYgCEEQayIGKQMANwMAIAhBGGsiBykDACE1IAcgATcDACAGIDU3AwAMzwELIAhBEGsiBikDACEBIAYgCEEYayIGKQMANwMAIAhBIGsiBykDACE1IAcgATcDACAGIDU3AwAMzgELIAhBEGsiBikDACEBIAYgCEEYayIGKQMANwMAIAhBIGsiBykDACE1IAcgCEEoayIHKQMANwMAIAYgNTcDACAHIAE3AwAMzQELIAhBCGsiBikDACEBIAYgCEEQayIGKQMANwMAIAYgATcDAAzMAQsgCEEgayIGKQMAIQEgBiAIQRBrIgYpAwA3AwAgCEEIayIHKQMAITUgByAIQRhr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xH4iAUIAUg0EIA0gD3JBAE4NBSALQoCAgIDA/v8DNwMADA0LIAtCgICAgMB+IA+3IA23o70iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGzcDAAwMCyANQQBKIA9BAE5xRQRAIAsCfiAPtyANtxCZBCI8vSIBAn8gPJlEAAAAAAAA4EFjBEAgPKoMAQtBgICAgHgLIgq3vVEEQCAKrQwBC0KAgICAwH4gAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGws3AwAMDAsgDyANcK0hAQwCCyAPtyE8IAsCfgJ8IA23Ij29QoCAgICAgID4/wCDQoCAgICAgID4/wBRBEBEAAAAAAAA+H8gPJlEAAAAAAAA8D9hDQEaCyA8ID0QowMLIjy9IgECfyA8mUQAAAAAAADgQWMEQCA8qgwBC0GAgICAeAsiCre9UQRAIAqtDAELQoCAgIDAfiABQoCAgIDAgYD8/wB9IAFC////////////AINCgICAgICAgPj/AFYbCzcDAAwKCyA1xCABxH0hAQsgAUKAgICACHxC/////w9WDQEgASE2CyA2Qv////8PgwwBC0KAgICAwH4gAbm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLNwMADAULIBBBdkcgD0F2R3FFBEAgCSAKIAsgNSABIAkoAhAoAqwCESMADQcMBQsgCSAHQQhqIDUQbQ0FIAkgByABEG0NBgsCQAJAAkACQCAKQZsBaw4GAAECBAUDBAsgBysDCCAHKwMAogwFCyAHKwMIIAcrAwCjDAQLIAcrAwggBysDABCZBAwDCyAHKwMIITwgBysDACI9vUKAgICAgICA+P8Ag0KAgICAgICA+P8AUQRARAAAAAAAAPh/IDyZRAAAAAAAAPA/YQ0DGgsgPCA9EKMDDAILEAEACyAHKwMIIAcrAwChCyE8IAtCgICAgMB+IDy9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhs3AwALQQAMAgsgCSABEAwLIAtCgICAgDA3AwAgDUKAgICAMDcDAEF/CyEwIAdBEGokACAwDUsgCEEIayEHDEcLIAhBBGsoAgAiB0UgB0EHa0FuSXINQCAIIQcgCSAIQY4BEOEBRQ1GDEoLAkACfCAIQQhrIgcpAwAiAUIgiKciCkUEQEQAAAAAAAAAgCABpyIGRQ0BGkQAAAAAAADgQSAGQYCAgIB4Rg0BGiAHQgAgAX1C/////w+DNwMADEILIApBB2tBbUsNASABQoCAgIDA/v8Dfb8LITwgB0KAgICAwH4gPL0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGzcDAAxACyAIIQcgCSAIQY0BEOEBRQ1FDEkLIAhBCGsiBykDACIBQv////8PViABQv////8HUXJFBEAgByABQgF8Qv////8PgzcDAAw/CyAIIQcgCSAIQZABEOEBRQ1EDEgLIAhBCGsiBykDACIBQv////8PViABQoCAgIAIUXJFBEAgByABQgF9Qv////8PgzcDAAw+CyAIIQcgCSAIQY8BEOEBRQ1DDEcLIAkgCEEIayIHKQMAEGUiAUKAgICAcINCgICAgOAAUQRAIAdCgICAgDA3AwAMRwsgByABNwMAIAFCIIinQXVPBEAgAaciByAHKAIAQQFqNgIACyAIIAE3AwAgCSAIQQhqIgcgCkECaxDhAUUNQgxGCyAGQQJqIQwgESAGLQABQQN0aiIHKQMAIgFC/////w9WIAFC/////wdRckUEQCAHIAFCAXxC/////w+DNwMADDwLIAFCIIinQXVPBEAgAaciCiAKKAIAQQFqNgIACyAOIAE3A2AgCSAiQZABEOEBDUUgCSAHIA4pA2AQHQw7CyAGQQJqIQwgESAGLQABQQN0aiIHKQMAIgFC/////w9WIAFCgICAgAhRckUEQCAHIAFCAX1C/////w+DNwMADDsLIAFCIIinQXVPBEAgAaciCiAKKAIAQQFqNgIACyAOIAE3A2AgCSAiQY8BEOEBDUQgCSAHIA4pA2AQHQw6CyAIQQhrIgcpAwAiAUL/////D1gEQCAHIAFC/////w+FNwMADDoLIAghByMAQRBrIgokAAJ/AkACQCAJIAhBCGsiCykDABBlIgFCgICAgHCDIjVCgICAgOAAUQ0AIDVCgICAgOB+UQRAIAkgC0GWASABIAkoAhAoAqgCER8ADQEMAgsgCSAKQQxqIAEQlQENACALIAo1AgxC/////w+FNwMADAELIAtCgICAgDA3AwBBfwwBC0EACyExIApBEGok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//8AgyIGQoCAgICAgMD//wBWIAZCgICAgICAwP//AFEbDQAgACAChCAFIAaEhFAEQEEADwsgASADg0IAWQRAQX8hBCAAIAJUIAEgA1MgASADURsNASAAIAKFIAEgA4WEQgBSDwtBfyEEIAAgAlYgASADVSABIANRGw0AIAAgAoUgASADhYRCAFIhBAsgBAuhAgEFfwNAAkACQAJAAkACfyACIAdMIgkgBCAGTHJFBEAgASAHQQJ0aigCACIIIAMgBkECdGooAgAiCUkEQCAIDAILIAggCUcNAyAGQQFqIQYgB0EBaiEHIAghCQwECyAJDQEgASAHQQJ0aigCAAshCSAHQQFqIQcMAgsgBCAGTA0CIAMgBkECdGooAgAhCQsgBkEBaiEGCwJ/AkACQAJAAkAgBQ4DAwABAgsgBiAHcUEBcQwDCyAGIAdzQQFxDAILEAEACyAGIAdyQQFxCyAAKAIAIghBAXFGDQEgACgCBCAITARAIAAgCEEBahDRAgRAQX8PCyAAKAIAIQgLIAAgCEEBajYCACAAKAIIIAhBAnRqIAk2AgAMAQsLIAAQmAZBAAvmAQAgAAJ/IAEoAggiAEH+////B04EQEEAIAJBAXENARpB/////wcgAEH+////B0cNARogASgCBEH/////B2oMAQtBACAAQQBMDQAaIABBH00EQEEAIAEoAhAgASgCDEECdGpBBGsoAgBBICAAa3YiAGsgACABKAIEGwwBCyACQQFxRQRAQf////8HIAEoAgRFDQEaQYCAgIB4IABBIEcNARogASgCECABKAIMQQJ0akEEaygCABpBgICAgHgMAQtBACABKAIQIAEoAgwiAiACQQV0IABrEHEiAGsgACABKAIEGws2AgALEgAgACABIAIgAyAEQZMDELEDCw4AIABBACABQRByELoBC58BAgR/An4gAzUCACEJA0AgAiAFRkUEQCAAIAVBAnQiB2ogBq0gASAHajUCACAJfnwiCj4CACAFQQFqIQUgCkIgiKchBgwBCwsgACACQQJ0IgdqIAY2AgBBASAEIARBAU0bIQRBASEFA0AgBCAFRkUEQCAAIAVBAnQiBmoiCCAHaiAIIAEgAiADIAZqKAIAEL0ENgIAIAVBAWohBQwBCwsLWgEFfyADQQAgA0EAShshBgNAIAUgBkcEQCAAIAVBAnQiA2ogASAD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gICAgOAAUg0AIAEhAgwBCwJAIAKnIgUpAgQiCkL/////B4NQDQAgAaciAykCBCELAkAgAygCAEEBRyAKIAuFQoCAgIAIg0IAUnINACADIAAoAhAoAgwRBQAgBSkCBCIKpyIEQf////8HcSIHIAMpAgQiC6ciBkH/////B3EiCGogBEEfdnQgBkEfdiIJQRFzakkNACAFQRBqIQYgA0EQaiEEIAkEQCAEIAhBAXRqIAYgB0EBdBAeGiADIAMpAgQiCiAFKQIEfEL/////B4MgCkKAgICAeIOENwIEDAILIAQgCGogBiAHEB4aIAMgAykCBCIKIAUpAgR8Qv////8HgyILIApCgICAgHiDhDcCBCAEIAunakEAOgAADAELAn4CQAJAIAunQf////8HcSAKp0H/////B3FqIgdBgICAgARPBEAgAEHkyABBABA6DAELIAAgByAKIAuEpyIGQR92EOkBIggNAQtCgICAgOAADAELIAhBEGohBAJAIAZBAE4EQCAEIANBEGogAygCBEH/////B3EQHiIEIAMoAgRB/////wdxaiAFQRBqIAUoAgRB/////wdxEB4aIAQgB2pBADoAAAwBCyAEIAMgAygCBEH/////B3EQkwUgBCADKAIEQQF0aiAFIAUoAgRB/////wdxEJMFCyAIrUKAgICAkH+ECyEKIAAgARAMDAELIAEhCgsgACACEAwgCgsPACAAIAFCgICAgDAQggILCwAgAEGfCUEAEBILjgIBA38jAEEQayIFJAAgBSAAOQMIIAUgAUEBayIHNgIAIAZBgAFB9t8AIAUQSBogAyAGLQAAQS1GNgIAIAQgBi0AAToAACABQQJOBEAgBEEBaiAGQQNqIAcQHhoLIAEgBGpBADoAACACIQkgASAGaiABQQFKakECaiEBA0AgASICQQFqIQEgAiwAACIDEI8GDQALQQEhBAJAAkACQCADQf8BcUEraw4DAQIAAgtBACEECyABLAAAIQMgASECC0EAIQEgA0EwayIDQQlNBEADQCABQQpsIANrIQEgAiwAASEIIAJBAWohAiAIQTBrIgNBCkkNAAsLIAlBACABayABIAQbQQFqNgIAIAVBEGokAAuADAIHfwV+IwBBoANrIgUkAAJAIAG9IgxCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAMQv//////////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QCAHqwwBC0EACyIDNgIcIAcgA7hhDQMMAQsgAwRAQX8hAyAAIAIQlgEiAkKAgICAcINCgICAgOAAUQ0EIAAgBEEcaiACQQEQvgJFDQMMBAsgACAEQRxqIAIQdQRAIAAgAhAMDAILQX8hAyAAIAIQlgEiAkKAgICAcINCgICAgOAAUQ0DIAAgBEEEaiACQQAQvgINAyAEKAIEIAQoAhxGDQILIABBiscAQQAQRAtBfyEDDAELIAEgBCgCHDYCAEEAIQMLIARBIGokACADC0ABAX4gABDiASICQoCAgIBwg0KAgICA4ABSBEAgAqdBBGogARCcAkUEQCACDwsgACACEAwgABBwC0KAgICA4AALMgEBfyMAQdAAayICJAAgAiAAIAJBEGogARCBATYCACAAQbzpACACEMMCIAJB0ABqJAALoAECAX8BfiMAQRBrIgUkACAFIAQ2AgxBfyEEIAAgASAFQQxqENMBRQRAIAMoAgAiAEF8cSABIAIgAygCBCAAQQNxQQJ0QYS3AWooAgARGwAhBiADEOAFIAUoAgwiACAAKAIAQf////8DcTYCACADQoCAgIAwIAYgBkKAgICAcINCgICAgOAAUSIAGzcDAEF/QQAgABshBAsgBUEQaiQAIAQLFQECfiAAIAEQ6AEhAyAAIAEQDCADCw0AIAAgASACQQIQyAIL1QEBA38jAEEQayIFJABBfyEDAkAgACgCFA0AAkACQCABQYCAgIAETgRAIAAoAgBB5MgAQQAQOgwBCyABIAAoAgxBA2xBAm0iBCABIARKGyEBIAAoAhAiBCACQYACSHJFBEAgACABEOADIQMMAwsgACgCACAAKAIEIAEgBHQgBGtBEWogBUEMahCnASICDQELIAAQ9wIMAQsgBSgCDCEDIAAgAjYCBCAAQf////8DIAMgACgCEHYgAWoiACAAQf////8DThs2AgxBACEDCyAFQRBqJAAgAwsqAQF/IAAoAhAiA0EQaiABIAIgAygCCBEBACIBIAJFckUEQCAAEHALIAELgQECAn8BfgJAIAEpAgQiBEL//////////79/VgRAIAEoAgwhAAwBCyAAKAI0IARCIIinIAAoAiRBAWtxQQJ0aiECIAAoAjghAwNAIAMgAigCACIAQQJ0aigCACICIAFGDQEgAkEMaiECIAANAAtBxocBQajsAEH/FEH4DhAAAAsgAAupBwIJfwF+AkACQAJAAn8gAkECTARAIAIgASkCBCIMQj6Ip0YEQCAAIAEQxgIiBEHXAUoNBSABIAEoAgBBAWs2AgAgBA8LIAAoAjQgACgCJEEBayABIAIQ6wVB/////wNxIgdxIgpBAnRqIQMgDKdB/////wdxIQUDQCACIAMoAgAiBEUNAhoCQCAAKAI4IARBAnRqKAIAIgMpAgQiDKdB/////wdxIAVHIAxCPoinIAJHciAMQiCIp0H/////A3EgB0dyDQAgAyABIAUQ6gUNACAEQdgBSA0EIAMgAygCAEEBajYCAAwECyADQQxqIQMMAAsACyACQQNHIQdBAwshBQJAIAAoAjwNAEEAIQQgAEEQaiILIAAoAjhB0wEgACgCLEEDbEECbSICIAJB0wFMGyICQQJ0IAAoAggRAQAiCEUNASAAKAIsIgkhAyAJRQRAIAtBECAAKAIAEQMAIgZFBEAgCyAIIAAoAgQRAAAMAwsgBkKAgICAgICAgEA3AgQgBkEBNgIAIAZBADYADCAIIAY2AgAgACAAKAIoQQFqNgIoQQEhAwsgACADNgI8IAAgCDYCOCAAIAI2AiwgCSACIAIgCUkbIQQgAkEBayEGA0AgAyAERg0BIAAoAjggA0ECdGpBASADQQFqIgJBAXRBAXIgAyAGRhs2AgAgAiEDDAALAAsCQCABBEAgASkCBCIMQv//////////P1gEQCABIAwgBa1CPoaENwIEDAILIABBEGogDKciAkEfdSACQf////8HcSACQR92dGpBEWogACgCABEDACICRQRAQQAhBAwECyACQQE2AgAgAiACKQIEQv////93gyABKQIEQoCAgIAIg4QiDDcCBCACIAxCgICAgHiDIAEpAgRC/////weDhDcCBCACQRBqIAFBEGogASgCBCIDQf////8HcSADQR92dCADQX9zQR92ahAeGiAAIAEQkAQgAiEBDAELIABBEGpBECAAKAIAEQMAIgFFBEBBAA8LIAFCgYCAgICAgICAfzcCAAsgACAAKAI4IAAoAjwiBEECdGoiAigCAEEBdjYCPCACIAE2AgAgASAENgIMIAEgATUCBCAHrUIghoQgBa1CPoaENwIEIAAgACgCKEEBajYCKCAFQQNGDQIgASAAKAI0IApBAnRqIgEoAgA2AgwgASAENgIAIAAo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QQAQEgwBCwJAIARFIAJBAExyRQRAIAAgBSAHQgAgAUF/EPMCDQIMAQsgASEICyACQQAgAkEAShutIQlCACEBA0AgASAJUgRAIAMgAadBA3RqKQMAIgdCIIinQXVPBEAgB6ciAiACKAIAQQFqNgIACyABIAh8IQogAUIBfCEBIAAgBSAKIAcQe0EATg0BDAILCyAAIAVBMCAGQoCAgIAIfCIIQv////8PWAR+IAZC/////w+DBUKAgICAwH4gBrm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLEDlBAEgNACAAIAUQDCAGQv////8PgyAIQv////8PWA0BGkKAgICAwH4gBrm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsMAQsgACAFEAxCgICAgOAACyELIAxBEGokACALCxUBAn4gACABEIcFIQMgACABEAwgAwv5DgIKfgR/IwBBEGsiECQAIBAgAjcDCAJAAkACfgJAAkACQAJAAkACQAJAAkACQAJAQQcgAkIgiKciDiAOQQdrQW5JGyIOQQdqDg8EAwMDAwMABQUFAwMDAwECCwJAAkACQAJAIAKnIg4vAQYiD0EEaw4DAQACAwtCgICAgDAhByAAIAIQNCICQoCAgIBwg0KAgICA4ABRDQsgACACEO4DIgJCgICAgHCDQoCAgIDgAFENCyABKAIoIAIQhAEhDgwOC0KAgICAMCEHIAAgAhCWASICQoCAgIBwg0KAgICA4ABRDQogASgCKCACEIQBIQ4MDQsgASgCKCAOKQMgEI0BIQ4gACACEAwMDAsgD0EhRg0HQoCAgIAwIQYgACABKQMIQQEgEEEIahDxAyIEQoCAgIDwAINCgICAgOAAUQ0GIAAgBBAnBEAgAEHJ3wBBABASDAcLIANCIIinQXVPBEAgA6ciDiAOKAIAQQFqNgIACyABKQMYIgRCIIinQXVPBEAgBKciDiAOKAIAQQFqNgIACwJAAkACQAJAIAAgAyAEELYCIghCgICAgHCDQoCAgIDgAFEEQEKAgICAMCEHDAELIAEpAxgiBEKAgICAcINCgICAgJB/UQRAIASnKAIEQf////8HcUUNAwsgCEIgiKdBdU8EQCAIpyIOIA4oAgBBAWo2AgALIABB65YBIAhB7JYB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BEAgAiAANgIAC0EBC4cDAgN+BH8CQCABKAIIIgZB/v///wdOBEBBASEHIAJBAXENAUL///////////8AIQMgBkH+////B0cNASABNAIEQv///////////wB8IQMMAQsgBkEATARADAELIAZBP00EQCABKAIQIAEoAgwiCEECdGoiCUEEaygCACECQgAgBkEgTQR+IAJBICAGa3atBSAIQQJPBH4gCUEIazUCAAVCAAsgAq1CIIaEQcAAIAZrrYgLIgN9IAMgASgCBBshAwwBCyACQQFxRQRAIAEoAgRFBEBC////////////ACEDQQEhBwwCC0KAgICAgICAgIB/IQNBASEHIAZBwABHDQEgASgCECABKAIMIgFBAnRqIgJBBGs1AgBCIIYhBCABQQJPBH4gAkEIazUCAAVCAAsgBIRCgICAgICAgICAf1IhBwwBC0IAIAEoAhAiCCABKAIMIgIgAkEFdCAGayIGEHGtIAggAiAGQSBqEHGtQiCGhCIDfSADIAEoAgQbIQMLIAAgAzcDACAHC60CAgJ/An4jAEEgayICJAACQCAAKAIIQf////8HRgRAQoCAgICAgID8/wAhBAwBCyAAKAIAIQMgAkIANwIYIAJCgICAgICAgICAfzcCECACIAM2AgwgAkEMaiIDIAAQSRoCfiACKAIUIgBB/f///wdMBEAgA0E1QcgEELoBGiACKAIUIQALQoCAgICAgID4/wAgAEH+////B0YNABpCACAAQYCAgIB4Rg0AGiACKAIcIQMCfiACKAIYQQJGBEAgAykCAAwBCyADNQIAQiCGCyEEIABBgnhMBEAgBEGOeCAAa62IIQRCAAwBCyAEQguIQv////////8HgyEEIABB/gdqrUI0hgshBSAEIAWEIAI1AhBCP4aEIQQgAkEMahAZCyABIAQ3AwAgAkEgaiQACw0AIAAgASACQQIQsAMLIwACQAJAAkAgAg4CAAECCyAAIAFyDwsgACABcw8LIAAgAXEL4QgBEX8gAigCBCAFcyIFIAEoAgQiBnMhDQJAIAEgAhDyASIIIA1Fcg0AIAEoAghB/f///wdKDQAgACAEQQdxQQJGEIABQQAPCyAFIAYgCEEASCIGGyEFIAEgAiAGGyEKAkACQAJAIAIgASAGGyIIKAIMIgcEQCAKKAIMIgsNAQsgCCgCCCIBQf7///8H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CyAAIAsQDCAAIAgQDCAAIAoQDCAAIAEQDAwBCyABIQ0LIAVBIGokACANC0sBAn8gACABRwRAIAAoAhAiAgRAIAAoAgAiAygCACACQQAgAygCBBEBABoLIAAgASkCADcCACAAIAEoAhA2AhAgACABKQIINwIICwv0AQIDfgF/AkAgAykDACIEQoCAgIBwWgRAIAMpAwgiBUL/////b1YNAQsgABAiQoCAgIDgAA8LQoCAgIDgACEGIABCgICAgCBBLBBHIgFCgICAgHCDQoCAgIDgAFIEfiAAQRgQJCICRQRAIAAgARAMQoCAgIDgAA8LIASnIgMgAygCAEEBajYCACACIAQ3AwAgBaciByAHKAIAQQFqNgIAIAIgBTcDCCAAIAQQNSEAIAJBADoAESACIAA6ABAgAUKAgICAcFoEQCABpyIAIAI2AiAgACAALQAFQe8BcSADLQAFQRBxcjoABQsgAQVCgICAgOAACwsbACAAEBkgAEIANwIQIABCADcCCCAAQgA3AgALCQAgASACEPgFCxMAIABBEGogASACIAAoAggRAQALqAECAX8CfiAAvSIEQv///////////wCDQoGAgICAgID4/wBaBEAgAb1C////////////AINCgYCAgICAgPj/AFQPC0F/IQICQCAAIAFjDQAgAb0iA0L///////////8Ag0KAgICAgICA+P8AVg0AQQEhAiAAIAFkDQBBACECIABEAAAAAAAAAABiDQAgBEIAUwRAIANCP4enQX9zDwsgA0I/iKchAgsgAgvKBQIFfwN+IwBBMGsiAiQAIAIgATcDECACQQA2AgwgAiAANgIIIAIgAykDACIKNwMYAkACQCAKQoCAgIBwgyILQoCAgIAwUgRAQoCAgIDgACEJIAAgChBVDQELQoCAgIDgACEJIAAgARCKASIFQQBIDQACQCAFQQJJDQAgAaciAy8BBkEVayIEQf//A3FBC08NAiACIARBAnRB/P8PcSIEQZz1AWooAgA2AiBBASADLwEGQcqeAWotAAAiBnQhCCADKAIkIQcgC0KAgICAMFIEQCAAIAVBAnQQJCIERQ0CQQAhAwNAIAMgBUZFBEAgBCADQQJ0aiADNgIAIANBAWohAwwBCwsgAiAINgIoIAIgBzYCJCAEIAVBBEHLACACQQhqENcBAkACQAJAAkAgAigCDA4CAAEDCyAAIAUgBnQiAxAkIgYNAQsgACgCECIAQRBqIAQgACgCBBEAAAwECyAGIAcgAxAeIQZBACEDAkACQAJAAkACQCAIQQFrDggAAQkCCQkJAwkLA0AgAyAFRg0EIAMgB2ogBiAEIANBAnRqKAIAai0AADoAACADQQFqIQMMAAsACwNAIAMgBUYNAyAHIANBAXRqIAYgBCADQQJ0aigCAEEBdGovAQA7AQAgA0EBaiEDDAALAAsDQCADIAVGDQIgByADQQJ0IghqIAYgBCAIaigCAEECdGooAgA2AgAgA0EBaiEDDAALAAsDQCADIAVGDQEgByADQQN0aiAGIAQgA0ECdGooAgBBA3RqKQMANwMAIANBAWohAwwACwALIAAoAhAiA0EQaiAGIAMoAgQRAAALIAAoAhAiAEEQaiAEIAAoAgQRAAAMAQsgByAFIAggBEHI9QFqKAIAIAJBCGoQ1wEgAigCDA0BCyABQiCIp0F1TwRAIAGnIgAgACgCAEEBajYCAAsgASEJCyACQTBqJAAgCQ8LEAEAC+cCAQF+IAAgARCKASICQQBIBEBCgICAgOAADwsCQCACRQ0AAkACQAJAAkACQCABpyIALwEGQcqeAWotAAAOBAABAgMECyAAKAIkIgAgAmohAgNAIAAgAkEBayICTw0FIAAtAAAhAyAAIAItAAA6AAAgAiADOgAAIABBAWohAAwACwALIAAoAiQiACACQQF0aiECA0AgACACQQJrIgJPDQQgAC8BACEDIAAgAi8BADsBACACIAM7AQAgAEECaiEADAALAAsgACgCJCIAIAJBAnRqIQIDQCAAIAJBBGsiAk8NAyAAKAIAIQMgACACKAIANgIAIAIgAzYCACAAQQRqIQAMAAsACyAAKAIkIgAgAkEDdGohAgNAIAAgAkEIayICTw0CIAApAwAhBCAAIAIpAwA3AwAgAiAENwMAIABBCGohAAwACwALEAEACyABQiCIp0F1TwRAIAGnIgAgACgCAEEBajYCAAsgAQtRAgF/AX5CgICAgOAAIQQgACABIAIQayIDBH4gAygCICIDKAIMKAIgLQAEBEAgAkUEQEIADwsgABBfQoCAgIDgAA8LIAM1AhAFQoCAgIDgAAsLNwAgACABIAIQayIARQRAQoCAgIDgAA8LIAAoAiAoAgwiACAAKAIAQQFqNgIAIACtQoCAgIBwhAsMACAAKAIQIAEQ5wML2gEBAn4CQAJAIAJFBEAgAUKAgICAcIMhBSAAQS8QKSEEDAELAn4gAUKAgICAcIMiBUKAgICAMFIgAykDACIEQoCAgIBwg0KAgICAgH9SckUEQCAAQbmMASAAIAAoAhAgBKcQxgIQKUGrjAEQsgEMAQsgACAEECULIgRCgICAgHCDQoCAgIDgAFENAQsgBUKAgICAMFENACAAIAFBBRBeIgFCgICAgHCDQoCAgIDgAFIEQCAAIAEgBBC9ASAAIAFBMCAEpykCBEL/////B4NBABAVGgsgASEECyAEC0YBAX8CQCAAKAIIIAJqIgMgACgCDEoEQCAAIAMgARDEAg0BCwNAIAJBAEwEQEEADwsgAkEBayECIAAgARCHAUUNAAsLQX8LlQECBX8BfiABKQIEIginQf////8HcSIDRQRAIAIPCyAAKAIEQf////8HcSEHAn8gCEKAgICACINQRQRAIAEvARAMAQsgAS0AEAshBSADQQFrIQYgByADayEEAkADQCACIARKDQEgACAFIAIQoAEiA0EASCADIARKcg0BIAAgASADQQFqIgJBASAGELwDDQALIAMPC0F/C6cBAgN/AX4CQAJAIAAgARD2AyIDQQBIDQAgA0UNAUGbHiECIAAgACABQe4AIAFBABARIgVCgICAgHCDIgFCgICAgCBRIAFCgICAgDBRcgR/QZseBSABQoCAgIDgAFENASAAIAUQNCIBQoCAgIBwg0KAgICA4ABRDQFBACECIAGnQecAQQAQoAEhBCAAIAEQDCAEQQBODQJB2ssAC0EAEBILQX8hAgsgAguhAQIDfwF+AkACQCAAKQIEIgRCgICAgAiDUA0AIABBEGohAiAEp0H/////B3EhA0EAIQADQCAAIANODQECQCACIABBAXRqLwEAIgFBgPADcUGAsANHBEAgACEBDAELIAFB/7cDSw0DIABBAWoiASADTg0DIAIgAUEBdGovAQBBgEBrQf//A3FBgPgDSQ0DCyABQQFqIQAMAAsAC0F/IQALIAALVQEBfwJAAkACQCABQiCIp0EBag4DAAECAQsgAaciAi8BBkEGRw0AIAIpAyAiAUKAgICAcINCgICAgBBRDQELIABBlMAAQQAQEkKAgICA4AAhAQsgAQsQAEHOkQEgAEELEJICQQBHC4kB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ADcCECAAQRBqIAIgACgCBBEAAAwBCyACQoCAgIAwNwMoIAJCgICAgDA3AyAgAkEBNgIECyABIAEoAgxBAWs2AgwLC4YBACAAIAEgBEEiahBaIgJFBEBCgICAgOAADwsgACACIAMpAwAiAUIAIAFCIIinQQdrQW5PGyABIAFCgICAgMCBgPz/AHxC////////////AINQGxDyAiIARQRAQoCAgIAwDwsgACkDKCIBQiCIp0F1TwRAIAGnIgAgACgCAEEBajYCAAsgAQu7BQIDfgd/IwBBEGsiCyQAQoCAgIDgACEHAkAgACABIARBImoQWiICRQ0AIAIoAgBFIAMpAwAiBUIAIAVCIIinQQdrQW5PGyAFIAVCgICAgMCBgPz/AHxC////////////AINQGyIFQv////9vVnJFBEAgABAiDAELQoCAgIAwIQYgBEEBcUUEQCADKQMIIQYLAkAgACACIAUQ8gIiAwRAIAAgAykDKBAMDAELIABBMBAkIgNFDQEgAyACNgIIIANCATcDAAJAIAIoAgAEQCADIAWnIgQoAhg2AgwgBCADNgIYDAELIAVCIIinQXVJDQAgBaciBCAEKAIAQQFqNgIACyADIAU3AyAgAigCECIJIAIoAhQiBEEBayAFENkDcUEDdGoiCCgCACIKIANBGGoiDDYCBCADIAg2AhwgAyAKNgIYIAggDDYCACACKAIEIgggA0EQaiIKNgIEIAMgAkEEaiIMNgIUIAMgCDYCECACIAo2AgQgAiACKAIMQQFqIgg2AgwgCCACKAIYSQ0AIAAgCUEEIARBAXQgBEEBRhsiAEEDdCALQQxqEKcBIghFDQAgCygCDEEDdiAAaiEEQQAhAANAIAAgBEZFBEAgCCAAQQN0aiIJIAk2AgQgCSAJNgIAIABBAWohAAwBCwsgBEEBayEKIAJBCGohAANAIAwgACgCACIARwRAIABBDGsoAgBFBEAgCCAAKQMQENkDIApxQQN0aiIJKAIAIg0gAEEIaiIONgIEIAAgCTYCDCAAIA02AgggCSAONgIACyAAQQRqIQAMAQsLIAIgBDYCFCACIAg2AhAgAiAEQQF0NgIYCyAGQiCIp0F1TwRAIAanIgAgACgCAEEBajYCAAsgAyAGNwMoIAFCIIinQXVPBEAgAaciACAAKAIAQQFqNgIACyABIQcLIAtBEGok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AmoQI0UNDAJAIAMoAqgGIgVBAEgEQCADKALYBiEFDAELIAMgBTYC2AYLIAEgAygCxAYgBRAuIANBwAZqQfIBEA4gAygCrAZBAXMhBQwSCyADQX82AogDIANCw/aAgOABNwOAAyADQZwGaiAEIANBgANqECNFDQsCQCADKAKoBiICQQBIBEAgAygC2AYhAgwBCyADIAI2AtgGCyABIAMoAsQGIAIQLiADQcAGaiICIAMtAKwGEA4gAiADKAK8BhAbDBALIANBfzYCuAMgA0LZuP2CcDcDsAMgA0GcBmogBCADQbADahAjRQ0KIAMoAqgGIgJBAE4EQCADIAI2AtgGCyADQo6AgIBwNwOgAyADKAKsBiIFQQFqIQYCQCADQZwGaiADKAKkBiICIANBoANqECMEfyADKAKoBiICQQBOBEAgAyACNgLYBgsgAyADKAKwBjYClANBfyEEIANBfzYCmAMgAyAFQQFrNgKQAyADQZwGaiADKAKkBiICIANBkANqECNFDQEgAygCpAYhAiADKAKoBgVBfwshBCAGIQULIAEgAygCxAYgAygC2AYQLiADQcAGaiAFIAMoArAGEFkgBEEASA0TIAMgBDYC2AYMEwsgBi8AASICQf8BSw0JIANCjoCAgHA3AswEIAMgAjYCyAQgA0KRpYKAkAs3A8AEAkAgA0GcBmoiBiAEIANBwARqECNFBEAgA0KOgICAcDcDsAQgAyACNgKsBCADQdkANgKoBCADQo+hgoCQAjcDoAQgBiAEIANBoARqECNFDQELAkAgAygCqAYiBUEASARAIAMoAtgGIQUMAQsgAyAFNgLYBgsgASADKALEBiAFEC4gA0HABmoiBEGUAUGTASADKAKsBkF9cUGQAUYbEA4gBCACQf8BcRAODA8LIANCjoCAgHA3ApQEIAMgAjYCkAQgA0KRgICAkAs3A4gEIANChICAgOATNwOABCADQZwGaiAEIANBgARqECMEQAJAIAMoAqgGIgVBAEgEQCADKALYBiEFDAELIAMgBTYC2AYLIAEgAygCxAYgBRAuAkAgAygCvAZBL0YEQCADQcAGakHBARAODAELIANBwAZqIgRBBBAOIAQgAygCvAYQGwsgA0HABmoiBEGVARAOIAQgAkH/AXEQDgwPCyADQo6AgIBwNwL0AyADIAI2AvADIANCkYCAgJALNwPoAyADQoGAgIDgEzcD4AMgA0GcBmogBCADQeADahAjBEACQCADKAKoBiIFQQBIBEAgAygC2AYhBQwBCyADIAU2AtgGCyABIAMoAsQGIAUQLiADQcAGaiIEIAMoArQGEM4DIARBlQEQDiAEIAJB/wFxEA4MDwsgA0KOgICAcDcD2AMgAyACNgLUAyADQdkANgLQAyADQp6BgICQAjcDyAMgA0LYtvmCcDcDwAMgA0GcBmogBCADQcADahAjBEACQCADKAKoBiIFQQBIBEAgAygC2AYhBQwBCyADIAU2AtgGCyABIAMoAsQGIAUQLiADQcAGaiIEIAMoAqwGIAMoArAGEFkgBEGVARAOIAQgAkH/AXEQDgwPCyABIAMoAsQGIAMoAtgGEC4gA0HABmpB2AAgAhBZIAQhAgwSCyAGLwABIQIgASADKALEBiADKALYBhAuIANBwAZqIAUgAhBZIAQhAgwRCyADIAYvAAEiAjYC5AQgA0F/NgLoBCADIAVBAWs2AuAEIANBnAZqIAQgA0HgBGoQIwRAAkAgAygCqAYiBEEASARAIAMoAtgGIQQMAQsgAyAENgLYBgsgASADKALEBiAEEC4gA0HABmogBUEBaiACEFkMDQsgASADKALEBiADKALYBhAuIANBwAZqIAUgAhBZIAQhAgwQCyABIAogCCAEIANB2AZqEKUCIQQMBgsgASgC1AIhCyABKALMAiEGQQAhCUEAIQgDQAJAIAkgC0gEQEEDIQogBigCACICQeoAa0EDTwRAIAJB7QFHDQJBASEKCwJAIAEoAqQCIAYoAgxBFGxqKAIMIAYoAggiBWsiBEGAf0ggBCAKQf8AakpyRQRAIAZBATYCBCACQe0BRgRAQewBIQIgBkHsATYCAAwCCyAGIAJBgAFqIgI2AgAMAQsgAkHsAEcgBEGAgAJqQf//A0tyDQIgBkLtgYCAIDcCAEECIQpB7QEhAgsgAygCwAYgBWpBAWsgAjoAACAGKAIEIgIgAygCwAYgBWpqIgQgBCAKaiADKALEBiAFIApqIAJqaxCrASADIAMoAsQGIAprNgLEBkEAIQQgASgCrAIiAkEAIAJBAEobIQcgASgCpAIhAgNAIAQgB0YEQCABKALUAiELIAYhByAJIQQDQAJAIAsgBEEBaiIETARAQQAhAiABKALgAiIEQQAgBEEAShshBANAIAIgBEYNAiAFIAEoAtgCIAJBA3RqIgcoAgAiDEkEQCAHIAwgCms2AgALIAJBAWohAgwACwALIAciAkEQaiEHIAIoAhgiDCAFTA0BIAIgDCAKazYCGAwBCwsgCEEBaiEIDAMLIAUgAigCDCILSARAIAIgCyAKazYCDAsgAkEUaiECIARBAWohBAwACwALIAEoAswCIQIgCARAQQAhBQNAIAUgC0gEQCABKAKkAiACKAIMQRRsaigCDCACKAIIIgRrIQYCQAJAAkACQCACKAIEQQFrDgQAAQMCAwsgAygCwAYgBGogBjoAACABKALUAiELDAILIAMoAsAGIARqIAY7AAAMAQsgAygCwAYgBGogBjYAAAsgAkEQaiECIAVBAWohBQwBCwsgASgCzAIhAgsgACgCECIEQRBqIAIgBCgCBBEAACABQQA2AswCIAAoAhAiAkEQaiABKAKkAiACKAIEEQAAIAFBADYCpAIgASgC2AIhAgJAIAEtAG5BAnEEQCACIQUMAQtBACEFIAJFDQAgASgC8AIhByABKAIAIAFB9AJqIggQgwJBACECQQAhCgNAIAEoAtgCIQUgAiABKALgAk4NAQJAIAUgAkEDdGoiBigCBCIEQQBIIAQgB0ZyDQAgBigCACIGIAprIgVBAEgNAAJAIAQgB2siB0EBaiIKQQRLIAVBMktyRQRAIAggCiAFQQVsakEBakH/AXEQDgwBCyAIQQAQDiAIIAUQsQUgCCAHQQF0IAdBH3VzELEFCyAGIQogBCEHCyACQQFqIQIMAAsACyAAKAIQIgJBEGogBSACKAIEEQAAIAFBADYC2AIgDRCJASANIAMpAtAGNwIQIA0gAykCyAY3AgggDSADKQLABjcCACABQQE2AqACIAEoAowCBEAgABBwDCALIAEoAoACIQcgAyABKAKEAiIENgKcBiADIAAgBEEBdBAkIgY2AqQGIAZFDR9BACECIARBACAEQQBKGyEFA0AgAiAFRwRAIAYgAkEBdGpB//8DOwEAIAJBAWohAgwBCwsgA0EANgKsBiADIAAgBEECdBAkIgI2AqgGAkAgAkUNACADQgA3ArAGIANBADYCoAYgACADQZwGakEAQQBBAEF/ELABDQADQCADKAKsBiECAkACQAJAIAMoArAGIgRBAEoEQCADIARBAWsiBDYCsAYgByACIARBAnRq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IAIgCTYCSCACIAo2AkQgAkHBAEHQACAHQQxIGzYCTCACIAdBC2pBDG9BAWo2AkAgAkGQAmogA2pBwAAgA2tB5vQAIAJBQGsQSCADaiEDCyAAIAJBkAJqIAMQ6gEhEQsgAkHQAmokACARCzcCA38BfiMAQRBrIgAkACAAEI0GIAApAwAhAyAAKAIIIQIgAEEQaiQAIAJB6AdtrCADQugHfnwLhwEBAXwgACADKQMAEKgBIgJFBEBCgICAgOAADwsgAhAHIQQgACACEDEgBL0iAQJ/IASZRAAAAAAAAOBBYwRAIASqDAELQYCAgIB4CyIAt71RBEAgAK0PC0KAgICAwH4gAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwvxAQIGfwF+IABBCBAkIgRFBEBBfw8LIARCATcCACACpyEGIAJCIIinQXVJIQgDQAJAAkAgA0ECRg0AIAAgACkDMCADQS5yEEciCUKAgICAcINCgICAgOAAUgRAIABBEBAkIgUNAiAAIAkQDAtBfyEHIANFDQAgACABKQMAEAwLIAAoAhAgBBD/BCAHDwsgBCAEKAIAQQFqNgIAIAUgBDYCCCAIRQRAIAYgBigCAEEBajYCAAsgBSACNwMAIAlCgICAgHBaBEAgCacgBTYCIAsgACAJQS9BARCYAyABIANBA3RqIAk3AwAgA0EBaiEDDAALAAt/AQV/IABBEGohBCABQQxqIQUgASgCECECA0AgAiAFRkUEQCACKAIEIQYgACACKQMQECEgACACKQMYECEgACACKQMgECEgACACKQMoECEgBCACIAAoAgQRAAAgBiECDAELCyABKAIIIgMEQCAAIAMQzgELIAQgASAAKAIEEQAAC+EDAgR/An4jAEFAaiICJAAgAiAAIAEQsQIiBjcDOAJAAkAgASgCIARAIAZCgICAgHCDQoCAgIDgAFENASAAIAEpAyhCgICAgDBBASACQThqEBwhBiAAIAIpAzgQDCAAIAYQDAwCCyACIAEoAmRBCGsiAykDADcDKCADQoCAgIAwNwMAIAAgBhAMQQAhAyAAIAApA1AgACACQShqQQAQ3gEhBiAAIAIpAygQDCAGQoCAgIBwg0KAgICA4ABRDQADQAJAIANBAkcEQCACQRBqIANBA3RqIAAgACkDMCADQTFqEEciBzcD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aiIGKAIEIAJBABARIgNCgICAgHCDQoCAgIDgAFENAyAGKAIEIQYCfyAEBEAgACABIAYgAxA5DAELIAAgASAGIANBBxAVC0EASA0DCyAFQQFqIQUMAQsLIAAgCCALEFtBACEJDAELIAAgCCALEFsLIAdBMGokACAJC6YBAQF+AkACQAJ+IARBBHEEQEEpIQIgACABEEoMAQtBKCECIAAgARAgCyIBQoCAgIBwg0KAgICA4ABRDQAgACACEIYBIgVCgICAgHCDQoCAgIDgAFENACAAQRAQJCICBEAgAkEANgIMIAIgBEEDcTYCCCACIAE3AwAgBUKAgICAcFQNAiAFpyACNgIgDAILIAAgBRAMCyAAIAEQDEKAgICA4AAPCyAFC8QBAQR/IAGnIgUgAjYCICAFQgA3AiQCQCACKAI8IgZFDQACQCAAIAZBAnQQXCIIRQ0AIAUgCDYCJEEAIQUDQCAFIAIoAjxODQIgAigCJCAFQQN0aiIHLwECIQYCQCAHLQAAIgdBAXEEQCAAIAQgBiAHQQF2QQFxEP8DIgYNAQwDCyADIAZBAnRqKAIAIgYgBigCAEEBajYCAAsgCCAFQQJ0aiAGNgIAIAVBAWohBQwACwALIAAgARAMQoCAgIDgACEBCyABC4IBAQJ+IAAgARApIQICQCABQQBIDQAgACgCECgCOCABQQJ0aigCACkCBCIDp0GAgICAeEYgA0KAgICA8P///z+DUCADQv//////////v39WcSADQoCAgICAgICAQINCgICAgICAgICAf1FyRXINACAAQa/wACACQa3wABCyASECCyACC2QBAn8CQAJAIAFCgICAgHBUDQAgARCUBQ0AQX8hAyAAIAIQMCIERQ0BIAAgBBDEBSECIAAgBBAQIAJCgICAgHCDQoCAgIDgAFENASAAIAFBNyACQQEQFUEASA0BC0EAIQMLIAMLNQACQCACRSABQoCAgIBwVHINACABEJQFDQAgACABQTcgACACEClBARAVQQBODQBBfw8LQQALDAAgACABQbYVELUBC2gCAX8BfgJAIAAgAUHqACABQQAQESIEQoCAgIBwg0KAgICA4ABSBEAgACAEECchAyAAIAFBwQAgAUEAEBEiAUKAgICAcINCgICAgOAAUg0BC0EAIQNCgICAgOAAIQELIAIgAzYCACABCxQBAn4gACABECAhAyAAIAEQDCADC/sBAgR/AX4gACgCyAEiBSgCECIEQTBqIQYgBCAEKAIYIAFxQX9zQQJ0aigCACEEAkADQCAERQ0BIAEgBiAEQQFrIgdBA3RqIgQoAgRHBEAgBCgCAEH///8fcSEEDAELCyAFKAIUIAdBA3RqIQUCQCADQQFGDQAgBTUCBEIghkKAgICAwABRBEAgACACEAwgACAEKAIEENEBQX8PCyAELQADQQhxDQAgACACEAwgAEGAgAEgARDnAQ8LIAAgBSACEB1BAA8LIAAgACkDwAEiCCABIAIgCAJ/IAAoAhAoAowBIgMEQEGAgAYgAygCKEEBcQ0BGgtBgIACCxDQAQuKAQEBfwJAIAJCgICAgHCDQoCAgICQf1EgA0KAgICAcINCgICAgJB/UXFFBEAgAEGl5gBBABASDAELIAAgAUESEF4iAUKAgICAcINCgICAgOAAUQ0AIAGnIgQgAz4CJCAEIAI+AiAgACABQdYAQgBBAhAVGiABDwsgACADEAwgACACEAxCgICAgOAACw0AIAAgAUHMjQEQgQMLZwEBfwJAIAFBAE4EQCAAKAIQIgIoAiwgAU0NASACKAI4IAFBAnRqKAIAIgEgASgCAEEBajYCACAAIAFBBBDmAw8LQYaJAUGo7ABB1RdBycAAEAAAC0GQzgBBqOwAQdYXQcnAABAAAAuxAgEEfwJAAkACQAJAIAJCgICAgHBUDQAgAqciAy8BBhDgAUUNACADKAIoIgRFDQAgBCgCECIDQTBqIQUgAyADKAIYQX9zQQJ0QdR5cmooAgAhAwNAIANFDQMgBSADQQFrIgNBA3RqIgYoAgRBygFHBEAgBigCAEH///8fcSEDDAELCyABQoCAgIBwVA0AIAQoAhQgA0EDdGopAwAiAkKAgICAcINCgICAgIB/UQ0BCyAAECIMAgsgACACEIgCIQMgAacoAhAiAEEwaiEEIAAgAyAAKAIYcUF/c0ECdGooAgAhAANAIABFBEBBAA8LIAQgAEEDdGoiBUEIayEAIAMgBUEEaygCAEYEQCAAQQBHDwUgACgCAEH///8fcSEADAELAAsACyAAQZ3kAEEAEBILQX8LRAEBfyAAQeQBaiECIABB4AFqIQADfyAAIAIoAgAiAkYEQEEADwsgASACQQRrKAIARgR/IAJBCGsFIAJBBGohAgwBCwsLiQECA38BfgJAIAAoAhAoAowBIgJFDQADQCABQQBMBEADQCACKQMIIgRCgICAgHBUDQMgBKciAS8BBhDgAUUNAyABKAIgIgEvABEiA0GAwABxRQRAIANBgAhxRQ0EIAAgASgCQBAWDwsgAigCACICDQAMAwsACyABQQFrIQEgAigCACICDQALC0EACykBAX8gAkIgiKdBdU8EQCACpyIDIAMoAgBBAWo2AgALIAAgASACEIUEC/QBAwF+An8BfANAAkBBfyEEAkACQAJAQQcgAkIgiKciBSAFQQdrQW5JGw4IAAAAAAICAwECCyACxCEDQQAhBAwCC0EAIQQgAkKAgICAwIGA/P8AfCICQv///////////wCDQoCAgICAgID4/wBWDQFCgICAgICAgICAfyEDIAK/IgZEAAAAAAAA4MNjDQFC////////////ACEDIAZEAAAAAAAA4ENkDQEgBplEAAAAAAAA4ENjBEAgBrAhAwwCC0KAgICAgICAgIB/IQMMAQsgACACEJYBIgJCgICAgHCDQoCAgIDgAFINAQsLIAEgAzcDACAEC+YBAgN/AXwDQAJAQX8hBAJAAkACQEEHIAJCIIinIgUgBUEHa0FuSRsOCAAAAAACAgMBAgsgAqchA0EAIQQMAgtBACEEIAJCgICAgMCBgPz/AHwiAkL///////////8Ag0KAgICAgICA+P8AVgRADAILQYCAgIB4IQMgAr8iBkQAAAAAAADgwWMNAUH/////ByEDIAZEAADA////30FkDQEgBplEAAAAAAAA4EFjBEAgBqohAwwCC0GAgICAeCEDDAELIAAgAhCWASICQoCAgIBwg0KAgICA4ABSDQELCyABIAM2AgAgBAttAAJAAkACQAJAAkAgAkEEdkEDcUEBaw4DAAECAwsgASgCACICBEAgACACrUKAgICAcIQQIQsgASgCBCIBRQ0DIAAgAa1CgICAgHCEECEPCyAAIAEoAgAQ5QEPCyABEOAFDwsgACABKQMAECELC/UBAQl/QX8hAiABIAFBAWtxRQRAIABBEGoiCCABQQJ0IgMgACgCABEDACIFBH8gBUEAIAMQLCEGIAFB/////wNqQf////8DcSEJIAAoAjQhBwNAIAQgACgCJE9FBEAgByAEQQJ0aigCACECA0AgAgRAIAAoAjggAkECdGooAgAiAygC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QQpPBH8gAEHBAGsgA00EQCAAQTdrDwsgAiAAQdcAayAAQeEAayABTxsFIAQLC6IDAQJ/IAAgASgCBBAQA0AgASgCECEDIAIgASgCFE5FBEAgACADIAJBA3RqKAIAEBAgAkEBaiECDAELCyAAKAIQIgJBEGogAyACKAIEEQAAQQAhAgNAAkAgASgCHCEDIAIgASgCIE4NACADIAJBFGxqIgMoAghFBEAgACgCECADKAIEEOUBCyAAIAMoAhAQECAAIAMoAgwQECACQQFqIQIMAQsLIAAoAhAiAkEQaiADIAIoAgQRAAAgACgCECICQRBqIAEoAiggAigCBBEAAEEAIQIDQCABKAI0IQMgAiABKAI4TkUEQCAAIAMgAkEMbGooAgQQECACQQFqIQIMAQsLIAAoAhAiAkEQaiADIAIoAgQRAAAgACgCECICQRBqIAEoAmQgAigCBBEAACAAIAEpA0AQDCAAIAEpA0gQDCAAIAEpA6gBEAwgACABKQOwARAMIAAgASkDiAEQDCAAIAEpA5ABEAwgACABKQOYARAMIAEoAggiAiABKAIMIgM2AgQgAyACNgIAIAFCADcCCCAAKAIQIgBBEGogASAAKAIEEQAAC9IDAgJ+An8jAEEgayIEJAACQCABQv///////////wCDIgNCgICAgICAwIA8fSADQoCAgICAgMD/wwB9VARAIAFCBIYgAEI8iIQhAyAAQv//////////D4MiAEKBgICAgICAgAhaBEAgA0KBgICAgICAgMAAfCECDAILIANCgICAgICAgIBAfSECIABCgICAgICAgIAIUg0BIAIgA0IBg3whAgwBCyAAUCADQoCAgICAgMD//wBUIANCgICAgICAwP//AFEbRQRAIAFCBIYgAEI8iIRC/////////wODQoCAgICAgID8/wCEIQIMAQtCgICAgICAgPj/ACECIANC////////v//DAFYNAEIAIQIgA0IwiKciBUGR9wBJDQAgBEEQaiAAIAFC////////P4NCgICAgICAwACEIgIgBUGB9wBrEGIgBCAAIAJBgfgAIAVrEI0CIAQpAwhCBIYgBCkDACIAQjyIhCECIAQpAxAgBCkDGIRCAFKtIABC//////////8Pg4QiAEKBgICAgICAgAhaBEAgAkIBfCECDAELIABCgICAgICAgIAIUg0AIAJCAYMgAnwhAgsgBEEgaiQAIAIgAUKAgICAgICAgIB/g4S/C6oPAgV/D34jAEHQAmsiBSQAIARC////////P4MhCiACQv///////z+DIQsgAiAEhUKAgICAgICAgIB/gyEMIARCMIinQf//AXEhCAJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAhB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiDUKAgICAgIDA//8AVCANQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQwMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhDCADIQEMAgsgASANQoCAgICAgMD//wCFhFAEQCADIAJCgICAgICAwP//AIWEUARAQgAhAUKAgICAgIDg//8AIQwMAwsgDEKAgICAgIDA//8AhCEMQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAQgAhAQwCCyABIA2EUARAQoCAgICAgOD//wAgDCACIAOEUBshDEIAIQEMAgsgAiADhFAEQCAMQoCAgICAgMD//wCEIQxCACEBDAILIA1C////////P1gEQCAFQcACaiABIAsgASALIAtQIgYbeSAGQQZ0rXynIgZBD2sQYkEQIAZrIQYgBSkDyAIhCyAFKQPAAiEBCyACQv///////z9WDQAgBUGwAmogAyAKIAMgCiAKUCIHG3kgB0EGdK18pyIHQQ9rEGIgBiAHakEQayEGIAUpA7gCIQogBSkDsAIhAwsgBUGgAmogCkKAgICAgIDAAIQiEkIPhiADQjGIhCICQgBCgICAgLDmvIL1ACACfSIEQgAQYSAFQZACakIAIAUpA6gCfUIAIARCABBhIAVBgAJqIAUpA5gCQgGGIAUpA5ACQj+IhCIEQgAgAkIAEGEgBUHwAWogBEIAQgAgBSkDiAJ9QgAQYSAFQeABaiAFKQP4AUIBhiAFKQPwAUI/iIQiBEIAIAJCABBhIAVB0AFqIARCAEIAIAUpA+gBfUIAEGEgBUHAAWogBSkD2AFCAYYgBSkD0AFCP4iEIgRCACACQgAQYSAFQbABaiAEQgBCACAFKQPIAX1CABBhIAVBoAFqIAJCACAFKQO4AUIBhiAFKQOwAUI/iIRCAX0iAkIA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IAUgA0E5ShshAwJAIBdCB1cEQCADIAdBBHRqIQcMAQsgF0IcWARAIAJBMGogAxB4IAJBIGogHCAYQgBCgICAgICAwP0/ECsgAkEQaiACKQMwIAIpAzggAikDICIcIAIpAygiGBArIAIgAikDECACKQMYIBkgGxBvIAIpAwghGyACKQMAIRkMAQsgA0UgCHINACACQdAAaiAcIBhCAEKAgICAgICA/z8QKyACQUBrIAIpA1AgAikDWCAZIBsQbyACKQNIIRtBASEIIAIpA0AhGQsgF0IBfCEXQQEhCQsgACgCBCIDIAAoAmhHBH8gACADQQFqNgIEIAMtAAAFIAAQTwshAwwBCwsCfiAJRQRAIAApA3BCAFkEQAJAIAAgACgCBCIDQQFrNgIEIAAgA0ECazYCBCABRQ0AIAAgA0EDazYCBAsLIAJB4ABqIAS3RAAAAAAAAAAAohCpASACKQNgIRkgAikDaAwBCyAXQgdXBEAgFyEYA0AgB0EEdCEHIBhCAXwiGEIIUg0ACwsCQAJAAkAgA0FfcUHQAEYEQCAAEIEGIhhCgICAgICAgICAf1INAyAAKQNwQgBZDQEMAgtCACEYIAApA3BCAFMNAgsgACAAKAIEQQFrNgIEC0IAIRgLIAdFBEAgAkHwAGogBLdEAAAAAAAAAACiEKkBIAIpA3AhGSACKQN4DAELIBogFyABG0IChiAYfEIgfSIXQQAgD2utVQRAQcTUBEHEADYCACACQaABaiAEEHggAkGQAWogAikDoAEgAikDqAFCf0L///////+///8AECsgAkGAAWogAikDkAEgAikDmAFCf0L///////+///8AECsgAikDgAEhGSACKQOIAQwBCyAPQeIBa6wgF1cEQCAHQQBOBEADQCACQaADaiAZIBtCAEKAgICAgIDA/79/EG8gGSAbQoCAgICAgID/PxD1BSEAIAJBkANqIBkgGyACKQOgAyAZIABBAE4iABsgAikDqAMgGyAAGxBvIBdCAX0hFyACKQOYAyEbIAIpA5ADIRkgB0EBdCAAciIHQQBODQALCwJ+IBcgD6x9QiB8IhinIgBBACAAQQBKGyANIBggDa1TGyIAQfEATgRAIAJBgANqIAQQeCACKQOIAyEaIAIpA4ADIRxCAAwBCyACQeACakQAAAAAAADwP0GQASAAaxDVARCpASACQdAC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QQFqNgIEIAEtAAAMAQsgABBPC0Ewa0EKSQ0ACwsgACkDcEIAWQRAIAAgACgCBEEBazYCBAtCACAFfSAFIAMbIQUMAQtCgICAgICAgICAfyEFIAApA3BCAFMNACAAIAAoAgRBAWs2AgRCgICAgICAgICAfw8LIAULygYCBX8EfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABDrAUUNAAJ/IARC////////P4MhCwJ/IARCMIinQf//AXEiBkH//wFHBEBBBCAGDQEaQQJBAyADIAuEUBsMAgsgAyALhFALCyEJIAJCMIinIghB//8BcSIHQf//AUYNACAJDQELIAVBEGogASACIAMgBBArIAUgBSkDECICIAUpAxgiASACIAEQ9AUgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCyADIARC////////////AIMiChDrAUEATARAIAEgCyADIAoQ6wEEQCABIQQMAgsgBUHwAGogASACQgBCABArIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEGIAcEfiABBSAFQeAAaiABIAtCAEKAgICAgIDAu8AAECsgBSkDaCILQjCIp0H4AGshByAFKQNgCyEEIAZFBEAgBUHQAGogAyAKQgBCgICAgICAwLvAABArIAUpA1giCkIwiKdB+ABrIQYgBSkDUCEDCyAKQv///////z+DQoCAgICAgMAAhCEMIAtC////////P4NCgICAgICAwACEIQsgBiAHSARAA0ACfiALIAx9IAMgBFatfSIKQgBZBEAgCiAEIAN9IgSEUARAIAVBIGogASACQgBCABArIAUpAyghAiAFKQMgIQQMBQsgCkIBhiAEQj+IhAwBCyALQgGGIARCP4iECyELIARCAYYhBCAHQQFrIgcgBkoNAAsgBiEHCwJAIAsgDH0gAyAEVq19IgpCAFMEQCALIQoMAQsgCiAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAECsgBSkDOCECIAUpAzAhBAwBCyAKQv///////z9YBEADQCAEQj+IIQ0gB0EBayEHIARCAYYhBCANIApCAYaEIgpCgICAgICAwABUDQALCyAIQYCAAnEhBiAHQQBMBEAgBUFAayAEIApC////////P4MgB0H4AGogBnKtQjCGhEIAQoCAgICAgMDDPxAr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6e0AQdjsAEHUIUGzxAAQAAALCyAFQQxqEBkgBUEgaiQAQRALrwEBAn8jAEEgayIEJAAgACgCACEFIARBCGogA0EAEO0BIAAgASAEKAIIIgEgAUEfdSIBcyABayIBIAJBwAAgAUEBa2dBAXRrQQAgAUECTxtqQQhqIgJB4A8QrwMhASADKAIEBEAgBEIANwIYIARCgICAgICAgICAfzcCECAEIAU2AgwgBEEMaiIDQgEQMhogACADIAAgAkHgDxCIASABciEBIAMQGQsgBEEgaiQAIAELkAYCCH8BfiMAQfAAayIDJAAgACABRwRAIAAoAgAhBCADQgA3AmggA0KAgICAgICAgIB/NwJgIAMgBDYCXCADQdwAaiIFIAEQSRogA0IANwJUIANCgICAgICAgICAfzcCTCADIAQ2AkggAygCZCEGIANBADYCZCADQcgAaiIBQqrVqtUKEDIaIANBADYCUCAFIAEQrAIEQCADIAMoAmRBAWo2AmQgBkEBayEGCyADQcgAahAZIAJBAWpBAXYQuQQhBSADQgA3AlQgA0KAgICAgICAgIB/NwJMIAMgBDYCSCADQgA3AkAgA0KAgICAgICAgIB/NwI4IAMgBDYCNCADQdwAaiIBIAFCf0H/////A0EAEHoaIAVBACAFQQBKGyEJIAIgBWogAiAFQQF0bkEBaiIKQQF0akEgaiECQQAhAQNAIAEgCUZFBEAgA0HIAGoiByADQdwAaiIIQgEgAkEAEHoaIANBNGoiCyAHIAJBBhC1BCAHIAtCASACQQAQehogCCAIIAcgAkEAEIgBGiABQQFqIQEMAQsLIANCADcCLCADQoCAgICAgICAgH83AiQgAyAENgIgIANCADcCGCADQoCAgICAgICAgH83AhAgAyAENgIMIANBIGoiASADQdwAaiIEQgIgAkEAEHoaIAEgBCABIAJBABCIARogA0EMaiABIAEgAkEAEEAaIABCABAyGiAKrSEMA0AgDKdBAExFBEAgA0HIAGoiAUIBEDIaIANBNGoiBCAMQgGGQv7///8Pg0IBhBAyGiABIAEgBCACQQAQiAEaIAAgACABIAJBABC4ARogACAAIANBDGogAkEAEEAaIAxCAX0hDAwBCwsgACAAQgEgAkEAEHoaIAAgACADQSBqIgEgAkEAEEAaIAEQGSADQQxqEBkgA0E0ahAZ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C0KAgICAMCEFIAZCgICAgHCDQoCAgIAwUQ0DIAAgBkEBEJABGgwDC0KAgICAMCEJQoCAgIAwIQZCgICAgDAhBSAAIAQQICIHQoCAgIBwg0KAgICA4ABRDQILIAAgDUEIaiAHEC9BAEgNACANAn4gDSkDCCIEQoCAgIAIfEL/////D1gEQCAEQv////8PgwwBC0KAgICAwH4gBLm9IgVCgICAgMCBgPz/AH0gBUL///////////8Ag0KAgICAgICA+P8AVhsLIgg3AyAgACABQQEgDUEgahC/AyEFIAAgCBAMAkAgBUKAgICAcINCgICAgOAAUQ0AQgAhCCAEQgAgBEIAVRshDANAIAggDFENBCAAIAcgCBBsIgRCgICAgHCDQoCAgIDgAFENAQJAIA4EQCAEIQEMAQsgDSAENwMgIA0gCEL/////D4M3AyggACAKIAtBAiANQSBqEBwhASAAIAQQDCABQoCAgIBwg0KAgICA4ABRDQILIAAgBSAIIAEQeyERIAhCAXwhCCARQQBODQALCwwBC0KAgICAMCEFCyAAIAUQDEKAgICA4AAhBQsgACAHEAwgACAGEAwgACAJEAwgDUEwaiQAIAULDwAgACsDACABKwMAEMQECzkBAX5CgICAgMB+IAEpAwAiAkKAgICAwIGA/P8AfSACQv///////////wCDQoCAgICAgID4/wBWGwsRACAAKgIAuyABKgIAuxDEBAs7AQF+QoCAgIDAfiABKgIAu70iAkKAgICAwIGA/P8AfSACQv///////////wCDQoCAgICAgID4/wBWGwsZAQJ+IAEpAwAiAyAAKQMAIgRUIAMgBFZrCwwAIAAgASkDABCIBAsZAQJ+IAEpAwAiAyAAKQMAIgRTIAMgBFVrCwwAIAAgASkDABC/AgsXACABKAIAIgEgACgCACIASSAAIAFJaws9AQF+IAEoAgAiAEEATgRAIACtDwtCgICAgMB+IAC4vSICQoCAgIDAgYD8/wB9IAJCgICAgICAgPj/AFYbC9sFAwV/A34BfCMAQUBqIgUkAAJAAnwCQAJAAkACQAJAIAJBACABQoCAgIBwgyILQoCAgIAwUhsiAg4CAgABCwJAIAMpAwAiCUKAgICAcFQNACAJpyIELwEGQQpHDQAgBCkDICIKQiCIpyIEQQAgBEELakESSRsNACAAIAUg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IQULIAJBEGokACAFCx0AIAAgAUEAEGsiAEUEQEKAgICA4AAPCyAANQIoCz0BAX5CgICAgBAhASADKQMAIgRCgICAgHBaBH4gBKcvAQZBFWtB//8DcUEMSa1CgICAgBCEBUKAgICAEAsL7gMCBX4CfyMAQSBrIgokAEKAgICA4AAhBQJAIAAgASAEEFoiC0UNACALLQAEBEAgABBfDAELIAAgCkEYaiADKQMAQgAgCzQCACIGIAYQZg0AIAogBjcDECADKQMIIgdCgICAgHCDQoCAgIAwUgRAIAAgCkEQaiAHQgAgBiAGEGYNASAKKQMQIQYLIAopAxghCSAAIAFCgICAgDAQ/QEiB0KAgICAcIMiBUKAgICA4ABRBEAgByEFDAELIAYgCX0iBkIAIAZCAFUbIQgCQCAFQoCAgIAwUQRAIABCgICAgDAgCCAEEOUDIQUMAQsgCiAGQv////8HVwR+IAhC/////w+DBUKAgICAwH4gCLm9IgVCgICAgMCBgPz/AH0gBUL///////////8Ag0KAgICAgICA+P8AVhsLNwMIIAAgB0EBIApBCGoQowEhBSAAIAcQDCAAIAopAwgQDAsgBUKAgICAcINCgICAgOAAUQ0AAkAgACAFIAQQWiICRQ0AIAAgBSABEE0EQCAAQco0QQAQEgwBCwJAIAItAAQNACACNAIAIAhTBEAgAEHOwgBBABASDAILIAstAAQNACACKAIIIAsoAgggCadqIAinEB4aDAILIAAQXwsgACAFEAxCgICAgOAAIQULIApBIGokACAFC1EAIAAgASACEFoiAEUEQEKAgICA4AAPCyAAKAIAIgBBAE4EQCAArQ8LQoCAgIDAfiAAuL0iAUKAgICAwIGA/P8AfSABQoCAgICAgID4/wBWGwv/AwICfwF+AkACQAJAAkACQAJAIAFCgICAgHBaBEAgAaciAi8BBkErRg0BCyAEQQE2AgAMAQsgAigCICEGIARBATYCACAGDQELIABBsS1BABASDAELIAYoAgQhAgJAAkACQAJ/AkACQAJAAkAgBigCACIHQQFrDgQCAgcBAAsgBUUNAiAAIAYQyQQLQoCAgIAwIQEgBUEBaw4CAwQHCyADKQMAIgFCIIinQXVPBEAgAaciAyADKAIAQQFqNgIACwJAIAVBAkcNAEEBIQMgB0EBRw0AIAAgARCYASAGKAIEDAILIAIoAmQiAyAFrTcDACADQQhrIAE3AwAgAiADQQhqNgJkC0EAIQMgAgsiBSADNgIcIAZBAzYCACAAIAUQsQIhASAGQQE2AgAgBigCBCgCIARAIAAgBhDJBCABDwsgAUKAgICAEFoNBSACKAJkQQhrIgApAwAhCCAAQoCAgIAwNwMAIAFCAlEEQCAGQQI2AgAgBEECNgIAIAgPCyAEQQA2AgAgCA8LIAMpAwAiAUIgiKdBdUkNAyABpyIAIAAoAgBBAWo2AgAgAQ8LIAMpAwAiAUIgiKdBdU8EQCABpyICIAIoAgBBAWo2AgALIAAgARCYAQwBCyAAQY8tQQAQEgtCgICAgOAAIQELIAEPC0HW8QBBqOwAQaCUAUHEFBAAAAt3AQF+IAMpAwAiAUKAgICAcINCgICAgIB/UgRAIABBkcEAQQAQEkKAgICA4AAPC0KAgICAMCEEIAGnIgApAgRCgICAgICAgIBAg0KAgICAgICAgIB/UQR+IAAgACgCAEEBajYCACABQoCAgICQf4QFQoCAgIAwCws8AQF+QoCAgIDgACEBIAAgAykDABAlIgRCgICAgHCDQoCAgIDgAFIEfiAAIASnQQIQ5gMFQoCAgIDgAAsLVgIBfgF/IAAgARC7AyIBQoCAgIBwg0KAgICA4ABRBEAgAQ8LQoCAgIAwIQIgAaciAygCBEGAgICAeEcEQCAAIAAoAhAgAxDGAhApIQILIAAgARAMIAILCQAgACABELsDC1sBAX4jAEEQayICJAAgAiAAIAEQuwMiATcDCAJAIAFCgICAgHCDQoCAgIDgAFEEQCABIQQMAQsgAEKAgICAMEEBIAJBCGoQygQhBCAAIAEQDAsgAkEQaiQAIAQLLQBCgICAgOAAIAAgAykDACADKQMIQQAQiQIiAEEAR61CgICAgBCEIABBAEgbC6ABAQN+IAMpAwAiBSEEIAJBBE4EQCADKQMYIQQLIAVC/////29YBEAgABAiQoCAgIDgAA8LIAMpAxAhAUKAgICA4AAhBgJAIAAgAykDCBAwIgJFDQAgAUIgiKdBdU8EQCABpyIDIAMoAgBBAWo2AgALIAAgBSACIAEgBEEAENABIQMgACACEBAgA0EASA0AIANBAEetQoCAgIAQhCEGCyAGCyoAIAMpAwAiAUL/////b1gEQCAAECJCgICAgOAADwsgACABQQNBABCyAgtjAQF+IAMpAwAiBEL/////b1gEQCAAECJCgICAgOAADwtCgICAgOAAIQECQCAAIAMpAwgQMCICRQ0AIAAgBCACEG4hAyAAIAIQECADQQBIDQAgA0EAR61CgICAgBCEIQELIAELYwEDfgJAAkAgAykDACIBQv////9vWARAIAAQIgwBCyADKQMIIQUgASEEIAJBA04EQCADKQMQIQQLIAAgBRAwIgINAQtCgICAgOAADwsgACABIAIgBEEAEBEhBiAAIAIQECAGC2YBAX4gAykDACIEQv////9vWARAIAAQIkKAgICA4AAPC0KAgICA4AAhAQJAIAAgAykDCBAwIgJFDQAgACAEIAJBABDNASEDIAAgAhAQIANBAEgNACADQQBHrUKAgICAEIQhAQsgAQuaAQIBfwJ+IwBBEGsiBCQAIAMpAwghBSADKQMAIgYhAQJAAkACQAJAIAJBA0gNACADKQMQIgFCgICAgHBaBEAgAactAAVBEHENAQsgAEGdLEEAEBIMAQsgACAEQQxqIAUQ/QMiAg0BC0KAgICA4AAhAQwBCyAAIAYgASAEKAIMIgMgAhD+AiEBIAAgAiADEIYDCyAEQRBqJAAgAQt5AQF/IAFCgICAgHCDQoCAgIAwUgRAIABBnSxBABASQoCAgIDgAA8LAn4CQCACRQ0AIAMpAwAiAUKAgICAcINCgICAgDBRDQBCgICAgOAAIAAgARAlIgFCgICAgHCDQoCAgIDgAFENARogAachBAsgACAEQQMQ5gMLCxUAIAAgAykDACADIANBCGpBAhCIAws3ACMAQRBrIgIkACAAIAJBDGogAykDABB1IQAgAigCDCEDIAJBEGokAEKAgICA4AAgA2etIAAbC04AIwBBEGsiAiQAQoCAgIDgACEBAkAgACACQQxqIAMpAwAQdQ0AIAAgAkEIaiADKQMIEHUNACACKAIIIAIoAgxsrSEBCyACQRBqJAAgAQsGACAAtrsLfwAgACAAKQPQASIBQgyIIAGFIgFCGYYgAYUiAUIbiCABhSIBNwPQAUKAgICAwH4gAUKdurP7lJL9oiV+QgyIQoCAgICAgID4P4S/RAAAAAAAAPC/oL0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwuIBAMFfAV/AX4jAEEQayIKJAAgCkIANwMIAkACQCACQQBMDQBCgICAgOAAIQEgACAKQQhqIAMpAwAQQg0BQQEhCyAKKwMIIQQgAkEBRwRAA0AgAiALRg0CIAAgCiADIAtBA3RqKQMAEEINAyALQQFqIQsgCisDACEFIwBBIGsiCSQAAkAgBJkiByAFmSIGIAe9IAa9VCIMGyIEvSIOQjSIpyINQf8PRg0AIAYgByAMGyEFAkAgDlANACAFvUI0iKciDEH/D0YNACAMIA1rQcEATgRAIAcgBqAhBAwCCwJ8IAxB/gtPBEAgBEQAAAAAAAAwFKIhBCAFRAAAAAAAADAUoiEFRAAAAAAAALBrDAELRAAAAAAAAPA/IA1BvARLDQAaIAREAAAAAAAAsGuiIQQgBUQAAAAAAACwa6IhBUQAAAAAAAAwFAshCCAJQRhqIAlBEGogBRCIBiAJQQhqIAkgBBCIBiAIIAkrAwAgCSsDEKAgCSsDCKAgCSsDGKCfoiEEDAELIAUhBAsgCUEgaiQADAALAAsgBJkhBAsgBL0iAQJ/IASZRAAAAAAAAOBBYwRAIASqDAELQYCAgIB4CyIAt71RBEAgAK0hAQwBC0KAgICAwH4gAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGyEBCyAKQRBqJAAgAQtOACAAIABEAAAAAAAA8L9EAAAAAAAA8D8gAEQAAAAAAAAAAGMbIAC9Qv///////////wCDQoCAgICAgID4/wBWGyAARAAAAAAAAAAAYRsLgwECAn4BfyAAvSIBQjSIp0H/D3EiA0H+B00EQCABQoCAgICAgICAgH+DIQIgA0H+B0cgAUKAgICAgICA8L9/UXJFBEAgAkKAgICAgICA+D+Evw8LIAK/DwsgA0GyCE0EfCABQj+HIAF8QgFBswggA2uthiIBQgGIfEIAIAF9g78FIAALC4IFAwJ8BX8CfiMAQRBrIgkkAAJ+QoCAgIDA/v/7/wBCgICAgMD+/3sgBBsgAkUNABoCfCADKQMAIgFC/////w9YBEBBASACIAJBAUwbIQogAachCEEBIQcDQCAHIApHBEAgCLcgAyAHQQN0aikDACIBQoCAgIAQWg0DGiAIIAGnIgsgCCALShsgCCALIAggC0gbIAQbIQggB0EBaiEHDAELCyAIrQwCC0KAgICA4AAgACAJQQhqIAEQQg0BGkEBIQcgCSsDCAshBSAHIAIgAiAHSBshAgNAIAIgB0cEQEKAgICA4AAgACAJIAMgB0EDdGopAwAQQg0CGgJAIAW9IgxC////////////AINCgICAgICAgPj/AFYNACAJKwMAIga9IgFC////////////AINCgICAgICAgPj/AFYEQCAGIQUMAQsgBUQAAAAAAAAAAGEgBkQAAAAAAAAAAGFxIQogBARAIAoEQCABIAyDvyEFDAILIAUgBSAGpSAGvUL///////////8Ag0KAgICAgICA+P8AVhsgBiAFvUL///////////8Ag0KAgICAgICA+P8AWBshBQwBCyAKBEAgASAMhL8hBQwBCyAFIAUgBqQgBr1C////////////AINCgICAgICAgPj/AFYbIAYgBb1C////////////AINCgICAgICAgPj/AFgbIQULIAdBAWohBwwBCwsgBb0iAQJ/IAWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyIAt71RBEAgAK0MAQtCgICAgMB+IAFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLIQ0gCUEQaiQAIA0L4wECAX4CfyMAQRBrIgIkAAJAIAAgAUEpEFoiA0UEQCAEQQA2AgBCgICAgOAAIQEMAQtCgICAgDAhAQJAIAMpAwAiBkKAgICAcINCgICAgDBSBEAgAiADKAIMIgU2AgwgBSAGpyIHKAIEQf////8HcUkNASAAIAYQDCADQoCAgIAwNwMACyAEQQE2AgAMAQsgByACQQxqEMYBIQggAyACKAIMNgIMIARBADYCACAIQf//A00EQCAAIAhB//8DcRCUAyEBDAELIAAgByAFQQF0akEQakECEJIDIQELIAJBEGokACABC5EDAgN/An4jAEEgayICJABCgICAgOAAIQgCQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRDQAgACACQQhqIgVBBxA+GiAFQTwQPBogBSAEQQN0IgRB0OEBaigCACIGEIMBGiAEQdThAWooAgAiBARAIAVBIBA8GiAFIAQQgwEaIAVB2pEBEIMBGiAAIAMpAwAQSiIJQoCAgIBwg0KAgICA4ABRBEAgACABEAwgAigCCCgCECIAQRBqIAIoAgwgACgCBBEAAAwCCyAJpyIH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QdAAaiQAIAYLuAICA38DfiMAQSBrIgIkAEKAgICA4AAhBwJAAkACQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRDQAgACACIAMpAwAQ4wENACACKQMAIghCgICAgAhaBEAgAEHTGEEAEEQMAQsgCKciA0EBRg0BIAGnIgQpAgQiCaciBkH/////B3EiBUUNASAJQv////8HgyAIfkKAgICABFoEQCAAQeTIAEEAEDoMAQsgACACQQhqIAMgBWwgBkEfdhCZAw0AAkAgBUEBRwRAA0AgA0EATA0CIAJBCGogBEEAIAUQSxogA0EBayEDDAALAAsgAkEIagJ/IAQtAAdBgAFxBEAgBC8BEAwBCyAELQAQCyADEMsEGgsgACABEAwgAkEIahA3IQcMAgsgACABEAwMAQsgASEHCyACQSBqJAAgBwtYAQF+IAAgAykDABDkAUEAR61CgICAgBCEIQQgAUKAgICAcINCgICAgDBRBEAgBA8LIAAgAUEGEF4iAUKAgICAcINCgICAgOAAUgRAIAAgASAEEL0BCyABC8EBAgJ/An4jAEEQayIEJABCgICAgOAAIQYCQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRBEAgASEGDAELAkAgACAEQQxqIAMpAwAgAaciBSgCBEH/////B3EiAiACEFYNACAEIAI2AgggAykDCCIHQoCAgIBwg0KAgICAMFIEQCAAIARBCGogByACIAIQVg0BIAQoAgghAgsgACAFIAQoAgwiAyACIAMgAiADShsQjgEhBgsgACABEAwLIARBEGokACAGC8ABAgN/An4jAEEQayICJABCgICAgOAAIQcCQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRBEAgASEHDAELAkAgACACQQxqIAMpAwAgAaciBigCBEH/////B3EiBCAEEFYNACACIAQgAigCDCIFayIENgIIIAAgBiAFIAMpAwgiCEKAgICAcINCgICAgDBSBH8gACACQQhqIAggBEEAEFYNASACKAIIBSAECyAFahCOASEHCyAAIAEQDAsgAkEQaiQAIAcL0wECAn8CfiMAQRBrIgIkAEKAgICA4AAhBgJAIAAgARBKIgFCgICAgHCDQoCAgIDgAFEEQCABIQYMAQsCQCAAIAJBDGogAykDACABpyIFKAIEQf////8HcUEAEFYNACACIAUo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ABogAy0AAEEBcUUEQCADKAI4IQAgAygCNCIBBEAgASAANgI4CyAABEAgACABNgI0CyADQZjVBCgCAEYEQEGY1QQgADYCAAsgAygCYBDUASADENQBCyAMEAogDBDUAQsgB0HQAWokAAsJACAAIAEQzwQLLAAgACABEM8EIgFCgICAgHCDQoCAgIDgAFIEfiAAQQNBAiABpxsQKQUgAQsLkAECAXwBfiMAQRBrIgIkAAJ+IAMpAwAiAUIgiKciAwRAQoCAgIAQIANBC2pBEkkNARoLQoCAgIDgACAAIAJBCGogARBCDQAaIAIrAwgiBJlE////////P0NlIAS9QoCAgICAgID4/wCDQoCAgICAgID4/wBSIAScIARhcXGtQoCAgIAQhAshBSACQRBqJAAgBQsmAEKAgICA4AAgACADKQMAENkFIgBBAEetQoCAgIAQhCAAQQBIGwsvAQF+An4gAygCBCICBEBCgICAgBAiBCACQQtqQRJJDQEaCyAAIAQgAyADENIECwsvAQF+An4gAygCBCICBEBCgICAgBAiBCACQQtqQRJJDQEaCyAAIAQgAyADENMECwsJACAAIAEQngILowECAn4BfyMAQRBrIgIkAAJ+IAAgARCeAiIFQoCAgIBwg0KAgICA4ABRBEAgBQwBC0EKIQcCQAJAIAQNACADKQMAIgFCgICAgHCDQoCAgIAwUQ0AIAAgARDbBCIHQQBIDQELQoCAgIDgACAAIAJBCGogBRBtDQEaIAAgAisDCCAHQQBBABC6AgwBCyAAIAUQDEKAgICA4AALIQYgAkEQaiQAIAYLkAICAX4BfCMAQRBrIgIkAEKAgICA4AAhBAJAIAAgARCeAiIBQoCAgIBwg0KAgICA4ABRBEAgASEEDAELIAAgAiABEG0NAAJAAkAgAykDACIBQoCAgIBwg0KAgICAMFEEQCACKwMAIgW9IQEMAQsgACACQQxqIAEQswENAiACKwMAIgW9IgFCgICAgICAgPj/AINCgICAgICAgPj/AFINAQsgAEKAgICAwH4gAUKAgICAwIGA/P8AfSAFvUL///////////8Ag0KAgICAgICA+P8AVhsQNCEEDAELIAIoAgwiA0HlAGtBm39NBEAgAEHrIUEAEEQMAQsgACAFQQogA0EBELoCIQQLIAJBEGokACAEC80BAgF+AnwjAEEQayICJABCgICAgOAAIQQCQCAAIAEQngIiAUKAgICAcINCgICAgOAAUQRAIAEhBAwBCyAAIAIgARBtDQAgACACQQxqIAMpAwAQswENACACKAIMIgNB5QBPBEAgAEHrIUEAEEQMAQsgAisDACIFmSIGRFDv4tbkGktEZgRAIABCgICAgMB+IAW9QoCAgIDAgYD8/wB9IAa9QoCAgICAgID4/wBWGxA0IQQMAQsgACAFQQogA0ECELoCIQQLIAJBEGokACAEC4sCAwF+AX8BfCMAQRBrIgIkAEKAgICA4AAhBAJAIAAgARCeAiIBQoCAgIBwg0KAgICA4ABRBEAgASEEDAELIAAgAiABEG0NACAAIAJBDGogAykDABCzAQ0AIAIrAwAiBr0iAUKAgICAgICA+P8Ag0KAgICAgICA+P8AUQRAIABCgICAgMB+IAFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsQNCEEDAELAn8gAzUCBEIghkKAgICAMFEEQEEEDAELIAIoAgwiA0HlAE8EQCAAQeshQQAQRAwCCyADQQFqIQVBBQshAyAAIAZBCiAFIAMQugIhBAsgAkEQaiQAIAQLjgECAX4Cf0KAgICAMCEBAkAgAkEDa0F+SQ0AQoCAgIDgACEBIAAgAykDAEKAgICAMEKAgICAMBDyAyIEQoCAgIBwg0KAgICA4ABRBEAgBA8LIAAgBBCoASEFIAAgBBAMIAVFDQAgBSACQQJGBH8gACADKQMIEOQBBUEACxAFIAAgBRAxQoCAgIAwIQELIAELtwICAX4DfyMAQRBrIgUkACAFQQA6AA9CgICAgDAhAQJAIAJBA2tBfkkNAAJAIAAgAykDABCoASIGRQ0AAkAgAkECRw0AIAAgAykDCEKAgICAMEKAgICAMBDyAyIEQoCAgIBwg0KAgICA4ABRBEAgACAGEDEgBCEBDAMLIAAgBBCoASEHIAAgBBAMIAcNACAAIAYQMQwBCyAGIAcgBUEPahAGIQIgACAGEDEgACAHEDEgAkUNAQJAIAUtAA9FBEAgACACIAIQPUGHgAEQ8wMhAQwBC0KAgICA4AAhAQJAIABBAxCGASIEQoCAgIBwg0KAgICA4ABRBEBCgICAgCAhBAwBCyAAIARBMyAAIAIQYEEDEBUaCyAAIAQQmAELIAIQ1AEMAQtCgICAgOAAIQELIAVBEGokACABC80CAQd/IwBBIGsiBCQAIAAgAykDABAlIgFCgICAgHCDQoCAgIDgAFIEQCAAIARBCGpBABA+GiABpyIFQRBqIQYgBSgCBEH/////B3EiCEEDayEJIAhBBmshCkEAIQMDQCADIAhORQRAAkACfyAFKQIEQoCAgIAIg1AiB0UEQCAGIANBAXRqLwEADAELIAMgBmotAAALIgJBJUcNAAJAIAMgCkoNACADQQFqIQICfyAHRQRAIAYgAkEBdGovAQAMAQsgAiAGai0AAAtB9QBHDQAgBSADQQJqQQQQvQMiAkEASA0AIANBBWohAwwBC0ElIQIgAyAJSg0AIAUgA0EBakECEL0DIgJBJSACQQBOIgcbIQIgA0ECaiADIAcbIQMLIARBCGogAhCHARogA0EBaiEDDAELCyAAIAEQDCAEQQhqEDchAQsgBEEgaiQAIAEL5AEBBH8jAEEgayICJAAgACADKQMAECUiAUKAgICAcINCgICAgOAAUgRAIAAgAkEIaiABpyIFKAIEQf////8HcRA+GiAFQRBqIQYgBSgCBEH/////B3EhB0EAIQMDQCADIAdGRQRAAkACQAJAIAUtAAdBgAFxRQRAIAMgBmotAAAhBAwBCyAGIANBAXRqLwEAIgRB/wFLDQELQbDXASAEQcUAEJICRQ0AIAJBCGogBBCHARoMAQsgAkEIaiAEEPUBCyADQQFqIQMMAQsLIAAgARAMIAJBCGoQNyEBCyACQSBqJAAgAQvMBAIGfwF+IwBBIGsiBiQAAkAgACADKQMAECUiAUKAgICAcINCgICAgOAAUQ0AIAAgBkEIaiABpyIJKAIEQf////8HcRA+GiAJQRBqIQhBACECAkADQCAJKQIEIgunQf////8HcSIKIAJKBEAgAkEBaiEFAkACQCALQoCAgIAIgyILUARAIAIgCGotAAAhAwwBCyAIIAJBAXRqLwEAIgNB/wFLDQELAkAgA0Ewa0EKSSADQd//A3FBwQBrQRpJcg0AQaOMASADQQkQkgINACAEDQEgAxDQBEUNAQsgBkEIaiADEIcBGiAFIQIMAgsCfwJ/AkAgA0GA+ANxIgdBgLADRwRAIAdBgLgDRw0BQboxIQcMBgtB3y4hByAFIApODQUCfyALUEUEQCAIIAVBAXRqLwEADAELIAUgCGotAAALIgVBgMADa0GAeEkNBSAGQQhqIAVB/wdxIANBCnRBgPg/cXJBgIAEaiIDQRJ2QfABchD1ASADQQx2QT9xQYABciEHIAJBAmoMAQsgA0H/AE0EQCAGQQhqIAMQ9QEgBSECDAQLIANB/w9NBEAgBSECIANBBnZBwAFyDAILIANBDHZB4AFyIQcgBQshAiAGQQhqIAcQ9QEgA0EGdkE/cUGAAXILIQcgBkEIaiIFIAcQ9QEgBSADQT9xQYABchD1AQwBCwsgACABEAwgBkEIahA3IQEMAQsgACAHEL4DIAAgARAMIAYoAggoAhAiAEEQaiAGKAIMIAAoAgQRAABCgICAgOAAIQELIAZBIGokACABC6EEAgZ/AX4jAEEgayIFJAACQCAAIAMpAwAQJSIBQoCAgIBwg0KAgICA4ABRDQAgACAFQQhqQQAQPhogAaciCEEQaiEJQQAhAgNAAkACQAJAIAgpAgQiC6dB/////wdxIAJKBEACfyALQoCAgIAIg1BFBEAgCSACQQF0ai8BAAwBCyACIAlqLQAACyIDQSVGBEAgACAIIAIQ0QQiA0EASA0DIAJBA2ohBiADQf8ATQRAIAQEQCAGIQIMBgtBJSADIAMQ0AQiBxshAyACQQFqIAYgBxshAgwFCwJ/IANB4P///wdxQcABRgRAIANBH3EhA0GAASEHQQEMAQsgA0Hw////B3FB4AFGBEAgA0EPcSEDQYAQIQdBAgwBCyADQfj///8HcUHwAUcEQEEBIQdBACEDQQAMAQsgA0EHcSEDQYCABCEHQQMLIQIDQCACQQBMDQMgACAIIAYQ0QQiCkEASA0EIAZBA2ohBiAKQcABcUGAAUcEQEEAIQMMBAUgAkEBayECIApBP3EgA0EGdHIhAwwBCwALAAsgAkEBaiECDAMLIAAgARAMIAVBCGoQNyEBDAQLIAYhAiADIAdIIANB///DAEpyRSADQYBwcUGAsANHcQ0BIABB9IABEL4DCyAAIAEQDCAFKAIIKAIQIgBBEGogBSgCDCAAKAIEEQAAQoCAgIDgACEBDAILIAVBCGogAxCxARoMAAsACyAFQSBqJAAgAQs5AQF+IAAgAykDABCoASICRQRAQoCAgIDgAA8LIAAgAhD+ASACakEAQQpBABCAAiEEIAAgAhAxIAQLhwEBAX8jAEEQayICJAACQCAAIAMpAwAQqAEiBEUEQEKAgICA4AAhAQwBCwJ+QoCAgIDgACAAIAJBDGogAykDCBB1DQAaIAIoAgwiAwRAQoCAgIDAfiADQSVrQV1JDQEaCyAAIAQQ/gEgBGpBACADQYEIEIACCyEBIAAgBBAxCyACQRBqJAAgAQulAgIEfgN/IwBBEGsiCCQAQoCAgIDgACEFAkACfgJAIAFCgICAgHBUDQAgAactAAVBEHFFDQAgCCACrTcDCCAAIAFBASAIQQhqEKMBDAELIAAQOwsiBEKAgICAcINCgICAgOAAUQ0AIAJBACACQQBKG60hB0IAIQECQANAIAEgB1IEQCADIAGnQQN0aikDACIGQiCIp0F1TwRAIAanIgkgCSgCAEEBajYCAAsgACAEIAEgBkGAgAEQyAEhCiABQgF8IQEgCkEATg0BDAILCyAAIARBMCACQQBOBH4gAq0FQoCAgIDAfiACuL0iAUKAgICAwIGA/P8AfSABQoCAgICAgID4/wBWGwsQOUEASA0AIAQhBQwBCyAAIAQQDAsgCEEQaiQAIAULsQkCBH8IfiMAQTBrIgQkACADKQMAIQggBEKAgICAMDcDGEEBIQUCQAJAAn4gAkECSARAQoCAgIAwIQ5CgICAgDAMAQtCgICAgDAgAykDCCIOQoCAgIBwg0KAgICAMFENABpCgICAgDAhDEKAgICAMCEJQoCAgIAwIQtCgICAgDAhCiAAIA4QVQ0BQQAhBUKAgICAMCACQQJGDQAaIAMpAxALIQ8CQAJAAkACQCAAIAhBzAEgCEEAEBEiCkKAgICAcIMiCUKAgICAMFIEQAJAAkAgCUKAgICA4ABRBEBCgICAgDAhDEKAgICAMCEJQoCAgIAwIQsMAQsgACAKEAwCfgJAIAFCgICAgHBUDQAgAactAAVBEHFFDQAgACABQQBBABCjAQwBCyAAEDsLIgtCgICAgHCDQoCAgIDgAFEEQEKAgICAMCEMQoCAgIAwIQkMAQsgCEIgiKdBdU8EQCAIpyICIAIoAgBBAWo2AgALIAQgCDcDECAAIARBEGpBCHJBABCFAyEGIAQpAxghDCAEKQMQIQkgBkUNAQtCgICAgDAhCgwGC0IAIQEDQCAAIAkgDCAEQQhqEJEBIghCgICAgHCDQoCAgIDgAFENAiAEKAIIBEBCgICAgDAhCgwGCwJAIAUEQCAIIQoMAQsgBCAINwMgIAQgAUL/////D4M3AyggACAOIA9BAiAEQSBqEBwhCiAAIAgQDCAKQoCAgIBwg0KAgICA4ABRDQMLIAAgCyABIAoQZ0EASA0CIAFCAXwhAQwACwALIAAgCBAgIgpCgICAgHCDQoCAgIDgAFENAiAAIARBCGogChAvQQBIDQIgBAJ+IAQpAwgiCEKAgICACHxC/////w9YBEAgCEL/////D4MMAQtCgICAgMB+IAi5vSIJQoCAgIDAgYD8/wB9IAlC////////////AINCgICAgICAgPj/AFYbCyINNwMgAn4CQCABQoCAgIBwVA0AIAGnLQAFQRBxRQ0AIAAgAUEBIARBIGoQowEMAQsgAEKAgICAMEEBIARBIGoQ4AILIQsgACANEAwgC0KAgICAcINCgICAgOAAUQRAQoCAgIAwIQwMAgtCACENIAhCACAIQgBVGyEBA0AgASANUQRAQoCAgIAwIQxCgICAgDAhCQwFC0KAgICAMCEMIAAgCiANEGwiCEKAgICAcINCgICAgOAAUQ0CAkAgBQRAIAghCQwBCyAEIAg3AyAgBCANQv////8PgzcDKCAAIA4gD0ECIARBIGoQHCEJIAAgCBAMIAlCgICAgHCDQoCAgIDgAFENAwsgACALIA0gCRBnIQcgDUIBfCENIAdBAE4NAAsMAQtCgICAgDAhCiAJQoCAgIBwg0KAgICAMFENAyAAIAlBARCQARoMAwtCgICAgDAhCQwCC0KAgICAMCEMQoCAgIAwIQlCgICAgDAhCwwBCyAAIAtBMCABpyICQQBOBH4gAUL/////D4MFQoCAgIDAfiACuL0iAUKAgICAwIGA/P8AfSABQoCAgICAgID4/wBWGwsQOUEATg0BCyAAIAsQDEKAgICA4AAhCwsgACAKEAwgACAJEAwgACAMEAwgBEEwaiQAIAsLJgBCgICAgOAAIAAgAykDABDMASIAQQBHrUKAgICAEIQgAEEASBsLowICAX8EfiMAQRBrIgUkAEKAgICAMCEGAkACQCAAIAVBCGogACABECAiCRAvDQAgBUEBNgIEAkAgBARAIAMpAwAhCEKAgICAMCEHIAJBAk4EQCADKQMIIQcLIAAgCBBVRQ0BDAILIAJBAEwEQEKAgICAMCEIQoCAgIAwIQcMAQtCgICAgDAhCEKAgICAMCEHIAMpAwAiAUKAgICAcINCgICAgDBRDQAgACAFQQRqIAEQswFBAEgNAQsgACAJQgAQnwIiAUKAgICAcINCgICAgOAAUQRAIAEhBgwBCyABIQYgACABIAkgBSkDCEIAIAUoAgQgCCAHENQEQgBTDQAgCSEGDAELIAAgCRAMQoCAgIDgACEBCyAAIAYQDCAFQRBqJAAgAQv5AQIEfgF/IwBBIGsiCCQAAkACQCAAIAhBGGogACABECAiARAvDQAgACAIQQhqIAMpAwBCACAIKQMYIgQgBBBmDQAgACAIQRBqIAMpAwhCACAEIAQQZg0AIAggBDcDAAJ+IAQgAkEDSA0AGiAEIAMpAxAiBUKAgICAcINCgICAgDBRDQAaIAAgCCAFQgAgBCAEEGYNASAIKQMACyEGIAAgASAIKQMIIgUgCCkDECIHIAYgB30iBiAEIAV9IgQgBCAGVRsiBEEBQX9BASAFIAQgB3xTGyAFIAdXGxDzAkUNAQsgACABEAxCgICAgOAAIQELIAhBIGokACABC+UHAgR/CX4jAEEwayIFJABCgICAgOAAIQgCQAJAIAAgBUEgaiAAIAEQICIOEC8NACAFQgA3AxgCQCACQQBKBEAgACAFQRhqIAMpAwBCACAFKQMgIgsgCxBmDQIgBSALIAUpAxgiCn0iDDcDECACQQFGDQEgACAFQRBqIAMpAwhCACAMQgAQZg0CIAUpAxAhDAwBCyAFKQMgIQsLIAsgAkECa0EAIAJBAkobrSIPfCAMfSINQoCAgICAgIAQWQRAIABBiscAQQAQEgwBCyAAIA0Q4gIiAUKAgICAcINCgICAgOAAUQRAQQAhAkKAgICA4AAhCwwCCyANQgBXBEBBACECIAEhCEKAgICAMCELDAILIAGnKAIkIgQgDadBA3RqIQICQAJAAkACQCAOIAVBLGogBUEMahCPAQRAIAsgBTUCDFENAQsgCkIAIApCAFUbIQoMAQtCACEIIApCACAKQgBVGyEJIAUoAiwhBgNAAkAgCCAJUQRAIANBEGohA0IAIQgDQCAIIA9RDQIgAyAIp0EDdGopAwAiCkIgiKdBdU8EQCAKpyIHIAcoAgBBAWo2AgALIAQgCjcDACAEQQhqIQQgCEIBfCEIDAALAAsgBiAIp0EDdGopAwAiCkIgiKdBdU8EQCAKpyIHIAcoAgBBAWo2AgALIAQgCjcDACAEQQhqIQQgCEIBfCEIDAELCyAJIAx8IQgDQCAIIAtZDQIgBiAIp0EDdGopAwAiCUIgiKdBdU8EQCAJpyIDIAMoAgBBAWo2AgALIAQgCTcDACAEQQhqIQQgCEIBfCEIDAALAAsDQAJAIAkgClEEQCADQRBqIQNCACEJA0AgCSAPUQ0CIAMgCadBA3RqKQMAIhBCIIinQXVPBEAgEKciBiAGKAIAQQFqNgIACyAEIBA3AwAgBEEIaiEEIAlCAXwhCQwACwALIAAgDiAJIAQQVEF/Rg0DIARBCGohBCAJQgF8IQkMAQsLIAogDHwhCQNAIAkgC1kNASAAIA4gCSAEEFRBf0YNAiAEQQhqIQQgCUIBfCEJDAALAAsgAiAERgRAIAFCgICAgDAgACABQTAgDUKAgICACFoEfkKAgICAwH4gDbm9IghCgICAgMCBgPz/AH0gCEL///////////8Ag0KAgICAgICA+P8AVhsFIA0LEDlBAEgiAxshC0KAgICA4AAgASADGyEIIAIhBAwDC0GJFkGo7ABB4rkCQfHqABAAAAsgASELDAELQQAhAkKAgICAMCELCwNAIAIgBEZFBEAgBEKAgICAMDcDACAEQQhqIQQMAQsLIAAgCxAMIAAgDhAMIAVBMGokACAIC8gIAgl+A38jAEEwayIOJABCgICAgDAhBQJAAkAgACAOQSBqIAAgARAgIgoQLw0AIAAgDkEYaiADKQMAQgAgDikDICIGIAYQZg0AAkAgBARAAkACQAJAIAIOAgIAAQsgBiAOKQMYfSEHQQAhAgwBCyAAIA5BEGogAykDCEIAIAYgDikDGH1CABBmDQMgAkECayECIA4pAxAhBwsgBiACrXwgB31CgICAgICAgBBTDQEgAEH0yABBABASDAILIA4gBjcDECAGIQEgAykDCCINQoCAgIBwg0KAgICAMFIEfiAAIA5BEGogDUIAIAEgARBmDQIgDikDEAUgAQsgDikDGH0iAUIAIAFCAFUbIQdBACECCyAAIAogB0KAgICACHxC/////w9YBH4gB0L/////D4MFQoCAgIDAfiAHub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwsiBRCfAiEBIAAgBRAMAkAgAUKAgICAcINCgICAgOAAUQ0AIA4pAxgiDSAHfCELAkACQCAKIA5BDGogDkEIahCPAUUgAUKAgICAcFRyDQAgAaciDy8BBkECRw0AIA0hBSAPLQAFQQhxRQ0BIAUgCyAONQIIIgggCCALVRsiCCAFIAhVGyAFfSEJIA4oAgwhEANAIAkgDFENAiAQIAWnQQN0aikDACIIQiCIp0F1TwRAIAinIg8gDygCAEEBajYCAAsgACABIAwgCEGAgAEQyAFBAEgNAyAMQgF8IQwgBUIBfCEFDAALAAsgDSEFCyAFIAsgBSALVRshCANAIAUgCFIEQCAAIAogBSAOQShqEFQiD0EASA0CIA8EQCAAIAEgCSAOKQMoQYCAARDIAUEASA0DCyAJQgF8IQkgBUIBfCEFDAELCyAAIAFBMCAJQoCAgIAIWgR+QoCAgIDAfiAJub0iBUKAgICAwIGA/P8AfSAFQv///////////wCDQoCAgICAgID4/wBWGwUgCQsQOUEASA0AIAQEQCAGIAKtIgt8IAd9IQwCQCAHIAtRDQAgACAKIAsgDXwgByANfCIFIAYgBX1Bf0EBIAcgC1MbEPMCQQBIDQIDQCAGIAxXDQEgACAKIAZCAX0iBhCFAkEATg0ACwwCCyADQRBqIQNCACEFA0AgBSALUgRAIAMgBadBA3RqKQMAIghCIIinQXVPBEAgCKciAiACKAIAQQFqNgIACyAFIA18IQYgBUIBfCEFIAAgCiAGIAgQe0EATg0BDAMLCyAMQoCAgIAIfEL/////D1gEfiAMQv////8PgwVCgICAgMB+IAy5vSIFQoCAgIDAgYD8/wB9IAVC////////////AINCgICAgICAgPj/AFYbCyEJIAEhBSAAIApBMCAJEDlBAEgNAgsgCiEFDAILIAEhBQsgACAKEAxCgICAgOAAIQELIAAgBRAMIA5BMGokACABC5MEAgN/Bn4jAEEgayICJABCgICAgDAhCgJAAkAgAykDACIIQoCAgIBwg0KAgICAMFENACAAIAgQNQ0AIABB+zlBABASQoCAgIDgACEJDAELQoCAgIDgACEJAkAgACACQRBqIAAgARAgIgsQLw0AIAAgAikDECIHEOICIghCgICAgHCDQoCAgIDgAFEEQEKAgICA4AAhCgwBCwJAIAdCAFUEQCAIpygCJCEEQgAhAQJAAkAgCyACQRxqIAJBDGoQjwFFDQAgByACNQIMUg0AIAIoAhwhBQNAIAEgB1ENAiAFIAGnQQN0aikDACIMQiCIp0F1TwRAIAynIgYgBigCAEEBajYCAAsgBCAMNwMAIARBCGohBCABQgF8IQEMAAsACwNAIAEgB1ENASAAIAsgASAEEFRBf0cEQCAEQQhqIQQgAUIBfCEBDAELCyAHIAEgASAHUxshCgNAIAEgClENAyAEQoCAgIAwNwMAIARBCGohBCABQgF8IQEMAAsACyAAIAhBMCAHQoCAgIAIWgR+QoCAgIDAfiAHub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwUgBwsQOUEASA0BCyAAIAggBCADENUEIglCgICAgHCDQoCAgIDgAFENACAAIAkQDCAIIQkMAQsgCCEKCyAAIAoQDCAAIAsQDAsgAkEgaiQAIAkL5AIDAn4FfwF8IwBBIGsiBSQAAkAgAigCBA0AIAIoAgAhBgJAAkACfyACKAIIBEAgACkAACABKQAAUQ0CIAUgACkDADcDECAFIAEpAwA3AxggBiACKQMQQoCAgIAwQQIgBUEQahAcIgNCgICAgHCDQoCAgIDgAFENAyADQv////8PWARAIAOnIgJBH3UgAkEAR3IMAgsgBiAFQQhqIAMQbUEASA0DIAUrAwgiCkQAAAAAAAAAAGQgCkQAAAAAAAAAAGNrDAELIAAoAggiCEUEQCAGIAApAwAQJSIDQoCAgIBwg0KAgICA4ABRDQMgACADpyIINgIICyABKAIIIgkEfyAIBSAGIAEpAwAQJSIDQoCAgIBwg0KAgICA4ABRDQMgASADpyIJNgIIIAAoAggLIAkQvAILIgcNAgsgACkDECIDIAEpAxAiBFUgAyAEU2shBwwBCyACQQE2AgQLIAVBIGokACAHC9MFAgd+A38jAEEQayINJAAgAUKAgICAcINCgICAgDBRBEAgACgCECgCjAEpAwghAQsCQCAAIAFBPCABQQAQESIGQoCAgIBwg0KAgICA4ABRDQACQCAGQv////9vVg0AIAAgBhAMIAAgARD8AiIMRQRAQoCAgIDgACEGDAILAn8gBEEASARAIAwoAihBGGoMAQsgDCAEQQN0akHYAGoLKQMAIgZCIIinQXVJDQAgBqciDCAMKAIAQQFqNgIACyAAIAZBAxBHIQEgACAGEAxCgICAgOAAIQYgAUKAgICAcINCgICAgOAAUQ0AAkAgAyAEQQdGIgxBA3RqKQMAIgVCgICAgHCDQoCAgIAwUgRAIAAgBRAlIgVCgICAgHCDQoCAgIDgAFENASAAIAFBMyAFQQMQFRoLAkAgAkECQQEgDBsiAkwNACADIAJBA3RqKQMAIgVCgICAgHBUDQAgACAFQTQQbiICQQBIDQEgAkUNACAAIAVBNCAFQQAQESIFQoCAgIBwg0KAgICA4ABRDQEgACABQTQgBUEDEBUaCyAEQQdGBEBCgICAgOAAIQhCgICAgDAhBQJAAkAgACADKQMAQQAQywEiB0KAgICAcINCgICAgOAAUQRAQoCAgIAwIQkMAQsgACAHQesAIAdBABARIglCgICAgHCDQoCAgIDgAFENACAAEDsiBUKAgICAcINCgICAgOAAUQRAQoCAgIDgACEFDAELA0AgACAHIAkgDUEMahCRASILQoCAgIBwg0KAgICA4ABSBEAgDSgCDARAIAUhCAwECyAAIAUgCiALEGchDiAKQgF8IQogDkEATg0BCwsgACAHQQEQkAEaCyAAIAUQDAsgACAJEAwgACAHEAwgCEKAgICAcINCgICAgOAAUQ0BIAAgAUE1IAhBAxAVGgsgACABQQBBAEEBELQCIAEhBgwBCyAAIAEQDAsgDUEQaiQAIAYLrQMCBn4CfyMAQSBrIgMkAEKAgICAMCEGQoCAgIDgACEHAkAgACADQRBqIAAgARAgIggQLw0AIAAgAykDECIEEOICIgVCgICAgHCDQoCAgIDgAFEEQEKAgICA4AAhBgwBCwJAIARCAFUEQCAEQgF9IQEgBacoAiQhAgJAAkAgCCADQRxqIANBDGoQjwFFDQAgBCADNQIMUg0AIAMoAhwhCgNAIAFCAFMNAiAKIAGnQQN0aikDACIJQiCIp0F1TwRAIAmnIgsgCygCAEEBajYCAAsgAiAJNwMAIAJBCGohAiABQgF9IQEMAAsACwNAIAFCAFMNASAAIAggASACEFRBf0cEQCACQQhqIQIgAUIBfSEBDAELCwNAIAFCAFMNAyACQoCAgIAwNwMAIAJBCGohAiABQgF9IQEMAAsACyAAIAVBMCAEQoCAgIAIWgR+QoCAgIDAfiAEub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwUgBAsQOUEASA0BCyAFIQcMAQsgBSEGCyAAIAYQDCAAIAgQDCADQSBqJAAgBwumAwICfgJ/IwBBMGsiAiQAIAJCgICAgDA3AygCQAJ+QoCAgIAwIAAgAkEQaiAAIAEQICIBEC8NABogASACQRxqIAJBDGoQjwEhAyACKQMQIQUCQCADRQ0AIAUgAigCDCIDrVINACADQQJJDQJBACEAIAIoAhwhBgNAIAAgA0EBayIDTw0DIAYgAEEDdGoiBykDACEEIAcgBiADQQN0aiIHKQMANwMAIAcgBDcDACAAQQFqIQAMAAsACwNAIAQgBUIBfSIFWQ0CAkACQAJAIAAgASAEIAJBKGoQVCIDQQBIDQAgACABIAUgAkEgahBUIgZBAEgNAAJAAkAgBgRAIAAgASAEIAIpAyAQe0EASA0DIANFDQIgACABIAUgAikDKBB7QQBODQEMBQsgA0UNAyAAIAEgBBCFAkEASA0CIAAgASAFIAIpAygQe0EASA0ECyACQoCAgIAwNwMoDAILIAAgASAFEIUCQQBODQELIAIpAygMAwsgBEIBfCEEDAELC0KAgICAMAshBCAAIAQQDCAAIAEQDEKAgICA4AAhAQsgAkEwaiQAIAELhQEBAX5CgICAgOAAIQQgACABECAiAUKAgICAcINCgICAgOAAUgRAAn5CgICAgOAAIAAgAUHcACABQQAQESIEQoCAgIBwg0KAgICA4ABRDQAaIAAgBBA1RQRAIAAgBBAMIAAgASAAIAAQ1wQMAQsgACAEIAFBAEEAEDYLIQQgACABEAwLIAQLogMCAn8GfiMAQSBrIgUkAAJ+AkAgACAFIAAgARAgIgkQLw0AQSwhBgJAIAJBAEwgBHJFBEBCgICAgDAhB0EAIQIgAykDACIBQoCAgIBwg0KAgICAMFENASAAIAEQJSIHQoCAgIBwg0KAgICA4ABRDQJBfyEGIAenIgIoAgRBAUcNASACLQAQIQYMAQtCgICAgDAhB0EAIQILIAAgBUEIakEAED4aQgAhASAFKQMAIghCACAIQgBVGyELAkADQCABIAtSBEACQCABUA0AIAZBAE4EQCAFQQhqIAYQPBoMAQsgBUEIaiACQQAgAigCBEH/////B3EQSxoLIAAgCSABpxCmASIIQoCAgIBwgyIKQoCAgIAgUSAKQoCAgIAwUXJFBEAgCkKAgICA4ABRDQMgBUEIaiAEBH4gACAIENYEBSAICxCEAQ0DCyABQgF8IQEMAQsLIAAgBxAMIAAgCRAMIAVBCGoQNwwCCyAFKAIIKAIQIgJBEGogBSgCDCACKAIEEQAAIAAgBxAMCyAAIAkQDEKAgICA4AALIQwgBUEgaiQAIAwLvQICAX8DfiMAQSBrIgQkAAJ+AkACQAJAIAAgBEEQaiAAIAEQICIGEC8NACAEKQMQIgVCAFcNASAEIAVCAX0iATcDCCACQQJOBEAgACAEQQhqIAMpAwhCfyABIAUQZg0BIAQpAwghAQsDQCABQgBTDQIgACAGIAEgBEEYahBUIgJBAEgNASACBEAgAykDACIFQiCIp0F1TwRAIAWnIgIgAigCAEEBajYCAAsgACAFIAQpAxhBABC0AQ0ECyABQgF9IQEMAAsACyAAIAYQDEKAgICA4AAMAgtCfyEBCyAAIAYQDCABQv////8PgyABQoCAgIAIfEL/////D1gNABpCgICAgMB+IAG5vSIBQoCAgIDAgYD8/wB9IAFC////////////AINCgICAgICAgPj/AFYbCyEHIARBIGokACAHC+cDAgJ/B34jAEEgayIEJAACfgJAIAAgBEEQaiAAIAEQICIIEC8NAEJ/IQkCQCAEKQMQIgdCAFcNAEIAIQEgBEIANwMIIAJBAk4EQCAAIARBCGogAykDCEIAIAcgBxBmDQIgBCkDCCEBCwJAAkAgCCAEQQRqIAQQjwFFDQAgASAENQIAIgYgASAGVRshBiAEKAIEIQIDQCABIAZRBEAgBiEBDAILIAMpAwAiCkIgiKdBdU8EQCAKpyIFIAUoAgBBAWo2AgALIAIgAadBA3RqKQMAIgtCIIinQXVPBEAgC6ciBSAFKAIAQQFqNgIACyAAIAogC0EAELQBDQIgAUIBfCEBDAALAAsgASAHIAEgB1UbIQcDQCABIAdRDQIgACAIIAEgBEEYahBUIgJBAEgNAyACBEAgAykDACIGQiCIp0F1TwRAIAanIgIgAigCAEEBajYCAAsgACAGIAQpAxhBABC0AQ0CCyABQgF8IQEMAAsACyABIQkLIAAgCBAMIAlC/////w+DIAlCgICAgAh8Qv////8PWA0BGkKAgICAwH4gCbm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsMAQsgACAIEAxCgICAgOAACyEMIARBIGokACAMC+cDAgl+AX8jAEEwayIOJABCgICAgDAhBgJAAkAgACAOQQhqIAAgARAgIggQLwRAQoCAgIAwIQUMAQtCgICAgDAhBSAAIAMpAwAiChBVDQBCgICAgDAhCSACQQJOBEAgAykDCCEJCyAOKQMIIgVCAX1CACAEQX5xQQJGIgIbIQdCf0IBIAIbIQtCfyAFIAIbIQwDQCAHIAxSBEAgB0KAgICACHxC/////w9YBH4gB0L/////D4MFQoCAgIDAfiAHub0iBUKAgICAwIGA/P8AfSAFQv///////////wCDQoCAgICAgID4/wBWGwsiBUKAgICAcINCgICAgOAAUQ0CIAAgCCAFEE4iBkKAgICAcINCgICAgOAAUQ0CIA4gATcDICAOIAU3AxggDiAGNwMQIAAgCiAJQQMgDkEQahAcIg1CgICAgHCDQoCAgIDgAFENAiAAIA0QJwRAAkACQCAEQQFrDgMAAQABCyAAIAYQDCAAIAgQDAwFCyAAIAUQDCAAIAgQDCAGIQUMBAUgACAGEAwgACAFEAwgByALfCEHDAILAAsLIAAgCBAMQoCAgIAwQv////8PIARBAWtBfXEbIQUMAQsgACAFEAwgACAGEAwgACAIEAxCgICAgOAAIQULIA5BMGokACAFC6ICAgN+An8jAEEgayIHJAACQAJAIAAgB0EYaiAAIAEQICIFEC8NACAHQgA3AxACQCACQQFMBEAgBykDGCEEDAELIAcpAxghBCADKQMIIgFCgICAgHCDQoCAgIAwUgRAIAAgB0EQaiABQgAgBCAEEGYNAgsgByAENwMIIAJBAkYNACADKQMQIgFCgICAgHCDQoCAgIAwUQ0AIAAgB0EIaiABQgAgBCAEEGYNASAHKQMIIQQLIAcpAxAiASAEIAEgBFUbIQYDQCABIAZRDQIgAykDACIEQiCIp0F1TwRAIASnIgIgAigCAEEBajYCAAsgACAFIAEgBBB7IQggAUIBfCEBIAhBAE4NAAsLIAAgBRAMQoCAgIDgACEFCyAHQSBqJAAgBQvvBQIDfwl+IwBBQGoiBSQAQoCAgIAwIQsgBUKAgICAMDcDOCAFQoCAgIAwNwMwAkACQAJAIARBCHEiBwRAIAFCIIinQXVPBEAgAaciBiAGKAIAQQFqNgIACyAFIAAgARCKASIGrDcDCCAGQQBODQEMAgsgACAFQQhqIAAgARAgIgEQLw0BCyAAIAMpAwAiDxBVDQACQCACQQFMBEAgBSkDCCIMQgAgDEIAVRshCiAEQQFxIQQDQCAIIApRBEAgAEGODUEAEBIMBAsgDCAIQn+FfCAIIAQbIQkgCEIBfCEIIAcEQCAFIAAgASAJEGwiCTcDMCAJQoCAgIBwg0KAgICA4ABRDQQMAwsgACABIAkgBUEwahBUIgJBAEgNAyACRQ0ACyAFKQMwIQkMAQsgAykDCCIJQiCIp0F1TwRAIAmnIgIgAigCAEEBajYCAAsgBEEBcSEEIAUpAwghDAsgCCAMIAggDFUbIRADQCAIIBBRDQIgDCAIQn+FfCAIIAQbIQoCQAJAAkAgBwRAIAUgACABIAoQbCILNwM4IAtCgICAgHCDQoCAgIDgAFINAQwDCyAAIAEgCiAFQThqEFQiAkEASARAIAUpAzghCwwDCyACRQ0BCyAKQoCAgIAIfEL/////D1gEfiAKQv////8PgwVCgICAgMB+IAq5vSILQoCAgIDAgYD8/wB9IAtC////////////AINCgICAgICAgPj/AFYbCyENIAUpAzghCiANQoCAgIBwg0KAgICA4ABRBEAgCiELDAILIAUgATcDKCAFIA03AyAgBSAKNwMYIAUgCTcDEEKAgICAMCELIAAgD0KAgICAMEEEIAVBEGoQHCEOIAAgDRAMIAAgChAMIAVCgICAgDA3AzggDkKAgICAcINCgICAgOAAUQ0BIAAgCRAMIA4hCQsgCEIBfCEIDAELCyAFIAk3AzALIAAgBSkDMBAMIAAgCxAMQoCAgIDgACEJCyAAIAEQDCAFQUBrJAAgCQvlCAIDfwp+IwBBMGsiBSQAQoCAgIAwIQggBUKAgICAMDcDKAJAAkACQCAEQQhxIgcEQCABQiCIp0F1TwRAIAGnIgYgBigCAEEBajYCAAsgBSAAIAEQigEiBqw3AwggBkEATg0BQoCAgIDgACEJDAILQoCAgIDgACEJIAAgBUEIaiAAIAEQICIBEC8NAQsgAykDACEQQoCAgIAwIQ8gAkECTgRAIAMpAwghDwtCgICAgOAAIQkgACAQEFUNAAJAAkACQAJAAkACQAJAIAQODQUABgECBgYGBQAGAwQGC0KAgICAECEIDAULIAAgAQJ+IAUpAwgiCEKAgICACHxC/////w9YBEAgCEL/////D4MMAQtCgICAgMB+IAi5vSIIQoCAgIDAgYD8/wB9IAhC////////////AINCgICAgICAgPj/AFYbCxCfAiIIQoCAgIBwg0KAgICA4ABSDQQMBQsgACABQgAQnwIiCEKAgICAcINCgICAgOAAUg0DDAQLIAUgATcDECAFIAU1Agg3AxggAEECIAVBEGoQ4QIiCEKAgICAcINCgICAgOAAUg0CDAMLIAAQOyIIQoCAgIBwg0KAgICA4ABSDQFCgICAgOAAIQgMAgtCgYCAgBAhCAsgBSkDCCIJQgAgCUIAVRshEQNAIAogEVIEQAJAAkAgBwRAIAUgACABIAoQbCILNwMoQoCAgIDgACEJIAtCgICAgHCDQoCAgIDgAFINAQwFCyAAIAEgCiAFQShqEFQiAkEASARAQoCAgIDgACEJDAULIAJFDQELIAohCyAKQoCAgIAIWgRAQoCAgIDAfiAKub0iCUKAgICAwIGA/P8AfSAJQv///////////wCDQoCAgICAgID4/wBWGyELC0KAgICA4AAhCSALQoCAgIBwg0KAgICA4ABRDQMgBSABNwMgIAUgCzcDGCAFIAUpAygiDjcDECAAIBAgD0EDIAVBEGoQHCEMIAAgCxAMIAxCgICAgHCDQoCAgIDgAFENAwJAAkACQAJAAkACQAJAIAQODQABBQIEBQUFAAEFAwQFCyAAIAwQJw0FQoCAgIAQIQkMCgsgACAMECdFDQRCgYCAgBAhCQwJCyAAIAggCiAMEGdBAE4NAwwHCyAAIAggCkL/////D4MgDEGAgAEQzwFBAE4NAgwGCyAAIAwQJ0UNASAOQiCIp0F1TwRAIA6nIgIgAigCAEEBajYCAAsgACAIIA0gDhBnQQBIDQUgDUIBfCENDAELIAAgDBAMCyAAIA4QDCAFQoCAgIAwNwMoCyAKQgF8IQoMAQsLIARBDEcEQCAIIQkMAgsgBSABNwMQIAUgDUL/////D4M3AxhCgICAgOAAIQkgAEECIAVBEGoiAhDhAiIKQoCAgIBwg0KAgICA4ABRDQAgBSAINwMQQoCAgIDgACAKIAAgACAKQcMAQQEgAhCzAhD/ARshCQsgACAIEAwLIAAgBSkDKBAMIAAgARAMIAVBMGokACAJC60EAgV+A38jAEEQayIJJABCgICAgDAhBgJAAkAgACABECAiCEKAgICAcINCgICAgOAAUQ0AIAAgCEIAEJ8CIgZCgICAgHCDQoCAgIDgAFENAEF/IQpBfyACIAJBAEgbIQsCQANAIAogC0cEQCAIIQUgCkEATgRAIAMgCkEDdGopAwAhBQsCQAJAIAVCgICAgHBUDQACfyAAIAVB0wEgBUEAEBEiAUKAgICAcIMiB0KAgICAMFIEQCAHQoCAgIDgAFENByAAIAEQJwwBCyAAIAUQzAELIgJBAEgNBSACRQ0AIAAgCSAFEC8NBSAJKQMAIgcgBHxC/////////w9VDQRCACEBIAdCACAHQgBVGyEHA0AgASAHUQ0CIAAgBSABIAlBCGoQVCICQQBIDQYgAgRAIAAgBiAEIAkpAwgQZ0EASA0HCyAEQgF8IQQgAUIBfCEBDAALAAsgBEL+////////D1UNAyAFQiCIp0F1TwRAIAWnIgIgAigCAEEBajYCAAsgACAGIAQgBRBnQQBIDQQgBEIBfCEECyAKQQFqIQoMAQsLIAAgBkEwIARCgICAgAh8Qv////8PWAR+IARC/////w+DBUKAgICAwH4gBLm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLEDlBAEgNAQwCCyAAQfTIAEEAEBILIAAgBhAMQoCAgIDgACEGCyAAIAgQDCAJQRBqJAAgBgvaBQIFfgN/IwBBIGsiCSQAQoCAgIAwIQRCgICAgOAAIQYCQCAAIAlBEGogACABECAiCBAvDQAgACAJQQhqIAMpAwAQ4wENACAJKQMQIQUCQAJAIAkpAwgiAUIAUwRAIAEgBXwiAUIAUw0BCyABIAVTDQELIABB3eEAQQAQRAwBCyAAIAUQ4gIiB0KAgICAcINCgICAgOAAUQRAQoCAgIDgACEEDAELIAenKAIkIQJCACEEAkACQCAIIAlBHGogCUEEahCPAUUNACAFIAk1AgRSDQBCACEGIAkoAhwhCgNAIAEgBlIEQCAKIAanQQN0aikDACIEQiCIp0F1TwRAIASnIgsgCygCAEEBajYCAAsgAiAENwMAIAJBCGohAiAGQgF8IQYMAQsLIAMpAwgiBEIgiKdBdU8EQCAEpyIDIAMoAgBBAWo2AgALIAIgBDcDAANAIAFCAXwiASAFWQ0CIAogAadBA3RqKQMAIgRCIIinQXVPBEAgBKciAyADKAIAQQFqNgIACyACQQhqIgIgBDcDAAwACwALAkACQANAIAEgBFENASAAIAggBCACEFRBf0cEQCACQQhqIQIgBEIBfCEEDAELCyAEIQEMAQsgAykDCCIEQiCIp0F1TwRAIASnIgMgAygCAEEBajYCAAsgAiAENwMAA0AgAUIBfCIBIAVZDQIgACAIIAEgAkEIaiICEFRBf0cNAAsLA0AgASAFWQRAIAchBAwDBSACQoCAgIAwNwMAIAJBCGohAiABQgF8IQEgCSkDECEFDAELAAsACyAHQoCAgIAwIAAgB0EwIAVCgICAgAh8Qv////8PWAR+IAVC/////w+DBUKAgICAwH4gBbm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLEDlBAEgiAhshBEKAgICA4AAgByACGyEGCyAAIAQQDCAAIAgQDCAJQSBqJAAgBgvrAQEDfiMAQSBrIgIkAEKAgICA4AAhBAJAIAAgAkEQaiAAIAEQICIFEC8NACAAIAJBCGogAykDABDjAQ0AQoCAgIAwIQQgAikDCCIBIAIpAxAiBiABQj+Hg3wiAUIAUyABIAZZcg0AAkAgBSACQQRqIAIQjwFFDQAgASACNQIAWg0AIAIoAgQgAadBA3RqKQMAIgRCIIinQXVJDQEgBKciAyADKAIAQQFqNgIADAELQoCAgIDgACEEIAAgBSABIAJBGGoQVCIDQQBIDQAgAikDGEKAgICAMCADGyEECyAAIAUQDCACQSBqJAAgBAstAQF+QoCAgIAwIQICQCABEJYDIgBFDQAgAC0AEkEEcUUNACAANQJEIQILIAILMwIBfgF/QoCAgIAwIQICQCABEJYDIgNFDQAgAy0AEkEEcUUNACAAIAMoAkAQKSECCyACCygAQoCAgIDgACAAIAMpAwAgARDhBSIAQQBHrUKAgICAEIQgAEEASBsLvAECAX4Cf0KAgICA4AAhBCAAIAEQVQR+QoCAgIDgAAVB9pEBIQICQCABpyIDLwEGEOABRQ0AAkAgAygCICIDLwARIgVBgAhxRQ0AIAMoAlQiBkUNACAAIAYgAygCSBDqAQ8LIAVBBHZBA3FBAWsiA0ECSw0AIANB//8DcUECdEGQ9QFqKAIAIQILIAAgAiAAIAFBNyABQQAQESIBQoCAgIBwg0KAgICAMFEEfiAAQS8QKQUgAQtBnggQsgELC+EFAwN+B38DfAJAIAAgARBVDQAgACAAKQMwQQ4QRyIFQoCAgIBwg0KAgICA4ABRDQAgBaciCSABQoCAgIBwWgR/IAGnLQAFQRBxBUEACyAJLQAFQe8BcXI6AAUCQCAAQQEgAiACQQFMGyIKQQFrIghBA3RBGGoQJCIHRQ0AIAFCIIinQXVPBEAgAaciAiACKAIAQQFqNgIACyAHIAE3AwAgAykDACIEQiCIp0F1TwRAIASnIgIgAigCAEEBajYCAAsgByAINgIQIAcgBDcDCCAHQRhqIQtBACECA0AgAiAIRwRAIAMgAkEBaiIMQQN0aikDACIEQiCIp0F1TwRAIASnIg0gDSgCAEEBajYCAAsgCyACQQN0aiAENwMAIAwhAgwBCwsgCSAHNgIgAn8gAUL/////b1gEQCAAECJBfwwBCyAAQQAgAadBMBBDCyICQQBIDQACQCACRQ0AIAAgAUEwIAFBABARIgRCgICAgHCDQoCAgIDgAFENASAEQv////8PWARAIASnIgIgCGtBACACIApOG60hBgwBCyAEQiCIp0EHa0FtTQRAAkAgBEKAgICAwIGA/P8AfCIEQv///////////wCDQoCAgICAgID4/wBWDQAgBL+dIg8gCLciEGUNACAPIBChIQ4LIA69IgQCfyAOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiAre9UQRAIAKtIQYMAgtCgICAgMB+IARCgICAgMCBgPz/AH0gBEL///////////8Ag0KAgICAgICA+P8AVhshBgwBCyAAIAQQDAsgACAFQTAgBkEBEBUaIABBgJIBIAAgAUE3IAFBABARIgFCgICAgHCDIgRCgICAgJB/UgR+IARCgICAgOAAUQ0BIAAgARAMIABBLxApBSABC0HslgEQsgEiAUKAgICAcINCgICAgOAAUQ0AIAAgBUE3IAFBARAVGiAFDwsgACAFEAwLQoCAgIDgAAswACACQQBMBEAgACABQoCAgIAwQQBBABAcDwsgACABIAMpAwAgAkEBayADQQhqEBwLgwICAX4BfyMAQSBrIgIkAEKAgICA4AAhBQJAAkAgACABECAiAUKAgICAcINCgICAgOAAUQ0AIAAgAykDABAw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ARAgCzYAIAMpAwAiAUIgiKciAkF/RiAERSACQX5xQQJHcXJFBEAgABAiQoCAgIDgAA8LIAAgARDoAQuJAQEBfiADKQMAIgFC/////29WIAFCgICAgHCDQoCAgIAgUXJFBEAgAEHe0gBBABASQoCAgIDgAA8LAkAgACABEEEiAUKAgICAcINCgICAgOAAUgRAIAMpAwgiBEKAgICAcINCgICAgDBRDQEgACABIAQQ2gRFDQEgACABEAwLQoCAgIDgAA8LIAELnwIBA34gAUL/////b1gEQCAAECJCgICAgOAADwtCgICAgOAAIQUCfiAAIAFBNyABQQAQESIEQoCAgIBwg0KAgICAMFEEQCAAQZQBECkMAQsgACAEEDQLIgRCgICAgHCDIgZCgICAgOAAUgR+An4gACABQTMgAUEAEBEiAUKAgICAcINCgICAgDBRBEAgAEEvECkMAQsgACABEDQLIgFCgICAgHCDIgVCgICAgOAAUQRAIAAgBBAMQoCAgIDgAA8LAkAgBkKAgICAkH9RBEAgBKcoAgRB/////wdxRQ0BCyAFQoCAgICQf1EEQCABpygCBEH/////B3FFDQELIABB7JYBIARBpJIBELIBIQQLIAAgBCABELYCBUKAgICA4AALC5UCAgF+An8jAEEwayICJABCgICAgOAAIQECQCAAIAJBKGogAykDABCkAQ0AIAAQ4gEiBUKAgICAcINCgICAgOAAUQ0AIAAgAkEUaiADKQMIEK4CIgZFBEAgACAFEAwMAQsgACgC2AEgAhC7ASACQgEQMhogAiACKQMoIgGnIgdBARC5ARogAiACQn9B/////wNBARB6GiAFp0EEaiIDIAYgAhCyBBoCQCAERSABUHINACACQgEQMhogAiAHQQFrQQEQuQEaIAMgAhDyAUEASA0AIAJCARAyGiACIAdBARC5ARogAyADIAJB/////wNBARDuARoLIAIQGSAAIAYgAkEUahDmASAFEK8CIQELIAJBMGokACABCwkAIAAgARDcBAt0AgJ+AX8gACABENwEIgFCgICAgHCDQoCAgIDgAFEEQCABDwtBCiEGAn4CQCACRQ0AIAMpAwAiBEKAgICAcINCgICAgDBRDQAgACAEENsEIgZBAE4NAEKAgICA4AAMAQsgACABIAYQogULIQUgACABEAwgBQvOAQIBfwJ+IwBBEGsiAiQAAkBBuNQEKQMAUA0AQbTUBCgCACAAIAAQPRDqASEDQbTUBCgCACABIAEQPUH9/wAQ8wMiBEHA1AQoAgAQkAMEQEG01AQoAgAgBBAMQbTUBCgCACADEAwMAQsgAiAENwMIIAIgAzcDAEG01AQoAgBBuNQEKQMAQoCAgIAwQQIgAhAcIQNBtNQEKAIAIAIpAwAQDEG01AQoAgAgAikDCBAMIANBwNQEKAIAEJADGkG01AQoAgAgAxAMCyACQRBqJAALPQACfgJAIAEQlgMiAkUNACACLQAQQQFxDQBCgICAgDAgAi0AEUEBcQ0BGgsgAEGTIkEAEBJCgICAgOAACwsSACAAQZMiQQAQEkKAgICA4AAL1w4CB38BfiMAQdAAayIIJAAgCEEAQdAAECwiCCAENgIMIAggADYCACAIQQE2AgggCEKggICAEDcDECAIIAI2AjggCCACIANqIgI2AjwjAEEQayIHJAACQCAIKAI4IgMtAABBI0cNACADLQABQSFHDQAgByADQQJqIgM2AgwDQAJAIAIgA00NAAJAIAMtAAAiCUEKaw4EAQAAAQALIAnAQQBIBEAgA0EGIAdBDGoQUSEJIAcoAgwhAyAJQX5xQajAAEYNASAJQX9HDQILIAcgA0EBaiIDNgIMDAELCyAIIAM2AjgLIAdBEGokAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAFQQNxIgdBAkYEQCAAKAIQKAKMASILRQ0EIAspAwgiDkL/////b1gNAyAOpyICLwEGEOABRQ0CIAIoAiQhDCACKAIgIgItABAhAwwBCyAFQQN2IQkgB0EBRwR/IAlBA3EFQoCAgIDgACEOIAAgBBC2ASICRQ0MAn8gAEG4ARBcIgNFBEAgACACEBAgAwwBCyADQoCAgIAwNwOwASADQoCAgIAwNwOoASADQoCAgIAwNwNIIANCgICAgDA3A0AgAyACNgIEIANBATYCACADQoCAgIAwNwOYASADQoCAgIAwNwOQASADQoCAgIAwNwOIASAAKALgASICIANBCGoiCjYCBCADIABB4AFqNgIMIAMgAjYCCCAAIAo2AuABIAMLIgpFDQwgCUECcUEBcgshA0EAIQILIABBAEEBQQAgBEEBEOoDIgRFDQcgCCAENgJAIAQgB0ECRyIJNgJMIAQgBzYCJCAEIAVBBnZBAXE2AmgCQCAJRQRAIAQgAi8AEUEGdkEBcTYCUCAEIAIvABFBB3ZBAXE2AlQgBCACLQASQQFxNgJYIAIvABEhByAEQdEANgJwIAQgAzoAbiAEIAdBCXZBAXE2AlwMAQsgBEHRADYCcCAEIAM6AG4gBEKAgICAEDcCWCAEQgA3AlAgAkUNBQsgAigCPCEDIAIvASohByACLwEoIQkgBEEANgLAAiAEQQA2AsgCIAQgAyAHIAlqaiIDNgLEAiADRQ0EIAQgACADQQN0ECQiAzYCyAIgA0UNBQNAIAZBAE4EQCACKAIgIAZBBHRqIAIvAShBBHRqIgMoAgRBAEoEQCAEIAQoAsACIgdBAWo2AsACIAAgBCgCyAIgB0EDdGogAyAGEOkDCyADKAIIIQYMAQsLQQAhAyAGQX5GBEADQCADIAIvASpPDQUCQCACKAIgIANBBHRqIAIvAShBBHRqIgYoAgQNACAGEKYFRQ0AIAQgBCgCwAIiB0EBajYCwAIgACAEKALIAiAHQQN0aiAGIAMQ6QMLIANBAWohAwwACwALA0AgAi8BKCADTQRAQQAhAwNAIAMgAi8BKk8NBgJAIAIoAiAgA0EEdGogAi8BKEEEdGoiBigCBA0AIAYoAgBB0gBGDQAgBCAEKALAAiIHQQFqNgLAAiAAIAQoAsgCIAdBA3RqIAYgAxDpAwsgA0EBaiEDDAALAAUgBCAEKALAAiIGQQFqNgLAAiACKAIgIQcgBCgCyAIgBkEDdGoiBiADOwECIAZBAzoAACAGIAAgByADQQR0aigCABAWNgIEIANBAWohAwwBCwALAAtBxYkBQajsAEHXiwJBmsUAEAAAC0Gk8gBBqOwAQdWLAkGaxQAQAAALQff1AEGo7ABB1IsCQZrFABAAAAtBACEGA0AgBiACKAI8Tg0BIAIoAiQhByAEIAQoAsACIgNBAWo2AsACIAQoAsgCIANBA3RqIgMgAy0AACIJQf4BcToAACADIAcgBkEDdGoiBy0AAEECcSAJQfwBcXIiCToAACADIAlB+gFxIActAABBBHFyIgk6AAAgAyAJQfYBcSAHLQAAQQhxciIJOgAAIActAAAhDSADIAY7AQIgAyAJQQ5xIA1B8AFxcjoAACADIAAgBygCBBAWNgIEIAZBAWohBgwACwALIAQgCjYClAMgBUGAAXEgCnIEQCAEQQI6AGwgBEEBNgJkCyAIIApFNgJIIAggCkEARzYCRCAIEHQaIAQgBCgCvAE2AvABIAgQDw0AIAgQpQUNACAEIAQoAiRBAk8EfyAELQBuQX9zQQFxBUEBCzYCKCAIKAJERQRAIAQgCCgCACAEQdIAEEwiAjYCpAEgAkEASA0BCwNAIAgoAhBBqn9GDQIgCBCkBUUNAAsLIAggCEEQahCBAiAAIAQQ+wIMAQsgCCAIKAJEBH9BAAUgCEHYABANIAgoAkBBgAJqIAQvAaQBECZBAQsQsAIgCgRAIAogBCgCmAM6AFQLIAAgBBCjBSIOQoCAgIBwg0KAgICA4ABRDQAgCgRAIAogDjcDSCAAIAoQ+QNBAEgNAiAKIAooAgBBAWo2AgAgCq1CgICAgFCEIQ4LIAVBIHENAyAAIA4gASAMIAsQtwUhDgwDCyAKRQ0BCyAAIAoQ8gULQoCAgIDgACEOCyAIQdAAaiQAIA4LagIBfwF+QbDUBCgCAARAEIwFC0Gw1AQQ4wUiAjYCACACEO0EIQJBwNQEIAE2AgBBtNQEIAI2AgAgAiAAIAAQPUHR/wAQsgUiAyABEJADBEBBtNQEKAIAIAMQDEEADwtBuNQEIAM3AwBBAQvsAgIDfwF8IwBB0ABrIgQkACAEQRBqQQBBOBAsGiAEQoCAgICAgID4PzcDIEKAgICAwH4hAQJAIAJFDQBBByACIAJBB04bIgJBACACQQBKGyECA0AgAiAFRwRAIAAgBEEIaiADIAVBA3QiBmopAwAQQgRAQoCAgIDgACEBDAMLIAQrAwgiB71CgICAgICAgPj/AINCgICAgICAgPj/AFENAiAEQRBqIAZqIAedOQMAAkAgBQ0AIAQrAxAiB0QAAAAAAAAAAGZFIAdEAAAAAAAAWUBjRXINACAEIAdEAAAAAACwnUCgOQMQCyAFQQFqIQUMAQsLIARBEGpBABDrAyIHvSIBAn8gB5lEAAAAAAAA4EFjBEAgB6oMAQtBgICAgHgLIgW3vVEEQCAFrSEBDAELQoCAgIDAfiABQoCAgIDAgYD8/wB9IAFC////////////AINCgICAgICAgPj/AFYbIQELIARB0ABqJAAgAQtWABCoBSIBQoCAgIAIfEL/////D1gEQCABQv////8Pgw8LQoCAgIDAfiABub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwvvAQEDfiMAQRBrIgIkAEKAgICA4AAhBAJAIAAgACABECAiAUEBELsCIgVCgICAgHCDQoCAgIDgAFENACAFQiCIpyIDQQAgA0ELakESSRtFBEAgACACQQhqIAUQQkEASA0BQoCAgIAgIQQgAikDCEKAgICAgICA+P8Ag0KAgICAgICA+P8AUQ0BC0KAgICA4AAhBCAAIAFB48oAEIcCIgZCgICAgHCDQoCAgIDgAFENACAAIAYQNUUEQCAAQergAEEAEBIgACAGEAwMAQsgACAGIAFBAEEAEDYhBAsgACABEAwgACAFEAwgAkEQaiQAIAQLjAIDAXwBfgF/IwBBEGsiAiQAQoCAgIDgACEFAkAgACACQQhqIgYgARCmAg0AIAAgBiADKQMAEEINACACAn4gAisDCCIEvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUgRAIASdIgREAAAAAACwnUCgIAQgBEQAAAAAAABZQGMbIAQgBEQAAAAAAAAAAGYbIQQLIAS9IgUCfyAEmUQAAAAAAADgQWMEQCAEqgwBC0GAgICAeAsiA7e9UQRAIAOtDAELQoCAgIDAfiAFQoCAgIDAgYD8/wB9IAVC////////////AINCgICAgICAgPj/AFYbCzcDACAAIAFBASACQREQ+AQhBQsgAkEQaiQAIAULigEDAX4BfAF/IwBBEGsiAiQAQoCAgIDgACEEAkAgACACQQhqIgYgARCmAg0AIAAgBiADKQMAEEINACAAIAEgAisDCCIFnUQAAAAAAAAAAKBEAAAAAAAA+H8gBUQAANzCCLI+Q2UbRAAAAAAAAPh/IAVEAADcwgiyPsNmGxD5BCEECyACQRBqJAAgBAvZAQIBfAF+IwBB0ABrIgIkAAJ+QoCAgIDgACAAIAEgAiAEQQ9xQQAQ1QMiAEEASA0AGkKAgICAwH4gAEUNABogBEGAAnEEQCACIAIrAwBEAAAAAACwncCgOQMACyACIARBBHZBD3FBA3RqKwMAIgW9IgECfyAFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsiBLe9UQRAIAStDAELQoCAgIDAfiABQoCAgIDAgYD8/wB9IAFC////////////AINCgICAgICAgPj/AFYbCyEGIAJB0ABqJAAgBguHAQIBfAF+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IAMpAxAiBUIgiKdBdU8EQCAFpyIJIAkoAgBBAWo2AgALIAggBTcDCAJAIAQNACADKQMYIgVCIIinQXVJDQAgBaciCSAJKAIAQQFqNgIACyAIIAE3AxAgCCAFNwMAIAAgByAGQQMgCBAcIQUgACAIKQMAEAwgBEUEQCAAIAgpAwgQDAsgAygCBCEDIAAoAhAgAhDiAyAFQoCAgIBwg0KAgICA4ABRDQIgACAFEAwLDAALAAsgCEEgaiQAIAULVAAgACABIAJBImoQWiIARQRAQoCAgIDgAA8LIAAoAgwiAEEATgRAIACtDwtCgICAgMB+IAC4vSIBQoCAgIDAgYD8/wB9IAFCgICAgICAgPj/AFYbC1kBAX8gACABIARBImoQWiICRQRAQoCAgIDgAA8LIAJBBGohAyACKAIIIQQDfiADIARGBH5CgICAgDAFIARBEGshBSAEKAIEIQQgACgCECACIAUQgAUMAQsLC3UAIAAgASAEQSJqEFoiAkUEQEKAgICA4AAPCyAAIAIgAykDACIBQgAgAUIgiKdBB2tBbk8bIAEgAUKAgICAwIGA/P8AfEL///////////8Ag1AbEPICIgNFBEBCgICAgBAPCyAAKAIQIAIgAxCABUKBgICAEAthACAAIAEgBEEiahBaIgJFBEBCgICAgOAADwsgACACIAMpAwAiAUIAIAFCIIinQQdrQW5PGyABIAFCgICAgMCBgPz/AHxC////////////AINQGxDyAkEAR61CgICAgBCECwgAQoCAgIAwC0oAAkAgBSkDACIBQoCAgIBwVA0AIAGnIgIvAQZBLEcNACACKAIgIgJFDQAgAkEBOgARIAAgARAMIAVCgICAgCA3AwALQoCAgIAwC88BAQN+IwBBEGsiAiQAQoCAgIDgACEFAkACQAJ+QoCAgIAwIABCgICAgDAgACADEMAEIgRCgICAgHCDQoCAgIDgAFENABogAiAENwMIQoCAgIDgACAAQcMAQQBBAEEBIAJBCGoQhQEiBkKAgICAcINCgICAgOAAUQ0AGiAAEDMiAUKAgICAcINCgICAgOAAUg0BIAYLIQEgACAEEAwgACABEAwMAQsgACABQYQBIARBBxAVGiAAIAFBhQEgBkEHEBUaIAEhBQsgAkEQaiQAIAULswMCA38CfiMAQdAAayIGJABBfyEHAkAgACAGQcgAaiABQcMAEH4iCEUNACAGKQNIIgFCgICAgHCDQoCAgIAwUQRAIAgpAwAhASADQiCIp0F1TwRAIAOnIgcgBygCAEEBajYCAAsgACABIAIgAyAEIAUQ0AEhBwwBCyAAIAIQUiIJQoCAgIBwg0KAgICA4ABRBEAgACABEAwMAQsgCCkDACEKIAYgBDcDOCAGIAM3AzAgBiAJNwMoIAYgCjcDICAAIAEgCCkDCEEEIAZBIGoQNiEBIAAgCRAMIAFCgICAgHCDQoCAgIDgAFENAAJAAkAgACABECciBwRAIAAgBiAIKAIAIAIQQyICQQBIDQEgAkUNAwJAIAYoAgAiAkETcUUEQCAAIAYpAwggAxBNRQ0BDAQLIAJBEXFBEEcNAyAGNQIcQiCGQoCAgIAwUg0DCyAAIAYQRiAAQdEcQQAQEgwBCyAFQYCAAXFFBEBBACEHIAVBgIACcUUNAyAAKAIQKAKMASICRQ0DIAItAChBAXFFDQMLIABBwAlBABASC0F/IQcMAQsgACAGEEYLIAZB0ABqJAAgBwvTAgICfwJ+IwBBQGoiBCQAAkACQCAAIARBOGogAUHCABB+IgVFDQAgBCkDOCIBQoCAgIBwg0KAgICAMFEEQCAAIAUpAwAgAiADQQAQESEBDAILIAAgAhBSIgZCgICAgHCDQoCAgIDgAFEEQCAAIAEQDAwBCyAFKQMAIQcgBCADNwMwIAQgBjcDKCAEIAc3AyAgACABIAUpAwhBAyAEQSBqEDYhASAAIAYQDCABQoCAgIBwgyIDQoCAgIDgAFENACAAIAQgBSgCACACEEMiAkEASA0AIAJFDQECQAJAIAQoAgAiAkETcUUEQCAAIAQpAwggARBNRQ0BDAILIAJBEXFBEEcgA0KAgICAMFFyDQEgBDUCFEIghkKAgICAMFINAQsgACAEEEYgACABEAwgAEGoHUEAEBIMAQsgACAEEEYMAQtCgICAgOAAIQELIARBQGskACABC5gCAgR/An4jAEFAaiIDJABBfyEEAkAgACADQThqIAFB5AAQfiIFRQ0AIAMpAzgiAUKAgICAcINCgICAgDBRBEAgACAFKQMAIAIQbiEEDAELIAAgAhBSIgdCgICAgHCDQoCAgIDgAFEEQCAAIAEQDAwBCyAFKQMAIQggAyAHNwMoIAMgCDcDICAAIAEgBSkDCEECIANBIGoQNiEBIAAgBxAMIAFCgICAgHCDQoCAgIDgAFENACAAIAEQJyIEDQACQCAAIAMgBSgCACIEIAIQQyICQQBOBEAgAkUNASADKAIAIQYgACADEEYgBkEBcQRAIAQtAAVBAXENAgsgAEG4KkEAEBILQX8hBAwBC0EAIQQLIANBQGskACAEC50GAgd/A34jAEFAaiIHJABBfyEIAkAgACAHQThqIAFB5gAQfiIJRQ0AIAcpAzgiDkKAgICAcINCgICAgDBRBEAgACAJKQMAIAIgAyAEIAUgBhBqIQgMAQsgACACEFIiD0KAgICAcINCgICAgOAAUgRAIAAQMyIBQoCAgIBwg0KAgICA4ABSBEAgBkGAEHEiDQRAIARCIIinQXVPBEAgBKciCiAKKAIAQQFqNgIACyAAIAFBwgAgBEEHEBUaCyAGQYAgcSIKBEAgBUIgiKdBdU8EQCAFpyILIAsoAgBBAWo2AgALIAAgAUHDACAFQQcQFRoLIAZBgMAAcSILBEAgA0IgiKdBdU8EQCADpyIMIAwoAgBBAWo2AgALIAAgAUHBACADQQcQFRoLIAZBgARxIgwEQCAAIAFBPyAGQQF2QQFxrUKAgICAEIRBBxAVGgsgBkGACHEEQCAAIAFBwAAgBkECdkEBca1CgICAgBCEQQcQFRoLIAZBgAJxBEAgACABQT4gBkEBca1CgICAgBCEQQcQFRoLIAkpAwAhECAHIAE3AzAgByAPNwMoIAcgEDcDICAAIA4gCSkDCEEDIAdBIGoQNiEOIAAgDxAMIAAgARAMIA5CgICAgHCDQoCAgIDgAFENAiAAIA4QJ0UEQEEAIQggBkGAgAFxRQ0DIABBmTlBABASQX8hCAwDCyAAIAcgCSgCACIJIAIQQyICQQBIDQIgBkGBAnEhCAJAAkAgAkUEQCAIQYACRg0BQQEhCCAJLQAFQQFxRQ0BDAULAkAgBygCACICIAYQjwNFIAJBAXEgCEGAAkZxcg0AAkAgBkGAMHEEQCACQRFxQRBHDQEgDQRAIAAgBCAHKQMQEE1FDQMLIApFDQEgACAFIAcpAxgQTQ0BDAILIAtFDQAgBkECcUUgAkEDcSICQQJGcQ0BIAINACAAIAMgBykDCBBNRQ0BCyAMRQ0CIAcoAgBBE3FBAkcNAgsgACAHEEYLIABBiAtBABASQX8hCAwDCyAAIAcQRkEBIQgMAgsgACAPEAwLIAAgDhAMCyAHQUBrJAAgCAutAgIDfwJ+IwBBQGoiAyQAQX8hBAJAIAAgA0E4aiABQeUAEH4iBUUNACADKQM4IgFCgICAgHCDQoCAgIAwUQRAIAAgBSkDACACQQAQzQEhBAwBCyAAIAIQUiIGQoCAgIBwg0KAgICA4ABRBEAgACABEAwMAQsgBSkDACEHIAMgBjcDKCADIAc3AyAgACABIAUpAwhBAiADQSBqEDYhASAAIAYQDCABQoCAgIBwg0KAgICA4ABRDQAgACABECciBEUEQEEAIQQMAQsCQCAAIAMgBSgCACACEEMiAkEATgRAIAJFDQICQCADLQAAQQFxBEAgACAFKQMAEJcBIgJBAEgNASACDQMLIABB5QpBABASCyAAIAMQRgtBfyEEDAELIAAgAxBGCyADQUBrJAAgBAuDBgIPfwJ+IwBBQGoiBSQAQX8hCwJAIAAgBUE4aiADQegAEH4iB0UNACAFKQM4IgNCgICAgHCDQoCAgIAwUQRAIAAgASACIAcoAgBBAxB9IQsMAQsgACADIAcpAwhBASAHEDYiA0KAgICAcINCgICAgOAAUQ0AIAVBADYCLCAFQQA2AjQgBUEANgIwIAAgBUE0aiADEMoBIQYgBSgCNCEKAkAgBg0AAkAgCkUNACAAIApBA3QQXCIJDQBBACEJDAELAn8CQANAAkAgBCAKRgRAQQEgCiAKQQFNGyEIQQEhBANAIAQgCEYNAiAJIAQgCSAEQQN0aigCBBCDBSEQIARBAWohBCAQQQBIDQALIABBogpBABASQQAMBAsgACADIAQQpgEiE0KAgICAcIMiFEKAgICAgH9RIBRCgICAgJB/UXJFBEBBACAUQoCAgIDgAFENBBogACATEAwgAEHbJUEAEBJBAAwECyAAIBMQMCEIIAAgExAMIAhFDQIgCSAEQQN0aiIGQQA2AgAgBiAINgIEIARBAWohBAwBCwtBACAAIAcpAwAQlwEiDEEASA0BGiAHLQARBEAgABC4AgwBCyAAIAVBLGogBUEwaiAHKAIAQQMQfSERIAUoAjAhBCAFKAIsIQggEQ0CQQAhBgNAIAQgBkcEQCAHLQARBEAgABC4AgwFCyAAIAVBCGoiDiAHKAIAIAggBkEDdGoiDSgCBBBDIg9BAEgNBAJAIA9FDQAgACAOEEYgDARAIAUoAghBAXENAQsgCSAKIA0oAgQQgwUiDUEASARAIABBjSBBABASDAYLIAwNACAJIA1BA3RqQQE2AgALIAZBAWohBgwBCwsCQCAMDQBBACEHA0AgByAKRg0BIAdBA3QhEiAHQQFqIQcgEiAJaigCAA0ACyAAQdMIQQAQEgwDCyAAIAggBBBbIAAgAxAMIAEgCTYCACACIAo2AgBBACELDAMLQQALIQRBACEICyAAIAggBBBbIAAgCSAKEFsgACADEAwLIAVBQGskACALC64EAgV/An4jAEHgAGsiBCQAQX8hBQJAIAAgBEHYAGogAkHnABB+IgZFDQAgBigCACEHIAQpA1giAkKAgICAcINCgICAgDBRBEAgACABIAcgAxBDIQUMAQsgACADEFIiCUKAgICAcINCgICAgOAAUQRAIAAgAhAMDAELIAYpAwAhCiAEIAk3A0ggBCAKNwNAIAAgAiAGKQMIQQIgBEFAaxA2IQIgACAJEAwgAkKAgICAcIMiCUKAgICA4ABRDQACQAJAAkAgCUKAgICAMFEgAkL/////b1ZyRQRAIAAgAhAMDAELIAAgBCAHIAMQQyIDQQBIDQICQCADRQRAQQAhBSAJQoCAgIAwUQ0FDAELIAAgBBBGIAlCgICAgDBSDQAgBC0AAEEBcUUNAUEAIQUgBy0ABUEBcUUNAQwEC0F/IQUgACAGKQMAEJcBIgZBAEgNAiAAIARBIGogAhCEBSEIIAAgAhAMIAhBAEgNAwJAIAMEQCAEKAIAIgVBgDpBgM4AIAQoAiAiA0EQcRsgA3IQjwNFDQEgA0EBcQ0DIAVBAXENASADQRJxDQMgBUECcQ0BDAMLIAZFDQAgBC0AIEEBcQ0CCyAAIARBIGoQRgsgAEGaK0EAEBJBfyEFDAILAkAgAQRAIAEgBCkDIDcDACABIAQpAzg3AxggASAEKQMwNwMQIAEgBCkDKDcDCAwBCyAAIARBIGoQRgtBASEFDAELIAAgAhAMCyAEQeAAaiQAIAULDQAgACABIAJBLBDvBQsLACAAIAFBLBDwBQsWACAAIAMpAwAgAykDCCADKQMQEPIDC9EBAgN+An8jAEEQayIHJAACQCAAIAdBDGogAykDABDfASIIRQRAQoCAgIDgACEEDAELIAAgCCAHKAIMQcn/ABDzAyEBIAAgCBAxAkAgAkECSCABQoCAgIBwg0KAgICA4ABRcg0AIAAgAykDCCIGEDVFDQBCgICAgOAAIQQCQCAAEDMiBUKAgICAcINCgICAgOAAUQRAIAEhBQwBCyAAIAVBLyABQQcQFUEASA0AIAAgBUEvIAYQhQUhBAsgACAFEAwMAQsgASEECyAHQRBqJAAgBAsQACAAIAMpAwBBESAEELICC6UDAQR+IwBBEGsiAyQAIAQCfwJAAkACQAJAIAAgAUEqEFoiAkUEQEKAgICAMCEBDAELIAIoAhgEQEKAgICAMCEBQQEMBQsgACACKQMAIgggAikDCCIGEMUBIgFCgICAgHCDIgdCgICAgOAAUg0BC0KAgICAMCEHDAELIAdCgICAgCBRBEAgAkEBNgIYQoCAgIAwIQFBAQwDCyACKAIQBEAgACAAIAFCABBOEDQiB0KAgICAcIMiCUKAgICA4ABRDQECQCAJQoCAgICQf1INACAHpygCBEH/////B3ENACAAIANBCGogACAIQdYAIAhBABAREKEBQQBIDQIgACAIQdYAAn4gBqcgAykDCCACKAIUEPQCIgZCgICAgAh8Qv////8PWARAIAZC/////w+DDAELQoCAgIDAfiAGub0iBkKAgICAwIGA/P8AfSAGQv///////////wCDQoCAgICAgID4/wBWGwsQOUEASA0CCyAAIAcQDAwCCyACQQE2AhgMAQsgACABEAwgACAHEAxCgICAgOAAIQELQQALNgIAIANBEGokACABCyAAIAFCIIinQXVPBEAgAaciACAAKAIAQQFqNgIACyABC/EHAgR/C34jAEEwayIEJAACQCABQv////9vWARAIAAQIkKAgICA4AAhAQwBC0KAgICAMCEIAkACQCAAIAMpAwAQJSIPQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhDEKAgICAMCEBQoCAgIAwIQ1CgICAgDAhEAwBCyAAIAEgACkDSBD9ASIQQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhDEKAgICAMCEBQoCAgIAwIQ0MAQsCQAJAIAAgACABQe4AIAFBABAREDQiDUKAgICAcINCgICAgOAAUQ0AIA2nIgJB9QBBABCgASEGIAJB+QBBABCgAUEASARAIABB7JYBIA1B0A4QsgEiDUKAgICAcINCgICAgOAAUQ0BCyAEIA03AyggBCABNwMgIAAgEEECIARBIGoQowEiDEKAgICAcINCgICAgOAAUQ0BIAAQOyIBQoCAgIBwg0KAgICA4ABRBEBCgICAgOAAIQEMAwtBfyECAkAgAykDCCIJQoCAgIBwg0KAgICAMFENACAAIARBHGogCRB1QQBIDQMgBCgCHCICDQAMBAsCQAJAIA+nIgcpAgQiCKdB/////wdxIgUEQCAGQX9zQR92IQYgCEL/////B4MhESACrSESQgAhCUKAgICAMCEIQQAhAgNAIAKtIQogAiEDA0AgAyAFTw0DIAAgDEHWACADrSIOEDlBAEgNByAAIAgQDAJAIAAgDCAPEMUBIghCgICAgHCDIgtCgICAgCBRDQAgC0KAgICA4ABRDQggACAEQRBqIAAgDEHWACAMQQAQERChAQ0IIAQgBCkDECILIBEgCyARUxsiCzcDECAKIAtRDQAgACAHIAIgAxCOASIKQoCAgIBwg0KAgICA4ABRDQggACABIAkgChBnQQBIDQggCUIBfCIKIBJRDQkgACAEQQhqIAgQLw0IIAunIQJCASELIAlCASAEKQMIIg4gDkIBVxt8IQkDQCAJIApRDQMgACAAIAggCxBsEDQiDkKAgICAcINCgICAgOAAUQ0JIAAgASAKIA4QZ0EASA0JIAtCAXwhCyAKQgF8IgogElINAAsMCQsgByAOIAYQ9AKnIQMMAAsACwALIAAgDCAPEMUBIghCgICAgHCDIglCgICAgCBSDQFCACEJQQAhAgsgACAHIAIgBSACIAVJGyAFEI4BIgpCgICAgHCDQoCAgIDgAFENAyAAIAEgCSAKEGdBAEgNAwwECyAJQoCAgIDgAFINAwwCC0KAgICAMCEMC0KAgICAMCEBCyAAIAEQDEKAgICA4AAhAQsgACAPEAwgACAQEAwgACAMEAwgACANEAwgACAIEAwLIARBMGokACABC+ACAQd+IAFC/////29YBEAgABAiQoCAgIDgAA8LQoCAgIDgACEIQoCAgIAwIQYCQAJAAkAgACADKQMAECUiB0KAgICAcINCgICAgOAAUQRAQoCAgIAwIQQMAQsgACABQdYAIAFBABARIgRCgICAgHCDQoCAgIDgAFENACAAIARCABBNRQRAIAAgAUHWAEIAEDlBAEgNAQsgACABIAcQxQEiBUKAgICAcIMiCUKAgICA4ABRDQEgACABQdYAIAFBABARIgZCgICAgHCDQoCAgIDgAFENAQJAIAAgBiAEEE0EQCAAIAQQDAwBCyAAIAFB1gAgBBA5QQBODQBCgICAgDAhBAwCCyAAIAcQDCAAIAYQDEL/////DyEIIAlCgICAgCBRDQIgACAFQdgAIAVBABARIQogACAFEAwgCg8LQoCAgIAwIQULIAAgBRAMIAAgBxAMIAAgBhAMIAAgBBAMCyAIC84EAgZ+AX8jAEEgayICJAACQCABQv////9vWARAIAAQIkKAgICA4AAhBwwBC0KAgICA4AAhB0KAgICAMCEIAkAgACADKQMAECUiCUKAgICAcINCgICAgOAAUQRAQoCAgIAwIQRCgICAgDAhBUKAgICAMCEGDAELAkACQCAAIAEgACkDSBD9ASIGQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhBAwBCyAAIAAgAUHuACABQQAQERA0IgRCgICAgHCDQoCAgIDgAFINAQtCgICAgDAhBQwBCyACIAQ3AxggAiABNwMQIAAgBkECIAJBEGoQowEiBUKAgICAcINCgICAgOAAUQ0AIAAgAkEIaiAAIAFB1gAgAUEAEBEQoQENACAAIAVB1gACfiACKQMIIgFCgICAgAh8Qv////8PWARAIAFC/////w+DDAELQoCAgIDAfiABub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwsQOUEASA0AQoCAgIDgACEIIABBKhCGASIBQoCAgIBwg0KAgICA4ABRDQAgAEEgECQiA0UEQCABIQgMAQsgAyAJNwMIIAMgBTcDACADIASnIgpB5wBBABCgAUF/c0EfdjYCECAKQfUAQQAQoAEhCiADQQA2AhggAyAKQX9zQR92NgIUIAFCgICAgHBaBEAgAacgAzYCIAsgACAGEAwgACAEEAwgASEHDAELIAAgCRAMIAAgBhAMIAAgBBAMIAAgBRAMIAAgCBAMCyACQSBqJAAgBwv+BAIIfgJ/IwBBEGsiAiQAAkAgAUL/////b1gEQCAAECJCgICAgOAAIQcMAQtCgICAgOAAIQdCgICAgDAhBQJAAkACQCAAIAMpAwAQJSIJQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhCAwBCyAAIAFB7gAgAUEAEBEiCEKAgICAcINCgICAgOAAUQ0AIAAgCBA0IghCgICAgHCDQoCAgIDgAFENACAIp0HnAEEAEKABQX9GBEAgACABIAkQxQEhBwwDCyAAIAAgAUHwACABQQAQERAnIgxBAEgNACAAIAFB1gBCABA5QQBIDQAgABA7IgZCgICAgHCDQoCAgIDgAFEEQEKAgICA4AAhBgwCCyAJpyENA0ACQCAAIAUQDCAAIAEgCRDFASIFQoCAgIBwgyIEQoCAgIAgUQ0AIARCgICAgOAAUQ0DAkAgACAAIAVCABBOEDQiBEKAgICAcIMiC0KAgICAkH9SBEBBACEDIAtCgICAgOAAUQ0FDAELIASnKAIEQf////8HcUUhAwsgACAGIAogBBB7QQBIDQMgCkIBfCEKIANFDQEgACACQQhqIAAgAUHWACABQQAQERChAUEASA0DIAAgAUHWAAJ+IA0gAikDCCAMEPQCIgRCgICAgAh8Qv////8PWARAIARC/////w+DDAELQoCAgIDAfiAEub0iBEKAgICAwIGA/P8AfSAEQv///////////wCDQoCAgICAgID4/wBWGwsQOUEATg0BDAMLCyAKpwRAIAYhBwwDCyAAIAYQDEKAgICAICEHDAILQoCAgIAwIQYLIAAgBhAMCyAAIAUQDCAAIAgQDCAAIAkQDAsgAkEQaiQAIAcLjgEBAn8gASgCACICQQBKBEAgASACQQFrIgI2AgACQCACDQAgAS0ABEHwAXFBEEcNACABKAIIIgIgASgCDCIDNgIEIAMgAjYCACABQQA2AgggACgCYCICIAFBCGoiAzYCBCABIABB4ABqNgIMIAEgAjYCCCAAIAM2AmALDwtB5oQBQajsAEHWLEHN4wAQAAAL8BQCDn8OfiMAQZABayIEJAACQCABQv////9vWARAIAAQIkKAgICA4AAhFQwBCyADKQMIIR4gACAEQThqQQAQPhogBEEANgIwIARCgICAgMAANwMoIAQgADYCACAEIARBCGoiBzYCBEKAgICA4AAhFUKAgICAMCEWQoCAgIAwIRdCgICAgDAhE0KAgICAMCEUQoCAgIAwIR1CgICAgDAhHAJAAkAgACADKQMAECUiGEKAgICAcINCgICAgOAAUQ0AIAAgHhA1IglFBEAgACAeECUiHUKAgICAcINCgICAgOAAUQ0BIB2nIQULAkACQCAAIAFB7gAgAUEAEBEiHEKAgICA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QQRqIQMMAAsACwuaAQEHfyABpygCICIDBEAgAEEQaiEEIANBBGohBiADKAIIIQIDQCACIAZHBEAgAigCBCEIIAJBEGshBSACQQxrKAIARQRAAkAgAygCAARAIAUQnAUMAQsgACACKQMQECELIAAgAikDGBAhCyAEIAUgACgCBBEAACAIIQIMAQsLIAQgAygCECAAKAIEEQAAIAQgAyAAKAIEEQAACwsbAQF/IAGnKAIgIgMEQCAAIAMoAgwgAhEAAAsLUgEDfyABpygCICICBEAgAigCBCIDBEAgAigCACIEIAM2AgQgAyAENgIAIAJCADcCAAsgACACNQIMQoCAgIBwhBAhIABBEGogAiAAKAIEEQAACwupAQEGfyABpygCICIDBEAgA0EMaiEFIAMoAhAhAgNAIAIgBUcEQCACKAIEIQcgAkIANwIAIAIoAgghBCAHIQIgBC8BBkEgRg0BIARCADcCJAwBCwsCQAJAIAMtAAVFDQAgACgCyAEiAkUNACAAKALQASADKAIIIAIRAAAMAQsgAygCGCICRQ0AIAAgAygCFCADKAIIIAIRBgALIABBEGogAyAAKAIEEQAACwspAQF/IAAgAaciAjUCJEKAgICAkH+EECEgACACNQIgQoCAgICQf4QQIQshACABpygCICkDACIBQoCAgIBgWgRAIAAgAacgAhEAAAsLaQEDfyAAIAGnKAIgIgIpAwAQISACLQARRQRAA0AgAigCFCEEIAMgAigCDE9FBEAgACAEIANBA3RqKAIEEMcBIANBAWohAwwBCwsgAEEQaiAEIAAoAgQRAAALIABBEGogAiAAKAIEEQAAC2wBA38CQCABQoCAgIBwVA0AIAGnIgMvAQZBD0cNACADKAIgIgRFDQAgBEEIaiEFQQAhAwNAIAMgBC0ABU8NASAFIANBA3RqKQMAIgFCgICAgGBaBEAgACABpyACEQAACyADQQFqIQMMAAsACwtqAQN/AkAgAUKAgICAcFQNACABpyICLwEGQQ9HDQAgAigCICIDRQ0AIANBCGohBEEAIQIDQCACIAMtAAVPRQRAIAAgBCACQQN0aikDABAhIAJBAWohAgwBCwsgAEEQaiADIAAoAgQRAAALC38BA38gAacoAiAiBCkDACIBQoCAgIBgWgRAIAAgAacgAhEAAAsgBCkDCCIBQoCAgIBgWgRAIAAgAacgAhEAAAsgBEEYaiEFA0AgBCgCECADSgRAIAUgA0EDdGopAwAiAUKAgICAYFoEQCAAIAGnIAIRAAALIANBAWohAwwBCwsLWQEDfyAAIAGnKAIgIgIpAwAQISAAIAIpAwgQISACQRhqIQQDQCADIAIoAhBORQRAIAAgBCADQQN0aikDABAhIANBAWohAwwBCwsgAEEQaiACIAAoAgQRAAALcgEEfyABpyIDKAIgIQQgAygCJCEFIAMoAigiAwRAIAAgAyACEQAACyAEBEACQCAFRQ0AQQAhAwNAIAMgBCgCPE4NASAFIANBAnRqKAIAIgYEQCAAIAYgAhEAAAsgA0EBaiEDDAALAAsgACAEIAIRAAALC3wBA38gAaciAigCKCIDBEAgACADrUKAgICAcIQQIQsgAigCICIDBEAgAigCJCIEBEBBACECA0AgAiADKAI8TkUEQCAAIAQgAkECdGooAgAQ5QEgAkEBaiECDAELCyAAQRBqIAQgACgCBBEAAAsgACADrUKAgICAYIQQIQsLEgAgAacoAiAiAARAIAAQngMLCx4AIAGnKQMgIgFCgICAgGBaBEAgACABpyACEQAACwsZACAAIAGnIgApAyAQISAAQoCAgIAwNwMgC0QBAn8gAachBANAIAQoAiggA0sEQCAEKAIkIANBA3RqKQMAIgFCgICAgGBaBEAgACABpyACEQAACyADQQFqIQMMAQsLC0YBA38gAachAwNAIAMoAiQhBCACIAMoAihPRQRAIAAgBCACQQN0aikDABAhIAJBAWohAgwBCwsgAEEQaiAEIAAoAgQRAAALEQAgAEEQaiACIAAoAgQRAAAL2wECAX8CfiMAQSBrIgMkACABQQNGBEAgAikDECEEIAIpAwghBQJAIAAgA0EQaiACKQMAEKoFQQBIBEBCgICAgOAAIQQMAQsgACAEIAVBAiADQRBqEBwiBEKAgICAcINCgICAgOAAUQRAIAAoAhAiASkDgAEhBCABQoCAgIAgNwOAASADIAQ3AwggACADKQMYQoCAgIAwQQEgA0EIahAcIQQgACADKQMIEAwLIAAgAykDEBAMIAAgAykDGBAMCyADQSBqJAAgBA8LQZuCAUGo7ABBy/UCQaDtABAAAAuIAQIBfgF/QQAhAkKAgICAMCEBA0ACQCACQQJHBH4gBSACQQN0IgRq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Y29kZV0KfQBjYW5ub3QgbWl4ID8/IHdpdGggJiYgb3IgfHwAcHJveHk6IHByb3BlcnR5IG5vdCBwcmVzZW50IGluIHRhcmdldCB3ZXJlIHJldHVybmVkIGJ5IG5vbiBleHRlbnNpYmxlIHByb3h5AHJldm9rZWQgcHJveHkAUHJveHkAYWRkX3Byb3BlcnR5AHByb3h5OiBjYW5ub3Qgc2V0IHByb3BlcnR5AG5vIHNldHRlciBmb3IgcHJvcGVydHkAdmFsdWUgaGFzIG5vIHByb3BlcnR5AGNvdWxkIG5vdCBkZWxldGUgcHJvcGVydHkAcHJveHk6IGR1cGxpY2F0ZSBwcm9wZXJ0eQBKU19EZWZpbmVBdXRvSW5pdFByb3BlcnR5AGhhc093blByb3BlcnR5AHByb3h5OiBpbmNvbnNpc3RlbnQgZGVsZXRlUHJvcGVydHkAcHJveHk6IGluY29uc2lzdGVudCBkZWZpbmVQcm9wZXJ0eQBKU19EZWZpbmVQcm9wZXJ0eQAhbXItPmVtcHR5AGluZmluaXR5AEluZmluaXR5AG91dCBvZiBtZW1vcnkAdW5rbm93biB1bmljb2RlIGdlbmVyYWwgY2F0ZWdvcnkAR2VuZXJhbF9DYXRlZ29yeQBldmVyeQBhbnkAYXBwbHkAJyVzJyBpcyByZWFkLW9ubHkAZXhwZWN0aW5nIGNhdGNoIG9yIGZpbmFsbHkAc3RpY2t5AGJpZ2ludCBhcmUgZm9yYmlkZGVuIGluIEpTT04uc3RyaW5naWZ5AHN1YmFycmF5AGVtcHR5IGFycmF5AG5vbiBpbnRlZ2VyIGluZGV4IGluIHR5cGVkIGFycmF5AG5lZ2F0aXZlIGluZGV4IGluIHR5cGVkIGFycmF5AG91dC1vZi1ib3VuZCBpbmRleCBpbiB0eXBlZCBhcnJheQBjYW5ub3QgY3JlYXRlIG51bWVyaWMgaW5kZXggaW4gdHlwZWQgYXJyYXkAaXNBcnJheQBUeXBlZEFycmF5AGdldERheQBnZXRVVENEYXkAZ3JvdXBCeQBtLT5kZnNfYW5jZXN0b3JfaW5kZXggPD0gbS0+ZGZzX2luZGV4AGpzX2dldF9hdG9tX2luZGV4AGludmFsaWQgYXJyYXkgaW5kZXgASlNfQXRvbUlzQXJyYXlJbmRleABmaW5kTGFzdEluZGV4AGZpbmRJbmRleABpbnZhbGlkIGV4cG9ydCBzeW50YXgAaW52YWxpZCBhc3NpZ25tZW50IHN5bnRheABtYXgAXHUlMDR4AGludmFsaWQgb3Bjb2RlOiBwYz0ldSBvcGNvZGU9MHglMDJ4AC0rICAgMFgweAAtMFgrMFggMFgtMHgrMHggMHgAbGluZSB0ZXJtaW5hdG9yIG5vdCBhbGxvd2VkIGFmdGVyIHRocm93AGJmX3BvdwBub3cAaW50ZWdlciBvdmVyZmxvdwBzdGFjayBvdmVyZmxvdwBtdXN0IGJlIGNhbGxlZCB3aXRoIG5ldwBpc1ZpZXcARGF0YVZpZXcAcmF3ACV1AGNsYXNzIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0AGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0AGxleGljYWwgZGVjbGFyYXRpb25zIGNhbid0IGFwcGVhciBpbiBzaW5nbGUtc3RhdGVtZW50IGNvbnRleHQAZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dABkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dABpbXBvcnQubWV0YSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29udGV4dABKU19GcmVlQ29udGV4dABKU0NvbnRleHQAanNfbWFwX2l0ZXJhdG9yX25leHQAanNfZ2VuZXJhdG9yX25leHQAanNfYXN5bmNfZ2VuZXJhdG9yX3Jlc3VtZV9uZXh0AHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0AHR0AGV4cG9ydGVkIHZhcmlhYmxlICclcycgZG9lcyBub3QgZXhpc3QAcHJpdmF0ZSBjbGFzcyBmaWVsZCAnJXMnIGRvZXMgbm90IGV4aXN0AHRlc3QAYXNzaWdubWVudCByZXN0IHByb3BlcnR5IG11c3QgYmUgbGFzdABwdmFsID09IGxhc3QAZmluZExhc3QAYmZfc3FydABzb3J0AGNicnQAdHJpbVN0YXJ0AHBhZFN0YXJ0AHVua25vd24gdW5pY29kZSBzY3JpcHQAU2NyaXB0AGh5cG90AGZyZWVfemVyb19yZWZjb3VudABzdHJfaW5kZXggPT0gbnVtX2tleXNfY291bnQgKyBzdHJfa2V5c19jb3VudABudW1faW5kZXggPT0gbnVtX2tleXNfY291bnQAc3ltX2luZGV4ID09IGF0b21fY291bnQAbGFiZWwgPj0gMCAmJiBsYWJlbCA8IHMtPmxhYmVsX2NvdW50AGxhYjEgPj0gMCAmJiBsYWIxIDwgcy0+bGFiZWxfY291bnQAdmFsIDwgcy0+Y2FwdHVyZV9jb3VudAB2YWwyIDwgcy0+Y2FwdHVyZV9jb3VudABpbnZhbGlkIHJlcGVhdCBjb3VudABpbnZhbGlkIHJlcGV0aXRpb24gY291bnQAZm9udABpbnZhbGlkIGNvZGUgcG9pbnQAZnJvbUNvZGVQb2ludABpbnZhbGlkIGhpbnQAY2Fubm90IGNvbnZlcnQgTmFOIG9yIEluZmluaXR5IHRvIGJpZ2ludABjYW5ub3QgY29udmVydCB0byBiaWdpbnQAYm90aCBvcGVyYW5kcyBtdXN0IGJlIGJpZ2ludABub3QgYSBiaWdpbnQAcHJpdmF0ZSBtZXRob2QgaXMgYWxyZWFkeSBwcmVzZW50AGVuY29kZVVSSUNvbXBvbmVudABkZWNvZGVVUklDb21wb25lbnQAdW5leHBlY3RlZCBlbmQgb2YgY29tbWVudABpbnZhbGlkIHN3aXRjaCBzdGF0ZW1lbnQAQmlnSW50AHBhcnNlSW50AGR1cGxpY2F0ZSBkZWZhdWx0AHNwbGl0AGV4cGVjdGluZyBoZXggZGlnaXQAdHJpbVJpZ2h0AHJlZHVjZVJpZ2h0AHVuc2hpZnQAdHJpbUxlZnQAaW52YWxpZCBvZmZzZXQAaW52YWxpZCBieXRlT2Zmc2V0AGdldFRpbWV6b25lT2Zmc2V0AHJlc29sdmluZyBmdW5jdGlvbiBhbHJlYWR5IHNldABwcm94eTogaW5jb25zaXN0ZW50IHNldABmaW5kX2p1bXBfdGFyZ2V0AGV4cGVjdGluZyB0YXJnZXQAaW52YWxpZCBkZXN0cnVjdHVyaW5nIHRhcmdldABwcm94eTogaW5jb25zaXN0ZW50IGdldABXZWFrU2V0AGNvbnN0cnVjdABKU19GcmVlQXRvbVN0cnVjdAB1c2Ugc3RyaWN0AFJlZmxlY3QAcmVqZWN0AG5vdCBhbiBBc3luY0dlbmVyYXRvciBvYmplY3QAY2Fubm90IGNvbnZlcnQgdG8gb2JqZWN0AGludmFsaWQgYnJhbmQgb24gb2JqZWN0AG9wZXJhbmQgJ3Byb3RvdHlwZScgcHJvcGVydHkgaXMgbm90IGFuIG9iamVjdABpdGVyYXRvciBtdXN0IHJldHVybiBhbiBvYmplY3QAbm90IGEgRGF0ZSBvYmplY3QAbm90IGEgb2JqZWN0AEpTT2JqZWN0AHBhcnNlRmxvYXQAZmxhdABub3RoaW5nIHRvIHJlcGVhdABjb25jYXQAY29kZVBvaW50QXQAY2hhckF0AGNoYXJDb2RlQXQAa2V5cwBwcm94eTogdGFyZ2V0IHByb3BlcnR5IG11c3QgYmUgcHJlc2VudCBpbiBwcm94eSBvd25LZXlzACAgZmFzdCBhcnJheXMAZXhwb3J0ICclcycgaW4gbW9kdWxlICclcycgaXMgYW1iaWd1b3VzAHByaXZhdGUgY2xhc3MgZmllbGQgJyVzJyBhbHJlYWR5IGV4aXN0cwB0b28gbWFueSBhcmd1bWVudHMAVG9vIG1hbnkgY2FsbCBhcmd1bWVudHMAdG9vIG1hbnkgZWxlbWVudHMAICBlbGVtZW50cwBpbnZhbGlkIG51bWJlciBvZiBkaWdpdHMAYmluYXJ5IG9iamVjdHMAaW52YWxpZCBwcm9wZXJ0eSBhY2Nlc3MAanNfb3BfZGVmaW5lX2NsYXNzAGZkLT5ieXRlX2NvZGUuYnVmW2RlZmluZV9jbGFzc19wb3NdID09IE9QX2RlZmluZV9jbGFzcwBfX2dldENsYXNzAHNldEhvdXJzAGdldEhvdXJzAHNldFVUQ0hvdXJzAGdldFVUQ0hvdXJzAGdhdGhlcl9hdmFpbGFibGVfYW5jZXN0b3JzAGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMAd2l0aFJlc29sdmVycwB0b28gbWFueSBpbWJyaWNhdGVkIHF1YW50aWZpZXJzAHVuaWNvZGVfcHJvcF9vcHMAYWNvcwBmb3IgYXdhaXQgaXMgb25seSB2YWxpZCBpbiBhc3luY2hyb25vdXMgZnVuY3Rpb25zAG5ldy50YXJnZXQgb25seSBhbGxvd2VkIHdpdGhpbiBmdW5jdGlvbnMAYnl0ZWNvZGUgZnVuY3Rpb25zAEMgZnVuY3Rpb25zAHByb3h5OiBpbmNvbnNpc3RlbnQgcHJldmVudEV4dGVuc2lvbnMAU2NyaXB0X0V4dGVuc2lvbnMAYXRvbXMAcHJveHk6IHByb3BlcnRpZXMgbXVzdCBiZSBzdHJpbmdzIG9yIHN5bWJvbHMAZ2V0T3duUHJvcGVydHlTeW1ib2xzAHJlc29sdmVfbGFiZWxzAEpTX0V2YWxUaGlzAHN0cmluZ3MAaW52YWxpZCBkZXNjcmlwdG9yIGZsYWdzAGludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZsYWdzAHZhbHVlcwBzZXRNaW51dGVzAGdldE1pbnV0ZXMAc2V0VVRDTWludXRlcwBnZXRVVENNaW51dGVzAHRvbyBtYW55IGNhcHR1cmVzACAgc2hhcGVzAGdldE93blByb3BlcnR5TmFtZXMAZ2NfZnJlZV9jeWNsZXMAYWRkX2V2YWxfdmFyaWFibGVzAHJlc29sdmVfdmFyaWFibGVzAHRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcwB0b28gbWFueSBjbG9zdXJlIHZhcmlhYmxlcwBjb21wYWN0X3Byb3BlcnRpZXMAICBwcm9wZXJ0aWVzAGRlZmluZVByb3BlcnRpZXMAZW50cmllcwBmcm9tRW50cmllcwB0b28gbWFueSByYW5nZXMAaW5jbHVkZXMAaGFzSW5kaWNlcwBzZXRNaWxsaXNlY29uZHMAZ2V0TWlsbGlzZWNvbmRzAHNldFVUQ01pbGxpc2Vjb25kcwBnZXRVVENNaWxsaXNlY29uZHMAc2V0U2Vjb25kcwBnZXRTZWNvbmRzAHNldFVUQ1NlY29uZHMAZ2V0VVRDU2Vjb25kcwBpdGFsaWNzAGFicwBwcm94eTogaW5jb25zaXN0ZW50IGhhcwAlLipzACAoJXMAc2V0ICVzAGdldCAlcwAgICAgYXQgJXMAbm90IGEgJXMAdW5zdXBwb3J0ZWQga2V5d29yZDogJXMAc3Vic3RyAHByb3h5OiBpbmNvbnNpc3RlbnQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yAHN1cGVyKCkgaXMgb25seSB2YWxpZCBpbiBhIGRlcml2ZWQgY2xhc3MgY29uc3RydWN0b3IAcGFyZW50IGNsYXNzIG11c3QgYmUgY29uc3RydWN0b3IAbm90IGEgY29uc3RydWN0b3IAQXJyYXkgSXRlcmF0b3IAU2V0IEl0ZXJhdG9yAE1hcCBJdGVyYXRvcgBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAG5vdCBhbiBBc3luYy1mcm9tLVN5bmMgSXRlcmF0b3IAY2Fubm90IGludm9rZSBhIHJ1bm5pbmcgZ2VuZXJhdG9yAG5vdCBhIGdlbmVyYXRvcgBBc3luY0dlbmVyYXRvcgBzeW50YXggZXJyb3IAU3ludGF4RXJyb3IARXZhbEVycm9yAEludGVybmFsRXJyb3IAQWdncmVnYXRlRXJyb3IAVHlwZUVycm9yAFJhbmdlRXJyb3IAUmVmZXJlbmNlRXJyb3IAVVJJRXJyb3IAZmxvb3IAZm9udGNvbG9yAGFuY2hvcgBmb3IAa2V5Rm9yAGV4cGVjdGluZyBzdXJyb2dhdGUgcGFpcgBhIGRlY2xhcmF0aW9uIGluIHRoZSBoZWFkIG9mIGEgZm9yLSVzIGxvb3AgY2FuJ3QgaGF2ZSBhbiBpbml0aWFsaXplcgAnYXJndW1lbnRzJyBpZGVudGlmaWVyIGlzIG5vdCBhbGxvd2VkIGluIGNsYXNzIGZpZWxkIGluaXRpYWxpemVyAGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZ2V0dGVyIG9yIHNldHRlcgBpbnZhbGlkIHNldHRlcgBpbnZhbGlkIGdldHRlcgBmaWx0ZXIAbWlzc2luZyBmb3JtYWwgcGFyYW1ldGVyACJ1c2Ugc3RyaWN0IiBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiB3aXRoIGRlZmF1bHQgb3IgZGVzdHJ1Y3R1cmluZyBwYXJhbWV0ZXIAaW52YWxpZCBjaGFyYWN0ZXIAdW5leHBlY3RlZCBjaGFyYWN0ZXIAcHJpdmF0ZSBjbGFzcyBmaWVsZCBmb3JiaWRkZW4gYWZ0ZXIgc3VwZXIAaW52YWxpZCByZWRlZmluaXRpb24gb2YgbGV4aWNhbCBpZGVudGlmaWVyACdsZXQnIGlzIG5vdCBhIHZhbGlkIGxleGljYWwgaWRlbnRpZmllcgBpbnZhbGlkIHJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgaWRlbnRpZmllcgB5aWVsZCBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAJyVzJyBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAb3RoZXIAYXRvbTFfaXNfaW50ZWdlciAmJiBhdG9tMl9pc19pbnRlZ2VyAGNhbm5vdCBjb252ZXJ0IHRvIGJpZ2ludDogbm90IGFuIGludGVnZXIAaXNJbnRlZ2VyAGlzU2FmZUludGVnZXIAYnVmZmVyAFNoYXJlZEFycmF5QnVmZmVyAGNhbm5vdCB1c2UgaWRlbnRpY2FsIEFycmF5QnVmZmVyAGNhbm5vdCBjb252ZXJ0IGJpZ2ludCB0byBudW1iZXIAY2Fubm90IGNvbnZlcnQgc3ltYm9sIHRvIG51bWJlcgBub3QgYSBudW1iZXIAbGluZU51bWJlcgBtYWxmb3JtZWQgdW5pY29kZSBjaGFyAGNsZWFyAHNldFllYXIAZ2V0WWVhcgBzZXRGdWxsWWVhcgBnZXRGdWxsWWVhcgBzZXRVVENGdWxsWWVhcgBnZXRVVENGdWxsWWVhcgBxICE9IHIAdW5leHBlY3RlZCBsaW5lIHRlcm1pbmF0b3IgaW4gcmVnZXhwAHVuZXhwZWN0ZWQgZW5kIG9mIHJlZ2V4cABSZWdFeHAAc3VwAGludmFsaWQgZ3JvdXAAcG9wAGNvbnRpbnVlIG11c3QgYmUgaW5zaWRlIGxvb3AAYmZfbG9naWNfb3AAZHVtcABudW1fa2V5c19jbXAAdXNlIHN0cmlwAG1hcABmbGF0TWFwAFdlYWtNYXAAZXhwZWN0aW5nICd7JyBhZnRlciBccABsb2cxcABkaXZpc2lvbiBieSB6ZXJvADBvAGhhc093bgByZXR1cm4AcHJvbWlzZSBzZWxmIHJlc29sdXRpb24Ab3V0IG9mIG1lbW9yeSBpbiByZWdleHAgZXhlY3V0aW9uAGRlc2NyaXB0aW9uACFtLT5ldmFsX2hhc19leGNlcHRpb24AIW1vZHVsZS0+ZXZhbF9oYXNfZXhjZXB0aW9uAHByb3h5OiBkZWZpbmVQcm9wZXJ0eSBleGNlcHRpb24AanNfYXN5bmNfZ2VuZXJhdG9yX3Jlc29sdmVfZnVuY3Rpb24AanNfY3JlYXRlX2Z1bmN0aW9uAHNldC9hZGQgaXMgbm90IGEgZnVuY3Rpb24AcmV0dXJuIG5vdCBpbiBhIGZ1bmN0aW9uAEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24AY2FsbEV4dGVybmFsRnVuY3Rpb24AQXN5bmNGdW5jdGlvbgBqc19pbm5lcl9tb2R1bGVfZXZhbHVhdGlvbgAhbS0+YXN5bmNfZXZhbHVhdGlvbgBtb2R1bGUtPmFzeW5jX2V2YWx1YXRpb24AaW52YWxpZCBvcGVyYXRpb24AdW5zdXBwb3J0ZWQgb3BlcmF0aW9uAGF3YWl0IGluIGRlZmF1bHQgZXhwcmVzc2lvbgB5aWVsZCBpbiBkZWZhdWx0IGV4cHJlc3Npb24AaW52YWxpZCBkZWNpbWFsIGVzY2FwZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AYmFjayByZWZlcmVuY2Ugb3V0IG9mIHJhbmdlIGluIHJlZ3VsYXIgZXhwcmVzc2lvbgBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AZXhwZWN0ZWQgJ29mJyBvciAnaW4nIGluIGZvciBjb250cm9sIGV4cHJlc3Npb24AdG9vIGNvbXBsaWNhdGVkIGRlc3RydWN0dXJpbmcgZXhwcmVzc2lvbgBleHBlY3RlZCAnfScgYWZ0ZXIgdGVtcGxhdGUgZXhwcmVzc2lvbgB0b1ByZWNpc2lvbgBhc2luAGpvaW4AbWluAGNvcHlXaXRoaW4AdGVtcGxhdGUgbGl0ZXJhbCBjYW5ub3QgYXBwZWFyIGluIGFuIG9wdGlvbmFsIGNoYWluAGNpcmN1bGFyIHByb3RvdHlwZSBjaGFpbgBhc3NpZ24AIXktPnNpZ24AaXNGcm96ZW4AKHBvcyArIGxlbikgPD0gYmNfYnVmX2xlbgB1bmV4cGVjdGVkIGVsbGlwc2lzIHRva2VuAHRoZW4Ac2V0dGVyIGlzIGZvcmJpZGRlbgBudWxsIG9yIHVuZGVmaW5lZCBhcmUgZm9yYmlkZGVuAGF0YW4AbmFuAG5vdCBhIGJvb2xlYW4AQm9vbGVhbgBnY19zY2FuAGJhZCBub3JtYWxpemF0aW9uIGZvcm0ASlNfTmV3U3ltYm9sRnJvbUF0b20AZnJvbQByYW5kb20AdHJpbQBiZl9kaXZyZW0AbS0+Y3ljbGVfcm9vdCA9PSBtAGltdWwAbm90IGEgc3ltYm9sAFN5bWJvbABSZWdFeHAgZXhlYyBtZXRob2QgbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwAcGFyZW50IHByb3RvdHlwZSBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiBudWxsAGNhbm5vdCByZWFkIHByb3BlcnR5ICclcycgb2YgbnVsbABOdWxsAGZpbGwAbmV3IEFycmF5QnVmZmVyIGlzIHRvbyBzbWFsbABUeXBlZEFycmF5IGxlbmd0aCBpcyB0b28gc21hbGwAY2FsbABkb3RBbGwAbWF0Y2hBbGwAcmVwbGFjZUFsbABjZWlsAHVwZGF0ZV9sYWJlbABiY19idWZbcG9zXSA9PSBPUF9sYWJlbABldmFsAGludmFsaWQgYmlnaW50IGxpdGVyYWwAaW52YWxpZCBudW1iZXIgbGl0ZXJhbABtYWxmb3JtZWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsAGJmX2V4cF9pbnRlcm5hbABiZl9sb2dfaW50ZXJuYWwAYmZfZnRvYV9pbnRlcm5hbABKU19TZXRQcm9wZXJ0eUludGVybmFsAEpTX0dldE93blByb3BlcnR5TmFtZXNJbnRlcm5hbABfX0pTX0V2YWxJbnRlcm5hbAB0b0V4cG9uZW50aWFsAHNlYWwAZ2xvYmFsAGJsaW5rAHJldHVybiBpbiBhIHN0YXRpYyBpbml0aWFsaXplciBibG9jawBzdGFjawBscmVfZXhlY19iYWNrdHJhY2sAcy0+aXNfd2VhawBiZl9wb3dfdWkAc2V0TW9udGgAZ2V0TW9udGgAc2V0VVRDTW9udGgAZ2V0VVRDTW9udGgAaW52YWxpZCBrZXl3b3JkOiB3aXRoAHN0YXJ0c1dpdGgAZW5kc1dpdGgAcHJvcCA9PSBKU19BVE9NX2xlbmd0aABpbnZhbGlkIGFycmF5IGxlbmd0aABpbnZhbGlkIGFycmF5IGJ1ZmZlciBsZW5ndGgAaW52YWxpZCBsZW5ndGgAaW52YWxpZCBieXRlTGVuZ3RoAE1hdGgAcHVzaABhY29zaABKU19SZXNpemVBdG9tSGFzaABhc2luaABhdGFuaABicmVhayBtdXN0IGJlIGluc2lkZSBsb29wIG9yIHN3aXRjaABtYXRjaABuaXBfY2F0Y2gAc2VhcmNoAGZvckVhY2gAYmZfbG9nAEFycmF5IHRvbyBsb25nAHN0cmluZyB0b28gbG9uZwBBcnJheSBsb28gbG9uZwBzdWJzdHJpbmcAY2Fubm90IGNvbnZlcnQgc3ltYm9sIHRvIHN0cmluZwB1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmcAbm90IGEgc3RyaW5nAGludmFsaWQgY2hhcmFjdGVyIGluIGEgSlNPTiBzdHJpbmcAdG9TdHJpbmcAdG9EYXRlU3RyaW5nAHRvTG9jYWxlRGF0ZVN0cmluZwB0b1RpbWVTdHJpbmcAdG9Mb2NhbGVUaW1lU3RyaW5nAHRvTG9jYWxlU3RyaW5nAHRvR01UU3RyaW5nAEpTU3RyaW5nAHRvSVNPU3RyaW5nAHRvVVRDU3RyaW5nAGpzX2lubmVyX21vZHVsZV9saW5raW5nAGR1cGxpY2F0ZSBpbXBvcnQgYmluZGluZwBpbnZhbGlkIGltcG9ydCBiaW5kaW5nAHByb21pc2UgaXMgcGVuZGluZwBiaWcAcmVnZXhwIG11c3QgaGF2ZSB0aGUgJ2cnIGZsYWcAb2YAaW5mAEluZgBkaWZmID09IChpbnQ4X3QpZGlmZgBkaWZmID09IChpbnQxNl90KWRpZmYAaHJlZgBnY19kZWNyZWYAZnJlZV92YXJfcmVmAG9wdGltaXplX3Njb3BlX21ha2VfZ2xvYmFsX3JlZgByZXNldF93ZWFrX3JlZgBkZWxldGVfd2Vha19yZWYAb3B0aW1pemVfc2NvcGVfbWFrZV9yZWYAaW5kZXhPZgBsYXN0SW5kZXhPZgB2YWx1ZU9mAHNldFByb3RvdHlwZU9mAGdldFByb3RvdHlwZU9mAGlzUHJvdG90eXBlT2YAJS4qZgBmb250c2l6ZQBuZXdfc2l6ZSA8PSBzaC0+cHJvcF9zaXplAGRlc2NyIDwgcnQtPmF0b21fc2l6ZQBhdG9tIDwgcnQtPmF0b21fc2l6ZQBjb21wdXRlX3N0YWNrX3NpemUAbiA8IGJ1Zl9zaXplAG5vcm1hbGl6ZQBjcl9yZWdleHBfY2Fub25pY2FsaXplAGZyZWV6ZQByZXNvbHZlAHRvUHJpbWl0aXZlAHB1dF9sdmFsdWUAdW5rbm93biB1bmljb2RlIHByb3BlcnR5IHZhbHVlAHJlc3QgZWxlbWVudCBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUAaW52YWxpZCByZXQgdmFsdWUAX19KU19BdG9tVG9WYWx1ZQBfX3F1b3RlAGlzRmluaXRlAGRlbGV0ZQBjcmVhdGUAc2V0RGF0ZQBnZXREYXRlAHNldFVUQ0RhdGUAZ2V0VVRDRGF0ZQBJbnZhbGlkIERhdGUAcmV2ZXJzZQBwYXJzZQBwcm94eSBwcmV2ZW50RXh0ZW5zaW9ucyBoYW5kbGVyIHJldHVybmVkIGZhbHNlAG1vZHVsZSBuYW1lc3BhY2UgcHJvcGVydGllcyBoYXZlIHdyaXRhYmxlID0gZmFsc2UAUHJvbWlzZQB0b0xvd2VyQ2FzZQB0b0xvY2FsZUxvd2VyQ2FzZQB0b1VwcGVyQ2FzZQB0b0xvY2FsZVVwcGVyQ2FzZQBpZ25vcmVDYXNlAGxvY2FsZUNvbXBhcmUAcHJveHk6IGluY29uc2lzdGVudCBwcm90b3R5cGUAcHJveHk6IGJhZCBwcm90b3R5cGUAbm90IGEgcHJvdG90eXBlAGludmFsaWQgb2JqZWN0IHR5cGUAdW5lc2NhcGUAbm9uZQByZXN0IGVsZW1lbnQgbXVzdCBiZSB0aGUgbGFzdCBvbmUAbXVsdGlsaW5lACAgcGMybGluZQBhc3luY19mdW5jX3Jlc3VtZQBzb21lAEpTX0ZyZWVSdW50aW1lAEpTUnVudGltZQBzZXRUaW1lAGdldFRpbWUAYXN5bmNfZnVuY19mcmVlX2ZyYW1lAHNldF9vYmplY3RfbmFtZQBleHBlY3RpbmcgcHJvcGVydHkgbmFtZQB1bmtub3duIHVuaWNvZGUgcHJvcGVydHkgbmFtZQBpbnZhbGlkIHByb3BlcnR5IG5hbWUAZHVwbGljYXRlIF9fcHJvdG9fXyBwcm9wZXJ0eSBuYW1lAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIHBhcmFtZXRlciBuYW1lAGV4cGVjdGluZyBncm91cCBuYW1lAGR1cGxpY2F0ZSBncm91cCBuYW1lAGludmFsaWQgZ3JvdXAgbmFtZQBkdXBsaWNhdGUgbGFiZWwgbmFtZQBpbnZhbGlkIGZpcnN0IGNoYXJhY3RlciBvZiBwcml2YXRlIG5hbWUAaW52YWxpZCBsZXhpY2FsIHZhcmlhYmxlIG5hbWUAaW52YWxpZCBtZXRob2QgbmFtZQBleHBlY3RpbmcgZmllbGQgbmFtZQBpbnZhbGlkIGZpZWxkIG5hbWUAY2xhc3Mgc3RhdGVtZW50IHJlcXVpcmVzIGEgbmFtZQBmaWxlTmFtZQBqc19saW5rX21vZHVsZQBqc19ldmFsdWF0ZV9tb2R1bGUAbW9kdWxlLT5jeWNsZV9yb290ID09IG1vZHVsZQBjb21waWxlAG9iamVjdCBpcyBub3QgZXh0ZW5zaWJsZQBwcm94eTogaW5jb25zaXN0ZW50IGlzRXh0ZW5zaWJsZQBjYW5ub3QgaGF2ZSBzZXR0ZXIvZ2V0dGVyIGFuZCB2YWx1ZSBvciB3cml0YWJsZQBwcm9wZXJ0eSBpcyBub3QgY29uZmlndXJhYmxlAHZhbHVlIGlzIG5vdCBpdGVyYWJsZQBwcm9wZXJ0eUlzRW51bWVyYWJsZQBtaXNzaW5nIGluaXRpYWxpemVyIGZvciBjb25zdCB2YXJpYWJsZQBsZXhpY2FsIHZhcmlhYmxlAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGEgdmFyaWFibGUAcmV2b2NhYmxlAHN0cmlrZQBtcF9kaXZub3JtX2xhcmdlAGludmFsaWQgY2xhc3MgcmFuZ2UAbWVzc2FnZQBpbnZhbGlkIGx2YWx1ZSBpbiBzdHJpY3QgbW9kZQBpbnZhbGlkIHZhcmlhYmxlIG5hbWUgaW4gc3RyaWN0IG1vZGUAY2Fubm90IGRlbGV0ZSBhIGRpcmVjdCByZWZlcmVuY2UgaW4gc3RyaWN0IG1vZGUAb2N0YWwgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUAb2N0YWwgbGl0ZXJhbHMgYXJlIGRlcHJlY2F0ZWQgaW4gc3RyaWN0IG1vZGUAdW5pY29kZQAgIGJ5dGVjb2RlAEpTRnVuY3Rpb25CeXRlY29kZQBza2lwX2RlYWRfY29kZQBpbnZhbGlkIGFyZ3VtZW50IG5hbWUgaW4gc3RyaWN0IGNvZGUAaW52YWxpZCBmdW5jdGlvbiBuYW1lIGluIHN0cmljdCBjb2RlAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGdsb2JhbCBpZGVudGlmaWVyIGluIG1vZHVsZSBjb2RlAGltcG9ydC5tZXRhIG9ubHkgdmFsaWQgaW4gbW9kdWxlIGNvZGUAZnJvbUNoYXJDb2RlAGludmFsaWQgZm9yIGluL29mIGxlZnQgaGFuZC1zaWRlAGludmFsaWQgYXNzaWdubWVudCBsZWZ0LWhhbmQgc2lkZQByZWR1Y2UAc291cmNlACd0aGlzJyBjYW4gYmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlAHByb3BlcnR5IGNvbnN0cnVjdG9yIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UAaW52YWxpZCBVVEYtOCBzZXF1ZW5jZQBjaXJjdWxhciByZWZlcmVuY2UAc2xpY2UAc3BsaWNlAHJhY2UAcmVwbGFjZQAlKy4qZQB1bmV4cGVjdGVkICdhd2FpdCcga2V5d29yZAB1bmV4cGVjdGVkICd5aWVsZCcga2V5d29yZABtYXBfZGVjcmVmX3JlY29yZABpdGVyYXRvciBkb2VzIG5vdCBoYXZlIGEgdGhyb3cgbWV0aG9kAG9iamVjdCBuZWVkcyB0b0lTT1N0cmluZyBtZXRob2QAJ3N1cGVyJyBpcyBvbmx5IHZhbGlkIGluIGEgbWV0aG9kAGZyb3VuZABfX2JmX3JvdW5kAGJyZWFrL2NvbnRpbnVlIGxhYmVsIG5vdCBmb3VuZABvdXQgb2YgYm91bmQAZmluZABiaW5kAGludmFsaWQgaW5kZXggZm9yIGFwcGVuZABleHRyYW5lb3VzIGNoYXJhY3RlcnMgYXQgdGhlIGVuZAB1bmV4cGVjdGVkIGRhdGEgYXQgdGhlIGVuZAB1bmV4cGVjdGVkIGVuZABpbnZhbGlkIGluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmFuZABpbnZhbGlkICdpbnN0YW5jZW9mJyByaWdodCBvcGVyYW5kAGludmFsaWQgJ2luJyBvcGVyYW5kAHRyaW1FbmQAcGFkRW5kAGJvbGQAJWxsZABnY19kZWNyZWZfY2hpbGQAcmVzb2x2ZV9zY29wZV9wcml2YXRlX2ZpZWxkAGNhbm5vdCBkZWxldGUgYSBwcml2YXRlIGNsYXNzIGZpZWxkAGV4cGVjdGluZyA8YnJhbmQ+IHByaXZhdGUgZmllbGQAJXMgaXMgbm90IGluaXRpYWxpemVkAGZpeGVkAHRvRml4ZWQAc2V0X29iamVjdF9uYW1lX2NvbXB1dGVkAHJlZ2V4IG5vdCBzdXBwb3J0ZWQAZXZhbCBpcyBub3Qgc3VwcG9ydGVkAFJlZ0V4cCBhcmUgbm90IHN1cHBvcnRlZAB0b1NvcnRlZABpbnRlcnJ1cHRlZAAhcy0+aXNfY29tcGxldGVkACVzIG9iamVjdCBleHBlY3RlZABpZGVudGlmaWVyIGV4cGVjdGVkAGJ5dGVjb2RlIGZ1bmN0aW9uIGV4cGVjdGVkAHN0cmluZyBleHBlY3RlZABmcm9tIGNsYXVzZSBleHBlY3RlZABmdW5jdGlvbiBuYW1lIGV4cGVjdGVkAHZhcmlhYmxlIG5hbWUgZXhwZWN0ZWQAbWV0YSBleHBlY3RlZABqc19hc3luY19tb2R1bGVfZXhlY3V0aW9uX3JlamVjdGVkAGpzX3NldF9tb2R1bGVfZXZhbHVhdGVkAG1lbW9yeSBhbGxvY2F0ZWQAbWVtb3J5IHVzZWQAdG9SZXZlcnNlZABkZXJpdmVkIGNsYXNzIGNvbnN0cnVjdG9yIG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciB1bmRlZmluZWQAY2Fubm90IHNldCBwcm9wZXJ0eSAnJXMnIG9mIHVuZGVmaW5lZABjYW5ub3QgcmVhZCBwcm9wZXJ0eSAnJXMnIG9mIHVuZGVmaW5lZABmbGFncyBtdXN0IGJlIHVuZGVmaW5lZABVbmRlZmluZWQAcHJpdmF0ZSBjbGFzcyBmaWVsZCBpcyBhbHJlYWR5IGRlZmluZWQAJyVzJyBpcyBub3QgZGVmaW5lZABncm91cCBuYW1lIG5vdCBkZWZpbmVkAGlzV2VsbEZvcm1lZAB0b1dlbGxGb3JtZWQAYWxsU2V0dGxlZABqc19hc3luY19tb2R1bGVfZXhlY3V0aW9uX2Z1bGZpbGxlZABjYW5ub3QgYmUgY2FsbGVkAGlzU2VhbGVkACFzaC0+aXNfaGFzaGVkAEFycmF5QnVmZmVyIGlzIGRldGFjaGVkAGpzX2FycmF5X3RvU3BsaWNlZABhZGQAJSswN2QAJTA0ZAAlMDJkJTAyZABwJStkACVjJStkACUwMmQvJTAyZC8lMCpkACUuM3MgJS4zcyAlMDJkICUwKmQAcCVkACVjJWQAOiVkAGludmFsaWQgdGhyb3cgdmFyIHR5cGUgJWQAc2MAanNfZGVmX21hbGxvYwB0cnVuYwBnYwBleGVjAGJmX2ludGVnZXJfdG9fcmFkaXhfcmVjAC90bXAvcXVpY2tqcy9xdWlja2pzLmMAL3RtcC9xdWlja2pzL2xpYnJlZ2V4cC5jAC90bXAvcXVpY2tqcy9saWJiZi5jAC90bXAvcXVpY2tqcy9saWJ1bmljb2RlLmMAc3ViAHByb21pc2VfcmVhY3Rpb25fam9iAGpzX3Byb21pc2VfcmVzb2x2ZV90aGVuYWJsZV9qb2IAMGIAciAhPSBhICYmIHIgIT0gYgBxICE9IGEgJiYgcSAhPSBiAHJ3YQByICE9IGEAX19sb29rdXBTZXR0ZXJfXwBfX2RlZmluZVNldHRlcl9fAF9fbG9va3VwR2V0dGVyX18AX19kZWZpbmVHZXR0ZXJfXwBfX3Byb3RvX18AW1N5bWJvbC5zcGxpdF0AW1N5bWJvbC5zcGVjaWVzXQBbU3ltYm9sLml0ZXJhdG9yXQBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdAFtTeW1ib2wubWF0Y2hBbGxdAFtTeW1ib2wubWF0Y2hdAFtTeW1ib2wuc2VhcmNoXQBbU3ltYm9sLnRvU3RyaW5nVGFnXQBbU3ltYm9sLnRvUHJpbWl0aXZlXQBbdW5zdXBwb3J0ZWQgdHlwZV0AW2Z1bmN0aW9uIGJ5dGVjb2RlXQBbU3ltYm9sLmhhc0luc3RhbmNlXQBbU3ltYm9sLnJlcGxhY2VdAFsAJTAyZDolMDJkOiUwMmQuJTAzZFoAUE9TSVRJVkVfSU5GSU5JVFkATkVHQVRJVkVfSU5GSU5JVFkAcC0+Y2xhc3NfaWQgPT0gSlNfQ0xBU1NfQVJSQVkAc3RhY2tfbGVuIDwgUE9QX1NUQUNLX0xFTl9NQVgALSUwMmQtJTAyZFQASlNfQXRvbUdldFN0clJUAG9wY29kZSA8IFJFT1BfQ09VTlQASlNfVkFMVUVfR0VUX1RBRyhmdW5jX3JldCkgPT0gSlNfVEFHX0lOVABCWVRFU19QRVJfRUxFTUVOVAAlMDJkOiUwMmQ6JTAyZCBHTVQASlNfVkFMVUVfR0VUX1RBRyhzZi0+Y3VyX2Z1bmMpID09IEpTX1RBR19PQkpFQ1QAdmFyX2tpbmQgPT0gSlNfVkFSX1BSSVZBVEVfU0VUVEVSAE1BWF9TQUZFX0lOVEVHRVIATUlOX1NBRkVfSU5URUdFUgBhc1VpbnROAGFzSW50TgBpc05hTgBEYXRlIHZhbHVlIGlzIE5hTgB0b0pTT04ARVBTSUxPTgBwLT5nY19vYmpfdHlwZSA9PSBKU19HQ19PQkpfVFlQRV9KU19PQkpFQ1QgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfRlVOQ1RJT05fQllURUNPREUgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfQVNZTkNfRlVOQ1RJT04ATkFOACUwMmQ6JTAyZDolMDJkICVjTQBzdGFja190b3AgPT0gTlVMTABzLT5sYWJlbF9zbG90c1tsYWJlbF0uZmlyc3RfcmVsb2MgPT0gTlVMTABsYWJlbF9zbG90c1tpXS5maXJzdF9yZWxvYyA9PSBOVUxMAHBycyAhPSBOVUxMAHNmLT5jdXJfc3AgIT0gTlVMTABzZiAhPSBOVUxMAG1yMSAhPSBOVUxMAHZhcl9raW5kICE9IEpTX1ZBUl9OT1JNQUwAYi0+ZnVuY19raW5kID09IEpTX0ZVTkNfTk9STUFMAGVuY29kZVVSSQBkZWNvZGVVUkkAUEkAc3BlY2lhbCA9PSBQVVRfTFZBTFVFX05PS0VFUCB8fCBzcGVjaWFsID09IFBVVF9MVkFMVUVfTk9LRUVQX0RFUFRIAHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9FWEVDVVRJTkcAbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0VWQUxVQVRJTkcAbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktJTkcAcHJlYyAhPSBCRl9QUkVDX0lORgBwcmVjMSAhPSBCRl9QUkVDX0lORgAwMTIzNDU2Nzg5QUJDREVGAFNJWkUATUFYX1ZBTFVFAE1JTl9WQUxVRQBOQU1FAGV2YWxfdHlwZSA9PSBKU19FVkFMX1RZUEVfR0xPQkFMIHx8IGV2YWxfdHlwZSA9PSBKU19FVkFMX1RZUEVfTU9EVUxFAExPRzJFAExPRzEwRQBzLT5zdGF0ZSA9PSBKU19BU1lOQ19HRU5FUkFUT1JfU1RBVEVfQVdBSVRJTkdfUkVUVVJOIHx8IHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9DT01QTEVURUQAbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfVU5MSU5LRUQgfHwgbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfTElOS0VEIHx8IG0tPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0VWQUxVQVRJTkdfQVNZTkMgfHwgbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVEVEAG0xLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19FVkFMVUFUSU5HIHx8IG0xLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19FVkFMVUFUSU5HX0FTWU5DIHx8IG0xLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19FVkFMVUFURUQAbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktJTkcgfHwgbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktFRCB8fCBtMS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVElOR19BU1lOQyB8fCBtMS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVEVEAG0tPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktFRABtLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19VTkxJTktFRABVVEMAbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVElOR19BU1lOQwBtb2R1bGUtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0VWQUxVQVRJTkdfQVNZTkMAPGlucHV0PgA8aW5pdFNjcmlwdD4APGV2YWxTY3JpcHQ+ADxzZXQ+ADxhbm9ueW1vdXM+ADxjb21tRnVuPgA8Y2FsbEV4dGVybmFsRnVuY3Rpb24+ADxudWxsPgBiaWdpbnQgb3BlcmFuZHMgYXJlIGZvcmJpZGRlbiBmb3IgPj4+ACZxdW90OwBzZXRVaW50OABnZXRVaW50OABzZXRJbnQ4AGdldEludDgAbWFsZm9ybWVkIFVURi04AHJhZGl4IG11c3QgYmUgYmV0d2VlbiAyIGFuZCAzNgBzZXRVaW50MTYAZ2V0VWludDE2AHNldEludDE2AGdldEludDE2AGFyZ2MgPT0gNQBzZXRCaWdVaW50NjQAZ2V0QmlnVWludDY0AHNldEJpZ0ludDY0AGdldEJpZ0ludDY0AHNldEZsb2F0NjQAZ2V0RmxvYXQ2NABhcmdjID09IDMAYXRhbjIAbG9nMgBTUVJUMV8yAFNRUlQyAExOMgBjbHozMgBzZXRVaW50MzIAZ2V0VWludDMyAHNldEludDMyAGdldEludDMyAHNldEZsb2F0MzIAZ2V0RmxvYXQzMgBzdGFja19sZW4gPj0gMgBKU19BdG9tSXNOdW1lcmljSW5kZXgxAGpzX2ZjdnQxAEpTX0NvbXBhY3RCaWdJbnQxAGV4cG0xAHIgIT0gYTEgJiYgciAhPSBiMQBscy0+YWRkciA9PSAtMQBucSA+PSAxAHN0YWNrX2xlbiA+PSAxAHAtPmhlYWRlci5yZWZfY291bnQgPT0gMQBwLT5zaGFwZS0+aGVhZGVyLnJlZl9jb3VudCA9PSAxAHN0YWNrX2xlbiA9PSAxAGpzX2ZyZWVfc2hhcGUwAGxvZzEwAExOMTAAcC0+cmVmX2NvdW50ID4gMAB2YXJfcmVmLT5oZWFkZXIucmVmX2NvdW50ID4gMABtLT5wZW5kaW5nX2FzeW5jX2RlcGVuZGVuY2llcyA+IDAAc3RhY2tfc2l6ZSA+IDAAY3Bvb2xfaWR4ID49IDAAcnQtPmF0b21fY291bnQgPj0gMABscy0+cmVmX2NvdW50ID49IDAAcy0+aXNfZXZhbCB8fCBzLT5jbG9zdXJlX3Zhcl9jb3VudCA9PSAwAHAtPnJlZl9jb3VudCA9PSAwAGN0eC0+aGVhZGVyLnJlZl9jb3VudCA9PSAwAHNoLT5oZWFkZXIucmVmX2NvdW50ID09IDAAcC0+bWFyayA9PSAwAChwci0+dS5pbml0LnJlYWxtX2FuZF9pZCAmIDMpID09IDAAKG5ld19oYXNoX3NpemUgJiAobmV3X2hhc2hfc2l6ZSAtIDEpKSA9PSAwAGkgIT0gMABzaXplICE9IDAAXiRcLiorPygpW117fXwvADwvADAuAG1pc3NpbmcgYmluZGluZyBwYXR0ZXJuLi4uAGJpZ2ludCBhcmd1bWVudCB3aXRoIHVuYXJ5ICsAYXN5bmMgZnVuY3Rpb24gKgAKfSkAbGlzdF9lbXB0eSgmcnQtPmdjX29ial9saXN0KQBqID09IChzaC0+cHJvcF9jb3VudCAtIHNoLT5kZWxldGVkX3Byb3BfY291bnQpACFfX0pTX0F0b21Jc1RhZ2dlZEludChkZXNjcikAIWF0b21faXNfZnJlZShwKQAobnVsbCkAIChuYXRpdmUpAGpzX2NsYXNzX2hhc19ieXRlY29kZShwLT5jbGFzc19pZCkAbmlwX2NhdGNoOiBubyBjYXRjaCBvcCAocGM9JWQpAGluY29uc2lzdGVudCBjYXRjaCBwb3NpdGlvbjogJWQgJWQgKHBjPSVkKQBpbmNvbnNpc3RlbnQgc3RhY2sgc2l6ZTogJWQgJWQgKHBjPSVkKQBieXRlY29kZSBidWZmZXIgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgdW5kZXJmbG93IChvcD0lZCwgcGM9JWQpAGludmFsaWQgb3Bjb2RlIChvcD0lZCwgcGM9JWQpACg/OikAaWR4IDwgY291bnRvZihjYXNlX2NvbnZfdGFibGUxKQBubyBmdW5jdGlvbiBmaWxlbmFtZSBmb3IgaW1wb3J0KCkALV8uIX4qJygpACBhbm9ueW1vdXMoAFN5bWJvbCgAZXhwZWN0aW5nICd9JwBjbGFzcyBjb25zdHJ1Y3RvcnMgbXVzdCBiZSBpbnZva2VkIHdpdGggJ25ldycAZXhwZWN0aW5nICdhcycAdW5leHBlY3RlZCB0b2tlbiBpbiBleHByZXNzaW9uOiAnJS4qcycAdW5leHBlY3RlZCB0b2tlbjogJyUuKnMnAHJlZGVjbGFyYXRpb24gb2YgJyVzJwBkdXBsaWNhdGUgZXhwb3J0ZWQgbmFtZSAn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XwAAcF8AAAwLBQQCAgAAuwAAAHoAAAB7AAAAvAAAAHwAAAB9AAAAvQAAAHwAAAB9AAAAvgAAAFIAAABTAAAAvwAAAH4AAAB/AAAAwAAAAH4AAAB/AAAALwAAAIAAAACBAAAAwQAAAFIAAABTAAAAwgAAAIIAAACDAAAAAAAAAOkWAAAaFwAAJRcAAN0WAAAQFwAANBcAAPMWAAABFwAAY29weVdpdGhpbgBlbnRyaWVzAGZpbGwAZmluZABmaW5kSW5kZXgAZmluZExhc3QAZmluZExhc3RJbmRleABmbGF0AGZsYXRNYXAAaW5jbHVkZXMAa2V5cwB0b1JldmVyc2VkAHRvU29ydGVkAHRvU3BsaWNlZAB2YWx1ZXMAAAAAAAEBAgIDAwIDAAAAAAAAbnVsbABmYWxzZQB0cnVlAGlmAGVsc2UAcmV0dXJuAHZhcgB0aGlzAGRlbGV0ZQB2b2lkAHR5cGVvZgBuZXcAaW4AaW5zdGFuY2VvZgBkbwB3aGlsZQBmb3IAYnJlYWsAY29udGludWUAc3dpdGNoAGNhc2UAZGVmYXVsdAB0aHJvdwB0cnkAY2F0Y2gAZmluYWxseQBmdW5jdGlvbgBkZWJ1Z2dlcgB3aXRoAGNsYXNzAGNvbnN0AGVudW0AZXhwb3J0AGV4dGVuZHMAaW1wb3J0AHN1cGVyAGltcGxlbWVudHMAaW50ZXJmYWNlAGxldABwYWNrYWdlAHByaXZhdGUAcHJvdGVjdGVkAHB1YmxpYwBzdGF0aWMAeWllbGQAYXdhaXQAAGxlbmd0aABmaWxlTmFtZQBsaW5lTnVtYmVyAG1lc3NhZ2UAY2F1c2UAZXJyb3JzAHN0YWNrAG5hbWUAdG9TdHJpbmcAdG9Mb2NhbGVTdHJpbmcAdmFsdWVPZgBldmFsAHByb3RvdHlwZQBjb25zdHJ1Y3RvcgBjb25maWd1cmFibGUAd3JpdGFibGUAZW51bWVyYWJsZQB2YWx1ZQBnZXQAc2V0AG9mAF9fcHJvdG9fXwB1bmRlZmluZWQAbnVtYmVyAGJvb2xlYW4Ac3RyaW5nAG9iamVjdABzeW1ib2wAaW50ZWdlcgB1bmtub3duAGFyZ3VtZW50cwBjYWxsZWUAY2FsbGVyADxldmFsPgA8cmV0PgA8dmFyPgA8YXJnX3Zhcj4APHdpdGg+AGxhc3RJbmRleAB0YXJnZXQAaW5kZXgAaW5wdXQAZGVmaW5lUHJvcGVydGllcwBhcHBseQBqb2luAGNvbmNhdABzcGxpdABjb25zdHJ1Y3QAZ2V0UHJvdG90eXBlT2YAc2V0UHJvdG90eXBlT2YAaXNFeHRlbnNpYmxlAHByZXZlbnRFeHRlbnNpb25zAGhhcwBkZWxldGVQcm9wZXJ0eQBkZWZpbmVQcm9wZXJ0eQBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAb3duS2V5cwBhZGQAZG9uZQBuZXh0AHZhbHVlcwBzb3VyY2UAZmxhZ3MAZ2xvYmFsAHVuaWNvZGUAcmF3AG5ldy50YXJnZXQAdGhpcy5hY3RpdmVfZnVuYwA8aG9tZV9vYmplY3Q+ADxjb21wdXRlZF9maWVsZD4APHN0YXRpY19jb21wdXRlZF9maWVsZD4APGNsYXNzX2ZpZWxkc19pbml0PgA8YnJhbmQ+ACNjb25zdHJ1Y3RvcgBhcwBmcm9tAG1ldGEAKmRlZmF1bHQqACoATW9kdWxlAHRoZW4AcmVzb2x2ZQByZWplY3QAcHJvbWlzZQBwcm94eQByZXZva2UAYXN5bmMAZXhlYwBncm91cHMAaW5kaWNlcwBzdGF0dXMAcmVhc29uAGdsb2JhbFRoaXMAYmlnaW50AG5vdC1lcXVhbAB0aW1lZC1vdXQAb2sAdG9KU09OAE9iamVjdABBcnJheQBFcnJvcgBOdW1iZXIAU3RyaW5nAEJvb2xlYW4AU3ltYm9sAEFyZ3VtZW50cwBNYXRoAEpTT04ARGF0ZQBGdW5jdGlvbgBHZW5lcmF0b3JGdW5jdGlvbgBGb3JJbkl0ZXJhdG9yAFJlZ0V4cABBcnJheUJ1ZmZlcgBTaGFyZWRBcnJheUJ1ZmZlcgBVaW50OENsYW1wZWRBcnJheQBJbnQ4QXJyYXkAVWludDhBcnJheQBJbnQxNkFycmF5AFVpbnQxNkFycmF5AEludDMyQXJyYXkAVWludDMyQXJyYXkAQmlnSW50NjRBcnJheQBCaWdVaW50NjRBcnJheQBGbG9hdDMyQXJyYXkARmxvYXQ2NEFycmF5AERhdGFWaWV3AEJpZ0ludABNYXAAU2V0AFdlYWtNYXAAV2Vha1NldABNYXAgSXRlcmF0b3IAU2V0IEl0ZXJhdG9yAEFycmF5IEl0ZXJhdG9yAFN0cmluZyBJdGVyYXRvcgBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAEdlbmVyYXRvcgBQcm94eQBQcm9taXNlAFByb21pc2VSZXNvbHZlRnVuY3Rpb24AUHJvbWlzZVJlamVjdEZ1bmN0aW9uAEFzeW5jRnVuY3Rpb24AQXN5bmNGdW5jdGlvblJlc29sdmUAQXN5bmNGdW5jdGlvblJlamVjdABBc3luY0dlbmVyYXRvckZ1bmN0aW9uAEFzeW5jR2VuZXJhdG9yAEV2YWxFcnJvcgBSYW5nZUVycm9yAFJlZmVyZW5jZUVycm9yAFN5bnRheEVycm9yAFR5cGVFcnJvcgBVUklFcnJvcgBJbnRlcm5hbEVycm9yADxicmFuZD4AU3ltYm9sLnRvUHJpbWl0aXZlAFN5bWJvbC5pdGVyYXRvcgBTeW1ib2wubWF0Y2gAU3ltYm9sLm1hdGNoQWxsAFN5bWJvbC5yZXBsYWNlAFN5bWJvbC5zZWFyY2gAU3ltYm9sLnNwbGl0AFN5bWJvbC50b1N0cmluZ1RhZwBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlAFN5bWJvbC5oYXNJbnN0YW5jZQBTeW1ib2wuc3BlY2llcwBTeW1ib2wudW5zY29wYWJsZXMAU3ltYm9sLmFzeW5jSXRlcmF0b3IAAAAAAAEAAAAFAAEUBQABFQUAARUFAAEXBQABFwEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQUDAAEKAQEAAAECAQABAwIAAQECAAECAwABAgQAAQMGAAECAwABAwQAAQQFAAEDAwABBAQAAQUFAAECAgABBAQAAQMDAAEDAwABBAQAAQUFAAMCAQ0DAQENAwEADQMCAQ0DAgANAwABDQMDAQoBAQAAAQAAAAEBAgABAAAAAQICAAECAAABAQAAAQEAAAYAABgFAQEPAwIBCgECAQABAQEAAQEBAAUAARcFAAEXBQABFwUBABcFAQAXBQIAFwECAwABAwAABgAAGAYAABgGAQAYBQEBFwUBAhcFAgAXAQIBAAEDAAABAwEAAQIBAAECAgABAwAAAQMBAAEEAAAFAgEXBQEBFwECAgABAgEAAQICAAEDAgABAwIAAgMDBQYCARgCAwEFBgICGAYDAxgDAAEQAwEAEAMBARAD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BOOAQJ+GiIlBY4C8jUHxjUPVhuw0iVKViWwFBUDvAEGAowILhBP6BgBwCQDwCkBXDADwDWDHDyDqF0AFGwBBIAAMqIA3qiBQ/iA6DSF0EQFaFCFEGYFaHaH1aiFF0kGv4iHwAQ4AQWRsYW0sQWRsbQBBaG9tLEFob20AQW5hdG9saWFuX0hpZXJvZ2x5cGhzLEhsdXcAQXJhYmljLEFyYWIAQXJtZW5pYW4sQXJtbgBBdmVzdGFuLEF2c3QAQmFsaW5lc2UsQmFsaQBCYW11bSxCYW11AEJhc3NhX1ZhaCxCYXNzAEJhdGFrLEJhdGsAQmVuZ2FsaSxCZW5nAEJoYWlrc3VraSxCaGtzAEJvcG9tb2ZvLEJvcG8AQnJhaG1pLEJyYWgAQnJhaWxsZSxCcmFpAEJ1Z2luZXNlLEJ1Z2kAQnVoaWQsQnVoZABDYW5hZGlhbl9BYm9yaWdpbmFsLENhbnMAQ2FyaWFuLENhcmkAQ2F1Y2FzaWFuX0FsYmFuaWFuLEFnaGIAQ2hha21hLENha20AQ2hhbSxDaGFtAENoZXJva2VlLENoZXIAQ2hvcmFzbWlhbixDaHJzAENvbW1vbixaeXl5AENvcHRpYyxDb3B0LFFhYWMAQ3VuZWlmb3JtLFhzdXgAQ3lwcmlvdCxDcHJ0AEN5cmlsbGljLEN5cmwAQ3lwcm9fTWlub2FuLENwbW4ARGVzZXJldCxEc3J0AERldmFuYWdhcmksRGV2YQBEaXZlc19Ba3VydSxEaWFrAERvZ3JhLERvZ3IARHVwbG95YW4sRHVwbABFZ3lwdGlhbl9IaWVyb2dseXBocyxFZ3lwAEVsYmFzYW4sRWxiYQBFbHltYWljLEVseW0ARXRoaW9waWMsRXRoaQBHZW9yZ2lhbixHZW9yAEdsYWdvbGl0aWMsR2xhZwBHb3RoaWMsR290aABHcmFudGhhLEdyYW4AR3JlZWssR3JlawBHdWphcmF0aSxHdWpyAEd1bmphbGFfR29uZGksR29uZwBHdXJtdWtoaSxHdXJ1AEhhbixIYW5pAEhhbmd1bCxIYW5nAEhhbmlmaV9Sb2hpbmd5YSxSb2hnAEhhbnVub28sSGFubwBIYXRyYW4sSGF0cgBIZWJyZXcsSGVicgBIaXJhZ2FuYSxIaXJhAEltcGVyaWFsX0FyYW1haWMsQXJtaQBJbmhlcml0ZWQsWmluaCxRYWFpAEluc2NyaXB0aW9uYWxfUGFobGF2aSxQaGxpAEluc2NyaXB0aW9uYWxfUGFydGhpYW4sUHJ0aQBKYXZhbmVzZSxKYXZhAEthaXRoaSxLdGhpAEthbm5hZGEsS25kYQBLYXRha2FuYSxLYW5hAEthd2ksS2F3aQBLYXlhaF9MaSxLYWxpAEtoYXJvc2h0aGksS2hhcgBLaG1lcixLaG1yAEtob2praSxLaG9qAEtoaXRhbl9TbWFsbF9TY3JpcHQsS2l0cwBLaHVkYXdhZGksU2luZABMYW8sTGFvbwBMYXRpbixMYXRuAExlcGNoYSxMZXBjAExpbWJ1LExpbWIATGluZWFyX0EsTGluYQBMaW5lYXJfQixMaW5iAExpc3UsTGlzdQBMeWNpYW4sTHljaQBMeWRpYW4sTHlkaQBNYWthc2FyLE1ha2EATWFoYWphbmksTWFoagBNYWxheWFsYW0sTWx5bQBNYW5kYWljLE1hbmQATWFuaWNoYWVhbixNYW5pAE1hcmNoZW4sTWFyYwBNYXNhcmFtX0dvbmRpLEdvbm0ATWVkZWZhaWRyaW4sTWVkZgBNZWV0ZWlfTWF5ZWssTXRlaQBNZW5kZV9LaWtha3VpLE1lbmQATWVyb2l0aWNfQ3Vyc2l2ZSxNZXJjAE1lcm9pdGljX0hpZXJvZ2x5cGhzLE1lcm8ATWlhbyxQbHJkAE1vZGksTW9kaQBNb25nb2xpYW4sTW9uZwBNcm8sTXJvbwBNdWx0YW5pLE11bHQATXlhbm1hcixNeW1yAE5hYmF0YWVhbixOYmF0AE5hZ19NdW5kYXJpLE5hZ20ATmFuZGluYWdhcmksTmFuZABOZXdfVGFpX0x1ZSxUYWx1AE5ld2EsTmV3YQBOa28sTmtvbwBOdXNodSxOc2h1AE55aWFrZW5nX1B1YWNodWVfSG1vbmcsSG1ucABPZ2hhbSxPZ2FtAE9sX0NoaWtpLE9sY2sAT2xkX0h1bmdhcmlhbixIdW5nAE9sZF9JdGFsaWMsSXRhbABPbGRfTm9ydGhfQXJhYmlhbixOYXJiAE9sZF9QZXJtaWMsUGVybQBPbGRfUGVyc2lhbixYcGVvAE9sZF9Tb2dkaWFuLFNvZ28AT2xkX1NvdXRoX0FyYWJpYW4sU2FyYgBPbGRfVHVya2ljLE9ya2gAT2xkX1V5Z2h1cixPdWdyAE9yaXlhLE9yeWEAT3NhZ2UsT3NnZQBPc21hbnlhLE9zbWEAUGFoYXdoX0htb25nLEhtbmcAUGFsbXlyZW5lLFBhbG0AUGF1X0Npbl9IYXUsUGF1YwBQaGFnc19QYSxQaGFnAFBob2VuaWNpYW4sUGhueABQc2FsdGVyX1BhaGxhdmksUGhscABSZWphbmcsUmpuZwBSdW5pYyxSdW5yAFNhbWFyaXRhbixTYW1yAFNhdXJhc2h0cmEsU2F1cgBTaGFyYWRhLFNocmQAU2hhdmlhbixTaGF3AFNpZGRoYW0sU2lkZABTaWduV3JpdGluZyxTZ253AFNpbmhhbGEsU2luaABTb2dkaWFuLFNvZ2QAU29yYV9Tb21wZW5nLFNvcmEAU295b21ibyxTb3lvAFN1bmRhbmVzZSxTdW5kAFN5bG90aV9OYWdyaSxTeWxvAFN5cmlhYyxTeXJjAFRhZ2Fsb2csVGdsZwBUYWdiYW53YSxUYWdiAFRhaV9MZSxUYWxlAFRhaV9UaGFtLExhbmEAVGFpX1ZpZXQsVGF2dABUYWtyaSxUYWtyAFRhbWlsLFRhbWwAVGFuZ3V0LFRhbmcAVGVsdWd1LFRlbHUAVGhhYW5hLFRoYWEAVGhhaSxUaGFpAFRpYmV0YW4sVGlidABUaWZpbmFnaCxUZm5nAFRpcmh1dGEsVGlyaABUYW5nc2EsVG5zYQBUb3RvLFRvdG8AVWdhcml0aWMsVWdhcgBWYWksVmFpaQBWaXRoa3VxaSxWaXRoAFdhbmNobyxXY2hvAFdhcmFuZ19DaXRpLFdhcmEAWWV6aWRpLFllemkAWWksWWlpaQBaYW5hYmF6YXJfU3F1YXJlLFphbmIAQZC2AgvyIMAZmUeFGZlHrhmAR44ZgEeEGZZHgBmeR4AZ4WBHphmER4QZgQ2TGeAPOIMsgBmCLAGDLIAZgCwDgCyAGYAsgBmCLACALACTLAC+LI0ajyzgJB2BOOBIHQClBQGxBQGCBQC2NQeaNQOFNQqEBIAZhQSAGY0EgBmCBIAZnwSAGYkEijiZBIA44AsEgBmhBI2LALuLAYKLrwSxlQ26ZgGCZq1/AY5/AJtSAYBSAIqLBJ4EAIEEBckEgBmcBNAggziOIIEZmSCDCwCHCwGBCwGVCwCGCwCACwKDCwGI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eW1ib2wAU28sT3RoZXJfU3ltYm9sAFBjLENvbm5lY3Rvcl9QdW5jdHVhdGlvbgBQZCxEYXNoX1B1bmN0dWF0aW9uAFBzLE9wZW5fUHVuY3R1YXRpb24AUGUsQ2xvc2VfUHVuY3R1YXRpb24AUGksSW5pdGlhbF9QdW5jdHVhdGlvbgBQZixGaW5hbF9QdW5jdHVhdGlvbgBQbyxPdGhlcl9QdW5jdHVhdGlvbgBacyxTcGFjZV9TZXBhcmF0b3IAWmwsTGluZV9TZXBhcmF0b3IAWnAsUGFyYWdyYXBoX1NlcGFyYXRvcgBDYyxDb250cm9sLGNudHJsAENmLEZvcm1hdABDcyxTdXJyb2dhdGUAQ28sUHJpdmF0ZV9Vc2UATEMsQ2FzZWRfTGV0dGVyAEwsTGV0dGVyAE0sTWFyayxDb21iaW5pbmdfTWFyawBOLE51bWJlcgBTLFN5bWJvbABQLFB1bmN0dWF0aW9uLHB1bmN0AFosU2VwYXJhdG9yAEMsT3RoZXIAQZDXAguwCA4AAAA+AAAAwAEAAAAOAAAA8AAAAAB/AAAAgAMBAAA8QVNDSUlfSGV4X0RpZ2l0LEFIZXgAQmlkaV9Db250cm9sLEJpZGlfQwBEYXNoAERlcHJlY2F0ZWQsRGVwAERpYWNyaXRpYyxEaWEARXh0ZW5kZXIsRXh0AEhleF9EaWdpdCxIZXgASURTX0JpbmFyeV9PcGVyYXRvcixJRFNCAElEU19UcmluYXJ5X09wZXJhdG9yLElEU1QASWRlb2dyYXBoaWMsSWRlbwBKb2luX0NvbnRyb2wsSm9pbl9DAExvZ2ljYWxfT3JkZXJfRXhjZXB0aW9uLExPRQBOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludCxOQ2hhcgBQYXR0ZXJuX1N5bnRheCxQYXRfU3luAFBhdHRlcm5fV2hpdGVfU3BhY2UsUGF0X1dTAFF1b3RhdGlvbl9NYXJrLFFNYXJrAFJhZGljYWwAUmVnaW9uYWxfSW5kaWNhdG9yLFJJAFNlbnRlbmNlX1Rlcm1pbmFsLFNUZXJtAFNvZnRfRG90dGVkLFNEAFRlcm1pbmFsX1B1bmN0dWF0aW9uLFRlcm0AVW5pZmllZF9JZGVvZ3JhcGgsVUlkZW8AVmFyaWF0aW9uX1NlbGVjdG9yLFZTAFdoaXRlX1NwYWNlLHNwYWNlAEJpZGlfTWlycm9yZWQsQmlkaV9NAEVtb2ppAEVtb2ppX0NvbXBvbmVudCxFQ29tcABFbW9qaV9Nb2RpZmllcixFTW9kAEVtb2ppX01vZGlmaWVyX0Jhc2UsRUJhc2UARW1vamlfUHJlc2VudGF0aW9uLEVQcmVzAEV4dGVuZGVkX1BpY3RvZ3JhcGhpYyxFeHRQaWN0AERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQsREkASURfU3RhcnQsSURTAENhc2VfSWdub3JhYmxlLENJAEFTQ0lJAEFscGhhYmV0aWMsQWxwaGEAQW55AEFzc2lnbmVkAENhc2VkAENoYW5nZXNfV2hlbl9DYXNlZm9sZGVkLENXQ0YAQ2hhbmdlc19XaGVuX0Nhc2VtYXBwZWQsQ1dDTQBDaGFuZ2VzX1doZW5fTG93ZXJjYXNlZCxDV0wAQ2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZCxDV0tDRgBDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZCxDV1QAQ2hhbmdlc19XaGVuX1VwcGVyY2FzZWQsQ1dVAEdyYXBoZW1lX0Jhc2UsR3JfQmFzZQBHcmFwaGVtZV9FeHRlbmQsR3JfRXh0AElEX0NvbnRpbnVlLElEQwBMb3dlcmNhc2UsTG93ZXIATWF0aABVcHBlcmNhc2UsVXBwZXIAWElEX0NvbnRpbnVlLFhJREMAWElEX1N0YXJ0LFhJRFMAQdDfAgvyAgEAnAYHTQMEEACPCwAAEQAIAFNKUQBSAFMAOlRVAFdZP11cAEZhY0JkAGYAaABqAGwAbgAAQAAAAAAaAJMAACA1ACcAIQAkIioAE2ttACYkJxQWGBscPh4/Hzk9IiFBHkAlJSYoICpILEMuSzBMMkRCmQAAlY99foOEEoCCdncSe6N8eHmKkpimoIUAmqGTdTOVAI4AdJmYl5YAAJ4AnAChoBUuLzC0tU+qqRIUHiEiIio0NaanNh9JAACXAVraHTYFAMTDxsXIx8rJzMvE1UXWQtdG2M7Q0tTa2e72/g4HD4CfACGAo+0AwEDGYOfb5pnAAAAGYNwp/RUSBhb43QYVEoQIxhb/3wPAQABGYN7gbTc4ORUUFxYAGhkcGwBft2VERwBPYk5QAABIAAAAo6SlAAAAAAC2AABaAEcAW1ZY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n4PLdYFAzXWfjM11gcDTdS0D1HWfiNV1gcDZdZ8D2nWBwNt1nwzcdYFA4nUtg+J1nwjkdYFA6HWfg+h1gUDqdZ+M6nWBwPB1LQTxdR+F83UfBfZ1H4X4dR8F+3Ufhf11nwQMeJ9BDnifBQ94A8IReK3QEngDARt4LQKAe61NgXsDQoh7gcCJey1FinsDBI17gYCQewPckXstBaB7rciie4NEqHutyKp7lwBAfCFFQHwlDUR8h4BKfBXBSnwXQUt8Hw1MfBeCUnyZgFN8l8BTfJeBWnyXAGR8LwGAfIGAgHwDFoR8wQSQfAMBlHwfBfx+rAEAvhDRAL6sRwm+EDkNviyHKb4sAi2+kDcuvpD/Sb4QvGm+AAAAACAAAABhAAIABAAGALwDCAAKAAwAFQCVAKUAuQDBAMMAxwDLANEA1wDdAOAA5gD4AAgBCgFzABABEgEUASABLAFEAU0BUwFiAWgBagF2AZIBlAGpAbsBxwHRAdUBuQLXATsA2QHbAbcA4QH8AQwCGAIdAiMCJwKjAzMCPwJCAksCTgJRAl0CYAJpAmwCbwJ1AngCgQKKApwCnwKjAq8CuQLFAskCzQLRAtUC5wLtAvEC9QL5Av0CBQMJAw0DEwMXAxsDIwMnAysDLwM1Az0DQQNJA00DUQMLD1cDWwNfA2MDZwNrA28DcwN5A30DgQOFA4kDjQORA5UDmQOdA6ED3BClA8kDzQPZA90D4QPvA/EDPQRPBJkE8AQCBUoFZAVsBXAFcwWaBfoF/gUHBgsGFAYYBh4GIgYoBo4GlAaYBp4GogarBqwD8watA/YGrgP5Bq8D/AbMA/8GzQMCB84DBQcJBw0HEQeGAzIHNQe5AzcHOweIA1MHiQNWB5ADaweKA3cHsAOJB44DmQefB6MHjAO4B48Duwe0AL4HwAfCBxAgywcuAM0HzwcgANIH1gfbB98H5AfqB/AHIAD2BxIiAQgFCAcIHQglCCcIQwAtCDAIkAE2CDkITgBFCEcITAhOCFEIWgCpA1oAUwhXCGAIaQBiCGUIbwh0CHoIfgiiCEkApAimCKkIVgCrCK0IsAi0CFgAtgi4CLsIwAjCCMUIdgDHCMkIzAjQCHgA0gjUCNcI2wjeCOQI5wjwCPMI9gj5CAIJBgkLCQ8JFAkXCRoJIwksCTsJPglBCUQJRwlKCVYJXAlgCWIJZAloCWoJ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";if(!K(L)){var M=L;L=d.locateFile?d.locateFile(M,q):q+M;}function ca(){var a=L;return Promise.resolve().then(()=>{if(a==L&&v)var b=new Uint8Array(v);else{if(K(a)){b=atob(a.slice(37));for(var c=new Uint8Array(b.length),e=0;eWebAssembly.instantiate(c,a)).then(c=>c).then(b,c=>{u(`failed to asynchronously prepare wasm: ${c}`);w(c);});}function ea(a,b){return da(a,b);}var N=a=>{for(;0{for(var c=b+NaN,e=b;a[e]&&!(e>=c);)++e;if(16f?c+=String.fromCharCode(f):(f-=65536,c+=String.fromCharCode(55296|f>>10,56320|f&1023));}}else c+=String.fromCharCode(f);}return c;},fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],Q=a=>{for(var b=0,c=0;c=e?b++:2047>=e?b+=2:55296<=e&&57343>=e?(b+=4,++c):b+=3;}return b;},R=(a,b,c)=>{var e=A;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023;}if(127>=g){if(b>=c)break;e[b++]=g;}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6;}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12;}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63;}e[b++]=128|g>>6&63;}e[b++]=128|g&63;}}e[b]=0;}},T=a=>{var b=Q(a)+1,c=S(b);c&&R(a,c,b);return c;};function U(){}var ia=[null,[],[]],ka=(a,b,c,e)=>{var f={string:h=>{var r=0;if(null!==h&&void 0!==h&&0!==h){r=Q(h)+1;var Y=V(r);R(h,Y,r);r=Y;}return r;},array:h=>{var r=V(h.length);z.set(h,r);return r;}};a=d["_"+a];var g=[],l=0;if(e)for(var m=0;m{a=a?P(A,a):"";b=null!==b?JSON.parse(b?P(A,b):""):[];try{const e=d.externalCall(a,b);return e?T(e):null;}catch(e){return d.HEAPU8[c]=1,T(e.message);}};var la={a:(a,b,c,e)=>{w(`Assertion failed: ${a?P(A,a):""}, at: `+[b?b?P(A,b):"":"unknown filename",c,e?e?P(A,e):"":"unknown function"]);},i:function(a,b,c){a=new Date(1E3*(b+2097152>>>0<4194305-!!a?(a>>>0)+4294967296*b:NaN));B[c>>2]=a.getSeconds();B[c+4>>2]=a.getMinutes();B[c+8>>2]=a.getHours();B[c+12>>2]=a.getDate();B[c+16>>2]=a.getMonth();B[c+20>>2]=a.getFullYear()-1900;B[c+24>>2]=a.getDay();b=a.getFullYear();B[c+28>>2]=(0!==b%4||0===b%100&&0!==b%400?ha:fa)[a.getMonth()]+a.getDate()-1|0;B[c+36>>2]=-(60*a.getTimezoneOffset());b=new Date(a.getFullYear(),6,1).getTimezoneOffset();var e=new Date(a.getFullYear(),0,1).getTimezoneOffset();B[c+32>>2]=(b!=e&&a.getTimezoneOffset()==Math.min(e,b))|0;},d:(a,b,c)=>{function e(t){return(t=t.toTimeString().match(/\(([A-Za-z ]+)\)$/))?t[1]:"GMT";}var f=new Date().getFullYear(),g=new Date(f,0,1),l=new Date(f,6,1);f=g.getTimezoneOffset();var m=l.getTimezoneOffset();C[a>>2]=60*Math.max(f,m);B[b>>2]=Number(f!=m);a=e(g);b=e(l);a=T(a);b=T(b);m>2]=a,C[c+4>>2]=b):(C[c>>2]=b,C[c+4>>2]=a);},b:()=>{w("");},g:U,f:function(a,b){a=a?P(A,a):"";let c;try{c=window.JSON.parse(a);}catch(e){c=a;}0!==b?window.alert(a):window.console.log("DUMP",c);},e:()=>Date.now(),j:a=>{var b=A.length;a>>>=0;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);var f=Math;e=Math.max(a,e);a:{f=(f.min.call(f,2147483648,e+(65536-e%65536)%65536)-x.buffer.byteLength+65535)/65536;try{x.grow(f);D();var g=1;break a;}catch(l){}g=void 0;}if(g)return!0;}return!1;},c:(a,b,c,e)=>{for(var f=0,g=0;g>2],m=C[b+4>>2];b+=8;for(var t=0;t>2]=f;return 0;},k:function(a){a=a?P(A,a):"";window.console.log(a);},h:function(a){a=a?P(A,a):"";return Date.parse(a);},l:function(a,b,c,e){a=a?P(A,a):"";b=b?P(A,b):"";c=c?P(A,c):"";c=`Quickjs -- ${a}: ${b}\n${c}`;0!==e?window.alert(c):window.console.error(c);}},X=function(){function a(c){X=c.exports;x=X.m;D();F.unshift(X.n);H--;d.monitorRunDependencies?.(H);0==H&&(null!==I&&(clearInterval(I),I=null),J&&(c=J,J=null,c()));return X;}var b={a:la};H++;d.monitorRunDependencies?.(H);if(d.instantiateWasm)try{return d.instantiateWasm(b,a);}catch(c){u(`Module.instantiateWasm callback failed with error: ${c}`),n(c);}ea(b,function(c){a(c.instance);}).catch(n);return{};}();d._evalInSandbox=(a,b)=>(d._evalInSandbox=X.o)(a,b);d._nukeSandbox=()=>(d._nukeSandbox=X.p)();d._init=(a,b)=>(d._init=X.q)(a,b);d._commFun=(a,b)=>(d._commFun=X.r)(a,b);d._dumpMemoryUse=()=>(d._dumpMemoryUse=X.s)();var S=a=>(S=X.t)(a);d._free=a=>(d._free=X.u)(a);var W=()=>(W=X.w)(),ja=a=>(ja=X.x)(a),V=a=>(V=X.y)(a);d.ccall=ka;d.cwrap=(a,b,c,e)=>{var f=!c||c.every(g=>"number"===g||"boolean"===g);return"string"!==b&&f&&!e?d["_"+a]:function(){return ka(a,b,c,arguments,e);};};d.stringToNewUTF8=T;var Z;J=function ma(){Z||na();Z||(J=ma);};function na(){function a(){if(!Z&&(Z=!0,d.calledRun=!0,!y)){N(F);k(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();G.unshift(b);}N(G);}}if(!(0 { + if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") { + return; + } + if (callbackId === 0) { + this.win.clearTimeout(this.timeoutIds.get(callbackId)); + } + const id = this.win.setTimeout(() => { + this.timeoutIds.delete(callbackId); + this.callSandboxFunction("timeoutCb", { + callbackId, + interval: false + }); + }, nMilliseconds); + this.timeoutIds.set(callbackId, id); + }, + clearTimeout: callbackId => { + this.win.clearTimeout(this.timeoutIds.get(callbackId)); + this.timeoutIds.delete(callbackId); + }, + setInterval: (callbackId, nMilliseconds) => { + if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") { + return; + } + const id = this.win.setInterval(() => { + this.callSandboxFunction("timeoutCb", { + callbackId, + interval: true + }); + }, nMilliseconds); + this.timeoutIds.set(callbackId, id); + }, + clearInterval: callbackId => { + this.win.clearInterval(this.timeoutIds.get(callbackId)); + this.timeoutIds.delete(callbackId); + }, + alert: cMsg => { + if (typeof cMsg !== "string") { + return; + } + this.win.alert(cMsg); + }, + confirm: cMsg => { + if (typeof cMsg !== "string") { + return false; + } + return this.win.confirm(cMsg); + }, + prompt: (cQuestion, cDefault) => { + if (typeof cQuestion !== "string" || typeof cDefault !== "string") { + return null; + } + return this.win.prompt(cQuestion, cDefault); + }, + parseURL: cUrl => { + const url = new this.win.URL(cUrl); + const props = ["hash", "host", "hostname", "href", "origin", "password", "pathname", "port", "protocol", "search", "searchParams", "username"]; + return Object.fromEntries(props.map(name => [name, url[name].toString()])); + }, + send: data => { + if (!data) { + return; + } + const event = new this.win.CustomEvent("updatefromsandbox", { + detail: this.importValueFromSandbox(data) + }); + this.win.dispatchEvent(event); + } + }; + Object.setPrototypeOf(externals, null); + return (name, args) => { + try { + const result = externals[name](...args); + return this.exportValueToSandbox(result); + } catch (error) { + throw this.createErrorForSandbox(error?.toString() ?? ""); + } + }; + } +} +;// ./src/pdf.sandbox.js + + +const pdfjsVersion = "4.10.38"; +const pdfjsBuild = "f9bea397f"; +class SandboxSupport extends SandboxSupportBase { + exportValueToSandbox(val) { + return JSON.stringify(val); + } + importValueFromSandbox(val) { + return val; + } + createErrorForSandbox(errorMessage) { + return new Error(errorMessage); + } +} +class Sandbox { + constructor(win, module) { + this.support = new SandboxSupport(win, this); + module.externalCall = this.support.createSandboxExternals(); + this._module = module; + this._alertOnError = 0; + } + create(data) { + const code = ["var __webpack_exports__ = globalThis.pdfjsSandbox = {};\n\n;// ./src/scripting_api/constants.js\nconst Border = Object.freeze({\n s: \"solid\",\n d: \"dashed\",\n b: \"beveled\",\n i: \"inset\",\n u: \"underline\"\n});\nconst Cursor = Object.freeze({\n visible: 0,\n hidden: 1,\n delay: 2\n});\nconst Display = Object.freeze({\n visible: 0,\n hidden: 1,\n noPrint: 2,\n noView: 3\n});\nconst Font = Object.freeze({\n Times: \"Times-Roman\",\n TimesB: \"Times-Bold\",\n TimesI: \"Times-Italic\",\n TimesBI: \"Times-BoldItalic\",\n Helv: \"Helvetica\",\n HelvB: \"Helvetica-Bold\",\n HelvI: \"Helvetica-Oblique\",\n HelvBI: \"Helvetica-BoldOblique\",\n Cour: \"Courier\",\n CourB: \"Courier-Bold\",\n CourI: \"Courier-Oblique\",\n CourBI: \"Courier-BoldOblique\",\n Symbol: \"Symbol\",\n ZapfD: \"ZapfDingbats\",\n KaGo: \"HeiseiKakuGo-W5-UniJIS-UCS2-H\",\n KaMi: \"HeiseiMin-W3-UniJIS-UCS2-H\"\n});\nconst Highlight = Object.freeze({\n n: \"none\",\n i: \"invert\",\n p: \"push\",\n o: \"outline\"\n});\nconst Position = Object.freeze({\n textOnly: 0,\n iconOnly: 1,\n iconTextV: 2,\n textIconV: 3,\n iconTextH: 4,\n textIconH: 5,\n overlay: 6\n});\nconst ScaleHow = Object.freeze({\n proportional: 0,\n anamorphic: 1\n});\nconst ScaleWhen = Object.freeze({\n always: 0,\n never: 1,\n tooBig: 2,\n tooSmall: 3\n});\nconst Style = Object.freeze({\n ch: \"check\",\n cr: \"cross\",\n di: \"diamond\",\n ci: \"circle\",\n st: \"star\",\n sq: \"square\"\n});\nconst Trans = Object.freeze({\n blindsH: \"BlindsHorizontal\",\n blindsV: \"BlindsVertical\",\n boxI: \"BoxIn\",\n boxO: \"BoxOut\",\n dissolve: \"Dissolve\",\n glitterD: \"GlitterDown\",\n glitterR: \"GlitterRight\",\n glitterRD: \"GlitterRightDown\",\n random: \"Random\",\n replace: \"Replace\",\n splitHI: \"SplitHorizontalIn\",\n splitHO: \"SplitHorizontalOut\",\n splitVI: \"SplitVerticalIn\",\n splitVO: \"SplitVerticalOut\",\n wipeD: \"WipeDown\",\n wipeL: \"WipeLeft\",\n wipeR: \"WipeRight\",\n wipeU: \"WipeUp\"\n});\nconst ZoomType = Object.freeze({\n none: \"NoVary\",\n fitP: \"FitPage\",\n fitW: \"FitWidth\",\n fitH: \"FitHeight\",\n fitV: \"FitVisibleWidth\",\n pref: \"Preferred\",\n refW: \"ReflowWidth\"\n});\nconst GlobalConstants = Object.freeze({\n IDS_GREATER_THAN: \"Invalid value: must be greater than or equal to % s.\",\n IDS_GT_AND_LT: \"Invalid value: must be greater than or equal to % s \" + \"and less than or equal to % s.\",\n IDS_LESS_THAN: \"Invalid value: must be less than or equal to % s.\",\n IDS_INVALID_MONTH: \"** Invalid **\",\n IDS_INVALID_DATE: \"Invalid date / time: please ensure that the date / time exists. Field\",\n IDS_INVALID_DATE2: \" should match format \",\n IDS_INVALID_VALUE: \"The value entered does not match the format of the field\",\n IDS_AM: \"am\",\n IDS_PM: \"pm\",\n IDS_MONTH_INFO: \"January[1] February[2] March[3] April[4] May[5] \" + \"June[6] July[7] August[8] September[9] October[10] \" + \"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] \" + \"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]\",\n IDS_STARTUP_CONSOLE_MSG: \"** ^ _ ^ **\",\n RE_NUMBER_ENTRY_DOT_SEP: [\"[+-]?\\\\d*\\\\.?\\\\d*\"],\n RE_NUMBER_COMMIT_DOT_SEP: [\"[+-]?\\\\d+(\\\\.\\\\d+)?\", \"[+-]?\\\\.\\\\d+\", \"[+-]?\\\\d+\\\\.\"],\n RE_NUMBER_ENTRY_COMMA_SEP: [\"[+-]?\\\\d*,?\\\\d*\"],\n RE_NUMBER_COMMIT_COMMA_SEP: [\"[+-]?\\\\d+([.,]\\\\d+)?\", \"[+-]?[.,]\\\\d+\", \"[+-]?\\\\d+[.,]\"],\n RE_ZIP_ENTRY: [\"\\\\d{0,5}\"],\n RE_ZIP_COMMIT: [\"\\\\d{5}\"],\n RE_ZIP4_ENTRY: [\"\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}\"],\n RE_ZIP4_COMMIT: [\"\\\\d{5}(\\\\.|[- ])?\\\\d{4}\"],\n RE_PHONE_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}\", \"\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"011(\\\\.|[- \\\\d])*\"],\n RE_PHONE_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\d{3}(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"011(\\\\.|[- \\\\d])*\"],\n RE_SSN_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d{0,4}\"],\n RE_SSN_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- ])?\\\\d{4}\"]\n});\n\n;// ./src/scripting_api/common.js\nconst FieldType = {\n none: 0,\n number: 1,\n percent: 2,\n date: 3,\n time: 4\n};\nfunction createActionsMap(actions) {\n const actionsMap = new Map();\n if (actions) {\n for (const [eventType, actionsForEvent] of Object.entries(actions)) {\n actionsMap.set(eventType, actionsForEvent);\n }\n }\n return actionsMap;\n}\nfunction getFieldType(actions) {\n let format = actions.get(\"Format\");\n if (!format) {\n return FieldType.none;\n }\n format = format[0];\n format = format.trim();\n if (format.startsWith(\"AFNumber_\")) {\n return FieldType.number;\n }\n if (format.startsWith(\"AFPercent_\")) {\n return FieldType.percent;\n }\n if (format.startsWith(\"AFDate_\")) {\n return FieldType.date;\n }\n if (format.startsWith(\"AFTime_\")) {\n return FieldType.time;\n }\n return FieldType.none;\n}\n\n;// ./src/shared/scripting_utils.js\nfunction makeColorComp(n) {\n return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, \"0\");\n}\nfunction scaleAndClamp(x) {\n return Math.max(0, Math.min(255, 255 * x));\n}\nclass ColorConverters {\n static CMYK_G([c, y, m, k]) {\n return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n }\n static G_CMYK([g]) {\n return [\"CMYK\", 0, 0, 0, 1 - g];\n }\n static G_RGB([g]) {\n return [\"RGB\", g, g, g];\n }\n static G_rgb([g]) {\n g = scaleAndClamp(g);\n return [g, g, g];\n }\n static G_HTML([g]) {\n const G = makeColorComp(g);\n return `#${G}${G}${G}`;\n }\n static RGB_G([r, g, b]) {\n return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n }\n static RGB_rgb(color) {\n return color.map(scaleAndClamp);\n }\n static RGB_HTML(color) {\n return `#${color.map(makeColorComp).join(\"\")}`;\n }\n static T_HTML() {\n return \"#00000000\";\n }\n static T_rgb() {\n return [null];\n }\n static CMYK_RGB([c, y, m, k]) {\n return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n }\n static CMYK_rgb([c, y, m, k]) {\n return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];\n }\n static CMYK_HTML(components) {\n const rgb = this.CMYK_RGB(components).slice(1);\n return this.RGB_HTML(rgb);\n }\n static RGB_CMYK([r, g, b]) {\n const c = 1 - r;\n const m = 1 - g;\n const y = 1 - b;\n const k = Math.min(c, m, y);\n return [\"CMYK\", c, m, y, k];\n }\n}\n\n;// ./src/scripting_api/pdf_object.js\nclass PDFObject {\n constructor(data) {\n this._expandos = Object.create(null);\n this._send = data.send || null;\n this._id = data.id || null;\n }\n}\n\n;// ./src/scripting_api/color.js\n\n\nclass Color extends PDFObject {\n constructor() {\n super({});\n this.transparent = [\"T\"];\n this.black = [\"G\", 0];\n this.white = [\"G\", 1];\n this.red = [\"RGB\", 1, 0, 0];\n this.green = [\"RGB\", 0, 1, 0];\n this.blue = [\"RGB\", 0, 0, 1];\n this.cyan = [\"CMYK\", 1, 0, 0, 0];\n this.magenta = [\"CMYK\", 0, 1, 0, 0];\n this.yellow = [\"CMYK\", 0, 0, 1, 0];\n this.dkGray = [\"G\", 0.25];\n this.gray = [\"G\", 0.5];\n this.ltGray = [\"G\", 0.75];\n }\n static _isValidSpace(cColorSpace) {\n return typeof cColorSpace === \"string\" && (cColorSpace === \"T\" || cColorSpace === \"G\" || cColorSpace === \"RGB\" || cColorSpace === \"CMYK\");\n }\n static _isValidColor(colorArray) {\n if (!Array.isArray(colorArray) || colorArray.length === 0) {\n return false;\n }\n const space = colorArray[0];\n if (!Color._isValidSpace(space)) {\n return false;\n }\n switch (space) {\n case \"T\":\n if (colorArray.length !== 1) {\n return false;\n }\n break;\n case \"G\":\n if (colorArray.length !== 2) {\n return false;\n }\n break;\n case \"RGB\":\n if (colorArray.length !== 4) {\n return false;\n }\n break;\n case \"CMYK\":\n if (colorArray.length !== 5) {\n return false;\n }\n break;\n default:\n return false;\n }\n return colorArray.slice(1).every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n }\n static _getCorrectColor(colorArray) {\n return Color._isValidColor(colorArray) ? colorArray : [\"G\", 0];\n }\n convert(colorArray, cColorSpace) {\n if (!Color._isValidSpace(cColorSpace)) {\n return this.black;\n }\n if (cColorSpace === \"T\") {\n return [\"T\"];\n }\n colorArray = Color._getCorrectColor(colorArray);\n if (colorArray[0] === cColorSpace) {\n return colorArray;\n }\n if (colorArray[0] === \"T\") {\n return this.convert(this.black, cColorSpace);\n }\n return ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n }\n equal(colorArray1, colorArray2) {\n colorArray1 = Color._getCorrectColor(colorArray1);\n colorArray2 = Color._getCorrectColor(colorArray2);\n if (colorArray1[0] === \"T\" || colorArray2[0] === \"T\") {\n return colorArray1[0] === \"T\" && colorArray2[0] === \"T\";\n }\n if (colorArray1[0] !== colorArray2[0]) {\n colorArray2 = this.convert(colorArray2, colorArray1[0]);\n }\n return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n }\n}\n\n;// ./src/scripting_api/field.js\n\n\n\nclass Field extends PDFObject {\n constructor(data) {\n super(data);\n this.alignment = data.alignment || \"left\";\n this.borderStyle = data.borderStyle || \"\";\n this.buttonAlignX = data.buttonAlignX || 50;\n this.buttonAlignY = data.buttonAlignY || 50;\n this.buttonFitBounds = data.buttonFitBounds;\n this.buttonPosition = data.buttonPosition;\n this.buttonScaleHow = data.buttonScaleHow;\n this.ButtonScaleWhen = data.buttonScaleWhen;\n this.calcOrderIndex = data.calcOrderIndex;\n this.comb = data.comb;\n this.commitOnSelChange = data.commitOnSelChange;\n this.currentValueIndices = data.currentValueIndices;\n this.defaultStyle = data.defaultStyle;\n this.defaultValue = data.defaultValue;\n this.doNotScroll = data.doNotScroll;\n this.doNotSpellCheck = data.doNotSpellCheck;\n this.delay = data.delay;\n this.display = data.display;\n this.doc = data.doc.wrapped;\n this.editable = data.editable;\n this.exportValues = data.exportValues;\n this.fileSelect = data.fileSelect;\n this.hidden = data.hidden;\n this.highlight = data.highlight;\n this.lineWidth = data.lineWidth;\n this.multiline = data.multiline;\n this.multipleSelection = !!data.multipleSelection;\n this.name = data.name;\n this.password = data.password;\n this.print = data.print;\n this.radiosInUnison = data.radiosInUnison;\n this.readonly = data.readonly;\n this.rect = data.rect;\n this.required = data.required;\n this.richText = data.richText;\n this.richValue = data.richValue;\n this.style = data.style;\n this.submitName = data.submitName;\n this.textFont = data.textFont;\n this.textSize = data.textSize;\n this.type = data.type;\n this.userName = data.userName;\n this._actions = createActionsMap(data.actions);\n this._browseForFileToSubmit = data.browseForFileToSubmit || null;\n this._buttonCaption = null;\n this._buttonIcon = null;\n this._charLimit = data.charLimit;\n this._children = null;\n this._currentValueIndices = data.currentValueIndices || 0;\n this._document = data.doc;\n this._fieldPath = data.fieldPath;\n this._fillColor = data.fillColor || [\"T\"];\n this._isChoice = Array.isArray(data.items);\n this._items = data.items || [];\n this._hasValue = data.hasOwnProperty(\"value\");\n this._page = data.page || 0;\n this._strokeColor = data.strokeColor || [\"G\", 0];\n this._textColor = data.textColor || [\"G\", 0];\n this._value = null;\n this._kidIds = data.kidIds || null;\n this._fieldType = getFieldType(this._actions);\n this._siblings = data.siblings || null;\n this._rotation = data.rotation || 0;\n this._globalEval = data.globalEval;\n this._appObjects = data.appObjects;\n this.value = data.value || \"\";\n }\n get currentValueIndices() {\n if (!this._isChoice) {\n return 0;\n }\n return this._currentValueIndices;\n }\n set currentValueIndices(indices) {\n if (!this._isChoice) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = [indices];\n }\n if (!indices.every(i => typeof i === \"number\" && Number.isInteger(i) && i >= 0 && i < this.numItems)) {\n return;\n }\n indices.sort();\n if (this.multipleSelection) {\n this._currentValueIndices = indices;\n this._value = [];\n indices.forEach(i => {\n this._value.push(this._items[i].displayValue);\n });\n } else if (indices.length > 0) {\n indices = indices.splice(1, indices.length - 1);\n this._currentValueIndices = indices[0];\n this._value = this._items[this._currentValueIndices];\n }\n this._send({\n id: this._id,\n indices\n });\n }\n get fillColor() {\n return this._fillColor;\n }\n set fillColor(color) {\n if (Color._isValidColor(color)) {\n this._fillColor = color;\n }\n }\n get bgColor() {\n return this.fillColor;\n }\n set bgColor(color) {\n this.fillColor = color;\n }\n get charLimit() {\n return this._charLimit;\n }\n set charLimit(limit) {\n if (typeof limit !== \"number\") {\n throw new Error(\"Invalid argument value\");\n }\n this._charLimit = Math.max(0, Math.floor(limit));\n }\n get numItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n return this._items.length;\n }\n set numItems(_) {\n throw new Error(\"field.numItems is read-only\");\n }\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(color) {\n if (Color._isValidColor(color)) {\n this._strokeColor = color;\n }\n }\n get borderColor() {\n return this.strokeColor;\n }\n set borderColor(color) {\n this.strokeColor = color;\n }\n get page() {\n return this._page;\n }\n set page(_) {\n throw new Error(\"field.page is read-only\");\n }\n get rotation() {\n return this._rotation;\n }\n set rotation(angle) {\n angle = Math.floor(angle);\n if (angle % 90 !== 0) {\n throw new Error(\"Invalid rotation: must be a multiple of 90\");\n }\n angle %= 360;\n if (angle < 0) {\n angle += 360;\n }\n this._rotation = angle;\n }\n get textColor() {\n return this._textColor;\n }\n set textColor(color) {\n if (Color._isValidColor(color)) {\n this._textColor = color;\n }\n }\n get fgColor() {\n return this.textColor;\n }\n set fgColor(color) {\n this.textColor = color;\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (this._isChoice) {\n this._setChoiceValue(value);\n return;\n }\n if (value === \"\" || typeof value !== \"string\" || this._fieldType >= FieldType.date) {\n this._originalValue = undefined;\n this._value = value;\n return;\n }\n this._originalValue = value;\n const _value = value.trim().replace(\",\", \".\");\n this._value = !isNaN(_value) ? parseFloat(_value) : value;\n }\n _getValue() {\n return this._originalValue ?? this.value;\n }\n _setChoiceValue(value) {\n if (this.multipleSelection) {\n if (!Array.isArray(value)) {\n value = [value];\n }\n const values = new Set(value);\n if (Array.isArray(this._currentValueIndices)) {\n this._currentValueIndices.length = 0;\n this._value.length = 0;\n } else {\n this._currentValueIndices = [];\n this._value = [];\n }\n this._items.forEach((item, i) => {\n if (values.has(item.exportValue)) {\n this._currentValueIndices.push(i);\n this._value.push(item.exportValue);\n }\n });\n } else {\n if (Array.isArray(value)) {\n value = value[0];\n }\n const index = this._items.findIndex(({\n exportValue\n }) => value === exportValue);\n if (index !== -1) {\n this._currentValueIndices = index;\n this._value = this._items[index].exportValue;\n }\n }\n }\n get valueAsString() {\n return (this._value ?? \"\").toString();\n }\n set valueAsString(_) {}\n browseForFileToSubmit() {\n if (this._browseForFileToSubmit) {\n this._browseForFileToSubmit();\n }\n }\n buttonGetCaption(nFace = 0) {\n if (this._buttonCaption) {\n return this._buttonCaption[nFace];\n }\n return \"\";\n }\n buttonGetIcon(nFace = 0) {\n if (this._buttonIcon) {\n return this._buttonIcon[nFace];\n }\n return null;\n }\n buttonImportIcon(cPath = null, nPave = 0) {}\n buttonSetCaption(cCaption, nFace = 0) {\n if (!this._buttonCaption) {\n this._buttonCaption = [\"\", \"\", \"\"];\n }\n this._buttonCaption[nFace] = cCaption;\n }\n buttonSetIcon(oIcon, nFace = 0) {\n if (!this._buttonIcon) {\n this._buttonIcon = [null, null, null];\n }\n this._buttonIcon[nFace] = oIcon;\n }\n checkThisBox(nWidget, bCheckIt = true) {}\n clearItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items = [];\n this._send({\n id: this._id,\n clear: null\n });\n }\n deleteItemAt(nIdx = null) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!this.numItems) {\n return;\n }\n if (nIdx === null) {\n nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n nIdx ||= 0;\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n this._items.splice(nIdx, 1);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n if (this._currentValueIndices[index] === nIdx) {\n this._currentValueIndices.splice(index, 1);\n }\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n --this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices === nIdx) {\n this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n } else if (this._currentValueIndices > nIdx) {\n --this._currentValueIndices;\n }\n this._send({\n id: this._id,\n remove: nIdx\n });\n }\n getItemAt(nIdx = -1, bExportValue = false) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n const item = this._items[nIdx];\n return bExportValue ? item.exportValue : item.displayValue;\n }\n getArray() {\n if (this._kidIds) {\n const array = [];\n const fillArrayWithKids = kidIds => {\n for (const id of kidIds) {\n const obj = this._appObjects[id];\n if (!obj) {\n continue;\n }\n if (obj.obj._hasValue) {\n array.push(obj.wrapped);\n }\n if (obj.obj._kidIds) {\n fillArrayWithKids(obj.obj._kidIds);\n }\n }\n };\n fillArrayWithKids(this._kidIds);\n return array;\n }\n if (this._children === null) {\n this._children = this._document.obj._getTerminalChildren(this._fieldPath);\n }\n return this._children;\n }\n getLock() {\n return undefined;\n }\n isBoxChecked(nWidget) {\n return false;\n }\n isDefaultChecked(nWidget) {\n return false;\n }\n insertItemAt(cName, cExport = undefined, nIdx = 0) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!cName) {\n return;\n }\n if (nIdx < 0 || nIdx > this.numItems) {\n nIdx = this.numItems;\n }\n if (this._items.some(({\n displayValue\n }) => displayValue === cName)) {\n return;\n }\n if (cExport === undefined) {\n cExport = cName;\n }\n const data = {\n displayValue: cName,\n exportValue: cExport\n };\n this._items.splice(nIdx, 0, data);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n ++this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices >= nIdx) {\n ++this._currentValueIndices;\n }\n this._send({\n id: this._id,\n insert: {\n index: nIdx,\n ...data\n }\n });\n }\n setAction(cTrigger, cScript) {\n if (typeof cTrigger !== \"string\" || typeof cScript !== \"string\") {\n return;\n }\n if (!(cTrigger in this._actions)) {\n this._actions[cTrigger] = [];\n }\n this._actions[cTrigger].push(cScript);\n }\n setFocus() {\n this._send({\n id: this._id,\n focus: true\n });\n }\n setItems(oArray) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items.length = 0;\n for (const element of oArray) {\n let displayValue, exportValue;\n if (Array.isArray(element)) {\n displayValue = element[0]?.toString() || \"\";\n exportValue = element[1]?.toString() || \"\";\n } else {\n displayValue = exportValue = element?.toString() || \"\";\n }\n this._items.push({\n displayValue,\n exportValue\n });\n }\n this._currentValueIndices = 0;\n this._send({\n id: this._id,\n items: this._items\n });\n }\n setLock() {}\n signatureGetModifications() {}\n signatureGetSeedValue() {}\n signatureInfo() {}\n signatureSetSeedValue() {}\n signatureSign() {}\n signatureValidate() {}\n _isButton() {\n return false;\n }\n _reset() {\n this.value = this.defaultValue;\n }\n _runActions(event) {\n const eventName = event.name;\n if (!this._actions.has(eventName)) {\n return false;\n }\n const actions = this._actions.get(eventName);\n try {\n for (const action of actions) {\n this._globalEval(action);\n }\n } catch (error) {\n event.rc = false;\n throw error;\n }\n return true;\n }\n}\nclass RadioButtonField extends Field {\n constructor(otherButtons, data) {\n super(data);\n this.exportValues = [this.exportValues];\n this._radioIds = [this._id];\n this._radioActions = [this._actions];\n for (const radioData of otherButtons) {\n this.exportValues.push(radioData.exportValues);\n this._radioIds.push(radioData.id);\n this._radioActions.push(createActionsMap(radioData.actions));\n if (this._value === radioData.exportValues) {\n this._id = radioData.id;\n }\n }\n this._hasBeenInitialized = true;\n this._value = data.value || \"\";\n }\n get _siblings() {\n return this._radioIds.filter(id => id !== this._id);\n }\n set _siblings(_) {}\n get value() {\n return this._value;\n }\n set value(value) {\n if (!this._hasBeenInitialized) {\n return;\n }\n if (value === null || value === undefined) {\n this._value = \"\";\n }\n const i = this.exportValues.indexOf(value);\n if (0 <= i && i < this._radioIds.length) {\n this._id = this._radioIds[i];\n this._value = value;\n } else if (value === \"Off\" && this._radioIds.length === 2) {\n const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\n this._id = this._radioIds[nextI];\n this._value = this.exportValues[nextI];\n }\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = this.exportValues[nWidget];\n this._send({\n id: this._id,\n value: this._value\n });\n }\n isBoxChecked(nWidget) {\n return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n }\n isDefaultChecked(nWidget) {\n return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\n }\n _getExportValue(state) {\n const i = this._radioIds.indexOf(this._id);\n return this.exportValues[i];\n }\n _runActions(event) {\n const i = this._radioIds.indexOf(this._id);\n this._actions = this._radioActions[i];\n return super._runActions(event);\n }\n _isButton() {\n return true;\n }\n}\nclass CheckboxField extends RadioButtonField {\n get value() {\n return this._value;\n }\n set value(value) {\n if (!value || value === \"Off\") {\n this._value = \"Off\";\n } else {\n super.value = value;\n }\n }\n _getExportValue(state) {\n return state ? super._getExportValue(state) : \"Off\";\n }\n isBoxChecked(nWidget) {\n if (this._value === \"Off\") {\n return false;\n }\n return super.isBoxChecked(nWidget);\n }\n isDefaultChecked(nWidget) {\n if (this.defaultValue === \"Off\") {\n return this._value === \"Off\";\n }\n return super.isDefaultChecked(nWidget);\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = bCheckIt ? this.exportValues[nWidget] : \"Off\";\n this._send({\n id: this._id,\n value: this._value\n });\n }\n}\n\n;// ./src/scripting_api/aform.js\n\nclass AForm {\n constructor(document, app, util, color) {\n this._document = document;\n this._app = app;\n this._util = util;\n this._color = color;\n this._dateFormats = [\"m/d\", \"m/d/yy\", \"mm/dd/yy\", \"mm/yy\", \"d-mmm\", \"d-mmm-yy\", \"dd-mmm-yy\", \"yy-mm-dd\", \"mmm-yy\", \"mmmm-yy\", \"mmm d, yyyy\", \"mmmm d, yyyy\", \"m/d/yy h:MM tt\", \"m/d/yy HH:MM\"];\n this._timeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n this._emailRegex = new RegExp(\"^[a-zA-Z0-9.!#$%&'*+\\\\/=?^_`{|}~-]+\" + \"@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\" + \"(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\");\n }\n _mkTargetName(event) {\n return event.target ? `[ ${event.target.name} ]` : \"\";\n }\n _parseDate(cFormat, cDate, strict = false) {\n let date = null;\n try {\n date = this._util._scand(cFormat, cDate, strict);\n } catch {}\n if (date) {\n return date;\n }\n if (strict) {\n return null;\n }\n date = Date.parse(cDate);\n return isNaN(date) ? null : new Date(date);\n }\n AFMergeChange(event = globalThis.event) {\n if (event.willCommit) {\n return event.value.toString();\n }\n return this._app._eventDispatcher.mergeChange(event);\n }\n AFParseDateEx(cString, cOrder) {\n return this._parseDate(cOrder, cString);\n }\n AFExtractNums(str) {\n if (typeof str === \"number\") {\n return [str];\n }\n if (!str || typeof str !== \"string\") {\n return null;\n }\n const first = str.charAt(0);\n if (first === \".\" || first === \",\") {\n str = `0${str}`;\n }\n const numbers = str.match(/(\\d+)/g);\n if (numbers.length === 0) {\n return null;\n }\n return numbers;\n }\n AFMakeNumber(str) {\n if (typeof str === \"number\") {\n return str;\n }\n if (typeof str !== \"string\") {\n return null;\n }\n str = str.trim().replace(\",\", \".\");\n const number = parseFloat(str);\n if (isNaN(number) || !isFinite(number)) {\n return null;\n }\n return number;\n }\n AFMakeArrayFromList(string) {\n if (typeof string === \"string\") {\n return string.split(/, ?/g);\n }\n return string;\n }\n AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"\";\n return;\n }\n const sign = Math.sign(value);\n const buf = [];\n let hasParen = false;\n if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\n buf.push(\"-\");\n }\n if ((negStyle === 2 || negStyle === 3) && sign === -1) {\n buf.push(\"(\");\n hasParen = true;\n }\n if (bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\n buf.push(\"%,\", sepStyle, \".\", nDec.toString(), \"f\");\n if (!bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n if (hasParen) {\n buf.push(\")\");\n }\n if (negStyle === 1 || negStyle === 3) {\n event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n }\n if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\n value = -value;\n }\n const formatStr = buf.join(\"\");\n event.value = this._util.printf(formatStr, value);\n }\n AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n value = value.trim();\n let pattern;\n if (sepStyle > 1) {\n pattern = event.willCommit ? /^[+-]?(\\d+(,\\d*)?|,\\d+)$/ : /^[+-]?\\d*,?\\d*$/;\n } else {\n pattern = event.willCommit ? /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/ : /^[+-]?\\d*\\.?\\d*$/;\n }\n if (!pattern.test(value)) {\n if (event.willCommit) {\n const err = `${GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n this._app.alert(err);\n }\n event.rc = false;\n }\n if (event.willCommit && sepStyle > 1) {\n event.value = parseFloat(value.replace(\",\", \".\"));\n }\n }\n AFPercent_Format(nDec, sepStyle, percentPrepend = false) {\n if (typeof nDec !== \"number\") {\n return;\n }\n if (typeof sepStyle !== \"number\") {\n return;\n }\n if (nDec < 0) {\n throw new Error(\"Invalid nDec value in AFPercent_Format\");\n }\n const event = globalThis.event;\n if (nDec > 512) {\n event.value = \"%\";\n return;\n }\n nDec = Math.floor(nDec);\n sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"%\";\n return;\n }\n const formatStr = `%,${sepStyle}.${nDec}f`;\n value = this._util.printf(formatStr, value * 100);\n event.value = percentPrepend ? `%${value}` : `${value}%`;\n }\n AFPercent_Keystroke(nDec, sepStyle) {\n this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, \"\", true);\n }\n AFDate_FormatEx(cFormat) {\n const event = globalThis.event;\n const value = event.value;\n if (!value) {\n return;\n }\n const date = this._parseDate(cFormat, value);\n if (date !== null) {\n event.value = this._util.printd(cFormat, date);\n }\n }\n AFDate_Format(pdf) {\n if (pdf >= 0 && pdf < this._dateFormats.length) {\n this.AFDate_FormatEx(this._dateFormats[pdf]);\n }\n }\n AFDate_KeystrokeEx(cFormat) {\n const event = globalThis.event;\n if (!event.willCommit) {\n return;\n }\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n if (this._parseDate(cFormat, value, true) === null) {\n const invalid = GlobalConstants.IDS_INVALID_DATE;\n const invalid2 = GlobalConstants.IDS_INVALID_DATE2;\n const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFDate_Keystroke(pdf) {\n if (pdf >= 0 && pdf < this._dateFormats.length) {\n this.AFDate_KeystrokeEx(this._dateFormats[pdf]);\n }\n }\n AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n const value = this.AFMakeNumber(event.value);\n if (value === null) {\n return;\n }\n bGreaterThan = !!bGreaterThan;\n bLessThan = !!bLessThan;\n if (bGreaterThan) {\n nGreaterThan = this.AFMakeNumber(nGreaterThan);\n if (nGreaterThan === null) {\n return;\n }\n }\n if (bLessThan) {\n nLessThan = this.AFMakeNumber(nLessThan);\n if (nLessThan === null) {\n return;\n }\n }\n let err = \"\";\n if (bGreaterThan && bLessThan) {\n if (value < nGreaterThan || value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n }\n } else if (bGreaterThan) {\n if (value < nGreaterThan) {\n err = this._util.printf(GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n }\n } else if (value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_LESS_THAN, nLessThan);\n }\n if (err) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSimple(cFunction, nValue1, nValue2) {\n const value1 = this.AFMakeNumber(nValue1);\n if (value1 === null) {\n throw new Error(\"Invalid nValue1 in AFSimple\");\n }\n const value2 = this.AFMakeNumber(nValue2);\n if (value2 === null) {\n throw new Error(\"Invalid nValue2 in AFSimple\");\n }\n switch (cFunction) {\n case \"AVG\":\n return (value1 + value2) / 2;\n case \"SUM\":\n return value1 + value2;\n case \"PRD\":\n return value1 * value2;\n case \"MIN\":\n return Math.min(value1, value2);\n case \"MAX\":\n return Math.max(value1, value2);\n }\n throw new Error(\"Invalid cFunction in AFSimple\");\n }\n AFSimple_Calculate(cFunction, cFields) {\n const actions = {\n AVG: args => args.reduce((acc, value) => acc + value, 0) / args.length,\n SUM: args => args.reduce((acc, value) => acc + value, 0),\n PRD: args => args.reduce((acc, value) => acc * value, 1),\n MIN: args => args.reduce((acc, value) => Math.min(acc, value), Number.MAX_VALUE),\n MAX: args => args.reduce((acc, value) => Math.max(acc, value), Number.MIN_VALUE)\n };\n if (!(cFunction in actions)) {\n throw new TypeError(\"Invalid function in AFSimple_Calculate\");\n }\n const event = globalThis.event;\n const values = [];\n cFields = this.AFMakeArrayFromList(cFields);\n for (const cField of cFields) {\n const field = this._document.getField(cField);\n if (!field) {\n continue;\n }\n for (const child of field.getArray()) {\n const number = this.AFMakeNumber(child.value);\n values.push(number ?? 0);\n }\n }\n if (values.length === 0) {\n event.value = 0;\n return;\n }\n const res = actions[cFunction](values);\n event.value = Math.round(1e6 * res) / 1e6;\n }\n AFSpecial_Format(psf) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n formatStr = this._util.printx(\"9999999999\", event.value).length >= 10 ? \"(999) 999-9999\" : \"999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Format\");\n }\n event.value = this._util.printx(formatStr, event.value);\n }\n AFSpecial_KeystrokeEx(cMask) {\n const event = globalThis.event;\n const simplifiedFormatStr = cMask.replaceAll(/[^9AOX]/g, \"\");\n this.#AFSpecial_KeystrokeEx_helper(simplifiedFormatStr, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n this.#AFSpecial_KeystrokeEx_helper(cMask, true);\n }\n #AFSpecial_KeystrokeEx_helper(cMask, warn) {\n if (!cMask) {\n return;\n }\n const event = globalThis.event;\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n const checkers = new Map([[\"9\", char => char >= \"0\" && char <= \"9\"], [\"A\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\"], [\"O\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\"], [\"X\", char => true]]);\n function _checkValidity(_value, _cMask) {\n for (let i = 0, ii = _value.length; i < ii; i++) {\n const mask = _cMask.charAt(i);\n const char = _value.charAt(i);\n const checker = checkers.get(mask);\n if (checker) {\n if (!checker(char)) {\n return false;\n }\n } else if (mask !== char) {\n return false;\n }\n }\n return true;\n }\n const err = `${GlobalConstants.IDS_INVALID_VALUE} = \"${cMask}\"`;\n if (value.length > cMask.length) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n if (event.willCommit) {\n if (value.length < cMask.length) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n if (!_checkValidity(value, cMask)) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n event.value += cMask.substring(value.length);\n return;\n }\n if (value.length < cMask.length) {\n cMask = cMask.substring(0, value.length);\n }\n if (!_checkValidity(value, cMask)) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n }\n }\n AFSpecial_Keystroke(psf) {\n const event = globalThis.event;\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n const value = this.AFMergeChange(event);\n formatStr = value.startsWith(\"(\") || value.length > 7 && /^\\p{N}+$/.test(value) ? \"(999) 999-9999\" : \"999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\n }\n this.AFSpecial_KeystrokeEx(formatStr);\n }\n AFTime_FormatEx(cFormat) {\n this.AFDate_FormatEx(cFormat);\n }\n AFTime_Format(pdf) {\n if (pdf >= 0 && pdf < this._timeFormats.length) {\n this.AFDate_FormatEx(this._timeFormats[pdf]);\n }\n }\n AFTime_KeystrokeEx(cFormat) {\n this.AFDate_KeystrokeEx(cFormat);\n }\n AFTime_Keystroke(pdf) {\n if (pdf >= 0 && pdf < this._timeFormats.length) {\n this.AFDate_KeystrokeEx(this._timeFormats[pdf]);\n }\n }\n eMailValidate(str) {\n return this._emailRegex.test(str);\n }\n AFExactMatch(rePatterns, str) {\n if (rePatterns instanceof RegExp) {\n return str.match(rePatterns)?.[0] === str || 0;\n }\n return rePatterns.findIndex(re => str.match(re)?.[0] === str) + 1;\n }\n}\n\n;// ./src/scripting_api/app_utils.js\nconst VIEWER_TYPE = \"PDF.js\";\nconst VIEWER_VARIATION = \"Full\";\nconst VIEWER_VERSION = 21.00720099;\nconst FORMS_VERSION = 21.00720099;\nconst USERACTIVATION_CALLBACKID = 0;\nconst USERACTIVATION_MAXTIME_VALIDITY = 5000;\nfunction serializeError(error) {\n const value = `${error.toString()}\\n${error.stack}`;\n return {\n command: \"error\",\n value\n };\n}\n\n;// ./src/scripting_api/event.js\n\nclass Event {\n constructor(data) {\n this.change = data.change || \"\";\n this.changeEx = data.changeEx || null;\n this.commitKey = data.commitKey || 0;\n this.fieldFull = data.fieldFull || false;\n this.keyDown = data.keyDown || false;\n this.modifier = data.modifier || false;\n this.name = data.name;\n this.rc = true;\n this.richChange = data.richChange || [];\n this.richChangeEx = data.richChangeEx || [];\n this.richValue = data.richValue || [];\n this.selEnd = data.selEnd ?? -1;\n this.selStart = data.selStart ?? -1;\n this.shift = data.shift || false;\n this.source = data.source || null;\n this.target = data.target || null;\n this.targetName = \"\";\n this.type = \"Field\";\n this.value = data.value || \"\";\n this.willCommit = data.willCommit || false;\n }\n}\nclass EventDispatcher {\n constructor(document, calculationOrder, objects, externalCall) {\n this._document = document;\n this._calculationOrder = calculationOrder;\n this._objects = objects;\n this._externalCall = externalCall;\n this._document.obj._eventDispatcher = this;\n this._isCalculating = false;\n }\n mergeChange(event) {\n let value = event.value;\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n value = value.toString();\n }\n const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : \"\";\n const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : \"\";\n return `${prefix}${event.change}${postfix}`;\n }\n userActivation() {\n this._document.obj._userActivation = true;\n this._externalCall(\"setTimeout\", [USERACTIVATION_CALLBACKID, USERACTIVATION_MAXTIME_VALIDITY]);\n }\n dispatch(baseEvent) {\n const id = baseEvent.id;\n if (!(id in this._objects)) {\n let event;\n if (id === \"doc\" || id === \"page\") {\n event = globalThis.event = new Event(baseEvent);\n event.source = event.target = this._document.wrapped;\n event.name = baseEvent.name;\n }\n if (id === \"doc\") {\n const eventName = event.name;\n if (eventName === \"Open\") {\n this.userActivation();\n this._document.obj._initActions();\n this.formatAll();\n }\n if (![\"DidPrint\", \"DidSave\", \"WillPrint\", \"WillSave\"].includes(eventName)) {\n this.userActivation();\n }\n this._document.obj._dispatchDocEvent(event.name);\n } else if (id === \"page\") {\n this.userActivation();\n this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\n } else if (id === \"app\" && baseEvent.name === \"ResetForm\") {\n this.userActivation();\n for (const fieldId of baseEvent.ids) {\n const obj = this._objects[fieldId];\n obj?.obj._reset();\n }\n }\n return;\n }\n const name = baseEvent.name;\n const source = this._objects[id];\n const event = globalThis.event = new Event(baseEvent);\n let savedChange;\n this.userActivation();\n if (source.obj._isButton()) {\n source.obj._id = id;\n event.value = source.obj._getExportValue(event.value);\n if (name === \"Action\") {\n source.obj._value = event.value;\n }\n }\n switch (name) {\n case \"Keystroke\":\n savedChange = {\n value: event.value,\n changeEx: event.changeEx,\n change: event.change,\n selStart: event.selStart,\n selEnd: event.selEnd\n };\n break;\n case \"Blur\":\n case \"Focus\":\n Object.defineProperty(event, \"value\", {\n configurable: false,\n writable: false,\n enumerable: true,\n value: event.value\n });\n break;\n case \"Validate\":\n this.runValidation(source, event);\n return;\n case \"Action\":\n this.runActions(source, source, event, name);\n this.runCalculate(source, event);\n return;\n }\n this.runActions(source, source, event, name);\n if (name !== \"Keystroke\") {\n return;\n }\n if (event.rc) {\n if (event.willCommit) {\n this.runValidation(source, event);\n } else {\n if (source.obj._isChoice) {\n source.obj.value = savedChange.changeEx;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: source.obj.value\n });\n return;\n }\n const value = source.obj.value = this.mergeChange(event);\n let selStart, selEnd;\n if (event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\n selStart = event.selStart;\n selEnd = event.selEnd;\n } else {\n selEnd = selStart = savedChange.selStart + event.change.length;\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value,\n selRange: [selStart, selEnd]\n });\n }\n } else if (!event.willCommit) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedChange.value,\n selRange: [savedChange.selStart, savedChange.selEnd]\n });\n } else {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n }\n formatAll() {\n const event = globalThis.event = new Event({});\n for (const source of Object.values(this._objects)) {\n event.value = source.obj._getValue();\n this.runActions(source, source, event, \"Format\");\n }\n }\n runValidation(source, event) {\n const didValidateRun = this.runActions(source, source, event, \"Validate\");\n if (event.rc) {\n source.obj.value = event.value;\n this.runCalculate(source, event);\n const savedValue = event.value = source.obj._getValue();\n let formattedValue = null;\n if (this.runActions(source, source, event, \"Format\")) {\n formattedValue = event.value?.toString?.();\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedValue,\n formattedValue\n });\n event.value = savedValue;\n } else if (didValidateRun) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0],\n focus: true\n });\n }\n }\n runActions(source, target, event, eventName) {\n event.source = source.wrapped;\n event.target = target.wrapped;\n event.name = eventName;\n event.targetName = target.obj.name;\n event.rc = true;\n return target.obj._runActions(event);\n }\n calculateNow() {\n if (!this._calculationOrder || this._isCalculating || !this._document.obj.calculate) {\n return;\n }\n this._isCalculating = true;\n const first = this._calculationOrder[0];\n const source = this._objects[first];\n globalThis.event = new Event({});\n try {\n this.runCalculate(source, globalThis.event);\n } catch (error) {\n this._isCalculating = false;\n throw error;\n }\n this._isCalculating = false;\n }\n runCalculate(source, event) {\n if (!this._calculationOrder || !this._document.obj.calculate) {\n return;\n }\n for (const targetId of this._calculationOrder) {\n if (!(targetId in this._objects)) {\n continue;\n }\n if (!this._document.obj.calculate) {\n break;\n }\n event.value = null;\n const target = this._objects[targetId];\n let savedValue = target.obj._getValue();\n try {\n this.runActions(source, target, event, \"Calculate\");\n } catch (error) {\n const fieldId = target.obj._id;\n const serializedError = serializeError(error);\n serializedError.value = `Error when calculating value for field \"${fieldId}\"\\n${serializedError.value}`;\n this._externalCall(\"send\", [serializedError]);\n continue;\n }\n if (!event.rc) {\n continue;\n }\n if (event.value !== null) {\n target.obj.value = event.value;\n } else {\n event.value = target.obj._getValue();\n }\n this.runActions(target, target, event, \"Validate\");\n if (!event.rc) {\n if (target.obj._getValue() !== savedValue) {\n target.wrapped.value = savedValue;\n }\n continue;\n }\n if (event.value === null) {\n event.value = target.obj._getValue();\n }\n savedValue = target.obj._getValue();\n let formattedValue = null;\n if (this.runActions(target, target, event, \"Format\")) {\n formattedValue = event.value?.toString?.();\n }\n target.obj._send({\n id: target.obj._id,\n siblings: target.obj._siblings,\n value: savedValue,\n formattedValue\n });\n }\n }\n}\n\n;// ./src/scripting_api/fullscreen.js\n\n\nclass FullScreen extends PDFObject {\n constructor(data) {\n super(data);\n this._backgroundColor = [];\n this._clickAdvances = true;\n this._cursor = Cursor.hidden;\n this._defaultTransition = \"\";\n this._escapeExits = true;\n this._isFullScreen = true;\n this._loop = false;\n this._timeDelay = 3600;\n this._usePageTiming = false;\n this._useTimer = false;\n }\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(_) {}\n get clickAdvances() {\n return this._clickAdvances;\n }\n set clickAdvances(_) {}\n get cursor() {\n return this._cursor;\n }\n set cursor(_) {}\n get defaultTransition() {\n return this._defaultTransition;\n }\n set defaultTransition(_) {}\n get escapeExits() {\n return this._escapeExits;\n }\n set escapeExits(_) {}\n get isFullScreen() {\n return this._isFullScreen;\n }\n set isFullScreen(_) {}\n get loop() {\n return this._loop;\n }\n set loop(_) {}\n get timeDelay() {\n return this._timeDelay;\n }\n set timeDelay(_) {}\n get transitions() {\n return [\"Replace\", \"WipeRight\", \"WipeLeft\", \"WipeDown\", \"WipeUp\", \"SplitHorizontalIn\", \"SplitHorizontalOut\", \"SplitVerticalIn\", \"SplitVerticalOut\", \"BlindsHorizontal\", \"BlindsVertical\", \"BoxIn\", \"BoxOut\", \"GlitterRight\", \"GlitterDown\", \"GlitterRightDown\", \"Dissolve\", \"Random\"];\n }\n set transitions(_) {\n throw new Error(\"fullscreen.transitions is read-only\");\n }\n get usePageTiming() {\n return this._usePageTiming;\n }\n set usePageTiming(_) {}\n get useTimer() {\n return this._useTimer;\n }\n set useTimer(_) {}\n}\n\n;// ./src/scripting_api/thermometer.js\n\nclass Thermometer extends PDFObject {\n constructor(data) {\n super(data);\n this._cancelled = false;\n this._duration = 100;\n this._text = \"\";\n this._value = 0;\n }\n get cancelled() {\n return this._cancelled;\n }\n set cancelled(_) {\n throw new Error(\"thermometer.cancelled is read-only\");\n }\n get duration() {\n return this._duration;\n }\n set duration(val) {\n this._duration = val;\n }\n get text() {\n return this._text;\n }\n set text(val) {\n this._text = val;\n }\n get value() {\n return this._value;\n }\n set value(val) {\n this._value = val;\n }\n begin() {}\n end() {}\n}\n\n;// ./src/scripting_api/app.js\n\n\n\n\n\n\nclass App extends PDFObject {\n constructor(data) {\n super(data);\n this._constants = null;\n this._focusRect = true;\n this._fs = null;\n this._language = App._getLanguage(data.language);\n this._openInPlace = false;\n this._platform = App._getPlatform(data.platform);\n this._runtimeHighlight = false;\n this._runtimeHighlightColor = [\"T\"];\n this._thermometer = null;\n this._toolbar = false;\n this._document = data._document;\n this._proxyHandler = data.proxyHandler;\n this._objects = Object.create(null);\n this._eventDispatcher = new EventDispatcher(this._document, data.calculationOrder, this._objects, data.externalCall);\n this._timeoutIds = new WeakMap();\n if (typeof FinalizationRegistry !== \"undefined\") {\n this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\n } else {\n this._timeoutIdsRegistry = null;\n }\n this._timeoutCallbackIds = new Map();\n this._timeoutCallbackId = USERACTIVATION_CALLBACKID + 1;\n this._globalEval = data.globalEval;\n this._externalCall = data.externalCall;\n }\n _dispatchEvent(pdfEvent) {\n this._eventDispatcher.dispatch(pdfEvent);\n }\n _registerTimeoutCallback(cExpr) {\n const id = this._timeoutCallbackId++;\n this._timeoutCallbackIds.set(id, cExpr);\n return id;\n }\n _unregisterTimeoutCallback(id) {\n this._timeoutCallbackIds.delete(id);\n }\n _evalCallback({\n callbackId,\n interval\n }) {\n if (callbackId === USERACTIVATION_CALLBACKID) {\n this._document.obj._userActivation = false;\n return;\n }\n const expr = this._timeoutCallbackIds.get(callbackId);\n if (!interval) {\n this._unregisterTimeoutCallback(callbackId);\n }\n if (expr) {\n this._globalEval(expr);\n }\n }\n _registerTimeout(callbackId, interval) {\n const timeout = Object.create(null);\n const id = {\n callbackId,\n interval\n };\n this._timeoutIds.set(timeout, id);\n this._timeoutIdsRegistry?.register(timeout, id);\n return timeout;\n }\n _unregisterTimeout(timeout) {\n this._timeoutIdsRegistry?.unregister(timeout);\n const data = this._timeoutIds.get(timeout);\n if (!data) {\n return;\n }\n this._timeoutIds.delete(timeout);\n this._cleanTimeout(data);\n }\n _cleanTimeout({\n callbackId,\n interval\n }) {\n this._unregisterTimeoutCallback(callbackId);\n if (interval) {\n this._externalCall(\"clearInterval\", [callbackId]);\n } else {\n this._externalCall(\"clearTimeout\", [callbackId]);\n }\n }\n static _getPlatform(platform) {\n if (typeof platform === \"string\") {\n platform = platform.toLowerCase();\n if (platform.includes(\"win\")) {\n return \"WIN\";\n } else if (platform.includes(\"mac\")) {\n return \"MAC\";\n }\n }\n return \"UNIX\";\n }\n static _getLanguage(language) {\n const [main, sub] = language.toLowerCase().split(/[-_]/);\n switch (main) {\n case \"zh\":\n if (sub === \"cn\" || sub === \"sg\") {\n return \"CHS\";\n }\n return \"CHT\";\n case \"da\":\n return \"DAN\";\n case \"de\":\n return \"DEU\";\n case \"es\":\n return \"ESP\";\n case \"fr\":\n return \"FRA\";\n case \"it\":\n return \"ITA\";\n case \"ko\":\n return \"KOR\";\n case \"ja\":\n return \"JPN\";\n case \"nl\":\n return \"NLD\";\n case \"no\":\n return \"NOR\";\n case \"pt\":\n if (sub === \"br\") {\n return \"PTB\";\n }\n return \"ENU\";\n case \"fi\":\n return \"SUO\";\n case \"SV\":\n return \"SVE\";\n default:\n return \"ENU\";\n }\n }\n get activeDocs() {\n return [this._document.wrapped];\n }\n set activeDocs(_) {\n throw new Error(\"app.activeDocs is read-only\");\n }\n get calculate() {\n return this._document.obj.calculate;\n }\n set calculate(calculate) {\n this._document.obj.calculate = calculate;\n }\n get constants() {\n if (!this._constants) {\n this._constants = Object.freeze({\n align: Object.freeze({\n left: 0,\n center: 1,\n right: 2,\n top: 3,\n bottom: 4\n })\n });\n }\n return this._constants;\n }\n set constants(_) {\n throw new Error(\"app.constants is read-only\");\n }\n get focusRect() {\n return this._focusRect;\n }\n set focusRect(val) {\n this._focusRect = val;\n }\n get formsVersion() {\n return FORMS_VERSION;\n }\n set formsVersion(_) {\n throw new Error(\"app.formsVersion is read-only\");\n }\n get fromPDFConverters() {\n return [];\n }\n set fromPDFConverters(_) {\n throw new Error(\"app.fromPDFConverters is read-only\");\n }\n get fs() {\n if (this._fs === null) {\n this._fs = new Proxy(new FullScreen({\n send: this._send\n }), this._proxyHandler);\n }\n return this._fs;\n }\n set fs(_) {\n throw new Error(\"app.fs is read-only\");\n }\n get language() {\n return this._language;\n }\n set language(_) {\n throw new Error(\"app.language is read-only\");\n }\n get media() {\n return undefined;\n }\n set media(_) {\n throw new Error(\"app.media is read-only\");\n }\n get monitors() {\n return [];\n }\n set monitors(_) {\n throw new Error(\"app.monitors is read-only\");\n }\n get numPlugins() {\n return 0;\n }\n set numPlugins(_) {\n throw new Error(\"app.numPlugins is read-only\");\n }\n get openInPlace() {\n return this._openInPlace;\n }\n set openInPlace(val) {\n this._openInPlace = val;\n }\n get platform() {\n return this._platform;\n }\n set platform(_) {\n throw new Error(\"app.platform is read-only\");\n }\n get plugins() {\n return [];\n }\n set plugins(_) {\n throw new Error(\"app.plugins is read-only\");\n }\n get printColorProfiles() {\n return [];\n }\n set printColorProfiles(_) {\n throw new Error(\"app.printColorProfiles is read-only\");\n }\n get printerNames() {\n return [];\n }\n set printerNames(_) {\n throw new Error(\"app.printerNames is read-only\");\n }\n get runtimeHighlight() {\n return this._runtimeHighlight;\n }\n set runtimeHighlight(val) {\n this._runtimeHighlight = val;\n }\n get runtimeHighlightColor() {\n return this._runtimeHighlightColor;\n }\n set runtimeHighlightColor(val) {\n if (Color._isValidColor(val)) {\n this._runtimeHighlightColor = val;\n }\n }\n get thermometer() {\n if (this._thermometer === null) {\n this._thermometer = new Proxy(new Thermometer({\n send: this._send\n }), this._proxyHandler);\n }\n return this._thermometer;\n }\n set thermometer(_) {\n throw new Error(\"app.thermometer is read-only\");\n }\n get toolbar() {\n return this._toolbar;\n }\n set toolbar(val) {\n this._toolbar = val;\n }\n get toolbarHorizontal() {\n return this.toolbar;\n }\n set toolbarHorizontal(value) {\n this.toolbar = value;\n }\n get toolbarVertical() {\n return this.toolbar;\n }\n set toolbarVertical(value) {\n this.toolbar = value;\n }\n get viewerType() {\n return VIEWER_TYPE;\n }\n set viewerType(_) {\n throw new Error(\"app.viewerType is read-only\");\n }\n get viewerVariation() {\n return VIEWER_VARIATION;\n }\n set viewerVariation(_) {\n throw new Error(\"app.viewerVariation is read-only\");\n }\n get viewerVersion() {\n return VIEWER_VERSION;\n }\n set viewerVersion(_) {\n throw new Error(\"app.viewerVersion is read-only\");\n }\n addMenuItem() {}\n addSubMenu() {}\n addToolButton() {}\n alert(cMsg, nIcon = 0, nType = 0, cTitle = \"PDF.js\", oDoc = null, oCheckbox = null) {\n if (!this._document.obj._userActivation) {\n return 0;\n }\n this._document.obj._userActivation = false;\n if (cMsg && typeof cMsg === \"object\") {\n nType = cMsg.nType;\n cMsg = cMsg.cMsg;\n }\n cMsg = (cMsg || \"\").toString();\n if (!cMsg) {\n return 0;\n }\n nType = typeof nType !== \"number\" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n if (nType >= 2) {\n return this._externalCall(\"confirm\", [cMsg]) ? 4 : 3;\n }\n this._externalCall(\"alert\", [cMsg]);\n return 1;\n }\n beep() {}\n beginPriv() {}\n browseForDoc() {}\n clearInterval(oInterval) {\n this._unregisterTimeout(oInterval);\n }\n clearTimeOut(oTime) {\n this._unregisterTimeout(oTime);\n }\n endPriv() {}\n execDialog() {}\n execMenuItem(item) {\n if (!this._document.obj._userActivation) {\n return;\n }\n this._document.obj._userActivation = false;\n switch (item) {\n case \"SaveAs\":\n if (this._document.obj._disableSaving) {\n return;\n }\n this._send({\n command: item\n });\n break;\n case \"FirstPage\":\n case \"LastPage\":\n case \"NextPage\":\n case \"PrevPage\":\n case \"ZoomViewIn\":\n case \"ZoomViewOut\":\n this._send({\n command: item\n });\n break;\n case \"FitPage\":\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case \"Print\":\n if (this._document.obj._disablePrinting) {\n return;\n }\n this._send({\n command: \"print\"\n });\n break;\n }\n }\n getNthPlugInName() {}\n getPath() {}\n goBack() {}\n goForward() {}\n hideMenuItem() {}\n hideToolbarButton() {}\n launchURL() {}\n listMenuItems() {}\n listToolbarButtons() {}\n loadPolicyFile() {}\n mailGetAddrs() {}\n mailMsg() {}\n newDoc() {}\n newCollection() {}\n newFDF() {}\n openDoc() {}\n openFDF() {}\n popUpMenu() {}\n popUpMenuEx() {}\n removeToolButton() {}\n response(cQuestion, cTitle = \"\", cDefault = \"\", bPassword = \"\", cLabel = \"\") {\n if (cQuestion && typeof cQuestion === \"object\") {\n cDefault = cQuestion.cDefault;\n cQuestion = cQuestion.cQuestion;\n }\n cQuestion = (cQuestion || \"\").toString();\n cDefault = (cDefault || \"\").toString();\n return this._externalCall(\"prompt\", [cQuestion, cDefault || \"\"]);\n }\n setInterval(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setInterval must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setInterval must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setInterval\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, true);\n }\n setTimeOut(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setTimeOut must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setTimeOut must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setTimeout\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, false);\n }\n trustedFunction() {}\n trustPropagatorFunction() {}\n}\n\n;// ./src/scripting_api/console.js\n\nclass Console extends PDFObject {\n clear() {\n this._send({\n id: \"clear\"\n });\n }\n hide() {}\n println(msg) {\n if (typeof msg === \"string\") {\n this._send({\n command: \"println\",\n value: \"PDF.js Console:: \" + msg\n });\n }\n }\n show() {}\n}\n\n;// ./src/scripting_api/print_params.js\nclass PrintParams {\n constructor(data) {\n this.binaryOk = true;\n this.bitmapDPI = 150;\n this.booklet = {\n binding: 0,\n duplexMode: 0,\n subsetFrom: 0,\n subsetTo: -1\n };\n this.colorOverride = 0;\n this.colorProfile = \"\";\n this.constants = Object.freeze({\n bookletBindings: Object.freeze({\n Left: 0,\n Right: 1,\n LeftTall: 2,\n RightTall: 3\n }),\n bookletDuplexMode: Object.freeze({\n BothSides: 0,\n FrontSideOnly: 1,\n BasicSideOnly: 2\n }),\n colorOverrides: Object.freeze({\n auto: 0,\n gray: 1,\n mono: 2\n }),\n fontPolicies: Object.freeze({\n everyPage: 0,\n jobStart: 1,\n pageRange: 2\n }),\n handling: Object.freeze({\n none: 0,\n fit: 1,\n shrink: 2,\n tileAll: 3,\n tileLarge: 4,\n nUp: 5,\n booklet: 6\n }),\n interactionLevel: Object.freeze({\n automatic: 0,\n full: 1,\n silent: 2\n }),\n nUpPageOrders: Object.freeze({\n Horizontal: 0,\n HorizontalReversed: 1,\n Vertical: 2\n }),\n printContents: Object.freeze({\n doc: 0,\n docAndComments: 1,\n formFieldsOnly: 2\n }),\n flagValues: Object.freeze({\n applyOverPrint: 1,\n applySoftProofSettings: 1 << 1,\n applyWorkingColorSpaces: 1 << 2,\n emitHalftones: 1 << 3,\n emitPostScriptXObjects: 1 << 4,\n emitFormsAsPSForms: 1 << 5,\n maxJP2KRes: 1 << 6,\n setPageSize: 1 << 7,\n suppressBG: 1 << 8,\n suppressCenter: 1 << 9,\n suppressCJKFontSubst: 1 << 10,\n suppressCropClip: 1 << 1,\n suppressRotate: 1 << 12,\n suppressTransfer: 1 << 13,\n suppressUCR: 1 << 14,\n useTrapAnnots: 1 << 15,\n usePrintersMarks: 1 << 16\n }),\n rasterFlagValues: Object.freeze({\n textToOutline: 1,\n strokesToOutline: 1 << 1,\n allowComplexClip: 1 << 2,\n preserveOverprint: 1 << 3\n }),\n subsets: Object.freeze({\n all: 0,\n even: 1,\n odd: 2\n }),\n tileMarks: Object.freeze({\n none: 0,\n west: 1,\n east: 2\n }),\n usages: Object.freeze({\n auto: 0,\n use: 1,\n noUse: 2\n })\n });\n this.downloadFarEastFonts = false;\n this.fileName = \"\";\n this.firstPage = 0;\n this.flags = 0;\n this.fontPolicy = 0;\n this.gradientDPI = 150;\n this.interactive = 1;\n this.lastPage = data.lastPage;\n this.npUpAutoRotate = false;\n this.npUpNumPagesH = 2;\n this.npUpNumPagesV = 2;\n this.npUpPageBorder = false;\n this.npUpPageOrder = 0;\n this.pageHandling = 0;\n this.pageSubset = 0;\n this.printAsImage = false;\n this.printContent = 0;\n this.printerName = \"\";\n this.psLevel = 0;\n this.rasterFlags = 0;\n this.reversePages = false;\n this.tileLabel = false;\n this.tileMark = 0;\n this.tileOverlap = 0;\n this.tileScale = 1.0;\n this.transparencyLevel = 75;\n this.usePrinterCRD = 0;\n this.useT1Conversion = 0;\n }\n}\n\n;// ./src/scripting_api/doc.js\n\n\n\n\n\nconst DOC_EXTERNAL = false;\nclass InfoProxyHandler {\n static get(obj, prop) {\n return obj[prop.toLowerCase()];\n }\n static set(obj, prop, value) {\n throw new Error(`doc.info.${prop} is read-only`);\n }\n}\nclass Doc extends PDFObject {\n constructor(data) {\n super(data);\n this._expandos = globalThis;\n this._baseURL = data.baseURL || \"\";\n this._calculate = true;\n this._delay = false;\n this._dirty = false;\n this._disclosed = false;\n this._media = undefined;\n this._metadata = data.metadata || \"\";\n this._noautocomplete = undefined;\n this._nocache = undefined;\n this._spellDictionaryOrder = [];\n this._spellLanguageOrder = [];\n this._printParams = null;\n this._fields = new Map();\n this._fieldNames = [];\n this._event = null;\n this._author = data.Author || \"\";\n this._creator = data.Creator || \"\";\n this._creationDate = this._getDate(data.CreationDate) || null;\n this._docID = data.docID || [\"\", \"\"];\n this._documentFileName = data.filename || \"\";\n this._filesize = data.filesize || 0;\n this._keywords = data.Keywords || \"\";\n this._layout = data.layout || \"\";\n this._modDate = this._getDate(data.ModDate) || null;\n this._numFields = 0;\n this._numPages = data.numPages || 1;\n this._pageNum = data.pageNum || 0;\n this._producer = data.Producer || \"\";\n this._securityHandler = data.EncryptFilterName || null;\n this._subject = data.Subject || \"\";\n this._title = data.Title || \"\";\n this._URL = data.URL || \"\";\n this._info = new Proxy({\n title: this._title,\n author: this._author,\n authors: data.authors || [this._author],\n subject: this._subject,\n keywords: this._keywords,\n creator: this._creator,\n producer: this._producer,\n creationdate: this._creationDate,\n moddate: this._modDate,\n trapped: data.Trapped || \"Unknown\"\n }, InfoProxyHandler);\n this._zoomType = ZoomType.none;\n this._zoom = data.zoom || 100;\n this._actions = createActionsMap(data.actions);\n this._globalEval = data.globalEval;\n this._pageActions = null;\n this._userActivation = false;\n this._disablePrinting = false;\n this._disableSaving = false;\n this._otherPageActions = null;\n }\n _initActions() {\n const dontRun = new Set([\"WillClose\", \"WillSave\", \"DidSave\", \"WillPrint\", \"DidPrint\", \"OpenAction\"]);\n this._disableSaving = true;\n for (const actionName of this._actions.keys()) {\n if (!dontRun.has(actionName)) {\n this._runActions(actionName);\n }\n }\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n }\n _dispatchDocEvent(name) {\n switch (name) {\n case \"Open\":\n this._disableSaving = true;\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n break;\n case \"WillPrint\":\n this._disablePrinting = true;\n try {\n this._runActions(name);\n } catch (error) {\n this._send(serializeError(error));\n }\n this._send({\n command: \"WillPrintFinished\"\n });\n this._disablePrinting = false;\n break;\n case \"WillSave\":\n this._disableSaving = true;\n this._runActions(name);\n this._disableSaving = false;\n break;\n default:\n this._runActions(name);\n }\n }\n _dispatchPageEvent(name, actions, pageNumber) {\n if (name === \"PageOpen\") {\n this._pageActions ||= new Map();\n if (!this._pageActions.has(pageNumber)) {\n this._pageActions.set(pageNumber, createActionsMap(actions));\n }\n this._pageNum = pageNumber - 1;\n }\n for (const acts of [this._pageActions, this._otherPageActions]) {\n actions = acts?.get(pageNumber)?.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n }\n _runActions(name) {\n const actions = this._actions.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n _addField(name, field) {\n this._fields.set(name, field);\n this._fieldNames.push(name);\n this._numFields++;\n const po = field.obj._actions.get(\"PageOpen\");\n const pc = field.obj._actions.get(\"PageClose\");\n if (po || pc) {\n this._otherPageActions ||= new Map();\n let actions = this._otherPageActions.get(field.obj._page + 1);\n if (!actions) {\n actions = new Map();\n this._otherPageActions.set(field.obj._page + 1, actions);\n }\n if (po) {\n let poActions = actions.get(\"PageOpen\");\n if (!poActions) {\n poActions = [];\n actions.set(\"PageOpen\", poActions);\n }\n poActions.push(...po);\n }\n if (pc) {\n let pcActions = actions.get(\"PageClose\");\n if (!pcActions) {\n pcActions = [];\n actions.set(\"PageClose\", pcActions);\n }\n pcActions.push(...pc);\n }\n }\n }\n _getDate(date) {\n if (!date || date.length < 15 || !date.startsWith(\"D:\")) {\n return date;\n }\n date = date.substring(2);\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n const hour = date.substring(8, 10);\n const minute = date.substring(10, 12);\n const o = date.charAt(12);\n let second, offsetPos;\n if (o === \"Z\" || o === \"+\" || o === \"-\") {\n second = \"00\";\n offsetPos = 12;\n } else {\n second = date.substring(12, 14);\n offsetPos = 14;\n }\n const offset = date.substring(offsetPos).replaceAll(\"'\", \"\");\n return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n }\n get author() {\n return this._author;\n }\n set author(_) {\n throw new Error(\"doc.author is read-only\");\n }\n get baseURL() {\n return this._baseURL;\n }\n set baseURL(baseURL) {\n this._baseURL = baseURL;\n }\n get bookmarkRoot() {\n return undefined;\n }\n set bookmarkRoot(_) {\n throw new Error(\"doc.bookmarkRoot is read-only\");\n }\n get calculate() {\n return this._calculate;\n }\n set calculate(calculate) {\n this._calculate = calculate;\n }\n get creator() {\n return this._creator;\n }\n set creator(_) {\n throw new Error(\"doc.creator is read-only\");\n }\n get dataObjects() {\n return [];\n }\n set dataObjects(_) {\n throw new Error(\"doc.dataObjects is read-only\");\n }\n get delay() {\n return this._delay;\n }\n set delay(delay) {\n this._delay = delay;\n }\n get dirty() {\n return this._dirty;\n }\n set dirty(dirty) {\n this._dirty = dirty;\n }\n get disclosed() {\n return this._disclosed;\n }\n set disclosed(disclosed) {\n this._disclosed = disclosed;\n }\n get docID() {\n return this._docID;\n }\n set docID(_) {\n throw new Error(\"doc.docID is read-only\");\n }\n get documentFileName() {\n return this._documentFileName;\n }\n set documentFileName(_) {\n throw new Error(\"doc.documentFileName is read-only\");\n }\n get dynamicXFAForm() {\n return false;\n }\n set dynamicXFAForm(_) {\n throw new Error(\"doc.dynamicXFAForm is read-only\");\n }\n get external() {\n return DOC_EXTERNAL;\n }\n set external(_) {\n throw new Error(\"doc.external is read-only\");\n }\n get filesize() {\n return this._filesize;\n }\n set filesize(_) {\n throw new Error(\"doc.filesize is read-only\");\n }\n get hidden() {\n return false;\n }\n set hidden(_) {\n throw new Error(\"doc.hidden is read-only\");\n }\n get hostContainer() {\n return undefined;\n }\n set hostContainer(_) {\n throw new Error(\"doc.hostContainer is read-only\");\n }\n get icons() {\n return undefined;\n }\n set icons(_) {\n throw new Error(\"doc.icons is read-only\");\n }\n get info() {\n return this._info;\n }\n set info(_) {\n throw new Error(\"doc.info is read-only\");\n }\n get innerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerAppWindowRect(_) {\n throw new Error(\"doc.innerAppWindowRect is read-only\");\n }\n get innerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerDocWindowRect(_) {\n throw new Error(\"doc.innerDocWindowRect is read-only\");\n }\n get isModal() {\n return false;\n }\n set isModal(_) {\n throw new Error(\"doc.isModal is read-only\");\n }\n get keywords() {\n return this._keywords;\n }\n set keywords(_) {\n throw new Error(\"doc.keywords is read-only\");\n }\n get layout() {\n return this._layout;\n }\n set layout(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"string\") {\n return;\n }\n if (value !== \"SinglePage\" && value !== \"OneColumn\" && value !== \"TwoColumnLeft\" && value !== \"TwoPageLeft\" && value !== \"TwoColumnRight\" && value !== \"TwoPageRight\") {\n value = \"SinglePage\";\n }\n this._send({\n command: \"layout\",\n value\n });\n this._layout = value;\n }\n get media() {\n return this._media;\n }\n set media(media) {\n this._media = media;\n }\n get metadata() {\n return this._metadata;\n }\n set metadata(metadata) {\n this._metadata = metadata;\n }\n get modDate() {\n return this._modDate;\n }\n set modDate(_) {\n throw new Error(\"doc.modDate is read-only\");\n }\n get mouseX() {\n return 0;\n }\n set mouseX(_) {\n throw new Error(\"doc.mouseX is read-only\");\n }\n get mouseY() {\n return 0;\n }\n set mouseY(_) {\n throw new Error(\"doc.mouseY is read-only\");\n }\n get noautocomplete() {\n return this._noautocomplete;\n }\n set noautocomplete(noautocomplete) {\n this._noautocomplete = noautocomplete;\n }\n get nocache() {\n return this._nocache;\n }\n set nocache(nocache) {\n this._nocache = nocache;\n }\n get numFields() {\n return this._numFields;\n }\n set numFields(_) {\n throw new Error(\"doc.numFields is read-only\");\n }\n get numPages() {\n return this._numPages;\n }\n set numPages(_) {\n throw new Error(\"doc.numPages is read-only\");\n }\n get numTemplates() {\n return 0;\n }\n set numTemplates(_) {\n throw new Error(\"doc.numTemplates is read-only\");\n }\n get outerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerAppWindowRect(_) {\n throw new Error(\"doc.outerAppWindowRect is read-only\");\n }\n get outerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerDocWindowRect(_) {\n throw new Error(\"doc.outerDocWindowRect is read-only\");\n }\n get pageNum() {\n return this._pageNum;\n }\n set pageNum(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 0 || value >= this._numPages) {\n return;\n }\n this._send({\n command: \"page-num\",\n value\n });\n this._pageNum = value;\n }\n get pageWindowRect() {\n return [0, 0, 0, 0];\n }\n set pageWindowRect(_) {\n throw new Error(\"doc.pageWindowRect is read-only\");\n }\n get path() {\n return \"\";\n }\n set path(_) {\n throw new Error(\"doc.path is read-only\");\n }\n get permStatusReady() {\n return true;\n }\n set permStatusReady(_) {\n throw new Error(\"doc.permStatusReady is read-only\");\n }\n get producer() {\n return this._producer;\n }\n set producer(_) {\n throw new Error(\"doc.producer is read-only\");\n }\n get requiresFullSave() {\n return false;\n }\n set requiresFullSave(_) {\n throw new Error(\"doc.requiresFullSave is read-only\");\n }\n get securityHandler() {\n return this._securityHandler;\n }\n set securityHandler(_) {\n throw new Error(\"doc.securityHandler is read-only\");\n }\n get selectedAnnots() {\n return [];\n }\n set selectedAnnots(_) {\n throw new Error(\"doc.selectedAnnots is read-only\");\n }\n get sounds() {\n return [];\n }\n set sounds(_) {\n throw new Error(\"doc.sounds is read-only\");\n }\n get spellDictionaryOrder() {\n return this._spellDictionaryOrder;\n }\n set spellDictionaryOrder(spellDictionaryOrder) {\n this._spellDictionaryOrder = spellDictionaryOrder;\n }\n get spellLanguageOrder() {\n return this._spellLanguageOrder;\n }\n set spellLanguageOrder(spellLanguageOrder) {\n this._spellLanguageOrder = spellLanguageOrder;\n }\n get subject() {\n return this._subject;\n }\n set subject(_) {\n throw new Error(\"doc.subject is read-only\");\n }\n get templates() {\n return [];\n }\n set templates(_) {\n throw new Error(\"doc.templates is read-only\");\n }\n get title() {\n return this._title;\n }\n set title(_) {\n throw new Error(\"doc.title is read-only\");\n }\n get URL() {\n return this._URL;\n }\n set URL(_) {\n throw new Error(\"doc.URL is read-only\");\n }\n get viewState() {\n return undefined;\n }\n set viewState(_) {\n throw new Error(\"doc.viewState is read-only\");\n }\n get xfa() {\n return this._xfa;\n }\n set xfa(_) {\n throw new Error(\"doc.xfa is read-only\");\n }\n get XFAForeground() {\n return false;\n }\n set XFAForeground(_) {\n throw new Error(\"doc.XFAForeground is read-only\");\n }\n get zoomType() {\n return this._zoomType;\n }\n set zoomType(type) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof type !== \"string\") {\n return;\n }\n switch (type) {\n case ZoomType.none:\n this._send({\n command: \"zoom\",\n value: 1\n });\n break;\n case ZoomType.fitP:\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case ZoomType.fitW:\n this._send({\n command: \"zoom\",\n value: \"page-width\"\n });\n break;\n case ZoomType.fitH:\n this._send({\n command: \"zoom\",\n value: \"page-height\"\n });\n break;\n case ZoomType.fitV:\n this._send({\n command: \"zoom\",\n value: \"auto\"\n });\n break;\n case ZoomType.pref:\n case ZoomType.refW:\n break;\n default:\n return;\n }\n this._zoomType = type;\n }\n get zoom() {\n return this._zoom;\n }\n set zoom(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 8.33 || value > 6400) {\n return;\n }\n this._send({\n command: \"zoom\",\n value: value / 100\n });\n }\n addAnnot() {}\n addField() {}\n addIcon() {}\n addLink() {}\n addRecipientListCryptFilter() {}\n addRequirement() {}\n addScript() {}\n addThumbnails() {}\n addWatermarkFromFile() {}\n addWatermarkFromText() {}\n addWeblinks() {}\n bringToFront() {}\n calculateNow() {\n this._eventDispatcher.calculateNow();\n }\n closeDoc() {}\n colorConvertPage() {}\n createDataObject() {}\n createTemplate() {}\n deletePages() {}\n deleteSound() {}\n embedDocAsDataObject() {}\n embedOutputIntent() {}\n encryptForRecipients() {}\n encryptUsingPolicy() {}\n exportAsFDF() {}\n exportAsFDFStr() {}\n exportAsText() {}\n exportAsXFDF() {}\n exportAsXFDFStr() {}\n exportDataObject() {}\n exportXFAData() {}\n extractPages() {}\n flattenPages() {}\n getAnnot() {}\n getAnnots() {}\n getAnnot3D() {}\n getAnnots3D() {}\n getColorConvertAction() {}\n getDataObject() {}\n getDataObjectContents() {}\n _getField(cName) {\n if (cName && typeof cName === \"object\") {\n cName = cName.cName;\n }\n if (typeof cName !== \"string\") {\n throw new TypeError(\"Invalid field name: must be a string\");\n }\n const searchedField = this._fields.get(cName);\n if (searchedField) {\n return searchedField;\n }\n const parts = cName.split(\"#\");\n let childIndex = NaN;\n if (parts.length === 2) {\n childIndex = Math.floor(parseFloat(parts[1]));\n cName = parts[0];\n }\n for (const [name, field] of this._fields.entries()) {\n if (name.endsWith(cName)) {\n if (!isNaN(childIndex)) {\n const children = this._getChildren(name);\n if (childIndex < 0 || childIndex >= children.length) {\n childIndex = 0;\n }\n if (childIndex < children.length) {\n this._fields.set(cName, children[childIndex]);\n return children[childIndex];\n }\n }\n this._fields.set(cName, field);\n return field;\n }\n }\n return null;\n }\n getField(cName) {\n const field = this._getField(cName);\n if (!field) {\n return null;\n }\n return field.wrapped;\n }\n _getChildren(fieldName) {\n const len = fieldName.length;\n const children = [];\n const pattern = /^\\.[^.]+$/;\n for (const [name, field] of this._fields.entries()) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (pattern.test(finalPart)) {\n children.push(field);\n }\n }\n }\n return children;\n }\n _getTerminalChildren(fieldName) {\n const children = [];\n const len = fieldName.length;\n for (const [name, field] of this._fields.entries()) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (field.obj._hasValue && (finalPart === \"\" || finalPart.startsWith(\".\"))) {\n children.push(field.wrapped);\n }\n }\n }\n return children;\n }\n getIcon() {}\n getLegalWarnings() {}\n getLinks() {}\n getNthFieldName(nIndex) {\n if (nIndex && typeof nIndex === \"object\") {\n nIndex = nIndex.nIndex;\n }\n if (typeof nIndex !== \"number\") {\n throw new TypeError(\"Invalid field index: must be a number\");\n }\n if (0 <= nIndex && nIndex < this.numFields) {\n return this._fieldNames[Math.trunc(nIndex)];\n }\n return null;\n }\n getNthTemplate() {\n return null;\n }\n getOCGs() {}\n getOCGOrder() {}\n getPageBox() {}\n getPageLabel() {}\n getPageNthWord() {}\n getPageNthWordQuads() {}\n getPageNumWords() {}\n getPageRotation() {}\n getPageTransition() {}\n getPrintParams() {\n return this._printParams ||= new PrintParams({\n lastPage: this._numPages - 1\n });\n }\n getSound() {}\n getTemplate() {}\n getURL() {}\n gotoNamedDest() {}\n importAnFDF() {}\n importAnXFDF() {}\n importDataObject() {}\n importIcon() {}\n importSound() {}\n importTextData() {}\n importXFAData() {}\n insertPages() {}\n mailDoc() {}\n mailForm() {}\n movePage() {}\n newPage() {}\n openDataObject() {}\n print(bUI = true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = false, bAnnotations = true, printParams = null) {\n if (this._disablePrinting || !this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (bUI && typeof bUI === \"object\") {\n nStart = bUI.nStart;\n nEnd = bUI.nEnd;\n bSilent = bUI.bSilent;\n bShrinkToFit = bUI.bShrinkToFit;\n bPrintAsImage = bUI.bPrintAsImage;\n bReverse = bUI.bReverse;\n bAnnotations = bUI.bAnnotations;\n printParams = bUI.printParams;\n bUI = bUI.bUI;\n }\n if (printParams) {\n nStart = printParams.firstPage;\n nEnd = printParams.lastPage;\n }\n nStart = typeof nStart === \"number\" ? Math.max(0, Math.trunc(nStart)) : 0;\n nEnd = typeof nEnd === \"number\" ? Math.max(0, Math.trunc(nEnd)) : -1;\n this._send({\n command: \"print\",\n start: nStart,\n end: nEnd\n });\n }\n removeDataObject() {}\n removeField() {}\n removeIcon() {}\n removeLinks() {}\n removeRequirement() {}\n removeScript() {}\n removeTemplate() {}\n removeThumbnails() {}\n removeWeblinks() {}\n replacePages() {}\n resetForm(aFields = null) {\n if (aFields && typeof aFields === \"object\" && !Array.isArray(aFields)) {\n aFields = aFields.aFields;\n }\n if (aFields && !Array.isArray(aFields)) {\n aFields = [aFields];\n }\n let mustCalculate = false;\n let fieldsToReset;\n if (aFields) {\n fieldsToReset = [];\n for (const fieldName of aFields) {\n if (!fieldName) {\n continue;\n }\n if (typeof fieldName !== \"string\") {\n fieldsToReset = null;\n break;\n }\n const field = this._getField(fieldName);\n if (!field) {\n continue;\n }\n fieldsToReset.push(field);\n mustCalculate = true;\n }\n }\n if (!fieldsToReset) {\n fieldsToReset = this._fields.values();\n mustCalculate = this._fields.size !== 0;\n }\n for (const field of fieldsToReset) {\n field.obj.value = field.obj.defaultValue;\n this._send({\n id: field.obj._id,\n siblings: field.obj._siblings,\n value: field.obj.defaultValue,\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n if (mustCalculate) {\n this.calculateNow();\n }\n }\n saveAs() {}\n scroll() {}\n selectPageNthWord() {}\n setAction() {}\n setDataObjectContents() {}\n setOCGOrder() {}\n setPageAction() {}\n setPageBoxes() {}\n setPageLabels() {}\n setPageRotations() {}\n setPageTabOrder() {}\n setPageTransitions() {}\n spawnPageFromTemplate() {}\n submitForm() {}\n syncAnnotScan() {}\n}\n\n;// ./src/scripting_api/proxy.js\nclass ProxyHandler {\n constructor() {\n this.nosend = new Set([\"delay\"]);\n }\n get(obj, prop) {\n if (prop in obj._expandos) {\n const val = obj._expandos[prop];\n if (typeof val === \"function\") {\n return val.bind(obj);\n }\n return val;\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const val = obj[prop];\n if (typeof val === \"function\") {\n return val.bind(obj);\n }\n return val;\n }\n return undefined;\n }\n set(obj, prop, value) {\n if (obj._kidIds) {\n obj._kidIds.forEach(id => {\n obj._appObjects[id].wrapped[prop] = value;\n });\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const old = obj[prop];\n obj[prop] = value;\n if (!this.nosend.has(prop) && obj._send && obj._id !== null && typeof old !== \"function\") {\n const data = {\n id: obj._id\n };\n data[prop] = prop === \"value\" ? obj._getValue() : obj[prop];\n if (!obj._siblings) {\n obj._send(data);\n } else {\n data.siblings = obj._siblings;\n obj._send(data);\n }\n }\n } else {\n obj._expandos[prop] = value;\n }\n return true;\n }\n has(obj, prop) {\n return prop in obj._expandos || typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj;\n }\n getPrototypeOf(obj) {\n return null;\n }\n setPrototypeOf(obj, proto) {\n return false;\n }\n isExtensible(obj) {\n return true;\n }\n preventExtensions(obj) {\n return false;\n }\n getOwnPropertyDescriptor(obj, prop) {\n if (prop in obj._expandos) {\n return {\n configurable: true,\n enumerable: true,\n value: obj._expandos[prop]\n };\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n return {\n configurable: true,\n enumerable: true,\n value: obj[prop]\n };\n }\n return undefined;\n }\n defineProperty(obj, key, descriptor) {\n Object.defineProperty(obj._expandos, key, descriptor);\n return true;\n }\n deleteProperty(obj, prop) {\n if (prop in obj._expandos) {\n delete obj._expandos[prop];\n }\n }\n ownKeys(obj) {\n const fromExpandos = Reflect.ownKeys(obj._expandos);\n const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith(\"_\"));\n return fromExpandos.concat(fromObj);\n }\n}\n\n;// ./src/scripting_api/util.js\n\nclass Util extends PDFObject {\n #dateActionsCache = null;\n constructor(data) {\n super(data);\n this._scandCache = new Map();\n this._months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n this._days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n this.MILLISECONDS_IN_DAY = 86400000;\n this.MILLISECONDS_IN_WEEK = 604800000;\n this._externalCall = data.externalCall;\n }\n printf(...args) {\n if (args.length === 0) {\n throw new Error(\"Invalid number of params in printf\");\n }\n if (typeof args[0] !== \"string\") {\n throw new TypeError(\"First argument of printf must be a string\");\n }\n const pattern = /%(,[0-4])?([+ 0#]+)?(\\d+)?(\\.\\d+)?(.)/g;\n const PLUS = 1;\n const SPACE = 2;\n const ZERO = 4;\n const HASH = 8;\n let i = 0;\n return args[0].replaceAll(pattern, function (match, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\n if (cConvChar !== \"d\" && cConvChar !== \"f\" && cConvChar !== \"s\" && cConvChar !== \"x\") {\n const buf = [\"%\"];\n for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\n if (str) {\n buf.push(str);\n }\n }\n return buf.join(\"\");\n }\n i++;\n if (i === args.length) {\n throw new Error(\"Not enough arguments in printf\");\n }\n const arg = args[i];\n if (cConvChar === \"s\") {\n return arg.toString();\n }\n let flags = 0;\n if (cFlags) {\n for (const flag of cFlags) {\n switch (flag) {\n case \"+\":\n flags |= PLUS;\n break;\n case \" \":\n flags |= SPACE;\n break;\n case \"0\":\n flags |= ZERO;\n break;\n case \"#\":\n flags |= HASH;\n break;\n }\n }\n }\n cFlags = flags;\n if (nWidth) {\n nWidth = parseInt(nWidth);\n }\n let intPart = Math.trunc(arg);\n if (cConvChar === \"x\") {\n let hex = Math.abs(intPart).toString(16).toUpperCase();\n if (nWidth !== undefined) {\n hex = hex.padStart(nWidth, cFlags & ZERO ? \"0\" : \" \");\n }\n if (cFlags & HASH) {\n hex = `0x${hex}`;\n }\n return hex;\n }\n if (nPrecision) {\n nPrecision = parseInt(nPrecision.substring(1));\n }\n nDecSep = nDecSep ? nDecSep.substring(1) : \"0\";\n const separators = {\n 0: [\",\", \".\"],\n 1: [\"\", \".\"],\n 2: [\".\", \",\"],\n 3: [\"\", \",\"],\n 4: [\"'\", \".\"]\n };\n const [thousandSep, decimalSep] = separators[nDecSep];\n let decPart = \"\";\n if (cConvChar === \"f\") {\n decPart = nPrecision !== undefined ? Math.abs(arg - intPart).toFixed(nPrecision) : Math.abs(arg - intPart).toString();\n if (decPart.length > 2) {\n if (/^1\\.0+$/.test(decPart)) {\n intPart += Math.sign(arg);\n decPart = `${decimalSep}${decPart.split(\".\")[1]}`;\n } else {\n decPart = `${decimalSep}${decPart.substring(2)}`;\n }\n } else {\n if (decPart === \"1\") {\n intPart += Math.sign(arg);\n }\n decPart = cFlags & HASH ? \".\" : \"\";\n }\n }\n let sign = \"\";\n if (intPart < 0) {\n sign = \"-\";\n intPart = -intPart;\n } else if (cFlags & PLUS) {\n sign = \"+\";\n } else if (cFlags & SPACE) {\n sign = \" \";\n }\n if (thousandSep && intPart >= 1000) {\n const buf = [];\n while (true) {\n buf.push((intPart % 1000).toString().padStart(3, \"0\"));\n intPart = Math.trunc(intPart / 1000);\n if (intPart < 1000) {\n buf.push(intPart.toString());\n break;\n }\n }\n intPart = buf.reverse().join(thousandSep);\n } else {\n intPart = intPart.toString();\n }\n let n = `${intPart}${decPart}`;\n if (nWidth !== undefined) {\n n = n.padStart(nWidth - sign.length, cFlags & ZERO ? \"0\" : \" \");\n }\n return `${sign}${n}`;\n });\n }\n iconStreamFromIcon() {}\n printd(cFormat, oDate) {\n switch (cFormat) {\n case 0:\n return this.printd(\"D:yyyymmddHHMMss\", oDate);\n case 1:\n return this.printd(\"yyyy.mm.dd HH:MM:ss\", oDate);\n case 2:\n return this.printd(\"m/d/yy h:MM:ss tt\", oDate);\n }\n const handlers = {\n mmmm: data => this._months[data.month],\n mmm: data => this._months[data.month].substring(0, 3),\n mm: data => (data.month + 1).toString().padStart(2, \"0\"),\n m: data => (data.month + 1).toString(),\n dddd: data => this._days[data.dayOfWeek],\n ddd: data => this._days[data.dayOfWeek].substring(0, 3),\n dd: data => data.day.toString().padStart(2, \"0\"),\n d: data => data.day.toString(),\n yyyy: data => data.year.toString(),\n yy: data => (data.year % 100).toString().padStart(2, \"0\"),\n HH: data => data.hours.toString().padStart(2, \"0\"),\n H: data => data.hours.toString(),\n hh: data => (1 + (data.hours + 11) % 12).toString().padStart(2, \"0\"),\n h: data => (1 + (data.hours + 11) % 12).toString(),\n MM: data => data.minutes.toString().padStart(2, \"0\"),\n M: data => data.minutes.toString(),\n ss: data => data.seconds.toString().padStart(2, \"0\"),\n s: data => data.seconds.toString(),\n tt: data => data.hours < 12 ? \"am\" : \"pm\",\n t: data => data.hours < 12 ? \"a\" : \"p\"\n };\n const data = {\n year: oDate.getFullYear(),\n month: oDate.getMonth(),\n day: oDate.getDate(),\n dayOfWeek: oDate.getDay(),\n hours: oDate.getHours(),\n minutes: oDate.getMinutes(),\n seconds: oDate.getSeconds()\n };\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n return cFormat.replaceAll(patterns, function (match, pattern) {\n if (pattern in handlers) {\n return handlers[pattern](data);\n }\n return pattern.charCodeAt(1);\n });\n }\n printx(cFormat, cSource) {\n cSource = (cSource ?? \"\").toString();\n const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n const buf = [];\n let i = 0;\n const ii = cSource.length;\n let currCase = handlers[0];\n let escaped = false;\n for (const command of cFormat) {\n if (escaped) {\n buf.push(command);\n escaped = false;\n continue;\n }\n if (i >= ii) {\n break;\n }\n switch (command) {\n case \"?\":\n buf.push(currCase(cSource.charAt(i++)));\n break;\n case \"X\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"A\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"9\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"0\" <= char && char <= \"9\") {\n buf.push(char);\n break;\n }\n }\n break;\n case \"*\":\n while (i < ii) {\n buf.push(currCase(cSource.charAt(i++)));\n }\n break;\n case \"\\\\\":\n escaped = true;\n break;\n case \">\":\n currCase = handlers[1];\n break;\n case \"<\":\n currCase = handlers[2];\n break;\n case \"=\":\n currCase = handlers[0];\n break;\n default:\n buf.push(command);\n }\n }\n return buf.join(\"\");\n }\n #tryToGuessDate(cFormat, cDate) {\n let actions = (this.#dateActionsCache ||= new Map()).get(cFormat);\n if (!actions) {\n actions = [];\n this.#dateActionsCache.set(cFormat, actions);\n cFormat.replaceAll(/(d+)|(m+)|(y+)|(H+)|(M+)|(s+)/g, function (_match, d, m, y, H, M, s) {\n if (d) {\n actions.push((n, data) => {\n if (n >= 1 && n <= 31) {\n data.day = n;\n return true;\n }\n return false;\n });\n } else if (m) {\n actions.push((n, data) => {\n if (n >= 1 && n <= 12) {\n data.month = n - 1;\n return true;\n }\n return false;\n });\n } else if (y) {\n actions.push((n, data) => {\n if (n < 50) {\n n += 2000;\n } else if (n < 100) {\n n += 1900;\n }\n data.year = n;\n return true;\n });\n } else if (H) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 23) {\n data.hours = n;\n return true;\n }\n return false;\n });\n } else if (M) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 59) {\n data.minutes = n;\n return true;\n }\n return false;\n });\n } else if (s) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 59) {\n data.seconds = n;\n return true;\n }\n return false;\n });\n }\n return \"\";\n });\n }\n const number = /\\d+/g;\n let i = 0;\n let array;\n const data = {\n year: new Date().getFullYear(),\n month: 0,\n day: 1,\n hours: 12,\n minutes: 0,\n seconds: 0\n };\n while ((array = number.exec(cDate)) !== null) {\n if (i < actions.length) {\n if (!actions[i++](parseInt(array[0]), data)) {\n return null;\n }\n } else {\n break;\n }\n }\n if (i === 0) {\n return null;\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n scand(cFormat, cDate) {\n return this._scand(cFormat, cDate);\n }\n _scand(cFormat, cDate, strict = false) {\n if (typeof cDate !== \"string\") {\n return new Date(cDate);\n }\n if (cDate === \"\") {\n return new Date();\n }\n switch (cFormat) {\n case 0:\n return this.scand(\"D:yyyymmddHHMMss\", cDate);\n case 1:\n return this.scand(\"yyyy.mm.dd HH:MM:ss\", cDate);\n case 2:\n return this.scand(\"m/d/yy h:MM:ss tt\", cDate);\n }\n if (!this._scandCache.has(cFormat)) {\n const months = this._months;\n const days = this._days;\n const handlers = {\n mmmm: {\n pattern: `(${months.join(\"|\")})`,\n action: (value, data) => {\n data.month = months.indexOf(value);\n }\n },\n mmm: {\n pattern: `(${months.map(month => month.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.month = months.findIndex(month => month.substring(0, 3) === value);\n }\n },\n mm: {\n pattern: `(\\\\d{2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n m: {\n pattern: `(\\\\d{1,2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n dddd: {\n pattern: `(${days.join(\"|\")})`,\n action: (value, data) => {\n data.day = days.indexOf(value);\n }\n },\n ddd: {\n pattern: `(${days.map(day => day.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.day = days.findIndex(day => day.substring(0, 3) === value);\n }\n },\n dd: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n d: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n yyyy: {\n pattern: \"(\\\\d{4})\",\n action: (value, data) => {\n data.year = parseInt(value);\n }\n },\n yy: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.year = 2000 + parseInt(value);\n }\n },\n HH: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n H: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n hh: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n h: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n MM: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n M: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n ss: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n s: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n tt: {\n pattern: \"([aApP][mM])\",\n action: (value, data) => {\n const char = value.charAt(0);\n data.am = char === \"a\" || char === \"A\";\n }\n },\n t: {\n pattern: \"([aApP])\",\n action: (value, data) => {\n data.am = value === \"a\" || value === \"A\";\n }\n }\n };\n const escapedFormat = cFormat.replaceAll(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n const actions = [];\n const re = escapedFormat.replaceAll(patterns, function (match, patternElement) {\n const {\n pattern,\n action\n } = handlers[patternElement];\n actions.push(action);\n return pattern;\n });\n this._scandCache.set(cFormat, [re, actions]);\n }\n const [re, actions] = this._scandCache.get(cFormat);\n const matches = new RegExp(`^${re}$`, \"g\").exec(cDate);\n if (!matches || matches.length !== actions.length + 1) {\n return strict ? null : this.#tryToGuessDate(cFormat, cDate);\n }\n const data = {\n year: new Date().getFullYear(),\n month: 0,\n day: 1,\n hours: 12,\n minutes: 0,\n seconds: 0,\n am: null\n };\n actions.forEach((action, i) => action(matches[i + 1], data));\n if (data.am !== null) {\n data.hours = data.hours % 12 + (data.am ? 0 : 12);\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n spansToXML() {}\n stringFromStream() {}\n xmlToSpans() {}\n}\n\n;// ./src/scripting_api/initialization.js\n\n\n\n\n\n\n\n\n\n\nfunction initSandbox(params) {\n delete globalThis.pdfjsScripting;\n const externalCall = globalThis.callExternalFunction;\n delete globalThis.callExternalFunction;\n const globalEval = code => globalThis.eval(code);\n const send = data => externalCall(\"send\", [data]);\n const proxyHandler = new ProxyHandler();\n const {\n data\n } = params;\n const doc = new Doc({\n send,\n globalEval,\n ...data.docInfo\n });\n const _document = {\n obj: doc,\n wrapped: new Proxy(doc, proxyHandler)\n };\n const app = new App({\n send,\n globalEval,\n externalCall,\n _document,\n calculationOrder: data.calculationOrder,\n proxyHandler,\n ...data.appInfo\n });\n const util = new Util({\n externalCall\n });\n const appObjects = app._objects;\n if (data.objects) {\n const annotations = [];\n for (const [name, objs] of Object.entries(data.objects)) {\n annotations.length = 0;\n let container = null;\n for (const obj of objs) {\n if (obj.type !== \"\") {\n annotations.push(obj);\n } else {\n container = obj;\n }\n }\n let obj = container;\n if (annotations.length > 0) {\n obj = annotations[0];\n obj.send = send;\n }\n obj.globalEval = globalEval;\n obj.doc = _document;\n obj.fieldPath = name;\n obj.appObjects = appObjects;\n const otherFields = annotations.slice(1);\n let field;\n switch (obj.type) {\n case \"radiobutton\":\n {\n field = new RadioButtonField(otherFields, obj);\n break;\n }\n case \"checkbox\":\n {\n field = new CheckboxField(otherFields, obj);\n break;\n }\n default:\n if (otherFields.length > 0) {\n obj.siblings = otherFields.map(x => x.id);\n }\n field = new Field(obj);\n }\n const wrapped = new Proxy(field, proxyHandler);\n const _object = {\n obj: field,\n wrapped\n };\n doc._addField(name, _object);\n for (const object of objs) {\n appObjects[object.id] = _object;\n }\n if (container) {\n appObjects[container.id] = _object;\n }\n }\n }\n const color = new Color();\n globalThis.event = null;\n globalThis.global = Object.create(null);\n globalThis.app = new Proxy(app, proxyHandler);\n globalThis.color = new Proxy(color, proxyHandler);\n globalThis.console = new Proxy(new Console({\n send\n }), proxyHandler);\n globalThis.util = new Proxy(util, proxyHandler);\n globalThis.border = Border;\n globalThis.cursor = Cursor;\n globalThis.display = Display;\n globalThis.font = Font;\n globalThis.highlight = Highlight;\n globalThis.position = Position;\n globalThis.scaleHow = ScaleHow;\n globalThis.scaleWhen = ScaleWhen;\n globalThis.style = Style;\n globalThis.trans = Trans;\n globalThis.zoomtype = ZoomType;\n globalThis.ADBE = {\n Reader_Value_Asked: true,\n Viewer_Value_Asked: true\n };\n const aform = new AForm(doc, app, util, color);\n for (const name of Object.getOwnPropertyNames(AForm.prototype)) {\n if (name !== \"constructor\" && !name.startsWith(\"_\")) {\n globalThis[name] = aform[name].bind(aform);\n }\n }\n for (const [name, value] of Object.entries(GlobalConstants)) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: false\n });\n }\n Object.defineProperties(globalThis, {\n ColorConvert: {\n value: color.convert.bind(color),\n writable: true\n },\n ColorEqual: {\n value: color.equal.bind(color),\n writable: true\n }\n });\n const properties = Object.create(null);\n for (const name of Object.getOwnPropertyNames(Doc.prototype)) {\n if (name === \"constructor\" || name.startsWith(\"_\")) {\n continue;\n }\n const descriptor = Object.getOwnPropertyDescriptor(Doc.prototype, name);\n if (descriptor.get) {\n properties[name] = {\n get: descriptor.get.bind(doc),\n set: descriptor.set.bind(doc)\n };\n } else {\n properties[name] = {\n value: Doc.prototype[name].bind(doc)\n };\n }\n }\n Object.defineProperties(globalThis, properties);\n const functions = {\n dispatchEvent: app._dispatchEvent.bind(app),\n timeoutCb: app._evalCallback.bind(app)\n };\n return (name, args) => {\n try {\n functions[name](args);\n } catch (error) {\n send(serializeError(error));\n }\n };\n}\n\n;// ./src/pdf.scripting.js\n\nconst pdfjsVersion = \"4.10.38\";\nconst pdfjsBuild = \"f9bea397f\";\nglobalThis.pdfjsScripting = {\n initSandbox: initSandbox\n};\n"]; + code.push("delete dump;"); + let success = false; + let buf = 0; + try { + const sandboxData = JSON.stringify(data); + code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`); + buf = this._module.stringToNewUTF8(code.join("\n")); + success = !!this._module.ccall("init", "number", ["number", "number"], [buf, this._alertOnError]); + } catch (error) { + console.error(error); + } finally { + if (buf) { + this._module.ccall("free", "number", ["number"], [buf]); + } + } + if (success) { + this.support.commFun = this._module.cwrap("commFun", null, ["string", "string"]); + } else { + this.nukeSandbox(); + throw new Error("Cannot start sandbox"); + } + } + dispatchEvent(event) { + this.support?.callSandboxFunction("dispatchEvent", event); + } + dumpMemoryUse() { + this._module?.ccall("dumpMemoryUse", null, []); + } + nukeSandbox() { + if (this._module !== null) { + this.support.destroy(); + this.support = null; + this._module.ccall("nukeSandbox", null, []); + this._module = null; + } + } + evalForTesting(code, key) { + throw new Error("Not implemented: evalForTesting"); + } +} +function QuickJSSandbox() { + return quickjs_eval().then(module => new Sandbox(window, module)); +} + +var __webpack_exports__QuickJSSandbox = __webpack_exports__.QuickJSSandbox; +export { __webpack_exports__QuickJSSandbox as QuickJSSandbox }; + +//# sourceMappingURL=pdf.sandbox.mjs.map \ No newline at end of file diff --git a/public/pdfjs/build/pdf.worker.mjs b/public/pdfjs/build/pdf.worker.mjs new file mode 100644 index 0000000..92eba68 --- /dev/null +++ b/public/pdfjs/build/pdf.worker.mjs @@ -0,0 +1,56979 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = globalThis.pdfjsWorker = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + WorkerMessageHandler: () => (/* reexport */ WorkerMessageHandler) +}); + +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch {} + return null; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get platform() { + if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { + return shadow(this, "platform", { + isMac: navigator.platform.includes("Mac"), + isWindows: navigator.platform.includes("Win"), + isFirefox: typeof navigator?.userAgent === "string" && navigator.userAgent.includes("Firefox") + }); + } + return shadow(this, "platform", { + isMac: false, + isWindows: false, + isFirefox: false + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = this.applyTransform(r, m); + const p2 = this.applyTransform(r.slice(2, 4), m); + const p3 = this.applyTransform([r[0], r[3]], m); + const p4 = this.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + if (minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + } else { + minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; + } + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + return minMax; + } +} +const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, num => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} +if (typeof Promise.try !== "function") { + Promise.try = function (fn, ...args) { + return new Promise(resolve => { + resolve(fn(...args)); + }); + }; +} + +;// ./src/core/primitives.js + +const CIRCULAR_REF = Symbol("CIRCULAR_REF"); +const EOF = Symbol("EOF"); +let CmdCache = Object.create(null); +let NameCache = Object.create(null); +let RefCache = Object.create(null); +function clearPrimitiveCaches() { + CmdCache = Object.create(null); + NameCache = Object.create(null); + RefCache = Object.create(null); +} +class Name { + constructor(name) { + this.name = name; + } + static get(name) { + return NameCache[name] ||= new Name(name); + } +} +class Cmd { + constructor(cmd) { + this.cmd = cmd; + } + static get(cmd) { + return CmdCache[cmd] ||= new Cmd(cmd); + } +} +const nonSerializable = function nonSerializableClosure() { + return nonSerializable; +}; +class Dict { + constructor(xref = null) { + this._map = new Map(); + this.xref = xref; + this.objId = null; + this.suppressEncryption = false; + this.__nonSerializable__ = nonSerializable; + } + assignXref(newXref) { + this.xref = newXref; + } + get size() { + return this._map.size; + } + get(key1, key2, key3) { + let value = this._map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this._map.get(key2); + if (value === undefined && key3 !== undefined) { + value = this._map.get(key3); + } + } + if (value instanceof Ref && this.xref) { + return this.xref.fetch(value, this.suppressEncryption); + } + return value; + } + async getAsync(key1, key2, key3) { + let value = this._map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this._map.get(key2); + if (value === undefined && key3 !== undefined) { + value = this._map.get(key3); + } + } + if (value instanceof Ref && this.xref) { + return this.xref.fetchAsync(value, this.suppressEncryption); + } + return value; + } + getArray(key1, key2, key3) { + let value = this._map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this._map.get(key2); + if (value === undefined && key3 !== undefined) { + value = this._map.get(key3); + } + } + if (value instanceof Ref && this.xref) { + value = this.xref.fetch(value, this.suppressEncryption); + } + if (Array.isArray(value)) { + value = value.slice(); + for (let i = 0, ii = value.length; i < ii; i++) { + if (value[i] instanceof Ref && this.xref) { + value[i] = this.xref.fetch(value[i], this.suppressEncryption); + } + } + } + return value; + } + getRaw(key) { + return this._map.get(key); + } + getKeys() { + return [...this._map.keys()]; + } + getRawValues() { + return [...this._map.values()]; + } + set(key, value) { + this._map.set(key, value); + } + has(key) { + return this._map.has(key); + } + *[Symbol.iterator]() { + for (const [key, value] of this._map) { + yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value]; + } + } + static get empty() { + const emptyDict = new Dict(null); + emptyDict.set = (key, value) => { + unreachable("Should not call `set` on the empty dictionary."); + }; + return shadow(this, "empty", emptyDict); + } + static merge({ + xref, + dictArray, + mergeSubDicts = false + }) { + const mergedDict = new Dict(xref), + properties = new Map(); + for (const dict of dictArray) { + if (!(dict instanceof Dict)) { + continue; + } + for (const [key, value] of dict._map) { + let property = properties.get(key); + if (property === undefined) { + property = []; + properties.set(key, property); + } else if (!mergeSubDicts || !(value instanceof Dict)) { + continue; + } + property.push(value); + } + } + for (const [name, values] of properties) { + if (values.length === 1 || !(values[0] instanceof Dict)) { + mergedDict._map.set(name, values[0]); + continue; + } + const subDict = new Dict(xref); + for (const dict of values) { + for (const [key, value] of dict._map) { + if (!subDict._map.has(key)) { + subDict._map.set(key, value); + } + } + } + if (subDict.size > 0) { + mergedDict._map.set(name, subDict); + } + } + properties.clear(); + return mergedDict.size > 0 ? mergedDict : Dict.empty; + } + clone() { + const dict = new Dict(this.xref); + for (const key of this.getKeys()) { + dict.set(key, this.getRaw(key)); + } + return dict; + } + delete(key) { + delete this._map[key]; + } +} +class Ref { + constructor(num, gen) { + this.num = num; + this.gen = gen; + } + toString() { + if (this.gen === 0) { + return `${this.num}R`; + } + return `${this.num}R${this.gen}`; + } + static fromString(str) { + const ref = RefCache[str]; + if (ref) { + return ref; + } + const m = /^(\d+)R(\d*)$/.exec(str); + if (!m || m[1] === "0") { + return null; + } + return RefCache[str] = new Ref(parseInt(m[1]), !m[2] ? 0 : parseInt(m[2])); + } + static get(num, gen) { + const key = gen === 0 ? `${num}R` : `${num}R${gen}`; + return RefCache[key] ||= new Ref(num, gen); + } +} +class RefSet { + constructor(parent = null) { + this._set = new Set(parent?._set); + } + has(ref) { + return this._set.has(ref.toString()); + } + put(ref) { + this._set.add(ref.toString()); + } + remove(ref) { + this._set.delete(ref.toString()); + } + [Symbol.iterator]() { + return this._set.values(); + } + clear() { + this._set.clear(); + } +} +class RefSetCache { + constructor() { + this._map = new Map(); + } + get size() { + return this._map.size; + } + get(ref) { + return this._map.get(ref.toString()); + } + has(ref) { + return this._map.has(ref.toString()); + } + put(ref, obj) { + this._map.set(ref.toString(), obj); + } + putAlias(ref, aliasRef) { + this._map.set(ref.toString(), this.get(aliasRef)); + } + [Symbol.iterator]() { + return this._map.values(); + } + clear() { + this._map.clear(); + } + *values() { + yield* this._map.values(); + } + *items() { + for (const [ref, value] of this._map) { + yield [Ref.fromString(ref), value]; + } + } +} +function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); +} +function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); +} +function isDict(v, type) { + return v instanceof Dict && (type === undefined || isName(v.get("Type"), type)); +} +function isRefsEqual(v1, v2) { + return v1.num === v2.num && v1.gen === v2.gen; +} + +;// ./src/core/base_stream.js + +class BaseStream { + get length() { + unreachable("Abstract getter `length` accessed"); + } + get isEmpty() { + unreachable("Abstract getter `isEmpty` accessed"); + } + get isDataLoaded() { + return shadow(this, "isDataLoaded", true); + } + getByte() { + unreachable("Abstract method `getByte` called"); + } + getBytes(length) { + unreachable("Abstract method `getBytes` called"); + } + async getImageData(length, decoderOptions) { + return this.getBytes(length, decoderOptions); + } + async asyncGetBytes() { + unreachable("Abstract method `asyncGetBytes` called"); + } + get isAsync() { + return false; + } + get canAsyncDecodeImageFromBuffer() { + return false; + } + async getTransferableImage() { + return null; + } + peekByte() { + const peekedByte = this.getByte(); + if (peekedByte !== -1) { + this.pos--; + } + return peekedByte; + } + peekBytes(length) { + const bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; + } + getUint16() { + const b0 = this.getByte(); + const b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + } + getInt32() { + const b0 = this.getByte(); + const b1 = this.getByte(); + const b2 = this.getByte(); + const b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + } + getByteRange(begin, end) { + unreachable("Abstract method `getByteRange` called"); + } + getString(length) { + return bytesToString(this.getBytes(length)); + } + skip(n) { + this.pos += n || 1; + } + reset() { + unreachable("Abstract method `reset` called"); + } + moveStart() { + unreachable("Abstract method `moveStart` called"); + } + makeSubStream(start, length, dict = null) { + unreachable("Abstract method `makeSubStream` called"); + } + getBaseStreams() { + return null; + } +} + +;// ./src/core/core_utils.js + + + +const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; +const MAX_INT_32 = 2 ** 31 - 1; +const MIN_INT_32 = -(2 ** 31); +function getLookupTableFactory(initializer) { + let lookup; + return function () { + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; + } + return lookup; + }; +} +class MissingDataException extends BaseException { + constructor(begin, end) { + super(`Missing data [${begin}, ${end})`, "MissingDataException"); + this.begin = begin; + this.end = end; + } +} +class ParserEOFException extends BaseException { + constructor(msg) { + super(msg, "ParserEOFException"); + } +} +class XRefEntryException extends BaseException { + constructor(msg) { + super(msg, "XRefEntryException"); + } +} +class XRefParseException extends BaseException { + constructor(msg) { + super(msg, "XRefParseException"); + } +} +function arrayBuffersToBytes(arr) { + const length = arr.length; + if (length === 0) { + return new Uint8Array(0); + } + if (length === 1) { + return new Uint8Array(arr[0]); + } + let dataLength = 0; + for (let i = 0; i < length; i++) { + dataLength += arr[i].byteLength; + } + const data = new Uint8Array(dataLength); + let pos = 0; + for (let i = 0; i < length; i++) { + const item = new Uint8Array(arr[i]); + data.set(item, pos); + pos += item.byteLength; + } + return data; +} +function getInheritableProperty({ + dict, + key, + getArray = false, + stopWhenFound = true +}) { + let values; + const visited = new RefSet(); + while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) { + if (dict.objId) { + visited.put(dict.objId); + } + const value = getArray ? dict.getArray(key) : dict.get(key); + if (value !== undefined) { + if (stopWhenFound) { + return value; + } + (values ||= []).push(value); + } + dict = dict.get("Parent"); + } + return values; +} +function getParentToUpdate(dict, ref, xref) { + const visited = new RefSet(); + const firstDict = dict; + const result = { + dict: null, + ref: null + }; + while (dict instanceof Dict && !visited.has(ref)) { + visited.put(ref); + if (dict.has("T")) { + break; + } + ref = dict.getRaw("Parent"); + if (!(ref instanceof Ref)) { + return result; + } + dict = xref.fetch(ref); + } + if (dict instanceof Dict && dict !== firstDict) { + result.dict = dict; + result.ref = ref; + } + return result; +} +const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; +function toRomanNumerals(number, lowerCase = false) { + assert(Number.isInteger(number) && number > 0, "The number should be a positive integer."); + const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10]; + return lowerCase ? roman.toLowerCase() : roman; +} +function log2(x) { + return x > 0 ? Math.ceil(Math.log2(x)) : 0; +} +function readInt8(data, offset) { + return data[offset] << 24 >> 24; +} +function readUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; +} +function readUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +} +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; +} +function isBooleanArray(arr, len) { + return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean"); +} +function isNumberArray(arr, len) { + if (Array.isArray(arr)) { + return (len === null || arr.length === len) && arr.every(x => typeof x === "number"); + } + return ArrayBuffer.isView(arr) && (arr.length === 0 || typeof arr[0] === "number") && (len === null || arr.length === len); +} +function lookupMatrix(arr, fallback) { + return isNumberArray(arr, 6) ? arr : fallback; +} +function lookupRect(arr, fallback) { + return isNumberArray(arr, 4) ? arr : fallback; +} +function lookupNormalRect(arr, fallback) { + return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback; +} +function parseXFAPath(path) { + const positionPattern = /(.+)\[(\d+)\]$/; + return path.split(".").map(component => { + const m = component.match(positionPattern); + if (m) { + return { + name: m[1], + pos: parseInt(m[2], 10) + }; + } + return { + name: component, + pos: 0 + }; + }); +} +function escapePDFName(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`#${char.toString(16)}`); + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function escapeString(str) { + return str.replaceAll(/([()\\\n\r])/g, match => { + if (match === "\n") { + return "\\n"; + } else if (match === "\r") { + return "\\r"; + } + return `\\${match}`; + }); +} +function _collectJS(entry, xref, list, parents) { + if (!entry) { + return; + } + let parent = null; + if (entry instanceof Ref) { + if (parents.has(entry)) { + return; + } + parent = entry; + parents.put(parent); + entry = xref.fetch(entry); + } + if (Array.isArray(entry)) { + for (const element of entry) { + _collectJS(element, xref, list, parents); + } + } else if (entry instanceof Dict) { + if (isName(entry.get("S"), "JavaScript")) { + const js = entry.get("JS"); + let code; + if (js instanceof BaseStream) { + code = js.getString(); + } else if (typeof js === "string") { + code = js; + } + code &&= stringToPDFString(code).replaceAll("\x00", ""); + if (code) { + list.push(code); + } + } + _collectJS(entry.getRaw("Next"), xref, list, parents); + } + if (parent) { + parents.remove(parent); + } +} +function collectActions(xref, dict, eventType) { + const actions = Object.create(null); + const additionalActionsDicts = getInheritableProperty({ + dict, + key: "AA", + stopWhenFound: false + }); + if (additionalActionsDicts) { + for (let i = additionalActionsDicts.length - 1; i >= 0; i--) { + const additionalActions = additionalActionsDicts[i]; + if (!(additionalActions instanceof Dict)) { + continue; + } + for (const key of additionalActions.getKeys()) { + const action = eventType[key]; + if (!action) { + continue; + } + const actionDict = additionalActions.getRaw(key); + const parents = new RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions[action] = list; + } + } + } + } + if (dict.has("A")) { + const actionDict = dict.get("A"); + const parents = new RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions.Action = list; + } + } + return objectSize(actions) > 0 ? actions : null; +} +const XMLEntities = { + 0x3c: "<", + 0x3e: ">", + 0x26: "&", + 0x22: """, + 0x27: "'" +}; +function* codePointIter(str) { + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + yield char; + } +} +function encodeToXmlString(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (0x20 <= char && char <= 0x7e) { + const entity = XMLEntities[char]; + if (entity) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(entity); + start = i + 1; + } + } else { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`&#x${char.toString(16).toUpperCase()};`); + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function validateFontName(fontFamily, mustWarn = false) { + const m = /^("|').*("|')$/.exec(fontFamily); + if (m && m[1] === m[2]) { + const re = new RegExp(`[^\\\\]${m[1]}`); + if (re.test(fontFamily.slice(1, -1))) { + if (mustWarn) { + warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`); + } + return false; + } + } else { + for (const ident of fontFamily.split(/[ \t]+/)) { + if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { + if (mustWarn) { + warn(`FontFamily contains invalid : ${fontFamily}.`); + } + return false; + } + } + } + return true; +} +function validateCSSFont(cssFontInfo) { + const DEFAULT_CSS_FONT_OBLIQUE = "14"; + const DEFAULT_CSS_FONT_WEIGHT = "400"; + const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]); + const { + fontFamily, + fontWeight, + italicAngle + } = cssFontInfo; + if (!validateFontName(fontFamily, true)) { + return false; + } + const weight = fontWeight ? fontWeight.toString() : ""; + cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT; + const angle = parseFloat(italicAngle); + cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString(); + return true; +} +function recoverJsURL(str) { + const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; + const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); + const jsUrl = regex.exec(str); + if (jsUrl?.[2]) { + return { + url: jsUrl[2], + newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true" + }; + } + return null; +} +function numberToString(value) { + if (Number.isInteger(value)) { + return value.toString(); + } + const roundedValue = Math.round(value * 100); + if (roundedValue % 100 === 0) { + return (roundedValue / 100).toString(); + } + if (roundedValue % 10 === 0) { + return value.toFixed(1); + } + return value.toFixed(2); +} +function getNewAnnotationsMap(annotationStorage) { + if (!annotationStorage) { + return null; + } + const newAnnotationsByPage = new Map(); + for (const [key, value] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + let annotations = newAnnotationsByPage.get(value.pageIndex); + if (!annotations) { + annotations = []; + newAnnotationsByPage.set(value.pageIndex, annotations); + } + annotations.push(value); + } + return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; +} +function stringToAsciiOrUTF16BE(str) { + return isAscii(str) ? str : stringToUTF16String(str, true); +} +function isAscii(str) { + return /^[\x00-\x7F]*$/.test(str); +} +function stringToUTF16HexString(str) { + const buf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(hexNumbers[char >> 8 & 0xff], hexNumbers[char & 0xff]); + } + return buf.join(""); +} +function stringToUTF16String(str, bigEndian = false) { + const buf = []; + if (bigEndian) { + buf.push("\xFE\xFF"); + } + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); + } + return buf.join(""); +} +function getRotationMatrix(rotation, width, height) { + switch (rotation) { + case 90: + return [0, 1, -1, 0, width, 0]; + case 180: + return [-1, 0, 0, -1, width, height]; + case 270: + return [0, -1, 1, 0, 0, height]; + default: + throw new Error("Invalid rotation"); + } +} +function getSizeInBytes(x) { + return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); +} + +;// ./src/core/stream.js + + +class Stream extends BaseStream { + constructor(arrayBuffer, start, length, dict) { + super(); + this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); + this.start = start || 0; + this.pos = this.start; + this.end = start + length || this.bytes.length; + this.dict = dict; + } + get length() { + return this.end - this.start; + } + get isEmpty() { + return this.length === 0; + } + getByte() { + if (this.pos >= this.end) { + return -1; + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + this.pos = end; + return bytes.subarray(pos, end); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + return this.bytes.subarray(begin, end); + } + reset() { + this.pos = this.start; + } + moveStart() { + this.start = this.pos; + } + makeSubStream(start, length, dict = null) { + return new Stream(this.bytes.buffer, start, length, dict); + } +} +class StringStream extends Stream { + constructor(str) { + super(stringToBytes(str)); + } +} +class NullStream extends Stream { + constructor() { + super(new Uint8Array(0)); + } +} + +;// ./src/core/chunked_stream.js + + + +class ChunkedStream extends Stream { + constructor(length, chunkSize, manager) { + super(new Uint8Array(length), 0, length, null); + this.chunkSize = chunkSize; + this._loadedChunks = new Set(); + this.numChunks = Math.ceil(length / chunkSize); + this.manager = manager; + this.progressiveDataLength = 0; + this.lastSuccessfulEnsureByteChunk = -1; + } + getMissingChunks() { + const chunks = []; + for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + chunks.push(chunk); + } + } + return chunks; + } + get numChunksLoaded() { + return this._loadedChunks.size; + } + get isDataLoaded() { + return this.numChunksLoaded === this.numChunks; + } + onReceiveData(begin, chunk) { + const chunkSize = this.chunkSize; + if (begin % chunkSize !== 0) { + throw new Error(`Bad begin offset: ${begin}`); + } + const end = begin + chunk.byteLength; + if (end % chunkSize !== 0 && end !== this.bytes.length) { + throw new Error(`Bad end offset: ${end}`); + } + this.bytes.set(new Uint8Array(chunk), begin); + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = Math.floor((end - 1) / chunkSize) + 1; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + onReceiveProgressiveData(data) { + let position = this.progressiveDataLength; + const beginChunk = Math.floor(position / this.chunkSize); + this.bytes.set(new Uint8Array(data), position); + position += data.byteLength; + this.progressiveDataLength = position; + const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + const chunk = Math.floor(pos / this.chunkSize); + if (chunk > this.numChunks) { + return; + } + if (chunk === this.lastSuccessfulEnsureByteChunk) { + return; + } + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(pos, pos + 1); + } + this.lastSuccessfulEnsureByteChunk = chunk; + } + ensureRange(begin, end) { + if (begin >= end) { + return; + } + if (end <= this.progressiveDataLength) { + return; + } + const beginChunk = Math.floor(begin / this.chunkSize); + if (beginChunk > this.numChunks) { + return; + } + const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(begin, end); + } + } + } + nextEmptyChunk(beginChunk) { + const numChunks = this.numChunks; + for (let i = 0; i < numChunks; ++i) { + const chunk = (beginChunk + i) % numChunks; + if (!this._loadedChunks.has(chunk)) { + return chunk; + } + } + return null; + } + hasChunk(chunk) { + return this._loadedChunks.has(chunk); + } + getByte() { + const pos = this.pos; + if (pos >= this.end) { + return -1; + } + if (pos >= this.progressiveDataLength) { + this.ensureByte(pos); + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + if (strEnd > this.progressiveDataLength) { + this.ensureRange(pos, strEnd); + } + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + if (end > this.progressiveDataLength) { + this.ensureRange(pos, end); + } + this.pos = end; + return bytes.subarray(pos, end); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + if (end > this.progressiveDataLength) { + this.ensureRange(begin, end); + } + return this.bytes.subarray(begin, end); + } + makeSubStream(start, length, dict = null) { + if (length) { + if (start + length > this.progressiveDataLength) { + this.ensureRange(start, start + length); + } + } else if (start >= this.progressiveDataLength) { + this.ensureByte(start); + } + function ChunkedStreamSubstream() {} + ChunkedStreamSubstream.prototype = Object.create(this); + ChunkedStreamSubstream.prototype.getMissingChunks = function () { + const chunkSize = this.chunkSize; + const beginChunk = Math.floor(this.start / chunkSize); + const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; + const missingChunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + missingChunks.push(chunk); + } + } + return missingChunks; + }; + Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { + get() { + if (this.numChunksLoaded === this.numChunks) { + return true; + } + return this.getMissingChunks().length === 0; + }, + configurable: true + }); + const subStream = new ChunkedStreamSubstream(); + subStream.pos = subStream.start = start; + subStream.end = start + length || this.end; + subStream.dict = dict; + return subStream; + } + getBaseStreams() { + return [this]; + } +} +class ChunkedStreamManager { + constructor(pdfNetworkStream, args) { + this.length = args.length; + this.chunkSize = args.rangeChunkSize; + this.stream = new ChunkedStream(this.length, this.chunkSize, this); + this.pdfNetworkStream = pdfNetworkStream; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; + this.currRequestId = 0; + this._chunksNeededByRequest = new Map(); + this._requestsByChunk = new Map(); + this._promisesByRequest = new Map(); + this.progressiveDataLength = 0; + this.aborted = false; + this._loadedStreamCapability = Promise.withResolvers(); + } + sendRequest(begin, end) { + const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); + if (!rangeReader.isStreamingSupported) { + rangeReader.onProgress = this.onProgress.bind(this); + } + let chunks = [], + loaded = 0; + return new Promise((resolve, reject) => { + const readChunk = ({ + value, + done + }) => { + try { + if (done) { + const chunkData = arrayBuffersToBytes(chunks); + chunks = null; + resolve(chunkData); + return; + } + loaded += value.byteLength; + if (rangeReader.isStreamingSupported) { + this.onProgress({ + loaded + }); + } + chunks.push(value); + rangeReader.read().then(readChunk, reject); + } catch (e) { + reject(e); + } + }; + rangeReader.read().then(readChunk, reject); + }).then(data => { + if (this.aborted) { + return; + } + this.onReceiveData({ + chunk: data, + begin + }); + }); + } + requestAllChunks(noFetch = false) { + if (!noFetch) { + const missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); + } + return this._loadedStreamCapability.promise; + } + _requestChunks(chunks) { + const requestId = this.currRequestId++; + const chunksNeeded = new Set(); + this._chunksNeededByRequest.set(requestId, chunksNeeded); + for (const chunk of chunks) { + if (!this.stream.hasChunk(chunk)) { + chunksNeeded.add(chunk); + } + } + if (chunksNeeded.size === 0) { + return Promise.resolve(); + } + const capability = Promise.withResolvers(); + this._promisesByRequest.set(requestId, capability); + const chunksToRequest = []; + for (const chunk of chunksNeeded) { + let requestIds = this._requestsByChunk.get(chunk); + if (!requestIds) { + requestIds = []; + this._requestsByChunk.set(chunk, requestIds); + chunksToRequest.push(chunk); + } + requestIds.push(requestId); + } + if (chunksToRequest.length > 0) { + const groupedChunksToRequest = this.groupChunks(chunksToRequest); + for (const groupedChunk of groupedChunksToRequest) { + const begin = groupedChunk.beginChunk * this.chunkSize; + const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); + this.sendRequest(begin, end).catch(capability.reject); + } + } + return capability.promise.catch(reason => { + if (this.aborted) { + return; + } + throw reason; + }); + } + getStream() { + return this.stream; + } + requestRange(begin, end) { + end = Math.min(end, this.length); + const beginChunk = this.getBeginChunk(begin); + const endChunk = this.getEndChunk(end); + const chunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + chunks.push(chunk); + } + return this._requestChunks(chunks); + } + requestRanges(ranges = []) { + const chunksToRequest = []; + for (const range of ranges) { + const beginChunk = this.getBeginChunk(range.begin); + const endChunk = this.getEndChunk(range.end); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!chunksToRequest.includes(chunk)) { + chunksToRequest.push(chunk); + } + } + } + chunksToRequest.sort(function (a, b) { + return a - b; + }); + return this._requestChunks(chunksToRequest); + } + groupChunks(chunks) { + const groupedChunks = []; + let beginChunk = -1; + let prevChunk = -1; + for (let i = 0, ii = chunks.length; i < ii; ++i) { + const chunk = chunks[i]; + if (beginChunk < 0) { + beginChunk = chunk; + } + if (prevChunk >= 0 && prevChunk + 1 !== chunk) { + groupedChunks.push({ + beginChunk, + endChunk: prevChunk + 1 + }); + beginChunk = chunk; + } + if (i + 1 === chunks.length) { + groupedChunks.push({ + beginChunk, + endChunk: chunk + 1 + }); + } + prevChunk = chunk; + } + return groupedChunks; + } + onProgress(args) { + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, + total: this.length + }); + } + onReceiveData(args) { + const chunk = args.chunk; + const isProgressive = args.begin === undefined; + const begin = isProgressive ? this.progressiveDataLength : args.begin; + const end = begin + chunk.byteLength; + const beginChunk = Math.floor(begin / this.chunkSize); + const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); + if (isProgressive) { + this.stream.onReceiveProgressiveData(chunk); + this.progressiveDataLength = end; + } else { + this.stream.onReceiveData(begin, chunk); + } + if (this.stream.isDataLoaded) { + this._loadedStreamCapability.resolve(this.stream); + } + const loadedRequests = []; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + const requestIds = this._requestsByChunk.get(curChunk); + if (!requestIds) { + continue; + } + this._requestsByChunk.delete(curChunk); + for (const requestId of requestIds) { + const chunksNeeded = this._chunksNeededByRequest.get(requestId); + if (chunksNeeded.has(curChunk)) { + chunksNeeded.delete(curChunk); + } + if (chunksNeeded.size > 0) { + continue; + } + loadedRequests.push(requestId); + } + } + if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { + let nextEmptyChunk; + if (this.stream.numChunksLoaded === 1) { + const lastChunk = this.stream.numChunks - 1; + if (!this.stream.hasChunk(lastChunk)) { + nextEmptyChunk = lastChunk; + } + } else { + nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); + } + if (Number.isInteger(nextEmptyChunk)) { + this._requestChunks([nextEmptyChunk]); + } + } + for (const requestId of loadedRequests) { + const capability = this._promisesByRequest.get(requestId); + this._promisesByRequest.delete(requestId); + capability.resolve(); + } + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize, + total: this.length + }); + } + onError(err) { + this._loadedStreamCapability.reject(err); + } + getBeginChunk(begin) { + return Math.floor(begin / this.chunkSize); + } + getEndChunk(end) { + return Math.floor((end - 1) / this.chunkSize) + 1; + } + abort(reason) { + this.aborted = true; + this.pdfNetworkStream?.cancelAllRequests(reason); + for (const capability of this._promisesByRequest.values()) { + capability.reject(reason); + } + } +} + +;// ./src/core/colorspace.js + + + + +function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) { + const COMPONENTS = 3; + alpha01 = alpha01 !== 1 ? 0 : alpha01; + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0, + oldIndex; + const xScaled = new Uint16Array(w2); + const w1Scanline = w1 * COMPONENTS; + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (let i = 0; i < h2; i++) { + const py = Math.floor(i * yRatio) * w1Scanline; + for (let j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + newIndex += alpha01; + } + } +} +function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) { + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0; + const xScaled = new Uint16Array(w2); + if (alpha01 === 1) { + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0; i < h2; i++) { + const buf = src32.subarray(Math.floor(i * yRatio) * w1); + for (let j = 0; j < w2; j++) { + dest32[newIndex++] |= buf[xScaled[j]] & rgbMask; + } + } + } else { + const COMPONENTS = 4; + const w1Scanline = w1 * COMPONENTS; + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (let i = 0; i < h2; i++) { + const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline); + for (let j = 0; j < w2; j++) { + const oldIndex = xScaled[j]; + dest[newIndex++] = buf[oldIndex]; + dest[newIndex++] = buf[oldIndex + 1]; + dest[newIndex++] = buf[oldIndex + 2]; + } + } + } +} +function copyRgbaImage(src, dest, alpha01) { + if (alpha01 === 1) { + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0, ii = src32.length; i < ii; i++) { + dest32[i] |= src32[i] & rgbMask; + } + } else { + let j = 0; + for (let i = 0, ii = src.length; i < ii; i += 4) { + dest[j++] = src[i]; + dest[j++] = src[i + 1]; + dest[j++] = src[i + 2]; + } + } +} +class ColorSpace { + constructor(name, numComps) { + this.name = name; + this.numComps = numComps; + } + getRgb(src, srcOffset) { + const rgb = new Uint8ClampedArray(3); + this.getRgbItem(src, srcOffset, rgb, 0); + return rgb; + } + getRgbItem(src, srcOffset, dest, destOffset) { + unreachable("Should not call ColorSpace.getRgbItem"); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + unreachable("Should not call ColorSpace.getRgbBuffer"); + } + getOutputLength(inputLength, alpha01) { + unreachable("Should not call ColorSpace.getOutputLength"); + } + isPassthrough(bits) { + return false; + } + isDefaultDecode(decodeMap, bpc) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + const count = originalWidth * originalHeight; + let rgbBuf = null; + const numComponentColors = 1 << bpc; + const needsResizing = originalHeight !== height || originalWidth !== width; + if (this.isPassthrough(bpc)) { + rgbBuf = comps; + } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") { + const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); + for (let i = 0; i < numComponentColors; i++) { + allColors[i] = i; + } + const colorMap = new Uint8ClampedArray(numComponentColors * 3); + this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); + if (!needsResizing) { + let destPos = 0; + for (let i = 0; i < count; ++i) { + const key = comps[i] * 3; + dest[destPos++] = colorMap[key]; + dest[destPos++] = colorMap[key + 1]; + dest[destPos++] = colorMap[key + 2]; + destPos += alpha01; + } + } else { + rgbBuf = new Uint8Array(count * 3); + let rgbPos = 0; + for (let i = 0; i < count; ++i) { + const key = comps[i] * 3; + rgbBuf[rgbPos++] = colorMap[key]; + rgbBuf[rgbPos++] = colorMap[key + 1]; + rgbBuf[rgbPos++] = colorMap[key + 2]; + } + } + } else if (!needsResizing) { + this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); + } else { + rgbBuf = new Uint8ClampedArray(count * 3); + this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0); + } + if (rgbBuf) { + if (needsResizing) { + resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01); + } else { + let destPos = 0, + rgbPos = 0; + for (let i = 0, ii = width * actualHeight; i < ii; i++) { + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + destPos += alpha01; + } + } + } + } + get usesZeroToOneRange() { + return shadow(this, "usesZeroToOneRange", true); + } + static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) { + if (!localColorSpaceCache) { + throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.'); + } + if (!parsedColorSpace) { + throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.'); + } + let csName, csRef; + if (cacheKey instanceof Ref) { + csRef = cacheKey; + cacheKey = xref.fetch(cacheKey); + } + if (cacheKey instanceof Name) { + csName = cacheKey.name; + } + if (csName || csRef) { + localColorSpaceCache.set(csName, csRef, parsedColorSpace); + } + } + static getCached(cacheKey, xref, localColorSpaceCache) { + if (!localColorSpaceCache) { + throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.'); + } + if (cacheKey instanceof Ref) { + const localColorSpace = localColorSpaceCache.getByRef(cacheKey); + if (localColorSpace) { + return localColorSpace; + } + try { + cacheKey = xref.fetch(cacheKey); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + } + } + if (cacheKey instanceof Name) { + const localColorSpace = localColorSpaceCache.getByName(cacheKey.name); + if (localColorSpace) { + return localColorSpace; + } + } + return null; + } + static async parseAsync({ + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache + }) { + const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; + } + static parse({ + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache + }) { + const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache); + if (cachedColorSpace) { + return cachedColorSpace; + } + const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; + } + static _parse(cs, xref, resources = null, pdfFunctionFactory) { + cs = xref.fetchIfRef(cs); + if (cs instanceof Name) { + switch (cs.name) { + case "G": + case "DeviceGray": + return this.singletons.gray; + case "RGB": + case "DeviceRGB": + return this.singletons.rgb; + case "DeviceRGBA": + return this.singletons.rgba; + case "CMYK": + case "DeviceCMYK": + return this.singletons.cmyk; + case "Pattern": + return new PatternCS(null); + default: + if (resources instanceof Dict) { + const colorSpaces = resources.get("ColorSpace"); + if (colorSpaces instanceof Dict) { + const resourcesCS = colorSpaces.get(cs.name); + if (resourcesCS) { + if (resourcesCS instanceof Name) { + return this._parse(resourcesCS, xref, resources, pdfFunctionFactory); + } + cs = resourcesCS; + break; + } + } + } + warn(`Unrecognized ColorSpace: ${cs.name}`); + return this.singletons.gray; + } + } + if (Array.isArray(cs)) { + const mode = xref.fetchIfRef(cs[0]).name; + let params, numComps, baseCS, whitePoint, blackPoint, gamma; + switch (mode) { + case "G": + case "DeviceGray": + return this.singletons.gray; + case "RGB": + case "DeviceRGB": + return this.singletons.rgb; + case "CMYK": + case "DeviceCMYK": + return this.singletons.cmyk; + case "CalGray": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.get("Gamma"); + return new CalGrayCS(whitePoint, blackPoint, gamma); + case "CalRGB": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.getArray("Gamma"); + const matrix = params.getArray("Matrix"); + return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); + case "ICCBased": + const stream = xref.fetchIfRef(cs[1]); + const dict = stream.dict; + numComps = dict.get("N"); + const alt = dict.get("Alternate"); + if (alt) { + const altCS = this._parse(alt, xref, resources, pdfFunctionFactory); + if (altCS.numComps === numComps) { + return altCS; + } + warn("ICCBased color space: Ignoring incorrect /Alternate entry."); + } + if (numComps === 1) { + return this.singletons.gray; + } else if (numComps === 3) { + return this.singletons.rgb; + } else if (numComps === 4) { + return this.singletons.cmyk; + } + break; + case "Pattern": + baseCS = cs[1] || null; + if (baseCS) { + baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory); + } + return new PatternCS(baseCS); + case "I": + case "Indexed": + baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory); + const hiVal = Math.max(0, Math.min(xref.fetchIfRef(cs[2]), 255)); + const lookup = xref.fetchIfRef(cs[3]); + return new IndexedCS(baseCS, hiVal, lookup); + case "Separation": + case "DeviceN": + const name = xref.fetchIfRef(cs[1]); + numComps = Array.isArray(name) ? name.length : 1; + baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory); + const tintFn = pdfFunctionFactory.create(cs[3]); + return new AlternateCS(numComps, baseCS, tintFn); + case "Lab": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + const range = params.getArray("Range"); + return new LabCS(whitePoint, blackPoint, range); + default: + warn(`Unimplemented ColorSpace object: ${mode}`); + return this.singletons.gray; + } + } + warn(`Unrecognized ColorSpace object: ${cs}`); + return this.singletons.gray; + } + static isDefaultDecode(decode, numComps) { + if (!Array.isArray(decode)) { + return true; + } + if (numComps * 2 !== decode.length) { + warn("The decode map is not the correct length"); + return true; + } + for (let i = 0, ii = decode.length; i < ii; i += 2) { + if (decode[i] !== 0 || decode[i + 1] !== 1) { + return false; + } + } + return true; + } + static get singletons() { + return shadow(this, "singletons", { + get gray() { + return shadow(this, "gray", new DeviceGrayCS()); + }, + get rgb() { + return shadow(this, "rgb", new DeviceRgbCS()); + }, + get rgba() { + return shadow(this, "rgba", new DeviceRgbaCS()); + }, + get cmyk() { + return shadow(this, "cmyk", new DeviceCmykCS()); + } + }); + } +} +class AlternateCS extends ColorSpace { + constructor(numComps, base, tintFn) { + super("Alternate", numComps); + this.base = base; + this.tintFn = tintFn; + this.tmpBuf = new Float32Array(base.numComps); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const tmpBuf = this.tmpBuf; + this.tintFn(src, srcOffset, tmpBuf, 0); + this.base.getRgbItem(tmpBuf, 0, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const tintFn = this.tintFn; + const base = this.base; + const scale = 1 / ((1 << bits) - 1); + const baseNumComps = base.numComps; + const usesZeroToOneRange = base.usesZeroToOneRange; + const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; + let pos = isPassthrough ? destOffset : 0; + const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count); + const numComps = this.numComps; + const scaled = new Float32Array(numComps); + const tinted = new Float32Array(baseNumComps); + let i, j; + for (i = 0; i < count; i++) { + for (j = 0; j < numComps; j++) { + scaled[j] = src[srcOffset++] * scale; + } + tintFn(scaled, 0, tinted, 0); + if (usesZeroToOneRange) { + for (j = 0; j < baseNumComps; j++) { + baseBuf[pos++] = tinted[j] * 255; + } + } else { + base.getRgbItem(tinted, 0, baseBuf, pos); + pos += baseNumComps; + } + } + if (!isPassthrough) { + base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); + } + } + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); + } +} +class PatternCS extends ColorSpace { + constructor(baseCS) { + super("Pattern", null); + this.base = baseCS; + } + isDefaultDecode(decodeMap, bpc) { + unreachable("Should not call PatternCS.isDefaultDecode"); + } +} +class IndexedCS extends ColorSpace { + constructor(base, highVal, lookup) { + super("Indexed", 1); + this.base = base; + const length = base.numComps * (highVal + 1); + this.lookup = new Uint8Array(length); + if (lookup instanceof BaseStream) { + const bytes = lookup.getBytes(length); + this.lookup.set(bytes); + } else if (typeof lookup === "string") { + for (let i = 0; i < length; ++i) { + this.lookup[i] = lookup.charCodeAt(i) & 0xff; + } + } else { + throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); + } + } + getRgbItem(src, srcOffset, dest, destOffset) { + const numComps = this.base.numComps; + const start = src[srcOffset] * numComps; + this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const base = this.base; + const numComps = base.numComps; + const outputDelta = base.getOutputLength(numComps, alpha01); + const lookup = this.lookup; + for (let i = 0; i < count; ++i) { + const lookupPos = src[srcOffset++] * numComps; + base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); + destOffset += outputDelta; + } + } + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); + } + isDefaultDecode(decodeMap, bpc) { + if (!Array.isArray(decodeMap)) { + return true; + } + if (decodeMap.length !== 2) { + warn("Decode map length is not correct"); + return true; + } + if (!Number.isInteger(bpc) || bpc < 1) { + warn("Bits per component is not correct"); + return true; + } + return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; + } +} +class DeviceGrayCS extends ColorSpace { + constructor() { + super("DeviceGray", 1); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const c = src[srcOffset] * 255; + dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + const c = scale * src[j++]; + dest[q++] = c; + dest[q++] = c; + dest[q++] = c; + q += alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + } +} +class DeviceRgbCS extends ColorSpace { + constructor() { + super("DeviceRGB", 3); + } + getRgbItem(src, srcOffset, dest, destOffset) { + dest[destOffset] = src[srcOffset] * 255; + dest[destOffset + 1] = src[srcOffset + 1] * 255; + dest[destOffset + 2] = src[srcOffset + 2] * 255; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + if (bits === 8 && alpha01 === 0) { + dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); + return; + } + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + dest[q++] = scale * src[j++]; + dest[q++] = scale * src[j++]; + dest[q++] = scale * src[j++]; + q += alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + isPassthrough(bits) { + return bits === 8; + } +} +class DeviceRgbaCS extends ColorSpace { + constructor() { + super("DeviceRGBA", 4); + } + getOutputLength(inputLength, _alpha01) { + return inputLength * 4; + } + isPassthrough(bits) { + return bits === 8; + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + if (originalHeight !== height || originalWidth !== width) { + resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01); + } else { + copyRgbaImage(comps, dest, alpha01); + } + } +} +class DeviceCmykCS extends ColorSpace { + constructor() { + super("DeviceCMYK", 4); + } + #toRgb(src, srcOffset, srcScale, dest, destOffset) { + const c = src[srcOffset] * srcScale; + const m = src[srcOffset + 1] * srcScale; + const y = src[srcOffset + 2] * srcScale; + const k = src[srcOffset + 3] * srcScale; + dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747); + dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578); + dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367); + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, 1, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; i++) { + this.#toRgb(src, srcOffset, scale, dest, destOffset); + srcOffset += 4; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength / 4 * (3 + alpha01) | 0; + } +} +class CalGrayCS extends ColorSpace { + constructor(whitePoint, blackPoint, gamma) { + super("CalGray", 1); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space CalGray"); + } + [this.XW, this.YW, this.ZW] = whitePoint; + [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; + this.G = gamma || 1; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + info(`Invalid BlackPoint for ${this.name}, falling back to default.`); + this.XB = this.YB = this.ZB = 0; + } + if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { + warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`); + } + if (this.G < 1) { + info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`); + this.G = 1; + } + } + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = src[srcOffset] * scale; + const AG = A ** this.G; + const L = this.YW * AG; + const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0); + dest[destOffset] = val; + dest[destOffset + 1] = val; + dest[destOffset + 2] = val; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + this.#toRgb(src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + } +} +class CalRGBCS extends ColorSpace { + static #BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]); + static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]); + static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]); + static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); + static #tempNormalizeMatrix = new Float32Array(3); + static #tempConvertMatrix1 = new Float32Array(3); + static #tempConvertMatrix2 = new Float32Array(3); + static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0; + constructor(whitePoint, blackPoint, gamma, matrix) { + super("CalRGB", 3); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space CalRGB"); + } + const [XW, YW, ZW] = this.whitePoint = whitePoint; + const [XB, YB, ZB] = this.blackPoint = blackPoint || new Float32Array(3); + [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]); + [this.MXA, this.MYA, this.MZA, this.MXB, this.MYB, this.MZB, this.MXC, this.MYC, this.MZC] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); + if (XW < 0 || ZW < 0 || YW !== 1) { + throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); + } + if (XB < 0 || YB < 0 || ZB < 0) { + info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default."); + this.blackPoint = new Float32Array(3); + } + if (this.GR < 0 || this.GG < 0 || this.GB < 0) { + info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`); + this.GR = this.GG = this.GB = 1; + } + } + #matrixProduct(a, b, result) { + result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; + result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; + } + #toFlat(sourceWhitePoint, LMS, result) { + result[0] = LMS[0] * 1 / sourceWhitePoint[0]; + result[1] = LMS[1] * 1 / sourceWhitePoint[1]; + result[2] = LMS[2] * 1 / sourceWhitePoint[2]; + } + #toD65(sourceWhitePoint, LMS, result) { + const D65X = 0.95047; + const D65Y = 1; + const D65Z = 1.08883; + result[0] = LMS[0] * D65X / sourceWhitePoint[0]; + result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; + result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; + } + #sRGBTransferFunction(color) { + if (color <= 0.0031308) { + return this.#adjustToRange(0, 1, 12.92 * color); + } + if (color >= 0.99554525) { + return 1; + } + return this.#adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055); + } + #adjustToRange(min, max, value) { + return Math.max(min, Math.min(max, value)); + } + #decodeL(L) { + if (L < 0) { + return -this.#decodeL(-L); + } + if (L > 8.0) { + return ((L + 16) / 116) ** 3; + } + return L * CalRGBCS.#DECODE_L_CONSTANT; + } + #compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { + if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { + result[0] = XYZ_Flat[0]; + result[1] = XYZ_Flat[1]; + result[2] = XYZ_Flat[2]; + return; + } + const zeroDecodeL = this.#decodeL(0); + const X_DST = zeroDecodeL; + const X_SRC = this.#decodeL(sourceBlackPoint[0]); + const Y_DST = zeroDecodeL; + const Y_SRC = this.#decodeL(sourceBlackPoint[1]); + const Z_DST = zeroDecodeL; + const Z_SRC = this.#decodeL(sourceBlackPoint[2]); + const X_Scale = (1 - X_DST) / (1 - X_SRC); + const X_Offset = 1 - X_Scale; + const Y_Scale = (1 - Y_DST) / (1 - Y_SRC); + const Y_Offset = 1 - Y_Scale; + const Z_Scale = (1 - Z_DST) / (1 - Z_SRC); + const Z_Offset = 1 - Z_Scale; + result[0] = XYZ_Flat[0] * X_Scale + X_Offset; + result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; + result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; + } + #normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { + if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { + result[0] = XYZ_In[0]; + result[1] = XYZ_In[1]; + result[2] = XYZ_In[2]; + return; + } + const LMS = result; + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_Flat = CalRGBCS.#tempNormalizeMatrix; + this.#toFlat(sourceWhitePoint, LMS, LMS_Flat); + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); + } + #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { + const LMS = result; + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_D65 = CalRGBCS.#tempNormalizeMatrix; + this.#toD65(sourceWhitePoint, LMS, LMS_D65); + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); + } + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = this.#adjustToRange(0, 1, src[srcOffset] * scale); + const B = this.#adjustToRange(0, 1, src[srcOffset + 1] * scale); + const C = this.#adjustToRange(0, 1, src[srcOffset + 2] * scale); + const AGR = A === 1 ? 1 : A ** this.GR; + const BGG = B === 1 ? 1 : B ** this.GG; + const CGB = C === 1 ? 1 : C ** this.GB; + const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB; + const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB; + const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB; + const XYZ = CalRGBCS.#tempConvertMatrix1; + XYZ[0] = X; + XYZ[1] = Y; + XYZ[2] = Z; + const XYZ_Flat = CalRGBCS.#tempConvertMatrix2; + this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat); + const XYZ_Black = CalRGBCS.#tempConvertMatrix1; + this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black); + const XYZ_D65 = CalRGBCS.#tempConvertMatrix2; + this.#normalizeWhitePointToD65(CalRGBCS.#FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); + const SRGB = CalRGBCS.#tempConvertMatrix1; + this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); + dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255; + dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255; + dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + this.#toRgb(src, srcOffset, dest, destOffset, scale); + srcOffset += 3; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } +} +class LabCS extends ColorSpace { + constructor(whitePoint, blackPoint, range) { + super("Lab", 3); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space Lab"); + } + [this.XW, this.YW, this.ZW] = whitePoint; + [this.amin, this.amax, this.bmin, this.bmax] = range || [-100, 100, -100, 100]; + [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + throw new FormatError("Invalid WhitePoint components, no fallback available"); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + info("Invalid BlackPoint, falling back to default"); + this.XB = this.YB = this.ZB = 0; + } + if (this.amin > this.amax || this.bmin > this.bmax) { + info("Invalid Range, falling back to defaults"); + this.amin = -100; + this.amax = 100; + this.bmin = -100; + this.bmax = 100; + } + } + #fn_g(x) { + return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29); + } + #decode(value, high1, low2, high2) { + return low2 + value * (high2 - low2) / high1; + } + #toRgb(src, srcOffset, maxVal, dest, destOffset) { + let Ls = src[srcOffset]; + let as = src[srcOffset + 1]; + let bs = src[srcOffset + 2]; + if (maxVal !== false) { + Ls = this.#decode(Ls, maxVal, 0, 100); + as = this.#decode(as, maxVal, this.amin, this.amax); + bs = this.#decode(bs, maxVal, this.bmin, this.bmax); + } + if (as > this.amax) { + as = this.amax; + } else if (as < this.amin) { + as = this.amin; + } + if (bs > this.bmax) { + bs = this.bmax; + } else if (bs < this.bmin) { + bs = this.bmin; + } + const M = (Ls + 16) / 116; + const L = M + as / 500; + const N = M - bs / 200; + const X = this.XW * this.#fn_g(L); + const Y = this.YW * this.#fn_g(M); + const Z = this.ZW * this.#fn_g(N); + let r, g, b; + if (this.ZW < 1) { + r = X * 3.1339 + Y * -1.617 + Z * -0.4906; + g = X * -0.9785 + Y * 1.916 + Z * 0.0333; + b = X * 0.072 + Y * -0.229 + Z * 1.4057; + } else { + r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; + g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; + b = X * 0.0557 + Y * -0.204 + Z * 1.057; + } + dest[destOffset] = Math.sqrt(r) * 255; + dest[destOffset + 1] = Math.sqrt(g) * 255; + dest[destOffset + 2] = Math.sqrt(b) * 255; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, false, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const maxVal = (1 << bits) - 1; + for (let i = 0; i < count; i++) { + this.#toRgb(src, srcOffset, maxVal, dest, destOffset); + srcOffset += 3; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + isDefaultDecode(decodeMap, bpc) { + return true; + } + get usesZeroToOneRange() { + return shadow(this, "usesZeroToOneRange", false); + } +} + +;// ./src/core/binary_cmap.js + +function hexToInt(a, size) { + let n = 0; + for (let i = 0; i <= size; i++) { + n = n << 8 | a[i]; + } + return n >>> 0; +} +function hexToStr(a, size) { + if (size === 1) { + return String.fromCharCode(a[0], a[1]); + } + if (size === 3) { + return String.fromCharCode(a[0], a[1], a[2], a[3]); + } + return String.fromCharCode(...a.subarray(0, size + 1)); +} +function addHex(a, b, size) { + let c = 0; + for (let i = size; i >= 0; i--) { + c += a[i] + b[i]; + a[i] = c & 255; + c >>= 8; + } +} +function incHex(a, size) { + let c = 1; + for (let i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; + } +} +const MAX_NUM_SIZE = 16; +const MAX_ENCODED_NUM_SIZE = 19; +class BinaryCMapStream { + constructor(data) { + this.buffer = data; + this.pos = 0; + this.end = data.length; + this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + } + readByte() { + if (this.pos >= this.end) { + return -1; + } + return this.buffer[this.pos++]; + } + readNumber() { + let n = 0; + let last; + do { + const b = this.readByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + n = n << 7 | b & 0x7f; + } while (!last); + return n; + } + readSigned() { + const n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; + } + readHex(num, size) { + num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); + this.pos += size + 1; + } + readHexNumber(num, size) { + let last; + const stack = this.tmpBuf; + let sp = 0; + do { + const b = this.readByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + stack[sp++] = b & 0x7f; + } while (!last); + let i = size, + buffer = 0, + bufferSize = 0; + while (i >= 0) { + while (bufferSize < 8 && stack.length > 0) { + buffer |= stack[--sp] << bufferSize; + bufferSize += 7; + } + num[i] = buffer & 255; + i--; + buffer >>= 8; + bufferSize -= 8; + } + } + readHexSigned(num, size) { + this.readHexNumber(num, size); + const sign = num[size] & 1 ? 255 : 0; + let c = 0; + for (let i = 0; i <= size; i++) { + c = (c & 1) << 8 | num[i]; + num[i] = c >> 1 ^ sign; + } + } + readString() { + const len = this.readNumber(), + buf = new Array(len); + for (let i = 0; i < len; i++) { + buf[i] = this.readNumber(); + } + return String.fromCharCode(...buf); + } +} +class BinaryCMapReader { + async process(data, cMap, extend) { + const stream = new BinaryCMapStream(data); + const header = stream.readByte(); + cMap.vertical = !!(header & 1); + let useCMap = null; + const start = new Uint8Array(MAX_NUM_SIZE); + const end = new Uint8Array(MAX_NUM_SIZE); + const char = new Uint8Array(MAX_NUM_SIZE); + const charCode = new Uint8Array(MAX_NUM_SIZE); + const tmp = new Uint8Array(MAX_NUM_SIZE); + let code; + let b; + while ((b = stream.readByte()) >= 0) { + const type = b >> 5; + if (type === 7) { + switch (b & 0x1f) { + case 0: + stream.readString(); + break; + case 1: + useCMap = stream.readString(); + break; + } + continue; + } + const sequence = !!(b & 0x10); + const dataSize = b & 15; + if (dataSize + 1 > MAX_NUM_SIZE) { + throw new Error("BinaryCMapReader.process: Invalid dataSize."); + } + const ucs2DataSize = 1; + const subitemsCount = stream.readNumber(); + switch (type) { + case 0: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + } + break; + case 1: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + } + break; + case 2: + stream.readHex(char, dataSize); + code = stream.readNumber(); + cMap.mapOne(hexToInt(char, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, dataSize); + if (!sequence) { + stream.readHexNumber(tmp, dataSize); + addHex(char, tmp, dataSize); + } + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); + } + break; + case 3: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + if (!sequence) { + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + } + break; + case 4: + stream.readHex(char, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(tmp, ucs2DataSize); + addHex(char, tmp, ucs2DataSize); + } + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + case 5: + stream.readHex(start, ucs2DataSize); + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(start, ucs2DataSize); + addHex(start, end, ucs2DataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + default: + throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); + } + } + if (useCMap) { + return extend(useCMap); + } + return cMap; + } +} + +;// ./src/core/decode_stream.js + + +const emptyBuffer = new Uint8Array(0); +class DecodeStream extends BaseStream { + constructor(maybeMinBufferLength) { + super(); + this._rawMinBufferLength = maybeMinBufferLength || 0; + this.pos = 0; + this.bufferLength = 0; + this.eof = false; + this.buffer = emptyBuffer; + this.minBufferLength = 512; + if (maybeMinBufferLength) { + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } + } + get isEmpty() { + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; + } + ensureBuffer(requested) { + const buffer = this.buffer; + if (requested <= buffer.byteLength) { + return buffer; + } + let size = this.minBufferLength; + while (size < requested) { + size *= 2; + } + const buffer2 = new Uint8Array(size); + buffer2.set(buffer); + return this.buffer = buffer2; + } + getByte() { + const pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } + this.readBlock(); + } + return this.buffer[this.pos++]; + } + getBytes(length, decoderOptions = null) { + const pos = this.pos; + let end; + if (length) { + this.ensureBuffer(pos + length); + end = pos + length; + while (!this.eof && this.bufferLength < end) { + this.readBlock(decoderOptions); + } + const bufEnd = this.bufferLength; + if (end > bufEnd) { + end = bufEnd; + } + } else { + while (!this.eof) { + this.readBlock(decoderOptions); + } + end = this.bufferLength; + } + this.pos = end; + return this.buffer.subarray(pos, end); + } + async getImageData(length, decoderOptions = null) { + if (!this.canAsyncDecodeImageFromBuffer) { + return this.getBytes(length, decoderOptions); + } + const data = await this.stream.asyncGetBytes(); + return this.decodeImage(data, decoderOptions); + } + reset() { + this.pos = 0; + } + makeSubStream(start, length, dict = null) { + if (length === undefined) { + while (!this.eof) { + this.readBlock(); + } + } else { + const end = start + length; + while (this.bufferLength <= end && !this.eof) { + this.readBlock(); + } + } + return new Stream(this.buffer, start, length, dict); + } + getBaseStreams() { + return this.str ? this.str.getBaseStreams() : null; + } +} +class StreamsSequenceStream extends DecodeStream { + constructor(streams, onError = null) { + streams = streams.filter(s => s instanceof BaseStream); + let maybeLength = 0; + for (const stream of streams) { + maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length; + } + super(maybeLength); + this.streams = streams; + this._onError = onError; + } + readBlock() { + const streams = this.streams; + if (streams.length === 0) { + this.eof = true; + return; + } + const stream = streams.shift(); + let chunk; + try { + chunk = stream.getBytes(); + } catch (reason) { + if (this._onError) { + this._onError(reason, stream.dict?.objId); + return; + } + throw reason; + } + const bufferLength = this.bufferLength; + const newLength = bufferLength + chunk.length; + const buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } + getBaseStreams() { + const baseStreamsBuf = []; + for (const stream of this.streams) { + const baseStreams = stream.getBaseStreams(); + if (baseStreams) { + baseStreamsBuf.push(...baseStreams); + } + } + return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; + } +} + +;// ./src/core/ascii_85_stream.js + + +class Ascii85Stream extends DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.8; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.input = new Uint8Array(5); + } + readBlock() { + const TILDA_CHAR = 0x7e; + const Z_LOWER_CHAR = 0x7a; + const EOF = -1; + const str = this.str; + let c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + const bufferLength = this.bufferLength; + let buffer, i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + for (i = 0; i < 4; ++i) { + buffer[bufferLength + i] = 0; + } + this.bufferLength += 4; + } else { + const input = this.input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; + } + } + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + for (; i < 5; ++i) { + input[i] = 0x21 + 84; + } + this.eof = true; + } + let t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xff; + t >>= 8; + } + } + } +} + +;// ./src/core/ascii_hex_stream.js + +class AsciiHexStream extends DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.5; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.firstDigit = -1; + } + readBlock() { + const UPSTREAM_BLOCK_SIZE = 8000; + const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + const maxDecodeLength = bytes.length + 1 >> 1; + const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + let bufferLength = this.bufferLength; + let firstDigit = this.firstDigit; + for (const ch of bytes) { + let digit; + if (ch >= 0x30 && ch <= 0x39) { + digit = ch & 0x0f; + } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + digit = (ch & 0x0f) + 9; + } else if (ch === 0x3e) { + this.eof = true; + break; + } else { + continue; + } + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = firstDigit << 4 | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + } +} + +;// ./src/core/ccitt.js + +const ccittEOL = -2; +const ccittEOF = -1; +const twoDimPass = 0; +const twoDimHoriz = 1; +const twoDimVert0 = 2; +const twoDimVertR1 = 3; +const twoDimVertL1 = 4; +const twoDimVertR2 = 5; +const twoDimVertL2 = 6; +const twoDimVertR3 = 7; +const twoDimVertL3 = 8; +const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]]; +const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]]; +const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]]; +const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]]; +const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]]; +const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]; +class CCITTFaxDecoder { + constructor(source, options = {}) { + if (typeof source?.next !== "function") { + throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); + } + this.source = source; + this.eof = false; + this.encoding = options.K || 0; + this.eoline = options.EndOfLine || false; + this.byteAlign = options.EncodedByteAlign || false; + this.columns = options.Columns || 1728; + this.rows = options.Rows || 0; + this.eoblock = options.EndOfBlock ?? true; + this.black = options.BlackIs1 || false; + this.codingLine = new Uint32Array(this.columns + 1); + this.refLine = new Uint32Array(this.columns + 2); + this.codingLine[0] = this.columns; + this.codingPos = 0; + this.row = 0; + this.nextLine2D = this.encoding < 0; + this.inputBits = 0; + this.inputBuf = 0; + this.outputBits = 0; + this.rowsDone = false; + let code1; + while ((code1 = this._lookBits(12)) === 0) { + this._eatBits(1); + } + if (code1 === 1) { + this._eatBits(12); + } + if (this.encoding > 0) { + this.nextLine2D = !this._lookBits(1); + this._eatBits(1); + } + } + readNextChar() { + if (this.eof) { + return -1; + } + const refLine = this.refLine; + const codingLine = this.codingLine; + const columns = this.columns; + let refPos, blackPixels, bits, i; + if (this.outputBits === 0) { + if (this.rowsDone) { + this.eof = true; + } + if (this.eof) { + return -1; + } + this.err = false; + let code1, code2, code3; + if (this.nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; + this.codingPos = 0; + refPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = this._getTwoDimCode(); + switch (code1) { + case twoDimPass: + this._addPixels(refLine[refPos + 1], blackPixels); + if (refLine[refPos + 1] < columns) { + refPos += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + if (codingLine[this.codingPos] < columns) { + this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + break; + case twoDimVertR3: + this._addPixels(refLine[refPos] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR2: + this._addPixels(refLine[refPos] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR1: + this._addPixels(refLine[refPos] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVert0: + this._addPixels(refLine[refPos], blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL3: + this._addPixelsNeg(refLine[refPos] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL2: + this._addPixelsNeg(refLine[refPos] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL1: + this._addPixelsNeg(refLine[refPos] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case ccittEOF: + this._addPixels(columns, 0); + this.eof = true; + break; + default: + info("bad 2d code"); + this._addPixels(columns, 0); + this.err = true; + } + } + } else { + codingLine[0] = 0; + this.codingPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = 0; + if (blackPixels) { + do { + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + blackPixels ^= 1; + } + } + let gotEOL = false; + if (this.byteAlign) { + this.inputBits &= ~7; + } + if (!this.eoblock && this.row === this.rows - 1) { + this.rowsDone = true; + } else { + code1 = this._lookBits(12); + if (this.eoline) { + while (code1 !== ccittEOF && code1 !== 1) { + this._eatBits(1); + code1 = this._lookBits(12); + } + } else { + while (code1 === 0) { + this._eatBits(1); + code1 = this._lookBits(12); + } + } + if (code1 === 1) { + this._eatBits(12); + gotEOL = true; + } else if (code1 === ccittEOF) { + this.eof = true; + } + } + if (!this.eof && this.encoding > 0 && !this.rowsDone) { + this.nextLine2D = !this._lookBits(1); + this._eatBits(1); + } + if (this.eoblock && gotEOL && this.byteAlign) { + code1 = this._lookBits(12); + if (code1 === 1) { + this._eatBits(12); + if (this.encoding > 0) { + this._lookBits(1); + this._eatBits(1); + } + if (this.encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = this._lookBits(12); + if (code1 !== 1) { + info("bad rtc code: " + code1); + } + this._eatBits(12); + if (this.encoding > 0) { + this._lookBits(1); + this._eatBits(1); + } + } + } + this.eof = true; + } + } else if (this.err && this.eoline) { + while (true) { + code1 = this._lookBits(13); + if (code1 === ccittEOF) { + this.eof = true; + return -1; + } + if (code1 >> 1 === 1) { + break; + } + this._eatBits(1); + } + this._eatBits(12); + if (this.encoding > 0) { + this._eatBits(1); + this.nextLine2D = !(code1 & 1); + } + } + this.outputBits = codingLine[0] > 0 ? codingLine[this.codingPos = 0] : codingLine[this.codingPos = 1]; + this.row++; + } + let c; + if (this.outputBits >= 8) { + c = this.codingPos & 1 ? 0 : 0xff; + this.outputBits -= 8; + if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } + } else { + bits = 8; + c = 0; + do { + if (typeof this.outputBits !== "number") { + throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.'); + } + if (this.outputBits > bits) { + c <<= bits; + if (!(this.codingPos & 1)) { + c |= 0xff >> 8 - bits; + } + this.outputBits -= bits; + bits = 0; + } else { + c <<= this.outputBits; + if (!(this.codingPos & 1)) { + c |= 0xff >> 8 - this.outputBits; + } + bits -= this.outputBits; + this.outputBits = 0; + if (codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } else if (bits > 0) { + c <<= bits; + bits = 0; + } + } + } while (bits); + } + if (this.black) { + c ^= 0xff; + } + return c; + } + _addPixels(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _addPixelsNeg(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } else if (a1 < codingLine[codingPos]) { + if (a1 < 0) { + info("invalid code"); + this.err = true; + a1 = 0; + } + while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { + --codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _findTableCode(start, end, table, limit) { + const limitValue = limit || 0; + for (let i = start; i <= end; ++i) { + let code = this._lookBits(i); + if (code === ccittEOF) { + return [true, 1, false]; + } + if (i < end) { + code <<= end - i; + } + if (!limitValue || code >= limitValue) { + const p = table[code - limitValue]; + if (p[0] === i) { + this._eatBits(i); + return [true, p[1], true]; + } + } + } + return [false, 0, false]; + } + _getTwoDimCode() { + let code = 0; + let p; + if (this.eoblock) { + code = this._lookBits(7); + p = twoDimTable[code]; + if (p?.[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + const result = this._findTableCode(1, 7, twoDimTable); + if (result[0] && result[2]) { + return result[1]; + } + } + info("Bad two dim code"); + return ccittEOF; + } + _getWhiteCode() { + let code = 0; + let p; + if (this.eoblock) { + code = this._lookBits(12); + if (code === ccittEOF) { + return 1; + } + p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3]; + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + let result = this._findTableCode(1, 9, whiteTable2); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(11, 12, whiteTable1); + if (result[0]) { + return result[1]; + } + } + info("bad white code"); + this._eatBits(1); + return 1; + } + _getBlackCode() { + let code, p; + if (this.eoblock) { + code = this._lookBits(13); + if (code === ccittEOF) { + return 1; + } + if (code >> 7 === 0) { + p = blackTable1[code]; + } else if (code >> 9 === 0 && code >> 7 !== 0) { + p = blackTable2[(code >> 1) - 64]; + } else { + p = blackTable3[code >> 7]; + } + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + let result = this._findTableCode(2, 6, blackTable3); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(7, 12, blackTable2, 64); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(10, 13, blackTable1); + if (result[0]) { + return result[1]; + } + } + info("bad black code"); + this._eatBits(1); + return 1; + } + _lookBits(n) { + let c; + while (this.inputBits < n) { + if ((c = this.source.next()) === -1) { + if (this.inputBits === 0) { + return ccittEOF; + } + return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; + } + this.inputBuf = this.inputBuf << 8 | c; + this.inputBits += 8; + } + return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; + } + _eatBits(n) { + if ((this.inputBits -= n) < 0) { + this.inputBits = 0; + } + } +} + +;// ./src/core/ccitt_stream.js + + + +class CCITTFaxStream extends DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + if (!(params instanceof Dict)) { + params = Dict.empty; + } + const source = { + next() { + return str.getByte(); + } + }; + this.ccittFaxDecoder = new CCITTFaxDecoder(source, { + K: params.get("K"), + EndOfLine: params.get("EndOfLine"), + EncodedByteAlign: params.get("EncodedByteAlign"), + Columns: params.get("Columns"), + Rows: params.get("Rows"), + EndOfBlock: params.get("EndOfBlock"), + BlackIs1: params.get("BlackIs1") + }); + } + readBlock() { + while (!this.eof) { + const c = this.ccittFaxDecoder.readNextChar(); + if (c === -1) { + this.eof = true; + return; + } + this.ensureBuffer(this.bufferLength + 1); + this.buffer[this.bufferLength++] = c; + } + } +} + +;// ./src/core/flate_stream.js + + + +const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); +const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); +const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9]; +const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; +class FlateStream extends DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + const cmf = str.getByte(); + const flg = str.getByte(); + if (cmf === -1 || flg === -1) { + throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); + } + if ((cmf & 0x0f) !== 0x08) { + throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); + } + if (((cmf << 8) + flg) % 31 !== 0) { + throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); + } + if (flg & 0x20) { + throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); + } + this.codeSize = 0; + this.codeBuf = 0; + } + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + return data?.subarray(0, length) || this.getBytes(length); + } + async asyncGetBytes() { + this.str.reset(); + const bytes = this.str.getBytes(); + try { + const { + readable, + writable + } = new DecompressionStream("deflate"); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + const chunks = []; + let totalLength = 0; + for await (const chunk of readable) { + chunks.push(chunk); + totalLength += chunk.byteLength; + } + const data = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.byteLength; + } + return data; + } catch { + this.str = new Stream(bytes, 2, bytes.length, this.str.dict); + this.reset(); + return null; + } + } + get isAsync() { + return true; + } + getBits(bits) { + const str = this.str; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { + throw new FormatError("Bad encoding in flate stream"); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & (1 << bits) - 1; + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + } + getCode(table) { + const str = this.str; + const codes = table[0]; + const maxLen = table[1]; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + break; + } + codeBuf |= b << codeSize; + codeSize += 8; + } + const code = codes[codeBuf & (1 << maxLen) - 1]; + const codeLen = code >> 16; + const codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + throw new FormatError("Bad encoding in flate stream"); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; + } + generateHuffmanTable(lengths) { + const n = lengths.length; + let maxLen = 0; + let i; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + const size = 1 << maxLen; + const codes = new Int32Array(size); + for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { + for (let val = 0; val < n; ++val) { + if (lengths[val] === len) { + let code2 = 0; + let t = code; + for (i = 0; i < len; ++i) { + code2 = code2 << 1 | t & 1; + t >>= 1; + } + for (i = code2; i < size; i += skip) { + codes[i] = len << 16 | val; + } + ++code; + } + } + } + return [codes, maxLen]; + } + #endsStreamOnError(err) { + info(err); + this.eof = true; + } + readBlock() { + let buffer, hdr, len; + const str = this.str; + try { + hdr = this.getBits(3); + } catch (ex) { + this.#endsStreamOnError(ex.message); + return; + } + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + let b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let blockLen = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let check = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { + throw new FormatError("Bad uncompressed block length in flate stream"); + } + this.codeBuf = 0; + this.codeSize = 0; + const bufferLength = this.bufferLength, + end = bufferLength + blockLen; + buffer = this.ensureBuffer(end); + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; + } + } else { + const block = str.getBytes(blockLen); + buffer.set(block, bufferLength); + if (block.length < blockLen) { + this.eof = true; + } + } + return; + } + let litCodeTable; + let distCodeTable; + if (hdr === 1) { + litCodeTable = fixedLitCodeTab; + distCodeTable = fixedDistCodeTab; + } else if (hdr === 2) { + const numLitCodes = this.getBits(5) + 257; + const numDistCodes = this.getBits(5) + 1; + const numCodeLenCodes = this.getBits(4) + 4; + const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); + let i; + for (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); + } + const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + len = 0; + i = 0; + const codes = numLitCodes + numDistCodes; + const codeLengths = new Uint8Array(codes); + let bitsLength, bitsOffset, what; + while (i < codes) { + const code = this.getCode(codeLenCodeTab); + if (code === 16) { + bitsLength = 2; + bitsOffset = 3; + what = len; + } else if (code === 17) { + bitsLength = 3; + bitsOffset = 3; + what = len = 0; + } else if (code === 18) { + bitsLength = 7; + bitsOffset = 11; + what = len = 0; + } else { + codeLengths[i++] = len = code; + continue; + } + let repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); + distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); + } else { + throw new FormatError("Unknown block type in flate stream"); + } + buffer = this.buffer; + let limit = buffer ? buffer.length : 0; + let pos = this.bufferLength; + while (true) { + let code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } + if (code1 === 256) { + this.bufferLength = pos; + return; + } + code1 -= 257; + code1 = lengthDecode[code1]; + let code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + const dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (let k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; + } + } + } +} + +;// ./src/core/arithmetic_decoder.js +const QeTable = [{ + qe: 0x5601, + nmps: 1, + nlps: 1, + switchFlag: 1 +}, { + qe: 0x3401, + nmps: 2, + nlps: 6, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 3, + nlps: 9, + switchFlag: 0 +}, { + qe: 0x0ac1, + nmps: 4, + nlps: 12, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 5, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 38, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 7, + nlps: 6, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 8, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 9, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 10, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 11, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 12, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x1c01, + nmps: 13, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 29, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 15, + nlps: 14, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 16, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x5101, + nmps: 17, + nlps: 15, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 18, + nlps: 16, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 19, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x3401, + nmps: 20, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 21, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2801, + nmps: 22, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 23, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x2201, + nmps: 24, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x1c01, + nmps: 25, + nlps: 22, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 26, + nlps: 23, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 27, + nlps: 24, + switchFlag: 0 +}, { + qe: 0x1401, + nmps: 28, + nlps: 25, + switchFlag: 0 +}, { + qe: 0x1201, + nmps: 29, + nlps: 26, + switchFlag: 0 +}, { + qe: 0x1101, + nmps: 30, + nlps: 27, + switchFlag: 0 +}, { + qe: 0x0ac1, + nmps: 31, + nlps: 28, + switchFlag: 0 +}, { + qe: 0x09c1, + nmps: 32, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x08a1, + nmps: 33, + nlps: 30, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 34, + nlps: 31, + switchFlag: 0 +}, { + qe: 0x0441, + nmps: 35, + nlps: 32, + switchFlag: 0 +}, { + qe: 0x02a1, + nmps: 36, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 37, + nlps: 34, + switchFlag: 0 +}, { + qe: 0x0141, + nmps: 38, + nlps: 35, + switchFlag: 0 +}, { + qe: 0x0111, + nmps: 39, + nlps: 36, + switchFlag: 0 +}, { + qe: 0x0085, + nmps: 40, + nlps: 37, + switchFlag: 0 +}, { + qe: 0x0049, + nmps: 41, + nlps: 38, + switchFlag: 0 +}, { + qe: 0x0025, + nmps: 42, + nlps: 39, + switchFlag: 0 +}, { + qe: 0x0015, + nmps: 43, + nlps: 40, + switchFlag: 0 +}, { + qe: 0x0009, + nmps: 44, + nlps: 41, + switchFlag: 0 +}, { + qe: 0x0005, + nmps: 45, + nlps: 42, + switchFlag: 0 +}, { + qe: 0x0001, + nmps: 45, + nlps: 43, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 46, + nlps: 46, + switchFlag: 0 +}]; +class ArithmeticDecoder { + constructor(data, start, end) { + this.data = data; + this.bp = start; + this.dataEnd = end; + this.chigh = data[start]; + this.clow = 0; + this.byteIn(); + this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f; + this.clow = this.clow << 7 & 0xffff; + this.ct -= 7; + this.a = 0x8000; + } + byteIn() { + const data = this.data; + let bp = this.bp; + if (data[bp] === 0xff) { + if (data[bp + 1] > 0x8f) { + this.clow += 0xff00; + this.ct = 8; + } else { + bp++; + this.clow += data[bp] << 9; + this.ct = 7; + this.bp = bp; + } + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; + this.ct = 8; + this.bp = bp; + } + if (this.clow > 0xffff) { + this.chigh += this.clow >> 16; + this.clow &= 0xffff; + } + } + readBit(contexts, pos) { + let cx_index = contexts[pos] >> 1, + cx_mps = contexts[pos] & 1; + const qeTableIcx = QeTable[cx_index]; + const qeIcx = qeTableIcx.qe; + let d; + let a = this.a - qeIcx; + if (this.chigh < qeIcx) { + if (a < qeIcx) { + a = qeIcx; + d = cx_mps; + cx_index = qeTableIcx.nmps; + } else { + a = qeIcx; + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } + } else { + this.chigh -= qeIcx; + if ((a & 0x8000) !== 0) { + this.a = a; + return cx_mps; + } + if (a < qeIcx) { + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } else { + d = cx_mps; + cx_index = qeTableIcx.nmps; + } + } + do { + if (this.ct === 0) { + this.byteIn(); + } + a <<= 1; + this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1; + this.clow = this.clow << 1 & 0xffff; + this.ct--; + } while ((a & 0x8000) === 0); + this.a = a; + contexts[pos] = cx_index << 1 | cx_mps; + return d; + } +} + +;// ./src/core/jbig2.js + + + + +class Jbig2Error extends BaseException { + constructor(msg) { + super(msg, "Jbig2Error"); + } +} +class ContextCache { + getContexts(id) { + if (id in this) { + return this[id]; + } + return this[id] = new Int8Array(1 << 16); + } +} +class DecodingContext { + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + } + get decoder() { + const decoder = new ArithmeticDecoder(this.data, this.start, this.end); + return shadow(this, "decoder", decoder); + } + get contextCache() { + const cache = new ContextCache(); + return shadow(this, "contextCache", cache); + } +} +function decodeInteger(contextCache, procedure, decoder) { + const contexts = contextCache.getContexts(procedure); + let prev = 1; + function readBits(length) { + let v = 0; + for (let i = 0; i < length; i++) { + const bit = decoder.readBit(contexts, prev); + prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; + v = v << 1 | bit; + } + return v >>> 0; + } + const sign = readBits(1); + const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); + let signedValue; + if (sign === 0) { + signedValue = value; + } else if (value > 0) { + signedValue = -value; + } + if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) { + return signedValue; + } + return null; +} +function decodeIAID(contextCache, decoder, codeLength) { + const contexts = contextCache.getContexts("IAID"); + let prev = 1; + for (let i = 0; i < codeLength; i++) { + const bit = decoder.readBit(contexts, prev); + prev = prev << 1 | bit; + } + if (codeLength < 31) { + return prev & (1 << codeLength) - 1; + } + return prev & 0x7fffffff; +} +const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension"]; +const CodingTemplates = [[{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: 2, + y: -1 +}, { + x: -4, + y: 0 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: 2, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: 2, + y: -1 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -3, + y: -1 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: -4, + y: 0 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}]]; +const RefinementTemplates = [{ + coding: [{ + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }], + reference: [{ + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }, { + x: 0, + y: 0 + }, { + x: 1, + y: 0 + }, { + x: -1, + y: 1 + }, { + x: 0, + y: 1 + }, { + x: 1, + y: 1 + }] +}, { + coding: [{ + x: -1, + y: -1 + }, { + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }], + reference: [{ + x: 0, + y: -1 + }, { + x: -1, + y: 0 + }, { + x: 0, + y: 0 + }, { + x: 1, + y: 0 + }, { + x: 0, + y: 1 + }, { + x: 1, + y: 1 + }] +}]; +const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195]; +const RefinementReusedContexts = [0x0020, 0x0008]; +function decodeBitmapTemplate0(width, height, decodingContext) { + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GB"); + const bitmap = []; + let contextLabel, i, j, pixel, row, row1, row2; + const OLD_PIXEL_MASK = 0x7bf7; + for (i = 0; i < height; i++) { + row = bitmap[i] = new Uint8Array(width); + row1 = i < 1 ? row : bitmap[i - 1]; + row2 = i < 2 ? row : bitmap[i - 2]; + contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; + for (j = 0; j < width; j++) { + row[j] = pixel = decoder.readBit(contexts, contextLabel); + contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; + } + } + return bitmap; +} +function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { + if (mmr) { + const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); + return decodeMMRBitmap(input, width, height, false); + } + if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { + return decodeBitmapTemplate0(width, height, decodingContext); + } + const useskip = !!skip; + const template = CodingTemplates[templateIndex].concat(at); + template.sort(function (a, b) { + return a.y - b.y || a.x - b.x; + }); + const templateLength = template.length; + const templateX = new Int8Array(templateLength); + const templateY = new Int8Array(templateLength); + const changingTemplateEntries = []; + let reuseMask = 0, + minX = 0, + maxX = 0, + minY = 0; + let c, k; + for (k = 0; k < templateLength; k++) { + templateX[k] = template[k].x; + templateY[k] = template[k].y; + minX = Math.min(minX, template[k].x); + maxX = Math.max(maxX, template[k].x); + minY = Math.min(minY, template[k].y); + if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { + reuseMask |= 1 << templateLength - 1 - k; + } else { + changingTemplateEntries.push(k); + } + } + const changingEntriesLength = changingTemplateEntries.length; + const changingTemplateX = new Int8Array(changingEntriesLength); + const changingTemplateY = new Int8Array(changingEntriesLength); + const changingTemplateBit = new Uint16Array(changingEntriesLength); + for (c = 0; c < changingEntriesLength; c++) { + k = changingTemplateEntries[c]; + changingTemplateX[c] = template[k].x; + changingTemplateY[c] = template[k].y; + changingTemplateBit[c] = 1 << templateLength - 1 - k; + } + const sbb_left = -minX; + const sbb_top = -minY; + const sbb_right = width - maxX; + const pseudoPixelContext = ReusedContexts[templateIndex]; + let row = new Uint8Array(width); + const bitmap = []; + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GB"); + let ltp = 0, + j, + i0, + j0, + contextLabel = 0, + bit, + shift; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + bitmap.push(row); + continue; + } + } + row = new Uint8Array(row); + bitmap.push(row); + for (j = 0; j < width; j++) { + if (useskip && skip[i][j]) { + row[j] = 0; + continue; + } + if (j >= sbb_left && j < sbb_right && i >= sbb_top) { + contextLabel = contextLabel << 1 & reuseMask; + for (k = 0; k < changingEntriesLength; k++) { + i0 = i + changingTemplateY[k]; + j0 = j + changingTemplateX[k]; + bit = bitmap[i0][j0]; + if (bit) { + bit = changingTemplateBit[k]; + contextLabel |= bit; + } + } + } else { + contextLabel = 0; + shift = templateLength - 1; + for (k = 0; k < templateLength; k++, shift--) { + j0 = j + templateX[k]; + if (j0 >= 0 && j0 < width) { + i0 = i + templateY[k]; + if (i0 >= 0) { + bit = bitmap[i0][j0]; + if (bit) { + contextLabel |= bit << shift; + } + } + } + } + } + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; +} +function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { + let codingTemplate = RefinementTemplates[templateIndex].coding; + if (templateIndex === 0) { + codingTemplate = codingTemplate.concat([at[0]]); + } + const codingTemplateLength = codingTemplate.length; + const codingTemplateX = new Int32Array(codingTemplateLength); + const codingTemplateY = new Int32Array(codingTemplateLength); + let k; + for (k = 0; k < codingTemplateLength; k++) { + codingTemplateX[k] = codingTemplate[k].x; + codingTemplateY[k] = codingTemplate[k].y; + } + let referenceTemplate = RefinementTemplates[templateIndex].reference; + if (templateIndex === 0) { + referenceTemplate = referenceTemplate.concat([at[1]]); + } + const referenceTemplateLength = referenceTemplate.length; + const referenceTemplateX = new Int32Array(referenceTemplateLength); + const referenceTemplateY = new Int32Array(referenceTemplateLength); + for (k = 0; k < referenceTemplateLength; k++) { + referenceTemplateX[k] = referenceTemplate[k].x; + referenceTemplateY[k] = referenceTemplate[k].y; + } + const referenceWidth = referenceBitmap[0].length; + const referenceHeight = referenceBitmap.length; + const pseudoPixelContext = RefinementReusedContexts[templateIndex]; + const bitmap = []; + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GR"); + let ltp = 0; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + throw new Jbig2Error("prediction is not supported"); + } + } + const row = new Uint8Array(width); + bitmap.push(row); + for (let j = 0; j < width; j++) { + let i0, j0; + let contextLabel = 0; + for (k = 0; k < codingTemplateLength; k++) { + i0 = i + codingTemplateY[k]; + j0 = j + codingTemplateX[k]; + if (i0 < 0 || j0 < 0 || j0 >= width) { + contextLabel <<= 1; + } else { + contextLabel = contextLabel << 1 | bitmap[i0][j0]; + } + } + for (k = 0; k < referenceTemplateLength; k++) { + i0 = i + referenceTemplateY[k] - offsetY; + j0 = j + referenceTemplateX[k] - offsetX; + if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { + contextLabel <<= 1; + } else { + contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; + } + } + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; +} +function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) { + if (huffman && refinement) { + throw new Jbig2Error("symbol refinement with Huffman is not supported"); + } + const newSymbols = []; + let currentHeight = 0; + let symbolCodeLength = log2(symbols.length + numberOfNewSymbols); + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let tableB1, symbolWidths; + if (huffman) { + tableB1 = getStandardTable(1); + symbolWidths = []; + symbolCodeLength = Math.max(symbolCodeLength, 1); + } + while (newSymbols.length < numberOfNewSymbols) { + const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder); + currentHeight += deltaHeight; + let currentWidth = 0, + totalWidth = 0; + const firstSymbol = huffman ? symbolWidths.length : 0; + while (true) { + const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder); + if (deltaWidth === null) { + break; + } + currentWidth += deltaWidth; + totalWidth += currentWidth; + let bitmap; + if (refinement) { + const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); + if (numberOfInstances > 1) { + bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput); + } else { + const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); + const rdx = decodeInteger(contextCache, "IARDX", decoder); + const rdy = decodeInteger(contextCache, "IARDY", decoder); + const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; + bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); + } + newSymbols.push(bitmap); + } else if (huffman) { + symbolWidths.push(currentWidth); + } else { + bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); + newSymbols.push(bitmap); + } + } + if (huffman && !refinement) { + const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); + huffmanInput.byteAlign(); + let collectiveBitmap; + if (bitmapSize === 0) { + collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight); + } else { + const originalEnd = huffmanInput.end; + const bitmapEnd = huffmanInput.position + bitmapSize; + huffmanInput.end = bitmapEnd; + collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false); + huffmanInput.end = originalEnd; + huffmanInput.position = bitmapEnd; + } + const numberOfSymbolsDecoded = symbolWidths.length; + if (firstSymbol === numberOfSymbolsDecoded - 1) { + newSymbols.push(collectiveBitmap); + } else { + let i, + y, + xMin = 0, + xMax, + bitmapWidth, + symbolBitmap; + for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) { + bitmapWidth = symbolWidths[i]; + xMax = xMin + bitmapWidth; + symbolBitmap = []; + for (y = 0; y < currentHeight; y++) { + symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + newSymbols.push(symbolBitmap); + xMin = xMax; + } + } + } + } + const exportedSymbols = [], + flags = []; + let currentFlag = false, + i, + ii; + const totalSymbolsLength = symbols.length + numberOfNewSymbols; + while (flags.length < totalSymbolsLength) { + let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder); + while (runLength--) { + flags.push(currentFlag); + } + currentFlag = !currentFlag; + } + for (i = 0, ii = symbols.length; i < ii; i++) { + if (flags[i]) { + exportedSymbols.push(symbols[i]); + } + } + for (let j = 0; j < numberOfNewSymbols; i++, j++) { + if (flags[i]) { + exportedSymbols.push(newSymbols[j]); + } + } + return exportedSymbols; +} +function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) { + if (huffman && refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + const bitmap = []; + let i, row; + for (i = 0; i < height; i++) { + row = new Uint8Array(width); + if (defaultPixelValue) { + for (let j = 0; j < width; j++) { + row[j] = defaultPixelValue; + } + } + bitmap.push(row); + } + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder); + let firstS = 0; + i = 0; + while (i < numberOfSymbolInstances) { + const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder); + stripT += deltaT; + const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder); + firstS += deltaFirstS; + let currentS = firstS; + do { + let currentT = 0; + if (stripSize > 1) { + currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder); + } + const t = stripSize * stripT + currentT; + const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength); + const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder)); + let symbolBitmap = inputSymbols[symbolId]; + let symbolWidth = symbolBitmap[0].length; + let symbolHeight = symbolBitmap.length; + if (applyRefinement) { + const rdw = decodeInteger(contextCache, "IARDW", decoder); + const rdh = decodeInteger(contextCache, "IARDH", decoder); + const rdx = decodeInteger(contextCache, "IARDX", decoder); + const rdy = decodeInteger(contextCache, "IARDY", decoder); + symbolWidth += rdw; + symbolHeight += rdh; + symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); + } + let increment = 0; + if (!transposed) { + if (referenceCorner > 1) { + currentS += symbolWidth - 1; + } else { + increment = symbolWidth - 1; + } + } else if (!(referenceCorner & 1)) { + currentS += symbolHeight - 1; + } else { + increment = symbolHeight - 1; + } + const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); + const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); + let s2, t2, symbolRow; + if (transposed) { + for (s2 = 0; s2 < symbolHeight; s2++) { + row = bitmap[offsetS + s2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[s2]; + const maxWidth = Math.min(width - offsetT, symbolWidth); + switch (combinationOperator) { + case 0: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] |= symbolRow[t2]; + } + break; + case 2: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] ^= symbolRow[t2]; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + } else { + for (t2 = 0; t2 < symbolHeight; t2++) { + row = bitmap[offsetT + t2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[t2]; + switch (combinationOperator) { + case 0: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] |= symbolRow[s2]; + } + break; + case 2: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] ^= symbolRow[s2]; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + } + i++; + const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder); + if (deltaS === null) { + break; + } + currentS += increment + deltaS + dsOffset; + } while (true); + } + return bitmap; +} +function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) { + const at = []; + if (!mmr) { + at.push({ + x: -patternWidth, + y: 0 + }); + if (template === 0) { + at.push({ + x: -3, + y: -1 + }, { + x: 2, + y: -2 + }, { + x: -2, + y: -2 + }); + } + } + const collectiveWidth = (maxPatternIndex + 1) * patternWidth; + const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext); + const patterns = []; + for (let i = 0; i <= maxPatternIndex; i++) { + const patternBitmap = []; + const xMin = patternWidth * i; + const xMax = xMin + patternWidth; + for (let y = 0; y < patternHeight; y++) { + patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + patterns.push(patternBitmap); + } + return patterns; +} +function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) { + const skip = null; + if (enableSkip) { + throw new Jbig2Error("skip is not supported"); + } + if (combinationOperator !== 0) { + throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`); + } + const regionBitmap = []; + let i, j, row; + for (i = 0; i < regionHeight; i++) { + row = new Uint8Array(regionWidth); + if (defaultPixelValue) { + for (j = 0; j < regionWidth; j++) { + row[j] = defaultPixelValue; + } + } + regionBitmap.push(row); + } + const numberOfPatterns = patterns.length; + const pattern0 = patterns[0]; + const patternWidth = pattern0[0].length, + patternHeight = pattern0.length; + const bitsPerValue = log2(numberOfPatterns); + const at = []; + if (!mmr) { + at.push({ + x: template <= 1 ? 3 : 2, + y: -1 + }); + if (template === 0) { + at.push({ + x: -3, + y: -1 + }, { + x: 2, + y: -2 + }, { + x: -2, + y: -2 + }); + } + } + const grayScaleBitPlanes = []; + let mmrInput, bitmap; + if (mmr) { + mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); + } + for (i = bitsPerValue - 1; i >= 0; i--) { + if (mmr) { + bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true); + } else { + bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext); + } + grayScaleBitPlanes[i] = bitmap; + } + let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow; + for (mg = 0; mg < gridHeight; mg++) { + for (ng = 0; ng < gridWidth; ng++) { + bit = 0; + patternIndex = 0; + for (j = bitsPerValue - 1; j >= 0; j--) { + bit ^= grayScaleBitPlanes[j][mg][ng]; + patternIndex |= bit << j; + } + patternBitmap = patterns[patternIndex]; + x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8; + y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8; + if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) { + for (i = 0; i < patternHeight; i++) { + regionRow = regionBitmap[y + i]; + patternRow = patternBitmap[i]; + for (j = 0; j < patternWidth; j++) { + regionRow[x + j] |= patternRow[j]; + } + } + } else { + let regionX, regionY; + for (i = 0; i < patternHeight; i++) { + regionY = y + i; + if (regionY < 0 || regionY >= regionHeight) { + continue; + } + regionRow = regionBitmap[regionY]; + patternRow = patternBitmap[i]; + for (j = 0; j < patternWidth; j++) { + regionX = x + j; + if (regionX >= 0 && regionX < regionWidth) { + regionRow[regionX] |= patternRow[j]; + } + } + } + } + } + } + return regionBitmap; +} +function readSegmentHeader(data, start) { + const segmentHeader = {}; + segmentHeader.number = readUint32(data, start); + const flags = data[start + 4]; + const segmentType = flags & 0x3f; + if (!SegmentTypes[segmentType]) { + throw new Jbig2Error("invalid segment type: " + segmentType); + } + segmentHeader.type = segmentType; + segmentHeader.typeName = SegmentTypes[segmentType]; + segmentHeader.deferredNonRetain = !!(flags & 0x80); + const pageAssociationFieldSize = !!(flags & 0x40); + const referredFlags = data[start + 5]; + let referredToCount = referredFlags >> 5 & 7; + const retainBits = [referredFlags & 31]; + let position = start + 6; + if (referredFlags === 7) { + referredToCount = readUint32(data, position - 1) & 0x1fffffff; + position += 3; + let bytes = referredToCount + 7 >> 3; + retainBits[0] = data[position++]; + while (--bytes > 0) { + retainBits.push(data[position++]); + } + } else if (referredFlags === 5 || referredFlags === 6) { + throw new Jbig2Error("invalid referred-to flags"); + } + segmentHeader.retainBits = retainBits; + let referredToSegmentNumberSize = 4; + if (segmentHeader.number <= 256) { + referredToSegmentNumberSize = 1; + } else if (segmentHeader.number <= 65536) { + referredToSegmentNumberSize = 2; + } + const referredTo = []; + let i, ii; + for (i = 0; i < referredToCount; i++) { + let number; + if (referredToSegmentNumberSize === 1) { + number = data[position]; + } else if (referredToSegmentNumberSize === 2) { + number = readUint16(data, position); + } else { + number = readUint32(data, position); + } + referredTo.push(number); + position += referredToSegmentNumberSize; + } + segmentHeader.referredTo = referredTo; + if (!pageAssociationFieldSize) { + segmentHeader.pageAssociation = data[position++]; + } else { + segmentHeader.pageAssociation = readUint32(data, position); + position += 4; + } + segmentHeader.length = readUint32(data, position); + position += 4; + if (segmentHeader.length === 0xffffffff) { + if (segmentType === 38) { + const genericRegionInfo = readRegionSegmentInformation(data, position); + const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; + const genericRegionMmr = !!(genericRegionSegmentFlags & 1); + const searchPatternLength = 6; + const searchPattern = new Uint8Array(searchPatternLength); + if (!genericRegionMmr) { + searchPattern[0] = 0xff; + searchPattern[1] = 0xac; + } + searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff; + searchPattern[3] = genericRegionInfo.height >> 16 & 0xff; + searchPattern[4] = genericRegionInfo.height >> 8 & 0xff; + searchPattern[5] = genericRegionInfo.height & 0xff; + for (i = position, ii = data.length; i < ii; i++) { + let j = 0; + while (j < searchPatternLength && searchPattern[j] === data[i + j]) { + j++; + } + if (j === searchPatternLength) { + segmentHeader.length = i + searchPatternLength; + break; + } + } + if (segmentHeader.length === 0xffffffff) { + throw new Jbig2Error("segment end was not found"); + } + } else { + throw new Jbig2Error("invalid unknown segment length"); + } + } + segmentHeader.headerEnd = position; + return segmentHeader; +} +function readSegments(header, data, start, end) { + const segments = []; + let position = start; + while (position < end) { + const segmentHeader = readSegmentHeader(data, position); + position = segmentHeader.headerEnd; + const segment = { + header: segmentHeader, + data + }; + if (!header.randomAccess) { + segment.start = position; + position += segmentHeader.length; + segment.end = position; + } + segments.push(segment); + if (segmentHeader.type === 51) { + break; + } + } + if (header.randomAccess) { + for (let i = 0, ii = segments.length; i < ii; i++) { + segments[i].start = position; + position += segments[i].header.length; + segments[i].end = position; + } + } + return segments; +} +function readRegionSegmentInformation(data, start) { + return { + width: readUint32(data, start), + height: readUint32(data, start + 4), + x: readUint32(data, start + 8), + y: readUint32(data, start + 12), + combinationOperator: data[start + 16] & 7 + }; +} +const RegionSegmentInformationFieldLength = 17; +function processSegment(segment, visitor) { + const header = segment.header; + const data = segment.data, + end = segment.end; + let position = segment.start; + let args, at, i, atLength; + switch (header.type) { + case 0: + const dictionary = {}; + const dictionaryFlags = readUint16(data, position); + dictionary.huffman = !!(dictionaryFlags & 1); + dictionary.refinement = !!(dictionaryFlags & 2); + dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; + dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; + dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; + dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; + dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); + dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); + dictionary.template = dictionaryFlags >> 10 & 3; + dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; + position += 2; + if (!dictionary.huffman) { + atLength = dictionary.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + dictionary.at = at; + } + if (dictionary.refinement && !dictionary.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + dictionary.refinementAt = at; + } + dictionary.numberOfExportedSymbols = readUint32(data, position); + position += 4; + dictionary.numberOfNewSymbols = readUint32(data, position); + position += 4; + args = [dictionary, header.number, header.referredTo, data, position, end]; + break; + case 6: + case 7: + const textRegion = {}; + textRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const textRegionSegmentFlags = readUint16(data, position); + position += 2; + textRegion.huffman = !!(textRegionSegmentFlags & 1); + textRegion.refinement = !!(textRegionSegmentFlags & 2); + textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3; + textRegion.stripSize = 1 << textRegion.logStripSize; + textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; + textRegion.transposed = !!(textRegionSegmentFlags & 64); + textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; + textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; + textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; + textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; + if (textRegion.huffman) { + const textRegionHuffmanFlags = readUint16(data, position); + position += 2; + textRegion.huffmanFS = textRegionHuffmanFlags & 3; + textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; + textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; + textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; + textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; + textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; + textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; + textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000); + } + if (textRegion.refinement && !textRegion.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + textRegion.refinementAt = at; + } + textRegion.numberOfSymbolInstances = readUint32(data, position); + position += 4; + args = [textRegion, header.referredTo, data, position, end]; + break; + case 16: + const patternDictionary = {}; + const patternDictionaryFlags = data[position++]; + patternDictionary.mmr = !!(patternDictionaryFlags & 1); + patternDictionary.template = patternDictionaryFlags >> 1 & 3; + patternDictionary.patternWidth = data[position++]; + patternDictionary.patternHeight = data[position++]; + patternDictionary.maxPatternIndex = readUint32(data, position); + position += 4; + args = [patternDictionary, header.number, data, position, end]; + break; + case 22: + case 23: + const halftoneRegion = {}; + halftoneRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const halftoneRegionFlags = data[position++]; + halftoneRegion.mmr = !!(halftoneRegionFlags & 1); + halftoneRegion.template = halftoneRegionFlags >> 1 & 3; + halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8); + halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7; + halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1; + halftoneRegion.gridWidth = readUint32(data, position); + position += 4; + halftoneRegion.gridHeight = readUint32(data, position); + position += 4; + halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridVectorX = readUint16(data, position); + position += 2; + halftoneRegion.gridVectorY = readUint16(data, position); + position += 2; + args = [halftoneRegion, header.referredTo, data, position, end]; + break; + case 38: + case 39: + const genericRegion = {}; + genericRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const genericRegionSegmentFlags = data[position++]; + genericRegion.mmr = !!(genericRegionSegmentFlags & 1); + genericRegion.template = genericRegionSegmentFlags >> 1 & 3; + genericRegion.prediction = !!(genericRegionSegmentFlags & 8); + if (!genericRegion.mmr) { + atLength = genericRegion.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + genericRegion.at = at; + } + args = [genericRegion, data, position, end]; + break; + case 48: + const pageInfo = { + width: readUint32(data, position), + height: readUint32(data, position + 4), + resolutionX: readUint32(data, position + 8), + resolutionY: readUint32(data, position + 12) + }; + if (pageInfo.height === 0xffffffff) { + delete pageInfo.height; + } + const pageSegmentFlags = data[position + 16]; + readUint16(data, position + 17); + pageInfo.lossless = !!(pageSegmentFlags & 1); + pageInfo.refinement = !!(pageSegmentFlags & 2); + pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; + pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; + pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); + pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); + args = [pageInfo]; + break; + case 49: + break; + case 50: + break; + case 51: + break; + case 53: + args = [header.number, data, position, end]; + break; + case 62: + break; + default: + throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`); + } + const callbackName = "on" + header.typeName; + if (callbackName in visitor) { + visitor[callbackName].apply(visitor, args); + } +} +function processSegments(segments, visitor) { + for (let i = 0, ii = segments.length; i < ii; i++) { + processSegment(segments[i], visitor); + } +} +function parseJbig2Chunks(chunks) { + const visitor = new SimpleSegmentVisitor(); + for (let i = 0, ii = chunks.length; i < ii; i++) { + const chunk = chunks[i]; + const segments = readSegments({}, chunk.data, chunk.start, chunk.end); + processSegments(segments, visitor); + } + return visitor.buffer; +} +function parseJbig2(data) { + throw new Error("Not implemented: parseJbig2"); +} +class SimpleSegmentVisitor { + onPageInformation(info) { + this.currentPageInfo = info; + const rowSize = info.width + 7 >> 3; + const buffer = new Uint8ClampedArray(rowSize * info.height); + if (info.defaultPixelValue) { + buffer.fill(0xff); + } + this.buffer = buffer; + } + drawBitmap(regionInfo, bitmap) { + const pageInfo = this.currentPageInfo; + const width = regionInfo.width, + height = regionInfo.height; + const rowSize = pageInfo.width + 7 >> 3; + const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; + const buffer = this.buffer; + const mask0 = 128 >> (regionInfo.x & 7); + let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); + let i, j, mask, offset; + switch (combinationOperator) { + case 0: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] |= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + case 2: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] ^= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + onImmediateGenericRegion(region, data, start, end) { + const regionInfo = region.info; + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessGenericRegion() { + this.onImmediateGenericRegion(...arguments); + } + onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { + let huffmanTables, huffmanInput; + if (dictionary.huffman) { + huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables); + huffmanInput = new Reader(data, start, end); + } + let symbols = this.symbols; + if (!symbols) { + this.symbols = symbols = {}; + } + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } + } + const decodingContext = new DecodingContext(data, start, end); + symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput); + } + onImmediateTextRegion(region, referredSegments, data, start, end) { + const regionInfo = region.info; + let huffmanTables, huffmanInput; + const symbols = this.symbols; + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } + } + const symbolCodeLength = log2(inputSymbols.length); + if (region.huffman) { + huffmanInput = new Reader(data, start, end); + huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput); + } + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessTextRegion() { + this.onImmediateTextRegion(...arguments); + } + onPatternDictionary(dictionary, currentSegment, data, start, end) { + let patterns = this.patterns; + if (!patterns) { + this.patterns = patterns = {}; + } + const decodingContext = new DecodingContext(data, start, end); + patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext); + } + onImmediateHalftoneRegion(region, referredSegments, data, start, end) { + const patterns = this.patterns[referredSegments[0]]; + const regionInfo = region.info; + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessHalftoneRegion() { + this.onImmediateHalftoneRegion(...arguments); + } + onTables(currentSegment, data, start, end) { + let customTables = this.customTables; + if (!customTables) { + this.customTables = customTables = {}; + } + customTables[currentSegment] = decodeTablesSegment(data, start, end); + } +} +class HuffmanLine { + constructor(lineData) { + if (lineData.length === 2) { + this.isOOB = true; + this.rangeLow = 0; + this.prefixLength = lineData[0]; + this.rangeLength = 0; + this.prefixCode = lineData[1]; + this.isLowerRange = false; + } else { + this.isOOB = false; + this.rangeLow = lineData[0]; + this.prefixLength = lineData[1]; + this.rangeLength = lineData[2]; + this.prefixCode = lineData[3]; + this.isLowerRange = lineData[4] === "lower"; + } + } +} +class HuffmanTreeNode { + constructor(line) { + this.children = []; + if (line) { + this.isLeaf = true; + this.rangeLength = line.rangeLength; + this.rangeLow = line.rangeLow; + this.isLowerRange = line.isLowerRange; + this.isOOB = line.isOOB; + } else { + this.isLeaf = false; + } + } + buildTree(line, shift) { + const bit = line.prefixCode >> shift & 1; + if (shift <= 0) { + this.children[bit] = new HuffmanTreeNode(line); + } else { + let node = this.children[bit]; + if (!node) { + this.children[bit] = node = new HuffmanTreeNode(null); + } + node.buildTree(line, shift - 1); + } + } + decodeNode(reader) { + if (this.isLeaf) { + if (this.isOOB) { + return null; + } + const htOffset = reader.readBits(this.rangeLength); + return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); + } + const node = this.children[reader.readBit()]; + if (!node) { + throw new Jbig2Error("invalid Huffman data"); + } + return node.decodeNode(reader); + } +} +class HuffmanTable { + constructor(lines, prefixCodesDone) { + if (!prefixCodesDone) { + this.assignPrefixCodes(lines); + } + this.rootNode = new HuffmanTreeNode(null); + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + if (line.prefixLength > 0) { + this.rootNode.buildTree(line, line.prefixLength - 1); + } + } + } + decode(reader) { + return this.rootNode.decodeNode(reader); + } + assignPrefixCodes(lines) { + const linesLength = lines.length; + let prefixLengthMax = 0; + for (let i = 0; i < linesLength; i++) { + prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength); + } + const histogram = new Uint32Array(prefixLengthMax + 1); + for (let i = 0; i < linesLength; i++) { + histogram[lines[i].prefixLength]++; + } + let currentLength = 1, + firstCode = 0, + currentCode, + currentTemp, + line; + histogram[0] = 0; + while (currentLength <= prefixLengthMax) { + firstCode = firstCode + histogram[currentLength - 1] << 1; + currentCode = firstCode; + currentTemp = 0; + while (currentTemp < linesLength) { + line = lines[currentTemp]; + if (line.prefixLength === currentLength) { + line.prefixCode = currentCode; + currentCode++; + } + currentTemp++; + } + currentLength++; + } + } +} +function decodeTablesSegment(data, start, end) { + const flags = data[start]; + const lowestValue = readUint32(data, start + 1) & 0xffffffff; + const highestValue = readUint32(data, start + 5) & 0xffffffff; + const reader = new Reader(data, start + 9, end); + const prefixSizeBits = (flags >> 1 & 7) + 1; + const rangeSizeBits = (flags >> 4 & 7) + 1; + const lines = []; + let prefixLength, + rangeLength, + currentRangeLow = lowestValue; + do { + prefixLength = reader.readBits(prefixSizeBits); + rangeLength = reader.readBits(rangeSizeBits); + lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0])); + currentRangeLow += 1 << rangeLength; + } while (currentRangeLow < highestValue); + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"])); + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0])); + if (flags & 1) { + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([prefixLength, 0])); + } + return new HuffmanTable(lines, false); +} +const standardTablesCache = {}; +function getStandardTable(number) { + let table = standardTablesCache[number]; + if (table) { + return table; + } + let lines; + switch (number) { + case 1: + lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]]; + break; + case 2: + lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]]; + break; + case 3: + lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]]; + break; + case 4: + lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]]; + break; + case 5: + lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]]; + break; + case 6: + lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]]; + break; + case 7: + lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]]; + break; + case 8: + lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]]; + break; + case 9: + lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]]; + break; + case 10: + lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]]; + break; + case 11: + lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; + break; + case 12: + lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]]; + break; + case 13: + lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; + break; + case 14: + lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]]; + break; + case 15: + lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, "lower"], [25, 7, 32, 0x7f]]; + break; + default: + throw new Jbig2Error(`standard table B.${number} does not exist`); + } + for (let i = 0, ii = lines.length; i < ii; i++) { + lines[i] = new HuffmanLine(lines[i]); + } + table = new HuffmanTable(lines, true); + standardTablesCache[number] = table; + return table; +} +class Reader { + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + this.position = start; + this.shift = -1; + this.currentByte = 0; + } + readBit() { + if (this.shift < 0) { + if (this.position >= this.end) { + throw new Jbig2Error("end of data while reading bit"); + } + this.currentByte = this.data[this.position++]; + this.shift = 7; + } + const bit = this.currentByte >> this.shift & 1; + this.shift--; + return bit; + } + readBits(numBits) { + let result = 0, + i; + for (i = numBits - 1; i >= 0; i--) { + result |= this.readBit() << i; + } + return result; + } + byteAlign() { + this.shift = -1; + } + next() { + if (this.position >= this.end) { + return -1; + } + return this.data[this.position++]; + } +} +function getCustomHuffmanTable(index, referredTo, customTables) { + let currentIndex = 0; + for (let i = 0, ii = referredTo.length; i < ii; i++) { + const table = customTables[referredTo[i]]; + if (table) { + if (index === currentIndex) { + return table; + } + currentIndex++; + } + } + throw new Jbig2Error("can't find custom Huffman table"); +} +function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) { + const codes = []; + for (let i = 0; i <= 34; i++) { + const codeLength = reader.readBits(4); + codes.push(new HuffmanLine([i, codeLength, 0, 0])); + } + const runCodesTable = new HuffmanTable(codes, false); + codes.length = 0; + for (let i = 0; i < numberOfSymbols;) { + const codeLength = runCodesTable.decode(reader); + if (codeLength >= 32) { + let repeatedLength, numberOfRepeats, j; + switch (codeLength) { + case 32: + if (i === 0) { + throw new Jbig2Error("no previous value in symbol ID table"); + } + numberOfRepeats = reader.readBits(2) + 3; + repeatedLength = codes[i - 1].prefixLength; + break; + case 33: + numberOfRepeats = reader.readBits(3) + 3; + repeatedLength = 0; + break; + case 34: + numberOfRepeats = reader.readBits(7) + 11; + repeatedLength = 0; + break; + default: + throw new Jbig2Error("invalid code length in symbol ID table"); + } + for (j = 0; j < numberOfRepeats; j++) { + codes.push(new HuffmanLine([i, repeatedLength, 0, 0])); + i++; + } + } else { + codes.push(new HuffmanLine([i, codeLength, 0, 0])); + i++; + } + } + reader.byteAlign(); + const symbolIDTable = new HuffmanTable(codes, false); + let customIndex = 0, + tableFirstS, + tableDeltaS, + tableDeltaT; + switch (textRegion.huffmanFS) { + case 0: + case 1: + tableFirstS = getStandardTable(textRegion.huffmanFS + 6); + break; + case 3: + tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman FS selector"); + } + switch (textRegion.huffmanDS) { + case 0: + case 1: + case 2: + tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); + break; + case 3: + tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DS selector"); + } + switch (textRegion.huffmanDT) { + case 0: + case 1: + case 2: + tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); + break; + case 3: + tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DT selector"); + } + if (textRegion.refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + return { + symbolIDTable, + tableFirstS, + tableDeltaS, + tableDeltaT + }; +} +function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) { + let customIndex = 0, + tableDeltaHeight, + tableDeltaWidth; + switch (dictionary.huffmanDHSelector) { + case 0: + case 1: + tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4); + break; + case 3: + tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DH selector"); + } + switch (dictionary.huffmanDWSelector) { + case 0: + case 1: + tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); + break; + case 3: + tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DW selector"); + } + let tableBitmapSize, tableAggregateInstances; + if (dictionary.bitmapSizeSelector) { + tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + } else { + tableBitmapSize = getStandardTable(1); + } + if (dictionary.aggregationInstancesSelector) { + tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables); + } else { + tableAggregateInstances = getStandardTable(1); + } + return { + tableDeltaHeight, + tableDeltaWidth, + tableBitmapSize, + tableAggregateInstances + }; +} +function readUncompressedBitmap(reader, width, height) { + const bitmap = []; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + for (let x = 0; x < width; x++) { + row[x] = reader.readBit(); + } + reader.byteAlign(); + } + return bitmap; +} +function decodeMMRBitmap(input, width, height, endOfBlock) { + const params = { + K: -1, + Columns: width, + Rows: height, + BlackIs1: true, + EndOfBlock: endOfBlock + }; + const decoder = new CCITTFaxDecoder(input, params); + const bitmap = []; + let currentByte, + eof = false; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + let shift = -1; + for (let x = 0; x < width; x++) { + if (shift < 0) { + currentByte = decoder.readNextChar(); + if (currentByte === -1) { + currentByte = 0; + eof = true; + } + shift = 7; + } + row[x] = currentByte >> shift & 1; + shift--; + } + } + if (endOfBlock && !eof) { + const lookForEOFLimit = 5; + for (let i = 0; i < lookForEOFLimit; i++) { + if (decoder.readNextChar() === -1) { + break; + } + } + } + return bitmap; +} +class Jbig2Image { + parseChunks(chunks) { + return parseJbig2Chunks(chunks); + } + parse(data) { + throw new Error("Not implemented: Jbig2Image.parse"); + } +} + +;// ./src/core/jbig2_stream.js + + + + + +class Jbig2Stream extends DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + this.decodeImage(); + } + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + const jbig2Image = new Jbig2Image(); + const chunks = []; + if (this.params instanceof Dict) { + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof BaseStream) { + const globals = globalsStream.getBytes(); + chunks.push({ + data: globals, + start: 0, + end: globals.length + }); + } + } + chunks.push({ + data: bytes, + start: 0, + end: bytes.length + }); + const data = jbig2Image.parseChunks(chunks); + const dataLength = data.length; + for (let i = 0; i < dataLength; i++) { + data[i] ^= 0xff; + } + this.buffer = data; + this.bufferLength = dataLength; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/core/jpg.js + + + +class JpegError extends BaseException { + constructor(msg) { + super(msg, "JpegError"); + } +} +class DNLMarkerError extends BaseException { + constructor(message, scanLines) { + super(message, "DNLMarkerError"); + this.scanLines = scanLines; + } +} +class EOIMarkerError extends BaseException { + constructor(msg) { + super(msg, "EOIMarkerError"); + } +} +const dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]); +const dctCos1 = 4017; +const dctSin1 = 799; +const dctCos3 = 3406; +const dctSin3 = 2276; +const dctCos6 = 1567; +const dctSin6 = 3784; +const dctSqrt2 = 5793; +const dctSqrt1d2 = 2896; +function buildHuffmanTable(codeLengths, values) { + let k = 0, + i, + j, + length = 16; + while (length > 0 && !codeLengths[length - 1]) { + length--; + } + const code = [{ + children: [], + index: 0 + }]; + let p = code[0], + q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; +} +function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); +} +function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) { + const mcusPerLine = frame.mcusPerLine; + const progressive = frame.progressive; + const startOffset = offset; + let bitsData = 0, + bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return bitsData >> bitsCount & 1; + } + bitsData = data[offset++]; + if (bitsData === 0xff) { + const nextByte = data[offset++]; + if (nextByte) { + if (nextByte === 0xdc && parseDNLMarker) { + offset += 2; + const scanLines = readUint16(data, offset); + offset += 2; + if (scanLines > 0 && scanLines !== frame.scanLines) { + throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); + } + } else if (nextByte === 0xd9) { + if (parseDNLMarker) { + const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); + if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) { + throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines); + } + } + throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data"); + } + throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + let node = tree; + while (true) { + node = node[readBit()]; + switch (typeof node) { + case "number": + return node; + case "object": + continue; + } + throw new JpegError("invalid huffman sequence"); + } + } + function receive(length) { + let n = 0; + while (length > 0) { + n = n << 1 | readBit(); + length--; + } + return n; + } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; + } + const n = receive(length); + if (n >= 1 << length - 1) { + return n; + } + return n + (-1 << length) + 1; + } + function decodeBaseline(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t); + component.blockData[blockOffset] = component.pred += diff; + let k = 1; + while (k < 64) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t) << successive; + component.blockData[blockOffset] = component.pred += diff; + } + function decodeDCSuccessive(component, blockOffset) { + component.blockData[blockOffset] |= readBit() << successive; + } + let eobrun = 0; + function decodeACFirst(component, blockOffset) { + if (eobrun > 0) { + eobrun--; + return; + } + let k = spectralStart; + const e = spectralEnd; + while (k <= e) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive); + k++; + } + } + let successiveACState = 0, + successiveACNextValue; + function decodeACSuccessive(component, blockOffset) { + let k = spectralStart; + const e = spectralEnd; + let r = 0; + let s; + let rs; + while (k <= e) { + const offsetZ = blockOffset + dctZigZag[k]; + const sign = component.blockData[offsetZ] < 0 ? -1 : 1; + switch (successiveACState) { + case 0: + rs = decodeHuffman(component.huffmanTableAC); + s = rs & 15; + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) { + throw new JpegError("invalid ACn encoding"); + } + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: + case 2: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + r--; + if (r === 0) { + successiveACState = successiveACState === 2 ? 3 : 0; + } + } + break; + case 3: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + component.blockData[offsetZ] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) { + successiveACState = 0; + } + } + } + let blockRow = 0; + function decodeMcu(component, decode, mcu, row, col) { + const mcuRow = mcu / mcusPerLine | 0; + const mcuCol = mcu % mcusPerLine; + blockRow = mcuRow * component.v + row; + const blockCol = mcuCol * component.h + col; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + function decodeBlock(component, decode, mcu) { + blockRow = mcu / component.blocksPerLine | 0; + const blockCol = mcu % component.blocksPerLine; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + const componentsLength = components.length; + let component, i, j, k, n; + let decodeFn; + if (progressive) { + if (spectralStart === 0) { + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + } else { + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } + } else { + decodeFn = decodeBaseline; + } + let mcu = 0, + fileMarker; + const mcuExpected = componentsLength === 1 ? components[0].blocksPerLine * components[0].blocksPerColumn : mcusPerLine * frame.mcusPerColumn; + let h, v; + while (mcu <= mcuExpected) { + const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected; + if (mcuToRead > 0) { + for (i = 0; i < componentsLength; i++) { + components[i].pred = 0; + } + eobrun = 0; + if (componentsLength === 1) { + component = components[0]; + for (n = 0; n < mcuToRead; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < mcuToRead; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + } + } + } + bitsCount = 0; + fileMarker = findNextFileMarker(data, offset); + if (!fileMarker) { + break; + } + if (fileMarker.invalid) { + const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; + warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`); + offset = fileMarker.offset; + } + if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { + offset += 2; + } else { + break; + } + } + return offset - startOffset; +} +function quantizeAndInverse(component, blockBufferOffset, p) { + const qt = component.quantizationTable, + blockData = component.blockData; + let v0, v1, v2, v3, v4, v5, v6, v7; + let p0, p1, p2, p3, p4, p5, p6, p7; + let t; + if (!qt) { + throw new JpegError("missing required Quantization Table."); + } + for (let row = 0; row < 64; row += 8) { + p0 = blockData[blockBufferOffset + row]; + p1 = blockData[blockBufferOffset + row + 1]; + p2 = blockData[blockBufferOffset + row + 2]; + p3 = blockData[blockBufferOffset + row + 3]; + p4 = blockData[blockBufferOffset + row + 4]; + p5 = blockData[blockBufferOffset + row + 5]; + p6 = blockData[blockBufferOffset + row + 6]; + p7 = blockData[blockBufferOffset + row + 7]; + p0 *= qt[row]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 512 >> 10; + p[row] = t; + p[row + 1] = t; + p[row + 2] = t; + p[row + 3] = t; + p[row + 4] = t; + p[row + 5] = t; + p[row + 6] = t; + p[row + 7] = t; + continue; + } + p1 *= qt[row + 1]; + p2 *= qt[row + 2]; + p3 *= qt[row + 3]; + p4 *= qt[row + 4]; + p5 *= qt[row + 5]; + p6 *= qt[row + 6]; + p7 *= qt[row + 7]; + v0 = dctSqrt2 * p0 + 128 >> 8; + v1 = dctSqrt2 * p4 + 128 >> 8; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; + v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; + v5 = p3 << 4; + v6 = p5 << 4; + v0 = v0 + v1 + 1 >> 1; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; + v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p[row] = v0 + v7; + p[row + 7] = v0 - v7; + p[row + 1] = v1 + v6; + p[row + 6] = v1 - v6; + p[row + 2] = v2 + v5; + p[row + 5] = v2 - v5; + p[row + 3] = v3 + v4; + p[row + 4] = v3 - v4; + } + for (let col = 0; col < 8; ++col) { + p0 = p[col]; + p1 = p[col + 8]; + p2 = p[col + 16]; + p3 = p[col + 24]; + p4 = p[col + 32]; + p5 = p[col + 40]; + p6 = p[col + 48]; + p7 = p[col + 56]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 8192 >> 14; + if (t < -2040) { + t = 0; + } else if (t >= 2024) { + t = 255; + } else { + t = t + 2056 >> 4; + } + blockData[blockBufferOffset + col] = t; + blockData[blockBufferOffset + col + 8] = t; + blockData[blockBufferOffset + col + 16] = t; + blockData[blockBufferOffset + col + 24] = t; + blockData[blockBufferOffset + col + 32] = t; + blockData[blockBufferOffset + col + 40] = t; + blockData[blockBufferOffset + col + 48] = t; + blockData[blockBufferOffset + col + 56] = t; + continue; + } + v0 = dctSqrt2 * p0 + 2048 >> 12; + v1 = dctSqrt2 * p4 + 2048 >> 12; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; + v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; + v5 = p3; + v6 = p5; + v0 = (v0 + v1 + 1 >> 1) + 4112; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; + v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p0 = v0 + v7; + p7 = v0 - v7; + p1 = v1 + v6; + p6 = v1 - v6; + p2 = v2 + v5; + p5 = v2 - v5; + p3 = v3 + v4; + p4 = v3 - v4; + if (p0 < 16) { + p0 = 0; + } else if (p0 >= 4080) { + p0 = 255; + } else { + p0 >>= 4; + } + if (p1 < 16) { + p1 = 0; + } else if (p1 >= 4080) { + p1 = 255; + } else { + p1 >>= 4; + } + if (p2 < 16) { + p2 = 0; + } else if (p2 >= 4080) { + p2 = 255; + } else { + p2 >>= 4; + } + if (p3 < 16) { + p3 = 0; + } else if (p3 >= 4080) { + p3 = 255; + } else { + p3 >>= 4; + } + if (p4 < 16) { + p4 = 0; + } else if (p4 >= 4080) { + p4 = 255; + } else { + p4 >>= 4; + } + if (p5 < 16) { + p5 = 0; + } else if (p5 >= 4080) { + p5 = 255; + } else { + p5 >>= 4; + } + if (p6 < 16) { + p6 = 0; + } else if (p6 >= 4080) { + p6 = 255; + } else { + p6 >>= 4; + } + if (p7 < 16) { + p7 = 0; + } else if (p7 >= 4080) { + p7 = 255; + } else { + p7 >>= 4; + } + blockData[blockBufferOffset + col] = p0; + blockData[blockBufferOffset + col + 8] = p1; + blockData[blockBufferOffset + col + 16] = p2; + blockData[blockBufferOffset + col + 24] = p3; + blockData[blockBufferOffset + col + 32] = p4; + blockData[blockBufferOffset + col + 40] = p5; + blockData[blockBufferOffset + col + 48] = p6; + blockData[blockBufferOffset + col + 56] = p7; + } +} +function buildComponentData(frame, component) { + const blocksPerLine = component.blocksPerLine; + const blocksPerColumn = component.blocksPerColumn; + const computationBuffer = new Int16Array(64); + for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) { + const offset = getBlockBufferOffset(component, blockRow, blockCol); + quantizeAndInverse(component, offset, computationBuffer); + } + } + return component.blockData; +} +function findNextFileMarker(data, currentPos, startPos = currentPos) { + const maxPos = data.length - 1; + let newPos = startPos < currentPos ? startPos : currentPos; + if (currentPos >= maxPos) { + return null; + } + const currentMarker = readUint16(data, currentPos); + if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { + return { + invalid: null, + marker: currentMarker, + offset: currentPos + }; + } + let newMarker = readUint16(data, newPos); + while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { + if (++newPos >= maxPos) { + return null; + } + newMarker = readUint16(data, newPos); + } + return { + invalid: currentMarker.toString(16), + marker: newMarker, + offset: newPos + }; +} +function prepareComponents(frame) { + const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (const component of frame.components) { + const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); + const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); + const blocksPerLineForMcu = mcusPerLine * component.h; + const blocksPerColumnForMcu = mcusPerColumn * component.v; + const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); + component.blockData = new Int16Array(blocksBufferSize); + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; +} +function readDataBlock(data, offset) { + const length = readUint16(data, offset); + offset += 2; + let endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker?.invalid) { + warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); + endOffset = fileMarker.offset; + } + const array = data.subarray(offset, endOffset); + offset += array.length; + return { + appData: array, + newOffset: offset + }; +} +function skipData(data, offset) { + const length = readUint16(data, offset); + offset += 2; + const endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker?.invalid) { + return fileMarker.offset; + } + return endOffset; +} +class JpegImage { + constructor({ + decodeTransform = null, + colorTransform = -1 + } = {}) { + this._decodeTransform = decodeTransform; + this._colorTransform = colorTransform; + } + static canUseImageDecoder(data, colorTransform = -1) { + let offset = 0; + let numComponents = null; + let fileMarker = readUint16(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = readUint16(data, offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + switch (fileMarker) { + case 0xffc0: + case 0xffc1: + case 0xffc2: + numComponents = data[offset + (2 + 1 + 2 + 2)]; + break markerLoop; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + } + offset = skipData(data, offset); + fileMarker = readUint16(data, offset); + offset += 2; + } + if (numComponents === 4) { + return false; + } + if (numComponents === 3 && colorTransform === 0) { + return false; + } + return true; + } + parse(data, { + dnlScanLines = null + } = {}) { + let offset = 0; + let jfif = null; + let adobe = null; + let frame, resetInterval; + let numSOSMarkers = 0; + const quantizationTables = []; + const huffmanTablesAC = [], + huffmanTablesDC = []; + let fileMarker = readUint16(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = readUint16(data, offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + let i, j, l; + switch (fileMarker) { + case 0xffe0: + case 0xffe1: + case 0xffe2: + case 0xffe3: + case 0xffe4: + case 0xffe5: + case 0xffe6: + case 0xffe7: + case 0xffe8: + case 0xffe9: + case 0xffea: + case 0xffeb: + case 0xffec: + case 0xffed: + case 0xffee: + case 0xffef: + case 0xfffe: + const { + appData, + newOffset + } = readDataBlock(data, offset); + offset = newOffset; + if (fileMarker === 0xffe0) { + if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { + jfif = { + version: { + major: appData[5], + minor: appData[6] + }, + densityUnits: appData[7], + xDensity: appData[8] << 8 | appData[9], + yDensity: appData[10] << 8 | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) + }; + } + } + if (fileMarker === 0xffee) { + if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) { + adobe = { + version: appData[5] << 8 | appData[6], + flags0: appData[7] << 8 | appData[8], + flags1: appData[9] << 8 | appData[10], + transformCode: appData[11] + }; + } + } + break; + case 0xffdb: + const quantizationTablesLength = readUint16(data, offset); + offset += 2; + const quantizationTablesEnd = quantizationTablesLength + offset - 2; + let z; + while (offset < quantizationTablesEnd) { + const quantizationTableSpec = data[offset++]; + const tableData = new Uint16Array(64); + if (quantizationTableSpec >> 4 === 0) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = data[offset++]; + } + } else if (quantizationTableSpec >> 4 === 1) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = readUint16(data, offset); + offset += 2; + } + } else { + throw new JpegError("DQT - invalid table spec"); + } + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + case 0xffc0: + case 0xffc1: + case 0xffc2: + if (frame) { + throw new JpegError("Only single frame JPEGs supported"); + } + offset += 2; + frame = {}; + frame.extended = fileMarker === 0xffc1; + frame.progressive = fileMarker === 0xffc2; + frame.precision = data[offset++]; + const sofScanLines = readUint16(data, offset); + offset += 2; + frame.scanLines = dnlScanLines || sofScanLines; + frame.samplesPerLine = readUint16(data, offset); + offset += 2; + frame.components = []; + frame.componentIds = {}; + const componentsCount = data[offset++]; + let maxH = 0, + maxV = 0; + for (i = 0; i < componentsCount; i++) { + const componentId = data[offset]; + const h = data[offset + 1] >> 4; + const v = data[offset + 1] & 15; + if (maxH < h) { + maxH = h; + } + if (maxV < v) { + maxV = v; + } + const qId = data[offset + 2]; + l = frame.components.push({ + h, + v, + quantizationId: qId, + quantizationTable: null + }); + frame.componentIds[componentId] = l - 1; + offset += 3; + } + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); + break; + case 0xffc4: + const huffmanLength = readUint16(data, offset); + offset += 2; + for (i = 2; i < huffmanLength;) { + const huffmanTableSpec = data[offset++]; + const codeLengths = new Uint8Array(16); + let codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) { + codeLengthSum += codeLengths[j] = data[offset]; + } + const huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) { + huffmanValues[j] = data[offset]; + } + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); + } + break; + case 0xffdd: + offset += 2; + resetInterval = readUint16(data, offset); + offset += 2; + break; + case 0xffda: + const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines; + offset += 2; + const selectorsCount = data[offset++], + components = []; + for (i = 0; i < selectorsCount; i++) { + const index = data[offset++]; + const componentIndex = frame.componentIds[index]; + const component = frame.components[componentIndex]; + component.index = index; + const tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + const spectralStart = data[offset++], + spectralEnd = data[offset++], + successiveApproximation = data[offset++]; + try { + const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); + offset += processed; + } catch (ex) { + if (ex instanceof DNLMarkerError) { + warn(`${ex.message} -- attempting to re-parse the JPEG image.`); + return this.parse(data, { + dnlScanLines: ex.scanLines + }); + } else if (ex instanceof EOIMarkerError) { + warn(`${ex.message} -- ignoring the rest of the image data.`); + break markerLoop; + } + throw ex; + } + break; + case 0xffdc: + offset += 4; + break; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + default: + const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3); + if (nextFileMarker?.invalid) { + warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); + offset = nextFileMarker.offset; + break; + } + if (!nextFileMarker || offset >= data.length - 1) { + warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); + break markerLoop; + } + throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); + } + fileMarker = readUint16(data, offset); + offset += 2; + } + if (!frame) { + throw new JpegError("JpegImage.parse - no frame data found."); + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (const component of frame.components) { + const quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ + index: component.index, + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn + }); + } + this.numComponents = this.components.length; + return undefined; + } + _getLinearizedBlockData(width, height, isSourcePDF = false) { + const scaleX = this.width / width, + scaleY = this.height / height; + let component, componentScaleX, componentScaleY, blocksPerScanline; + let x, y, i, j, k; + let index; + let offset = 0; + let output; + const numComponents = this.components.length; + const dataLength = width * height * numComponents; + const data = new Uint8ClampedArray(dataLength); + const xScaleBlockOffset = new Uint32Array(width); + const mask3LSB = 0xfffffff8; + let lastComponentScaleX; + for (i = 0; i < numComponents; i++) { + component = this.components[i]; + componentScaleX = component.scaleX * scaleX; + componentScaleY = component.scaleY * scaleY; + offset = i; + output = component.output; + blocksPerScanline = component.blocksPerLine + 1 << 3; + if (componentScaleX !== lastComponentScaleX) { + for (x = 0; x < width; x++) { + j = 0 | x * componentScaleX; + xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; + } + lastComponentScaleX = componentScaleX; + } + for (y = 0; y < height; y++) { + j = 0 | y * componentScaleY; + index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; + } + } + } + let transform = this._decodeTransform; + if (!isSourcePDF && numComponents === 4 && !transform) { + transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); + } + if (transform) { + for (i = 0; i < dataLength;) { + for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { + data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; + } + } + } + return data; + } + get _isColorConversionNeeded() { + if (this.adobe) { + return !!this.adobe.transformCode; + } + if (this.numComponents === 3) { + if (this._colorTransform === 0) { + return false; + } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) { + return false; + } + return true; + } + if (this._colorTransform === 1) { + return true; + } + return false; + } + _convertYccToRgb(data) { + let Y, Cb, Cr; + for (let i = 0, length = data.length; i < length; i += 3) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = Y - 179.456 + 1.402 * Cr; + data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + data[i + 2] = Y - 226.816 + 1.772 * Cb; + } + return data; + } + _convertYccToRgba(data, out) { + for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + out[j] = Y - 179.456 + 1.402 * Cr; + out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + out[j + 2] = Y - 226.816 + 1.772 * Cb; + out[j + 3] = 255; + } + return out; + } + _convertYcckToRgb(data) { + let Y, Cb, Cr, k; + let offset = 0; + for (let i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + k = data[i + 3]; + data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + } + return data.subarray(0, offset); + } + _convertYcckToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + const k = data[i + 3]; + data[i] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + data[i + 1] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + data[i + 2] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + data[i + 3] = 255; + } + return data; + } + _convertYcckToCmyk(data) { + let Y, Cb, Cr; + for (let i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = 434.456 - Y - 1.402 * Cr; + data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr; + data[i + 2] = 481.816 - Y - 1.772 * Cb; + } + return data; + } + _convertCmykToRgb(data) { + let c, m, y, k; + let offset = 0; + for (let i = 0, length = data.length; i < length; i += 4) { + c = data[i]; + m = data[i + 1]; + y = data[i + 2]; + k = data[i + 3]; + data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); + data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); + data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); + } + return data.subarray(0, offset); + } + _convertCmykToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const c = data[i]; + const m = data[i + 1]; + const y = data[i + 2]; + const k = data[i + 3]; + data[i] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); + data[i + 1] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); + data[i + 2] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); + data[i + 3] = 255; + } + return data; + } + getData({ + width, + height, + forceRGBA = false, + forceRGB = false, + isSourcePDF = false + }) { + if (this.numComponents > 4) { + throw new JpegError("Unsupported color mode"); + } + const data = this._getLinearizedBlockData(width, height, isSourcePDF); + if (this.numComponents === 1 && (forceRGBA || forceRGB)) { + const len = data.length * (forceRGBA ? 4 : 3); + const rgbaData = new Uint8ClampedArray(len); + let offset = 0; + if (forceRGBA) { + grayToRGBA(data, new Uint32Array(rgbaData.buffer)); + } else { + for (const grayColor of data) { + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + } + } + return rgbaData; + } else if (this.numComponents === 3 && this._isColorConversionNeeded) { + if (forceRGBA) { + const rgbaData = new Uint8ClampedArray(data.length / 3 * 4); + return this._convertYccToRgba(data, rgbaData); + } + return this._convertYccToRgb(data); + } else if (this.numComponents === 4) { + if (this._isColorConversionNeeded) { + if (forceRGBA) { + return this._convertYcckToRgba(data); + } + if (forceRGB) { + return this._convertYcckToRgb(data); + } + return this._convertYcckToCmyk(data); + } else if (forceRGBA) { + return this._convertCmykToRgba(data); + } else if (forceRGB) { + return this._convertCmykToRgb(data); + } + } + return data; + } +} + +;// ./src/core/jpeg_stream.js + + + + +class JpegStream extends DecodeStream { + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + static get canUseImageDecoder() { + return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/jpeg") : Promise.resolve(false)); + } + static setOptions({ + isImageDecoderSupported = false + }) { + this.#isImageDecoderSupported = isImageDecoderSupported; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + this.decodeImage(); + } + get jpegOptions() { + const jpegOptions = { + decodeTransform: undefined, + colorTransform: undefined + }; + const decodeArr = this.dict.getArray("D", "Decode"); + if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) { + const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8; + const decodeArrLength = decodeArr.length; + const transform = new Int32Array(decodeArrLength); + let transformNeeded = false; + const maxValue = (1 << bitsPerComponent) - 1; + for (let i = 0; i < decodeArrLength; i += 2) { + transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0; + transform[i + 1] = decodeArr[i] * maxValue | 0; + if (transform[i] !== 256 || transform[i + 1] !== 0) { + transformNeeded = true; + } + } + if (transformNeeded) { + jpegOptions.decodeTransform = transform; + } + } + if (this.params instanceof Dict) { + const colorTransform = this.params.get("ColorTransform"); + if (Number.isInteger(colorTransform)) { + jpegOptions.colorTransform = colorTransform; + } + } + return shadow(this, "jpegOptions", jpegOptions); + } + #skipUselessBytes(data) { + for (let i = 0, ii = data.length - 1; i < ii; i++) { + if (data[i] === 0xff && data[i + 1] === 0xd8) { + if (i > 0) { + data = data.subarray(i); + } + break; + } + } + return data; + } + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes = this.#skipUselessBytes(bytes || this.bytes); + const jpegImage = new JpegImage(this.jpegOptions); + jpegImage.parse(bytes); + const data = jpegImage.getData({ + width: this.drawWidth, + height: this.drawHeight, + forceRGBA: this.forceRGBA, + forceRGB: this.forceRGB, + isSourcePDF: true + }); + this.buffer = data; + this.bufferLength = data.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } + async getTransferableImage() { + if (!(await JpegStream.canUseImageDecoder)) { + return null; + } + const jpegOptions = this.jpegOptions; + if (jpegOptions.decodeTransform) { + return null; + } + let decoder; + try { + const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes; + if (!bytes) { + return null; + } + const data = this.#skipUselessBytes(bytes); + if (!JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform)) { + return null; + } + decoder = new ImageDecoder({ + data, + type: "image/jpeg", + preferAnimation: false + }); + return (await decoder.decode()).image; + } catch (reason) { + warn(`getTransferableImage - failed: "${reason}".`); + return null; + } finally { + decoder?.close(); + } + } +} + +;// ./external/openjpeg/openjpeg.js +var OpenJPEG = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + return function (moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var readyPromiseResolve, readyPromiseReject; + var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + Module.decode = function (bytes, { + numComponents = 4, + isIndexedColormap = false, + smaskInData = false + }) { + const size = bytes.length; + const ptr = Module._malloc(size); + Module.HEAPU8.set(bytes, ptr); + const ret = Module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData); + Module._free(ptr); + if (ret) { + const { + errorMessages + } = Module; + if (errorMessages) { + delete Module.errorMessages; + return errorMessages; + } + return "Unknown error"; + } + const { + imageData + } = Module; + Module.imageData = null; + return imageData; + }; + var moduleOverrides = Object.assign({}, Module); + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var scriptDirectory = ""; + var readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptName) { + scriptDirectory = _scriptName; + } + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); + } + readAsync = url => fetch(url, { + credentials: "same-origin" + }).then(response => { + if (response.ok) { + return response.arrayBuffer(); + } + return Promise.reject(new Error(response.status + " : " + response.url)); + }); + } else {} + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.error.bind(console); + Object.assign(Module, moduleOverrides); + moduleOverrides = null; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + var wasmBinary = Module["wasmBinary"]; + function intArrayFromBase64(s) { + var decoded = atob(s); + var bytes = new Uint8Array(decoded.length); + for (var i = 0; i < decoded.length; ++i) { + bytes[i] = decoded.charCodeAt(i); + } + return bytes; + } + function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); + } + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); + } + function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + function abort(what) { + Module["onAbort"]?.(what); + what = "Aborted(" + what + ")"; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + var isDataURI = filename => filename.startsWith(dataURIPrefix); + function findWasmBinary() { + var f = "data:application/octet-stream;base64,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A3FFBEACQCAAQQNxRQRAIAAhAgwBCyACRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCyADQXxxIQQCQCADQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0EEayIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECkiAARAIABBACABEBkaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECkL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASAC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CyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0HUzQFBGTYCAEF/DwsgACABOgAAQQELfgIBfwF+IAC9IgNCNIinQf8PcSICQf8PRwR8IAJFBEAgASAARAAAAAAAAAAAYQR/QQAFIABEAAAAAAAA8EOiIAEQcCEAIAEoAgBBQGoLNgIAIAAPCyABIAJB/gdrNgIAIANC/////////4eAf4NCgICAgICAgPA/hL8FIAALC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgtJAQF/AkBBAUEsEBciAQRAIAFBADYCEAJAIABBAEwEQCABQQFBCBAXIgA2AiQgAEUNAQwDCyABQQA2AgwLIAEQFAtBACEBCyABC64UAhJ/An4jAEFAaiIIJAAgCCABNgI8IAhBJ2ohFyAIQShqIRICQAJAAkACQANAQQAhBwNA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KAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGEBYaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEEBYaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACC6YFAgZ+BH8gASABKAIAQQdqQXhxIgFBEGo2AgAgACABKQMAIQIgASkDCCEHIwBBIGsiCCQAIAdC////////P4MhBAJ+IAdCMIhC//8BgyIDpyIKQYH4AGtB/Q9NBEAgBEIEhiACQjyIhCEDIApBgPgAa60hBAJAIAJC//////////8PgyICQoGAgICAgICACFoEQCADQgF8IQMMAQsgAkKAgICAgICAgAhSDQAgA0IBgyADfCEDC0IAIAMgA0L/////////B1YiABshAiAArSAEfAwBCwJAIAIgBIRQDQAgA0L//wFSDQAgBEIEhiACQjyIhEKAgICAgICABIQhAkL/DwwBCyAKQf6HAUsEQEIAIQJC/w8MAQtBgPgAQYH4ACADUCIBGyIAIAprIglB8ABKBEBCACECQgAMAQsgAiEDIAQgBEKAgICAgIDAAIQgARsiBSEGAkBBgAEgCWsiAUHAAHEEQCACIAFBQGqthiEGQgAhAwwBCyABRQ0AIAYgAa0iBIYgA0HAACABa62IhCEGIAMgBIYhAwsgCCADNwMQIAggBjcDGAJAIAlBwABxBEAgBSAJQUBqrYghAkIAIQUMAQsgCUUNACAFQcAAIAlrrYYgAiAJrSIDiIQhAiAFIAOIIQULIAggAjcDACAIIAU3AwggCCkDCEIEhiAIKQMAIgNCPIiEIQICQCAAIApHIAgpAxAgCCkDGIRCAFJxrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIAJCgICAgICAgAiFIAIgAkL/////////B1YiABshAiAArQshAyAIQSBqJAAgB0KAgICAgICAgIB/gyADQjSGhCAChL85AwAL9BcDEn8BfAN+IwBBsARrIgwkACAMQQA2AiwCQCABvSIZQgBTBEBBASEQQboIIRQgAZoiAb0hGQwBCyAEQYAQcQRAQQEhEEG9CCEUDAELQcAI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ACgCRCICQQN0aiIFIAQoAhQ7AQAgBSAEKAIQNgIEQQEhBSAAIAJBAWo2AkQgASAJaiECIAZBAWoiBiAKRw0ACwwCC0EBIAYgBkEBTRshByAAKAJEIQFBACEGA0AgBCABNgIUIAEgACgChAEgACgCgAFsTw0BIAIgBEEQaiAJEBUgCCAAKAJEIgpBA3RqIgUgATsBACAFIAQoAhA2AgRBASEFIAAgCkEBaiIBNgJEIAIgCWohAiAGQQFqIgYgB0cNAAsMAQsgAEEBNgJMIAQgATYCACADQQJB0jwgBBATCyAEQSBqJAAgBQsEAEEACwvLwQEhAEGACAvgmQFjYW5ub3QgYWxsb2NhdGUgb3BqX3RjZF9zZWdfZGF0YV9jaHVua190KiBhcnJheQAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AFVua25vd24gZm9ybWF0AEZhaWxlZCB0byBzZXR1cCB0aGUgZGVjb2RlcgBGYWlsZWQgdG8gcmVhZCB0aGUgaGVhZGVyAG5hbgAqbF90aWxlX2xlbiA+IFVJTlRfTUFYIC0gT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEgLSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoAGluZgBGYWlsZWQgdG8gZGVjb2RlIHRoZSBpbWFnZQBJbnZhbGlkIGFjY2VzcyB0byBwaS0+aW5jbHVkZQAvdG1wL29wZW5qcGVnL3NyYy9iaW4vY29tbW9uL2NvbG9yLmMAQUxMX0NQVVMAT1BKX05VTV9USFJFQURTAE5BTgBPSlBfRE9fTk9UX0RJU1BMQVlfVElMRV9JTkRFWF9JRl9UTE0ASU5GAHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPiBVSU5UX01BWCAtIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBAAkJCSBwcmVjY2ludHNpemUgKHcsaCk9AAkJCSBzdGVwc2l6ZXMgKG0sZSk9AFNPVCBtYXJrZXIgZm9yIHRpbGUgJXUgZGVjbGFyZXMgbW9yZSB0aWxlLXBhcnRzIHRoYW4gZm91bmQgaW4gVExNIG1hcmtlci4AKG51bGwpACglZCwlZCkgACVzfQoACQkgfQoAW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3QgewoAW0RFVl0gRHVtcCBhbiBpbWFnZV9oZWFkZXIgc3RydWN0IHsKAEltYWdlIGluZm8gewoACSBkZWZhdWx0IHRpbGUgewoAJXMJIGNvbXBvbmVudCAlZCB7CgAJCSBjb21wICVkIHsKAAkgVGlsZSBpbmRleDogewoACSBNYXJrZXIgbGlzdDogewoAQ29kZXN0cmVhbSBpbmRleCBmcm9tIG1haW4gaGVhZGVyOiB7CgBDb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlcjogewoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3gKAEZvdW5kIGEgbWlzcGxhY2VkICclYyVjJWMlYycgYm94IG91dHNpZGUganAyaCBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IGZpcnN0IGJveCBtdXN0IGJlIEpQRUcgMjAwMCBzaWduYXR1cmUgYm94CgBNYWxmb3JtZWQgSlAyIGZpbGUgZm9ybWF0OiBzZWNvbmQgYm94IG11c3QgYmUgZmlsZSB0eXBlIGJveAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGJveAoATm90IGVub3VnaCBtZW1vcnkgd2l0aCBGVFlQIEJveAoAQSBtYXJrZXIgSUQgd2FzIGV4cGVjdGVkICgweGZmLS0pIGluc3RlYWQgb2YgJS44eAoACQkgbWN0PSV4CgAJCQkgY2Jsa3N0eT0lI3gKAAkJCSBjc3R5PSUjeAoACQkgcHJnPSUjeAoASW50ZWdlciBvdmVyZmxvdwoACSB0ZHg9JXUsIHRkeT0ldQoACSB0dz0ldSwgdGg9JXUKAAkgdHgwPSV1LCB0eTA9JXUKAEludmFsaWQgY29tcG9uZW50IGluZGV4OiAldQoAU3RyZWFtIHRvbyBzaG9ydAoATWFya2VyIGhhbmRsZXIgZnVuY3Rpb24gZmFpbGVkIHRvIHJlYWQgdGhlIG1hcmtlciBzZWdtZW50CgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY3VycmVudCBwcmVjaW5jdCBjb2RlYmxvY2sgZWxlbWVudAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNRY2Qgb3IgU1FjYyBlbGVtZW50CgBBIEJQQ0MgaGVhZGVyIGJveCBpcyBhdmFpbGFibGUgYWx0aG91Z2ggQlBDIGdpdmVuIGJ5IHRoZSBJSERSIGJveCAoJWQpIGluZGljYXRlIGNvbXBvbmVudHMgYml0IGRlcHRoIGlzIGNvbnN0YW50CgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGlsbGVnYWwgdGlsZSBvZmZzZXQKAEludmFsaWQgcHJlY2luY3QKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBiYW5kIHByZWNpbnRzCgBGYWlsZWQgdG8gZGVjb2RlIGFsbCB1c2VkIGNvbXBvbmVudHMKAFNpemUgb2YgY29kZSBibG9jayBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0cwoAU2l6ZSBvZiB0aWxlIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgTUNUIG1hcmtlcnMKAENvcnJ1cHRlZCBQUE0gbWFya2VycwoATm90IGVub3VnaCBtZW1vcnkgZm9yIHRpbGUgcmVzb2x1dGlvbnMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBjb2xsZWN0aW9ucwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAwIHBhbGV0dGUgY29sdW1ucwoAV2UgZG8gbm90IHN1cHBvcnQgUk9JIGluIGRlY29kaW5nIEhUIGNvZGVibG9ja3MKAENhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplcwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGhvdXQgc2FtZSBudW1iZXIgb2YgaW5kaXhlcwoASW52YWxpZCB0aWxlYy0+d2luX3h4eCB2YWx1ZXMKAENhbm5vdCBoYW5kbGUgYm94IG9mIGxlc3MgdGhhbiA4IGJ5dGVzCgBDYW5ub3QgaGFuZGxlIFhMIGJveCBvZiBsZXNzIHRoYW4gMTYgYnl0ZXMKAENvbXBvbmVudCBpbmRleCAldSB1c2VkIHNldmVyYWwgdGltZXMKAEludmFsaWQgUENMUiBib3guIFJlcG9ydHMgJWQgZW50cmllcwoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlIG5vZGVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbWN0IGRhdGEgd2l0aGluIG11bHRpcGxlIE1DVCByZWNvcmRzCgBDYW5ub3QgZGVjb2RlIHRpbGUsIG1lbW9yeSBlcnJvcgoAb3BqX2oya19hcHBseV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24gZXJyb3IKAFByb2JsZW0gd2l0aCBza2lwcGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAUHJvYmxlbSB3aXRoIHJlYWRpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3IKAFVua25vd24gbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGwgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyCgBFcnJvciByZWFkaW5nIFBQVCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBTT1QgbWFya2VyCgBEaWQgbm90IGdldCBleHBlY3RlZCBTT1QgbWFya2VyCgBFcnJvciByZWFkaW5nIFBMVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBTT1AgbWFya2VyCgBFeHBlY3RlZCBTT1AgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DTyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUkdOIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQUE0gbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExNIG1hcmtlcgoARXhwZWN0ZWQgRVBIIG1hcmtlcgoATm90IGVub3VnaCBzcGFjZSBmb3IgcmVxdWlyZWQgRVBIIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDUkcgbWFya2VyCgBVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXIKAFVua25vd24gU2NvZCB2YWx1ZSBpbiBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIENPRCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNEIG1hcmtlcgoAQ3Jyb3IgcmVhZGluZyBDQkQgbWFya2VyCgBFcnJvciByZWFkaW5nIFBPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlcgoARXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DQyBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNDIG1hcmtlcgoAcmVxdWlyZWQgU0laIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAHJlcXVpcmVkIENPRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBRQ0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIGhlYWRlcgoARXJyb3Igd2l0aCBKUCBTaWduYXR1cmUgOiBiYWQgbWFnaWMgbnVtYmVyCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50IG51bWJlciBvZiB0aWxlLXBhcnQgKCVkKSwgZ2l2aW5nIHVwCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBwcmV2aW91cyBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0IChoZWFkZXIpICglZCksIGdpdmluZyB1cAoAdGlsZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvbgoATWFya2VyIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBpdHMgcG9zaXRpb24KAFByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY2Jsa3cvY2Jsa2ggY29tYmluYXRpb24KAEludmFsaWQgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybWF0aW9uCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgb3RoZXIgdGhhbiBhcnJheSBkZWNvcnJlbGF0aW9uCgBUb28gbGFyZ2UgdmFsdWUgZm9yIE5wcG0KAE5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBOcHBtCgBiYWQgcGxhY2VkIGpwZWcgY29kZXN0cmVhbQoACSBNYWluIGhlYWRlciBzdGFydCBwb3NpdGlvbj0lbGxpCgkgTWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uPSVsbGkKAE1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGgKAFRpbGUgcGFydCBsZW5ndGggc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZwoAV3JvbmcgZmxhZwoARXJyb3Igd2l0aCBGVFlQIHNpZ25hdHVyZSBCb3ggc2l6ZQoARXJyb3Igd2l0aCBKUCBzaWduYXR1cmUgQm94IHNpemUKAEludmFsaWQgcHJlY2luY3Qgc2l6ZQoASW5jb25zaXN0ZW50IG1hcmtlciBzaXplCgBJbnZhbGlkIG1hcmtlciBzaXplCgBFcnJvciB3aXRoIFNJWiBtYXJrZXIgc2l6ZQoATm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZQoARmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGUKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGUKAENhbm5vdCBhbGxvY2F0ZSBUaWVyIDEgaGFuZGxlCgBObyBkZWNvZGVkIGFyZWEgcGFyYW1ldGVycywgc2V0IHRoZSBkZWNvZGVkIGFyZWEgdG8gdGhlIHdob2xlIGltYWdlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlaW5pdGlhbGl6ZSB0aGUgdGFnIHRyZWUKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudCwgSW52YWxpZCB0cmFuc2Zvcm1hdGlvbiBmb3VuZAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LiBVbnN1cHBvcnRlZCBNaXhlZCBIVCBjb2RlLWJsb2NrIHN0eWxlIGZvdW5kCgBUaWxlIFkgY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAFRpbGUgWCBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZAoASW1hZ2UgY29vcmRpbmF0ZXMgYWJvdmUgSU5UX01BWCBhcmUgbm90IHN1cHBvcnRlZAoASlBFRzIwMDAgSGVhZGVyIGJveCBub3QgcmVhZCB5ZXQsICclYyVjJWMlYycgYm94IHdpbGwgYmUgaWdub3JlZAoAb3BqX2oya19tZXJnZV9wcHQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAoAb3BqX2oya19idWlsZF90cF9pbmRleF9mcm9tX3RsbSgpOiB0aWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWQKAElnbm9yaW5nIGloZHIgYm94LiBGaXJzdCBpaGRyIGJveCBhbHJlYWR5IHJlYWQKAFpwcHQgJXUgYWxyZWFkeSByZWFkCgBacHBtICV1IGFscmVhZHkgcmVhZAoAUFRFUk0gY2hlY2sgZmFpbHVyZTogJWQgc3ludGhlc2l6ZWQgMHhGRiBtYXJrZXJzIHJlYWQKAAkJCSBjYmxrdz0yXiVkCgAJCQkgY2Jsa2g9Ml4lZAoACQkJIHFudHN0eT0lZAoAJXMgZHg9JWQsIGR5PSVkCgAJCQkgcm9pc2hpZnQ9JWQKAAkJCSBudW1nYml0cz0lZAoACQkgbnVtbGF5ZXJzPSVkCgAlcyBudW1jb21wcz0lZAoAb3BqX2pwMl9hcHBseV9jZGVmOiBhY249JWQsIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGNuPSVkLCBudW1jb21wcz0lZAoACQkJIG51bXJlc29sdXRpb25zPSVkCgAJCSB0eXBlPSUjeCwgcG9zPSVsbGksIGxlbj0lZAoAJXMgc2duZD0lZAoACQkJIHFtZmJpZD0lZAoAJXMgcHJlYz0lZAoACQkgbmIgb2YgdGlsZS1wYXJ0IGluIHRpbGUgWyVkXT0lZAoAJXMgeDE9JWQsIHkxPSVkCgAlcyB4MD0lZCwgeTA9JWQKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAlZC8lZAoAU2V0dGluZyBkZWNvZGluZyBhcmVhIHRvICVkLCVkLCVkLCVkCgBGYWlsZWQgdG8gZGVjb2RlIGNvbXBvbmVudCAlZAoASW52YWxpZCB2YWx1ZSBmb3IgbnVtcmVzb2x1dGlvbnMgOiAlZCwgbWF4IHZhbHVlIGlzIHNldCBpbiBvcGVuanBlZy5oIGF0ICVkCgBJbnZhbGlkIGNvbXBvbmVudCBudW1iZXI6ICVkLCByZWdhcmRpbmcgdGhlIG51bWJlciBvZiBjb21wb25lbnRzICVkCgBUb28gbWFueSBQT0NzICVkCgBvcGpfajJrX3JlYWRfdGxtKCk6IGludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU290IGxlbmd0aCBpcyBsZXNzIHRoYW4gbWFya2VyIHNpemUgKyBtYXJrZXIgSUQKAFN0cmVhbSBkb2VzIG5vdCBlbmQgd2l0aCBFT0MKAENhbm5vdCBoYW5kbGUgYm94IHNpemVzIGhpZ2hlciB0aGFuIDJeMzIKAG9wal9waV9uZXh0X2xyY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JsY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X2NwcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3BjcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JwY2woKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal90MV9kZWNvZGVfY2JsaygpOiB1bnN1cHBvcnRlZCBicG5vX3BsdXNfb25lID0gJWQgPj0gMzEKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAxLzEKAEluc3VmZmljaWVudCBkYXRhIGZvciBDTUFQIGJveC4KAE5lZWQgdG8gcmVhZCBhIFBDTFIgYm94IGJlZm9yZSB0aGUgQ01BUCBib3guCgBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guCgBOdW1iZXIgb2YgY2hhbm5lbCBkZXNjcmlwdGlvbiBpcyBlcXVhbCB0byB6ZXJvIGluIENERUYgYm94LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IG5vICdpaGRyJyBib3guCgBOb24gY29uZm9ybWFudCBjb2Rlc3RyZWFtIFRQc290PT1UTnNvdC4KAFN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBib3ggbGVuZ3RoIGlzIGluY29uc2lzdGVudC4KAEJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAUmVzb2x1dGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gdGhlIGNvbXBvbmVudC4KAENvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC4KAG9wal9qMmtfYnVpbGRfdHBfaW5kZXhfZnJvbV90bG0oKTogdGlsZSAlZCBoYXMgbm8gcmVnaXN0ZXJlZCB0aWxlLXBhcnQgaW4gVExNIG1hcmtlciBzZWdtZW50cy4KAG9wal9qMmtfcmVhZF90bG0oKTogdG9vIG1hbnkgVExNIG1hcmtlcnMuCgBvcGpfajJrX3JlYWRfdGxtKCk6IGNhbm5vdCBhbGxvY2F0ZSBtX3RpbGVfcGFydF9pbmZvcy4KAEluY29tcGxldGUgY2hhbm5lbCBkZWZpbml0aW9ucy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEludmFsaWQgY29kZWJsb2NrIGxlbmd0aCB2YWx1ZXMuCgBXZSBkbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMyBjb2RpbmcgcGFzc2VzIGluIGFuIEhUIGNvZGVibG9jazsgVGhpcyBjb2RlYmxvY2tzIGhhcyAlZCBwYXNzZXMuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBUaGVyZSBhcmUgJWQgemVybyBiaXRwbGFuZXMgaW4gJWQgYml0cGxhbmVzLgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9uIHN0YWdlcy4KAFVua25vd24gbWFya2VyIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBnZW5lcmF0ZWQgZXJyb3IuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3NldHVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3JlYWRfaGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBhIGRlY29tcHJlc3NvciBoYW5kbGVyLgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyLgoAVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC4KAE51bWJlciBvZiBjb21wb25lbnRzICglZCkgaXMgaW5jb25zaXN0ZW50IHdpdGggYSBNQ1QuIFNraXAgdGhlIE1DVCBzdGVwLgoASlAyIGJveCB3aGljaCBhcmUgYWZ0ZXIgdGhlIGNvZGVzdHJlYW0gd2lsbCBub3QgYmUgcmVhZCBieSB0aGlzIGZ1bmN0aW9uLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gV2hlbiB0aGUgbnVtYmVyIG9mIHplcm8gcGxhbmVzIGJpdHBsYW5lcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJpdHBsYW5lcywgb25seSB0aGUgY2xlYW51cCBwYXNzIG1ha2VzIHNlbnNlLCBidXQgd2UgaGF2ZSAlZCBwYXNzZXMgaW4gdGhpcyBjb2RlYmxvY2suIFRoZXJlZm9yZSwgb25seSB0aGUgY2xlYW51cCBwYXNzIHdpbGwgYmUgZGVjb2RlZC4gVGhpcyBtZXNzYWdlIHdpbGwgbm90IGJlIGRpc3BsYXllZCBhZ2Fpbi4KAEltYWdlIGhhcyBsZXNzIGNvbXBvbmVudHMgdGhhbiBjb2Rlc3RyZWFtLgoATmVlZCB0byBkZWNvZGUgdGhlIG1haW4gaGVhZGVyIGJlZm9yZSBiZWdpbiB0byBkZWNvZGUgdGhlIHJlbWFpbmluZyBjb2Rlc3RyZWFtLgoAUHNvdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgZXF1YWwgdG8gemVybywgd2UgYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLgoAQSBtYWxmb3JtZWQgY29kZWJsb2NrIHRoYXQgaGFzIG1vcmUgdGhhbiBvbmUgY29kaW5nIHBhc3MsIGJ1dCB6ZXJvIGxlbmd0aCBmb3IgMm5kIGFuZCBwb3RlbnRpYWxseSB0aGUgM3JkIHBhc3MgaW4gYW4gSFQgY29kZWJsb2NrLgoACQkJIHRpbGUtcGFydFslZF06IHN0YXJfcG9zPSVsbGksIGVuZF9oZWFkZXI9JWxsaSwgZW5kX3Bvcz0lbGxpLgoAVGlsZSAldSBoYXMgVFBzb3QgPT0gMCBhbmQgVE5zb3QgPT0gMCwgYnV0IG5vIG90aGVyIHRpbGUtcGFydHMgd2VyZSBmb3VuZC4gRU9DIGlzIGFsc28gbWlzc2luZy4KAENvbXBvbmVudCAlZCBkb2Vzbid0IGhhdmUgYSBtYXBwaW5nLgoAb3BqX2oya19yZWFkX3RsbSgpOiBUTE0gbWFya2VyIG5vdCBvZiBleHBlY3RlZCBzaXplLgoAQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS4KAFRoZSBzaWduYXR1cmUgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSAgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSBmdHlwIGJveCBtdXN0IGJlIHRoZSBzZWNvbmQgYm94IGluIHRoZSBmaWxlLgoARmFpbGVkIHRvIGRlY29kZS4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEluY29ycmVjdCBNRUwgc2VnbWVudCBzZXF1ZW5jZS4KAENvbXBvbmVudCAlZCBpcyBtYXBwZWQgdHdpY2UuCgBvcGpfajJrX3JlYWRfdGxtKCk6IFNUID0gMyBpcyBpbnZhbGlkLgoAT25seSBvbmUgQ01BUCBib3ggaXMgYWxsb3dlZC4KAFdlIG5lZWQgYW4gaW1hZ2UgcHJldmlvdXNseSBjcmVhdGVkLgoASUhEUiBib3hfbWlzc2luZy4gUmVxdWlyZWQuCgBKUDJIIGJveCBtaXNzaW5nLiBSZXF1aXJlZC4KAE5vdCBzdXJlIGhvdyB0aGF0IGhhcHBlbmVkLgoATWFpbiBoZWFkZXIgaGFzIGJlZW4gY29ycmVjdGx5IGRlY29kZWQuCgBUaWxlICVkLyVkIGhhcyBiZWVuIGRlY29kZWQuCgBIZWFkZXIgb2YgdGlsZSAlZCAvICVkIGhhcyBiZWVuIHJlYWQuCgBFbXB0eSBTT1QgbWFya2VyIGRldGVjdGVkOiBQc290PSVkLgoARGlyZWN0IHVzZSBhdCAjJWQgaG93ZXZlciBwY29sPSVkLgoASW1wbGVtZW50YXRpb24gbGltaXRhdGlvbjogZm9yIHBhbGV0dGUgbWFwcGluZywgcGNvbFslZF0gc2hvdWxkIGJlIGVxdWFsIHRvICVkLCBidXQgaXMgZXF1YWwgdG8gJWQuCgBJbnZhbGlkIGNvbXBvbmVudC9wYWxldHRlIGluZGV4IGZvciBkaXJlY3QgbWFwcGluZyAlZC4KAEludmFsaWQgdmFsdWUgZm9yIGNtYXBbJWRdLm10eXAgPSAlZC4KAFBzb3QgdmFsdWUgaXMgbm90IGNvcnJlY3QgcmVnYXJkcyB0byB0aGUgSlBFRzIwMDAgbm9ybTogJWQuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBWTEMgY29kZSBwcm9kdWNlcyBzaWduaWZpY2FudCBzYW1wbGVzIG91dHNpZGUgdGhlIGNvZGVibG9jayBhcmVhLgoAVW5leHBlY3RlZCBPT00uCgAzMiBiaXRzIGFyZSBub3QgZW5vdWdoIHRvIGRlY29kZSB0aGlzIGNvZGVibG9jaywgc2luY2UgdGhlIG51bWJlciBvZiBiaXRwbGFuZSwgJWQsIGlzIGxhcmdlciB0aGFuIDMwLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgc2hvdWxkIGJlID4gMC4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgc2hvdWxkIGJlID4gMC4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgc2hvdWxkIGJlID49IDAuCgBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgc2hvdWxkIGJlID49IDAuCgBFcnJvciByZWFkaW5nIFBQVCBtYXJrZXI6IHBhY2tldCBoZWFkZXIgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZm91bmQgaW4gdGhlIG1haW4gaGVhZGVyIChQUE0gbWFya2VyKS4KAFN0YXJ0IHRvIHJlYWQgajJrIG1haW4gaGVhZGVyICglbGxkKS4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuCgBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlPc2l6PSVkKS4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAFNpemUgeCBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS53PSVkKS4KAFNpemUgeSBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS5oPSVkKS4KAFRpbGUgcmVhZCwgZGVjb2RlZCBhbmQgdXBkYXRlZCBpcyBub3QgdGhlIGRlc2lyZWQgb25lICglZCB2cyAlZCkuCgBJbnZhbGlkIGNvbXBvbmVudCBpbmRleCAlZCAoPj0gJWQpLgoAb3BqX3JlYWRfaGVhZGVyKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgb3BqX3NldF9kZWNvZGVkX2NvbXBvbmVudHMoKS4KAE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbWFnZS0+Y29tcHNbJWRdLmRhdGEgPT0gTlVMTCBpbiBvcGpfanAyX2FwcGx5X3BjbHIoKS4KAGludmFsaWQgYm94IHNpemUgJWQgKCV4KQoARmFpbCB0byByZWFkIHRoZSBjdXJyZW50IG1hcmtlciBzZWdtZW50ICglI3gpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IElIRFIgdygldSkgaCgldSkgdnMuIFNJWiB3KCV1KSBoKCV1KQoARXJyb3IgcmVhZGluZyBDT0MgbWFya2VyIChiYWQgbnVtYmVyIG9mIGNvbXBvbmVudHMpCgBJbnZhbGlkIG51bWJlciBvZiB0aWxlcyA6ICV1IHggJXUgKG1heGltdW0gZml4ZWQgYnkganBlZzIwMDAgbm9ybSBpcyA2NTUzNSB0aWxlcykKAEludmFsaWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgKGloZHIpCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgaW1hZ2UgaGVhZGVyIChpaGRyKQoAV3JvbmcgdmFsdWVzIGZvcjogdyglZCkgaCglZCkgbnVtY29tcHMoJWQpIChpaGRyKQoASW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IGR4PSV1IGR5PSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgYWNjb3JkaW5nIHRvIHRoZSBKUEVHMjAwMCBub3JtKQoAQmFkIGltYWdlIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBCYWQgQlBDQyBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogbmVnYXRpdmUgb3IgemVybyBpbWFnZSBzaXplICglbGxkIHggJWxsZCkKAHNraXA6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIG1heCAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpCgByZWFkOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoARGVzcGl0ZSBKUDIgQlBDIT0yNTUsIHByZWNpc2lvbiBhbmQvb3Igc2duZCB2YWx1ZXMgZm9yIGNvbXBbJWRdIGlzIGRpZmZlcmVudCB0aGFuIGNvbXBbMF06CiAgICAgICAgWzBdIHByZWMoJWQpIHNnbmQoJWQpIFslZF0gcHJlYyglZCkgc2duZCglZCkKAGJhZCBjb21wb25lbnQgbnVtYmVyIGluIFJHTiAoJWQgd2hlbiB0aGVyZSBhcmUgb25seSAlZCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogbnVtYmVyIG9mIGNvbXBvbmVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCAlZCB2cyAlZCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaW52YWxpZCB0aWxlIHNpemUgKHRkeDogJWQsIHRkeTogJWQpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZTogJWQpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChDSUVMYWIsIGJhZCBzaXplOiAlZCkKAFBURVJNIGNoZWNrIGZhaWx1cmU6ICVkIHJlbWFpbmluZyBieXRlcyBpbiBjb2RlIGJsb2NrICglZCB1c2VkIC8gJWQpCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBPbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgbm90IG1ldDogMiA8PSBTY3VwIDw9IG1pbihMY3VwLCA0MDc5KQoASW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IHByZWM9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDM4IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybS4gT3BlbkpwZWcgb25seSBzdXBwb3J0cyB1cCB0byAzMSkKAEludmFsaWQgYml0IG51bWJlciAlZCBpbiBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKCkKAFN0cmVhbSBlcnJvciEKAEVycm9yIG9uIHdyaXRpbmcgc3RyZWFtIQoAU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhCgBFeHBlY3RlZCBhIFNPQyBtYXJrZXIgCgBJbnZhbGlkIGJveCBzaXplICVkIGZvciBib3ggJyVjJWMlYyVjJy4gTmVlZCAlZCBieXRlcywgJWQgYnl0ZXMgcmVtYWluaW5nIAoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gRGVjb2RpbmcgdGhpcyBjb2RlYmxvY2sgaXMgc3RvcHBlZC4gVV9xIGlzIGxhcmdlciB0aGFuIHplcm8gYml0cGxhbmVzICsgMSAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpc2xhcmdlciB0aGFuIGJpdHBsYW5lcyArIDEgCgBDT0xSIEJPWCBtZXRoIHZhbHVlIGlzIG5vdCBhIHJlZ3VsYXIgdmFsdWUgKCVkKSwgc28gd2Ugd2lsbCBpZ25vcmUgdGhlIGVudGlyZSBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3guIAoAV2hpbGUgcmVhZGluZyBDQ1BfUU5UU1RZIGVsZW1lbnQgaW5zaWRlIFFDRCBvciBRQ0MgbWFya2VyIHNlZ21lbnQsIG51bWJlciBvZiBzdWJiYW5kcyAoJWQpIGlzIGdyZWF0ZXIgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpLiBTbyB3ZSBsaW1pdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHN0b3JlZCB0byBPUEpfSjJLX01BWEJBTkRTICglZCkgYW5kIHNraXAgdGhlIHJlc3QuIAoASlAyIElIRFIgYm94OiBjb21wcmVzc2lvbiB0eXBlIGluZGljYXRlIHRoYXQgdGhlIGZpbGUgaXMgbm90IGEgY29uZm9ybWluZyBKUDIgZmlsZSAoJWQpIAoAVGlsZSBpbmRleCBwcm92aWRlZCBieSB0aGUgdXNlciBpcyBpbmNvcnJlY3QgJWQgKG1heCA9ICVkKSAKAEVycm9yIGRlY29kaW5nIGNvbXBvbmVudCAlZC4KVGhlIG51bWJlciBvZiByZXNvbHV0aW9ucyB0byByZW1vdmUgKCVkKSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhlIG51bWJlciBvZiByZXNvbHV0aW9ucyBvZiB0aGlzIGNvbXBvbmVudCAoJWQpCk1vZGlmeSB0aGUgY3BfcmVkdWNlIHBhcmFtZXRlci4KCgBJbWFnZSBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aWxlICVkLgoKACMApQBDAGYAgwDuqBQA39gjAL4QQwD/9YMAfiBVAF9RIwA1AEMATkSDAM7EFADPzCMA/uJDAP+ZgwCWAMUAPzEjAKUAQwBeRIMAzsgUAN8RIwD+9EMA//yDAJ4AVQB3ACMANQBDAP/xgwCuiBQAtwAjAP74QwDv5IMAjojFAB8RIwClAEMAZgCDAO6oFADfVCMAvhBDAO8igwB+IFUAfyIjADUAQwBORIMAzsQUAL8RIwD+4kMA9wCDAJYAxQA/IiMApQBDAF5EgwDOyBQA1wAjAP70QwD/uoMAngBVAG8AIwA1AEMA/+aDAK6IFACvoiMA/vhDAOcAgwCOiMUALyICAMUAhAB+IAIAzsQkAPcAAgD+okQAVgACAJ4AFADXAAIAvhCEAGYAAgCuiCQA3xECAO6oRAA2AAIAjogUAB8RAgDFAIQAbgACAM6IJAD/iAIA/rhEAE5EAgCWABQAtwACAP7khABeRAIApgAkAOcAAgDeVEQALiICAD4AFAB3AAIAxQCEAH4gAgDOxCQA//ECAP6iRABWAAIAngAUAL8RAgC+EIQAZgACAK6IJADvIgIA7qhEADYAAgCOiBQAfyICAMUAhABuAAIAzogkAO/kAgD+uEQATkQCAJYAFACvogIA/uSEAF5EAgCmACQA39gCAN5URAAuIgIAPgAUAF9RAgBVAIQAZgACAN6IJAD/MgIA/hFEAE5EAgCuABQAtwACAH4xhABeUQIAxgAkANcAAgDuIEQAHhECAJ4AFAB3AAIAVQCEAF5UAgDORCQA5wACAP7xRAA2AAIApgAUAF9VAgD+dIQAPhECAL4gJAB/dAIA3sREAP/4AgCWABQALyICAFUAhABmAAIA3ogkAPcAAgD+EUQATkQCAK4AFACPiAIAfjGEAF5RAgDGACQAz8gCAO4gRAAeEQIAngAUAG8AAgBVAIQAXlQCAM5EJADf0QIA/vFEADYAAgCmABQAfyICAP50hAA+EQIAviAkAL8iAgDexEQA7yICAJYAFAA/MgMA3tT99P/8FAA+EVUAj4gDAL4yhQDnACUAXlH+qn9yAwDORP3470QUAH5kRQCvogMApgBdVd+Z/fE2AP71b2IDAN7R/fT/5hQAfnFVAL+xAwCuiIUA39UlAE5E/vJ/ZgMAxgD9+O/iFABeVEUAnxEDAJYAXVXPyP3xHhHuyGcAAwDe1P30//MUAD4RVQC/EQMAvjKFAN/YJQBeUf6qLyIDAM5E/fj3ABQAfmRFAJ+YAwCmAF1V1wD98TYA/vVvRAMA3tH99P+5FAB+cVUAtwADAK6IhQDf3CUATkT+8ncAAwDGAP347+QUAF5URQB/cwMAlgBdVb+4/fEeEe7IPzICAKUAhAB+QAIA3hAkAN8RAgD+ckQAVgACAK6oFAC/sgIAlgCEAGYAAgDGACQA5wACAO7IRAAuIgIAjogUAHcAAgClAIQAbgACAM6IJAD3AAIA/pFEADYAAgCuohQAr6oCAP64hABeAAIAvgAkAM/EAgDuREQA//QCAD4iFAAfEQIApQCEAH5AAgDeECQA/5kCAP5yRABWAAIArqgUALcAAgCWAIQAZgACAMYAJADXAAIA7shEAC4iAgCOiBQAT0QCAKUAhABuAAIAzogkAO/iAgD+kUQANgACAK6iFAB/RAIA/riEAF4AAgC+ACQAnwACAO5ERAD/dgIAPiIUAD8xAwDGAIUA/9n98n5k/vG/mQMArqIlAO9m/fRWAO7if3MDAL6YRQD3AP34ZgD+dp+IAwCOiBUA39WlAC4i3phPRAMAvrKFAP/8/fJuIpYAtwADAK6qJQDf0f30NgDe1G9kAwCuqEUA7+r9+F5E7uh/cQMAPjIVAM/EpQD/+s6IPzEDAMYAhQD/d/3yfmT+8b+zAwCuoiUA5wD99FYA7uJ3AAMAvphFAO/k/fhmAP52f2YDAI6IFQDXAKUALiLemD8zAwC+soUA/3X98m4ilgCfkQMArqolAN+Z/fQ2AN7UX1EDAK6oRQDv7P34XkTu6H9yAwA+MhUAv7GlAP/zzogfEQMA3lT98h4RFAB+ZP74z8wDAL6RRQDvIiUALiL+84+IAwDGAIUA9wAUAF4R/vyvqAMApgA1AN/I/fE+Mf5mb2QDAM7I/fL/9RQAZgD+9L+6AwCuIkUA5wAlAD4y/up/cwMAvrKFAN9VFABWAH5xnxEDAJYANQDPxP3xPjPu6E9EAwDeVP3yHhEUAH5k/vi/mQMAvpFFAO/iJQAuIv7zf2YDAMYAhQDv5BQAXhH+/J+YAwCmADUA1wD98T4x/mZvIgMAzsj98v+5FABmAP70twADAK4iRQDf0SUAPjL+6ncAAwC+soUA7+wUAFYAfnF/cgMAlgA1AL+4/fE+M+7oX1T88d7R/frXAPz4FgD9/390/PR+cf3zv7P88u/q7uhPRPzxriIFAL+4/Pj3AP78dwD89F4R/fV/dfzy39ju4j8z/PG+sv36z4j8+P/7/f9/c/z0bgD987cA/PLvZv75PzH88Z4ABQC/uvz4//3+9mcA/PQmAP31j4j88t/c3tQvIvzx3tH9+s/E/PgWAP3/f3L89H5x/fO/mfzy7+zu6EcA/PGuIgUApwD8+P/3/vxXAPz0XhH99ZcA/PLf1e7iNwD88b6y/frHAPz4//79/39m/PRuAP3zr6j88ucA/vk/MvzxngAFAL+x/Pjv5P72X1T89CYA/fWHAPzy35ne1B8REwBlAEMA3gCDAI2IIwBORBMApQBDAK6IgwA1ACMA1wATAMUAQwCeAIMAVQAjAC4iEwCVAEMAfgCDAP4QIwB3ABMAZQBDAM6IgwCNiCMAHhETAKUAQwBeAIMANQAjAOcAEwDFAEMAvgCDAFUAIwD/ERMAlQBDAD4AgwDuQCMAr6ITAGUAQwDeAIMAjYgjAE5EEwClAEMAroiDADUAIwDvRBMAxQBDAJ4AgwBVACMALiITAJUAQwB+AIMA/hAjALcAEwBlAEMAzoiDAI2IIwAeERMApQBDAF4AgwA1ACMAz8QTAMUAQwC+AIMAVQAjAPcAEwCVAEMAPgCDAO5AIwBvAAEAhAABAFYAAQAUAAEA1wABACQAAQCWAAEARQABAHcAAQCEAAEAxgABABQAAQCPiAEAJAABAPcAAQA1AAEALyIBAIQAAQD+QAEAFAABALcAAQAkAAEAvwABAEUAAQBnAAEAhAABAKYAAQAUAAEAT0QBACQAAQDnAAEANQABAD8RAQCEAAEAVgABABQAAQDPAAEAJAABAJYAAQBFAAEAbwABAIQAAQDGAAEAFAABAJ8AAQAkAAEA7wABADUAAQA/MgEAhAABAP5AAQAUAAEArwABACQAAQD/RAEARQABAF8AAQCEAAEApgABABQAAQB/AAEAJAABAN8AAQA1AAEAHxEBACQAAQBWAAEAhQABAL8AAQAUAAEA9wABAMYAAQB3AAEAJAABAP/4AQBFAAEAfwABABQAAQDfAAEApgABAD8xAQAkAAEALiIBAIUAAQC3AAEAFAABAO9EAQCuogEAZwABACQAAQD/UQEARQABAJcAAQAUAAEAzwABADYAAQA/IgEAJAABAFYAAQCFAAEAv7IBABQAAQDvQAEAxgABAG8AAQAkAAEA/3IBAEUAAQCfAAEAFAABANcAAQCmAAEAT0QBACQAAQAuIgEAhQABAK+oAQAUAAEA5wABAK6iAQBfAAEAJAABAP9EAQBFAAEAj4gBABQAAQCvqgEANgABAB8RAgD++CQAVgACALYAhQD/ZgIAzgAUAB4RAgCWADUAr6gCAPYAJAA+MQIApgBFAL+zAgC+shQA//UCAGYAflFfVAIA/vIkAC4iAgCuIoUA70QCAMYAFAD/9AIAdgA1AH9EAgDeQCQAPjICAJ4ARQDXAAIAvogUAP/6AgBeEf7xT0QCAP74JABWAAIAtgCFAO/IAgDOABQAHhECAJYANQCPiAIA9gAkAD4xAgCmAEUA30QCAL6yFAD/qAIAZgB+UW8AAgD+8iQALiICAK4ihQDnAAIAxgAUAO/iAgB2ADUAf3ICAN5AJAA+MgIAngBFAL+xAgC+iBQA/3MCAF4R/vE/MwEAhAABAO4gAQDFAAEAz8QBAEQAAQD/MgEAFQABAI+IAQCEAAEAZgABACUAAQCvAAEARAABAO8iAQCmAAEAXwABAIQAAQBORAEAxQABAM/MAQBEAAEA9wABABUAAQBvAAEAhAABAFYAAQAlAAEAnwABAEQAAQDfAAEA/jABAC8iAQCEAAEA7iABAMUAAQDPyAEARAABAP8RAQAVAAEAdwABAIQAAQBmAAEAJQABAH8AAQBEAAEA5wABAKYAAQA3AAEAhAABAE5EAQDFAAEAtwABAEQAAQC/AAEAFQABAD8AAQCEAAEAVgABACUAAQCXAAEARAABANcAAQD+MAEAHxECAO6oRACOiAIA1gDFAP/zAgD+/CUAPgACALYAVQDf2AIA/vhEAGYAAgB+IIUA/5kCAOYA9QA2AAIApgAVAJ8AAgD+8kQAdgACAM5ExQD/dgIA/vElAE5EAgCuAFUAz8gCAP70RABeRAIAvhCFAO/kAgDeVPUAHhECAJYAFQAvIgIA7qhEAI6IAgDWAMUA//oCAP78JQA+AAIAtgBVAL8RAgD++EQAZgACAH4ghQDvIgIA5gD1ADYAAgCmABUAfyICAP7yRAB2AAIAzkTFAP/VAgD+8SUATkQCAK4AVQBvAAIA/vREAF5EAgC+EIUA3xECAN5U9QAeEQIAlgAVAF9RAwD2ABQAHhFEAI6IpQDf1AMArqJVAP92JAA+IrYAr6oDAOYAFAD/9UQAZgCFAM/MAwCeAMUA70QkADYA/vh/MQMA7ugUAP/xRAB2AKUAz8QDAH4iVQDf0SQATkT+9F9RAwDWABQA7+JEAF5EhQC/IgMAlgDFAN/IJAAuIv7ybyIDAPYAFAAeEUQAjoilAL+xAwCuolUA/zMkAD4itgCvqAMA5gAUAP+5RABmAIUAv6gDAJ4AxQDv5CQANgD++G9kAwDu6BQA//xEAHYApQDPyAMAfiJVAO/qJABORP70f3QDANYAFAD/+kQAXkSFAL+yAwCWAMUA30QkAC4i/vI/MfMA/vr98TYABAC+MnUA3xHzAN5U/fLv5NUAfnH+/H9z8wD+8/34HhEEAJYAVQC/sfMAzgC1AN/Y/fRmAP65X1TzAP52/fEmAAQApgB1AJ8A8wCuAP3y//fVAEYA/vV/dPMA5gD9+BYABACGAFUAj4jzAMYAtQDv4v30XhHuqD8R8wD++v3xNgAEAL4ydQDf0fMA3lT98v/71QB+cf78f0TzAP7z/fgeEQQAlgBVAH9y8wDOALUA7yL99GYA/rlPRPMA/nb98SYABACmAHUAvxHzAK4A/fL//9UARgD+9T8y8wDmAP34FgAEAIYAVQBvAPMAxgC1AL+4/fReEe6oLyIAQeyhAQukHgEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAABAAAAAUAAAC3IUIhZyFCIREREREzMzMzd3d3dwAAAAAAAAAAAVYAAAAAAABQUQAAYFEAAAFWAAABAAAAYFEAAFBRAAABNAAAAAAAAHBRAADwUQAAATQAAAEAAACAUQAAAFIAAAEYAAAAAAAAkFEAAFBSAAABGAAAAQAAAKBRAABgUgAAwQoAAAAAAACwUQAAsFIAAMEKAAABAAAAwFEAAMBSAAAhBQAAAAAAANBRAADQVAAAIQUAAAEAAADgUQAA4FQAACECAAAAAAAA8FUAAFBVAAAhAgAAAQAAAABWAABgVQAAAVYAAAAAAAAQUgAAAFIAAAFWAAABAAAAIFIAAPBRAAABVAAAAAAAADBSAADwUgAAAVQAAAEAAABAUgAAAFMAAAFIAAAAAAAAUFIAAPBSAAABSAAAAQAAAGBSAAAAUwAAATgAAAAAAABwUgAA8FIAAAE4AAABAAAAgFIAAABTAAABMAAAAAAAAJBSAABQUwAAATAAAAEAAACgUgAAYFMAAAEkAAAAAAAAsFIAAHBTAAABJAAAAQAAAMBSAACAUwAAARwAAAAAAADQUgAAsFMAAAEcAAABAAAA4FIAAMBTAAABFgAAAAAAANBUAADQUwAAARYAAAEAAADgVAAA4FMAAAFWAAAAAAAAEFMAAABTAAABVgAAAQAAACBTAADwUgAAAVQAAAAAAAAwUwAA8FIAAAFUAAABAAAAQFMAAABTAAABUQAAAAAAAFBTAAAQUwAAAVEAAAEAAABgUwAAIFMAAAFIAAAAAAAAcFMAADBTAAABSAAAAQAAAIBTAABAUwAAATgAAAAAAACQUwAAUFMAAAE4AAABAAAAoFMAAGBTAAABNAAAAAAAALBTAABwUwAAATQAAAEAAADAUwAAgFMAAAEwAAAAAAAA0FMAAJBTAAABMAAAAQAAAOBTAACgUwAAASgAAAAAAADwUwAAkFMAAAEoAAABAAAAAFQAAKBTAAABJAAAAAAAABBUAACwUwAAASQAAAEAAAAgVAAAwFMAAAEiAAAAAAAAMFQAANBTAAABIgAAAQAAAEBUAADgUwAAARwAAAAAAABQVAAA8FMAAAEcAAABAAAAYFQAAABUAAABGAAAAAAAAHBUAAAQVAAAARgAAAEAAACAVAAAIFQAAAEWAAAAAAAAkFQAADBUAAABFgAAAQAAAKBUAABAVAAAARQAAAAAAACwVAAAUFQAAAEUAAABAAAAwFQAAGBUAAABEgAAAAAAANBUAABwVAAAARIAAAEAAADgVAAAgFQAAAERAAAAAAAA8FQAAJBUAAABEQAAAQAAAABVAACgVAAAwQoAAAAAAAAQVQAAsFQAAMEKAAABAAAAIFUAAMBUAADBCQAAAAAAADBVAADQVAAAwQkAAAEAAABAVQAA4FQAAKEIAAAAAAAAUFUAAPBUAAChCAAAAQAAAGBVAAAAVQAAIQUAAAAAAABwVQAAEFUAACEFAAABAAAAgFUAACBVAABBBAAAAAAAAJBVAAAwVQAAQQQAAAEAAACgVQAAQFUAAKECAAAAAAAAsFUAAFBVAAChAgAAAQAAAMBVAABgVQAAIQIAAAAAAADQVQAAcFUAACECAAABAAAA4FUAAIBVAABBAQAAAAAAAPBVAACQVQAAQQEAAAEAAAAAVgAAoFUAABEBAAAAAAAAEFYAALBVAAARAQAAAQAAACBWAADAVQAAhQAAAAAAAAAwVgAA0FUAAIUAAAABAAAAQFYAAOBVAABJAAAAAAAAAFBWAADwVQAASQAAAAEAAABgVgAAAFYAACUAAAAAAAAAcFYAABBWAAAlAAAAAQAAAIBWAAAgVgAAFQAAAAAAAACQVgAAMFYAABUAAAABAAAAoFYAAEBWAAAJAAAAAAAAALBWAABQVgAACQAAAAEAAADAVgAAYFYAAAUAAAAAAAAA0FYAAHBWAAAFAAAAAQAAAOBWAACAVgAAAQAAAAAAAADQVgAAkFYAAAEAAAABAAAA4FYAAKBWAAABVgAAAAAAAPBWAADwVgAAAVYAAAEAAAAAVwAAAFcAAAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAEFBgECBgYDAwcHAwMHBwABBQYBAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwECBgYCAgYGAwMHBwMDBwcBAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcFBggIBgYICAcHCAgHBwgIBQYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAECBgYCAgYGAwMHBwMDBwcBAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcCAgYGAgIGBgMDBwcDAwcHAgIGBgICBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgAAQMDAQIDAwUGBwcGBgcHAAEDAwECAwMFBgcHBgYHBwUGBwcGBgcHCAgICAgICAgFBgcHBgYHBwgICAgICAgIAQIDAwICAwMGBgcHBgYHBwECAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAQIDAwICAwMGBgcHBgYHBwECAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAICAwMCAgMDBgYHBwYGBwcCAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAADAQQDBgQHAQQCBQQHBQcAAwEEAwYEBwEEAgUEBwUHAQQCBQQHBQcCBQIFBQcFBwEEAgUEBwUHAgUCBQUHBQcDBgQHBggHCAQHBQcHCAcIAwYEBwYIBwgEBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIAQQCBQQHBQcCBQIFBQcFBwEEAgUEBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgDBgQHBggHCAQHBQcHCAcIAwYEBwYIBwgEBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBggHCAgICAgHCAcICAgICAYIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgICQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQkJCgoJCQoKDAwNCwwMDQsJCQoKCQkKCgwMCw0MDAsNDAwNDQwMCwsMCQ0KCQwKCwwMCwsMDA0NDAkLCgkMCg0KCgoKCgoKCg0LDQsNCw0LCgoJCQoKCQkNCwwMDQsMDA0NDQ0LCwsLDQoNCgoLCgsNDQwMCwsMDA0KDAkKCwkMCgoJCQoKCQkLDQwMCw0MDAoKCgoKCgoKCw0LDQsNCw0LCwwMDQ0MDAsKDAkKDQkMCwsLCw0NDQ0LCgsKCg0KDQBBmcABCzcBAAEAAQABAAABAQAAAQEAAQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAEAAQEBAEHZwAELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZnBAQsHAQABAAEAAQBBqcEBC5UCAQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAAAAQABAQEAAAEBAAAAAQABAAEAAQEBAQEBAQEBAAEAAQABAAEAAAAAAQEBAQABAAABAQABAAAAAAEBAQEAAQABAQEBAQIAAAAEAAAABAAAAAgAAACQ/wAADAAAABkAAABS/wAAFAAAABoAAABT/wAAFAAAABsAAABe/wAAFAAAABwAAABc/wAAFAAAAB0AAABd/wAAFAAAAB4AAABf/wAAFAAAAB8AAABR/wAAAgAAACAAAABV/wAABAAAACEAAABX/wAABAAAACIAAABY/wAAEAAAACMAAABg/wAABAAAACQAAABh/wAAEAAAACUAAACR/wBByMMBC2Vj/wAABAAAACYAAABk/wAAFAAAACcAAAB0/wAAFAAAACgAAAB4/wAABAAAACkAAABQ/wAABAAAACoAAABZ/wAABAAAACsAAAB1/wAAFAAAACwAAAB3/wAAFAAAAC0AAAAAAAAAFABBwMQBCzUuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAACAgUGo3AAAAcHl0ZjgAAABoMnBqOQBBgMUBCzJyZGhpOgAAAHJsb2M7AAAAY2NwYjwAAABybGNwPQAAAHBhbWM+AAAAZmVkYz8AAABAZgBBwMUBC0EZAAsAGRkZAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABkACgoZGRkDCgcAAQAJCxgAAAkGCwAACwAGGQAAABkZGQBBkcYBCyEOAAAAAAAAAAAZAAsNGRkZAA0AAAIACQ4AAAAJAA4AAA4AQcvGAQsBDABB18YBCxUTAAAAABMAAAAACQwAAAAAAAwAAAwAQYXHAQsBEABBkccBCxUPAAAABA8AAAAACRAAAAAAABAAABAAQb/HAQsBEgBBy8cBCx4RAAAAABEAAAAACRIAAAAAABIAABIAABoAAAAaGhoAQYLIAQsOGgAAABoaGgAAAAAAAAkAQbPIAQsBFABBv8gBCxUXAAAAABcAAAAACRQAAAAAABQAABQAQe3IAQsBFgBB+cgBC2QVAAAAABUAAAAACRYAAAAAABYAABYAADAxMjM0NTY3ODlBQkNERUYAAAAAcAAAAHAAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABwAAAAcAAAAHEAAABwAAAAcAAAAHAAAABwAEGAygELHXEAAABxAAAAcAAAAHAAAAAAAAAAcAAAAAAAAABxAEGoywELCVBwAQAAAAAABQBBvMsBCwFrAEHUywELCmwAAABtAAAAuGsAQezLAQsBAgBB/MsBCwj//////////wBBwMwBCwEFAEHMzAELAW4AQeTMAQsObAAAAG8AAADIawAAAAQAQfzMAQsBAQBBjM0BCwX/////Cg=="; + return f; + } + var wasmBinaryFile; + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + var binary = tryParseAsDataURI(file); + if (binary) { + return binary; + } + if (readBinary) { + return readBinary(file); + } + throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'; + } + function instantiateSync(file, info) { + var module; + var binary = getBinarySync(file); + module = new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); + return [instance, module]; + } + function getWasmImports() { + return { + a: wasmImports + }; + } + function createWasm() { + function receiveInstance(instance, module) { + wasmExports = instance.exports; + wasmMemory = wasmExports["t"]; + updateMemoryViews(); + addOnInit(wasmExports["u"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + addRunDependency("wasm-instantiate"); + var info = getWasmImports(); + if (Module["instantiateWasm"]) { + try { + return Module["instantiateWasm"](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + readyPromiseReject(e); + } + } + wasmBinaryFile ??= findWasmBinary(); + var result = instantiateSync(wasmBinaryFile, info); + return receiveInstance(result[0]); + } + class ExitStatus { + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var noExitRuntime = Module["noExitRuntime"] || true; + var __abort_js = () => abort(""); + var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + var runtimeKeepaliveCounter = 0; + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + var timers = {}; + var handleException = e => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = code => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }; + var _exit = exitJS; + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = func => { + if (ABORT) { + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + }; + var _emscripten_get_now = () => performance.now(); + var __setitimer_js = (which, timeout_ms) => { + if (timers[which]) { + clearTimeout(timers[which].id); + delete timers[which]; + } + if (!timeout_ms) return 0; + var id = setTimeout(() => { + delete timers[which]; + callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); + }, timeout_ms); + timers[which] = { + id, + timeout_ms + }; + return 0; + }; + function _copy_pixels_1(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + imageData.set(compG); + } + function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[3 * i] = compR[i]; + imageData[3 * i + 1] = compG[i]; + imageData[3 * i + 2] = compB[i]; + } + } + function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = compA[i]; + } + } + var getHeapMax = () => 2147483648; + var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + var growMemory = size => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + var ENV = {}; + var getExecutableName = () => thisProgram || "./this.program"; + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = (typeof navigator == "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; + var env = { + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: lang, + _: getExecutableName() + }; + for (var x in ENV) { + if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + }; + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[__environ + i * 4 >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach(string => bufSize += string.length + 1); + HEAPU32[penviron_buf_size >> 2] = bufSize; + return 0; + }; + var _fd_close = fd => 52; + var convertI32PairToI53Checked = (lo, hi) => hi + 2097152 >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN; + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + return 70; + } + var printCharBuffers = [null, [], []]; + var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder() : undefined; + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + }; + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + var _fd_write = (fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[iov + 4 >> 2]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAPU32[pnum >> 2] = num; + return 0; + }; + function _gray_to_rgba(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = 255; + } + } + function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { + compG_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = compA[i]; + } + } + function _jsPrintWarning(message_ptr) { + const message = UTF8ToString(message_ptr); + (Module.warn || console.warn)(`OpenJPEG: ${message}`); + } + function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = 255; + } + } + function _storeErrorMessage(message_ptr) { + const message = UTF8ToString(message_ptr); + if (!Module.errorMessages) { + Module.errorMessages = message; + } else { + Module.errorMessages += "\n" + message; + } + } + var wasmImports = { + m: __abort_js, + c: __emscripten_memcpy_js, + l: __emscripten_runtime_keepalive_clear, + n: __setitimer_js, + g: _copy_pixels_1, + f: _copy_pixels_3, + e: _copy_pixels_4, + o: _emscripten_resize_heap, + p: _environ_get, + q: _environ_sizes_get, + r: _fd_close, + j: _fd_seek, + b: _fd_write, + s: _gray_to_rgba, + i: _graya_to_rgba, + d: _jsPrintWarning, + k: _proc_exit, + h: _rgb_to_rgba, + a: _storeErrorMessage + }; + var wasmExports = createWasm(); + var ___wasm_call_ctors = wasmExports["u"]; + var _malloc = Module["_malloc"] = wasmExports["v"]; + var _free = Module["_free"] = wasmExports["w"]; + var _jp2_decode = Module["_jp2_decode"] = wasmExports["y"]; + var __emscripten_timeout = wasmExports["z"]; + var calledRun; + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve(Module); + Module["onRuntimeInitialized"]?.(); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(() => { + setTimeout(() => Module["setStatus"](""), 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + moduleRtn = Module; + return moduleRtn; + }; +})(); +/* harmony default export */ const openjpeg = (OpenJPEG); +;// ./src/core/jpx.js + + + +class JpxError extends BaseException { + constructor(msg) { + super(msg, "JpxError"); + } +} +class JpxImage { + static #module = null; + static decode(data, decoderOptions) { + decoderOptions ||= {}; + this.#module ||= openjpeg({ + warn: warn + }); + const imageData = this.#module.decode(data, decoderOptions); + if (typeof imageData === "string") { + throw new JpxError(imageData); + } + return imageData; + } + static cleanup() { + this.#module = null; + } + static parseImageProperties(stream) { + let newByte = stream.getByte(); + while (newByte >= 0) { + const oldByte = newByte; + newByte = stream.getByte(); + const code = oldByte << 8 | newByte; + if (code === 0xff51) { + stream.skip(4); + const Xsiz = stream.getInt32() >>> 0; + const Ysiz = stream.getInt32() >>> 0; + const XOsiz = stream.getInt32() >>> 0; + const YOsiz = stream.getInt32() >>> 0; + stream.skip(16); + const Csiz = stream.getUint16(); + return { + width: Xsiz - XOsiz, + height: Ysiz - YOsiz, + bitsPerComponent: 8, + componentsCount: Csiz + }; + } + } + throw new JpxError("No size marker found in JPX stream"); + } +} + +;// ./src/core/jpx_stream.js + + + +class JpxStream extends DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock(decoderOptions) { + this.decodeImage(null, decoderOptions); + } + decodeImage(bytes, decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + this.buffer = JpxImage.decode(bytes, decoderOptions); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } +} + +;// ./src/core/lzw_stream.js + +class LZWStream extends DecodeStream { + constructor(str, maybeLength, earlyChange) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.cachedData = 0; + this.bitsCached = 0; + const maxLzwDictionarySize = 4096; + const lzwState = { + earlyChange, + codeLength: 9, + nextCode: 258, + dictionaryValues: new Uint8Array(maxLzwDictionarySize), + dictionaryLengths: new Uint16Array(maxLzwDictionarySize), + dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), + currentSequence: new Uint8Array(maxLzwDictionarySize), + currentSequenceLength: 0 + }; + for (let i = 0; i < 256; ++i) { + lzwState.dictionaryValues[i] = i; + lzwState.dictionaryLengths[i] = 1; + } + this.lzwState = lzwState; + } + readBits(n) { + let bitsCached = this.bitsCached; + let cachedData = this.cachedData; + while (bitsCached < n) { + const c = this.str.getByte(); + if (c === -1) { + this.eof = true; + return null; + } + cachedData = cachedData << 8 | c; + bitsCached += 8; + } + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; + this.lastCode = null; + return cachedData >>> bitsCached & (1 << n) - 1; + } + readBlock() { + const blockSize = 512, + decodedSizeDelta = blockSize; + let estimatedDecodedSize = blockSize * 2; + let i, j, q; + const lzwState = this.lzwState; + if (!lzwState) { + return; + } + const earlyChange = lzwState.earlyChange; + let nextCode = lzwState.nextCode; + const dictionaryValues = lzwState.dictionaryValues; + const dictionaryLengths = lzwState.dictionaryLengths; + const dictionaryPrevCodes = lzwState.dictionaryPrevCodes; + let codeLength = lzwState.codeLength; + let prevCode = lzwState.prevCode; + const currentSequence = lzwState.currentSequence; + let currentSequenceLength = lzwState.currentSequenceLength; + let decodedLength = 0; + let currentBufferLength = this.bufferLength; + let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + for (i = 0; i < blockSize; i++) { + const code = this.readBits(codeLength); + const hasPrev = currentSequenceLength > 0; + if (code < 256) { + currentSequence[0] = code; + currentSequenceLength = 1; + } else if (code >= 258) { + if (code < nextCode) { + currentSequenceLength = dictionaryLengths[code]; + for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { + currentSequence[j] = dictionaryValues[q]; + q = dictionaryPrevCodes[q]; + } + } else { + currentSequence[currentSequenceLength++] = currentSequence[0]; + } + } else if (code === 256) { + codeLength = 9; + nextCode = 258; + currentSequenceLength = 0; + continue; + } else { + this.eof = true; + delete this.lzwState; + break; + } + if (hasPrev) { + dictionaryPrevCodes[nextCode] = prevCode; + dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; + dictionaryValues[nextCode] = currentSequence[0]; + nextCode++; + codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; + } + prevCode = code; + decodedLength += currentSequenceLength; + if (estimatedDecodedSize < decodedLength) { + do { + estimatedDecodedSize += decodedSizeDelta; + } while (estimatedDecodedSize < decodedLength); + buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + } + for (j = 0; j < currentSequenceLength; j++) { + buffer[currentBufferLength++] = currentSequence[j]; + } + } + lzwState.nextCode = nextCode; + lzwState.codeLength = codeLength; + lzwState.prevCode = prevCode; + lzwState.currentSequenceLength = currentSequenceLength; + this.bufferLength = currentBufferLength; + } +} + +;// ./src/core/predictor_stream.js + + + +class PredictorStream extends DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + if (!(params instanceof Dict)) { + return str; + } + const predictor = this.predictor = params.get("Predictor") || 1; + if (predictor <= 1) { + return str; + } + if (predictor !== 2 && (predictor < 10 || predictor > 15)) { + throw new FormatError(`Unsupported predictor: ${predictor}`); + } + this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; + this.str = str; + this.dict = str.dict; + const colors = this.colors = params.get("Colors") || 1; + const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8; + const columns = this.columns = params.get("Columns") || 1; + this.pixBytes = colors * bits + 7 >> 3; + this.rowBytes = columns * colors * bits + 7 >> 3; + return this; + } + readBlockTiff() { + const rowBytes = this.rowBytes; + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + const bits = this.bits; + const colors = this.colors; + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + let inbuf = 0, + outbuf = 0; + let inbits = 0, + outbits = 0; + let pos = bufferLength; + let i; + if (bits === 1 && colors === 1) { + for (i = 0; i < rowBytes; ++i) { + let c = rawBytes[i] ^ inbuf; + c ^= c >> 1; + c ^= c >> 2; + c ^= c >> 4; + inbuf = (c & 1) << 7; + buffer[pos++] = c; + } + } else if (bits === 8) { + for (i = 0; i < colors; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[pos] = buffer[pos - colors] + rawBytes[i]; + pos++; + } + } else if (bits === 16) { + const bytesPerPixel = colors * 2; + for (i = 0; i < bytesPerPixel; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; i += 2) { + const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff); + buffer[pos++] = sum >> 8 & 0xff; + buffer[pos++] = sum & 0xff; + } + } else { + const compArray = new Uint8Array(colors + 1); + const bitMask = (1 << bits) - 1; + let j = 0, + k = bufferLength; + const columns = this.columns; + for (i = 0; i < columns; ++i) { + for (let kk = 0; kk < colors; ++kk) { + if (inbits < bits) { + inbuf = inbuf << 8 | rawBytes[j++] & 0xff; + inbits += 8; + } + compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask; + inbits -= bits; + outbuf = outbuf << bits | compArray[kk]; + outbits += bits; + if (outbits >= 8) { + buffer[k++] = outbuf >> outbits - 8 & 0xff; + outbits -= 8; + } + } + } + if (outbits > 0) { + buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); + } + } + this.bufferLength += rowBytes; + } + readBlockPng() { + const rowBytes = this.rowBytes; + const pixBytes = this.pixBytes; + const predictor = this.str.getByte(); + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); + if (prevRow.length === 0) { + prevRow = new Uint8Array(rowBytes); + } + let i, + j = bufferLength, + up, + c; + switch (predictor) { + case 0: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + break; + case 1: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff; + j++; + } + break; + case 2: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = prevRow[i] + rawBytes[i] & 0xff; + } + break; + case 3: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff; + j++; + } + break; + case 4: + for (i = 0; i < pixBytes; ++i) { + up = prevRow[i]; + c = rawBytes[i]; + buffer[j++] = up + c; + } + for (; i < rowBytes; ++i) { + up = prevRow[i]; + const upLeft = prevRow[i - pixBytes]; + const left = buffer[j - pixBytes]; + const p = left + up - upLeft; + let pa = p - left; + if (pa < 0) { + pa = -pa; + } + let pb = p - up; + if (pb < 0) { + pb = -pb; + } + let pc = p - upLeft; + if (pc < 0) { + pc = -pc; + } + c = rawBytes[i]; + if (pa <= pb && pa <= pc) { + buffer[j++] = left + c; + } else if (pb <= pc) { + buffer[j++] = up + c; + } else { + buffer[j++] = upLeft + c; + } + } + break; + default: + throw new FormatError(`Unsupported predictor: ${predictor}`); + } + this.bufferLength += rowBytes; + } +} + +;// ./src/core/run_length_stream.js + +class RunLengthStream extends DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + } + readBlock() { + const repeatHeader = this.str.getBytes(2); + if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; + return; + } + let buffer; + let bufferLength = this.bufferLength; + let n = repeatHeader[0]; + if (n < 128) { + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer[bufferLength++] = repeatHeader[1]; + if (n > 0) { + const source = this.str.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; + } + } else { + n = 257 - n; + const b = repeatHeader[1]; + buffer = this.ensureBuffer(bufferLength + n + 1); + for (let i = 0; i < n; i++) { + buffer[bufferLength++] = b; + } + } + this.bufferLength = bufferLength; + } +} + +;// ./src/core/parser.js + + + + + + + + + + + + + + +const MAX_LENGTH_TO_CACHE = 1000; +function getInlineImageCacheKey(bytes) { + const strBuf = [], + ii = bytes.length; + let i = 0; + while (i < ii - 1) { + strBuf.push(bytes[i++] << 8 | bytes[i++]); + } + if (i < ii) { + strBuf.push(bytes[i]); + } + return ii + "_" + String.fromCharCode.apply(null, strBuf); +} +class Parser { + constructor({ + lexer, + xref, + allowStreams = false, + recoveryMode = false + }) { + this.lexer = lexer; + this.xref = xref; + this.allowStreams = allowStreams; + this.recoveryMode = recoveryMode; + this.imageCache = Object.create(null); + this._imageId = 0; + this.refill(); + } + refill() { + this.buf1 = this.lexer.getObj(); + this.buf2 = this.lexer.getObj(); + } + shift() { + if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") { + this.buf1 = this.buf2; + this.buf2 = null; + } else { + this.buf1 = this.buf2; + this.buf2 = this.lexer.getObj(); + } + } + tryShift() { + try { + this.shift(); + return true; + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + return false; + } + } + getObj(cipherTransform = null) { + const buf1 = this.buf1; + this.shift(); + if (buf1 instanceof Cmd) { + switch (buf1.cmd) { + case "BI": + return this.makeInlineImage(cipherTransform); + case "[": + const array = []; + while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) { + array.push(this.getObj(cipherTransform)); + } + if (this.buf1 === EOF) { + if (this.recoveryMode) { + return array; + } + throw new ParserEOFException("End of file inside array."); + } + this.shift(); + return array; + case "<<": + const dict = new Dict(this.xref); + while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) { + if (!(this.buf1 instanceof Name)) { + info("Malformed dictionary: key must be a name object"); + this.shift(); + continue; + } + const key = this.buf1.name; + this.shift(); + if (this.buf1 === EOF) { + break; + } + dict.set(key, this.getObj(cipherTransform)); + } + if (this.buf1 === EOF) { + if (this.recoveryMode) { + return dict; + } + throw new ParserEOFException("End of file inside dictionary."); + } + if (isCmd(this.buf2, "stream")) { + return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict; + } + this.shift(); + return dict; + default: + return buf1; + } + } + if (Number.isInteger(buf1)) { + if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) { + const ref = Ref.get(buf1, this.buf1); + this.shift(); + this.shift(); + return ref; + } + return buf1; + } + if (typeof buf1 === "string") { + if (cipherTransform) { + return cipherTransform.decryptString(buf1); + } + return buf1; + } + return buf1; + } + findDefaultInlineStreamEnd(stream) { + const E = 0x45, + I = 0x49, + SPACE = 0x20, + LF = 0xa, + CR = 0xd, + NUL = 0x0; + const { + knownCommands + } = this.lexer, + startPos = stream.pos, + n = 15; + let state = 0, + ch, + maybeEIPos; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else { + if (ch === SPACE || ch === LF || ch === CR) { + maybeEIPos = stream.pos; + const followingBytes = stream.peekBytes(n); + const ii = followingBytes.length; + if (ii === 0) { + break; + } + for (let i = 0; i < ii; i++) { + ch = followingBytes[i]; + if (ch === NUL && followingBytes[i + 1] !== NUL) { + continue; + } + if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) { + state = 0; + break; + } + } + if (state !== 2) { + continue; + } + if (!knownCommands) { + warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined."); + continue; + } + const tmpLexer = new Lexer(new Stream(followingBytes.slice()), knownCommands); + tmpLexer._hexStringWarn = () => {}; + let numArgs = 0; + while (true) { + const nextObj = tmpLexer.getObj(); + if (nextObj === EOF) { + state = 0; + break; + } + if (nextObj instanceof Cmd) { + const knownCommand = knownCommands[nextObj.cmd]; + if (!knownCommand) { + state = 0; + break; + } else if (knownCommand.variableArgs ? numArgs <= knownCommand.numArgs : numArgs === knownCommand.numArgs) { + break; + } + numArgs = 0; + continue; + } + numArgs++; + } + if (state === 2) { + break; + } + } else { + state = 0; + } + } + } + if (ch === -1) { + warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker"); + if (maybeEIPos) { + warn('... trying to recover by using the last "EI" occurrence.'); + stream.skip(-(stream.pos - maybeEIPos)); + } + } + let endOffset = 4; + stream.skip(-endOffset); + ch = stream.peekByte(); + stream.skip(endOffset); + if (!isWhiteSpace(ch)) { + endOffset--; + } + return stream.pos - endOffset - startPos; + } + findDCTDecodeInlineStreamEnd(stream) { + const startPos = stream.pos; + let foundEOI = false, + b, + markerLength; + while ((b = stream.getByte()) !== -1) { + if (b !== 0xff) { + continue; + } + switch (stream.getByte()) { + case 0x00: + break; + case 0xff: + stream.skip(-1); + break; + case 0xd9: + foundEOI = true; + break; + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc5: + case 0xc6: + case 0xc7: + case 0xc9: + case 0xca: + case 0xcb: + case 0xcd: + case 0xce: + case 0xcf: + case 0xc4: + case 0xcc: + case 0xda: + case 0xdb: + case 0xdc: + case 0xdd: + case 0xde: + case 0xdf: + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + case 0xe8: + case 0xe9: + case 0xea: + case 0xeb: + case 0xec: + case 0xed: + case 0xee: + case 0xef: + case 0xfe: + markerLength = stream.getUint16(); + if (markerLength > 2) { + stream.skip(markerLength - 2); + } else { + stream.skip(-2); + } + break; + } + if (foundEOI) { + break; + } + } + const length = stream.pos - startPos; + if (b === -1) { + warn("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCII85DecodeInlineStreamEnd(stream) { + const TILDE = 0x7e, + GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === TILDE) { + const tildePos = stream.pos; + ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.skip(); + ch = stream.peekByte(); + } + if (ch === GT) { + stream.skip(); + break; + } + if (stream.pos > tildePos) { + const maybeEI = stream.peekBytes(2); + if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { + break; + } + } + } + } + const length = stream.pos - startPos; + if (ch === -1) { + warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCIIHexDecodeInlineStreamEnd(stream) { + const GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === GT) { + break; + } + } + const length = stream.pos - startPos; + if (ch === -1) { + warn("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + inlineStreamSkipEI(stream) { + const E = 0x45, + I = 0x49; + let state = 0, + ch; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else if (state === 2) { + break; + } + } + } + makeInlineImage(cipherTransform) { + const lexer = this.lexer; + const stream = lexer.stream; + const dictMap = Object.create(null); + let dictLength; + while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) { + if (!(this.buf1 instanceof Name)) { + throw new FormatError("Dictionary key must be a name object"); + } + const key = this.buf1.name; + this.shift(); + if (this.buf1 === EOF) { + break; + } + dictMap[key] = this.getObj(cipherTransform); + } + if (lexer.beginInlineImagePos !== -1) { + dictLength = stream.pos - lexer.beginInlineImagePos; + } + const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = this.xref.fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } + } + const startPos = stream.pos; + let length; + switch (filterName) { + case "DCT": + case "DCTDecode": + length = this.findDCTDecodeInlineStreamEnd(stream); + break; + case "A85": + case "ASCII85Decode": + length = this.findASCII85DecodeInlineStreamEnd(stream); + break; + case "AHx": + case "ASCIIHexDecode": + length = this.findASCIIHexDecodeInlineStreamEnd(stream); + break; + default: + length = this.findDefaultInlineStreamEnd(stream); + } + let cacheKey; + if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) { + const initialStreamPos = stream.pos; + stream.pos = lexer.beginInlineImagePos; + cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length)); + stream.pos = initialStreamPos; + const cacheEntry = this.imageCache[cacheKey]; + if (cacheEntry !== undefined) { + this.buf2 = Cmd.get("EI"); + this.shift(); + cacheEntry.reset(); + return cacheEntry; + } + } + const dict = new Dict(this.xref); + for (const key in dictMap) { + dict.set(key, dictMap[key]); + } + let imageStream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + imageStream = cipherTransform.createStream(imageStream, length); + } + imageStream = this.filter(imageStream, dict, length); + imageStream.dict = dict; + if (cacheKey !== undefined) { + imageStream.cacheKey = `inline_img_${++this._imageId}`; + this.imageCache[cacheKey] = imageStream; + } + this.buf2 = Cmd.get("EI"); + this.shift(); + return imageStream; + } + #findStreamLength(startPos) { + const { + stream + } = this.lexer; + stream.pos = startPos; + const SCAN_BLOCK_LENGTH = 2048; + const signatureLength = "endstream".length; + const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]); + const endLength = END_SIGNATURE.length; + const PARTIAL_SIGNATURE = [new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61])]; + const normalLength = signatureLength - endLength; + while (stream.pos < stream.end) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + break; + } + let pos = 0; + while (pos < scanLength) { + let j = 0; + while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) { + j++; + } + if (j >= endLength) { + let found = false; + for (const part of PARTIAL_SIGNATURE) { + const partLen = part.length; + let k = 0; + while (k < partLen && scanBytes[pos + j + k] === part[k]) { + k++; + } + if (k >= normalLength) { + found = true; + break; + } + if (k >= partLen) { + const lastByte = scanBytes[pos + j + k]; + if (isWhiteSpace(lastByte)) { + info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command."); + found = true; + } + break; + } + } + if (found) { + stream.pos += pos; + return stream.pos - startPos; + } + } + pos++; + } + stream.pos += scanLength; + } + return -1; + } + makeStream(dict, cipherTransform) { + const lexer = this.lexer; + let stream = lexer.stream; + lexer.skipToNextLine(); + const startPos = stream.pos - 1; + let length = dict.get("Length"); + if (!Number.isInteger(length)) { + info(`Bad length "${length && length.toString()}" in stream.`); + length = 0; + } + stream.pos = startPos + length; + lexer.nextChar(); + if (this.tryShift() && isCmd(this.buf2, "endstream")) { + this.shift(); + } else { + length = this.#findStreamLength(startPos); + if (length < 0) { + throw new FormatError("Missing endstream command."); + } + lexer.nextChar(); + this.shift(); + this.shift(); + } + this.shift(); + stream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + stream = cipherTransform.createStream(stream, length); + } + stream = this.filter(stream, dict, length); + stream.dict = dict; + return stream; + } + filter(stream, dict, length) { + let filter = dict.get("F", "Filter"); + let params = dict.get("DP", "DecodeParms"); + if (filter instanceof Name) { + if (Array.isArray(params)) { + warn("/DecodeParms should not be an Array, when /Filter is a Name."); + } + return this.makeFilter(stream, filter.name, length, params); + } + let maybeLength = length; + if (Array.isArray(filter)) { + const filterArray = filter; + const paramsArray = params; + for (let i = 0, ii = filterArray.length; i < ii; ++i) { + filter = this.xref.fetchIfRef(filterArray[i]); + if (!(filter instanceof Name)) { + throw new FormatError(`Bad filter name "${filter}"`); + } + params = null; + if (Array.isArray(paramsArray) && i in paramsArray) { + params = this.xref.fetchIfRef(paramsArray[i]); + } + stream = this.makeFilter(stream, filter.name, maybeLength, params); + maybeLength = null; + } + } + return stream; + } + makeFilter(stream, name, maybeLength, params) { + if (maybeLength === 0) { + warn(`Empty "${name}" stream.`); + return new NullStream(); + } + try { + switch (name) { + case "Fl": + case "FlateDecode": + if (params) { + return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); + } + return new FlateStream(stream, maybeLength); + case "LZW": + case "LZWDecode": + let earlyChange = 1; + if (params) { + if (params.has("EarlyChange")) { + earlyChange = params.get("EarlyChange"); + } + return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params); + } + return new LZWStream(stream, maybeLength, earlyChange); + case "DCT": + case "DCTDecode": + return new JpegStream(stream, maybeLength, params); + case "JPX": + case "JPXDecode": + return new JpxStream(stream, maybeLength, params); + case "A85": + case "ASCII85Decode": + return new Ascii85Stream(stream, maybeLength); + case "AHx": + case "ASCIIHexDecode": + return new AsciiHexStream(stream, maybeLength); + case "CCF": + case "CCITTFaxDecode": + return new CCITTFaxStream(stream, maybeLength, params); + case "RL": + case "RunLengthDecode": + return new RunLengthStream(stream, maybeLength); + case "JBIG2Decode": + return new Jbig2Stream(stream, maybeLength, params); + } + warn(`Filter "${name}" is not supported.`); + return stream; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Invalid stream: "${ex}"`); + return new NullStream(); + } + } +} +const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +function toHexDigit(ch) { + if (ch >= 0x30 && ch <= 0x39) { + return ch & 0x0f; + } + if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + return (ch & 0x0f) + 9; + } + return -1; +} +class Lexer { + constructor(stream, knownCommands = null) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + this.knownCommands = knownCommands; + this._hexStringNumWarn = 0; + this.beginInlineImagePos = -1; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + peekChar() { + return this.stream.peekByte(); + } + getNumber() { + let ch = this.currentChar; + let eNotation = false; + let divideBy = 0; + let sign = 1; + if (ch === 0x2d) { + sign = -1; + ch = this.nextChar(); + if (ch === 0x2d) { + ch = this.nextChar(); + } + } else if (ch === 0x2b) { + ch = this.nextChar(); + } + if (ch === 0x0a || ch === 0x0d) { + do { + ch = this.nextChar(); + } while (ch === 0x0a || ch === 0x0d); + } + if (ch === 0x2e) { + divideBy = 10; + ch = this.nextChar(); + } + if (ch < 0x30 || ch > 0x39) { + const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; + if (isWhiteSpace(ch) || ch === -1) { + info(`Lexer.getNumber - "${msg}".`); + return 0; + } + throw new FormatError(msg); + } + let baseValue = ch - 0x30; + let powerValue = 0; + let powerValueSign = 1; + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39) { + const currentDigit = ch - 0x30; + if (eNotation) { + powerValue = powerValue * 10 + currentDigit; + } else { + if (divideBy !== 0) { + divideBy *= 10; + } + baseValue = baseValue * 10 + currentDigit; + } + } else if (ch === 0x2e) { + if (divideBy === 0) { + divideBy = 1; + } else { + break; + } + } else if (ch === 0x2d) { + warn("Badly formatted number: minus sign in the middle"); + } else if (ch === 0x45 || ch === 0x65) { + ch = this.peekChar(); + if (ch === 0x2b || ch === 0x2d) { + powerValueSign = ch === 0x2d ? -1 : 1; + this.nextChar(); + } else if (ch < 0x30 || ch > 0x39) { + break; + } + eNotation = true; + } else { + break; + } + } + if (divideBy !== 0) { + baseValue /= divideBy; + } + if (eNotation) { + baseValue *= 10 ** (powerValueSign * powerValue); + } + return sign * baseValue; + } + getString() { + let numParen = 1; + let done = false; + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.nextChar(); + while (true) { + let charBuffered = false; + switch (ch | 0) { + case -1: + warn("Unterminated string"); + done = true; + break; + case 0x28: + ++numParen; + strBuf.push("("); + break; + case 0x29: + if (--numParen === 0) { + this.nextChar(); + done = true; + } else { + strBuf.push(")"); + } + break; + case 0x5c: + ch = this.nextChar(); + switch (ch) { + case -1: + warn("Unterminated string"); + done = true; + break; + case 0x6e: + strBuf.push("\n"); + break; + case 0x72: + strBuf.push("\r"); + break; + case 0x74: + strBuf.push("\t"); + break; + case 0x62: + strBuf.push("\b"); + break; + case 0x66: + strBuf.push("\f"); + break; + case 0x5c: + case 0x28: + case 0x29: + strBuf.push(String.fromCharCode(ch)); + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + let x = ch & 0x0f; + ch = this.nextChar(); + charBuffered = true; + if (ch >= 0x30 && ch <= 0x37) { + x = (x << 3) + (ch & 0x0f); + ch = this.nextChar(); + if (ch >= 0x30 && ch <= 0x37) { + charBuffered = false; + x = (x << 3) + (ch & 0x0f); + } + } + strBuf.push(String.fromCharCode(x)); + break; + case 0x0d: + if (this.peekChar() === 0x0a) { + this.nextChar(); + } + break; + case 0x0a: + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); + } + } + return strBuf.join(""); + } + getName() { + let ch, previousCh; + const strBuf = this.strBuf; + strBuf.length = 0; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + if (ch === 0x23) { + ch = this.nextChar(); + if (specialChars[ch]) { + warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); + strBuf.push("#"); + break; + } + const x = toHexDigit(ch); + if (x !== -1) { + previousCh = ch; + ch = this.nextChar(); + const x2 = toHexDigit(ch); + if (x2 === -1) { + warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); + strBuf.push("#", String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); + continue; + } + strBuf.push(String.fromCharCode(x << 4 | x2)); + } else { + strBuf.push("#", String.fromCharCode(ch)); + } + } else { + strBuf.push(String.fromCharCode(ch)); + } + } + if (strBuf.length > 127) { + warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); + } + return Name.get(strBuf.join("")); + } + _hexStringWarn(ch) { + const MAX_HEX_STRING_NUM_WARN = 5; + if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { + warn("getHexString - ignoring additional invalid characters."); + return; + } + if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { + return; + } + warn(`getHexString - ignoring invalid character: ${ch}`); + } + getHexString() { + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.currentChar; + let firstDigit = -1, + digit = -1; + this._hexStringNumWarn = 0; + while (true) { + if (ch < 0) { + warn("Unterminated hex string"); + break; + } else if (ch === 0x3e) { + this.nextChar(); + break; + } else if (specialChars[ch] === 1) { + ch = this.nextChar(); + continue; + } else { + digit = toHexDigit(ch); + if (digit === -1) { + this._hexStringWarn(ch); + } else if (firstDigit === -1) { + firstDigit = digit; + } else { + strBuf.push(String.fromCharCode(firstDigit << 4 | digit)); + firstDigit = -1; + } + ch = this.nextChar(); + } + } + if (firstDigit !== -1) { + strBuf.push(String.fromCharCode(firstDigit << 4)); + } + return strBuf.join(""); + } + getObj() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (specialChars[ch] !== 1) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return this.getNumber(); + case 0x28: + return this.getString(); + case 0x2f: + return this.getName(); + case 0x5b: + this.nextChar(); + return Cmd.get("["); + case 0x5d: + this.nextChar(); + return Cmd.get("]"); + case 0x3c: + ch = this.nextChar(); + if (ch === 0x3c) { + this.nextChar(); + return Cmd.get("<<"); + } + return this.getHexString(); + case 0x3e: + ch = this.nextChar(); + if (ch === 0x3e) { + this.nextChar(); + return Cmd.get(">>"); + } + return Cmd.get(">"); + case 0x7b: + this.nextChar(); + return Cmd.get("{"); + case 0x7d: + this.nextChar(); + return Cmd.get("}"); + case 0x29: + this.nextChar(); + throw new FormatError(`Illegal character: ${ch}`); + } + let str = String.fromCharCode(ch); + if (ch < 0x20 || ch > 0x7f) { + const nextCh = this.peekChar(); + if (nextCh >= 0x20 && nextCh <= 0x7f) { + this.nextChar(); + return Cmd.get(str); + } + } + const knownCommands = this.knownCommands; + let knownCommandFound = knownCommands?.[str] !== undefined; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + const possibleCommand = str + String.fromCharCode(ch); + if (knownCommandFound && knownCommands[possibleCommand] === undefined) { + break; + } + if (str.length === 128) { + throw new FormatError(`Command token too long: ${str.length}`); + } + str = possibleCommand; + knownCommandFound = knownCommands?.[str] !== undefined; + } + if (str === "true") { + return true; + } + if (str === "false") { + return false; + } + if (str === "null") { + return null; + } + if (str === "BI") { + this.beginInlineImagePos = this.stream.pos; + } + return Cmd.get(str); + } + skipToNextLine() { + let ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0d) { + ch = this.nextChar(); + if (ch === 0x0a) { + this.nextChar(); + } + break; + } else if (ch === 0x0a) { + this.nextChar(); + break; + } + ch = this.nextChar(); + } + } +} +class Linearization { + static create(stream) { + function getInt(linDict, name, allowZeroValue = false) { + const obj = linDict.get(name); + if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } + throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); + } + function getHints(linDict) { + const hints = linDict.get("H"); + let hintsLength; + if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { + for (let index = 0; index < hintsLength; index++) { + const hint = hints[index]; + if (!(Number.isInteger(hint) && hint > 0)) { + throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); + } + } + return hints; + } + throw new Error("Hint array in the linearization dictionary is invalid."); + } + const parser = new Parser({ + lexer: new Lexer(stream), + xref: null + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + const linDict = parser.getObj(); + let obj, length; + if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { + return null; + } else if ((length = getInt(linDict, "L")) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); + } + return { + length, + hints: getHints(linDict), + objectNumberFirst: getInt(linDict, "O"), + endFirst: getInt(linDict, "E"), + numPages: getInt(linDict, "N"), + mainXRefEntriesOffset: getInt(linDict, "T"), + pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 + }; + } +} + +;// ./src/core/cmap.js + + + + + + + +const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; +const MAX_MAP_RANGE = 2 ** 24 - 1; +class CMap { + constructor(builtInCMap = false) { + this.codespaceRanges = [[], [], [], []]; + this.numCodespaceRanges = 0; + this._map = []; + this.name = ""; + this.vertical = false; + this.useCMap = null; + this.builtInCMap = builtInCMap; + } + addCodespaceRange(n, low, high) { + this.codespaceRanges[n - 1].push(low, high); + this.numCodespaceRanges++; + } + mapCidRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); + } + while (low <= high) { + this._map[low++] = dstLow++; + } + } + mapBfRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); + } + const lastByte = dstLow.length - 1; + while (low <= high) { + this._map[low++] = dstLow; + const nextCharCode = dstLow.charCodeAt(lastByte) + 1; + if (nextCharCode > 0xff) { + dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; + continue; + } + dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); + } + } + mapBfRangeToArray(low, high, array) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); + } + const ii = array.length; + let i = 0; + while (low <= high && i < ii) { + this._map[low] = array[i++]; + ++low; + } + } + mapOne(src, dst) { + this._map[src] = dst; + } + lookup(code) { + return this._map[code]; + } + contains(code) { + return this._map[code] !== undefined; + } + forEach(callback) { + const map = this._map; + const length = map.length; + if (length <= 0x10000) { + for (let i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (const i in map) { + callback(i, map[i]); + } + } + } + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; + } + getMap() { + return this._map; + } + readCharCode(str, offset, out) { + let c = 0; + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (c >= low && c <= high) { + out.charcode = c; + out.length = n + 1; + return; + } + } + } + out.charcode = 0; + out.length = 1; + } + getCharCodeLength(charCode) { + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (charCode >= low && charCode <= high) { + return n + 1; + } + } + } + return 1; + } + get length() { + return this._map.length; + } + get isIdentityCMap() { + if (!(this.name === "Identity-H" || this.name === "Identity-V")) { + return false; + } + if (this._map.length !== 0x10000) { + return false; + } + for (let i = 0; i < 0x10000; i++) { + if (this._map[i] !== i) { + return false; + } + } + return true; + } +} +class IdentityCMap extends CMap { + constructor(vertical, n) { + super(); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); + } + mapCidRange(low, high, dstLow) { + unreachable("should not call mapCidRange"); + } + mapBfRange(low, high, dstLow) { + unreachable("should not call mapBfRange"); + } + mapBfRangeToArray(low, high, array) { + unreachable("should not call mapBfRangeToArray"); + } + mapOne(src, dst) { + unreachable("should not call mapCidOne"); + } + lookup(code) { + return Number.isInteger(code) && code <= 0xffff ? code : undefined; + } + contains(code) { + return Number.isInteger(code) && code <= 0xffff; + } + forEach(callback) { + for (let i = 0; i <= 0xffff; i++) { + callback(i, i); + } + } + charCodeOf(value) { + return Number.isInteger(value) && value <= 0xffff ? value : -1; + } + getMap() { + const map = new Array(0x10000); + for (let i = 0; i <= 0xffff; i++) { + map[i] = i; + } + return map; + } + get length() { + return 0x10000; + } + get isIdentityCMap() { + unreachable("should not access .isIdentityCMap"); + } +} +function strToInt(str) { + let a = 0; + for (let i = 0; i < str.length; i++) { + a = a << 8 | str.charCodeAt(i); + } + return a >>> 0; +} +function expectString(obj) { + if (typeof obj !== "string") { + throw new FormatError("Malformed CMap: expected string."); + } +} +function expectInt(obj) { + if (!Number.isInteger(obj)) { + throw new FormatError("Malformed CMap: expected int."); + } +} +function parseBfChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endbfchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const dst = obj; + cMap.mapOne(src, dst); + } +} +function parseBfRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endbfrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + if (Number.isInteger(obj) || typeof obj === "string") { + const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; + cMap.mapBfRange(low, high, dstLow); + } else if (isCmd(obj, "[")) { + obj = lexer.getObj(); + const array = []; + while (!isCmd(obj, "]") && obj !== EOF) { + array.push(obj); + obj = lexer.getObj(); + } + cMap.mapBfRangeToArray(low, high, array); + } else { + break; + } + } + throw new FormatError("Invalid bf range."); +} +function parseCidChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcidchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dst = obj; + cMap.mapOne(src, dst); + } +} +function parseCidRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcidrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dstLow = obj; + cMap.mapCidRange(low, high, dstLow); + } +} +function parseCodespaceRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcodespacerange")) { + return; + } + if (typeof obj !== "string") { + break; + } + const low = strToInt(obj); + obj = lexer.getObj(); + if (typeof obj !== "string") { + break; + } + const high = strToInt(obj); + cMap.addCodespaceRange(obj.length, low, high); + } + throw new FormatError("Invalid codespace range."); +} +function parseWMode(cMap, lexer) { + const obj = lexer.getObj(); + if (Number.isInteger(obj)) { + cMap.vertical = !!obj; + } +} +function parseCMapName(cMap, lexer) { + const obj = lexer.getObj(); + if (obj instanceof Name) { + cMap.name = obj.name; + } +} +async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { + let previous, embeddedUseCMap; + objLoop: while (true) { + try { + const obj = lexer.getObj(); + if (obj === EOF) { + break; + } else if (obj instanceof Name) { + if (obj.name === "WMode") { + parseWMode(cMap, lexer); + } else if (obj.name === "CMapName") { + parseCMapName(cMap, lexer); + } + previous = obj; + } else if (obj instanceof Cmd) { + switch (obj.cmd) { + case "endcmap": + break objLoop; + case "usecmap": + if (previous instanceof Name) { + embeddedUseCMap = previous.name; + } + break; + case "begincodespacerange": + parseCodespaceRange(cMap, lexer); + break; + case "beginbfchar": + parseBfChar(cMap, lexer); + break; + case "begincidchar": + parseCidChar(cMap, lexer); + break; + case "beginbfrange": + parseBfRange(cMap, lexer); + break; + case "begincidrange": + parseCidRange(cMap, lexer); + break; + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Invalid cMap data: " + ex); + continue; + } + } + if (!useCMap && embeddedUseCMap) { + useCMap = embeddedUseCMap; + } + if (useCMap) { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + } + return cMap; +} +async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { + cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); + if (cMap.numCodespaceRanges === 0) { + const useCodespaceRanges = cMap.useCMap.codespaceRanges; + for (let i = 0; i < useCodespaceRanges.length; i++) { + cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); + } + cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; + } + cMap.useCMap.forEach(function (key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, value); + } + }); + return cMap; +} +async function createBuiltInCMap(name, fetchBuiltInCMap) { + if (name === "Identity-H") { + return new IdentityCMap(false, 2); + } else if (name === "Identity-V") { + return new IdentityCMap(true, 2); + } + if (!BUILT_IN_CMAPS.includes(name)) { + throw new Error("Unknown CMap name: " + name); + } + if (!fetchBuiltInCMap) { + throw new Error("Built-in CMap parameters are not provided."); + } + const { + cMapData, + isCompressed + } = await fetchBuiltInCMap(name); + const cMap = new CMap(true); + if (isCompressed) { + return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap)); + } + const lexer = new Lexer(new Stream(cMapData)); + return parseCMap(cMap, lexer, fetchBuiltInCMap, null); +} +class CMapFactory { + static async create({ + encoding, + fetchBuiltInCMap, + useCMap + }) { + if (encoding instanceof Name) { + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); + } else if (encoding instanceof BaseStream) { + const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); + if (parsedCMap.isIdentityCMap) { + return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); + } + return parsedCMap; + } + throw new Error("Encoding required."); + } +} + +;// ./src/core/charsets.js +const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; +const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"]; + +;// ./src/core/encodings.js +const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""]; +const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"]; +const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""]; +const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"]; +const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""]; +const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""]; +function getEncoding(encodingName) { + switch (encodingName) { + case "WinAnsiEncoding": + return WinAnsiEncoding; + case "StandardEncoding": + return StandardEncoding; + case "MacRomanEncoding": + return MacRomanEncoding; + case "SymbolSetEncoding": + return SymbolSetEncoding; + case "ZapfDingbatsEncoding": + return ZapfDingbatsEncoding; + case "ExpertEncoding": + return ExpertEncoding; + case "MacExpertEncoding": + return MacExpertEncoding; + default: + return null; + } +} + +;// ./src/core/cff_parser.js + + + +const MAX_SUBR_NESTING = 10; +const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; +const NUM_STANDARD_CFF_STRINGS = 391; +const CharstringValidationData = [null, { + id: "hstem", + min: 2, + stackClearing: true, + stem: true +}, null, { + id: "vstem", + min: 2, + stackClearing: true, + stem: true +}, { + id: "vmoveto", + min: 1, + stackClearing: true +}, { + id: "rlineto", + min: 2, + resetStack: true +}, { + id: "hlineto", + min: 1, + resetStack: true +}, { + id: "vlineto", + min: 1, + resetStack: true +}, { + id: "rrcurveto", + min: 6, + resetStack: true +}, null, { + id: "callsubr", + min: 1, + undefStack: true +}, { + id: "return", + min: 0, + undefStack: true +}, null, null, { + id: "endchar", + min: 0, + stackClearing: true +}, null, null, null, { + id: "hstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "hintmask", + min: 0, + stackClearing: true +}, { + id: "cntrmask", + min: 0, + stackClearing: true +}, { + id: "rmoveto", + min: 2, + stackClearing: true +}, { + id: "hmoveto", + min: 1, + stackClearing: true +}, { + id: "vstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "rcurveline", + min: 8, + resetStack: true +}, { + id: "rlinecurve", + min: 8, + resetStack: true +}, { + id: "vvcurveto", + min: 4, + resetStack: true +}, { + id: "hhcurveto", + min: 4, + resetStack: true +}, null, { + id: "callgsubr", + min: 1, + undefStack: true +}, { + id: "vhcurveto", + min: 4, + resetStack: true +}, { + id: "hvcurveto", + min: 4, + resetStack: true +}]; +const CharstringValidationData12 = [null, null, null, { + id: "and", + min: 2, + stackDelta: -1 +}, { + id: "or", + min: 2, + stackDelta: -1 +}, { + id: "not", + min: 1, + stackDelta: 0 +}, null, null, null, { + id: "abs", + min: 1, + stackDelta: 0 +}, { + id: "add", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] + stack[index - 1]; + } +}, { + id: "sub", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 1]; + } +}, { + id: "div", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] / stack[index - 1]; + } +}, null, { + id: "neg", + min: 1, + stackDelta: 0, + stackFn(stack, index) { + stack[index - 1] = -stack[index - 1]; + } +}, { + id: "eq", + min: 2, + stackDelta: -1 +}, null, null, { + id: "drop", + min: 1, + stackDelta: -1 +}, null, { + id: "put", + min: 2, + stackDelta: -2 +}, { + id: "get", + min: 1, + stackDelta: 0 +}, { + id: "ifelse", + min: 4, + stackDelta: -3 +}, { + id: "random", + min: 0, + stackDelta: 1 +}, { + id: "mul", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] * stack[index - 1]; + } +}, null, { + id: "sqrt", + min: 1, + stackDelta: 0 +}, { + id: "dup", + min: 1, + stackDelta: 1 +}, { + id: "exch", + min: 2, + stackDelta: 0 +}, { + id: "index", + min: 2, + stackDelta: 0 +}, { + id: "roll", + min: 3, + stackDelta: -2 +}, null, null, null, { + id: "hflex", + min: 7, + resetStack: true +}, { + id: "flex", + min: 13, + resetStack: true +}, { + id: "hflex1", + min: 9, + resetStack: true +}, { + id: "flex1", + min: 11, + resetStack: true +}]; +class CFFParser { + constructor(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + } + parse() { + const properties = this.properties; + const cff = new CFF(); + this.cff = cff; + const header = this.parseHeader(); + const nameIndex = this.parseIndex(header.endPos); + const topDictIndex = this.parseIndex(nameIndex.endPos); + const stringIndex = this.parseIndex(topDictIndex.endPos); + const globalSubrIndex = this.parseIndex(stringIndex.endPos); + const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); + const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); + cff.header = header.obj; + cff.names = this.parseNameIndex(nameIndex.obj); + cff.strings = this.parseStringIndex(stringIndex.obj); + cff.topDict = topDict; + cff.globalSubrIndex = globalSubrIndex.obj; + this.parsePrivateDict(cff.topDict); + cff.isCIDFont = topDict.hasName("ROS"); + const charStringOffset = topDict.getByName("CharStrings"); + const charStringIndex = this.parseIndex(charStringOffset).obj; + const fontMatrix = topDict.getByName("FontMatrix"); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; + } + const fontBBox = topDict.getByName("FontBBox"); + if (fontBBox) { + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + } + let charset, encoding; + if (cff.isCIDFont) { + const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; + for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { + const dictRaw = fdArrayIndex.get(i); + const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); + this.parsePrivateDict(fontDict); + cff.fdArray.push(fontDict); + } + encoding = null; + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); + cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); + } else { + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); + encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); + } + cff.charset = charset; + cff.encoding = encoding; + const charStringsAndSeacs = this.parseCharStrings({ + charStrings: charStringIndex, + localSubrIndex: topDict.privateDict.subrsIndex, + globalSubrIndex: globalSubrIndex.obj, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray, + privateDict: topDict.privateDict + }); + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; + } + parseHeader() { + let bytes = this.bytes; + const bytesLength = bytes.length; + let offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; + } + if (offset >= bytesLength) { + throw new FormatError("Invalid CFF header"); + } + if (offset !== 0) { + info("cff data is shifted"); + bytes = bytes.subarray(offset); + this.bytes = bytes; + } + const major = bytes[0]; + const minor = bytes[1]; + const hdrSize = bytes[2]; + const offSize = bytes[3]; + const header = new CFFHeader(major, minor, hdrSize, offSize); + return { + obj: header, + endPos: hdrSize + }; + } + parseDict(dict) { + let pos = 0; + function parseOperand() { + let value = dict[pos++]; + if (value === 30) { + return parseFloatOperand(); + } else if (value === 28) { + value = dict[pos++]; + value = (value << 24 | dict[pos++] << 16) >> 16; + return value; + } else if (value === 29) { + value = dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + return value; + } else if (value >= 32 && value <= 246) { + return value - 139; + } else if (value >= 247 && value <= 250) { + return (value - 247) * 256 + dict[pos++] + 108; + } else if (value >= 251 && value <= 254) { + return -((value - 251) * 256) - dict[pos++] - 108; + } + warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); + return NaN; + } + function parseFloatOperand() { + let str = ""; + const eof = 15; + const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; + const length = dict.length; + while (pos < length) { + const b = dict[pos++]; + const b1 = b >> 4; + const b2 = b & 15; + if (b1 === eof) { + break; + } + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; + } + return parseFloat(str); + } + let operands = []; + const entries = []; + pos = 0; + const end = dict.length; + while (pos < end) { + let b = dict[pos]; + if (b <= 21) { + if (b === 12) { + b = b << 8 | dict[++pos]; + } + entries.push([b, operands]); + operands = []; + ++pos; + } else { + operands.push(parseOperand()); + } + } + return entries; + } + parseIndex(pos) { + const cffIndex = new CFFIndex(); + const bytes = this.bytes; + const count = bytes[pos++] << 8 | bytes[pos++]; + const offsets = []; + let end = pos; + let i, ii; + if (count !== 0) { + const offsetSize = bytes[pos++]; + const startPos = pos + (count + 1) * offsetSize - 1; + for (i = 0, ii = count + 1; i < ii; ++i) { + let offset = 0; + for (let j = 0; j < offsetSize; ++j) { + offset <<= 8; + offset += bytes[pos++]; + } + offsets.push(startPos + offset); + } + end = offsets[count]; + } + for (i = 0, ii = offsets.length - 1; i < ii; ++i) { + const offsetStart = offsets[i]; + const offsetEnd = offsets[i + 1]; + cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); + } + return { + obj: cffIndex, + endPos: end + }; + } + parseNameIndex(index) { + const names = []; + for (let i = 0, ii = index.count; i < ii; ++i) { + const name = index.get(i); + names.push(bytesToString(name)); + } + return names; + } + parseStringIndex(index) { + const strings = new CFFStrings(); + for (let i = 0, ii = index.count; i < ii; ++i) { + const data = index.get(i); + strings.add(bytesToString(data)); + } + return strings; + } + createDict(Type, dict, strings) { + const cffDict = new Type(strings); + for (const [key, value] of dict) { + cffDict.setByKey(key, value); + } + return cffDict; + } + parseCharString(state, data, localSubrIndex, globalSubrIndex) { + if (!data || state.callDepth > MAX_SUBR_NESTING) { + return false; + } + let stackSize = state.stackSize; + const stack = state.stack; + let length = data.length; + for (let j = 0; j < length;) { + const value = data[j++]; + let validationCommand = null; + if (value === 12) { + const q = data[j++]; + if (q === 0) { + data[j - 2] = 139; + data[j - 1] = 22; + stackSize = 0; + } else { + validationCommand = CharstringValidationData12[q]; + } + } else if (value === 28) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16; + j += 2; + stackSize++; + } else if (value === 14) { + if (stackSize >= 4) { + stackSize -= 4; + if (this.seacAnalysisEnabled) { + state.seac = stack.slice(stackSize, stackSize + 4); + return false; + } + } + validationCommand = CharstringValidationData[value]; + } else if (value >= 32 && value <= 246) { + stack[stackSize] = value - 139; + stackSize++; + } else if (value >= 247 && value <= 254) { + stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; + j++; + stackSize++; + } else if (value === 255) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; + j += 4; + stackSize++; + } else if (value === 19 || value === 20) { + state.hints += stackSize >> 1; + if (state.hints === 0) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } + j += state.hints + 7 >> 3; + stackSize %= 2; + validationCommand = CharstringValidationData[value]; + } else if (value === 10 || value === 29) { + const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; + if (!subrsIndex) { + validationCommand = CharstringValidationData[value]; + warn("Missing subrsIndex for " + validationCommand.id); + return false; + } + let bias = 32768; + if (subrsIndex.count < 1240) { + bias = 107; + } else if (subrsIndex.count < 33900) { + bias = 1131; + } + const subrNumber = stack[--stackSize] + bias; + if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { + validationCommand = CharstringValidationData[value]; + warn("Out of bounds subrIndex for " + validationCommand.id); + return false; + } + state.stackSize = stackSize; + state.callDepth++; + const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); + if (!valid) { + return false; + } + state.callDepth--; + stackSize = state.stackSize; + continue; + } else if (value === 11) { + state.stackSize = stackSize; + return true; + } else if (value === 0 && j === data.length) { + data[j - 1] = 14; + validationCommand = CharstringValidationData[14]; + } else if (value === 9) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } else { + validationCommand = CharstringValidationData[value]; + } + if (validationCommand) { + if (validationCommand.stem) { + state.hints += stackSize >> 1; + if (value === 3 || value === 23) { + state.hasVStems = true; + } else if (state.hasVStems && (value === 1 || value === 18)) { + warn("CFF stem hints are in wrong order"); + data[j - 1] = value === 1 ? 3 : 23; + } + } + if ("min" in validationCommand) { + if (!state.undefStack && stackSize < validationCommand.min) { + warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); + if (stackSize === 0) { + data[j - 1] = 14; + return true; + } + return false; + } + } + if (state.firstStackClearing && validationCommand.stackClearing) { + state.firstStackClearing = false; + stackSize -= validationCommand.min; + if (stackSize >= 2 && validationCommand.stem) { + stackSize %= 2; + } else if (stackSize > 1) { + warn("Found too many parameters for stack-clearing command"); + } + if (stackSize > 0) { + state.width = stack[stackSize - 1]; + } + } + if ("stackDelta" in validationCommand) { + if ("stackFn" in validationCommand) { + validationCommand.stackFn(stack, stackSize); + } + stackSize += validationCommand.stackDelta; + } else if (validationCommand.stackClearing) { + stackSize = 0; + } else if (validationCommand.resetStack) { + stackSize = 0; + state.undefStack = false; + } else if (validationCommand.undefStack) { + stackSize = 0; + state.undefStack = true; + state.firstStackClearing = false; + } + } + } + if (length < data.length) { + data.fill(14, length); + } + state.stackSize = stackSize; + return true; + } + parseCharStrings({ + charStrings, + localSubrIndex, + globalSubrIndex, + fdSelect, + fdArray, + privateDict + }) { + const seacs = []; + const widths = []; + const count = charStrings.count; + for (let i = 0; i < count; i++) { + const charstring = charStrings.get(i); + const state = { + callDepth: 0, + stackSize: 0, + stack: [], + undefStack: true, + hints: 0, + firstStackClearing: true, + seac: null, + width: null, + hasVStems: false + }; + let valid = true; + let localSubrToUse = null; + let privateDictToUse = privateDict; + if (fdSelect && fdArray.length) { + const fdIndex = fdSelect.getFDIndex(i); + if (fdIndex === -1) { + warn("Glyph index is not in fd select."); + valid = false; + } + if (fdIndex >= fdArray.length) { + warn("Invalid fd index for glyph index."); + valid = false; + } + if (valid) { + privateDictToUse = fdArray[fdIndex].privateDict; + localSubrToUse = privateDictToUse.subrsIndex; + } + } else if (localSubrIndex) { + localSubrToUse = localSubrIndex; + } + if (valid) { + valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); + } + if (state.width !== null) { + const nominalWidth = privateDictToUse.getByName("nominalWidthX"); + widths[i] = nominalWidth + state.width; + } else { + const defaultWidth = privateDictToUse.getByName("defaultWidthX"); + widths[i] = defaultWidth; + } + if (state.seac !== null) { + seacs[i] = state.seac; + } + if (!valid) { + charStrings.set(i, new Uint8Array([14])); + } + } + return { + charStrings, + seacs, + widths + }; + } + emptyPrivateDictionary(parentDict) { + const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [0, 0]); + parentDict.privateDict = privateDict; + } + parsePrivateDict(parentDict) { + if (!parentDict.hasName("Private")) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateOffset = parentDict.getByName("Private"); + if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName("Private"); + return; + } + const size = privateOffset[0]; + const offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateDictEnd = offset + size; + const dictData = this.bytes.subarray(offset, privateDictEnd); + const dict = this.parseDict(dictData); + const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); + parentDict.privateDict = privateDict; + if (privateDict.getByName("ExpansionFactor") === 0) { + privateDict.setByName("ExpansionFactor", 0.06); + } + if (!privateDict.getByName("Subrs")) { + return; + } + const subrsOffset = privateDict.getByName("Subrs"); + const relativeOffset = offset + subrsOffset; + if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const subrsIndex = this.parseIndex(relativeOffset); + privateDict.subrsIndex = subrsIndex.obj; + } + parseCharsets(pos, length, strings, cid) { + if (pos === 0) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); + } else if (pos === 1) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); + } else if (pos === 2) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); + } + const bytes = this.bytes; + const start = pos; + const format = bytes[pos++]; + const charset = [cid ? 0 : ".notdef"]; + let id, count, i; + length -= 1; + switch (format) { + case 0: + for (i = 0; i < length; i++) { + id = bytes[pos++] << 8 | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); + } + break; + case 1: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + case 2: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + default: + throw new FormatError("Unknown charset format"); + } + const end = pos; + const raw = bytes.subarray(start, end); + return new CFFCharset(false, format, charset, raw); + } + parseEncoding(pos, properties, strings, charset) { + const encoding = Object.create(null); + const bytes = this.bytes; + let predefined = false; + let format, i, ii; + let raw = null; + function readSupplement() { + const supplementsCount = bytes[pos++]; + for (i = 0; i < supplementsCount; i++) { + const code = bytes[pos++]; + const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); + encoding[code] = charset.indexOf(strings.get(sid)); + } + } + if (pos === 0 || pos === 1) { + predefined = true; + format = pos; + const baseEncoding = pos ? ExpertEncoding : StandardEncoding; + for (i = 0, ii = charset.length; i < ii; i++) { + const index = baseEncoding.indexOf(charset[i]); + if (index !== -1) { + encoding[index] = i; + } + } + } else { + const dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { + case 0: + const glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } + break; + case 1: + const rangesCount = bytes[pos++]; + let gid = 1; + for (i = 0; i < rangesCount; i++) { + const start = bytes[pos++]; + const left = bytes[pos++]; + for (let j = start; j <= start + left; j++) { + encoding[j] = gid++; + } + } + break; + default: + throw new FormatError(`Unknown encoding format: ${format} in CFF`); + } + const dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); + } + raw = bytes.subarray(dataStart, dataEnd); + } + format &= 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); + } + parseFDSelect(pos, length) { + const bytes = this.bytes; + const format = bytes[pos++]; + const fdSelect = []; + let i; + switch (format) { + case 0: + for (i = 0; i < length; ++i) { + const id = bytes[pos++]; + fdSelect.push(id); + } + break; + case 3: + const rangesCount = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i < rangesCount; ++i) { + let first = bytes[pos++] << 8 | bytes[pos++]; + if (i === 0 && first !== 0) { + warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); + first = 0; + } + const fdIndex = bytes[pos++]; + const next = bytes[pos] << 8 | bytes[pos + 1]; + for (let j = first; j < next; ++j) { + fdSelect.push(fdIndex); + } + } + pos += 2; + break; + default: + throw new FormatError(`parseFDSelect: Unknown format "${format}".`); + } + if (fdSelect.length !== length) { + throw new FormatError("parseFDSelect: Invalid font data."); + } + return new CFFFDSelect(format, fdSelect); + } +} +class CFF { + constructor() { + this.header = null; + this.names = []; + this.topDict = null; + this.strings = new CFFStrings(); + this.globalSubrIndex = null; + this.encoding = null; + this.charset = null; + this.charStrings = null; + this.fdArray = []; + this.fdSelect = null; + this.isCIDFont = false; + } + duplicateFirstGlyph() { + if (this.charStrings.count >= 65535) { + warn("Not enough space in charstrings to duplicate first glyph."); + return; + } + const glyphZero = this.charStrings.get(0); + this.charStrings.add(glyphZero); + if (this.isCIDFont) { + this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + } + } + hasGlyphId(id) { + if (id < 0 || id >= this.charStrings.count) { + return false; + } + const glyph = this.charStrings.get(id); + return glyph.length > 0; + } +} +class CFFHeader { + constructor(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; + } +} +class CFFStrings { + constructor() { + this.strings = []; + } + get(index) { + if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { + return CFFStandardStrings[index]; + } + if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { + return this.strings[index - NUM_STANDARD_CFF_STRINGS]; + } + return CFFStandardStrings[0]; + } + getSID(str) { + let index = CFFStandardStrings.indexOf(str); + if (index !== -1) { + return index; + } + index = this.strings.indexOf(str); + if (index !== -1) { + return index + NUM_STANDARD_CFF_STRINGS; + } + return -1; + } + add(value) { + this.strings.push(value); + } + get count() { + return this.strings.length; + } +} +class CFFIndex { + constructor() { + this.objects = []; + this.length = 0; + } + add(data) { + this.length += data.length; + this.objects.push(data); + } + set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; + } + get(index) { + return this.objects[index]; + } + get count() { + return this.objects.length; + } +} +class CFFDict { + constructor(tables, strings) { + this.keyToNameMap = tables.keyToNameMap; + this.nameToKeyMap = tables.nameToKeyMap; + this.defaults = tables.defaults; + this.types = tables.types; + this.opcodes = tables.opcodes; + this.order = tables.order; + this.strings = strings; + this.values = Object.create(null); + } + setByKey(key, value) { + if (!(key in this.keyToNameMap)) { + return false; + } + if (value.length === 0) { + return true; + } + for (const val of value) { + if (isNaN(val)) { + warn(`Invalid CFFDict value: "${value}" for key "${key}".`); + return true; + } + } + const type = this.types[key]; + if (type === "num" || type === "sid" || type === "offset") { + value = value[0]; + } + this.values[key] = value; + return true; + } + setByName(name, value) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name "${name}"`); + } + this.values[this.nameToKeyMap[name]] = value; + } + hasName(name) { + return this.nameToKeyMap[name] in this.values; + } + getByName(name) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name ${name}"`); + } + const key = this.nameToKeyMap[name]; + if (!(key in this.values)) { + return this.defaults[key]; + } + return this.values[key]; + } + removeByName(name) { + delete this.values[this.nameToKeyMap[name]]; + } + static createTables(layout) { + const tables = { + keyToNameMap: {}, + nameToKeyMap: {}, + defaults: {}, + types: {}, + opcodes: {}, + order: [] + }; + for (const entry of layout) { + const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; + tables.keyToNameMap[key] = entry[1]; + tables.nameToKeyMap[entry[1]] = key; + tables.types[key] = entry[2]; + tables.defaults[key] = entry[3]; + tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; + tables.order.push(key); + } + return tables; + } +} +const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; +class CFFTopDict extends CFFDict { + static get tables() { + return shadow(this, "tables", this.createTables(CFFTopDictLayout)); + } + constructor(strings) { + super(CFFTopDict.tables, strings); + this.privateDict = null; + } +} +const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; +class CFFPrivateDict extends CFFDict { + static get tables() { + return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); + } + constructor(strings) { + super(CFFPrivateDict.tables, strings); + this.subrsIndex = null; + } +} +const CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2 +}; +class CFFCharset { + constructor(predefined, format, charset, raw) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + this.raw = raw; + } +} +class CFFEncoding { + constructor(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; + } +} +class CFFFDSelect { + constructor(format, fdSelect) { + this.format = format; + this.fdSelect = fdSelect; + } + getFDIndex(glyphIndex) { + if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { + return -1; + } + return this.fdSelect[glyphIndex]; + } +} +class CFFOffsetTracker { + constructor() { + this.offsets = Object.create(null); + } + isTracking(key) { + return key in this.offsets; + } + track(key, location) { + if (key in this.offsets) { + throw new FormatError(`Already tracking location of ${key}`); + } + this.offsets[key] = location; + } + offset(value) { + for (const key in this.offsets) { + this.offsets[key] += value; + } + } + setEntryLocation(key, values, output) { + if (!(key in this.offsets)) { + throw new FormatError(`Not tracking location of ${key}`); + } + const data = output.data; + const dataOffset = this.offsets[key]; + const size = 5; + for (let i = 0, ii = values.length; i < ii; ++i) { + const offset0 = i * size + dataOffset; + const offset1 = offset0 + 1; + const offset2 = offset0 + 2; + const offset3 = offset0 + 3; + const offset4 = offset0 + 4; + if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { + throw new FormatError("writing to an offset that is not empty"); + } + const value = values[i]; + data[offset0] = 0x1d; + data[offset1] = value >> 24 & 0xff; + data[offset2] = value >> 16 & 0xff; + data[offset3] = value >> 8 & 0xff; + data[offset4] = value & 0xff; + } + } +} +class CFFCompiler { + constructor(cff) { + this.cff = cff; + } + compile() { + const cff = this.cff; + const output = { + data: [], + length: 0, + add(data) { + try { + this.data.push(...data); + } catch { + this.data = this.data.concat(data); + } + this.length = this.data.length; + } + }; + const header = this.compileHeader(cff.header); + output.add(header); + const nameIndex = this.compileNameIndex(cff.names); + output.add(nameIndex); + if (cff.isCIDFont) { + if (cff.topDict.hasName("FontMatrix")) { + const base = cff.topDict.getByName("FontMatrix"); + cff.topDict.removeByName("FontMatrix"); + for (const subDict of cff.fdArray) { + let matrix = base.slice(0); + if (subDict.hasName("FontMatrix")) { + matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); + } + subDict.setByName("FontMatrix", matrix); + } + } + } + const xuid = cff.topDict.getByName("XUID"); + if (xuid?.length > 16) { + cff.topDict.removeByName("XUID"); + } + cff.topDict.setByName("charset", 0); + let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); + output.add(compiled.output); + const topDictTracker = compiled.trackers[0]; + const stringIndex = this.compileStringIndex(cff.strings.strings); + output.add(stringIndex); + const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); + output.add(globalSubrIndex); + if (cff.encoding && cff.topDict.hasName("Encoding")) { + if (cff.encoding.predefined) { + topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); + } else { + const encoding = this.compileEncoding(cff.encoding); + topDictTracker.setEntryLocation("Encoding", [output.length], output); + output.add(encoding); + } + } + const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); + topDictTracker.setEntryLocation("charset", [output.length], output); + output.add(charset); + const charStrings = this.compileCharStrings(cff.charStrings); + topDictTracker.setEntryLocation("CharStrings", [output.length], output); + output.add(charStrings); + if (cff.isCIDFont) { + topDictTracker.setEntryLocation("FDSelect", [output.length], output); + const fdSelect = this.compileFDSelect(cff.fdSelect); + output.add(fdSelect); + compiled = this.compileTopDicts(cff.fdArray, output.length, true); + topDictTracker.setEntryLocation("FDArray", [output.length], output); + output.add(compiled.output); + const fontDictTrackers = compiled.trackers; + this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.add([0]); + return output.data; + } + encodeNumber(value) { + if (Number.isInteger(value)) { + return this.encodeInteger(value); + } + return this.encodeFloat(value); + } + static get EncodeFloatRegExp() { + return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); + } + encodeFloat(num) { + let value = num.toString(); + const m = CFFCompiler.EncodeFloatRegExp.exec(value); + if (m) { + const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); + value = (Math.round(num * epsilon) / epsilon).toString(); + } + let nibbles = ""; + let i, ii; + for (i = 0, ii = value.length; i < ii; ++i) { + const a = value[i]; + if (a === "e") { + nibbles += value[++i] === "-" ? "c" : "b"; + } else if (a === ".") { + nibbles += "a"; + } else if (a === "-") { + nibbles += "e"; + } else { + nibbles += a; + } + } + nibbles += nibbles.length & 1 ? "f" : "ff"; + const out = [30]; + for (i = 0, ii = nibbles.length; i < ii; i += 2) { + out.push(parseInt(nibbles.substring(i, i + 2), 16)); + } + return out; + } + encodeInteger(value) { + let code; + if (value >= -107 && value <= 107) { + code = [value + 139]; + } else if (value >= 108 && value <= 1131) { + value -= 108; + code = [(value >> 8) + 247, value & 0xff]; + } else if (value >= -1131 && value <= -108) { + value = -value - 108; + code = [(value >> 8) + 251, value & 0xff]; + } else if (value >= -32768 && value <= 32767) { + code = [0x1c, value >> 8 & 0xff, value & 0xff]; + } else { + code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; + } + return code; + } + compileHeader(header) { + return [header.major, header.minor, 4, header.offSize]; + } + compileNameIndex(names) { + const nameIndex = new CFFIndex(); + for (const name of names) { + const length = Math.min(name.length, 127); + let sanitizedName = new Array(length); + for (let j = 0; j < length; j++) { + let char = name[j]; + if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { + char = "_"; + } + sanitizedName[j] = char; + } + sanitizedName = sanitizedName.join(""); + if (sanitizedName === "") { + sanitizedName = "Bad_Font_Name"; + } + nameIndex.add(stringToBytes(sanitizedName)); + } + return this.compileIndex(nameIndex); + } + compileTopDicts(dicts, length, removeCidKeys) { + const fontDictTrackers = []; + let fdArrayIndex = new CFFIndex(); + for (const fontDict of dicts) { + if (removeCidKeys) { + fontDict.removeByName("CIDFontVersion"); + fontDict.removeByName("CIDFontRevision"); + fontDict.removeByName("CIDFontType"); + fontDict.removeByName("CIDCount"); + fontDict.removeByName("UIDBase"); + } + const fontDictTracker = new CFFOffsetTracker(); + const fontDictData = this.compileDict(fontDict, fontDictTracker); + fontDictTrackers.push(fontDictTracker); + fdArrayIndex.add(fontDictData); + fontDictTracker.offset(length); + } + fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); + return { + trackers: fontDictTrackers, + output: fdArrayIndex + }; + } + compilePrivateDicts(dicts, trackers, output) { + for (let i = 0, ii = dicts.length; i < ii; ++i) { + const fontDict = dicts[i]; + const privateDict = fontDict.privateDict; + if (!privateDict || !fontDict.hasName("Private")) { + throw new FormatError("There must be a private dictionary."); + } + const privateDictTracker = new CFFOffsetTracker(); + const privateDictData = this.compileDict(privateDict, privateDictTracker); + let outputLength = output.length; + privateDictTracker.offset(outputLength); + if (!privateDictData.length) { + outputLength = 0; + } + trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); + output.add(privateDictData); + if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { + const subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); + output.add(subrs); + } + } + } + compileDict(dict, offsetTracker) { + const out = []; + for (const key of dict.order) { + if (!(key in dict.values)) { + continue; + } + let values = dict.values[key]; + let types = dict.types[key]; + if (!Array.isArray(types)) { + types = [types]; + } + if (!Array.isArray(values)) { + values = [values]; + } + if (values.length === 0) { + continue; + } + for (let j = 0, jj = types.length; j < jj; ++j) { + const type = types[j]; + const value = values[j]; + switch (type) { + case "num": + case "sid": + out.push(...this.encodeNumber(value)); + break; + case "offset": + const name = dict.keyToNameMap[key]; + if (!offsetTracker.isTracking(name)) { + offsetTracker.track(name, out.length); + } + out.push(0x1d, 0, 0, 0, 0); + break; + case "array": + case "delta": + out.push(...this.encodeNumber(value)); + for (let k = 1, kk = values.length; k < kk; ++k) { + out.push(...this.encodeNumber(values[k])); + } + break; + default: + throw new FormatError(`Unknown data type of ${type}`); + } + } + out.push(...dict.opcodes[key]); + } + return out; + } + compileStringIndex(strings) { + const stringIndex = new CFFIndex(); + for (const string of strings) { + stringIndex.add(stringToBytes(string)); + } + return this.compileIndex(stringIndex); + } + compileCharStrings(charStrings) { + const charStringsIndex = new CFFIndex(); + for (let i = 0; i < charStrings.count; i++) { + const glyph = charStrings.get(i); + if (glyph.length === 0) { + charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); + continue; + } + charStringsIndex.add(glyph); + } + return this.compileIndex(charStringsIndex); + } + compileCharset(charset, numGlyphs, strings, isCIDFont) { + let out; + const numGlyphsLessNotDef = numGlyphs - 1; + if (isCIDFont) { + out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]); + } else { + const length = 1 + numGlyphsLessNotDef * 2; + out = new Uint8Array(length); + out[0] = 0; + let charsetIndex = 0; + const numCharsets = charset.charset.length; + let warned = false; + for (let i = 1; i < out.length; i += 2) { + let sid = 0; + if (charsetIndex < numCharsets) { + const name = charset.charset[charsetIndex++]; + sid = strings.getSID(name); + if (sid === -1) { + sid = 0; + if (!warned) { + warned = true; + warn(`Couldn't find ${name} in CFF strings`); + } + } + } + out[i] = sid >> 8 & 0xff; + out[i + 1] = sid & 0xff; + } + } + return this.compileTypedArray(out); + } + compileEncoding(encoding) { + return this.compileTypedArray(encoding.raw); + } + compileFDSelect(fdSelect) { + const format = fdSelect.format; + let out, i; + switch (format) { + case 0: + out = new Uint8Array(1 + fdSelect.fdSelect.length); + out[0] = format; + for (i = 0; i < fdSelect.fdSelect.length; i++) { + out[i + 1] = fdSelect.fdSelect[i]; + } + break; + case 3: + const start = 0; + let lastFD = fdSelect.fdSelect[0]; + const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; + for (i = 1; i < fdSelect.fdSelect.length; i++) { + const currentFD = fdSelect.fdSelect[i]; + if (currentFD !== lastFD) { + ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); + lastFD = currentFD; + } + } + const numRanges = (ranges.length - 3) / 3; + ranges[1] = numRanges >> 8 & 0xff; + ranges[2] = numRanges & 0xff; + ranges.push(i >> 8 & 0xff, i & 0xff); + out = new Uint8Array(ranges); + break; + } + return this.compileTypedArray(out); + } + compileTypedArray(data) { + return Array.from(data); + } + compileIndex(index, trackers = []) { + const objects = index.objects; + const count = objects.length; + if (count === 0) { + return [0, 0]; + } + const data = [count >> 8 & 0xff, count & 0xff]; + let lastOffset = 1, + i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; + } + let offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; + } + data.push(offsetSize); + let relativeOffset = 1; + for (i = 0; i < count + 1; i++) { + if (offsetSize === 1) { + data.push(relativeOffset & 0xff); + } else if (offsetSize === 2) { + data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else if (offsetSize === 3) { + data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else { + data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } + if (objects[i]) { + relativeOffset += objects[i].length; + } + } + for (i = 0; i < count; i++) { + if (trackers[i]) { + trackers[i].offset(data.length); + } + data.push(...objects[i]); + } + return data; + } +} + +;// ./src/core/glyphlist.js + +const getGlyphsUnicode = getLookupTableFactory(function (t) { + t.A = 0x0041; + t.AE = 0x00c6; + t.AEacute = 0x01fc; + t.AEmacron = 0x01e2; + t.AEsmall = 0xf7e6; + t.Aacute = 0x00c1; + t.Aacutesmall = 0xf7e1; + t.Abreve = 0x0102; + t.Abreveacute = 0x1eae; + t.Abrevecyrillic = 0x04d0; + t.Abrevedotbelow = 0x1eb6; + t.Abrevegrave = 0x1eb0; + t.Abrevehookabove = 0x1eb2; + t.Abrevetilde = 0x1eb4; + t.Acaron = 0x01cd; + t.Acircle = 0x24b6; + t.Acircumflex = 0x00c2; + t.Acircumflexacute = 0x1ea4; + t.Acircumflexdotbelow = 0x1eac; + t.Acircumflexgrave = 0x1ea6; + t.Acircumflexhookabove = 0x1ea8; + t.Acircumflexsmall = 0xf7e2; + t.Acircumflextilde = 0x1eaa; + t.Acute = 0xf6c9; + t.Acutesmall = 0xf7b4; + t.Acyrillic = 0x0410; + t.Adblgrave = 0x0200; + t.Adieresis = 0x00c4; + t.Adieresiscyrillic = 0x04d2; + t.Adieresismacron = 0x01de; + t.Adieresissmall = 0xf7e4; + t.Adotbelow = 0x1ea0; + t.Adotmacron = 0x01e0; + t.Agrave = 0x00c0; + t.Agravesmall = 0xf7e0; + t.Ahookabove = 0x1ea2; + t.Aiecyrillic = 0x04d4; + t.Ainvertedbreve = 0x0202; + t.Alpha = 0x0391; + t.Alphatonos = 0x0386; + t.Amacron = 0x0100; + t.Amonospace = 0xff21; + t.Aogonek = 0x0104; + t.Aring = 0x00c5; + t.Aringacute = 0x01fa; + t.Aringbelow = 0x1e00; + t.Aringsmall = 0xf7e5; + t.Asmall = 0xf761; + t.Atilde = 0x00c3; + t.Atildesmall = 0xf7e3; + t.Aybarmenian = 0x0531; + t.B = 0x0042; + t.Bcircle = 0x24b7; + t.Bdotaccent = 0x1e02; + t.Bdotbelow = 0x1e04; + t.Becyrillic = 0x0411; + t.Benarmenian = 0x0532; + t.Beta = 0x0392; + t.Bhook = 0x0181; + t.Blinebelow = 0x1e06; + t.Bmonospace = 0xff22; + t.Brevesmall = 0xf6f4; + t.Bsmall = 0xf762; + t.Btopbar = 0x0182; + t.C = 0x0043; + t.Caarmenian = 0x053e; + t.Cacute = 0x0106; + t.Caron = 0xf6ca; + t.Caronsmall = 0xf6f5; + t.Ccaron = 0x010c; + t.Ccedilla = 0x00c7; + t.Ccedillaacute = 0x1e08; + t.Ccedillasmall = 0xf7e7; + t.Ccircle = 0x24b8; + t.Ccircumflex = 0x0108; + t.Cdot = 0x010a; + t.Cdotaccent = 0x010a; + t.Cedillasmall = 0xf7b8; + t.Chaarmenian = 0x0549; + t.Cheabkhasiancyrillic = 0x04bc; + t.Checyrillic = 0x0427; + t.Chedescenderabkhasiancyrillic = 0x04be; + t.Chedescendercyrillic = 0x04b6; + t.Chedieresiscyrillic = 0x04f4; + t.Cheharmenian = 0x0543; + t.Chekhakassiancyrillic = 0x04cb; + t.Cheverticalstrokecyrillic = 0x04b8; + t.Chi = 0x03a7; + t.Chook = 0x0187; + t.Circumflexsmall = 0xf6f6; + t.Cmonospace = 0xff23; + t.Coarmenian = 0x0551; + t.Csmall = 0xf763; + t.D = 0x0044; + t.DZ = 0x01f1; + t.DZcaron = 0x01c4; + t.Daarmenian = 0x0534; + t.Dafrican = 0x0189; + t.Dcaron = 0x010e; + t.Dcedilla = 0x1e10; + t.Dcircle = 0x24b9; + t.Dcircumflexbelow = 0x1e12; + t.Dcroat = 0x0110; + t.Ddotaccent = 0x1e0a; + t.Ddotbelow = 0x1e0c; + t.Decyrillic = 0x0414; + t.Deicoptic = 0x03ee; + t.Delta = 0x2206; + t.Deltagreek = 0x0394; + t.Dhook = 0x018a; + t.Dieresis = 0xf6cb; + t.DieresisAcute = 0xf6cc; + t.DieresisGrave = 0xf6cd; + t.Dieresissmall = 0xf7a8; + t.Digammagreek = 0x03dc; + t.Djecyrillic = 0x0402; + t.Dlinebelow = 0x1e0e; + t.Dmonospace = 0xff24; + t.Dotaccentsmall = 0xf6f7; + t.Dslash = 0x0110; + t.Dsmall = 0xf764; + t.Dtopbar = 0x018b; + t.Dz = 0x01f2; + t.Dzcaron = 0x01c5; + t.Dzeabkhasiancyrillic = 0x04e0; + t.Dzecyrillic = 0x0405; + t.Dzhecyrillic = 0x040f; + t.E = 0x0045; + t.Eacute = 0x00c9; + t.Eacutesmall = 0xf7e9; + t.Ebreve = 0x0114; + t.Ecaron = 0x011a; + t.Ecedillabreve = 0x1e1c; + t.Echarmenian = 0x0535; + t.Ecircle = 0x24ba; + t.Ecircumflex = 0x00ca; + t.Ecircumflexacute = 0x1ebe; + t.Ecircumflexbelow = 0x1e18; + t.Ecircumflexdotbelow = 0x1ec6; + t.Ecircumflexgrave = 0x1ec0; + t.Ecircumflexhookabove = 0x1ec2; + t.Ecircumflexsmall = 0xf7ea; + t.Ecircumflextilde = 0x1ec4; + t.Ecyrillic = 0x0404; + t.Edblgrave = 0x0204; + t.Edieresis = 0x00cb; + t.Edieresissmall = 0xf7eb; + t.Edot = 0x0116; + t.Edotaccent = 0x0116; + t.Edotbelow = 0x1eb8; + t.Efcyrillic = 0x0424; + t.Egrave = 0x00c8; + t.Egravesmall = 0xf7e8; + t.Eharmenian = 0x0537; + t.Ehookabove = 0x1eba; + t.Eightroman = 0x2167; + t.Einvertedbreve = 0x0206; + t.Eiotifiedcyrillic = 0x0464; + t.Elcyrillic = 0x041b; + t.Elevenroman = 0x216a; + t.Emacron = 0x0112; + t.Emacronacute = 0x1e16; + t.Emacrongrave = 0x1e14; + t.Emcyrillic = 0x041c; + t.Emonospace = 0xff25; + t.Encyrillic = 0x041d; + t.Endescendercyrillic = 0x04a2; + t.Eng = 0x014a; + t.Enghecyrillic = 0x04a4; + t.Enhookcyrillic = 0x04c7; + t.Eogonek = 0x0118; + t.Eopen = 0x0190; + t.Epsilon = 0x0395; + t.Epsilontonos = 0x0388; + t.Ercyrillic = 0x0420; + t.Ereversed = 0x018e; + t.Ereversedcyrillic = 0x042d; + t.Escyrillic = 0x0421; + t.Esdescendercyrillic = 0x04aa; + t.Esh = 0x01a9; + t.Esmall = 0xf765; + t.Eta = 0x0397; + t.Etarmenian = 0x0538; + t.Etatonos = 0x0389; + t.Eth = 0x00d0; + t.Ethsmall = 0xf7f0; + t.Etilde = 0x1ebc; + t.Etildebelow = 0x1e1a; + t.Euro = 0x20ac; + t.Ezh = 0x01b7; + t.Ezhcaron = 0x01ee; + t.Ezhreversed = 0x01b8; + t.F = 0x0046; + t.Fcircle = 0x24bb; + t.Fdotaccent = 0x1e1e; + t.Feharmenian = 0x0556; + t.Feicoptic = 0x03e4; + t.Fhook = 0x0191; + t.Fitacyrillic = 0x0472; + t.Fiveroman = 0x2164; + t.Fmonospace = 0xff26; + t.Fourroman = 0x2163; + t.Fsmall = 0xf766; + t.G = 0x0047; + t.GBsquare = 0x3387; + t.Gacute = 0x01f4; + t.Gamma = 0x0393; + t.Gammaafrican = 0x0194; + t.Gangiacoptic = 0x03ea; + t.Gbreve = 0x011e; + t.Gcaron = 0x01e6; + t.Gcedilla = 0x0122; + t.Gcircle = 0x24bc; + t.Gcircumflex = 0x011c; + t.Gcommaaccent = 0x0122; + t.Gdot = 0x0120; + t.Gdotaccent = 0x0120; + t.Gecyrillic = 0x0413; + t.Ghadarmenian = 0x0542; + t.Ghemiddlehookcyrillic = 0x0494; + t.Ghestrokecyrillic = 0x0492; + t.Gheupturncyrillic = 0x0490; + t.Ghook = 0x0193; + t.Gimarmenian = 0x0533; + t.Gjecyrillic = 0x0403; + t.Gmacron = 0x1e20; + t.Gmonospace = 0xff27; + t.Grave = 0xf6ce; + t.Gravesmall = 0xf760; + t.Gsmall = 0xf767; + t.Gsmallhook = 0x029b; + t.Gstroke = 0x01e4; + t.H = 0x0048; + t.H18533 = 0x25cf; + t.H18543 = 0x25aa; + t.H18551 = 0x25ab; + t.H22073 = 0x25a1; + t.HPsquare = 0x33cb; + t.Haabkhasiancyrillic = 0x04a8; + t.Hadescendercyrillic = 0x04b2; + t.Hardsigncyrillic = 0x042a; + t.Hbar = 0x0126; + t.Hbrevebelow = 0x1e2a; + t.Hcedilla = 0x1e28; + t.Hcircle = 0x24bd; + t.Hcircumflex = 0x0124; + t.Hdieresis = 0x1e26; + t.Hdotaccent = 0x1e22; + t.Hdotbelow = 0x1e24; + t.Hmonospace = 0xff28; + t.Hoarmenian = 0x0540; + t.Horicoptic = 0x03e8; + t.Hsmall = 0xf768; + t.Hungarumlaut = 0xf6cf; + t.Hungarumlautsmall = 0xf6f8; + t.Hzsquare = 0x3390; + t.I = 0x0049; + t.IAcyrillic = 0x042f; + t.IJ = 0x0132; + t.IUcyrillic = 0x042e; + t.Iacute = 0x00cd; + t.Iacutesmall = 0xf7ed; + t.Ibreve = 0x012c; + t.Icaron = 0x01cf; + t.Icircle = 0x24be; + t.Icircumflex = 0x00ce; + t.Icircumflexsmall = 0xf7ee; + t.Icyrillic = 0x0406; + t.Idblgrave = 0x0208; + t.Idieresis = 0x00cf; + t.Idieresisacute = 0x1e2e; + t.Idieresiscyrillic = 0x04e4; + t.Idieresissmall = 0xf7ef; + t.Idot = 0x0130; + t.Idotaccent = 0x0130; + t.Idotbelow = 0x1eca; + t.Iebrevecyrillic = 0x04d6; + t.Iecyrillic = 0x0415; + t.Ifraktur = 0x2111; + t.Igrave = 0x00cc; + t.Igravesmall = 0xf7ec; + t.Ihookabove = 0x1ec8; + t.Iicyrillic = 0x0418; + t.Iinvertedbreve = 0x020a; + t.Iishortcyrillic = 0x0419; + t.Imacron = 0x012a; + t.Imacroncyrillic = 0x04e2; + t.Imonospace = 0xff29; + t.Iniarmenian = 0x053b; + t.Iocyrillic = 0x0401; + t.Iogonek = 0x012e; + t.Iota = 0x0399; + t.Iotaafrican = 0x0196; + t.Iotadieresis = 0x03aa; + t.Iotatonos = 0x038a; + t.Ismall = 0xf769; + t.Istroke = 0x0197; + t.Itilde = 0x0128; + t.Itildebelow = 0x1e2c; + t.Izhitsacyrillic = 0x0474; + t.Izhitsadblgravecyrillic = 0x0476; + t.J = 0x004a; + t.Jaarmenian = 0x0541; + t.Jcircle = 0x24bf; + t.Jcircumflex = 0x0134; + t.Jecyrillic = 0x0408; + t.Jheharmenian = 0x054b; + t.Jmonospace = 0xff2a; + t.Jsmall = 0xf76a; + t.K = 0x004b; + t.KBsquare = 0x3385; + t.KKsquare = 0x33cd; + t.Kabashkircyrillic = 0x04a0; + t.Kacute = 0x1e30; + t.Kacyrillic = 0x041a; + t.Kadescendercyrillic = 0x049a; + t.Kahookcyrillic = 0x04c3; + t.Kappa = 0x039a; + t.Kastrokecyrillic = 0x049e; + t.Kaverticalstrokecyrillic = 0x049c; + t.Kcaron = 0x01e8; + t.Kcedilla = 0x0136; + t.Kcircle = 0x24c0; + t.Kcommaaccent = 0x0136; + t.Kdotbelow = 0x1e32; + t.Keharmenian = 0x0554; + t.Kenarmenian = 0x053f; + t.Khacyrillic = 0x0425; + t.Kheicoptic = 0x03e6; + t.Khook = 0x0198; + t.Kjecyrillic = 0x040c; + t.Klinebelow = 0x1e34; + t.Kmonospace = 0xff2b; + t.Koppacyrillic = 0x0480; + t.Koppagreek = 0x03de; + t.Ksicyrillic = 0x046e; + t.Ksmall = 0xf76b; + t.L = 0x004c; + t.LJ = 0x01c7; + t.LL = 0xf6bf; + t.Lacute = 0x0139; + t.Lambda = 0x039b; + t.Lcaron = 0x013d; + t.Lcedilla = 0x013b; + t.Lcircle = 0x24c1; + t.Lcircumflexbelow = 0x1e3c; + t.Lcommaaccent = 0x013b; + t.Ldot = 0x013f; + t.Ldotaccent = 0x013f; + t.Ldotbelow = 0x1e36; + t.Ldotbelowmacron = 0x1e38; + t.Liwnarmenian = 0x053c; + t.Lj = 0x01c8; + t.Ljecyrillic = 0x0409; + t.Llinebelow = 0x1e3a; + t.Lmonospace = 0xff2c; + t.Lslash = 0x0141; + t.Lslashsmall = 0xf6f9; + t.Lsmall = 0xf76c; + t.M = 0x004d; + t.MBsquare = 0x3386; + t.Macron = 0xf6d0; + t.Macronsmall = 0xf7af; + t.Macute = 0x1e3e; + t.Mcircle = 0x24c2; + t.Mdotaccent = 0x1e40; + t.Mdotbelow = 0x1e42; + t.Menarmenian = 0x0544; + t.Mmonospace = 0xff2d; + t.Msmall = 0xf76d; + t.Mturned = 0x019c; + t.Mu = 0x039c; + t.N = 0x004e; + t.NJ = 0x01ca; + t.Nacute = 0x0143; + t.Ncaron = 0x0147; + t.Ncedilla = 0x0145; + t.Ncircle = 0x24c3; + t.Ncircumflexbelow = 0x1e4a; + t.Ncommaaccent = 0x0145; + t.Ndotaccent = 0x1e44; + t.Ndotbelow = 0x1e46; + t.Nhookleft = 0x019d; + t.Nineroman = 0x2168; + t.Nj = 0x01cb; + t.Njecyrillic = 0x040a; + t.Nlinebelow = 0x1e48; + t.Nmonospace = 0xff2e; + t.Nowarmenian = 0x0546; + t.Nsmall = 0xf76e; + t.Ntilde = 0x00d1; + t.Ntildesmall = 0xf7f1; + t.Nu = 0x039d; + t.O = 0x004f; + t.OE = 0x0152; + t.OEsmall = 0xf6fa; + t.Oacute = 0x00d3; + t.Oacutesmall = 0xf7f3; + t.Obarredcyrillic = 0x04e8; + t.Obarreddieresiscyrillic = 0x04ea; + t.Obreve = 0x014e; + t.Ocaron = 0x01d1; + t.Ocenteredtilde = 0x019f; + t.Ocircle = 0x24c4; + t.Ocircumflex = 0x00d4; + t.Ocircumflexacute = 0x1ed0; + t.Ocircumflexdotbelow = 0x1ed8; + t.Ocircumflexgrave = 0x1ed2; + t.Ocircumflexhookabove = 0x1ed4; + t.Ocircumflexsmall = 0xf7f4; + t.Ocircumflextilde = 0x1ed6; + t.Ocyrillic = 0x041e; + t.Odblacute = 0x0150; + t.Odblgrave = 0x020c; + t.Odieresis = 0x00d6; + t.Odieresiscyrillic = 0x04e6; + t.Odieresissmall = 0xf7f6; + t.Odotbelow = 0x1ecc; + t.Ogoneksmall = 0xf6fb; + t.Ograve = 0x00d2; + t.Ogravesmall = 0xf7f2; + t.Oharmenian = 0x0555; + t.Ohm = 0x2126; + t.Ohookabove = 0x1ece; + t.Ohorn = 0x01a0; + t.Ohornacute = 0x1eda; + t.Ohorndotbelow = 0x1ee2; + t.Ohorngrave = 0x1edc; + t.Ohornhookabove = 0x1ede; + t.Ohorntilde = 0x1ee0; + t.Ohungarumlaut = 0x0150; + t.Oi = 0x01a2; + t.Oinvertedbreve = 0x020e; + t.Omacron = 0x014c; + t.Omacronacute = 0x1e52; + t.Omacrongrave = 0x1e50; + t.Omega = 0x2126; + t.Omegacyrillic = 0x0460; + t.Omegagreek = 0x03a9; + t.Omegaroundcyrillic = 0x047a; + t.Omegatitlocyrillic = 0x047c; + t.Omegatonos = 0x038f; + t.Omicron = 0x039f; + t.Omicrontonos = 0x038c; + t.Omonospace = 0xff2f; + t.Oneroman = 0x2160; + t.Oogonek = 0x01ea; + t.Oogonekmacron = 0x01ec; + t.Oopen = 0x0186; + t.Oslash = 0x00d8; + t.Oslashacute = 0x01fe; + t.Oslashsmall = 0xf7f8; + t.Osmall = 0xf76f; + t.Ostrokeacute = 0x01fe; + t.Otcyrillic = 0x047e; + t.Otilde = 0x00d5; + t.Otildeacute = 0x1e4c; + t.Otildedieresis = 0x1e4e; + t.Otildesmall = 0xf7f5; + t.P = 0x0050; + t.Pacute = 0x1e54; + t.Pcircle = 0x24c5; + t.Pdotaccent = 0x1e56; + t.Pecyrillic = 0x041f; + t.Peharmenian = 0x054a; + t.Pemiddlehookcyrillic = 0x04a6; + t.Phi = 0x03a6; + t.Phook = 0x01a4; + t.Pi = 0x03a0; + t.Piwrarmenian = 0x0553; + t.Pmonospace = 0xff30; + t.Psi = 0x03a8; + t.Psicyrillic = 0x0470; + t.Psmall = 0xf770; + t.Q = 0x0051; + t.Qcircle = 0x24c6; + t.Qmonospace = 0xff31; + t.Qsmall = 0xf771; + t.R = 0x0052; + t.Raarmenian = 0x054c; + t.Racute = 0x0154; + t.Rcaron = 0x0158; + t.Rcedilla = 0x0156; + t.Rcircle = 0x24c7; + t.Rcommaaccent = 0x0156; + t.Rdblgrave = 0x0210; + t.Rdotaccent = 0x1e58; + t.Rdotbelow = 0x1e5a; + t.Rdotbelowmacron = 0x1e5c; + t.Reharmenian = 0x0550; + t.Rfraktur = 0x211c; + t.Rho = 0x03a1; + t.Ringsmall = 0xf6fc; + t.Rinvertedbreve = 0x0212; + t.Rlinebelow = 0x1e5e; + t.Rmonospace = 0xff32; + t.Rsmall = 0xf772; + t.Rsmallinverted = 0x0281; + t.Rsmallinvertedsuperior = 0x02b6; + t.S = 0x0053; + t.SF010000 = 0x250c; + t.SF020000 = 0x2514; + t.SF030000 = 0x2510; + t.SF040000 = 0x2518; + t.SF050000 = 0x253c; + t.SF060000 = 0x252c; + t.SF070000 = 0x2534; + t.SF080000 = 0x251c; + t.SF090000 = 0x2524; + t.SF100000 = 0x2500; + t.SF110000 = 0x2502; + t.SF190000 = 0x2561; + t.SF200000 = 0x2562; + t.SF210000 = 0x2556; + t.SF220000 = 0x2555; + t.SF230000 = 0x2563; + t.SF240000 = 0x2551; + t.SF250000 = 0x2557; + t.SF260000 = 0x255d; + t.SF270000 = 0x255c; + t.SF280000 = 0x255b; + t.SF360000 = 0x255e; + t.SF370000 = 0x255f; + t.SF380000 = 0x255a; + t.SF390000 = 0x2554; + t.SF400000 = 0x2569; + t.SF410000 = 0x2566; + t.SF420000 = 0x2560; + t.SF430000 = 0x2550; + t.SF440000 = 0x256c; + t.SF450000 = 0x2567; + t.SF460000 = 0x2568; + t.SF470000 = 0x2564; + t.SF480000 = 0x2565; + t.SF490000 = 0x2559; + t.SF500000 = 0x2558; + t.SF510000 = 0x2552; + t.SF520000 = 0x2553; + t.SF530000 = 0x256b; + t.SF540000 = 0x256a; + t.Sacute = 0x015a; + t.Sacutedotaccent = 0x1e64; + t.Sampigreek = 0x03e0; + t.Scaron = 0x0160; + t.Scarondotaccent = 0x1e66; + t.Scaronsmall = 0xf6fd; + t.Scedilla = 0x015e; + t.Schwa = 0x018f; + t.Schwacyrillic = 0x04d8; + t.Schwadieresiscyrillic = 0x04da; + t.Scircle = 0x24c8; + t.Scircumflex = 0x015c; + t.Scommaaccent = 0x0218; + t.Sdotaccent = 0x1e60; + t.Sdotbelow = 0x1e62; + t.Sdotbelowdotaccent = 0x1e68; + t.Seharmenian = 0x054d; + t.Sevenroman = 0x2166; + t.Shaarmenian = 0x0547; + t.Shacyrillic = 0x0428; + t.Shchacyrillic = 0x0429; + t.Sheicoptic = 0x03e2; + t.Shhacyrillic = 0x04ba; + t.Shimacoptic = 0x03ec; + t.Sigma = 0x03a3; + t.Sixroman = 0x2165; + t.Smonospace = 0xff33; + t.Softsigncyrillic = 0x042c; + t.Ssmall = 0xf773; + t.Stigmagreek = 0x03da; + t.T = 0x0054; + t.Tau = 0x03a4; + t.Tbar = 0x0166; + t.Tcaron = 0x0164; + t.Tcedilla = 0x0162; + t.Tcircle = 0x24c9; + t.Tcircumflexbelow = 0x1e70; + t.Tcommaaccent = 0x0162; + t.Tdotaccent = 0x1e6a; + t.Tdotbelow = 0x1e6c; + t.Tecyrillic = 0x0422; + t.Tedescendercyrillic = 0x04ac; + t.Tenroman = 0x2169; + t.Tetsecyrillic = 0x04b4; + t.Theta = 0x0398; + t.Thook = 0x01ac; + t.Thorn = 0x00de; + t.Thornsmall = 0xf7fe; + t.Threeroman = 0x2162; + t.Tildesmall = 0xf6fe; + t.Tiwnarmenian = 0x054f; + t.Tlinebelow = 0x1e6e; + t.Tmonospace = 0xff34; + t.Toarmenian = 0x0539; + t.Tonefive = 0x01bc; + t.Tonesix = 0x0184; + t.Tonetwo = 0x01a7; + t.Tretroflexhook = 0x01ae; + t.Tsecyrillic = 0x0426; + t.Tshecyrillic = 0x040b; + t.Tsmall = 0xf774; + t.Twelveroman = 0x216b; + t.Tworoman = 0x2161; + t.U = 0x0055; + t.Uacute = 0x00da; + t.Uacutesmall = 0xf7fa; + t.Ubreve = 0x016c; + t.Ucaron = 0x01d3; + t.Ucircle = 0x24ca; + t.Ucircumflex = 0x00db; + t.Ucircumflexbelow = 0x1e76; + t.Ucircumflexsmall = 0xf7fb; + t.Ucyrillic = 0x0423; + t.Udblacute = 0x0170; + t.Udblgrave = 0x0214; + t.Udieresis = 0x00dc; + t.Udieresisacute = 0x01d7; + t.Udieresisbelow = 0x1e72; + t.Udieresiscaron = 0x01d9; + t.Udieresiscyrillic = 0x04f0; + t.Udieresisgrave = 0x01db; + t.Udieresismacron = 0x01d5; + t.Udieresissmall = 0xf7fc; + t.Udotbelow = 0x1ee4; + t.Ugrave = 0x00d9; + t.Ugravesmall = 0xf7f9; + t.Uhookabove = 0x1ee6; + t.Uhorn = 0x01af; + t.Uhornacute = 0x1ee8; + t.Uhorndotbelow = 0x1ef0; + t.Uhorngrave = 0x1eea; + t.Uhornhookabove = 0x1eec; + t.Uhorntilde = 0x1eee; + t.Uhungarumlaut = 0x0170; + t.Uhungarumlautcyrillic = 0x04f2; + t.Uinvertedbreve = 0x0216; + t.Ukcyrillic = 0x0478; + t.Umacron = 0x016a; + t.Umacroncyrillic = 0x04ee; + t.Umacrondieresis = 0x1e7a; + t.Umonospace = 0xff35; + t.Uogonek = 0x0172; + t.Upsilon = 0x03a5; + t.Upsilon1 = 0x03d2; + t.Upsilonacutehooksymbolgreek = 0x03d3; + t.Upsilonafrican = 0x01b1; + t.Upsilondieresis = 0x03ab; + t.Upsilondieresishooksymbolgreek = 0x03d4; + t.Upsilonhooksymbol = 0x03d2; + t.Upsilontonos = 0x038e; + t.Uring = 0x016e; + t.Ushortcyrillic = 0x040e; + t.Usmall = 0xf775; + t.Ustraightcyrillic = 0x04ae; + t.Ustraightstrokecyrillic = 0x04b0; + t.Utilde = 0x0168; + t.Utildeacute = 0x1e78; + t.Utildebelow = 0x1e74; + t.V = 0x0056; + t.Vcircle = 0x24cb; + t.Vdotbelow = 0x1e7e; + t.Vecyrillic = 0x0412; + t.Vewarmenian = 0x054e; + t.Vhook = 0x01b2; + t.Vmonospace = 0xff36; + t.Voarmenian = 0x0548; + t.Vsmall = 0xf776; + t.Vtilde = 0x1e7c; + t.W = 0x0057; + t.Wacute = 0x1e82; + t.Wcircle = 0x24cc; + t.Wcircumflex = 0x0174; + t.Wdieresis = 0x1e84; + t.Wdotaccent = 0x1e86; + t.Wdotbelow = 0x1e88; + t.Wgrave = 0x1e80; + t.Wmonospace = 0xff37; + t.Wsmall = 0xf777; + t.X = 0x0058; + t.Xcircle = 0x24cd; + t.Xdieresis = 0x1e8c; + t.Xdotaccent = 0x1e8a; + t.Xeharmenian = 0x053d; + t.Xi = 0x039e; + t.Xmonospace = 0xff38; + t.Xsmall = 0xf778; + t.Y = 0x0059; + t.Yacute = 0x00dd; + t.Yacutesmall = 0xf7fd; + t.Yatcyrillic = 0x0462; + t.Ycircle = 0x24ce; + t.Ycircumflex = 0x0176; + t.Ydieresis = 0x0178; + t.Ydieresissmall = 0xf7ff; + t.Ydotaccent = 0x1e8e; + t.Ydotbelow = 0x1ef4; + t.Yericyrillic = 0x042b; + t.Yerudieresiscyrillic = 0x04f8; + t.Ygrave = 0x1ef2; + t.Yhook = 0x01b3; + t.Yhookabove = 0x1ef6; + t.Yiarmenian = 0x0545; + t.Yicyrillic = 0x0407; + t.Yiwnarmenian = 0x0552; + t.Ymonospace = 0xff39; + t.Ysmall = 0xf779; + t.Ytilde = 0x1ef8; + t.Yusbigcyrillic = 0x046a; + t.Yusbigiotifiedcyrillic = 0x046c; + t.Yuslittlecyrillic = 0x0466; + t.Yuslittleiotifiedcyrillic = 0x0468; + t.Z = 0x005a; + t.Zaarmenian = 0x0536; + t.Zacute = 0x0179; + t.Zcaron = 0x017d; + t.Zcaronsmall = 0xf6ff; + t.Zcircle = 0x24cf; + t.Zcircumflex = 0x1e90; + t.Zdot = 0x017b; + t.Zdotaccent = 0x017b; + t.Zdotbelow = 0x1e92; + t.Zecyrillic = 0x0417; + t.Zedescendercyrillic = 0x0498; + t.Zedieresiscyrillic = 0x04de; + t.Zeta = 0x0396; + t.Zhearmenian = 0x053a; + t.Zhebrevecyrillic = 0x04c1; + t.Zhecyrillic = 0x0416; + t.Zhedescendercyrillic = 0x0496; + t.Zhedieresiscyrillic = 0x04dc; + t.Zlinebelow = 0x1e94; + t.Zmonospace = 0xff3a; + t.Zsmall = 0xf77a; + t.Zstroke = 0x01b5; + t.a = 0x0061; + t.aabengali = 0x0986; + t.aacute = 0x00e1; + t.aadeva = 0x0906; + t.aagujarati = 0x0a86; + t.aagurmukhi = 0x0a06; + t.aamatragurmukhi = 0x0a3e; + t.aarusquare = 0x3303; + t.aavowelsignbengali = 0x09be; + t.aavowelsigndeva = 0x093e; + t.aavowelsigngujarati = 0x0abe; + t.abbreviationmarkarmenian = 0x055f; + t.abbreviationsigndeva = 0x0970; + t.abengali = 0x0985; + t.abopomofo = 0x311a; + t.abreve = 0x0103; + t.abreveacute = 0x1eaf; + t.abrevecyrillic = 0x04d1; + t.abrevedotbelow = 0x1eb7; + t.abrevegrave = 0x1eb1; + t.abrevehookabove = 0x1eb3; + t.abrevetilde = 0x1eb5; + t.acaron = 0x01ce; + t.acircle = 0x24d0; + t.acircumflex = 0x00e2; + t.acircumflexacute = 0x1ea5; + t.acircumflexdotbelow = 0x1ead; + t.acircumflexgrave = 0x1ea7; + t.acircumflexhookabove = 0x1ea9; + t.acircumflextilde = 0x1eab; + t.acute = 0x00b4; + t.acutebelowcmb = 0x0317; + t.acutecmb = 0x0301; + t.acutecomb = 0x0301; + t.acutedeva = 0x0954; + t.acutelowmod = 0x02cf; + t.acutetonecmb = 0x0341; + t.acyrillic = 0x0430; + t.adblgrave = 0x0201; + t.addakgurmukhi = 0x0a71; + t.adeva = 0x0905; + t.adieresis = 0x00e4; + t.adieresiscyrillic = 0x04d3; + t.adieresismacron = 0x01df; + t.adotbelow = 0x1ea1; + t.adotmacron = 0x01e1; + t.ae = 0x00e6; + t.aeacute = 0x01fd; + t.aekorean = 0x3150; + t.aemacron = 0x01e3; + t.afii00208 = 0x2015; + t.afii08941 = 0x20a4; + t.afii10017 = 0x0410; + t.afii10018 = 0x0411; + t.afii10019 = 0x0412; + t.afii10020 = 0x0413; + t.afii10021 = 0x0414; + t.afii10022 = 0x0415; + t.afii10023 = 0x0401; + t.afii10024 = 0x0416; + t.afii10025 = 0x0417; + t.afii10026 = 0x0418; + t.afii10027 = 0x0419; + t.afii10028 = 0x041a; + t.afii10029 = 0x041b; + t.afii10030 = 0x041c; + t.afii10031 = 0x041d; + t.afii10032 = 0x041e; + t.afii10033 = 0x041f; + t.afii10034 = 0x0420; + t.afii10035 = 0x0421; + t.afii10036 = 0x0422; + t.afii10037 = 0x0423; + t.afii10038 = 0x0424; + t.afii10039 = 0x0425; + t.afii10040 = 0x0426; + t.afii10041 = 0x0427; + t.afii10042 = 0x0428; + t.afii10043 = 0x0429; + t.afii10044 = 0x042a; + t.afii10045 = 0x042b; + t.afii10046 = 0x042c; + t.afii10047 = 0x042d; + t.afii10048 = 0x042e; + t.afii10049 = 0x042f; + t.afii10050 = 0x0490; + t.afii10051 = 0x0402; + t.afii10052 = 0x0403; + t.afii10053 = 0x0404; + t.afii10054 = 0x0405; + t.afii10055 = 0x0406; + t.afii10056 = 0x0407; + t.afii10057 = 0x0408; + t.afii10058 = 0x0409; + t.afii10059 = 0x040a; + t.afii10060 = 0x040b; + t.afii10061 = 0x040c; + t.afii10062 = 0x040e; + t.afii10063 = 0xf6c4; + t.afii10064 = 0xf6c5; + t.afii10065 = 0x0430; + t.afii10066 = 0x0431; + t.afii10067 = 0x0432; + t.afii10068 = 0x0433; + t.afii10069 = 0x0434; + t.afii10070 = 0x0435; + t.afii10071 = 0x0451; + t.afii10072 = 0x0436; + t.afii10073 = 0x0437; + t.afii10074 = 0x0438; + t.afii10075 = 0x0439; + t.afii10076 = 0x043a; + t.afii10077 = 0x043b; + t.afii10078 = 0x043c; + t.afii10079 = 0x043d; + t.afii10080 = 0x043e; + t.afii10081 = 0x043f; + t.afii10082 = 0x0440; + t.afii10083 = 0x0441; + t.afii10084 = 0x0442; + t.afii10085 = 0x0443; + t.afii10086 = 0x0444; + t.afii10087 = 0x0445; + t.afii10088 = 0x0446; + t.afii10089 = 0x0447; + t.afii10090 = 0x0448; + t.afii10091 = 0x0449; + t.afii10092 = 0x044a; + t.afii10093 = 0x044b; + t.afii10094 = 0x044c; + t.afii10095 = 0x044d; + t.afii10096 = 0x044e; + t.afii10097 = 0x044f; + t.afii10098 = 0x0491; + t.afii10099 = 0x0452; + t.afii10100 = 0x0453; + t.afii10101 = 0x0454; + t.afii10102 = 0x0455; + t.afii10103 = 0x0456; + t.afii10104 = 0x0457; + t.afii10105 = 0x0458; + t.afii10106 = 0x0459; + t.afii10107 = 0x045a; + t.afii10108 = 0x045b; + t.afii10109 = 0x045c; + t.afii10110 = 0x045e; + t.afii10145 = 0x040f; + t.afii10146 = 0x0462; + t.afii10147 = 0x0472; + t.afii10148 = 0x0474; + t.afii10192 = 0xf6c6; + t.afii10193 = 0x045f; + t.afii10194 = 0x0463; + t.afii10195 = 0x0473; + t.afii10196 = 0x0475; + t.afii10831 = 0xf6c7; + t.afii10832 = 0xf6c8; + t.afii10846 = 0x04d9; + t.afii299 = 0x200e; + t.afii300 = 0x200f; + t.afii301 = 0x200d; + t.afii57381 = 0x066a; + t.afii57388 = 0x060c; + t.afii57392 = 0x0660; + t.afii57393 = 0x0661; + t.afii57394 = 0x0662; + t.afii57395 = 0x0663; + t.afii57396 = 0x0664; + t.afii57397 = 0x0665; + t.afii57398 = 0x0666; + t.afii57399 = 0x0667; + t.afii57400 = 0x0668; + t.afii57401 = 0x0669; + t.afii57403 = 0x061b; + t.afii57407 = 0x061f; + t.afii57409 = 0x0621; + t.afii57410 = 0x0622; + t.afii57411 = 0x0623; + t.afii57412 = 0x0624; + t.afii57413 = 0x0625; + t.afii57414 = 0x0626; + t.afii57415 = 0x0627; + t.afii57416 = 0x0628; + t.afii57417 = 0x0629; + t.afii57418 = 0x062a; + t.afii57419 = 0x062b; + t.afii57420 = 0x062c; + t.afii57421 = 0x062d; + t.afii57422 = 0x062e; + t.afii57423 = 0x062f; + t.afii57424 = 0x0630; + t.afii57425 = 0x0631; + t.afii57426 = 0x0632; + t.afii57427 = 0x0633; + t.afii57428 = 0x0634; + t.afii57429 = 0x0635; + t.afii57430 = 0x0636; + t.afii57431 = 0x0637; + t.afii57432 = 0x0638; + t.afii57433 = 0x0639; + t.afii57434 = 0x063a; + t.afii57440 = 0x0640; + t.afii57441 = 0x0641; + t.afii57442 = 0x0642; + t.afii57443 = 0x0643; + t.afii57444 = 0x0644; + t.afii57445 = 0x0645; + t.afii57446 = 0x0646; + t.afii57448 = 0x0648; + t.afii57449 = 0x0649; + t.afii57450 = 0x064a; + t.afii57451 = 0x064b; + t.afii57452 = 0x064c; + t.afii57453 = 0x064d; + t.afii57454 = 0x064e; + t.afii57455 = 0x064f; + t.afii57456 = 0x0650; + t.afii57457 = 0x0651; + t.afii57458 = 0x0652; + t.afii57470 = 0x0647; + t.afii57505 = 0x06a4; + t.afii57506 = 0x067e; + t.afii57507 = 0x0686; + t.afii57508 = 0x0698; + t.afii57509 = 0x06af; + t.afii57511 = 0x0679; + t.afii57512 = 0x0688; + t.afii57513 = 0x0691; + t.afii57514 = 0x06ba; + t.afii57519 = 0x06d2; + t.afii57534 = 0x06d5; + t.afii57636 = 0x20aa; + t.afii57645 = 0x05be; + t.afii57658 = 0x05c3; + t.afii57664 = 0x05d0; + t.afii57665 = 0x05d1; + t.afii57666 = 0x05d2; + t.afii57667 = 0x05d3; + t.afii57668 = 0x05d4; + t.afii57669 = 0x05d5; + t.afii57670 = 0x05d6; + t.afii57671 = 0x05d7; + t.afii57672 = 0x05d8; + t.afii57673 = 0x05d9; + t.afii57674 = 0x05da; + t.afii57675 = 0x05db; + t.afii57676 = 0x05dc; + t.afii57677 = 0x05dd; + t.afii57678 = 0x05de; + t.afii57679 = 0x05df; + t.afii57680 = 0x05e0; + t.afii57681 = 0x05e1; + t.afii57682 = 0x05e2; + t.afii57683 = 0x05e3; + t.afii57684 = 0x05e4; + t.afii57685 = 0x05e5; + t.afii57686 = 0x05e6; + t.afii57687 = 0x05e7; + t.afii57688 = 0x05e8; + t.afii57689 = 0x05e9; + t.afii57690 = 0x05ea; + t.afii57694 = 0xfb2a; + t.afii57695 = 0xfb2b; + t.afii57700 = 0xfb4b; + t.afii57705 = 0xfb1f; + t.afii57716 = 0x05f0; + t.afii57717 = 0x05f1; + t.afii57718 = 0x05f2; + t.afii57723 = 0xfb35; + t.afii57793 = 0x05b4; + t.afii57794 = 0x05b5; + t.afii57795 = 0x05b6; + t.afii57796 = 0x05bb; + t.afii57797 = 0x05b8; + t.afii57798 = 0x05b7; + t.afii57799 = 0x05b0; + t.afii57800 = 0x05b2; + t.afii57801 = 0x05b1; + t.afii57802 = 0x05b3; + t.afii57803 = 0x05c2; + t.afii57804 = 0x05c1; + t.afii57806 = 0x05b9; + t.afii57807 = 0x05bc; + t.afii57839 = 0x05bd; + t.afii57841 = 0x05bf; + t.afii57842 = 0x05c0; + t.afii57929 = 0x02bc; + t.afii61248 = 0x2105; + t.afii61289 = 0x2113; + t.afii61352 = 0x2116; + t.afii61573 = 0x202c; + t.afii61574 = 0x202d; + t.afii61575 = 0x202e; + t.afii61664 = 0x200c; + t.afii63167 = 0x066d; + t.afii64937 = 0x02bd; + t.agrave = 0x00e0; + t.agujarati = 0x0a85; + t.agurmukhi = 0x0a05; + t.ahiragana = 0x3042; + t.ahookabove = 0x1ea3; + t.aibengali = 0x0990; + t.aibopomofo = 0x311e; + t.aideva = 0x0910; + t.aiecyrillic = 0x04d5; + t.aigujarati = 0x0a90; + t.aigurmukhi = 0x0a10; + t.aimatragurmukhi = 0x0a48; + t.ainarabic = 0x0639; + t.ainfinalarabic = 0xfeca; + t.aininitialarabic = 0xfecb; + t.ainmedialarabic = 0xfecc; + t.ainvertedbreve = 0x0203; + t.aivowelsignbengali = 0x09c8; + t.aivowelsigndeva = 0x0948; + t.aivowelsigngujarati = 0x0ac8; + t.akatakana = 0x30a2; + t.akatakanahalfwidth = 0xff71; + t.akorean = 0x314f; + t.alef = 0x05d0; + t.alefarabic = 0x0627; + t.alefdageshhebrew = 0xfb30; + t.aleffinalarabic = 0xfe8e; + t.alefhamzaabovearabic = 0x0623; + t.alefhamzaabovefinalarabic = 0xfe84; + t.alefhamzabelowarabic = 0x0625; + t.alefhamzabelowfinalarabic = 0xfe88; + t.alefhebrew = 0x05d0; + t.aleflamedhebrew = 0xfb4f; + t.alefmaddaabovearabic = 0x0622; + t.alefmaddaabovefinalarabic = 0xfe82; + t.alefmaksuraarabic = 0x0649; + t.alefmaksurafinalarabic = 0xfef0; + t.alefmaksurainitialarabic = 0xfef3; + t.alefmaksuramedialarabic = 0xfef4; + t.alefpatahhebrew = 0xfb2e; + t.alefqamatshebrew = 0xfb2f; + t.aleph = 0x2135; + t.allequal = 0x224c; + t.alpha = 0x03b1; + t.alphatonos = 0x03ac; + t.amacron = 0x0101; + t.amonospace = 0xff41; + t.ampersand = 0x0026; + t.ampersandmonospace = 0xff06; + t.ampersandsmall = 0xf726; + t.amsquare = 0x33c2; + t.anbopomofo = 0x3122; + t.angbopomofo = 0x3124; + t.angbracketleft = 0x3008; + t.angbracketright = 0x3009; + t.angkhankhuthai = 0x0e5a; + t.angle = 0x2220; + t.anglebracketleft = 0x3008; + t.anglebracketleftvertical = 0xfe3f; + t.anglebracketright = 0x3009; + t.anglebracketrightvertical = 0xfe40; + t.angleleft = 0x2329; + t.angleright = 0x232a; + t.angstrom = 0x212b; + t.anoteleia = 0x0387; + t.anudattadeva = 0x0952; + t.anusvarabengali = 0x0982; + t.anusvaradeva = 0x0902; + t.anusvaragujarati = 0x0a82; + t.aogonek = 0x0105; + t.apaatosquare = 0x3300; + t.aparen = 0x249c; + t.apostrophearmenian = 0x055a; + t.apostrophemod = 0x02bc; + t.apple = 0xf8ff; + t.approaches = 0x2250; + t.approxequal = 0x2248; + t.approxequalorimage = 0x2252; + t.approximatelyequal = 0x2245; + t.araeaekorean = 0x318e; + t.araeakorean = 0x318d; + t.arc = 0x2312; + t.arighthalfring = 0x1e9a; + t.aring = 0x00e5; + t.aringacute = 0x01fb; + t.aringbelow = 0x1e01; + t.arrowboth = 0x2194; + t.arrowdashdown = 0x21e3; + t.arrowdashleft = 0x21e0; + t.arrowdashright = 0x21e2; + t.arrowdashup = 0x21e1; + t.arrowdblboth = 0x21d4; + t.arrowdbldown = 0x21d3; + t.arrowdblleft = 0x21d0; + t.arrowdblright = 0x21d2; + t.arrowdblup = 0x21d1; + t.arrowdown = 0x2193; + t.arrowdownleft = 0x2199; + t.arrowdownright = 0x2198; + t.arrowdownwhite = 0x21e9; + t.arrowheaddownmod = 0x02c5; + t.arrowheadleftmod = 0x02c2; + t.arrowheadrightmod = 0x02c3; + t.arrowheadupmod = 0x02c4; + t.arrowhorizex = 0xf8e7; + t.arrowleft = 0x2190; + t.arrowleftdbl = 0x21d0; + t.arrowleftdblstroke = 0x21cd; + t.arrowleftoverright = 0x21c6; + t.arrowleftwhite = 0x21e6; + t.arrowright = 0x2192; + t.arrowrightdblstroke = 0x21cf; + t.arrowrightheavy = 0x279e; + t.arrowrightoverleft = 0x21c4; + t.arrowrightwhite = 0x21e8; + t.arrowtableft = 0x21e4; + t.arrowtabright = 0x21e5; + t.arrowup = 0x2191; + t.arrowupdn = 0x2195; + t.arrowupdnbse = 0x21a8; + t.arrowupdownbase = 0x21a8; + t.arrowupleft = 0x2196; + t.arrowupleftofdown = 0x21c5; + t.arrowupright = 0x2197; + t.arrowupwhite = 0x21e7; + t.arrowvertex = 0xf8e6; + t.asciicircum = 0x005e; + t.asciicircummonospace = 0xff3e; + t.asciitilde = 0x007e; + t.asciitildemonospace = 0xff5e; + t.ascript = 0x0251; + t.ascriptturned = 0x0252; + t.asmallhiragana = 0x3041; + t.asmallkatakana = 0x30a1; + t.asmallkatakanahalfwidth = 0xff67; + t.asterisk = 0x002a; + t.asteriskaltonearabic = 0x066d; + t.asteriskarabic = 0x066d; + t.asteriskmath = 0x2217; + t.asteriskmonospace = 0xff0a; + t.asterisksmall = 0xfe61; + t.asterism = 0x2042; + t.asuperior = 0xf6e9; + t.asymptoticallyequal = 0x2243; + t.at = 0x0040; + t.atilde = 0x00e3; + t.atmonospace = 0xff20; + t.atsmall = 0xfe6b; + t.aturned = 0x0250; + t.aubengali = 0x0994; + t.aubopomofo = 0x3120; + t.audeva = 0x0914; + t.augujarati = 0x0a94; + t.augurmukhi = 0x0a14; + t.aulengthmarkbengali = 0x09d7; + t.aumatragurmukhi = 0x0a4c; + t.auvowelsignbengali = 0x09cc; + t.auvowelsigndeva = 0x094c; + t.auvowelsigngujarati = 0x0acc; + t.avagrahadeva = 0x093d; + t.aybarmenian = 0x0561; + t.ayin = 0x05e2; + t.ayinaltonehebrew = 0xfb20; + t.ayinhebrew = 0x05e2; + t.b = 0x0062; + t.babengali = 0x09ac; + t.backslash = 0x005c; + t.backslashmonospace = 0xff3c; + t.badeva = 0x092c; + t.bagujarati = 0x0aac; + t.bagurmukhi = 0x0a2c; + t.bahiragana = 0x3070; + t.bahtthai = 0x0e3f; + t.bakatakana = 0x30d0; + t.bar = 0x007c; + t.barmonospace = 0xff5c; + t.bbopomofo = 0x3105; + t.bcircle = 0x24d1; + t.bdotaccent = 0x1e03; + t.bdotbelow = 0x1e05; + t.beamedsixteenthnotes = 0x266c; + t.because = 0x2235; + t.becyrillic = 0x0431; + t.beharabic = 0x0628; + t.behfinalarabic = 0xfe90; + t.behinitialarabic = 0xfe91; + t.behiragana = 0x3079; + t.behmedialarabic = 0xfe92; + t.behmeeminitialarabic = 0xfc9f; + t.behmeemisolatedarabic = 0xfc08; + t.behnoonfinalarabic = 0xfc6d; + t.bekatakana = 0x30d9; + t.benarmenian = 0x0562; + t.bet = 0x05d1; + t.beta = 0x03b2; + t.betasymbolgreek = 0x03d0; + t.betdagesh = 0xfb31; + t.betdageshhebrew = 0xfb31; + t.bethebrew = 0x05d1; + t.betrafehebrew = 0xfb4c; + t.bhabengali = 0x09ad; + t.bhadeva = 0x092d; + t.bhagujarati = 0x0aad; + t.bhagurmukhi = 0x0a2d; + t.bhook = 0x0253; + t.bihiragana = 0x3073; + t.bikatakana = 0x30d3; + t.bilabialclick = 0x0298; + t.bindigurmukhi = 0x0a02; + t.birusquare = 0x3331; + t.blackcircle = 0x25cf; + t.blackdiamond = 0x25c6; + t.blackdownpointingtriangle = 0x25bc; + t.blackleftpointingpointer = 0x25c4; + t.blackleftpointingtriangle = 0x25c0; + t.blacklenticularbracketleft = 0x3010; + t.blacklenticularbracketleftvertical = 0xfe3b; + t.blacklenticularbracketright = 0x3011; + t.blacklenticularbracketrightvertical = 0xfe3c; + t.blacklowerlefttriangle = 0x25e3; + t.blacklowerrighttriangle = 0x25e2; + t.blackrectangle = 0x25ac; + t.blackrightpointingpointer = 0x25ba; + t.blackrightpointingtriangle = 0x25b6; + t.blacksmallsquare = 0x25aa; + t.blacksmilingface = 0x263b; + t.blacksquare = 0x25a0; + t.blackstar = 0x2605; + t.blackupperlefttriangle = 0x25e4; + t.blackupperrighttriangle = 0x25e5; + t.blackuppointingsmalltriangle = 0x25b4; + t.blackuppointingtriangle = 0x25b2; + t.blank = 0x2423; + t.blinebelow = 0x1e07; + t.block = 0x2588; + t.bmonospace = 0xff42; + t.bobaimaithai = 0x0e1a; + t.bohiragana = 0x307c; + t.bokatakana = 0x30dc; + t.bparen = 0x249d; + t.bqsquare = 0x33c3; + t.braceex = 0xf8f4; + t.braceleft = 0x007b; + t.braceleftbt = 0xf8f3; + t.braceleftmid = 0xf8f2; + t.braceleftmonospace = 0xff5b; + t.braceleftsmall = 0xfe5b; + t.bracelefttp = 0xf8f1; + t.braceleftvertical = 0xfe37; + t.braceright = 0x007d; + t.bracerightbt = 0xf8fe; + t.bracerightmid = 0xf8fd; + t.bracerightmonospace = 0xff5d; + t.bracerightsmall = 0xfe5c; + t.bracerighttp = 0xf8fc; + t.bracerightvertical = 0xfe38; + t.bracketleft = 0x005b; + t.bracketleftbt = 0xf8f0; + t.bracketleftex = 0xf8ef; + t.bracketleftmonospace = 0xff3b; + t.bracketlefttp = 0xf8ee; + t.bracketright = 0x005d; + t.bracketrightbt = 0xf8fb; + t.bracketrightex = 0xf8fa; + t.bracketrightmonospace = 0xff3d; + t.bracketrighttp = 0xf8f9; + t.breve = 0x02d8; + t.brevebelowcmb = 0x032e; + t.brevecmb = 0x0306; + t.breveinvertedbelowcmb = 0x032f; + t.breveinvertedcmb = 0x0311; + t.breveinverteddoublecmb = 0x0361; + t.bridgebelowcmb = 0x032a; + t.bridgeinvertedbelowcmb = 0x033a; + t.brokenbar = 0x00a6; + t.bstroke = 0x0180; + t.bsuperior = 0xf6ea; + t.btopbar = 0x0183; + t.buhiragana = 0x3076; + t.bukatakana = 0x30d6; + t.bullet = 0x2022; + t.bulletinverse = 0x25d8; + t.bulletoperator = 0x2219; + t.bullseye = 0x25ce; + t.c = 0x0063; + t.caarmenian = 0x056e; + t.cabengali = 0x099a; + t.cacute = 0x0107; + t.cadeva = 0x091a; + t.cagujarati = 0x0a9a; + t.cagurmukhi = 0x0a1a; + t.calsquare = 0x3388; + t.candrabindubengali = 0x0981; + t.candrabinducmb = 0x0310; + t.candrabindudeva = 0x0901; + t.candrabindugujarati = 0x0a81; + t.capslock = 0x21ea; + t.careof = 0x2105; + t.caron = 0x02c7; + t.caronbelowcmb = 0x032c; + t.caroncmb = 0x030c; + t.carriagereturn = 0x21b5; + t.cbopomofo = 0x3118; + t.ccaron = 0x010d; + t.ccedilla = 0x00e7; + t.ccedillaacute = 0x1e09; + t.ccircle = 0x24d2; + t.ccircumflex = 0x0109; + t.ccurl = 0x0255; + t.cdot = 0x010b; + t.cdotaccent = 0x010b; + t.cdsquare = 0x33c5; + t.cedilla = 0x00b8; + t.cedillacmb = 0x0327; + t.cent = 0x00a2; + t.centigrade = 0x2103; + t.centinferior = 0xf6df; + t.centmonospace = 0xffe0; + t.centoldstyle = 0xf7a2; + t.centsuperior = 0xf6e0; + t.chaarmenian = 0x0579; + t.chabengali = 0x099b; + t.chadeva = 0x091b; + t.chagujarati = 0x0a9b; + t.chagurmukhi = 0x0a1b; + t.chbopomofo = 0x3114; + t.cheabkhasiancyrillic = 0x04bd; + t.checkmark = 0x2713; + t.checyrillic = 0x0447; + t.chedescenderabkhasiancyrillic = 0x04bf; + t.chedescendercyrillic = 0x04b7; + t.chedieresiscyrillic = 0x04f5; + t.cheharmenian = 0x0573; + t.chekhakassiancyrillic = 0x04cc; + t.cheverticalstrokecyrillic = 0x04b9; + t.chi = 0x03c7; + t.chieuchacirclekorean = 0x3277; + t.chieuchaparenkorean = 0x3217; + t.chieuchcirclekorean = 0x3269; + t.chieuchkorean = 0x314a; + t.chieuchparenkorean = 0x3209; + t.chochangthai = 0x0e0a; + t.chochanthai = 0x0e08; + t.chochingthai = 0x0e09; + t.chochoethai = 0x0e0c; + t.chook = 0x0188; + t.cieucacirclekorean = 0x3276; + t.cieucaparenkorean = 0x3216; + t.cieuccirclekorean = 0x3268; + t.cieuckorean = 0x3148; + t.cieucparenkorean = 0x3208; + t.cieucuparenkorean = 0x321c; + t.circle = 0x25cb; + t.circlecopyrt = 0x00a9; + t.circlemultiply = 0x2297; + t.circleot = 0x2299; + t.circleplus = 0x2295; + t.circlepostalmark = 0x3036; + t.circlewithlefthalfblack = 0x25d0; + t.circlewithrighthalfblack = 0x25d1; + t.circumflex = 0x02c6; + t.circumflexbelowcmb = 0x032d; + t.circumflexcmb = 0x0302; + t.clear = 0x2327; + t.clickalveolar = 0x01c2; + t.clickdental = 0x01c0; + t.clicklateral = 0x01c1; + t.clickretroflex = 0x01c3; + t.club = 0x2663; + t.clubsuitblack = 0x2663; + t.clubsuitwhite = 0x2667; + t.cmcubedsquare = 0x33a4; + t.cmonospace = 0xff43; + t.cmsquaredsquare = 0x33a0; + t.coarmenian = 0x0581; + t.colon = 0x003a; + t.colonmonetary = 0x20a1; + t.colonmonospace = 0xff1a; + t.colonsign = 0x20a1; + t.colonsmall = 0xfe55; + t.colontriangularhalfmod = 0x02d1; + t.colontriangularmod = 0x02d0; + t.comma = 0x002c; + t.commaabovecmb = 0x0313; + t.commaaboverightcmb = 0x0315; + t.commaaccent = 0xf6c3; + t.commaarabic = 0x060c; + t.commaarmenian = 0x055d; + t.commainferior = 0xf6e1; + t.commamonospace = 0xff0c; + t.commareversedabovecmb = 0x0314; + t.commareversedmod = 0x02bd; + t.commasmall = 0xfe50; + t.commasuperior = 0xf6e2; + t.commaturnedabovecmb = 0x0312; + t.commaturnedmod = 0x02bb; + t.compass = 0x263c; + t.congruent = 0x2245; + t.contourintegral = 0x222e; + t.control = 0x2303; + t.controlACK = 0x0006; + t.controlBEL = 0x0007; + t.controlBS = 0x0008; + t.controlCAN = 0x0018; + t.controlCR = 0x000d; + t.controlDC1 = 0x0011; + t.controlDC2 = 0x0012; + t.controlDC3 = 0x0013; + t.controlDC4 = 0x0014; + t.controlDEL = 0x007f; + t.controlDLE = 0x0010; + t.controlEM = 0x0019; + t.controlENQ = 0x0005; + t.controlEOT = 0x0004; + t.controlESC = 0x001b; + t.controlETB = 0x0017; + t.controlETX = 0x0003; + t.controlFF = 0x000c; + t.controlFS = 0x001c; + t.controlGS = 0x001d; + t.controlHT = 0x0009; + t.controlLF = 0x000a; + t.controlNAK = 0x0015; + t.controlNULL = 0x0000; + t.controlRS = 0x001e; + t.controlSI = 0x000f; + t.controlSO = 0x000e; + t.controlSOT = 0x0002; + t.controlSTX = 0x0001; + t.controlSUB = 0x001a; + t.controlSYN = 0x0016; + t.controlUS = 0x001f; + t.controlVT = 0x000b; + t.copyright = 0x00a9; + t.copyrightsans = 0xf8e9; + t.copyrightserif = 0xf6d9; + t.cornerbracketleft = 0x300c; + t.cornerbracketlefthalfwidth = 0xff62; + t.cornerbracketleftvertical = 0xfe41; + t.cornerbracketright = 0x300d; + t.cornerbracketrighthalfwidth = 0xff63; + t.cornerbracketrightvertical = 0xfe42; + t.corporationsquare = 0x337f; + t.cosquare = 0x33c7; + t.coverkgsquare = 0x33c6; + t.cparen = 0x249e; + t.cruzeiro = 0x20a2; + t.cstretched = 0x0297; + t.curlyand = 0x22cf; + t.curlyor = 0x22ce; + t.currency = 0x00a4; + t.cyrBreve = 0xf6d1; + t.cyrFlex = 0xf6d2; + t.cyrbreve = 0xf6d4; + t.cyrflex = 0xf6d5; + t.d = 0x0064; + t.daarmenian = 0x0564; + t.dabengali = 0x09a6; + t.dadarabic = 0x0636; + t.dadeva = 0x0926; + t.dadfinalarabic = 0xfebe; + t.dadinitialarabic = 0xfebf; + t.dadmedialarabic = 0xfec0; + t.dagesh = 0x05bc; + t.dageshhebrew = 0x05bc; + t.dagger = 0x2020; + t.daggerdbl = 0x2021; + t.dagujarati = 0x0aa6; + t.dagurmukhi = 0x0a26; + t.dahiragana = 0x3060; + t.dakatakana = 0x30c0; + t.dalarabic = 0x062f; + t.dalet = 0x05d3; + t.daletdagesh = 0xfb33; + t.daletdageshhebrew = 0xfb33; + t.dalethebrew = 0x05d3; + t.dalfinalarabic = 0xfeaa; + t.dammaarabic = 0x064f; + t.dammalowarabic = 0x064f; + t.dammatanaltonearabic = 0x064c; + t.dammatanarabic = 0x064c; + t.danda = 0x0964; + t.dargahebrew = 0x05a7; + t.dargalefthebrew = 0x05a7; + t.dasiapneumatacyrilliccmb = 0x0485; + t.dblGrave = 0xf6d3; + t.dblanglebracketleft = 0x300a; + t.dblanglebracketleftvertical = 0xfe3d; + t.dblanglebracketright = 0x300b; + t.dblanglebracketrightvertical = 0xfe3e; + t.dblarchinvertedbelowcmb = 0x032b; + t.dblarrowleft = 0x21d4; + t.dblarrowright = 0x21d2; + t.dbldanda = 0x0965; + t.dblgrave = 0xf6d6; + t.dblgravecmb = 0x030f; + t.dblintegral = 0x222c; + t.dbllowline = 0x2017; + t.dbllowlinecmb = 0x0333; + t.dbloverlinecmb = 0x033f; + t.dblprimemod = 0x02ba; + t.dblverticalbar = 0x2016; + t.dblverticallineabovecmb = 0x030e; + t.dbopomofo = 0x3109; + t.dbsquare = 0x33c8; + t.dcaron = 0x010f; + t.dcedilla = 0x1e11; + t.dcircle = 0x24d3; + t.dcircumflexbelow = 0x1e13; + t.dcroat = 0x0111; + t.ddabengali = 0x09a1; + t.ddadeva = 0x0921; + t.ddagujarati = 0x0aa1; + t.ddagurmukhi = 0x0a21; + t.ddalarabic = 0x0688; + t.ddalfinalarabic = 0xfb89; + t.dddhadeva = 0x095c; + t.ddhabengali = 0x09a2; + t.ddhadeva = 0x0922; + t.ddhagujarati = 0x0aa2; + t.ddhagurmukhi = 0x0a22; + t.ddotaccent = 0x1e0b; + t.ddotbelow = 0x1e0d; + t.decimalseparatorarabic = 0x066b; + t.decimalseparatorpersian = 0x066b; + t.decyrillic = 0x0434; + t.degree = 0x00b0; + t.dehihebrew = 0x05ad; + t.dehiragana = 0x3067; + t.deicoptic = 0x03ef; + t.dekatakana = 0x30c7; + t.deleteleft = 0x232b; + t.deleteright = 0x2326; + t.delta = 0x03b4; + t.deltaturned = 0x018d; + t.denominatorminusonenumeratorbengali = 0x09f8; + t.dezh = 0x02a4; + t.dhabengali = 0x09a7; + t.dhadeva = 0x0927; + t.dhagujarati = 0x0aa7; + t.dhagurmukhi = 0x0a27; + t.dhook = 0x0257; + t.dialytikatonos = 0x0385; + t.dialytikatonoscmb = 0x0344; + t.diamond = 0x2666; + t.diamondsuitwhite = 0x2662; + t.dieresis = 0x00a8; + t.dieresisacute = 0xf6d7; + t.dieresisbelowcmb = 0x0324; + t.dieresiscmb = 0x0308; + t.dieresisgrave = 0xf6d8; + t.dieresistonos = 0x0385; + t.dihiragana = 0x3062; + t.dikatakana = 0x30c2; + t.dittomark = 0x3003; + t.divide = 0x00f7; + t.divides = 0x2223; + t.divisionslash = 0x2215; + t.djecyrillic = 0x0452; + t.dkshade = 0x2593; + t.dlinebelow = 0x1e0f; + t.dlsquare = 0x3397; + t.dmacron = 0x0111; + t.dmonospace = 0xff44; + t.dnblock = 0x2584; + t.dochadathai = 0x0e0e; + t.dodekthai = 0x0e14; + t.dohiragana = 0x3069; + t.dokatakana = 0x30c9; + t.dollar = 0x0024; + t.dollarinferior = 0xf6e3; + t.dollarmonospace = 0xff04; + t.dollaroldstyle = 0xf724; + t.dollarsmall = 0xfe69; + t.dollarsuperior = 0xf6e4; + t.dong = 0x20ab; + t.dorusquare = 0x3326; + t.dotaccent = 0x02d9; + t.dotaccentcmb = 0x0307; + t.dotbelowcmb = 0x0323; + t.dotbelowcomb = 0x0323; + t.dotkatakana = 0x30fb; + t.dotlessi = 0x0131; + t.dotlessj = 0xf6be; + t.dotlessjstrokehook = 0x0284; + t.dotmath = 0x22c5; + t.dottedcircle = 0x25cc; + t.doubleyodpatah = 0xfb1f; + t.doubleyodpatahhebrew = 0xfb1f; + t.downtackbelowcmb = 0x031e; + t.downtackmod = 0x02d5; + t.dparen = 0x249f; + t.dsuperior = 0xf6eb; + t.dtail = 0x0256; + t.dtopbar = 0x018c; + t.duhiragana = 0x3065; + t.dukatakana = 0x30c5; + t.dz = 0x01f3; + t.dzaltone = 0x02a3; + t.dzcaron = 0x01c6; + t.dzcurl = 0x02a5; + t.dzeabkhasiancyrillic = 0x04e1; + t.dzecyrillic = 0x0455; + t.dzhecyrillic = 0x045f; + t.e = 0x0065; + t.eacute = 0x00e9; + t.earth = 0x2641; + t.ebengali = 0x098f; + t.ebopomofo = 0x311c; + t.ebreve = 0x0115; + t.ecandradeva = 0x090d; + t.ecandragujarati = 0x0a8d; + t.ecandravowelsigndeva = 0x0945; + t.ecandravowelsigngujarati = 0x0ac5; + t.ecaron = 0x011b; + t.ecedillabreve = 0x1e1d; + t.echarmenian = 0x0565; + t.echyiwnarmenian = 0x0587; + t.ecircle = 0x24d4; + t.ecircumflex = 0x00ea; + t.ecircumflexacute = 0x1ebf; + t.ecircumflexbelow = 0x1e19; + t.ecircumflexdotbelow = 0x1ec7; + t.ecircumflexgrave = 0x1ec1; + t.ecircumflexhookabove = 0x1ec3; + t.ecircumflextilde = 0x1ec5; + t.ecyrillic = 0x0454; + t.edblgrave = 0x0205; + t.edeva = 0x090f; + t.edieresis = 0x00eb; + t.edot = 0x0117; + t.edotaccent = 0x0117; + t.edotbelow = 0x1eb9; + t.eegurmukhi = 0x0a0f; + t.eematragurmukhi = 0x0a47; + t.efcyrillic = 0x0444; + t.egrave = 0x00e8; + t.egujarati = 0x0a8f; + t.eharmenian = 0x0567; + t.ehbopomofo = 0x311d; + t.ehiragana = 0x3048; + t.ehookabove = 0x1ebb; + t.eibopomofo = 0x311f; + t.eight = 0x0038; + t.eightarabic = 0x0668; + t.eightbengali = 0x09ee; + t.eightcircle = 0x2467; + t.eightcircleinversesansserif = 0x2791; + t.eightdeva = 0x096e; + t.eighteencircle = 0x2471; + t.eighteenparen = 0x2485; + t.eighteenperiod = 0x2499; + t.eightgujarati = 0x0aee; + t.eightgurmukhi = 0x0a6e; + t.eighthackarabic = 0x0668; + t.eighthangzhou = 0x3028; + t.eighthnotebeamed = 0x266b; + t.eightideographicparen = 0x3227; + t.eightinferior = 0x2088; + t.eightmonospace = 0xff18; + t.eightoldstyle = 0xf738; + t.eightparen = 0x247b; + t.eightperiod = 0x248f; + t.eightpersian = 0x06f8; + t.eightroman = 0x2177; + t.eightsuperior = 0x2078; + t.eightthai = 0x0e58; + t.einvertedbreve = 0x0207; + t.eiotifiedcyrillic = 0x0465; + t.ekatakana = 0x30a8; + t.ekatakanahalfwidth = 0xff74; + t.ekonkargurmukhi = 0x0a74; + t.ekorean = 0x3154; + t.elcyrillic = 0x043b; + t.element = 0x2208; + t.elevencircle = 0x246a; + t.elevenparen = 0x247e; + t.elevenperiod = 0x2492; + t.elevenroman = 0x217a; + t.ellipsis = 0x2026; + t.ellipsisvertical = 0x22ee; + t.emacron = 0x0113; + t.emacronacute = 0x1e17; + t.emacrongrave = 0x1e15; + t.emcyrillic = 0x043c; + t.emdash = 0x2014; + t.emdashvertical = 0xfe31; + t.emonospace = 0xff45; + t.emphasismarkarmenian = 0x055b; + t.emptyset = 0x2205; + t.enbopomofo = 0x3123; + t.encyrillic = 0x043d; + t.endash = 0x2013; + t.endashvertical = 0xfe32; + t.endescendercyrillic = 0x04a3; + t.eng = 0x014b; + t.engbopomofo = 0x3125; + t.enghecyrillic = 0x04a5; + t.enhookcyrillic = 0x04c8; + t.enspace = 0x2002; + t.eogonek = 0x0119; + t.eokorean = 0x3153; + t.eopen = 0x025b; + t.eopenclosed = 0x029a; + t.eopenreversed = 0x025c; + t.eopenreversedclosed = 0x025e; + t.eopenreversedhook = 0x025d; + t.eparen = 0x24a0; + t.epsilon = 0x03b5; + t.epsilontonos = 0x03ad; + t.equal = 0x003d; + t.equalmonospace = 0xff1d; + t.equalsmall = 0xfe66; + t.equalsuperior = 0x207c; + t.equivalence = 0x2261; + t.erbopomofo = 0x3126; + t.ercyrillic = 0x0440; + t.ereversed = 0x0258; + t.ereversedcyrillic = 0x044d; + t.escyrillic = 0x0441; + t.esdescendercyrillic = 0x04ab; + t.esh = 0x0283; + t.eshcurl = 0x0286; + t.eshortdeva = 0x090e; + t.eshortvowelsigndeva = 0x0946; + t.eshreversedloop = 0x01aa; + t.eshsquatreversed = 0x0285; + t.esmallhiragana = 0x3047; + t.esmallkatakana = 0x30a7; + t.esmallkatakanahalfwidth = 0xff6a; + t.estimated = 0x212e; + t.esuperior = 0xf6ec; + t.eta = 0x03b7; + t.etarmenian = 0x0568; + t.etatonos = 0x03ae; + t.eth = 0x00f0; + t.etilde = 0x1ebd; + t.etildebelow = 0x1e1b; + t.etnahtafoukhhebrew = 0x0591; + t.etnahtafoukhlefthebrew = 0x0591; + t.etnahtahebrew = 0x0591; + t.etnahtalefthebrew = 0x0591; + t.eturned = 0x01dd; + t.eukorean = 0x3161; + t.euro = 0x20ac; + t.evowelsignbengali = 0x09c7; + t.evowelsigndeva = 0x0947; + t.evowelsigngujarati = 0x0ac7; + t.exclam = 0x0021; + t.exclamarmenian = 0x055c; + t.exclamdbl = 0x203c; + t.exclamdown = 0x00a1; + t.exclamdownsmall = 0xf7a1; + t.exclammonospace = 0xff01; + t.exclamsmall = 0xf721; + t.existential = 0x2203; + t.ezh = 0x0292; + t.ezhcaron = 0x01ef; + t.ezhcurl = 0x0293; + t.ezhreversed = 0x01b9; + t.ezhtail = 0x01ba; + t.f = 0x0066; + t.fadeva = 0x095e; + t.fagurmukhi = 0x0a5e; + t.fahrenheit = 0x2109; + t.fathaarabic = 0x064e; + t.fathalowarabic = 0x064e; + t.fathatanarabic = 0x064b; + t.fbopomofo = 0x3108; + t.fcircle = 0x24d5; + t.fdotaccent = 0x1e1f; + t.feharabic = 0x0641; + t.feharmenian = 0x0586; + t.fehfinalarabic = 0xfed2; + t.fehinitialarabic = 0xfed3; + t.fehmedialarabic = 0xfed4; + t.feicoptic = 0x03e5; + t.female = 0x2640; + t.ff = 0xfb00; + t.f_f = 0xfb00; + t.ffi = 0xfb03; + t.f_f_i = 0xfb03; + t.ffl = 0xfb04; + t.f_f_l = 0xfb04; + t.fi = 0xfb01; + t.f_i = 0xfb01; + t.fifteencircle = 0x246e; + t.fifteenparen = 0x2482; + t.fifteenperiod = 0x2496; + t.figuredash = 0x2012; + t.filledbox = 0x25a0; + t.filledrect = 0x25ac; + t.finalkaf = 0x05da; + t.finalkafdagesh = 0xfb3a; + t.finalkafdageshhebrew = 0xfb3a; + t.finalkafhebrew = 0x05da; + t.finalmem = 0x05dd; + t.finalmemhebrew = 0x05dd; + t.finalnun = 0x05df; + t.finalnunhebrew = 0x05df; + t.finalpe = 0x05e3; + t.finalpehebrew = 0x05e3; + t.finaltsadi = 0x05e5; + t.finaltsadihebrew = 0x05e5; + t.firsttonechinese = 0x02c9; + t.fisheye = 0x25c9; + t.fitacyrillic = 0x0473; + t.five = 0x0035; + t.fivearabic = 0x0665; + t.fivebengali = 0x09eb; + t.fivecircle = 0x2464; + t.fivecircleinversesansserif = 0x278e; + t.fivedeva = 0x096b; + t.fiveeighths = 0x215d; + t.fivegujarati = 0x0aeb; + t.fivegurmukhi = 0x0a6b; + t.fivehackarabic = 0x0665; + t.fivehangzhou = 0x3025; + t.fiveideographicparen = 0x3224; + t.fiveinferior = 0x2085; + t.fivemonospace = 0xff15; + t.fiveoldstyle = 0xf735; + t.fiveparen = 0x2478; + t.fiveperiod = 0x248c; + t.fivepersian = 0x06f5; + t.fiveroman = 0x2174; + t.fivesuperior = 0x2075; + t.fivethai = 0x0e55; + t.fl = 0xfb02; + t.f_l = 0xfb02; + t.florin = 0x0192; + t.fmonospace = 0xff46; + t.fmsquare = 0x3399; + t.fofanthai = 0x0e1f; + t.fofathai = 0x0e1d; + t.fongmanthai = 0x0e4f; + t.forall = 0x2200; + t.four = 0x0034; + t.fourarabic = 0x0664; + t.fourbengali = 0x09ea; + t.fourcircle = 0x2463; + t.fourcircleinversesansserif = 0x278d; + t.fourdeva = 0x096a; + t.fourgujarati = 0x0aea; + t.fourgurmukhi = 0x0a6a; + t.fourhackarabic = 0x0664; + t.fourhangzhou = 0x3024; + t.fourideographicparen = 0x3223; + t.fourinferior = 0x2084; + t.fourmonospace = 0xff14; + t.fournumeratorbengali = 0x09f7; + t.fouroldstyle = 0xf734; + t.fourparen = 0x2477; + t.fourperiod = 0x248b; + t.fourpersian = 0x06f4; + t.fourroman = 0x2173; + t.foursuperior = 0x2074; + t.fourteencircle = 0x246d; + t.fourteenparen = 0x2481; + t.fourteenperiod = 0x2495; + t.fourthai = 0x0e54; + t.fourthtonechinese = 0x02cb; + t.fparen = 0x24a1; + t.fraction = 0x2044; + t.franc = 0x20a3; + t.g = 0x0067; + t.gabengali = 0x0997; + t.gacute = 0x01f5; + t.gadeva = 0x0917; + t.gafarabic = 0x06af; + t.gaffinalarabic = 0xfb93; + t.gafinitialarabic = 0xfb94; + t.gafmedialarabic = 0xfb95; + t.gagujarati = 0x0a97; + t.gagurmukhi = 0x0a17; + t.gahiragana = 0x304c; + t.gakatakana = 0x30ac; + t.gamma = 0x03b3; + t.gammalatinsmall = 0x0263; + t.gammasuperior = 0x02e0; + t.gangiacoptic = 0x03eb; + t.gbopomofo = 0x310d; + t.gbreve = 0x011f; + t.gcaron = 0x01e7; + t.gcedilla = 0x0123; + t.gcircle = 0x24d6; + t.gcircumflex = 0x011d; + t.gcommaaccent = 0x0123; + t.gdot = 0x0121; + t.gdotaccent = 0x0121; + t.gecyrillic = 0x0433; + t.gehiragana = 0x3052; + t.gekatakana = 0x30b2; + t.geometricallyequal = 0x2251; + t.gereshaccenthebrew = 0x059c; + t.gereshhebrew = 0x05f3; + t.gereshmuqdamhebrew = 0x059d; + t.germandbls = 0x00df; + t.gershayimaccenthebrew = 0x059e; + t.gershayimhebrew = 0x05f4; + t.getamark = 0x3013; + t.ghabengali = 0x0998; + t.ghadarmenian = 0x0572; + t.ghadeva = 0x0918; + t.ghagujarati = 0x0a98; + t.ghagurmukhi = 0x0a18; + t.ghainarabic = 0x063a; + t.ghainfinalarabic = 0xfece; + t.ghaininitialarabic = 0xfecf; + t.ghainmedialarabic = 0xfed0; + t.ghemiddlehookcyrillic = 0x0495; + t.ghestrokecyrillic = 0x0493; + t.gheupturncyrillic = 0x0491; + t.ghhadeva = 0x095a; + t.ghhagurmukhi = 0x0a5a; + t.ghook = 0x0260; + t.ghzsquare = 0x3393; + t.gihiragana = 0x304e; + t.gikatakana = 0x30ae; + t.gimarmenian = 0x0563; + t.gimel = 0x05d2; + t.gimeldagesh = 0xfb32; + t.gimeldageshhebrew = 0xfb32; + t.gimelhebrew = 0x05d2; + t.gjecyrillic = 0x0453; + t.glottalinvertedstroke = 0x01be; + t.glottalstop = 0x0294; + t.glottalstopinverted = 0x0296; + t.glottalstopmod = 0x02c0; + t.glottalstopreversed = 0x0295; + t.glottalstopreversedmod = 0x02c1; + t.glottalstopreversedsuperior = 0x02e4; + t.glottalstopstroke = 0x02a1; + t.glottalstopstrokereversed = 0x02a2; + t.gmacron = 0x1e21; + t.gmonospace = 0xff47; + t.gohiragana = 0x3054; + t.gokatakana = 0x30b4; + t.gparen = 0x24a2; + t.gpasquare = 0x33ac; + t.gradient = 0x2207; + t.grave = 0x0060; + t.gravebelowcmb = 0x0316; + t.gravecmb = 0x0300; + t.gravecomb = 0x0300; + t.gravedeva = 0x0953; + t.gravelowmod = 0x02ce; + t.gravemonospace = 0xff40; + t.gravetonecmb = 0x0340; + t.greater = 0x003e; + t.greaterequal = 0x2265; + t.greaterequalorless = 0x22db; + t.greatermonospace = 0xff1e; + t.greaterorequivalent = 0x2273; + t.greaterorless = 0x2277; + t.greateroverequal = 0x2267; + t.greatersmall = 0xfe65; + t.gscript = 0x0261; + t.gstroke = 0x01e5; + t.guhiragana = 0x3050; + t.guillemotleft = 0x00ab; + t.guillemotright = 0x00bb; + t.guilsinglleft = 0x2039; + t.guilsinglright = 0x203a; + t.gukatakana = 0x30b0; + t.guramusquare = 0x3318; + t.gysquare = 0x33c9; + t.h = 0x0068; + t.haabkhasiancyrillic = 0x04a9; + t.haaltonearabic = 0x06c1; + t.habengali = 0x09b9; + t.hadescendercyrillic = 0x04b3; + t.hadeva = 0x0939; + t.hagujarati = 0x0ab9; + t.hagurmukhi = 0x0a39; + t.haharabic = 0x062d; + t.hahfinalarabic = 0xfea2; + t.hahinitialarabic = 0xfea3; + t.hahiragana = 0x306f; + t.hahmedialarabic = 0xfea4; + t.haitusquare = 0x332a; + t.hakatakana = 0x30cf; + t.hakatakanahalfwidth = 0xff8a; + t.halantgurmukhi = 0x0a4d; + t.hamzaarabic = 0x0621; + t.hamzalowarabic = 0x0621; + t.hangulfiller = 0x3164; + t.hardsigncyrillic = 0x044a; + t.harpoonleftbarbup = 0x21bc; + t.harpoonrightbarbup = 0x21c0; + t.hasquare = 0x33ca; + t.hatafpatah = 0x05b2; + t.hatafpatah16 = 0x05b2; + t.hatafpatah23 = 0x05b2; + t.hatafpatah2f = 0x05b2; + t.hatafpatahhebrew = 0x05b2; + t.hatafpatahnarrowhebrew = 0x05b2; + t.hatafpatahquarterhebrew = 0x05b2; + t.hatafpatahwidehebrew = 0x05b2; + t.hatafqamats = 0x05b3; + t.hatafqamats1b = 0x05b3; + t.hatafqamats28 = 0x05b3; + t.hatafqamats34 = 0x05b3; + t.hatafqamatshebrew = 0x05b3; + t.hatafqamatsnarrowhebrew = 0x05b3; + t.hatafqamatsquarterhebrew = 0x05b3; + t.hatafqamatswidehebrew = 0x05b3; + t.hatafsegol = 0x05b1; + t.hatafsegol17 = 0x05b1; + t.hatafsegol24 = 0x05b1; + t.hatafsegol30 = 0x05b1; + t.hatafsegolhebrew = 0x05b1; + t.hatafsegolnarrowhebrew = 0x05b1; + t.hatafsegolquarterhebrew = 0x05b1; + t.hatafsegolwidehebrew = 0x05b1; + t.hbar = 0x0127; + t.hbopomofo = 0x310f; + t.hbrevebelow = 0x1e2b; + t.hcedilla = 0x1e29; + t.hcircle = 0x24d7; + t.hcircumflex = 0x0125; + t.hdieresis = 0x1e27; + t.hdotaccent = 0x1e23; + t.hdotbelow = 0x1e25; + t.he = 0x05d4; + t.heart = 0x2665; + t.heartsuitblack = 0x2665; + t.heartsuitwhite = 0x2661; + t.hedagesh = 0xfb34; + t.hedageshhebrew = 0xfb34; + t.hehaltonearabic = 0x06c1; + t.heharabic = 0x0647; + t.hehebrew = 0x05d4; + t.hehfinalaltonearabic = 0xfba7; + t.hehfinalalttwoarabic = 0xfeea; + t.hehfinalarabic = 0xfeea; + t.hehhamzaabovefinalarabic = 0xfba5; + t.hehhamzaaboveisolatedarabic = 0xfba4; + t.hehinitialaltonearabic = 0xfba8; + t.hehinitialarabic = 0xfeeb; + t.hehiragana = 0x3078; + t.hehmedialaltonearabic = 0xfba9; + t.hehmedialarabic = 0xfeec; + t.heiseierasquare = 0x337b; + t.hekatakana = 0x30d8; + t.hekatakanahalfwidth = 0xff8d; + t.hekutaarusquare = 0x3336; + t.henghook = 0x0267; + t.herutusquare = 0x3339; + t.het = 0x05d7; + t.hethebrew = 0x05d7; + t.hhook = 0x0266; + t.hhooksuperior = 0x02b1; + t.hieuhacirclekorean = 0x327b; + t.hieuhaparenkorean = 0x321b; + t.hieuhcirclekorean = 0x326d; + t.hieuhkorean = 0x314e; + t.hieuhparenkorean = 0x320d; + t.hihiragana = 0x3072; + t.hikatakana = 0x30d2; + t.hikatakanahalfwidth = 0xff8b; + t.hiriq = 0x05b4; + t.hiriq14 = 0x05b4; + t.hiriq21 = 0x05b4; + t.hiriq2d = 0x05b4; + t.hiriqhebrew = 0x05b4; + t.hiriqnarrowhebrew = 0x05b4; + t.hiriqquarterhebrew = 0x05b4; + t.hiriqwidehebrew = 0x05b4; + t.hlinebelow = 0x1e96; + t.hmonospace = 0xff48; + t.hoarmenian = 0x0570; + t.hohipthai = 0x0e2b; + t.hohiragana = 0x307b; + t.hokatakana = 0x30db; + t.hokatakanahalfwidth = 0xff8e; + t.holam = 0x05b9; + t.holam19 = 0x05b9; + t.holam26 = 0x05b9; + t.holam32 = 0x05b9; + t.holamhebrew = 0x05b9; + t.holamnarrowhebrew = 0x05b9; + t.holamquarterhebrew = 0x05b9; + t.holamwidehebrew = 0x05b9; + t.honokhukthai = 0x0e2e; + t.hookabovecomb = 0x0309; + t.hookcmb = 0x0309; + t.hookpalatalizedbelowcmb = 0x0321; + t.hookretroflexbelowcmb = 0x0322; + t.hoonsquare = 0x3342; + t.horicoptic = 0x03e9; + t.horizontalbar = 0x2015; + t.horncmb = 0x031b; + t.hotsprings = 0x2668; + t.house = 0x2302; + t.hparen = 0x24a3; + t.hsuperior = 0x02b0; + t.hturned = 0x0265; + t.huhiragana = 0x3075; + t.huiitosquare = 0x3333; + t.hukatakana = 0x30d5; + t.hukatakanahalfwidth = 0xff8c; + t.hungarumlaut = 0x02dd; + t.hungarumlautcmb = 0x030b; + t.hv = 0x0195; + t.hyphen = 0x002d; + t.hypheninferior = 0xf6e5; + t.hyphenmonospace = 0xff0d; + t.hyphensmall = 0xfe63; + t.hyphensuperior = 0xf6e6; + t.hyphentwo = 0x2010; + t.i = 0x0069; + t.iacute = 0x00ed; + t.iacyrillic = 0x044f; + t.ibengali = 0x0987; + t.ibopomofo = 0x3127; + t.ibreve = 0x012d; + t.icaron = 0x01d0; + t.icircle = 0x24d8; + t.icircumflex = 0x00ee; + t.icyrillic = 0x0456; + t.idblgrave = 0x0209; + t.ideographearthcircle = 0x328f; + t.ideographfirecircle = 0x328b; + t.ideographicallianceparen = 0x323f; + t.ideographiccallparen = 0x323a; + t.ideographiccentrecircle = 0x32a5; + t.ideographicclose = 0x3006; + t.ideographiccomma = 0x3001; + t.ideographiccommaleft = 0xff64; + t.ideographiccongratulationparen = 0x3237; + t.ideographiccorrectcircle = 0x32a3; + t.ideographicearthparen = 0x322f; + t.ideographicenterpriseparen = 0x323d; + t.ideographicexcellentcircle = 0x329d; + t.ideographicfestivalparen = 0x3240; + t.ideographicfinancialcircle = 0x3296; + t.ideographicfinancialparen = 0x3236; + t.ideographicfireparen = 0x322b; + t.ideographichaveparen = 0x3232; + t.ideographichighcircle = 0x32a4; + t.ideographiciterationmark = 0x3005; + t.ideographiclaborcircle = 0x3298; + t.ideographiclaborparen = 0x3238; + t.ideographicleftcircle = 0x32a7; + t.ideographiclowcircle = 0x32a6; + t.ideographicmedicinecircle = 0x32a9; + t.ideographicmetalparen = 0x322e; + t.ideographicmoonparen = 0x322a; + t.ideographicnameparen = 0x3234; + t.ideographicperiod = 0x3002; + t.ideographicprintcircle = 0x329e; + t.ideographicreachparen = 0x3243; + t.ideographicrepresentparen = 0x3239; + t.ideographicresourceparen = 0x323e; + t.ideographicrightcircle = 0x32a8; + t.ideographicsecretcircle = 0x3299; + t.ideographicselfparen = 0x3242; + t.ideographicsocietyparen = 0x3233; + t.ideographicspace = 0x3000; + t.ideographicspecialparen = 0x3235; + t.ideographicstockparen = 0x3231; + t.ideographicstudyparen = 0x323b; + t.ideographicsunparen = 0x3230; + t.ideographicsuperviseparen = 0x323c; + t.ideographicwaterparen = 0x322c; + t.ideographicwoodparen = 0x322d; + t.ideographiczero = 0x3007; + t.ideographmetalcircle = 0x328e; + t.ideographmooncircle = 0x328a; + t.ideographnamecircle = 0x3294; + t.ideographsuncircle = 0x3290; + t.ideographwatercircle = 0x328c; + t.ideographwoodcircle = 0x328d; + t.ideva = 0x0907; + t.idieresis = 0x00ef; + t.idieresisacute = 0x1e2f; + t.idieresiscyrillic = 0x04e5; + t.idotbelow = 0x1ecb; + t.iebrevecyrillic = 0x04d7; + t.iecyrillic = 0x0435; + t.ieungacirclekorean = 0x3275; + t.ieungaparenkorean = 0x3215; + t.ieungcirclekorean = 0x3267; + t.ieungkorean = 0x3147; + t.ieungparenkorean = 0x3207; + t.igrave = 0x00ec; + t.igujarati = 0x0a87; + t.igurmukhi = 0x0a07; + t.ihiragana = 0x3044; + t.ihookabove = 0x1ec9; + t.iibengali = 0x0988; + t.iicyrillic = 0x0438; + t.iideva = 0x0908; + t.iigujarati = 0x0a88; + t.iigurmukhi = 0x0a08; + t.iimatragurmukhi = 0x0a40; + t.iinvertedbreve = 0x020b; + t.iishortcyrillic = 0x0439; + t.iivowelsignbengali = 0x09c0; + t.iivowelsigndeva = 0x0940; + t.iivowelsigngujarati = 0x0ac0; + t.ij = 0x0133; + t.ikatakana = 0x30a4; + t.ikatakanahalfwidth = 0xff72; + t.ikorean = 0x3163; + t.ilde = 0x02dc; + t.iluyhebrew = 0x05ac; + t.imacron = 0x012b; + t.imacroncyrillic = 0x04e3; + t.imageorapproximatelyequal = 0x2253; + t.imatragurmukhi = 0x0a3f; + t.imonospace = 0xff49; + t.increment = 0x2206; + t.infinity = 0x221e; + t.iniarmenian = 0x056b; + t.integral = 0x222b; + t.integralbottom = 0x2321; + t.integralbt = 0x2321; + t.integralex = 0xf8f5; + t.integraltop = 0x2320; + t.integraltp = 0x2320; + t.intersection = 0x2229; + t.intisquare = 0x3305; + t.invbullet = 0x25d8; + t.invcircle = 0x25d9; + t.invsmileface = 0x263b; + t.iocyrillic = 0x0451; + t.iogonek = 0x012f; + t.iota = 0x03b9; + t.iotadieresis = 0x03ca; + t.iotadieresistonos = 0x0390; + t.iotalatin = 0x0269; + t.iotatonos = 0x03af; + t.iparen = 0x24a4; + t.irigurmukhi = 0x0a72; + t.ismallhiragana = 0x3043; + t.ismallkatakana = 0x30a3; + t.ismallkatakanahalfwidth = 0xff68; + t.issharbengali = 0x09fa; + t.istroke = 0x0268; + t.isuperior = 0xf6ed; + t.iterationhiragana = 0x309d; + t.iterationkatakana = 0x30fd; + t.itilde = 0x0129; + t.itildebelow = 0x1e2d; + t.iubopomofo = 0x3129; + t.iucyrillic = 0x044e; + t.ivowelsignbengali = 0x09bf; + t.ivowelsigndeva = 0x093f; + t.ivowelsigngujarati = 0x0abf; + t.izhitsacyrillic = 0x0475; + t.izhitsadblgravecyrillic = 0x0477; + t.j = 0x006a; + t.jaarmenian = 0x0571; + t.jabengali = 0x099c; + t.jadeva = 0x091c; + t.jagujarati = 0x0a9c; + t.jagurmukhi = 0x0a1c; + t.jbopomofo = 0x3110; + t.jcaron = 0x01f0; + t.jcircle = 0x24d9; + t.jcircumflex = 0x0135; + t.jcrossedtail = 0x029d; + t.jdotlessstroke = 0x025f; + t.jecyrillic = 0x0458; + t.jeemarabic = 0x062c; + t.jeemfinalarabic = 0xfe9e; + t.jeeminitialarabic = 0xfe9f; + t.jeemmedialarabic = 0xfea0; + t.jeharabic = 0x0698; + t.jehfinalarabic = 0xfb8b; + t.jhabengali = 0x099d; + t.jhadeva = 0x091d; + t.jhagujarati = 0x0a9d; + t.jhagurmukhi = 0x0a1d; + t.jheharmenian = 0x057b; + t.jis = 0x3004; + t.jmonospace = 0xff4a; + t.jparen = 0x24a5; + t.jsuperior = 0x02b2; + t.k = 0x006b; + t.kabashkircyrillic = 0x04a1; + t.kabengali = 0x0995; + t.kacute = 0x1e31; + t.kacyrillic = 0x043a; + t.kadescendercyrillic = 0x049b; + t.kadeva = 0x0915; + t.kaf = 0x05db; + t.kafarabic = 0x0643; + t.kafdagesh = 0xfb3b; + t.kafdageshhebrew = 0xfb3b; + t.kaffinalarabic = 0xfeda; + t.kafhebrew = 0x05db; + t.kafinitialarabic = 0xfedb; + t.kafmedialarabic = 0xfedc; + t.kafrafehebrew = 0xfb4d; + t.kagujarati = 0x0a95; + t.kagurmukhi = 0x0a15; + t.kahiragana = 0x304b; + t.kahookcyrillic = 0x04c4; + t.kakatakana = 0x30ab; + t.kakatakanahalfwidth = 0xff76; + t.kappa = 0x03ba; + t.kappasymbolgreek = 0x03f0; + t.kapyeounmieumkorean = 0x3171; + t.kapyeounphieuphkorean = 0x3184; + t.kapyeounpieupkorean = 0x3178; + t.kapyeounssangpieupkorean = 0x3179; + t.karoriisquare = 0x330d; + t.kashidaautoarabic = 0x0640; + t.kashidaautonosidebearingarabic = 0x0640; + t.kasmallkatakana = 0x30f5; + t.kasquare = 0x3384; + t.kasraarabic = 0x0650; + t.kasratanarabic = 0x064d; + t.kastrokecyrillic = 0x049f; + t.katahiraprolongmarkhalfwidth = 0xff70; + t.kaverticalstrokecyrillic = 0x049d; + t.kbopomofo = 0x310e; + t.kcalsquare = 0x3389; + t.kcaron = 0x01e9; + t.kcedilla = 0x0137; + t.kcircle = 0x24da; + t.kcommaaccent = 0x0137; + t.kdotbelow = 0x1e33; + t.keharmenian = 0x0584; + t.kehiragana = 0x3051; + t.kekatakana = 0x30b1; + t.kekatakanahalfwidth = 0xff79; + t.kenarmenian = 0x056f; + t.kesmallkatakana = 0x30f6; + t.kgreenlandic = 0x0138; + t.khabengali = 0x0996; + t.khacyrillic = 0x0445; + t.khadeva = 0x0916; + t.khagujarati = 0x0a96; + t.khagurmukhi = 0x0a16; + t.khaharabic = 0x062e; + t.khahfinalarabic = 0xfea6; + t.khahinitialarabic = 0xfea7; + t.khahmedialarabic = 0xfea8; + t.kheicoptic = 0x03e7; + t.khhadeva = 0x0959; + t.khhagurmukhi = 0x0a59; + t.khieukhacirclekorean = 0x3278; + t.khieukhaparenkorean = 0x3218; + t.khieukhcirclekorean = 0x326a; + t.khieukhkorean = 0x314b; + t.khieukhparenkorean = 0x320a; + t.khokhaithai = 0x0e02; + t.khokhonthai = 0x0e05; + t.khokhuatthai = 0x0e03; + t.khokhwaithai = 0x0e04; + t.khomutthai = 0x0e5b; + t.khook = 0x0199; + t.khorakhangthai = 0x0e06; + t.khzsquare = 0x3391; + t.kihiragana = 0x304d; + t.kikatakana = 0x30ad; + t.kikatakanahalfwidth = 0xff77; + t.kiroguramusquare = 0x3315; + t.kiromeetorusquare = 0x3316; + t.kirosquare = 0x3314; + t.kiyeokacirclekorean = 0x326e; + t.kiyeokaparenkorean = 0x320e; + t.kiyeokcirclekorean = 0x3260; + t.kiyeokkorean = 0x3131; + t.kiyeokparenkorean = 0x3200; + t.kiyeoksioskorean = 0x3133; + t.kjecyrillic = 0x045c; + t.klinebelow = 0x1e35; + t.klsquare = 0x3398; + t.kmcubedsquare = 0x33a6; + t.kmonospace = 0xff4b; + t.kmsquaredsquare = 0x33a2; + t.kohiragana = 0x3053; + t.kohmsquare = 0x33c0; + t.kokaithai = 0x0e01; + t.kokatakana = 0x30b3; + t.kokatakanahalfwidth = 0xff7a; + t.kooposquare = 0x331e; + t.koppacyrillic = 0x0481; + t.koreanstandardsymbol = 0x327f; + t.koroniscmb = 0x0343; + t.kparen = 0x24a6; + t.kpasquare = 0x33aa; + t.ksicyrillic = 0x046f; + t.ktsquare = 0x33cf; + t.kturned = 0x029e; + t.kuhiragana = 0x304f; + t.kukatakana = 0x30af; + t.kukatakanahalfwidth = 0xff78; + t.kvsquare = 0x33b8; + t.kwsquare = 0x33be; + t.l = 0x006c; + t.labengali = 0x09b2; + t.lacute = 0x013a; + t.ladeva = 0x0932; + t.lagujarati = 0x0ab2; + t.lagurmukhi = 0x0a32; + t.lakkhangyaothai = 0x0e45; + t.lamaleffinalarabic = 0xfefc; + t.lamalefhamzaabovefinalarabic = 0xfef8; + t.lamalefhamzaaboveisolatedarabic = 0xfef7; + t.lamalefhamzabelowfinalarabic = 0xfefa; + t.lamalefhamzabelowisolatedarabic = 0xfef9; + t.lamalefisolatedarabic = 0xfefb; + t.lamalefmaddaabovefinalarabic = 0xfef6; + t.lamalefmaddaaboveisolatedarabic = 0xfef5; + t.lamarabic = 0x0644; + t.lambda = 0x03bb; + t.lambdastroke = 0x019b; + t.lamed = 0x05dc; + t.lameddagesh = 0xfb3c; + t.lameddageshhebrew = 0xfb3c; + t.lamedhebrew = 0x05dc; + t.lamfinalarabic = 0xfede; + t.lamhahinitialarabic = 0xfcca; + t.laminitialarabic = 0xfedf; + t.lamjeeminitialarabic = 0xfcc9; + t.lamkhahinitialarabic = 0xfccb; + t.lamlamhehisolatedarabic = 0xfdf2; + t.lammedialarabic = 0xfee0; + t.lammeemhahinitialarabic = 0xfd88; + t.lammeeminitialarabic = 0xfccc; + t.largecircle = 0x25ef; + t.lbar = 0x019a; + t.lbelt = 0x026c; + t.lbopomofo = 0x310c; + t.lcaron = 0x013e; + t.lcedilla = 0x013c; + t.lcircle = 0x24db; + t.lcircumflexbelow = 0x1e3d; + t.lcommaaccent = 0x013c; + t.ldot = 0x0140; + t.ldotaccent = 0x0140; + t.ldotbelow = 0x1e37; + t.ldotbelowmacron = 0x1e39; + t.leftangleabovecmb = 0x031a; + t.lefttackbelowcmb = 0x0318; + t.less = 0x003c; + t.lessequal = 0x2264; + t.lessequalorgreater = 0x22da; + t.lessmonospace = 0xff1c; + t.lessorequivalent = 0x2272; + t.lessorgreater = 0x2276; + t.lessoverequal = 0x2266; + t.lesssmall = 0xfe64; + t.lezh = 0x026e; + t.lfblock = 0x258c; + t.lhookretroflex = 0x026d; + t.lira = 0x20a4; + t.liwnarmenian = 0x056c; + t.lj = 0x01c9; + t.ljecyrillic = 0x0459; + t.ll = 0xf6c0; + t.lladeva = 0x0933; + t.llagujarati = 0x0ab3; + t.llinebelow = 0x1e3b; + t.llladeva = 0x0934; + t.llvocalicbengali = 0x09e1; + t.llvocalicdeva = 0x0961; + t.llvocalicvowelsignbengali = 0x09e3; + t.llvocalicvowelsigndeva = 0x0963; + t.lmiddletilde = 0x026b; + t.lmonospace = 0xff4c; + t.lmsquare = 0x33d0; + t.lochulathai = 0x0e2c; + t.logicaland = 0x2227; + t.logicalnot = 0x00ac; + t.logicalnotreversed = 0x2310; + t.logicalor = 0x2228; + t.lolingthai = 0x0e25; + t.longs = 0x017f; + t.lowlinecenterline = 0xfe4e; + t.lowlinecmb = 0x0332; + t.lowlinedashed = 0xfe4d; + t.lozenge = 0x25ca; + t.lparen = 0x24a7; + t.lslash = 0x0142; + t.lsquare = 0x2113; + t.lsuperior = 0xf6ee; + t.ltshade = 0x2591; + t.luthai = 0x0e26; + t.lvocalicbengali = 0x098c; + t.lvocalicdeva = 0x090c; + t.lvocalicvowelsignbengali = 0x09e2; + t.lvocalicvowelsigndeva = 0x0962; + t.lxsquare = 0x33d3; + t.m = 0x006d; + t.mabengali = 0x09ae; + t.macron = 0x00af; + t.macronbelowcmb = 0x0331; + t.macroncmb = 0x0304; + t.macronlowmod = 0x02cd; + t.macronmonospace = 0xffe3; + t.macute = 0x1e3f; + t.madeva = 0x092e; + t.magujarati = 0x0aae; + t.magurmukhi = 0x0a2e; + t.mahapakhhebrew = 0x05a4; + t.mahapakhlefthebrew = 0x05a4; + t.mahiragana = 0x307e; + t.maichattawalowleftthai = 0xf895; + t.maichattawalowrightthai = 0xf894; + t.maichattawathai = 0x0e4b; + t.maichattawaupperleftthai = 0xf893; + t.maieklowleftthai = 0xf88c; + t.maieklowrightthai = 0xf88b; + t.maiekthai = 0x0e48; + t.maiekupperleftthai = 0xf88a; + t.maihanakatleftthai = 0xf884; + t.maihanakatthai = 0x0e31; + t.maitaikhuleftthai = 0xf889; + t.maitaikhuthai = 0x0e47; + t.maitholowleftthai = 0xf88f; + t.maitholowrightthai = 0xf88e; + t.maithothai = 0x0e49; + t.maithoupperleftthai = 0xf88d; + t.maitrilowleftthai = 0xf892; + t.maitrilowrightthai = 0xf891; + t.maitrithai = 0x0e4a; + t.maitriupperleftthai = 0xf890; + t.maiyamokthai = 0x0e46; + t.makatakana = 0x30de; + t.makatakanahalfwidth = 0xff8f; + t.male = 0x2642; + t.mansyonsquare = 0x3347; + t.maqafhebrew = 0x05be; + t.mars = 0x2642; + t.masoracirclehebrew = 0x05af; + t.masquare = 0x3383; + t.mbopomofo = 0x3107; + t.mbsquare = 0x33d4; + t.mcircle = 0x24dc; + t.mcubedsquare = 0x33a5; + t.mdotaccent = 0x1e41; + t.mdotbelow = 0x1e43; + t.meemarabic = 0x0645; + t.meemfinalarabic = 0xfee2; + t.meeminitialarabic = 0xfee3; + t.meemmedialarabic = 0xfee4; + t.meemmeeminitialarabic = 0xfcd1; + t.meemmeemisolatedarabic = 0xfc48; + t.meetorusquare = 0x334d; + t.mehiragana = 0x3081; + t.meizierasquare = 0x337e; + t.mekatakana = 0x30e1; + t.mekatakanahalfwidth = 0xff92; + t.mem = 0x05de; + t.memdagesh = 0xfb3e; + t.memdageshhebrew = 0xfb3e; + t.memhebrew = 0x05de; + t.menarmenian = 0x0574; + t.merkhahebrew = 0x05a5; + t.merkhakefulahebrew = 0x05a6; + t.merkhakefulalefthebrew = 0x05a6; + t.merkhalefthebrew = 0x05a5; + t.mhook = 0x0271; + t.mhzsquare = 0x3392; + t.middledotkatakanahalfwidth = 0xff65; + t.middot = 0x00b7; + t.mieumacirclekorean = 0x3272; + t.mieumaparenkorean = 0x3212; + t.mieumcirclekorean = 0x3264; + t.mieumkorean = 0x3141; + t.mieumpansioskorean = 0x3170; + t.mieumparenkorean = 0x3204; + t.mieumpieupkorean = 0x316e; + t.mieumsioskorean = 0x316f; + t.mihiragana = 0x307f; + t.mikatakana = 0x30df; + t.mikatakanahalfwidth = 0xff90; + t.minus = 0x2212; + t.minusbelowcmb = 0x0320; + t.minuscircle = 0x2296; + t.minusmod = 0x02d7; + t.minusplus = 0x2213; + t.minute = 0x2032; + t.miribaarusquare = 0x334a; + t.mirisquare = 0x3349; + t.mlonglegturned = 0x0270; + t.mlsquare = 0x3396; + t.mmcubedsquare = 0x33a3; + t.mmonospace = 0xff4d; + t.mmsquaredsquare = 0x339f; + t.mohiragana = 0x3082; + t.mohmsquare = 0x33c1; + t.mokatakana = 0x30e2; + t.mokatakanahalfwidth = 0xff93; + t.molsquare = 0x33d6; + t.momathai = 0x0e21; + t.moverssquare = 0x33a7; + t.moverssquaredsquare = 0x33a8; + t.mparen = 0x24a8; + t.mpasquare = 0x33ab; + t.mssquare = 0x33b3; + t.msuperior = 0xf6ef; + t.mturned = 0x026f; + t.mu = 0x00b5; + t.mu1 = 0x00b5; + t.muasquare = 0x3382; + t.muchgreater = 0x226b; + t.muchless = 0x226a; + t.mufsquare = 0x338c; + t.mugreek = 0x03bc; + t.mugsquare = 0x338d; + t.muhiragana = 0x3080; + t.mukatakana = 0x30e0; + t.mukatakanahalfwidth = 0xff91; + t.mulsquare = 0x3395; + t.multiply = 0x00d7; + t.mumsquare = 0x339b; + t.munahhebrew = 0x05a3; + t.munahlefthebrew = 0x05a3; + t.musicalnote = 0x266a; + t.musicalnotedbl = 0x266b; + t.musicflatsign = 0x266d; + t.musicsharpsign = 0x266f; + t.mussquare = 0x33b2; + t.muvsquare = 0x33b6; + t.muwsquare = 0x33bc; + t.mvmegasquare = 0x33b9; + t.mvsquare = 0x33b7; + t.mwmegasquare = 0x33bf; + t.mwsquare = 0x33bd; + t.n = 0x006e; + t.nabengali = 0x09a8; + t.nabla = 0x2207; + t.nacute = 0x0144; + t.nadeva = 0x0928; + t.nagujarati = 0x0aa8; + t.nagurmukhi = 0x0a28; + t.nahiragana = 0x306a; + t.nakatakana = 0x30ca; + t.nakatakanahalfwidth = 0xff85; + t.napostrophe = 0x0149; + t.nasquare = 0x3381; + t.nbopomofo = 0x310b; + t.nbspace = 0x00a0; + t.ncaron = 0x0148; + t.ncedilla = 0x0146; + t.ncircle = 0x24dd; + t.ncircumflexbelow = 0x1e4b; + t.ncommaaccent = 0x0146; + t.ndotaccent = 0x1e45; + t.ndotbelow = 0x1e47; + t.nehiragana = 0x306d; + t.nekatakana = 0x30cd; + t.nekatakanahalfwidth = 0xff88; + t.newsheqelsign = 0x20aa; + t.nfsquare = 0x338b; + t.ngabengali = 0x0999; + t.ngadeva = 0x0919; + t.ngagujarati = 0x0a99; + t.ngagurmukhi = 0x0a19; + t.ngonguthai = 0x0e07; + t.nhiragana = 0x3093; + t.nhookleft = 0x0272; + t.nhookretroflex = 0x0273; + t.nieunacirclekorean = 0x326f; + t.nieunaparenkorean = 0x320f; + t.nieuncieuckorean = 0x3135; + t.nieuncirclekorean = 0x3261; + t.nieunhieuhkorean = 0x3136; + t.nieunkorean = 0x3134; + t.nieunpansioskorean = 0x3168; + t.nieunparenkorean = 0x3201; + t.nieunsioskorean = 0x3167; + t.nieuntikeutkorean = 0x3166; + t.nihiragana = 0x306b; + t.nikatakana = 0x30cb; + t.nikatakanahalfwidth = 0xff86; + t.nikhahitleftthai = 0xf899; + t.nikhahitthai = 0x0e4d; + t.nine = 0x0039; + t.ninearabic = 0x0669; + t.ninebengali = 0x09ef; + t.ninecircle = 0x2468; + t.ninecircleinversesansserif = 0x2792; + t.ninedeva = 0x096f; + t.ninegujarati = 0x0aef; + t.ninegurmukhi = 0x0a6f; + t.ninehackarabic = 0x0669; + t.ninehangzhou = 0x3029; + t.nineideographicparen = 0x3228; + t.nineinferior = 0x2089; + t.ninemonospace = 0xff19; + t.nineoldstyle = 0xf739; + t.nineparen = 0x247c; + t.nineperiod = 0x2490; + t.ninepersian = 0x06f9; + t.nineroman = 0x2178; + t.ninesuperior = 0x2079; + t.nineteencircle = 0x2472; + t.nineteenparen = 0x2486; + t.nineteenperiod = 0x249a; + t.ninethai = 0x0e59; + t.nj = 0x01cc; + t.njecyrillic = 0x045a; + t.nkatakana = 0x30f3; + t.nkatakanahalfwidth = 0xff9d; + t.nlegrightlong = 0x019e; + t.nlinebelow = 0x1e49; + t.nmonospace = 0xff4e; + t.nmsquare = 0x339a; + t.nnabengali = 0x09a3; + t.nnadeva = 0x0923; + t.nnagujarati = 0x0aa3; + t.nnagurmukhi = 0x0a23; + t.nnnadeva = 0x0929; + t.nohiragana = 0x306e; + t.nokatakana = 0x30ce; + t.nokatakanahalfwidth = 0xff89; + t.nonbreakingspace = 0x00a0; + t.nonenthai = 0x0e13; + t.nonuthai = 0x0e19; + t.noonarabic = 0x0646; + t.noonfinalarabic = 0xfee6; + t.noonghunnaarabic = 0x06ba; + t.noonghunnafinalarabic = 0xfb9f; + t.nooninitialarabic = 0xfee7; + t.noonjeeminitialarabic = 0xfcd2; + t.noonjeemisolatedarabic = 0xfc4b; + t.noonmedialarabic = 0xfee8; + t.noonmeeminitialarabic = 0xfcd5; + t.noonmeemisolatedarabic = 0xfc4e; + t.noonnoonfinalarabic = 0xfc8d; + t.notcontains = 0x220c; + t.notelement = 0x2209; + t.notelementof = 0x2209; + t.notequal = 0x2260; + t.notgreater = 0x226f; + t.notgreaternorequal = 0x2271; + t.notgreaternorless = 0x2279; + t.notidentical = 0x2262; + t.notless = 0x226e; + t.notlessnorequal = 0x2270; + t.notparallel = 0x2226; + t.notprecedes = 0x2280; + t.notsubset = 0x2284; + t.notsucceeds = 0x2281; + t.notsuperset = 0x2285; + t.nowarmenian = 0x0576; + t.nparen = 0x24a9; + t.nssquare = 0x33b1; + t.nsuperior = 0x207f; + t.ntilde = 0x00f1; + t.nu = 0x03bd; + t.nuhiragana = 0x306c; + t.nukatakana = 0x30cc; + t.nukatakanahalfwidth = 0xff87; + t.nuktabengali = 0x09bc; + t.nuktadeva = 0x093c; + t.nuktagujarati = 0x0abc; + t.nuktagurmukhi = 0x0a3c; + t.numbersign = 0x0023; + t.numbersignmonospace = 0xff03; + t.numbersignsmall = 0xfe5f; + t.numeralsigngreek = 0x0374; + t.numeralsignlowergreek = 0x0375; + t.numero = 0x2116; + t.nun = 0x05e0; + t.nundagesh = 0xfb40; + t.nundageshhebrew = 0xfb40; + t.nunhebrew = 0x05e0; + t.nvsquare = 0x33b5; + t.nwsquare = 0x33bb; + t.nyabengali = 0x099e; + t.nyadeva = 0x091e; + t.nyagujarati = 0x0a9e; + t.nyagurmukhi = 0x0a1e; + t.o = 0x006f; + t.oacute = 0x00f3; + t.oangthai = 0x0e2d; + t.obarred = 0x0275; + t.obarredcyrillic = 0x04e9; + t.obarreddieresiscyrillic = 0x04eb; + t.obengali = 0x0993; + t.obopomofo = 0x311b; + t.obreve = 0x014f; + t.ocandradeva = 0x0911; + t.ocandragujarati = 0x0a91; + t.ocandravowelsigndeva = 0x0949; + t.ocandravowelsigngujarati = 0x0ac9; + t.ocaron = 0x01d2; + t.ocircle = 0x24de; + t.ocircumflex = 0x00f4; + t.ocircumflexacute = 0x1ed1; + t.ocircumflexdotbelow = 0x1ed9; + t.ocircumflexgrave = 0x1ed3; + t.ocircumflexhookabove = 0x1ed5; + t.ocircumflextilde = 0x1ed7; + t.ocyrillic = 0x043e; + t.odblacute = 0x0151; + t.odblgrave = 0x020d; + t.odeva = 0x0913; + t.odieresis = 0x00f6; + t.odieresiscyrillic = 0x04e7; + t.odotbelow = 0x1ecd; + t.oe = 0x0153; + t.oekorean = 0x315a; + t.ogonek = 0x02db; + t.ogonekcmb = 0x0328; + t.ograve = 0x00f2; + t.ogujarati = 0x0a93; + t.oharmenian = 0x0585; + t.ohiragana = 0x304a; + t.ohookabove = 0x1ecf; + t.ohorn = 0x01a1; + t.ohornacute = 0x1edb; + t.ohorndotbelow = 0x1ee3; + t.ohorngrave = 0x1edd; + t.ohornhookabove = 0x1edf; + t.ohorntilde = 0x1ee1; + t.ohungarumlaut = 0x0151; + t.oi = 0x01a3; + t.oinvertedbreve = 0x020f; + t.okatakana = 0x30aa; + t.okatakanahalfwidth = 0xff75; + t.okorean = 0x3157; + t.olehebrew = 0x05ab; + t.omacron = 0x014d; + t.omacronacute = 0x1e53; + t.omacrongrave = 0x1e51; + t.omdeva = 0x0950; + t.omega = 0x03c9; + t.omega1 = 0x03d6; + t.omegacyrillic = 0x0461; + t.omegalatinclosed = 0x0277; + t.omegaroundcyrillic = 0x047b; + t.omegatitlocyrillic = 0x047d; + t.omegatonos = 0x03ce; + t.omgujarati = 0x0ad0; + t.omicron = 0x03bf; + t.omicrontonos = 0x03cc; + t.omonospace = 0xff4f; + t.one = 0x0031; + t.onearabic = 0x0661; + t.onebengali = 0x09e7; + t.onecircle = 0x2460; + t.onecircleinversesansserif = 0x278a; + t.onedeva = 0x0967; + t.onedotenleader = 0x2024; + t.oneeighth = 0x215b; + t.onefitted = 0xf6dc; + t.onegujarati = 0x0ae7; + t.onegurmukhi = 0x0a67; + t.onehackarabic = 0x0661; + t.onehalf = 0x00bd; + t.onehangzhou = 0x3021; + t.oneideographicparen = 0x3220; + t.oneinferior = 0x2081; + t.onemonospace = 0xff11; + t.onenumeratorbengali = 0x09f4; + t.oneoldstyle = 0xf731; + t.oneparen = 0x2474; + t.oneperiod = 0x2488; + t.onepersian = 0x06f1; + t.onequarter = 0x00bc; + t.oneroman = 0x2170; + t.onesuperior = 0x00b9; + t.onethai = 0x0e51; + t.onethird = 0x2153; + t.oogonek = 0x01eb; + t.oogonekmacron = 0x01ed; + t.oogurmukhi = 0x0a13; + t.oomatragurmukhi = 0x0a4b; + t.oopen = 0x0254; + t.oparen = 0x24aa; + t.openbullet = 0x25e6; + t.option = 0x2325; + t.ordfeminine = 0x00aa; + t.ordmasculine = 0x00ba; + t.orthogonal = 0x221f; + t.oshortdeva = 0x0912; + t.oshortvowelsigndeva = 0x094a; + t.oslash = 0x00f8; + t.oslashacute = 0x01ff; + t.osmallhiragana = 0x3049; + t.osmallkatakana = 0x30a9; + t.osmallkatakanahalfwidth = 0xff6b; + t.ostrokeacute = 0x01ff; + t.osuperior = 0xf6f0; + t.otcyrillic = 0x047f; + t.otilde = 0x00f5; + t.otildeacute = 0x1e4d; + t.otildedieresis = 0x1e4f; + t.oubopomofo = 0x3121; + t.overline = 0x203e; + t.overlinecenterline = 0xfe4a; + t.overlinecmb = 0x0305; + t.overlinedashed = 0xfe49; + t.overlinedblwavy = 0xfe4c; + t.overlinewavy = 0xfe4b; + t.overscore = 0x00af; + t.ovowelsignbengali = 0x09cb; + t.ovowelsigndeva = 0x094b; + t.ovowelsigngujarati = 0x0acb; + t.p = 0x0070; + t.paampssquare = 0x3380; + t.paasentosquare = 0x332b; + t.pabengali = 0x09aa; + t.pacute = 0x1e55; + t.padeva = 0x092a; + t.pagedown = 0x21df; + t.pageup = 0x21de; + t.pagujarati = 0x0aaa; + t.pagurmukhi = 0x0a2a; + t.pahiragana = 0x3071; + t.paiyannoithai = 0x0e2f; + t.pakatakana = 0x30d1; + t.palatalizationcyrilliccmb = 0x0484; + t.palochkacyrillic = 0x04c0; + t.pansioskorean = 0x317f; + t.paragraph = 0x00b6; + t.parallel = 0x2225; + t.parenleft = 0x0028; + t.parenleftaltonearabic = 0xfd3e; + t.parenleftbt = 0xf8ed; + t.parenleftex = 0xf8ec; + t.parenleftinferior = 0x208d; + t.parenleftmonospace = 0xff08; + t.parenleftsmall = 0xfe59; + t.parenleftsuperior = 0x207d; + t.parenlefttp = 0xf8eb; + t.parenleftvertical = 0xfe35; + t.parenright = 0x0029; + t.parenrightaltonearabic = 0xfd3f; + t.parenrightbt = 0xf8f8; + t.parenrightex = 0xf8f7; + t.parenrightinferior = 0x208e; + t.parenrightmonospace = 0xff09; + t.parenrightsmall = 0xfe5a; + t.parenrightsuperior = 0x207e; + t.parenrighttp = 0xf8f6; + t.parenrightvertical = 0xfe36; + t.partialdiff = 0x2202; + t.paseqhebrew = 0x05c0; + t.pashtahebrew = 0x0599; + t.pasquare = 0x33a9; + t.patah = 0x05b7; + t.patah11 = 0x05b7; + t.patah1d = 0x05b7; + t.patah2a = 0x05b7; + t.patahhebrew = 0x05b7; + t.patahnarrowhebrew = 0x05b7; + t.patahquarterhebrew = 0x05b7; + t.patahwidehebrew = 0x05b7; + t.pazerhebrew = 0x05a1; + t.pbopomofo = 0x3106; + t.pcircle = 0x24df; + t.pdotaccent = 0x1e57; + t.pe = 0x05e4; + t.pecyrillic = 0x043f; + t.pedagesh = 0xfb44; + t.pedageshhebrew = 0xfb44; + t.peezisquare = 0x333b; + t.pefinaldageshhebrew = 0xfb43; + t.peharabic = 0x067e; + t.peharmenian = 0x057a; + t.pehebrew = 0x05e4; + t.pehfinalarabic = 0xfb57; + t.pehinitialarabic = 0xfb58; + t.pehiragana = 0x307a; + t.pehmedialarabic = 0xfb59; + t.pekatakana = 0x30da; + t.pemiddlehookcyrillic = 0x04a7; + t.perafehebrew = 0xfb4e; + t.percent = 0x0025; + t.percentarabic = 0x066a; + t.percentmonospace = 0xff05; + t.percentsmall = 0xfe6a; + t.period = 0x002e; + t.periodarmenian = 0x0589; + t.periodcentered = 0x00b7; + t.periodhalfwidth = 0xff61; + t.periodinferior = 0xf6e7; + t.periodmonospace = 0xff0e; + t.periodsmall = 0xfe52; + t.periodsuperior = 0xf6e8; + t.perispomenigreekcmb = 0x0342; + t.perpendicular = 0x22a5; + t.perthousand = 0x2030; + t.peseta = 0x20a7; + t.pfsquare = 0x338a; + t.phabengali = 0x09ab; + t.phadeva = 0x092b; + t.phagujarati = 0x0aab; + t.phagurmukhi = 0x0a2b; + t.phi = 0x03c6; + t.phi1 = 0x03d5; + t.phieuphacirclekorean = 0x327a; + t.phieuphaparenkorean = 0x321a; + t.phieuphcirclekorean = 0x326c; + t.phieuphkorean = 0x314d; + t.phieuphparenkorean = 0x320c; + t.philatin = 0x0278; + t.phinthuthai = 0x0e3a; + t.phisymbolgreek = 0x03d5; + t.phook = 0x01a5; + t.phophanthai = 0x0e1e; + t.phophungthai = 0x0e1c; + t.phosamphaothai = 0x0e20; + t.pi = 0x03c0; + t.pieupacirclekorean = 0x3273; + t.pieupaparenkorean = 0x3213; + t.pieupcieuckorean = 0x3176; + t.pieupcirclekorean = 0x3265; + t.pieupkiyeokkorean = 0x3172; + t.pieupkorean = 0x3142; + t.pieupparenkorean = 0x3205; + t.pieupsioskiyeokkorean = 0x3174; + t.pieupsioskorean = 0x3144; + t.pieupsiostikeutkorean = 0x3175; + t.pieupthieuthkorean = 0x3177; + t.pieuptikeutkorean = 0x3173; + t.pihiragana = 0x3074; + t.pikatakana = 0x30d4; + t.pisymbolgreek = 0x03d6; + t.piwrarmenian = 0x0583; + t.planckover2pi = 0x210f; + t.planckover2pi1 = 0x210f; + t.plus = 0x002b; + t.plusbelowcmb = 0x031f; + t.pluscircle = 0x2295; + t.plusminus = 0x00b1; + t.plusmod = 0x02d6; + t.plusmonospace = 0xff0b; + t.plussmall = 0xfe62; + t.plussuperior = 0x207a; + t.pmonospace = 0xff50; + t.pmsquare = 0x33d8; + t.pohiragana = 0x307d; + t.pointingindexdownwhite = 0x261f; + t.pointingindexleftwhite = 0x261c; + t.pointingindexrightwhite = 0x261e; + t.pointingindexupwhite = 0x261d; + t.pokatakana = 0x30dd; + t.poplathai = 0x0e1b; + t.postalmark = 0x3012; + t.postalmarkface = 0x3020; + t.pparen = 0x24ab; + t.precedes = 0x227a; + t.prescription = 0x211e; + t.primemod = 0x02b9; + t.primereversed = 0x2035; + t.product = 0x220f; + t.projective = 0x2305; + t.prolongedkana = 0x30fc; + t.propellor = 0x2318; + t.propersubset = 0x2282; + t.propersuperset = 0x2283; + t.proportion = 0x2237; + t.proportional = 0x221d; + t.psi = 0x03c8; + t.psicyrillic = 0x0471; + t.psilipneumatacyrilliccmb = 0x0486; + t.pssquare = 0x33b0; + t.puhiragana = 0x3077; + t.pukatakana = 0x30d7; + t.pvsquare = 0x33b4; + t.pwsquare = 0x33ba; + t.q = 0x0071; + t.qadeva = 0x0958; + t.qadmahebrew = 0x05a8; + t.qafarabic = 0x0642; + t.qaffinalarabic = 0xfed6; + t.qafinitialarabic = 0xfed7; + t.qafmedialarabic = 0xfed8; + t.qamats = 0x05b8; + t.qamats10 = 0x05b8; + t.qamats1a = 0x05b8; + t.qamats1c = 0x05b8; + t.qamats27 = 0x05b8; + t.qamats29 = 0x05b8; + t.qamats33 = 0x05b8; + t.qamatsde = 0x05b8; + t.qamatshebrew = 0x05b8; + t.qamatsnarrowhebrew = 0x05b8; + t.qamatsqatanhebrew = 0x05b8; + t.qamatsqatannarrowhebrew = 0x05b8; + t.qamatsqatanquarterhebrew = 0x05b8; + t.qamatsqatanwidehebrew = 0x05b8; + t.qamatsquarterhebrew = 0x05b8; + t.qamatswidehebrew = 0x05b8; + t.qarneyparahebrew = 0x059f; + t.qbopomofo = 0x3111; + t.qcircle = 0x24e0; + t.qhook = 0x02a0; + t.qmonospace = 0xff51; + t.qof = 0x05e7; + t.qofdagesh = 0xfb47; + t.qofdageshhebrew = 0xfb47; + t.qofhebrew = 0x05e7; + t.qparen = 0x24ac; + t.quarternote = 0x2669; + t.qubuts = 0x05bb; + t.qubuts18 = 0x05bb; + t.qubuts25 = 0x05bb; + t.qubuts31 = 0x05bb; + t.qubutshebrew = 0x05bb; + t.qubutsnarrowhebrew = 0x05bb; + t.qubutsquarterhebrew = 0x05bb; + t.qubutswidehebrew = 0x05bb; + t.question = 0x003f; + t.questionarabic = 0x061f; + t.questionarmenian = 0x055e; + t.questiondown = 0x00bf; + t.questiondownsmall = 0xf7bf; + t.questiongreek = 0x037e; + t.questionmonospace = 0xff1f; + t.questionsmall = 0xf73f; + t.quotedbl = 0x0022; + t.quotedblbase = 0x201e; + t.quotedblleft = 0x201c; + t.quotedblmonospace = 0xff02; + t.quotedblprime = 0x301e; + t.quotedblprimereversed = 0x301d; + t.quotedblright = 0x201d; + t.quoteleft = 0x2018; + t.quoteleftreversed = 0x201b; + t.quotereversed = 0x201b; + t.quoteright = 0x2019; + t.quoterightn = 0x0149; + t.quotesinglbase = 0x201a; + t.quotesingle = 0x0027; + t.quotesinglemonospace = 0xff07; + t.r = 0x0072; + t.raarmenian = 0x057c; + t.rabengali = 0x09b0; + t.racute = 0x0155; + t.radeva = 0x0930; + t.radical = 0x221a; + t.radicalex = 0xf8e5; + t.radoverssquare = 0x33ae; + t.radoverssquaredsquare = 0x33af; + t.radsquare = 0x33ad; + t.rafe = 0x05bf; + t.rafehebrew = 0x05bf; + t.ragujarati = 0x0ab0; + t.ragurmukhi = 0x0a30; + t.rahiragana = 0x3089; + t.rakatakana = 0x30e9; + t.rakatakanahalfwidth = 0xff97; + t.ralowerdiagonalbengali = 0x09f1; + t.ramiddlediagonalbengali = 0x09f0; + t.ramshorn = 0x0264; + t.ratio = 0x2236; + t.rbopomofo = 0x3116; + t.rcaron = 0x0159; + t.rcedilla = 0x0157; + t.rcircle = 0x24e1; + t.rcommaaccent = 0x0157; + t.rdblgrave = 0x0211; + t.rdotaccent = 0x1e59; + t.rdotbelow = 0x1e5b; + t.rdotbelowmacron = 0x1e5d; + t.referencemark = 0x203b; + t.reflexsubset = 0x2286; + t.reflexsuperset = 0x2287; + t.registered = 0x00ae; + t.registersans = 0xf8e8; + t.registerserif = 0xf6da; + t.reharabic = 0x0631; + t.reharmenian = 0x0580; + t.rehfinalarabic = 0xfeae; + t.rehiragana = 0x308c; + t.rekatakana = 0x30ec; + t.rekatakanahalfwidth = 0xff9a; + t.resh = 0x05e8; + t.reshdageshhebrew = 0xfb48; + t.reshhebrew = 0x05e8; + t.reversedtilde = 0x223d; + t.reviahebrew = 0x0597; + t.reviamugrashhebrew = 0x0597; + t.revlogicalnot = 0x2310; + t.rfishhook = 0x027e; + t.rfishhookreversed = 0x027f; + t.rhabengali = 0x09dd; + t.rhadeva = 0x095d; + t.rho = 0x03c1; + t.rhook = 0x027d; + t.rhookturned = 0x027b; + t.rhookturnedsuperior = 0x02b5; + t.rhosymbolgreek = 0x03f1; + t.rhotichookmod = 0x02de; + t.rieulacirclekorean = 0x3271; + t.rieulaparenkorean = 0x3211; + t.rieulcirclekorean = 0x3263; + t.rieulhieuhkorean = 0x3140; + t.rieulkiyeokkorean = 0x313a; + t.rieulkiyeoksioskorean = 0x3169; + t.rieulkorean = 0x3139; + t.rieulmieumkorean = 0x313b; + t.rieulpansioskorean = 0x316c; + t.rieulparenkorean = 0x3203; + t.rieulphieuphkorean = 0x313f; + t.rieulpieupkorean = 0x313c; + t.rieulpieupsioskorean = 0x316b; + t.rieulsioskorean = 0x313d; + t.rieulthieuthkorean = 0x313e; + t.rieultikeutkorean = 0x316a; + t.rieulyeorinhieuhkorean = 0x316d; + t.rightangle = 0x221f; + t.righttackbelowcmb = 0x0319; + t.righttriangle = 0x22bf; + t.rihiragana = 0x308a; + t.rikatakana = 0x30ea; + t.rikatakanahalfwidth = 0xff98; + t.ring = 0x02da; + t.ringbelowcmb = 0x0325; + t.ringcmb = 0x030a; + t.ringhalfleft = 0x02bf; + t.ringhalfleftarmenian = 0x0559; + t.ringhalfleftbelowcmb = 0x031c; + t.ringhalfleftcentered = 0x02d3; + t.ringhalfright = 0x02be; + t.ringhalfrightbelowcmb = 0x0339; + t.ringhalfrightcentered = 0x02d2; + t.rinvertedbreve = 0x0213; + t.rittorusquare = 0x3351; + t.rlinebelow = 0x1e5f; + t.rlongleg = 0x027c; + t.rlonglegturned = 0x027a; + t.rmonospace = 0xff52; + t.rohiragana = 0x308d; + t.rokatakana = 0x30ed; + t.rokatakanahalfwidth = 0xff9b; + t.roruathai = 0x0e23; + t.rparen = 0x24ad; + t.rrabengali = 0x09dc; + t.rradeva = 0x0931; + t.rragurmukhi = 0x0a5c; + t.rreharabic = 0x0691; + t.rrehfinalarabic = 0xfb8d; + t.rrvocalicbengali = 0x09e0; + t.rrvocalicdeva = 0x0960; + t.rrvocalicgujarati = 0x0ae0; + t.rrvocalicvowelsignbengali = 0x09c4; + t.rrvocalicvowelsigndeva = 0x0944; + t.rrvocalicvowelsigngujarati = 0x0ac4; + t.rsuperior = 0xf6f1; + t.rtblock = 0x2590; + t.rturned = 0x0279; + t.rturnedsuperior = 0x02b4; + t.ruhiragana = 0x308b; + t.rukatakana = 0x30eb; + t.rukatakanahalfwidth = 0xff99; + t.rupeemarkbengali = 0x09f2; + t.rupeesignbengali = 0x09f3; + t.rupiah = 0xf6dd; + t.ruthai = 0x0e24; + t.rvocalicbengali = 0x098b; + t.rvocalicdeva = 0x090b; + t.rvocalicgujarati = 0x0a8b; + t.rvocalicvowelsignbengali = 0x09c3; + t.rvocalicvowelsigndeva = 0x0943; + t.rvocalicvowelsigngujarati = 0x0ac3; + t.s = 0x0073; + t.sabengali = 0x09b8; + t.sacute = 0x015b; + t.sacutedotaccent = 0x1e65; + t.sadarabic = 0x0635; + t.sadeva = 0x0938; + t.sadfinalarabic = 0xfeba; + t.sadinitialarabic = 0xfebb; + t.sadmedialarabic = 0xfebc; + t.sagujarati = 0x0ab8; + t.sagurmukhi = 0x0a38; + t.sahiragana = 0x3055; + t.sakatakana = 0x30b5; + t.sakatakanahalfwidth = 0xff7b; + t.sallallahoualayhewasallamarabic = 0xfdfa; + t.samekh = 0x05e1; + t.samekhdagesh = 0xfb41; + t.samekhdageshhebrew = 0xfb41; + t.samekhhebrew = 0x05e1; + t.saraaathai = 0x0e32; + t.saraaethai = 0x0e41; + t.saraaimaimalaithai = 0x0e44; + t.saraaimaimuanthai = 0x0e43; + t.saraamthai = 0x0e33; + t.saraathai = 0x0e30; + t.saraethai = 0x0e40; + t.saraiileftthai = 0xf886; + t.saraiithai = 0x0e35; + t.saraileftthai = 0xf885; + t.saraithai = 0x0e34; + t.saraothai = 0x0e42; + t.saraueeleftthai = 0xf888; + t.saraueethai = 0x0e37; + t.saraueleftthai = 0xf887; + t.sarauethai = 0x0e36; + t.sarauthai = 0x0e38; + t.sarauuthai = 0x0e39; + t.sbopomofo = 0x3119; + t.scaron = 0x0161; + t.scarondotaccent = 0x1e67; + t.scedilla = 0x015f; + t.schwa = 0x0259; + t.schwacyrillic = 0x04d9; + t.schwadieresiscyrillic = 0x04db; + t.schwahook = 0x025a; + t.scircle = 0x24e2; + t.scircumflex = 0x015d; + t.scommaaccent = 0x0219; + t.sdotaccent = 0x1e61; + t.sdotbelow = 0x1e63; + t.sdotbelowdotaccent = 0x1e69; + t.seagullbelowcmb = 0x033c; + t.second = 0x2033; + t.secondtonechinese = 0x02ca; + t.section = 0x00a7; + t.seenarabic = 0x0633; + t.seenfinalarabic = 0xfeb2; + t.seeninitialarabic = 0xfeb3; + t.seenmedialarabic = 0xfeb4; + t.segol = 0x05b6; + t.segol13 = 0x05b6; + t.segol1f = 0x05b6; + t.segol2c = 0x05b6; + t.segolhebrew = 0x05b6; + t.segolnarrowhebrew = 0x05b6; + t.segolquarterhebrew = 0x05b6; + t.segoltahebrew = 0x0592; + t.segolwidehebrew = 0x05b6; + t.seharmenian = 0x057d; + t.sehiragana = 0x305b; + t.sekatakana = 0x30bb; + t.sekatakanahalfwidth = 0xff7e; + t.semicolon = 0x003b; + t.semicolonarabic = 0x061b; + t.semicolonmonospace = 0xff1b; + t.semicolonsmall = 0xfe54; + t.semivoicedmarkkana = 0x309c; + t.semivoicedmarkkanahalfwidth = 0xff9f; + t.sentisquare = 0x3322; + t.sentosquare = 0x3323; + t.seven = 0x0037; + t.sevenarabic = 0x0667; + t.sevenbengali = 0x09ed; + t.sevencircle = 0x2466; + t.sevencircleinversesansserif = 0x2790; + t.sevendeva = 0x096d; + t.seveneighths = 0x215e; + t.sevengujarati = 0x0aed; + t.sevengurmukhi = 0x0a6d; + t.sevenhackarabic = 0x0667; + t.sevenhangzhou = 0x3027; + t.sevenideographicparen = 0x3226; + t.seveninferior = 0x2087; + t.sevenmonospace = 0xff17; + t.sevenoldstyle = 0xf737; + t.sevenparen = 0x247a; + t.sevenperiod = 0x248e; + t.sevenpersian = 0x06f7; + t.sevenroman = 0x2176; + t.sevensuperior = 0x2077; + t.seventeencircle = 0x2470; + t.seventeenparen = 0x2484; + t.seventeenperiod = 0x2498; + t.seventhai = 0x0e57; + t.sfthyphen = 0x00ad; + t.shaarmenian = 0x0577; + t.shabengali = 0x09b6; + t.shacyrillic = 0x0448; + t.shaddaarabic = 0x0651; + t.shaddadammaarabic = 0xfc61; + t.shaddadammatanarabic = 0xfc5e; + t.shaddafathaarabic = 0xfc60; + t.shaddakasraarabic = 0xfc62; + t.shaddakasratanarabic = 0xfc5f; + t.shade = 0x2592; + t.shadedark = 0x2593; + t.shadelight = 0x2591; + t.shademedium = 0x2592; + t.shadeva = 0x0936; + t.shagujarati = 0x0ab6; + t.shagurmukhi = 0x0a36; + t.shalshelethebrew = 0x0593; + t.shbopomofo = 0x3115; + t.shchacyrillic = 0x0449; + t.sheenarabic = 0x0634; + t.sheenfinalarabic = 0xfeb6; + t.sheeninitialarabic = 0xfeb7; + t.sheenmedialarabic = 0xfeb8; + t.sheicoptic = 0x03e3; + t.sheqel = 0x20aa; + t.sheqelhebrew = 0x20aa; + t.sheva = 0x05b0; + t.sheva115 = 0x05b0; + t.sheva15 = 0x05b0; + t.sheva22 = 0x05b0; + t.sheva2e = 0x05b0; + t.shevahebrew = 0x05b0; + t.shevanarrowhebrew = 0x05b0; + t.shevaquarterhebrew = 0x05b0; + t.shevawidehebrew = 0x05b0; + t.shhacyrillic = 0x04bb; + t.shimacoptic = 0x03ed; + t.shin = 0x05e9; + t.shindagesh = 0xfb49; + t.shindageshhebrew = 0xfb49; + t.shindageshshindot = 0xfb2c; + t.shindageshshindothebrew = 0xfb2c; + t.shindageshsindot = 0xfb2d; + t.shindageshsindothebrew = 0xfb2d; + t.shindothebrew = 0x05c1; + t.shinhebrew = 0x05e9; + t.shinshindot = 0xfb2a; + t.shinshindothebrew = 0xfb2a; + t.shinsindot = 0xfb2b; + t.shinsindothebrew = 0xfb2b; + t.shook = 0x0282; + t.sigma = 0x03c3; + t.sigma1 = 0x03c2; + t.sigmafinal = 0x03c2; + t.sigmalunatesymbolgreek = 0x03f2; + t.sihiragana = 0x3057; + t.sikatakana = 0x30b7; + t.sikatakanahalfwidth = 0xff7c; + t.siluqhebrew = 0x05bd; + t.siluqlefthebrew = 0x05bd; + t.similar = 0x223c; + t.sindothebrew = 0x05c2; + t.siosacirclekorean = 0x3274; + t.siosaparenkorean = 0x3214; + t.sioscieuckorean = 0x317e; + t.sioscirclekorean = 0x3266; + t.sioskiyeokkorean = 0x317a; + t.sioskorean = 0x3145; + t.siosnieunkorean = 0x317b; + t.siosparenkorean = 0x3206; + t.siospieupkorean = 0x317d; + t.siostikeutkorean = 0x317c; + t.six = 0x0036; + t.sixarabic = 0x0666; + t.sixbengali = 0x09ec; + t.sixcircle = 0x2465; + t.sixcircleinversesansserif = 0x278f; + t.sixdeva = 0x096c; + t.sixgujarati = 0x0aec; + t.sixgurmukhi = 0x0a6c; + t.sixhackarabic = 0x0666; + t.sixhangzhou = 0x3026; + t.sixideographicparen = 0x3225; + t.sixinferior = 0x2086; + t.sixmonospace = 0xff16; + t.sixoldstyle = 0xf736; + t.sixparen = 0x2479; + t.sixperiod = 0x248d; + t.sixpersian = 0x06f6; + t.sixroman = 0x2175; + t.sixsuperior = 0x2076; + t.sixteencircle = 0x246f; + t.sixteencurrencydenominatorbengali = 0x09f9; + t.sixteenparen = 0x2483; + t.sixteenperiod = 0x2497; + t.sixthai = 0x0e56; + t.slash = 0x002f; + t.slashmonospace = 0xff0f; + t.slong = 0x017f; + t.slongdotaccent = 0x1e9b; + t.smileface = 0x263a; + t.smonospace = 0xff53; + t.sofpasuqhebrew = 0x05c3; + t.softhyphen = 0x00ad; + t.softsigncyrillic = 0x044c; + t.sohiragana = 0x305d; + t.sokatakana = 0x30bd; + t.sokatakanahalfwidth = 0xff7f; + t.soliduslongoverlaycmb = 0x0338; + t.solidusshortoverlaycmb = 0x0337; + t.sorusithai = 0x0e29; + t.sosalathai = 0x0e28; + t.sosothai = 0x0e0b; + t.sosuathai = 0x0e2a; + t.space = 0x0020; + t.spacehackarabic = 0x0020; + t.spade = 0x2660; + t.spadesuitblack = 0x2660; + t.spadesuitwhite = 0x2664; + t.sparen = 0x24ae; + t.squarebelowcmb = 0x033b; + t.squarecc = 0x33c4; + t.squarecm = 0x339d; + t.squarediagonalcrosshatchfill = 0x25a9; + t.squarehorizontalfill = 0x25a4; + t.squarekg = 0x338f; + t.squarekm = 0x339e; + t.squarekmcapital = 0x33ce; + t.squareln = 0x33d1; + t.squarelog = 0x33d2; + t.squaremg = 0x338e; + t.squaremil = 0x33d5; + t.squaremm = 0x339c; + t.squaremsquared = 0x33a1; + t.squareorthogonalcrosshatchfill = 0x25a6; + t.squareupperlefttolowerrightfill = 0x25a7; + t.squareupperrighttolowerleftfill = 0x25a8; + t.squareverticalfill = 0x25a5; + t.squarewhitewithsmallblack = 0x25a3; + t.srsquare = 0x33db; + t.ssabengali = 0x09b7; + t.ssadeva = 0x0937; + t.ssagujarati = 0x0ab7; + t.ssangcieuckorean = 0x3149; + t.ssanghieuhkorean = 0x3185; + t.ssangieungkorean = 0x3180; + t.ssangkiyeokkorean = 0x3132; + t.ssangnieunkorean = 0x3165; + t.ssangpieupkorean = 0x3143; + t.ssangsioskorean = 0x3146; + t.ssangtikeutkorean = 0x3138; + t.ssuperior = 0xf6f2; + t.sterling = 0x00a3; + t.sterlingmonospace = 0xffe1; + t.strokelongoverlaycmb = 0x0336; + t.strokeshortoverlaycmb = 0x0335; + t.subset = 0x2282; + t.subsetnotequal = 0x228a; + t.subsetorequal = 0x2286; + t.succeeds = 0x227b; + t.suchthat = 0x220b; + t.suhiragana = 0x3059; + t.sukatakana = 0x30b9; + t.sukatakanahalfwidth = 0xff7d; + t.sukunarabic = 0x0652; + t.summation = 0x2211; + t.sun = 0x263c; + t.superset = 0x2283; + t.supersetnotequal = 0x228b; + t.supersetorequal = 0x2287; + t.svsquare = 0x33dc; + t.syouwaerasquare = 0x337c; + t.t = 0x0074; + t.tabengali = 0x09a4; + t.tackdown = 0x22a4; + t.tackleft = 0x22a3; + t.tadeva = 0x0924; + t.tagujarati = 0x0aa4; + t.tagurmukhi = 0x0a24; + t.taharabic = 0x0637; + t.tahfinalarabic = 0xfec2; + t.tahinitialarabic = 0xfec3; + t.tahiragana = 0x305f; + t.tahmedialarabic = 0xfec4; + t.taisyouerasquare = 0x337d; + t.takatakana = 0x30bf; + t.takatakanahalfwidth = 0xff80; + t.tatweelarabic = 0x0640; + t.tau = 0x03c4; + t.tav = 0x05ea; + t.tavdages = 0xfb4a; + t.tavdagesh = 0xfb4a; + t.tavdageshhebrew = 0xfb4a; + t.tavhebrew = 0x05ea; + t.tbar = 0x0167; + t.tbopomofo = 0x310a; + t.tcaron = 0x0165; + t.tccurl = 0x02a8; + t.tcedilla = 0x0163; + t.tcheharabic = 0x0686; + t.tchehfinalarabic = 0xfb7b; + t.tchehinitialarabic = 0xfb7c; + t.tchehmedialarabic = 0xfb7d; + t.tcircle = 0x24e3; + t.tcircumflexbelow = 0x1e71; + t.tcommaaccent = 0x0163; + t.tdieresis = 0x1e97; + t.tdotaccent = 0x1e6b; + t.tdotbelow = 0x1e6d; + t.tecyrillic = 0x0442; + t.tedescendercyrillic = 0x04ad; + t.teharabic = 0x062a; + t.tehfinalarabic = 0xfe96; + t.tehhahinitialarabic = 0xfca2; + t.tehhahisolatedarabic = 0xfc0c; + t.tehinitialarabic = 0xfe97; + t.tehiragana = 0x3066; + t.tehjeeminitialarabic = 0xfca1; + t.tehjeemisolatedarabic = 0xfc0b; + t.tehmarbutaarabic = 0x0629; + t.tehmarbutafinalarabic = 0xfe94; + t.tehmedialarabic = 0xfe98; + t.tehmeeminitialarabic = 0xfca4; + t.tehmeemisolatedarabic = 0xfc0e; + t.tehnoonfinalarabic = 0xfc73; + t.tekatakana = 0x30c6; + t.tekatakanahalfwidth = 0xff83; + t.telephone = 0x2121; + t.telephoneblack = 0x260e; + t.telishagedolahebrew = 0x05a0; + t.telishaqetanahebrew = 0x05a9; + t.tencircle = 0x2469; + t.tenideographicparen = 0x3229; + t.tenparen = 0x247d; + t.tenperiod = 0x2491; + t.tenroman = 0x2179; + t.tesh = 0x02a7; + t.tet = 0x05d8; + t.tetdagesh = 0xfb38; + t.tetdageshhebrew = 0xfb38; + t.tethebrew = 0x05d8; + t.tetsecyrillic = 0x04b5; + t.tevirhebrew = 0x059b; + t.tevirlefthebrew = 0x059b; + t.thabengali = 0x09a5; + t.thadeva = 0x0925; + t.thagujarati = 0x0aa5; + t.thagurmukhi = 0x0a25; + t.thalarabic = 0x0630; + t.thalfinalarabic = 0xfeac; + t.thanthakhatlowleftthai = 0xf898; + t.thanthakhatlowrightthai = 0xf897; + t.thanthakhatthai = 0x0e4c; + t.thanthakhatupperleftthai = 0xf896; + t.theharabic = 0x062b; + t.thehfinalarabic = 0xfe9a; + t.thehinitialarabic = 0xfe9b; + t.thehmedialarabic = 0xfe9c; + t.thereexists = 0x2203; + t.therefore = 0x2234; + t.theta = 0x03b8; + t.theta1 = 0x03d1; + t.thetasymbolgreek = 0x03d1; + t.thieuthacirclekorean = 0x3279; + t.thieuthaparenkorean = 0x3219; + t.thieuthcirclekorean = 0x326b; + t.thieuthkorean = 0x314c; + t.thieuthparenkorean = 0x320b; + t.thirteencircle = 0x246c; + t.thirteenparen = 0x2480; + t.thirteenperiod = 0x2494; + t.thonangmonthothai = 0x0e11; + t.thook = 0x01ad; + t.thophuthaothai = 0x0e12; + t.thorn = 0x00fe; + t.thothahanthai = 0x0e17; + t.thothanthai = 0x0e10; + t.thothongthai = 0x0e18; + t.thothungthai = 0x0e16; + t.thousandcyrillic = 0x0482; + t.thousandsseparatorarabic = 0x066c; + t.thousandsseparatorpersian = 0x066c; + t.three = 0x0033; + t.threearabic = 0x0663; + t.threebengali = 0x09e9; + t.threecircle = 0x2462; + t.threecircleinversesansserif = 0x278c; + t.threedeva = 0x0969; + t.threeeighths = 0x215c; + t.threegujarati = 0x0ae9; + t.threegurmukhi = 0x0a69; + t.threehackarabic = 0x0663; + t.threehangzhou = 0x3023; + t.threeideographicparen = 0x3222; + t.threeinferior = 0x2083; + t.threemonospace = 0xff13; + t.threenumeratorbengali = 0x09f6; + t.threeoldstyle = 0xf733; + t.threeparen = 0x2476; + t.threeperiod = 0x248a; + t.threepersian = 0x06f3; + t.threequarters = 0x00be; + t.threequartersemdash = 0xf6de; + t.threeroman = 0x2172; + t.threesuperior = 0x00b3; + t.threethai = 0x0e53; + t.thzsquare = 0x3394; + t.tihiragana = 0x3061; + t.tikatakana = 0x30c1; + t.tikatakanahalfwidth = 0xff81; + t.tikeutacirclekorean = 0x3270; + t.tikeutaparenkorean = 0x3210; + t.tikeutcirclekorean = 0x3262; + t.tikeutkorean = 0x3137; + t.tikeutparenkorean = 0x3202; + t.tilde = 0x02dc; + t.tildebelowcmb = 0x0330; + t.tildecmb = 0x0303; + t.tildecomb = 0x0303; + t.tildedoublecmb = 0x0360; + t.tildeoperator = 0x223c; + t.tildeoverlaycmb = 0x0334; + t.tildeverticalcmb = 0x033e; + t.timescircle = 0x2297; + t.tipehahebrew = 0x0596; + t.tipehalefthebrew = 0x0596; + t.tippigurmukhi = 0x0a70; + t.titlocyrilliccmb = 0x0483; + t.tiwnarmenian = 0x057f; + t.tlinebelow = 0x1e6f; + t.tmonospace = 0xff54; + t.toarmenian = 0x0569; + t.tohiragana = 0x3068; + t.tokatakana = 0x30c8; + t.tokatakanahalfwidth = 0xff84; + t.tonebarextrahighmod = 0x02e5; + t.tonebarextralowmod = 0x02e9; + t.tonebarhighmod = 0x02e6; + t.tonebarlowmod = 0x02e8; + t.tonebarmidmod = 0x02e7; + t.tonefive = 0x01bd; + t.tonesix = 0x0185; + t.tonetwo = 0x01a8; + t.tonos = 0x0384; + t.tonsquare = 0x3327; + t.topatakthai = 0x0e0f; + t.tortoiseshellbracketleft = 0x3014; + t.tortoiseshellbracketleftsmall = 0xfe5d; + t.tortoiseshellbracketleftvertical = 0xfe39; + t.tortoiseshellbracketright = 0x3015; + t.tortoiseshellbracketrightsmall = 0xfe5e; + t.tortoiseshellbracketrightvertical = 0xfe3a; + t.totaothai = 0x0e15; + t.tpalatalhook = 0x01ab; + t.tparen = 0x24af; + t.trademark = 0x2122; + t.trademarksans = 0xf8ea; + t.trademarkserif = 0xf6db; + t.tretroflexhook = 0x0288; + t.triagdn = 0x25bc; + t.triaglf = 0x25c4; + t.triagrt = 0x25ba; + t.triagup = 0x25b2; + t.ts = 0x02a6; + t.tsadi = 0x05e6; + t.tsadidagesh = 0xfb46; + t.tsadidageshhebrew = 0xfb46; + t.tsadihebrew = 0x05e6; + t.tsecyrillic = 0x0446; + t.tsere = 0x05b5; + t.tsere12 = 0x05b5; + t.tsere1e = 0x05b5; + t.tsere2b = 0x05b5; + t.tserehebrew = 0x05b5; + t.tserenarrowhebrew = 0x05b5; + t.tserequarterhebrew = 0x05b5; + t.tserewidehebrew = 0x05b5; + t.tshecyrillic = 0x045b; + t.tsuperior = 0xf6f3; + t.ttabengali = 0x099f; + t.ttadeva = 0x091f; + t.ttagujarati = 0x0a9f; + t.ttagurmukhi = 0x0a1f; + t.tteharabic = 0x0679; + t.ttehfinalarabic = 0xfb67; + t.ttehinitialarabic = 0xfb68; + t.ttehmedialarabic = 0xfb69; + t.tthabengali = 0x09a0; + t.tthadeva = 0x0920; + t.tthagujarati = 0x0aa0; + t.tthagurmukhi = 0x0a20; + t.tturned = 0x0287; + t.tuhiragana = 0x3064; + t.tukatakana = 0x30c4; + t.tukatakanahalfwidth = 0xff82; + t.tusmallhiragana = 0x3063; + t.tusmallkatakana = 0x30c3; + t.tusmallkatakanahalfwidth = 0xff6f; + t.twelvecircle = 0x246b; + t.twelveparen = 0x247f; + t.twelveperiod = 0x2493; + t.twelveroman = 0x217b; + t.twentycircle = 0x2473; + t.twentyhangzhou = 0x5344; + t.twentyparen = 0x2487; + t.twentyperiod = 0x249b; + t.two = 0x0032; + t.twoarabic = 0x0662; + t.twobengali = 0x09e8; + t.twocircle = 0x2461; + t.twocircleinversesansserif = 0x278b; + t.twodeva = 0x0968; + t.twodotenleader = 0x2025; + t.twodotleader = 0x2025; + t.twodotleadervertical = 0xfe30; + t.twogujarati = 0x0ae8; + t.twogurmukhi = 0x0a68; + t.twohackarabic = 0x0662; + t.twohangzhou = 0x3022; + t.twoideographicparen = 0x3221; + t.twoinferior = 0x2082; + t.twomonospace = 0xff12; + t.twonumeratorbengali = 0x09f5; + t.twooldstyle = 0xf732; + t.twoparen = 0x2475; + t.twoperiod = 0x2489; + t.twopersian = 0x06f2; + t.tworoman = 0x2171; + t.twostroke = 0x01bb; + t.twosuperior = 0x00b2; + t.twothai = 0x0e52; + t.twothirds = 0x2154; + t.u = 0x0075; + t.uacute = 0x00fa; + t.ubar = 0x0289; + t.ubengali = 0x0989; + t.ubopomofo = 0x3128; + t.ubreve = 0x016d; + t.ucaron = 0x01d4; + t.ucircle = 0x24e4; + t.ucircumflex = 0x00fb; + t.ucircumflexbelow = 0x1e77; + t.ucyrillic = 0x0443; + t.udattadeva = 0x0951; + t.udblacute = 0x0171; + t.udblgrave = 0x0215; + t.udeva = 0x0909; + t.udieresis = 0x00fc; + t.udieresisacute = 0x01d8; + t.udieresisbelow = 0x1e73; + t.udieresiscaron = 0x01da; + t.udieresiscyrillic = 0x04f1; + t.udieresisgrave = 0x01dc; + t.udieresismacron = 0x01d6; + t.udotbelow = 0x1ee5; + t.ugrave = 0x00f9; + t.ugujarati = 0x0a89; + t.ugurmukhi = 0x0a09; + t.uhiragana = 0x3046; + t.uhookabove = 0x1ee7; + t.uhorn = 0x01b0; + t.uhornacute = 0x1ee9; + t.uhorndotbelow = 0x1ef1; + t.uhorngrave = 0x1eeb; + t.uhornhookabove = 0x1eed; + t.uhorntilde = 0x1eef; + t.uhungarumlaut = 0x0171; + t.uhungarumlautcyrillic = 0x04f3; + t.uinvertedbreve = 0x0217; + t.ukatakana = 0x30a6; + t.ukatakanahalfwidth = 0xff73; + t.ukcyrillic = 0x0479; + t.ukorean = 0x315c; + t.umacron = 0x016b; + t.umacroncyrillic = 0x04ef; + t.umacrondieresis = 0x1e7b; + t.umatragurmukhi = 0x0a41; + t.umonospace = 0xff55; + t.underscore = 0x005f; + t.underscoredbl = 0x2017; + t.underscoremonospace = 0xff3f; + t.underscorevertical = 0xfe33; + t.underscorewavy = 0xfe4f; + t.union = 0x222a; + t.universal = 0x2200; + t.uogonek = 0x0173; + t.uparen = 0x24b0; + t.upblock = 0x2580; + t.upperdothebrew = 0x05c4; + t.upsilon = 0x03c5; + t.upsilondieresis = 0x03cb; + t.upsilondieresistonos = 0x03b0; + t.upsilonlatin = 0x028a; + t.upsilontonos = 0x03cd; + t.uptackbelowcmb = 0x031d; + t.uptackmod = 0x02d4; + t.uragurmukhi = 0x0a73; + t.uring = 0x016f; + t.ushortcyrillic = 0x045e; + t.usmallhiragana = 0x3045; + t.usmallkatakana = 0x30a5; + t.usmallkatakanahalfwidth = 0xff69; + t.ustraightcyrillic = 0x04af; + t.ustraightstrokecyrillic = 0x04b1; + t.utilde = 0x0169; + t.utildeacute = 0x1e79; + t.utildebelow = 0x1e75; + t.uubengali = 0x098a; + t.uudeva = 0x090a; + t.uugujarati = 0x0a8a; + t.uugurmukhi = 0x0a0a; + t.uumatragurmukhi = 0x0a42; + t.uuvowelsignbengali = 0x09c2; + t.uuvowelsigndeva = 0x0942; + t.uuvowelsigngujarati = 0x0ac2; + t.uvowelsignbengali = 0x09c1; + t.uvowelsigndeva = 0x0941; + t.uvowelsigngujarati = 0x0ac1; + t.v = 0x0076; + t.vadeva = 0x0935; + t.vagujarati = 0x0ab5; + t.vagurmukhi = 0x0a35; + t.vakatakana = 0x30f7; + t.vav = 0x05d5; + t.vavdagesh = 0xfb35; + t.vavdagesh65 = 0xfb35; + t.vavdageshhebrew = 0xfb35; + t.vavhebrew = 0x05d5; + t.vavholam = 0xfb4b; + t.vavholamhebrew = 0xfb4b; + t.vavvavhebrew = 0x05f0; + t.vavyodhebrew = 0x05f1; + t.vcircle = 0x24e5; + t.vdotbelow = 0x1e7f; + t.vecyrillic = 0x0432; + t.veharabic = 0x06a4; + t.vehfinalarabic = 0xfb6b; + t.vehinitialarabic = 0xfb6c; + t.vehmedialarabic = 0xfb6d; + t.vekatakana = 0x30f9; + t.venus = 0x2640; + t.verticalbar = 0x007c; + t.verticallineabovecmb = 0x030d; + t.verticallinebelowcmb = 0x0329; + t.verticallinelowmod = 0x02cc; + t.verticallinemod = 0x02c8; + t.vewarmenian = 0x057e; + t.vhook = 0x028b; + t.vikatakana = 0x30f8; + t.viramabengali = 0x09cd; + t.viramadeva = 0x094d; + t.viramagujarati = 0x0acd; + t.visargabengali = 0x0983; + t.visargadeva = 0x0903; + t.visargagujarati = 0x0a83; + t.vmonospace = 0xff56; + t.voarmenian = 0x0578; + t.voicediterationhiragana = 0x309e; + t.voicediterationkatakana = 0x30fe; + t.voicedmarkkana = 0x309b; + t.voicedmarkkanahalfwidth = 0xff9e; + t.vokatakana = 0x30fa; + t.vparen = 0x24b1; + t.vtilde = 0x1e7d; + t.vturned = 0x028c; + t.vuhiragana = 0x3094; + t.vukatakana = 0x30f4; + t.w = 0x0077; + t.wacute = 0x1e83; + t.waekorean = 0x3159; + t.wahiragana = 0x308f; + t.wakatakana = 0x30ef; + t.wakatakanahalfwidth = 0xff9c; + t.wakorean = 0x3158; + t.wasmallhiragana = 0x308e; + t.wasmallkatakana = 0x30ee; + t.wattosquare = 0x3357; + t.wavedash = 0x301c; + t.wavyunderscorevertical = 0xfe34; + t.wawarabic = 0x0648; + t.wawfinalarabic = 0xfeee; + t.wawhamzaabovearabic = 0x0624; + t.wawhamzaabovefinalarabic = 0xfe86; + t.wbsquare = 0x33dd; + t.wcircle = 0x24e6; + t.wcircumflex = 0x0175; + t.wdieresis = 0x1e85; + t.wdotaccent = 0x1e87; + t.wdotbelow = 0x1e89; + t.wehiragana = 0x3091; + t.weierstrass = 0x2118; + t.wekatakana = 0x30f1; + t.wekorean = 0x315e; + t.weokorean = 0x315d; + t.wgrave = 0x1e81; + t.whitebullet = 0x25e6; + t.whitecircle = 0x25cb; + t.whitecircleinverse = 0x25d9; + t.whitecornerbracketleft = 0x300e; + t.whitecornerbracketleftvertical = 0xfe43; + t.whitecornerbracketright = 0x300f; + t.whitecornerbracketrightvertical = 0xfe44; + t.whitediamond = 0x25c7; + t.whitediamondcontainingblacksmalldiamond = 0x25c8; + t.whitedownpointingsmalltriangle = 0x25bf; + t.whitedownpointingtriangle = 0x25bd; + t.whiteleftpointingsmalltriangle = 0x25c3; + t.whiteleftpointingtriangle = 0x25c1; + t.whitelenticularbracketleft = 0x3016; + t.whitelenticularbracketright = 0x3017; + t.whiterightpointingsmalltriangle = 0x25b9; + t.whiterightpointingtriangle = 0x25b7; + t.whitesmallsquare = 0x25ab; + t.whitesmilingface = 0x263a; + t.whitesquare = 0x25a1; + t.whitestar = 0x2606; + t.whitetelephone = 0x260f; + t.whitetortoiseshellbracketleft = 0x3018; + t.whitetortoiseshellbracketright = 0x3019; + t.whiteuppointingsmalltriangle = 0x25b5; + t.whiteuppointingtriangle = 0x25b3; + t.wihiragana = 0x3090; + t.wikatakana = 0x30f0; + t.wikorean = 0x315f; + t.wmonospace = 0xff57; + t.wohiragana = 0x3092; + t.wokatakana = 0x30f2; + t.wokatakanahalfwidth = 0xff66; + t.won = 0x20a9; + t.wonmonospace = 0xffe6; + t.wowaenthai = 0x0e27; + t.wparen = 0x24b2; + t.wring = 0x1e98; + t.wsuperior = 0x02b7; + t.wturned = 0x028d; + t.wynn = 0x01bf; + t.x = 0x0078; + t.xabovecmb = 0x033d; + t.xbopomofo = 0x3112; + t.xcircle = 0x24e7; + t.xdieresis = 0x1e8d; + t.xdotaccent = 0x1e8b; + t.xeharmenian = 0x056d; + t.xi = 0x03be; + t.xmonospace = 0xff58; + t.xparen = 0x24b3; + t.xsuperior = 0x02e3; + t.y = 0x0079; + t.yaadosquare = 0x334e; + t.yabengali = 0x09af; + t.yacute = 0x00fd; + t.yadeva = 0x092f; + t.yaekorean = 0x3152; + t.yagujarati = 0x0aaf; + t.yagurmukhi = 0x0a2f; + t.yahiragana = 0x3084; + t.yakatakana = 0x30e4; + t.yakatakanahalfwidth = 0xff94; + t.yakorean = 0x3151; + t.yamakkanthai = 0x0e4e; + t.yasmallhiragana = 0x3083; + t.yasmallkatakana = 0x30e3; + t.yasmallkatakanahalfwidth = 0xff6c; + t.yatcyrillic = 0x0463; + t.ycircle = 0x24e8; + t.ycircumflex = 0x0177; + t.ydieresis = 0x00ff; + t.ydotaccent = 0x1e8f; + t.ydotbelow = 0x1ef5; + t.yeharabic = 0x064a; + t.yehbarreearabic = 0x06d2; + t.yehbarreefinalarabic = 0xfbaf; + t.yehfinalarabic = 0xfef2; + t.yehhamzaabovearabic = 0x0626; + t.yehhamzaabovefinalarabic = 0xfe8a; + t.yehhamzaaboveinitialarabic = 0xfe8b; + t.yehhamzaabovemedialarabic = 0xfe8c; + t.yehinitialarabic = 0xfef3; + t.yehmedialarabic = 0xfef4; + t.yehmeeminitialarabic = 0xfcdd; + t.yehmeemisolatedarabic = 0xfc58; + t.yehnoonfinalarabic = 0xfc94; + t.yehthreedotsbelowarabic = 0x06d1; + t.yekorean = 0x3156; + t.yen = 0x00a5; + t.yenmonospace = 0xffe5; + t.yeokorean = 0x3155; + t.yeorinhieuhkorean = 0x3186; + t.yerahbenyomohebrew = 0x05aa; + t.yerahbenyomolefthebrew = 0x05aa; + t.yericyrillic = 0x044b; + t.yerudieresiscyrillic = 0x04f9; + t.yesieungkorean = 0x3181; + t.yesieungpansioskorean = 0x3183; + t.yesieungsioskorean = 0x3182; + t.yetivhebrew = 0x059a; + t.ygrave = 0x1ef3; + t.yhook = 0x01b4; + t.yhookabove = 0x1ef7; + t.yiarmenian = 0x0575; + t.yicyrillic = 0x0457; + t.yikorean = 0x3162; + t.yinyang = 0x262f; + t.yiwnarmenian = 0x0582; + t.ymonospace = 0xff59; + t.yod = 0x05d9; + t.yoddagesh = 0xfb39; + t.yoddageshhebrew = 0xfb39; + t.yodhebrew = 0x05d9; + t.yodyodhebrew = 0x05f2; + t.yodyodpatahhebrew = 0xfb1f; + t.yohiragana = 0x3088; + t.yoikorean = 0x3189; + t.yokatakana = 0x30e8; + t.yokatakanahalfwidth = 0xff96; + t.yokorean = 0x315b; + t.yosmallhiragana = 0x3087; + t.yosmallkatakana = 0x30e7; + t.yosmallkatakanahalfwidth = 0xff6e; + t.yotgreek = 0x03f3; + t.yoyaekorean = 0x3188; + t.yoyakorean = 0x3187; + t.yoyakthai = 0x0e22; + t.yoyingthai = 0x0e0d; + t.yparen = 0x24b4; + t.ypogegrammeni = 0x037a; + t.ypogegrammenigreekcmb = 0x0345; + t.yr = 0x01a6; + t.yring = 0x1e99; + t.ysuperior = 0x02b8; + t.ytilde = 0x1ef9; + t.yturned = 0x028e; + t.yuhiragana = 0x3086; + t.yuikorean = 0x318c; + t.yukatakana = 0x30e6; + t.yukatakanahalfwidth = 0xff95; + t.yukorean = 0x3160; + t.yusbigcyrillic = 0x046b; + t.yusbigiotifiedcyrillic = 0x046d; + t.yuslittlecyrillic = 0x0467; + t.yuslittleiotifiedcyrillic = 0x0469; + t.yusmallhiragana = 0x3085; + t.yusmallkatakana = 0x30e5; + t.yusmallkatakanahalfwidth = 0xff6d; + t.yuyekorean = 0x318b; + t.yuyeokorean = 0x318a; + t.yyabengali = 0x09df; + t.yyadeva = 0x095f; + t.z = 0x007a; + t.zaarmenian = 0x0566; + t.zacute = 0x017a; + t.zadeva = 0x095b; + t.zagurmukhi = 0x0a5b; + t.zaharabic = 0x0638; + t.zahfinalarabic = 0xfec6; + t.zahinitialarabic = 0xfec7; + t.zahiragana = 0x3056; + t.zahmedialarabic = 0xfec8; + t.zainarabic = 0x0632; + t.zainfinalarabic = 0xfeb0; + t.zakatakana = 0x30b6; + t.zaqefgadolhebrew = 0x0595; + t.zaqefqatanhebrew = 0x0594; + t.zarqahebrew = 0x0598; + t.zayin = 0x05d6; + t.zayindagesh = 0xfb36; + t.zayindageshhebrew = 0xfb36; + t.zayinhebrew = 0x05d6; + t.zbopomofo = 0x3117; + t.zcaron = 0x017e; + t.zcircle = 0x24e9; + t.zcircumflex = 0x1e91; + t.zcurl = 0x0291; + t.zdot = 0x017c; + t.zdotaccent = 0x017c; + t.zdotbelow = 0x1e93; + t.zecyrillic = 0x0437; + t.zedescendercyrillic = 0x0499; + t.zedieresiscyrillic = 0x04df; + t.zehiragana = 0x305c; + t.zekatakana = 0x30bc; + t.zero = 0x0030; + t.zeroarabic = 0x0660; + t.zerobengali = 0x09e6; + t.zerodeva = 0x0966; + t.zerogujarati = 0x0ae6; + t.zerogurmukhi = 0x0a66; + t.zerohackarabic = 0x0660; + t.zeroinferior = 0x2080; + t.zeromonospace = 0xff10; + t.zerooldstyle = 0xf730; + t.zeropersian = 0x06f0; + t.zerosuperior = 0x2070; + t.zerothai = 0x0e50; + t.zerowidthjoiner = 0xfeff; + t.zerowidthnonjoiner = 0x200c; + t.zerowidthspace = 0x200b; + t.zeta = 0x03b6; + t.zhbopomofo = 0x3113; + t.zhearmenian = 0x056a; + t.zhebrevecyrillic = 0x04c2; + t.zhecyrillic = 0x0436; + t.zhedescendercyrillic = 0x0497; + t.zhedieresiscyrillic = 0x04dd; + t.zihiragana = 0x3058; + t.zikatakana = 0x30b8; + t.zinorhebrew = 0x05ae; + t.zlinebelow = 0x1e95; + t.zmonospace = 0xff5a; + t.zohiragana = 0x305e; + t.zokatakana = 0x30be; + t.zparen = 0x24b5; + t.zretroflexhook = 0x0290; + t.zstroke = 0x01b6; + t.zuhiragana = 0x305a; + t.zukatakana = 0x30ba; + t[".notdef"] = 0x0000; + t.angbracketleftbig = 0x2329; + t.angbracketleftBig = 0x2329; + t.angbracketleftbigg = 0x2329; + t.angbracketleftBigg = 0x2329; + t.angbracketrightBig = 0x232a; + t.angbracketrightbig = 0x232a; + t.angbracketrightBigg = 0x232a; + t.angbracketrightbigg = 0x232a; + t.arrowhookleft = 0x21aa; + t.arrowhookright = 0x21a9; + t.arrowlefttophalf = 0x21bc; + t.arrowleftbothalf = 0x21bd; + t.arrownortheast = 0x2197; + t.arrownorthwest = 0x2196; + t.arrowrighttophalf = 0x21c0; + t.arrowrightbothalf = 0x21c1; + t.arrowsoutheast = 0x2198; + t.arrowsouthwest = 0x2199; + t.backslashbig = 0x2216; + t.backslashBig = 0x2216; + t.backslashBigg = 0x2216; + t.backslashbigg = 0x2216; + t.bardbl = 0x2016; + t.bracehtipdownleft = 0xfe37; + t.bracehtipdownright = 0xfe37; + t.bracehtipupleft = 0xfe38; + t.bracehtipupright = 0xfe38; + t.braceleftBig = 0x007b; + t.braceleftbig = 0x007b; + t.braceleftbigg = 0x007b; + t.braceleftBigg = 0x007b; + t.bracerightBig = 0x007d; + t.bracerightbig = 0x007d; + t.bracerightbigg = 0x007d; + t.bracerightBigg = 0x007d; + t.bracketleftbig = 0x005b; + t.bracketleftBig = 0x005b; + t.bracketleftbigg = 0x005b; + t.bracketleftBigg = 0x005b; + t.bracketrightBig = 0x005d; + t.bracketrightbig = 0x005d; + t.bracketrightbigg = 0x005d; + t.bracketrightBigg = 0x005d; + t.ceilingleftbig = 0x2308; + t.ceilingleftBig = 0x2308; + t.ceilingleftBigg = 0x2308; + t.ceilingleftbigg = 0x2308; + t.ceilingrightbig = 0x2309; + t.ceilingrightBig = 0x2309; + t.ceilingrightbigg = 0x2309; + t.ceilingrightBigg = 0x2309; + t.circledotdisplay = 0x2299; + t.circledottext = 0x2299; + t.circlemultiplydisplay = 0x2297; + t.circlemultiplytext = 0x2297; + t.circleplusdisplay = 0x2295; + t.circleplustext = 0x2295; + t.contintegraldisplay = 0x222e; + t.contintegraltext = 0x222e; + t.coproductdisplay = 0x2210; + t.coproducttext = 0x2210; + t.floorleftBig = 0x230a; + t.floorleftbig = 0x230a; + t.floorleftbigg = 0x230a; + t.floorleftBigg = 0x230a; + t.floorrightbig = 0x230b; + t.floorrightBig = 0x230b; + t.floorrightBigg = 0x230b; + t.floorrightbigg = 0x230b; + t.hatwide = 0x0302; + t.hatwider = 0x0302; + t.hatwidest = 0x0302; + t.intercal = 0x1d40; + t.integraldisplay = 0x222b; + t.integraltext = 0x222b; + t.intersectiondisplay = 0x22c2; + t.intersectiontext = 0x22c2; + t.logicalanddisplay = 0x2227; + t.logicalandtext = 0x2227; + t.logicalordisplay = 0x2228; + t.logicalortext = 0x2228; + t.parenleftBig = 0x0028; + t.parenleftbig = 0x0028; + t.parenleftBigg = 0x0028; + t.parenleftbigg = 0x0028; + t.parenrightBig = 0x0029; + t.parenrightbig = 0x0029; + t.parenrightBigg = 0x0029; + t.parenrightbigg = 0x0029; + t.prime = 0x2032; + t.productdisplay = 0x220f; + t.producttext = 0x220f; + t.radicalbig = 0x221a; + t.radicalBig = 0x221a; + t.radicalBigg = 0x221a; + t.radicalbigg = 0x221a; + t.radicalbt = 0x221a; + t.radicaltp = 0x221a; + t.radicalvertex = 0x221a; + t.slashbig = 0x002f; + t.slashBig = 0x002f; + t.slashBigg = 0x002f; + t.slashbigg = 0x002f; + t.summationdisplay = 0x2211; + t.summationtext = 0x2211; + t.tildewide = 0x02dc; + t.tildewider = 0x02dc; + t.tildewidest = 0x02dc; + t.uniondisplay = 0x22c3; + t.unionmultidisplay = 0x228e; + t.unionmultitext = 0x228e; + t.unionsqdisplay = 0x2294; + t.unionsqtext = 0x2294; + t.uniontext = 0x22c3; + t.vextenddouble = 0x2225; + t.vextendsingle = 0x2223; +}); +const getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { + t.space = 0x0020; + t.a1 = 0x2701; + t.a2 = 0x2702; + t.a202 = 0x2703; + t.a3 = 0x2704; + t.a4 = 0x260e; + t.a5 = 0x2706; + t.a119 = 0x2707; + t.a118 = 0x2708; + t.a117 = 0x2709; + t.a11 = 0x261b; + t.a12 = 0x261e; + t.a13 = 0x270c; + t.a14 = 0x270d; + t.a15 = 0x270e; + t.a16 = 0x270f; + t.a105 = 0x2710; + t.a17 = 0x2711; + t.a18 = 0x2712; + t.a19 = 0x2713; + t.a20 = 0x2714; + t.a21 = 0x2715; + t.a22 = 0x2716; + t.a23 = 0x2717; + t.a24 = 0x2718; + t.a25 = 0x2719; + t.a26 = 0x271a; + t.a27 = 0x271b; + t.a28 = 0x271c; + t.a6 = 0x271d; + t.a7 = 0x271e; + t.a8 = 0x271f; + t.a9 = 0x2720; + t.a10 = 0x2721; + t.a29 = 0x2722; + t.a30 = 0x2723; + t.a31 = 0x2724; + t.a32 = 0x2725; + t.a33 = 0x2726; + t.a34 = 0x2727; + t.a35 = 0x2605; + t.a36 = 0x2729; + t.a37 = 0x272a; + t.a38 = 0x272b; + t.a39 = 0x272c; + t.a40 = 0x272d; + t.a41 = 0x272e; + t.a42 = 0x272f; + t.a43 = 0x2730; + t.a44 = 0x2731; + t.a45 = 0x2732; + t.a46 = 0x2733; + t.a47 = 0x2734; + t.a48 = 0x2735; + t.a49 = 0x2736; + t.a50 = 0x2737; + t.a51 = 0x2738; + t.a52 = 0x2739; + t.a53 = 0x273a; + t.a54 = 0x273b; + t.a55 = 0x273c; + t.a56 = 0x273d; + t.a57 = 0x273e; + t.a58 = 0x273f; + t.a59 = 0x2740; + t.a60 = 0x2741; + t.a61 = 0x2742; + t.a62 = 0x2743; + t.a63 = 0x2744; + t.a64 = 0x2745; + t.a65 = 0x2746; + t.a66 = 0x2747; + t.a67 = 0x2748; + t.a68 = 0x2749; + t.a69 = 0x274a; + t.a70 = 0x274b; + t.a71 = 0x25cf; + t.a72 = 0x274d; + t.a73 = 0x25a0; + t.a74 = 0x274f; + t.a203 = 0x2750; + t.a75 = 0x2751; + t.a204 = 0x2752; + t.a76 = 0x25b2; + t.a77 = 0x25bc; + t.a78 = 0x25c6; + t.a79 = 0x2756; + t.a81 = 0x25d7; + t.a82 = 0x2758; + t.a83 = 0x2759; + t.a84 = 0x275a; + t.a97 = 0x275b; + t.a98 = 0x275c; + t.a99 = 0x275d; + t.a100 = 0x275e; + t.a101 = 0x2761; + t.a102 = 0x2762; + t.a103 = 0x2763; + t.a104 = 0x2764; + t.a106 = 0x2765; + t.a107 = 0x2766; + t.a108 = 0x2767; + t.a112 = 0x2663; + t.a111 = 0x2666; + t.a110 = 0x2665; + t.a109 = 0x2660; + t.a120 = 0x2460; + t.a121 = 0x2461; + t.a122 = 0x2462; + t.a123 = 0x2463; + t.a124 = 0x2464; + t.a125 = 0x2465; + t.a126 = 0x2466; + t.a127 = 0x2467; + t.a128 = 0x2468; + t.a129 = 0x2469; + t.a130 = 0x2776; + t.a131 = 0x2777; + t.a132 = 0x2778; + t.a133 = 0x2779; + t.a134 = 0x277a; + t.a135 = 0x277b; + t.a136 = 0x277c; + t.a137 = 0x277d; + t.a138 = 0x277e; + t.a139 = 0x277f; + t.a140 = 0x2780; + t.a141 = 0x2781; + t.a142 = 0x2782; + t.a143 = 0x2783; + t.a144 = 0x2784; + t.a145 = 0x2785; + t.a146 = 0x2786; + t.a147 = 0x2787; + t.a148 = 0x2788; + t.a149 = 0x2789; + t.a150 = 0x278a; + t.a151 = 0x278b; + t.a152 = 0x278c; + t.a153 = 0x278d; + t.a154 = 0x278e; + t.a155 = 0x278f; + t.a156 = 0x2790; + t.a157 = 0x2791; + t.a158 = 0x2792; + t.a159 = 0x2793; + t.a160 = 0x2794; + t.a161 = 0x2192; + t.a163 = 0x2194; + t.a164 = 0x2195; + t.a196 = 0x2798; + t.a165 = 0x2799; + t.a192 = 0x279a; + t.a166 = 0x279b; + t.a167 = 0x279c; + t.a168 = 0x279d; + t.a169 = 0x279e; + t.a170 = 0x279f; + t.a171 = 0x27a0; + t.a172 = 0x27a1; + t.a173 = 0x27a2; + t.a162 = 0x27a3; + t.a174 = 0x27a4; + t.a175 = 0x27a5; + t.a176 = 0x27a6; + t.a177 = 0x27a7; + t.a178 = 0x27a8; + t.a179 = 0x27a9; + t.a193 = 0x27aa; + t.a180 = 0x27ab; + t.a199 = 0x27ac; + t.a181 = 0x27ad; + t.a200 = 0x27ae; + t.a182 = 0x27af; + t.a201 = 0x27b1; + t.a183 = 0x27b2; + t.a184 = 0x27b3; + t.a197 = 0x27b4; + t.a185 = 0x27b5; + t.a194 = 0x27b6; + t.a198 = 0x27b7; + t.a186 = 0x27b8; + t.a195 = 0x27b9; + t.a187 = 0x27ba; + t.a188 = 0x27bb; + t.a189 = 0x27bc; + t.a190 = 0x27bd; + t.a191 = 0x27be; + t.a89 = 0x2768; + t.a90 = 0x2769; + t.a93 = 0x276a; + t.a94 = 0x276b; + t.a91 = 0x276c; + t.a92 = 0x276d; + t.a205 = 0x276e; + t.a85 = 0x276f; + t.a206 = 0x2770; + t.a86 = 0x2771; + t.a87 = 0x2772; + t.a88 = 0x2773; + t.a95 = 0x2774; + t.a96 = 0x2775; + t[".notdef"] = 0x0000; +}); + +;// ./src/core/unicode.js + +const getSpecialPUASymbols = getLookupTableFactory(function (t) { + t[63721] = 0x00a9; + t[63193] = 0x00a9; + t[63720] = 0x00ae; + t[63194] = 0x00ae; + t[63722] = 0x2122; + t[63195] = 0x2122; + t[63729] = 0x23a7; + t[63730] = 0x23a8; + t[63731] = 0x23a9; + t[63740] = 0x23ab; + t[63741] = 0x23ac; + t[63742] = 0x23ad; + t[63726] = 0x23a1; + t[63727] = 0x23a2; + t[63728] = 0x23a3; + t[63737] = 0x23a4; + t[63738] = 0x23a5; + t[63739] = 0x23a6; + t[63723] = 0x239b; + t[63724] = 0x239c; + t[63725] = 0x239d; + t[63734] = 0x239e; + t[63735] = 0x239f; + t[63736] = 0x23a0; +}); +function mapSpecialUnicodeValues(code) { + if (code >= 0xfff0 && code <= 0xffff) { + return 0; + } else if (code >= 0xf600 && code <= 0xf8ff) { + return getSpecialPUASymbols()[code] || code; + } else if (code === 0x00ad) { + return 0x002d; + } + return code; +} +function getUnicodeForGlyph(name, glyphsUnicodeMap) { + let unicode = glyphsUnicodeMap[name]; + if (unicode !== undefined) { + return unicode; + } + if (!name) { + return -1; + } + if (name[0] === "u") { + const nameLen = name.length; + let hexStr; + if (nameLen === 7 && name[1] === "n" && name[2] === "i") { + hexStr = name.substring(3); + } else if (nameLen >= 5 && nameLen <= 7) { + hexStr = name.substring(1); + } else { + return -1; + } + if (hexStr === hexStr.toUpperCase()) { + unicode = parseInt(hexStr, 16); + if (unicode >= 0) { + return unicode; + } + } + } + return -1; +} +const UnicodeRanges = [[0x0000, 0x007f], [0x0080, 0x00ff], [0x0100, 0x017f], [0x0180, 0x024f], [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], [0x02b0, 0x02ff, 0xa700, 0xa71f], [0x0300, 0x036f, 0x1dc0, 0x1dff], [0x0370, 0x03ff], [0x2c80, 0x2cff], [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], [0x0530, 0x058f], [0x0590, 0x05ff], [0xa500, 0xa63f], [0x0600, 0x06ff, 0x0750, 0x077f], [0x07c0, 0x07ff], [0x0900, 0x097f], [0x0980, 0x09ff], [0x0a00, 0x0a7f], [0x0a80, 0x0aff], [0x0b00, 0x0b7f], [0x0b80, 0x0bff], [0x0c00, 0x0c7f], [0x0c80, 0x0cff], [0x0d00, 0x0d7f], [0x0e00, 0x0e7f], [0x0e80, 0x0eff], [0x10a0, 0x10ff, 0x2d00, 0x2d2f], [0x1b00, 0x1b7f], [0x1100, 0x11ff], [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], [0x1f00, 0x1fff], [0x2000, 0x206f, 0x2e00, 0x2e7f], [0x2070, 0x209f], [0x20a0, 0x20cf], [0x20d0, 0x20ff], [0x2100, 0x214f], [0x2150, 0x218f], [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], [0x2300, 0x23ff], [0x2400, 0x243f], [0x2440, 0x245f], [0x2460, 0x24ff], [0x2500, 0x257f], [0x2580, 0x259f], [0x25a0, 0x25ff], [0x2600, 0x26ff], [0x2700, 0x27bf], [0x3000, 0x303f], [0x3040, 0x309f], [0x30a0, 0x30ff, 0x31f0, 0x31ff], [0x3100, 0x312f, 0x31a0, 0x31bf], [0x3130, 0x318f], [0xa840, 0xa87f], [0x3200, 0x32ff], [0x3300, 0x33ff], [0xac00, 0xd7af], [0xd800, 0xdfff], [0x10900, 0x1091f], [0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400, 0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f], [0xe000, 0xf8ff], [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], [0xfb00, 0xfb4f], [0xfb50, 0xfdff], [0xfe20, 0xfe2f], [0xfe10, 0xfe1f], [0xfe50, 0xfe6f], [0xfe70, 0xfeff], [0xff00, 0xffef], [0xfff0, 0xffff], [0x0f00, 0x0fff], [0x0700, 0x074f], [0x0780, 0x07bf], [0x0d80, 0x0dff], [0x1000, 0x109f], [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], [0x13a0, 0x13ff], [0x1400, 0x167f], [0x1680, 0x169f], [0x16a0, 0x16ff], [0x1780, 0x17ff], [0x1800, 0x18af], [0x2800, 0x28ff], [0xa000, 0xa48f], [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], [0x10300, 0x1032f], [0x10330, 0x1034f], [0x10400, 0x1044f], [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], [0x1d400, 0x1d7ff], [0xff000, 0xffffd], [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], [0xe0000, 0xe007f], [0x1900, 0x194f], [0x1950, 0x197f], [0x1980, 0x19df], [0x1a00, 0x1a1f], [0x2c00, 0x2c5f], [0x2d30, 0x2d7f], [0x4dc0, 0x4dff], [0xa800, 0xa82f], [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], [0x10140, 0x1018f], [0x10380, 0x1039f], [0x103a0, 0x103df], [0x10450, 0x1047f], [0x10480, 0x104af], [0x10800, 0x1083f], [0x10a00, 0x10a5f], [0x1d300, 0x1d35f], [0x12000, 0x123ff, 0x12400, 0x1247f], [0x1d360, 0x1d37f], [0x1b80, 0x1bbf], [0x1c00, 0x1c4f], [0x1c50, 0x1c7f], [0xa880, 0xa8df], [0xa900, 0xa92f], [0xa930, 0xa95f], [0xaa00, 0xaa5f], [0x10190, 0x101cf], [0x101d0, 0x101ff], [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], [0x1f030, 0x1f09f, 0x1f000, 0x1f02f]]; +function getUnicodeRangeFor(value, lastPosition = -1) { + if (lastPosition !== -1) { + const range = UnicodeRanges[lastPosition]; + for (let i = 0, ii = range.length; i < ii; i += 2) { + if (value >= range[i] && value <= range[i + 1]) { + return lastPosition; + } + } + } + for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) { + const range = UnicodeRanges[i]; + for (let j = 0, jj = range.length; j < jj; j += 2) { + if (value >= range[j] && value <= range[j + 1]) { + return i; + } + } + } + return -1; +} +const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); +const CategoryCache = new Map(); +function getCharUnicodeCategory(char) { + const cachedCategory = CategoryCache.get(char); + if (cachedCategory) { + return cachedCategory; + } + const groups = char.match(SpecialCharRegExp); + const category = { + isWhitespace: !!groups?.[1], + isZeroWidthDiacritic: !!groups?.[2], + isInvisibleFormatMark: !!groups?.[3] + }; + CategoryCache.set(char, category); + return category; +} +function clearUnicodeCaches() { + CategoryCache.clear(); +} + +;// ./src/core/fonts_utils.js + + + + + +const SEAC_ANALYSIS_ENABLED = true; +const FontFlags = { + FixedPitch: 1, + Serif: 2, + Symbolic: 4, + Script: 8, + Nonsymbolic: 32, + Italic: 64, + AllCap: 65536, + SmallCap: 131072, + ForceBold: 262144 +}; +const MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", "Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", "onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", "Ccaron", "ccaron", "dcroat"]; +function recoverGlyphName(name, glyphsUnicodeMap) { + if (glyphsUnicodeMap[name] !== undefined) { + return name; + } + const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); + if (unicode !== -1) { + for (const key in glyphsUnicodeMap) { + if (glyphsUnicodeMap[key] === unicode) { + return key; + } + } + } + info("Unable to recover a standard glyph name for: " + name); + return name; +} +function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { + const charCodeToGlyphId = Object.create(null); + let glyphId, charCode, baseEncoding; + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + if (properties.isInternalFont) { + baseEncoding = builtInEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } else if (properties.baseEncodingName) { + baseEncoding = getEncoding(properties.baseEncodingName); + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } else if (isSymbolicFont) { + for (charCode in builtInEncoding) { + charCodeToGlyphId[charCode] = builtInEncoding[charCode]; + } + } else { + baseEncoding = StandardEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } + const differences = properties.differences; + let glyphsUnicodeMap; + if (differences) { + for (charCode in differences) { + const glyphName = differences[charCode]; + glyphId = glyphNames.indexOf(glyphName); + if (glyphId === -1) { + if (!glyphsUnicodeMap) { + glyphsUnicodeMap = getGlyphsUnicode(); + } + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } + return charCodeToGlyphId; +} +function normalizeFontName(name) { + return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); +} +const getVerticalPresentationForm = getLookupTableFactory(t => { + t[0x2013] = 0xfe32; + t[0x2014] = 0xfe31; + t[0x2025] = 0xfe30; + t[0x2026] = 0xfe19; + t[0x3001] = 0xfe11; + t[0x3002] = 0xfe12; + t[0x3008] = 0xfe3f; + t[0x3009] = 0xfe40; + t[0x300a] = 0xfe3d; + t[0x300b] = 0xfe3e; + t[0x300c] = 0xfe41; + t[0x300d] = 0xfe42; + t[0x300e] = 0xfe43; + t[0x300f] = 0xfe44; + t[0x3010] = 0xfe3b; + t[0x3011] = 0xfe3c; + t[0x3014] = 0xfe39; + t[0x3015] = 0xfe3a; + t[0x3016] = 0xfe17; + t[0x3017] = 0xfe18; + t[0xfe4f] = 0xfe34; + t[0xff01] = 0xfe15; + t[0xff08] = 0xfe35; + t[0xff09] = 0xfe36; + t[0xff0c] = 0xfe10; + t[0xff1a] = 0xfe13; + t[0xff1b] = 0xfe14; + t[0xff1f] = 0xfe16; + t[0xff3b] = 0xfe47; + t[0xff3d] = 0xfe48; + t[0xff3f] = 0xfe33; + t[0xff5b] = 0xfe37; + t[0xff5d] = 0xfe38; +}); + +;// ./src/core/standard_fonts.js + + +const getStdFontMap = getLookupTableFactory(function (t) { + t["Times-Roman"] = "Times-Roman"; + t.Helvetica = "Helvetica"; + t.Courier = "Courier"; + t.Symbol = "Symbol"; + t["Times-Bold"] = "Times-Bold"; + t["Helvetica-Bold"] = "Helvetica-Bold"; + t["Courier-Bold"] = "Courier-Bold"; + t.ZapfDingbats = "ZapfDingbats"; + t["Times-Italic"] = "Times-Italic"; + t["Helvetica-Oblique"] = "Helvetica-Oblique"; + t["Courier-Oblique"] = "Courier-Oblique"; + t["Times-BoldItalic"] = "Times-BoldItalic"; + t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique"; + t["Courier-BoldOblique"] = "Courier-BoldOblique"; + t.ArialNarrow = "Helvetica"; + t["ArialNarrow-Bold"] = "Helvetica-Bold"; + t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialNarrow-Italic"] = "Helvetica-Oblique"; + t.ArialBlack = "Helvetica"; + t["ArialBlack-Bold"] = "Helvetica-Bold"; + t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialBlack-Italic"] = "Helvetica-Oblique"; + t["Arial-Black"] = "Helvetica"; + t["Arial-Black-Bold"] = "Helvetica-Bold"; + t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-Black-Italic"] = "Helvetica-Oblique"; + t.Arial = "Helvetica"; + t["Arial-Bold"] = "Helvetica-Bold"; + t["Arial-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-Italic"] = "Helvetica-Oblique"; + t.ArialMT = "Helvetica"; + t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT"] = "Helvetica-Bold"; + t["Arial-ItalicMT"] = "Helvetica-Oblique"; + t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT-Bold"] = "Helvetica-Bold"; + t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; + t.ArialUnicodeMS = "Helvetica"; + t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; + t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; + t["Courier-BoldItalic"] = "Courier-BoldOblique"; + t["Courier-Italic"] = "Courier-Oblique"; + t.CourierNew = "Courier"; + t["CourierNew-Bold"] = "Courier-Bold"; + t["CourierNew-BoldItalic"] = "Courier-BoldOblique"; + t["CourierNew-Italic"] = "Courier-Oblique"; + t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique"; + t["CourierNewPS-BoldMT"] = "Courier-Bold"; + t["CourierNewPS-ItalicMT"] = "Courier-Oblique"; + t.CourierNewPSMT = "Courier"; + t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; + t["Helvetica-Italic"] = "Helvetica-Oblique"; + t["HelveticaLTStd-Bold"] = "Helvetica-Bold"; + t["Symbol-Bold"] = "Symbol"; + t["Symbol-BoldItalic"] = "Symbol"; + t["Symbol-Italic"] = "Symbol"; + t.TimesNewRoman = "Times-Roman"; + t["TimesNewRoman-Bold"] = "Times-Bold"; + t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRoman-Italic"] = "Times-Italic"; + t.TimesNewRomanPS = "Times-Roman"; + t["TimesNewRomanPS-Bold"] = "Times-Bold"; + t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic"; + t["TimesNewRomanPS-BoldMT"] = "Times-Bold"; + t["TimesNewRomanPS-Italic"] = "Times-Italic"; + t["TimesNewRomanPS-ItalicMT"] = "Times-Italic"; + t.TimesNewRomanPSMT = "Times-Roman"; + t["TimesNewRomanPSMT-Bold"] = "Times-Bold"; + t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRomanPSMT-Italic"] = "Times-Italic"; +}); +const getFontNameToFileMap = getLookupTableFactory(function (t) { + t.Courier = "FoxitFixed.pfb"; + t["Courier-Bold"] = "FoxitFixedBold.pfb"; + t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; + t["Courier-Oblique"] = "FoxitFixedItalic.pfb"; + t.Helvetica = "LiberationSans-Regular.ttf"; + t["Helvetica-Bold"] = "LiberationSans-Bold.ttf"; + t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf"; + t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf"; + t["Times-Roman"] = "FoxitSerif.pfb"; + t["Times-Bold"] = "FoxitSerifBold.pfb"; + t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb"; + t["Times-Italic"] = "FoxitSerifItalic.pfb"; + t.Symbol = "FoxitSymbol.pfb"; + t.ZapfDingbats = "FoxitDingbats.pfb"; + t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf"; + t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf"; + t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf"; + t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf"; +}); +const getNonStdFontMap = getLookupTableFactory(function (t) { + t.Calibri = "Helvetica"; + t["Calibri-Bold"] = "Helvetica-Bold"; + t["Calibri-BoldItalic"] = "Helvetica-BoldOblique"; + t["Calibri-Italic"] = "Helvetica-Oblique"; + t.CenturyGothic = "Helvetica"; + t["CenturyGothic-Bold"] = "Helvetica-Bold"; + t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique"; + t["CenturyGothic-Italic"] = "Helvetica-Oblique"; + t.ComicSansMS = "Comic Sans MS"; + t["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; + t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; + t["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; + t.GillSansMT = "Helvetica"; + t["GillSansMT-Bold"] = "Helvetica-Bold"; + t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["GillSansMT-Italic"] = "Helvetica-Oblique"; + t.Impact = "Helvetica"; + t["ItcSymbol-Bold"] = "Helvetica-Bold"; + t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; + t["ItcSymbol-Book"] = "Helvetica"; + t["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; + t["ItcSymbol-Medium"] = "Helvetica"; + t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; + t.LucidaConsole = "Courier"; + t["LucidaConsole-Bold"] = "Courier-Bold"; + t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique"; + t["LucidaConsole-Italic"] = "Courier-Oblique"; + t["LucidaSans-Demi"] = "Helvetica-Bold"; + t["MS-Gothic"] = "MS Gothic"; + t["MS-Gothic-Bold"] = "MS Gothic-Bold"; + t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic"; + t["MS-Gothic-Italic"] = "MS Gothic-Italic"; + t["MS-Mincho"] = "MS Mincho"; + t["MS-Mincho-Bold"] = "MS Mincho-Bold"; + t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic"; + t["MS-Mincho-Italic"] = "MS Mincho-Italic"; + t["MS-PGothic"] = "MS PGothic"; + t["MS-PGothic-Bold"] = "MS PGothic-Bold"; + t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic"; + t["MS-PGothic-Italic"] = "MS PGothic-Italic"; + t["MS-PMincho"] = "MS PMincho"; + t["MS-PMincho-Bold"] = "MS PMincho-Bold"; + t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic"; + t["MS-PMincho-Italic"] = "MS PMincho-Italic"; + t.NuptialScript = "Times-Italic"; + t.SegoeUISymbol = "Helvetica"; +}); +const getSerifFonts = getLookupTableFactory(function (t) { + t["Adobe Jenson"] = true; + t["Adobe Text"] = true; + t.Albertus = true; + t.Aldus = true; + t.Alexandria = true; + t.Algerian = true; + t["American Typewriter"] = true; + t.Antiqua = true; + t.Apex = true; + t.Arno = true; + t.Aster = true; + t.Aurora = true; + t.Baskerville = true; + t.Bell = true; + t.Bembo = true; + t["Bembo Schoolbook"] = true; + t.Benguiat = true; + t["Berkeley Old Style"] = true; + t["Bernhard Modern"] = true; + t["Berthold City"] = true; + t.Bodoni = true; + t["Bauer Bodoni"] = true; + t["Book Antiqua"] = true; + t.Bookman = true; + t["Bordeaux Roman"] = true; + t["Californian FB"] = true; + t.Calisto = true; + t.Calvert = true; + t.Capitals = true; + t.Cambria = true; + t.Cartier = true; + t.Caslon = true; + t.Catull = true; + t.Centaur = true; + t["Century Old Style"] = true; + t["Century Schoolbook"] = true; + t.Chaparral = true; + t["Charis SIL"] = true; + t.Cheltenham = true; + t["Cholla Slab"] = true; + t.Clarendon = true; + t.Clearface = true; + t.Cochin = true; + t.Colonna = true; + t["Computer Modern"] = true; + t["Concrete Roman"] = true; + t.Constantia = true; + t["Cooper Black"] = true; + t.Corona = true; + t.Ecotype = true; + t.Egyptienne = true; + t.Elephant = true; + t.Excelsior = true; + t.Fairfield = true; + t["FF Scala"] = true; + t.Folkard = true; + t.Footlight = true; + t.FreeSerif = true; + t["Friz Quadrata"] = true; + t.Garamond = true; + t.Gentium = true; + t.Georgia = true; + t.Gloucester = true; + t["Goudy Old Style"] = true; + t["Goudy Schoolbook"] = true; + t["Goudy Pro Font"] = true; + t.Granjon = true; + t["Guardian Egyptian"] = true; + t.Heather = true; + t.Hercules = true; + t["High Tower Text"] = true; + t.Hiroshige = true; + t["Hoefler Text"] = true; + t["Humana Serif"] = true; + t.Imprint = true; + t["Ionic No. 5"] = true; + t.Janson = true; + t.Joanna = true; + t.Korinna = true; + t.Lexicon = true; + t.LiberationSerif = true; + t["Liberation Serif"] = true; + t["Linux Libertine"] = true; + t.Literaturnaya = true; + t.Lucida = true; + t["Lucida Bright"] = true; + t.Melior = true; + t.Memphis = true; + t.Miller = true; + t.Minion = true; + t.Modern = true; + t["Mona Lisa"] = true; + t["Mrs Eaves"] = true; + t["MS Serif"] = true; + t["Museo Slab"] = true; + t["New York"] = true; + t["Nimbus Roman"] = true; + t["NPS Rawlinson Roadway"] = true; + t.NuptialScript = true; + t.Palatino = true; + t.Perpetua = true; + t.Plantin = true; + t["Plantin Schoolbook"] = true; + t.Playbill = true; + t["Poor Richard"] = true; + t["Rawlinson Roadway"] = true; + t.Renault = true; + t.Requiem = true; + t.Rockwell = true; + t.Roman = true; + t["Rotis Serif"] = true; + t.Sabon = true; + t.Scala = true; + t.Seagull = true; + t.Sistina = true; + t.Souvenir = true; + t.STIX = true; + t["Stone Informal"] = true; + t["Stone Serif"] = true; + t.Sylfaen = true; + t.Times = true; + t.Trajan = true; + t["Trinité"] = true; + t["Trump Mediaeval"] = true; + t.Utopia = true; + t["Vale Type"] = true; + t["Bitstream Vera"] = true; + t["Vera Serif"] = true; + t.Versailles = true; + t.Wanted = true; + t.Weiss = true; + t["Wide Latin"] = true; + t.Windsor = true; + t.XITS = true; +}); +const getSymbolsFonts = getLookupTableFactory(function (t) { + t.Dingbats = true; + t.Symbol = true; + t.ZapfDingbats = true; + t.Wingdings = true; + t["Wingdings-Bold"] = true; + t["Wingdings-Regular"] = true; +}); +const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { + t[2] = 10; + t[3] = 32; + t[4] = 33; + t[5] = 34; + t[6] = 35; + t[7] = 36; + t[8] = 37; + t[9] = 38; + t[10] = 39; + t[11] = 40; + t[12] = 41; + t[13] = 42; + t[14] = 43; + t[15] = 44; + t[16] = 45; + t[17] = 46; + t[18] = 47; + t[19] = 48; + t[20] = 49; + t[21] = 50; + t[22] = 51; + t[23] = 52; + t[24] = 53; + t[25] = 54; + t[26] = 55; + t[27] = 56; + t[28] = 57; + t[29] = 58; + t[30] = 894; + t[31] = 60; + t[32] = 61; + t[33] = 62; + t[34] = 63; + t[35] = 64; + t[36] = 65; + t[37] = 66; + t[38] = 67; + t[39] = 68; + t[40] = 69; + t[41] = 70; + t[42] = 71; + t[43] = 72; + t[44] = 73; + t[45] = 74; + t[46] = 75; + t[47] = 76; + t[48] = 77; + t[49] = 78; + t[50] = 79; + t[51] = 80; + t[52] = 81; + t[53] = 82; + t[54] = 83; + t[55] = 84; + t[56] = 85; + t[57] = 86; + t[58] = 87; + t[59] = 88; + t[60] = 89; + t[61] = 90; + t[62] = 91; + t[63] = 92; + t[64] = 93; + t[65] = 94; + t[66] = 95; + t[67] = 96; + t[68] = 97; + t[69] = 98; + t[70] = 99; + t[71] = 100; + t[72] = 101; + t[73] = 102; + t[74] = 103; + t[75] = 104; + t[76] = 105; + t[77] = 106; + t[78] = 107; + t[79] = 108; + t[80] = 109; + t[81] = 110; + t[82] = 111; + t[83] = 112; + t[84] = 113; + t[85] = 114; + t[86] = 115; + t[87] = 116; + t[88] = 117; + t[89] = 118; + t[90] = 119; + t[91] = 120; + t[92] = 121; + t[93] = 122; + t[94] = 123; + t[95] = 124; + t[96] = 125; + t[97] = 126; + t[98] = 196; + t[99] = 197; + t[100] = 199; + t[101] = 201; + t[102] = 209; + t[103] = 214; + t[104] = 220; + t[105] = 225; + t[106] = 224; + t[107] = 226; + t[108] = 228; + t[109] = 227; + t[110] = 229; + t[111] = 231; + t[112] = 233; + t[113] = 232; + t[114] = 234; + t[115] = 235; + t[116] = 237; + t[117] = 236; + t[118] = 238; + t[119] = 239; + t[120] = 241; + t[121] = 243; + t[122] = 242; + t[123] = 244; + t[124] = 246; + t[125] = 245; + t[126] = 250; + t[127] = 249; + t[128] = 251; + t[129] = 252; + t[130] = 8224; + t[131] = 176; + t[132] = 162; + t[133] = 163; + t[134] = 167; + t[135] = 8226; + t[136] = 182; + t[137] = 223; + t[138] = 174; + t[139] = 169; + t[140] = 8482; + t[141] = 180; + t[142] = 168; + t[143] = 8800; + t[144] = 198; + t[145] = 216; + t[146] = 8734; + t[147] = 177; + t[148] = 8804; + t[149] = 8805; + t[150] = 165; + t[151] = 181; + t[152] = 8706; + t[153] = 8721; + t[154] = 8719; + t[156] = 8747; + t[157] = 170; + t[158] = 186; + t[159] = 8486; + t[160] = 230; + t[161] = 248; + t[162] = 191; + t[163] = 161; + t[164] = 172; + t[165] = 8730; + t[166] = 402; + t[167] = 8776; + t[168] = 8710; + t[169] = 171; + t[170] = 187; + t[171] = 8230; + t[179] = 8220; + t[180] = 8221; + t[181] = 8216; + t[182] = 8217; + t[200] = 193; + t[203] = 205; + t[207] = 211; + t[210] = 218; + t[223] = 711; + t[224] = 321; + t[225] = 322; + t[226] = 352; + t[227] = 353; + t[228] = 381; + t[229] = 382; + t[233] = 221; + t[234] = 253; + t[252] = 263; + t[253] = 268; + t[254] = 269; + t[258] = 258; + t[260] = 260; + t[261] = 261; + t[265] = 280; + t[266] = 281; + t[267] = 282; + t[268] = 283; + t[269] = 313; + t[275] = 323; + t[276] = 324; + t[278] = 328; + t[283] = 344; + t[284] = 345; + t[285] = 346; + t[286] = 347; + t[292] = 367; + t[295] = 377; + t[296] = 378; + t[298] = 380; + t[305] = 963; + t[306] = 964; + t[307] = 966; + t[308] = 8215; + t[309] = 8252; + t[310] = 8319; + t[311] = 8359; + t[312] = 8592; + t[313] = 8593; + t[337] = 9552; + t[493] = 1039; + t[494] = 1040; + t[672] = 1488; + t[673] = 1489; + t[674] = 1490; + t[675] = 1491; + t[676] = 1492; + t[677] = 1493; + t[678] = 1494; + t[679] = 1495; + t[680] = 1496; + t[681] = 1497; + t[682] = 1498; + t[683] = 1499; + t[684] = 1500; + t[685] = 1501; + t[686] = 1502; + t[687] = 1503; + t[688] = 1504; + t[689] = 1505; + t[690] = 1506; + t[691] = 1507; + t[692] = 1508; + t[693] = 1509; + t[694] = 1510; + t[695] = 1511; + t[696] = 1512; + t[697] = 1513; + t[698] = 1514; + t[705] = 1524; + t[706] = 8362; + t[710] = 64288; + t[711] = 64298; + t[759] = 1617; + t[761] = 1776; + t[763] = 1778; + t[775] = 1652; + t[777] = 1764; + t[778] = 1780; + t[779] = 1781; + t[780] = 1782; + t[782] = 771; + t[783] = 64726; + t[786] = 8363; + t[788] = 8532; + t[790] = 768; + t[791] = 769; + t[792] = 768; + t[795] = 803; + t[797] = 64336; + t[798] = 64337; + t[799] = 64342; + t[800] = 64343; + t[801] = 64344; + t[802] = 64345; + t[803] = 64362; + t[804] = 64363; + t[805] = 64364; + t[2424] = 7821; + t[2425] = 7822; + t[2426] = 7823; + t[2427] = 7824; + t[2428] = 7825; + t[2429] = 7826; + t[2430] = 7827; + t[2433] = 7682; + t[2678] = 8045; + t[2679] = 8046; + t[2830] = 1552; + t[2838] = 686; + t[2840] = 751; + t[2842] = 753; + t[2843] = 754; + t[2844] = 755; + t[2846] = 757; + t[2856] = 767; + t[2857] = 848; + t[2858] = 849; + t[2862] = 853; + t[2863] = 854; + t[2864] = 855; + t[2865] = 861; + t[2866] = 862; + t[2906] = 7460; + t[2908] = 7462; + t[2909] = 7463; + t[2910] = 7464; + t[2912] = 7466; + t[2913] = 7467; + t[2914] = 7468; + t[2916] = 7470; + t[2917] = 7471; + t[2918] = 7472; + t[2920] = 7474; + t[2921] = 7475; + t[2922] = 7476; + t[2924] = 7478; + t[2925] = 7479; + t[2926] = 7480; + t[2928] = 7482; + t[2929] = 7483; + t[2930] = 7484; + t[2932] = 7486; + t[2933] = 7487; + t[2934] = 7488; + t[2936] = 7490; + t[2937] = 7491; + t[2938] = 7492; + t[2940] = 7494; + t[2941] = 7495; + t[2942] = 7496; + t[2944] = 7498; + t[2946] = 7500; + t[2948] = 7502; + t[2950] = 7504; + t[2951] = 7505; + t[2952] = 7506; + t[2954] = 7508; + t[2955] = 7509; + t[2956] = 7510; + t[2958] = 7512; + t[2959] = 7513; + t[2960] = 7514; + t[2962] = 7516; + t[2963] = 7517; + t[2964] = 7518; + t[2966] = 7520; + t[2967] = 7521; + t[2968] = 7522; + t[2970] = 7524; + t[2971] = 7525; + t[2972] = 7526; + t[2974] = 7528; + t[2975] = 7529; + t[2976] = 7530; + t[2978] = 1537; + t[2979] = 1538; + t[2980] = 1539; + t[2982] = 1549; + t[2983] = 1551; + t[2984] = 1552; + t[2986] = 1554; + t[2987] = 1555; + t[2988] = 1556; + t[2990] = 1623; + t[2991] = 1624; + t[2995] = 1775; + t[2999] = 1791; + t[3002] = 64290; + t[3003] = 64291; + t[3004] = 64292; + t[3006] = 64294; + t[3007] = 64295; + t[3008] = 64296; + t[3011] = 1900; + t[3014] = 8223; + t[3015] = 8244; + t[3017] = 7532; + t[3018] = 7533; + t[3019] = 7534; + t[3075] = 7590; + t[3076] = 7591; + t[3079] = 7594; + t[3080] = 7595; + t[3083] = 7598; + t[3084] = 7599; + t[3087] = 7602; + t[3088] = 7603; + t[3091] = 7606; + t[3092] = 7607; + t[3095] = 7610; + t[3096] = 7611; + t[3099] = 7614; + t[3100] = 7615; + t[3103] = 7618; + t[3104] = 7619; + t[3107] = 8337; + t[3108] = 8338; + t[3116] = 1884; + t[3119] = 1885; + t[3120] = 1885; + t[3123] = 1886; + t[3124] = 1886; + t[3127] = 1887; + t[3128] = 1887; + t[3131] = 1888; + t[3132] = 1888; + t[3135] = 1889; + t[3136] = 1889; + t[3139] = 1890; + t[3140] = 1890; + t[3143] = 1891; + t[3144] = 1891; + t[3147] = 1892; + t[3148] = 1892; + t[3153] = 580; + t[3154] = 581; + t[3157] = 584; + t[3158] = 585; + t[3161] = 588; + t[3162] = 589; + t[3165] = 891; + t[3166] = 892; + t[3169] = 1274; + t[3170] = 1275; + t[3173] = 1278; + t[3174] = 1279; + t[3181] = 7622; + t[3182] = 7623; + t[3282] = 11799; + t[3316] = 578; + t[3379] = 42785; + t[3393] = 1159; + t[3416] = 8377; +}); +const getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) { + t[227] = 322; + t[264] = 261; + t[291] = 346; +}); +const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) { + t[1] = 32; + t[4] = 65; + t[5] = 192; + t[6] = 193; + t[9] = 196; + t[17] = 66; + t[18] = 67; + t[21] = 268; + t[24] = 68; + t[28] = 69; + t[29] = 200; + t[30] = 201; + t[32] = 282; + t[38] = 70; + t[39] = 71; + t[44] = 72; + t[47] = 73; + t[48] = 204; + t[49] = 205; + t[58] = 74; + t[60] = 75; + t[62] = 76; + t[68] = 77; + t[69] = 78; + t[75] = 79; + t[76] = 210; + t[80] = 214; + t[87] = 80; + t[89] = 81; + t[90] = 82; + t[92] = 344; + t[94] = 83; + t[97] = 352; + t[100] = 84; + t[104] = 85; + t[109] = 220; + t[115] = 86; + t[116] = 87; + t[121] = 88; + t[122] = 89; + t[124] = 221; + t[127] = 90; + t[129] = 381; + t[258] = 97; + t[259] = 224; + t[260] = 225; + t[263] = 228; + t[268] = 261; + t[271] = 98; + t[272] = 99; + t[273] = 263; + t[275] = 269; + t[282] = 100; + t[286] = 101; + t[287] = 232; + t[288] = 233; + t[290] = 283; + t[295] = 281; + t[296] = 102; + t[336] = 103; + t[346] = 104; + t[349] = 105; + t[350] = 236; + t[351] = 237; + t[361] = 106; + t[364] = 107; + t[367] = 108; + t[371] = 322; + t[373] = 109; + t[374] = 110; + t[381] = 111; + t[382] = 242; + t[383] = 243; + t[386] = 246; + t[393] = 112; + t[395] = 113; + t[396] = 114; + t[398] = 345; + t[400] = 115; + t[401] = 347; + t[403] = 353; + t[410] = 116; + t[437] = 117; + t[442] = 252; + t[448] = 118; + t[449] = 119; + t[454] = 120; + t[455] = 121; + t[457] = 253; + t[460] = 122; + t[462] = 382; + t[463] = 380; + t[853] = 44; + t[855] = 58; + t[856] = 46; + t[876] = 47; + t[878] = 45; + t[882] = 45; + t[894] = 40; + t[895] = 41; + t[896] = 91; + t[897] = 93; + t[923] = 64; + t[1004] = 48; + t[1005] = 49; + t[1006] = 50; + t[1007] = 51; + t[1008] = 52; + t[1009] = 53; + t[1010] = 54; + t[1011] = 55; + t[1012] = 56; + t[1013] = 57; + t[1081] = 37; + t[1085] = 43; + t[1086] = 45; +}); +function getStandardFontName(name) { + const fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(); + return stdFontMap[fontName]; +} +function isKnownFontName(name) { + const fontName = normalizeFontName(name); + return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]); +} + +;// ./src/core/to_unicode_map.js + +class ToUnicodeMap { + constructor(cmap = []) { + this._map = cmap; + } + get length() { + return this._map.length; + } + forEach(callback) { + for (const charCode in this._map) { + callback(charCode, this._map[charCode].codePointAt(0)); + } + } + has(i) { + return this._map[i] !== undefined; + } + get(i) { + return this._map[i]; + } + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; + } + amend(map) { + for (const charCode in map) { + this._map[charCode] = map[charCode]; + } + } +} +class IdentityToUnicodeMap { + constructor(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + get length() { + return this.lastChar + 1 - this.firstChar; + } + forEach(callback) { + for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + } + has(i) { + return this.firstChar <= i && i <= this.lastChar; + } + get(i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; + } + charCodeOf(v) { + return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; + } + amend(map) { + unreachable("Should not call amend()"); + } +} + +;// ./src/core/cff_font.js + + + +class CFFFont { + constructor(file, properties) { + this.properties = properties; + const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); + this.cff = parser.parse(); + this.cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(this.cff); + this.seacs = this.cff.seacs; + try { + this.data = compiler.compile(); + } catch { + warn("Failed to compile font " + properties.loadedName); + this.data = file; + } + this._createBuiltInEncoding(); + } + get numGlyphs() { + return this.cff.charStrings.count; + } + getCharset() { + return this.cff.charset.charset; + } + getGlyphMapping() { + const cff = this.cff; + const properties = this.properties; + const { + cidToGidMap, + cMap + } = properties; + const charsets = cff.charset.charset; + let charCodeToGlyphId; + let glyphId; + if (properties.composite) { + let invCidToGidMap; + if (cidToGidMap?.length > 0) { + invCidToGidMap = Object.create(null); + for (let i = 0, ii = cidToGidMap.length; i < ii; i++) { + const gid = cidToGidMap[i]; + if (gid !== undefined) { + invCidToGidMap[gid] = i; + } + } + } + charCodeToGlyphId = Object.create(null); + let charCode; + if (cff.isCIDFont) { + for (glyphId = 0; glyphId < charsets.length; glyphId++) { + const cid = charsets[glyphId]; + charCode = cMap.charCodeOf(cid); + if (invCidToGidMap?.[charCode] !== undefined) { + charCode = invCidToGidMap[charCode]; + } + charCodeToGlyphId[charCode] = glyphId; + } + } else { + for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { + charCode = cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId; + } + } + return charCodeToGlyphId; + } + let encoding = cff.encoding ? cff.encoding.encoding : null; + if (properties.isInternalFont) { + encoding = properties.defaultEncoding; + } + charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); + return charCodeToGlyphId; + } + hasGlyphId(id) { + return this.cff.hasGlyphId(id); + } + _createBuiltInEncoding() { + const { + charset, + encoding + } = this.cff; + if (!charset || !encoding) { + return; + } + const charsets = charset.charset, + encodings = encoding.encoding; + const map = []; + for (const charCode in encodings) { + const glyphId = encodings[charCode]; + if (glyphId >= 0) { + const glyphName = charsets[glyphId]; + if (glyphName) { + map[charCode] = glyphName; + } + } + } + if (map.length > 0) { + this.properties.builtInEncoding = map; + } + } +} + +;// ./src/core/font_renderer.js + + + + + + +function getUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +} +function getUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; +} +function getInt16(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16) >> 16; +} +function getInt8(data, offset) { + return data[offset] << 24 >> 24; +} +function getFloat214(data, offset) { + return getInt16(data, offset) / 16384; +} +function getSubroutineBias(subrs) { + const numSubrs = subrs.length; + let bias = 32768; + if (numSubrs < 1240) { + bias = 107; + } else if (numSubrs < 33900) { + bias = 1131; + } + return bias; +} +function parseCmap(data, start, end) { + const offset = getUint16(data, start + 2) === 1 ? getUint32(data, start + 8) : getUint32(data, start + 16); + const format = getUint16(data, start + offset); + let ranges, p, i; + if (format === 4) { + getUint16(data, start + offset + 2); + const segCount = getUint16(data, start + offset + 6) >> 1; + p = start + offset + 14; + ranges = []; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i] = { + end: getUint16(data, p) + }; + } + p += 2; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].start = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].idDelta = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + let idOffset = getUint16(data, p); + if (idOffset === 0) { + continue; + } + ranges[i].ids = []; + for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { + ranges[i].ids[j] = getUint16(data, p + idOffset); + idOffset += 2; + } + } + return ranges; + } else if (format === 12) { + const groups = getUint32(data, start + offset + 12); + p = start + offset + 16; + ranges = []; + for (i = 0; i < groups; i++) { + start = getUint32(data, p); + ranges.push({ + start, + end: getUint32(data, p + 4), + idDelta: getUint32(data, p + 8) - start + }); + p += 12; + } + return ranges; + } + throw new FormatError(`unsupported cmap: ${format}`); +} +function parseCff(data, start, end, seacAnalysisEnabled) { + const properties = {}; + const parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled); + const cff = parser.parse(); + return { + glyphs: cff.charStrings.objects, + subrs: cff.topDict.privateDict?.subrsIndex?.objects, + gsubrs: cff.globalSubrIndex?.objects, + isCFFCIDFont: cff.isCIDFont, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray + }; +} +function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + let itemSize, itemDecode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = getUint32; + } else { + itemSize = 2; + itemDecode = (data, offset) => 2 * getUint16(data, offset); + } + const glyphs = []; + let startOffset = itemDecode(loca, 0); + for (let j = itemSize; j < loca.length; j += itemSize) { + const endOffset = itemDecode(loca, j); + glyphs.push(glyf.subarray(startOffset, endOffset)); + startOffset = endOffset; + } + return glyphs; +} +function lookupCmap(ranges, unicode) { + const code = unicode.codePointAt(0); + let gid = 0, + l = 0, + r = ranges.length - 1; + while (l < r) { + const c = l + r + 1 >> 1; + if (code < ranges[c].start) { + r = c - 1; + } else { + l = c; + } + } + if (ranges[l].start <= code && code <= ranges[l].end) { + gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff; + } + return { + charCode: code, + glyphId: gid + }; +} +function compileGlyf(code, cmds, font) { + function moveTo(x, y) { + cmds.add("M", [x, y]); + } + function lineTo(x, y) { + cmds.add("L", [x, y]); + } + function quadraticCurveTo(xa, ya, x, y) { + cmds.add("Q", [xa, ya, x, y]); + } + let i = 0; + const numberOfContours = getInt16(code, i); + let flags; + let x = 0, + y = 0; + i += 10; + if (numberOfContours < 0) { + do { + flags = getUint16(code, i); + const glyphIndex = getUint16(code, i + 2); + i += 4; + let arg1, arg2; + if (flags & 0x01) { + if (flags & 0x02) { + arg1 = getInt16(code, i); + arg2 = getInt16(code, i + 2); + } else { + arg1 = getUint16(code, i); + arg2 = getUint16(code, i + 2); + } + i += 4; + } else if (flags & 0x02) { + arg1 = getInt8(code, i++); + arg2 = getInt8(code, i++); + } else { + arg1 = code[i++]; + arg2 = code[i++]; + } + if (flags & 0x02) { + x = arg1; + y = arg2; + } else { + x = 0; + y = 0; + } + let scaleX = 1, + scaleY = 1, + scale01 = 0, + scale10 = 0; + if (flags & 0x08) { + scaleX = scaleY = getFloat214(code, i); + i += 2; + } else if (flags & 0x40) { + scaleX = getFloat214(code, i); + scaleY = getFloat214(code, i + 2); + i += 4; + } else if (flags & 0x80) { + scaleX = getFloat214(code, i); + scale01 = getFloat214(code, i + 2); + scale10 = getFloat214(code, i + 4); + scaleY = getFloat214(code, i + 6); + i += 8; + } + const subglyph = font.glyphs[glyphIndex]; + if (subglyph) { + cmds.save(); + cmds.transform([scaleX, scale01, scale10, scaleY, x, y]); + if (!(flags & 0x02)) {} + compileGlyf(subglyph, cmds, font); + cmds.restore(); + } + } while (flags & 0x20); + } else { + const endPtsOfContours = []; + let j, jj; + for (j = 0; j < numberOfContours; j++) { + endPtsOfContours.push(getUint16(code, i)); + i += 2; + } + const instructionLength = getUint16(code, i); + i += 2 + instructionLength; + const numberOfPoints = endPtsOfContours.at(-1) + 1; + const points = []; + while (points.length < numberOfPoints) { + flags = code[i++]; + let repeat = 1; + if (flags & 0x08) { + repeat += code[i++]; + } + while (repeat-- > 0) { + points.push({ + flags + }); + } + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x12) { + case 0x00: + x += getInt16(code, i); + i += 2; + break; + case 0x02: + x -= code[i++]; + break; + case 0x12: + x += code[i++]; + break; + } + points[j].x = x; + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x24) { + case 0x00: + y += getInt16(code, i); + i += 2; + break; + case 0x04: + y -= code[i++]; + break; + case 0x24: + y += code[i++]; + break; + } + points[j].y = y; + } + let startPoint = 0; + for (i = 0; i < numberOfContours; i++) { + const endPoint = endPtsOfContours[i]; + const contour = points.slice(startPoint, endPoint + 1); + if (contour[0].flags & 1) { + contour.push(contour[0]); + } else if (contour.at(-1).flags & 1) { + contour.unshift(contour.at(-1)); + } else { + const p = { + flags: 1, + x: (contour[0].x + contour.at(-1).x) / 2, + y: (contour[0].y + contour.at(-1).y) / 2 + }; + contour.unshift(p); + contour.push(p); + } + moveTo(contour[0].x, contour[0].y); + for (j = 1, jj = contour.length; j < jj; j++) { + if (contour[j].flags & 1) { + lineTo(contour[j].x, contour[j].y); + } else if (contour[j + 1].flags & 1) { + quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); + j++; + } else { + quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); + } + } + startPoint = endPoint + 1; + } + } +} +function compileCharString(charStringCode, cmds, font, glyphId) { + function moveTo(x, y) { + cmds.add("M", [x, y]); + } + function lineTo(x, y) { + cmds.add("L", [x, y]); + } + function bezierCurveTo(x1, y1, x2, y2, x, y) { + cmds.add("C", [x1, y1, x2, y2, x, y]); + } + const stack = []; + let x = 0, + y = 0; + let stems = 0; + function parse(code) { + let i = 0; + while (i < code.length) { + let stackClean = false; + let v = code[i++]; + let xa, xb, ya, yb, y1, y2, y3, n, subrCode; + switch (v) { + case 1: + stems += stack.length >> 1; + stackClean = true; + break; + case 3: + stems += stack.length >> 1; + stackClean = true; + break; + case 4: + y += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 5: + while (stack.length > 0) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + break; + case 6: + while (stack.length > 0) { + x += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + y += stack.shift(); + lineTo(x, y); + } + break; + case 7: + while (stack.length > 0) { + y += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + x += stack.shift(); + lineTo(x, y); + } + break; + case 8: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 10: + n = stack.pop(); + subrCode = null; + if (font.isCFFCIDFont) { + const fdIndex = font.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < font.fdArray.length) { + const fontDict = font.fdArray[fdIndex]; + let subrs; + if (fontDict.privateDict?.subrsIndex) { + subrs = fontDict.privateDict.subrsIndex.objects; + } + if (subrs) { + n += getSubroutineBias(subrs); + subrCode = subrs[n]; + } + } else { + warn("Invalid fd index for glyph index."); + } + } else { + subrCode = font.subrs[n + font.subrsBias]; + } + if (subrCode) { + parse(subrCode); + } + break; + case 11: + return; + case 12: + v = code[i++]; + switch (v) { + case 34: + xa = x + stack.shift(); + xb = xa + stack.shift(); + y1 = y + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y, xb, y1, x, y1); + xa = x + stack.shift(); + xb = xa + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y, x, y); + break; + case 35: + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + stack.pop(); + break; + case 36: + xa = x + stack.shift(); + y1 = y + stack.shift(); + xb = xa + stack.shift(); + y2 = y1 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y2, x, y2); + xa = x + stack.shift(); + xb = xa + stack.shift(); + y3 = y2 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y2, xb, y3, x, y); + break; + case 37: + const x0 = x, + y0 = y; + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb; + if (Math.abs(x - x0) > Math.abs(y - y0)) { + x += stack.shift(); + } else { + y += stack.shift(); + } + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + default: + throw new FormatError(`unknown operator: 12 ${v}`); + } + break; + case 14: + if (stack.length >= 4) { + const achar = stack.pop(); + const bchar = stack.pop(); + y = stack.pop(); + x = stack.pop(); + cmds.save(); + cmds.translate(x, y); + let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + cmds.restore(); + cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + } + return; + case 18: + stems += stack.length >> 1; + stackClean = true; + break; + case 19: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 20: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 21: + y += stack.pop(); + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 22: + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 23: + stems += stack.length >> 1; + stackClean = true; + break; + case 24: + while (stack.length > 2) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + break; + case 25: + while (stack.length > 6) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + case 26: + if (stack.length % 2) { + x += stack.shift(); + } + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 27: + if (stack.length % 2) { + y += stack.shift(); + } + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb; + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 28: + stack.push((code[i] << 24 | code[i + 1] << 16) >> 16); + i += 2; + break; + case 29: + n = stack.pop() + font.gsubrsBias; + subrCode = font.gsubrs[n]; + if (subrCode) { + parse(subrCode); + } + break; + case 30: + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 31: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + default: + if (v < 32) { + throw new FormatError(`unknown operator: ${v}`); + } + if (v < 247) { + stack.push(v - 139); + } else if (v < 251) { + stack.push((v - 247) * 256 + code[i++] + 108); + } else if (v < 255) { + stack.push(-(v - 251) * 256 - code[i++] - 108); + } else { + stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); + i += 4; + } + break; + } + if (stackClean) { + stack.length = 0; + } + } + } + parse(charStringCode); +} +const NOOP = ""; +class Commands { + cmds = []; + transformStack = []; + currentTransform = [1, 0, 0, 1, 0, 0]; + add(cmd, args) { + if (args) { + const [a, b, c, d, e, f] = this.currentTransform; + for (let i = 0, ii = args.length; i < ii; i += 2) { + const x = args[i]; + const y = args[i + 1]; + args[i] = a * x + c * y + e; + args[i + 1] = b * x + d * y + f; + } + this.cmds.push(`${cmd}${args.join(" ")}`); + } else { + this.cmds.push(cmd); + } + } + transform(transf) { + this.currentTransform = Util.transform(this.currentTransform, transf); + } + translate(x, y) { + this.transform([1, 0, 0, 1, x, y]); + } + save() { + this.transformStack.push(this.currentTransform.slice()); + } + restore() { + this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0]; + } + getSVG() { + return this.cmds.join(""); + } +} +class CompiledFont { + constructor(fontMatrix) { + this.fontMatrix = fontMatrix; + this.compiledGlyphs = Object.create(null); + this.compiledCharCodeToGlyphId = Object.create(null); + } + getPathJs(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + let fn = this.compiledGlyphs[glyphId], + compileEx; + if (fn === undefined) { + try { + fn = this.compileGlyph(this.glyphs[glyphId], glyphId); + } catch (ex) { + fn = NOOP; + compileEx = ex; + } + this.compiledGlyphs[glyphId] = fn; + } + this.compiledCharCodeToGlyphId[charCode] ??= glyphId; + if (compileEx) { + throw compileEx; + } + return fn; + } + compileGlyph(code, glyphId) { + if (!code?.length || code[0] === 14) { + return NOOP; + } + let fontMatrix = this.fontMatrix; + if (this.isCFFCIDFont) { + const fdIndex = this.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < this.fdArray.length) { + const fontDict = this.fdArray[fdIndex]; + fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX; + } else { + warn("Invalid fd index for glyph index."); + } + } + assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix."); + const cmds = new Commands(); + cmds.transform(fontMatrix.slice()); + this.compileGlyphImpl(code, cmds, glyphId); + cmds.add("Z"); + return cmds.getSVG(); + } + compileGlyphImpl() { + unreachable("Children classes should implement this."); + } + hasBuiltPath(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined; + } +} +class TrueTypeCompiled extends CompiledFont { + constructor(glyphs, cmap, fontMatrix) { + super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); + this.glyphs = glyphs; + this.cmap = cmap; + } + compileGlyphImpl(code, cmds) { + compileGlyf(code, cmds, this); + } +} +class Type2Compiled extends CompiledFont { + constructor(cffInfo, cmap, fontMatrix) { + super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]); + this.glyphs = cffInfo.glyphs; + this.gsubrs = cffInfo.gsubrs || []; + this.subrs = cffInfo.subrs || []; + this.cmap = cmap; + this.glyphNameMap = getGlyphsUnicode(); + this.gsubrsBias = getSubroutineBias(this.gsubrs); + this.subrsBias = getSubroutineBias(this.subrs); + this.isCFFCIDFont = cffInfo.isCFFCIDFont; + this.fdSelect = cffInfo.fdSelect; + this.fdArray = cffInfo.fdArray; + } + compileGlyphImpl(code, cmds, glyphId) { + compileCharString(code, cmds, this, glyphId); + } +} +class FontRendererFactory { + static create(font, seacAnalysisEnabled) { + const data = new Uint8Array(font.data); + let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; + const numTables = getUint16(data, 4); + for (let i = 0, p = 12; i < numTables; i++, p += 16) { + const tag = bytesToString(data.subarray(p, p + 4)); + const offset = getUint32(data, p + 8); + const length = getUint32(data, p + 12); + switch (tag) { + case "cmap": + cmap = parseCmap(data, offset, offset + length); + break; + case "glyf": + glyf = data.subarray(offset, offset + length); + break; + case "loca": + loca = data.subarray(offset, offset + length); + break; + case "head": + unitsPerEm = getUint16(data, offset + 18); + indexToLocFormat = getUint16(data, offset + 50); + break; + case "CFF ": + cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); + break; + } + } + if (glyf) { + const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; + return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); + } + return new Type2Compiled(cff, cmap, font.fontMatrix); + } +} + +;// ./src/core/metrics.js + +const getMetrics = getLookupTableFactory(function (t) { + t.Courier = 600; + t["Courier-Bold"] = 600; + t["Courier-BoldOblique"] = 600; + t["Courier-Oblique"] = 600; + t.Helvetica = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Bold"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Oblique"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t.Symbol = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.universal = 713; + t.numbersign = 500; + t.existential = 549; + t.percent = 833; + t.ampersand = 778; + t.suchthat = 439; + t.parenleft = 333; + t.parenright = 333; + t.asteriskmath = 500; + t.plus = 549; + t.comma = 250; + t.minus = 549; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 549; + t.equal = 549; + t.greater = 549; + t.question = 444; + t.congruent = 549; + t.Alpha = 722; + t.Beta = 667; + t.Chi = 722; + t.Delta = 612; + t.Epsilon = 611; + t.Phi = 763; + t.Gamma = 603; + t.Eta = 722; + t.Iota = 333; + t.theta1 = 631; + t.Kappa = 722; + t.Lambda = 686; + t.Mu = 889; + t.Nu = 722; + t.Omicron = 722; + t.Pi = 768; + t.Theta = 741; + t.Rho = 556; + t.Sigma = 592; + t.Tau = 611; + t.Upsilon = 690; + t.sigma1 = 439; + t.Omega = 768; + t.Xi = 645; + t.Psi = 795; + t.Zeta = 611; + t.bracketleft = 333; + t.therefore = 863; + t.bracketright = 333; + t.perpendicular = 658; + t.underscore = 500; + t.radicalex = 500; + t.alpha = 631; + t.beta = 549; + t.chi = 549; + t.delta = 494; + t.epsilon = 439; + t.phi = 521; + t.gamma = 411; + t.eta = 603; + t.iota = 329; + t.phi1 = 603; + t.kappa = 549; + t.lambda = 549; + t.mu = 576; + t.nu = 521; + t.omicron = 549; + t.pi = 549; + t.theta = 521; + t.rho = 549; + t.sigma = 603; + t.tau = 439; + t.upsilon = 576; + t.omega1 = 713; + t.omega = 686; + t.xi = 493; + t.psi = 686; + t.zeta = 494; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.similar = 549; + t.Euro = 750; + t.Upsilon1 = 620; + t.minute = 247; + t.lessequal = 549; + t.fraction = 167; + t.infinity = 713; + t.florin = 500; + t.club = 753; + t.diamond = 753; + t.heart = 753; + t.spade = 753; + t.arrowboth = 1042; + t.arrowleft = 987; + t.arrowup = 603; + t.arrowright = 987; + t.arrowdown = 603; + t.degree = 400; + t.plusminus = 549; + t.second = 411; + t.greaterequal = 549; + t.multiply = 549; + t.proportional = 713; + t.partialdiff = 494; + t.bullet = 460; + t.divide = 549; + t.notequal = 549; + t.equivalence = 549; + t.approxequal = 549; + t.ellipsis = 1000; + t.arrowvertex = 603; + t.arrowhorizex = 1000; + t.carriagereturn = 658; + t.aleph = 823; + t.Ifraktur = 686; + t.Rfraktur = 795; + t.weierstrass = 987; + t.circlemultiply = 768; + t.circleplus = 768; + t.emptyset = 823; + t.intersection = 768; + t.union = 768; + t.propersuperset = 713; + t.reflexsuperset = 713; + t.notsubset = 713; + t.propersubset = 713; + t.reflexsubset = 713; + t.element = 713; + t.notelement = 713; + t.angle = 768; + t.gradient = 713; + t.registerserif = 790; + t.copyrightserif = 790; + t.trademarkserif = 890; + t.product = 823; + t.radical = 549; + t.dotmath = 250; + t.logicalnot = 713; + t.logicaland = 603; + t.logicalor = 603; + t.arrowdblboth = 1042; + t.arrowdblleft = 987; + t.arrowdblup = 603; + t.arrowdblright = 987; + t.arrowdbldown = 603; + t.lozenge = 494; + t.angleleft = 329; + t.registersans = 790; + t.copyrightsans = 790; + t.trademarksans = 786; + t.summation = 713; + t.parenlefttp = 384; + t.parenleftex = 384; + t.parenleftbt = 384; + t.bracketlefttp = 384; + t.bracketleftex = 384; + t.bracketleftbt = 384; + t.bracelefttp = 494; + t.braceleftmid = 494; + t.braceleftbt = 494; + t.braceex = 494; + t.angleright = 329; + t.integral = 274; + t.integraltp = 686; + t.integralex = 686; + t.integralbt = 686; + t.parenrighttp = 384; + t.parenrightex = 384; + t.parenrightbt = 384; + t.bracketrighttp = 384; + t.bracketrightex = 384; + t.bracketrightbt = 384; + t.bracerighttp = 494; + t.bracerightmid = 494; + t.bracerightbt = 494; + t.apple = 790; + }); + t["Times-Roman"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 408; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 564; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 564; + t.equal = 564; + t.greater = 564; + t.question = 444; + t.at = 921; + t.A = 722; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 556; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 389; + t.K = 722; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 556; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 722; + t.W = 944; + t.X = 722; + t.Y = 722; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 469; + t.underscore = 500; + t.quoteleft = 333; + t.a = 444; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 333; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.asciitilde = 541; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 180; + t.quotedblleft = 444; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 453; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 444; + t.quotedblright = 444; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 444; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 889; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 444; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 564; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 444; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 444; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 444; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 444; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 444; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 444; + t.Amacron = 722; + t.rcaron = 333; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 556; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 588; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 564; + t.uacute = 500; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 444; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 722; + t.Iacute = 333; + t.plusminus = 564; + t.brokenbar = 200; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 333; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 326; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 444; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 344; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 722; + t.zdotaccent = 444; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 500; + t.minus = 564; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 564; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Bold"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 1000; + t.ampersand = 833; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 930; + t.A = 722; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 778; + t.L = 667; + t.M = 944; + t.N = 722; + t.O = 778; + t.P = 611; + t.Q = 778; + t.R = 722; + t.S = 556; + t.T = 667; + t.U = 722; + t.V = 722; + t.W = 1000; + t.X = 722; + t.Y = 722; + t.Z = 667; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 581; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 556; + t.c = 444; + t.d = 556; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 333; + t.k = 556; + t.l = 278; + t.m = 833; + t.n = 556; + t.o = 500; + t.p = 556; + t.q = 556; + t.r = 444; + t.s = 389; + t.t = 333; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 394; + t.bar = 220; + t.braceright = 394; + t.asciitilde = 520; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 540; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 300; + t.Lslash = 667; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 330; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 556; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 570; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 667; + t.Cacute = 722; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 722; + t.rcaron = 444; + t.ccedilla = 444; + t.Zdotaccent = 667; + t.Thorn = 611; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 556; + t.dcaron = 672; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 667; + t.partialdiff = 494; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 778; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 444; + t.omacron = 500; + t.Zacute = 667; + t.Zcaron = 667; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 416; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 300; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 394; + t.Kcommaaccent = 778; + t.Lacute = 667; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 667; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 444; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 722; + t.Lcommaaccent = 667; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 444; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 556; + t.minus = 570; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 333; + t.logicalnot = 570; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-BoldItalic"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 389; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 832; + t.A = 667; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 667; + t.F = 667; + t.G = 722; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 667; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 889; + t.X = 667; + t.Y = 611; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 570; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 556; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 556; + t.v = 444; + t.w = 667; + t.x = 500; + t.y = 444; + t.z = 389; + t.braceleft = 348; + t.bar = 220; + t.braceright = 348; + t.asciitilde = 570; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 500; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 944; + t.ordfeminine = 266; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 300; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 611; + t.divide = 570; + t.Yacute = 611; + t.Acircumflex = 667; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 667; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 608; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 444; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 722; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 366; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 576; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 382; + t.Kcommaaccent = 667; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 500; + t.minus = 606; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 606; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Italic"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 420; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 675; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 675; + t.equal = 675; + t.greater = 675; + t.question = 500; + t.at = 920; + t.A = 611; + t.B = 611; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 611; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 444; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 667; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 611; + t.S = 500; + t.T = 556; + t.U = 722; + t.V = 611; + t.W = 833; + t.X = 611; + t.Y = 556; + t.Z = 556; + t.bracketleft = 389; + t.backslash = 278; + t.bracketright = 389; + t.asciicircum = 422; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 278; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 444; + t.l = 278; + t.m = 722; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 444; + t.w = 667; + t.x = 444; + t.y = 444; + t.z = 389; + t.braceleft = 400; + t.bar = 275; + t.braceright = 400; + t.asciitilde = 541; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 214; + t.quotedblleft = 556; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 523; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 556; + t.quotedblright = 556; + t.guillemotright = 500; + t.ellipsis = 889; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 889; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 556; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 667; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 556; + t.divide = 675; + t.Yacute = 556; + t.Acircumflex = 611; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 667; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 556; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 611; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 500; + t.Amacron = 611; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 556; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 611; + t.Sacute = 500; + t.dcaron = 544; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 611; + t.Abreve = 611; + t.multiply = 675; + t.uacute = 500; + t.Tcaron = 556; + t.partialdiff = 476; + t.ydieresis = 444; + t.Nacute = 667; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 667; + t.Iacute = 333; + t.plusminus = 675; + t.brokenbar = 275; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 389; + t.omacron = 500; + t.Zacute = 556; + t.Zcaron = 556; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 300; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 611; + t.Adieresis = 611; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 500; + t.lcaron = 300; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 500; + t.Scommaaccent = 500; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 667; + t.otilde = 500; + t.Rcommaaccent = 611; + t.Lcommaaccent = 556; + t.Atilde = 611; + t.Aogonek = 611; + t.Aring = 611; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 444; + t.minus = 675; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 675; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t.ZapfDingbats = getLookupTableFactory(function (t) { + t.space = 278; + t.a1 = 974; + t.a2 = 961; + t.a202 = 974; + t.a3 = 980; + t.a4 = 719; + t.a5 = 789; + t.a119 = 790; + t.a118 = 791; + t.a117 = 690; + t.a11 = 960; + t.a12 = 939; + t.a13 = 549; + t.a14 = 855; + t.a15 = 911; + t.a16 = 933; + t.a105 = 911; + t.a17 = 945; + t.a18 = 974; + t.a19 = 755; + t.a20 = 846; + t.a21 = 762; + t.a22 = 761; + t.a23 = 571; + t.a24 = 677; + t.a25 = 763; + t.a26 = 760; + t.a27 = 759; + t.a28 = 754; + t.a6 = 494; + t.a7 = 552; + t.a8 = 537; + t.a9 = 577; + t.a10 = 692; + t.a29 = 786; + t.a30 = 788; + t.a31 = 788; + t.a32 = 790; + t.a33 = 793; + t.a34 = 794; + t.a35 = 816; + t.a36 = 823; + t.a37 = 789; + t.a38 = 841; + t.a39 = 823; + t.a40 = 833; + t.a41 = 816; + t.a42 = 831; + t.a43 = 923; + t.a44 = 744; + t.a45 = 723; + t.a46 = 749; + t.a47 = 790; + t.a48 = 792; + t.a49 = 695; + t.a50 = 776; + t.a51 = 768; + t.a52 = 792; + t.a53 = 759; + t.a54 = 707; + t.a55 = 708; + t.a56 = 682; + t.a57 = 701; + t.a58 = 826; + t.a59 = 815; + t.a60 = 789; + t.a61 = 789; + t.a62 = 707; + t.a63 = 687; + t.a64 = 696; + t.a65 = 689; + t.a66 = 786; + t.a67 = 787; + t.a68 = 713; + t.a69 = 791; + t.a70 = 785; + t.a71 = 791; + t.a72 = 873; + t.a73 = 761; + t.a74 = 762; + t.a203 = 762; + t.a75 = 759; + t.a204 = 759; + t.a76 = 892; + t.a77 = 892; + t.a78 = 788; + t.a79 = 784; + t.a81 = 438; + t.a82 = 138; + t.a83 = 277; + t.a84 = 415; + t.a97 = 392; + t.a98 = 392; + t.a99 = 668; + t.a100 = 668; + t.a89 = 390; + t.a90 = 390; + t.a93 = 317; + t.a94 = 317; + t.a91 = 276; + t.a92 = 276; + t.a205 = 509; + t.a85 = 509; + t.a206 = 410; + t.a86 = 410; + t.a87 = 234; + t.a88 = 234; + t.a95 = 334; + t.a96 = 334; + t.a101 = 732; + t.a102 = 544; + t.a103 = 544; + t.a104 = 910; + t.a106 = 667; + t.a107 = 760; + t.a108 = 760; + t.a112 = 776; + t.a111 = 595; + t.a110 = 694; + t.a109 = 626; + t.a120 = 788; + t.a121 = 788; + t.a122 = 788; + t.a123 = 788; + t.a124 = 788; + t.a125 = 788; + t.a126 = 788; + t.a127 = 788; + t.a128 = 788; + t.a129 = 788; + t.a130 = 788; + t.a131 = 788; + t.a132 = 788; + t.a133 = 788; + t.a134 = 788; + t.a135 = 788; + t.a136 = 788; + t.a137 = 788; + t.a138 = 788; + t.a139 = 788; + t.a140 = 788; + t.a141 = 788; + t.a142 = 788; + t.a143 = 788; + t.a144 = 788; + t.a145 = 788; + t.a146 = 788; + t.a147 = 788; + t.a148 = 788; + t.a149 = 788; + t.a150 = 788; + t.a151 = 788; + t.a152 = 788; + t.a153 = 788; + t.a154 = 788; + t.a155 = 788; + t.a156 = 788; + t.a157 = 788; + t.a158 = 788; + t.a159 = 788; + t.a160 = 894; + t.a161 = 838; + t.a163 = 1016; + t.a164 = 458; + t.a196 = 748; + t.a165 = 924; + t.a192 = 748; + t.a166 = 918; + t.a167 = 927; + t.a168 = 928; + t.a169 = 928; + t.a170 = 834; + t.a171 = 873; + t.a172 = 828; + t.a173 = 924; + t.a162 = 924; + t.a174 = 917; + t.a175 = 930; + t.a176 = 931; + t.a177 = 463; + t.a178 = 883; + t.a179 = 836; + t.a193 = 836; + t.a180 = 867; + t.a199 = 867; + t.a181 = 696; + t.a200 = 696; + t.a182 = 874; + t.a201 = 874; + t.a183 = 760; + t.a184 = 946; + t.a197 = 771; + t.a185 = 865; + t.a194 = 771; + t.a198 = 888; + t.a186 = 967; + t.a195 = 888; + t.a187 = 831; + t.a188 = 873; + t.a189 = 927; + t.a190 = 970; + t.a191 = 918; + }); +}); +const getFontBasicMetrics = getLookupTableFactory(function (t) { + t.Courier = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: -426 + }; + t["Courier-Bold"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 439 + }; + t["Courier-Oblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426 + }; + t["Courier-BoldOblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426 + }; + t.Helvetica = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523 + }; + t["Helvetica-Bold"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532 + }; + t["Helvetica-Oblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523 + }; + t["Helvetica-BoldOblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532 + }; + t["Times-Roman"] = { + ascent: 683, + descent: -217, + capHeight: 662, + xHeight: 450 + }; + t["Times-Bold"] = { + ascent: 683, + descent: -217, + capHeight: 676, + xHeight: 461 + }; + t["Times-Italic"] = { + ascent: 683, + descent: -217, + capHeight: 653, + xHeight: 441 + }; + t["Times-BoldItalic"] = { + ascent: 683, + descent: -217, + capHeight: 669, + xHeight: 462 + }; + t.Symbol = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN + }; + t.ZapfDingbats = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN + }; +}); + +;// ./src/core/glyf.js +const ON_CURVE_POINT = 1 << 0; +const X_SHORT_VECTOR = 1 << 1; +const Y_SHORT_VECTOR = 1 << 2; +const REPEAT_FLAG = 1 << 3; +const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; +const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; +const OVERLAP_SIMPLE = 1 << 6; +const ARG_1_AND_2_ARE_WORDS = 1 << 0; +const ARGS_ARE_XY_VALUES = 1 << 1; +const WE_HAVE_A_SCALE = 1 << 3; +const MORE_COMPONENTS = 1 << 5; +const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +const WE_HAVE_A_TWO_BY_TWO = 1 << 7; +const WE_HAVE_INSTRUCTIONS = 1 << 8; +class GlyfTable { + constructor({ + glyfTable, + isGlyphLocationsLong, + locaTable, + numGlyphs + }) { + this.glyphs = []; + const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const offsetSize = isGlyphLocationsLong ? 4 : 2; + let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); + let pos = 0; + for (let i = 0; i < numGlyphs; i++) { + pos += offsetSize; + const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); + if (next === prev) { + this.glyphs.push(new Glyph({})); + continue; + } + const glyph = Glyph.parse(prev, glyf); + this.glyphs.push(glyph); + prev = next; + } + } + getSize() { + return this.glyphs.reduce((a, g) => { + const size = g.getSize(); + return a + (size + 3 & ~3); + }, 0); + } + write() { + const totalSize = this.getSize(); + const glyfTable = new DataView(new ArrayBuffer(totalSize)); + const isLocationLong = totalSize > 0x1fffe; + const offsetSize = isLocationLong ? 4 : 2; + const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); + if (isLocationLong) { + locaTable.setUint32(0, 0); + } else { + locaTable.setUint16(0, 0); + } + let pos = 0; + let locaIndex = 0; + for (const glyph of this.glyphs) { + pos += glyph.write(pos, glyfTable); + pos = pos + 3 & ~3; + locaIndex += offsetSize; + if (isLocationLong) { + locaTable.setUint32(locaIndex, pos); + } else { + locaTable.setUint16(locaIndex, pos >> 1); + } + } + return { + isLocationLong, + loca: new Uint8Array(locaTable.buffer), + glyf: new Uint8Array(glyfTable.buffer) + }; + } + scale(factors) { + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + this.glyphs[i].scale(factors[i]); + } + } +} +class Glyph { + constructor({ + header = null, + simple = null, + composites = null + }) { + this.header = header; + this.simple = simple; + this.composites = composites; + } + static parse(pos, glyf) { + const [read, header] = GlyphHeader.parse(pos, glyf); + pos += read; + if (header.numberOfContours < 0) { + const composites = []; + while (true) { + const [n, composite] = CompositeGlyph.parse(pos, glyf); + pos += n; + composites.push(composite); + if (!(composite.flags & MORE_COMPONENTS)) { + break; + } + } + return new Glyph({ + header, + composites + }); + } + const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); + return new Glyph({ + header, + simple + }); + } + getSize() { + if (!this.header) { + return 0; + } + const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0); + return this.header.getSize() + size; + } + write(pos, buf) { + if (!this.header) { + return 0; + } + const spos = pos; + pos += this.header.write(pos, buf); + if (this.simple) { + pos += this.simple.write(pos, buf); + } else { + for (const composite of this.composites) { + pos += composite.write(pos, buf); + } + } + return pos - spos; + } + scale(factor) { + if (!this.header) { + return; + } + const xMiddle = (this.header.xMin + this.header.xMax) / 2; + this.header.scale(xMiddle, factor); + if (this.simple) { + this.simple.scale(xMiddle, factor); + } else { + for (const composite of this.composites) { + composite.scale(xMiddle, factor); + } + } + } +} +class GlyphHeader { + constructor({ + numberOfContours, + xMin, + yMin, + xMax, + yMax + }) { + this.numberOfContours = numberOfContours; + this.xMin = xMin; + this.yMin = yMin; + this.xMax = xMax; + this.yMax = yMax; + } + static parse(pos, glyf) { + return [10, new GlyphHeader({ + numberOfContours: glyf.getInt16(pos), + xMin: glyf.getInt16(pos + 2), + yMin: glyf.getInt16(pos + 4), + xMax: glyf.getInt16(pos + 6), + yMax: glyf.getInt16(pos + 8) + })]; + } + getSize() { + return 10; + } + write(pos, buf) { + buf.setInt16(pos, this.numberOfContours); + buf.setInt16(pos + 2, this.xMin); + buf.setInt16(pos + 4, this.yMin); + buf.setInt16(pos + 6, this.xMax); + buf.setInt16(pos + 8, this.yMax); + return 10; + } + scale(x, factor) { + this.xMin = Math.round(x + (this.xMin - x) * factor); + this.xMax = Math.round(x + (this.xMax - x) * factor); + } +} +class Contour { + constructor({ + flags, + xCoordinates, + yCoordinates + }) { + this.xCoordinates = xCoordinates; + this.yCoordinates = yCoordinates; + this.flags = flags; + } +} +class SimpleGlyph { + constructor({ + contours, + instructions + }) { + this.contours = contours; + this.instructions = instructions; + } + static parse(pos, glyf, numberOfContours) { + const endPtsOfContours = []; + for (let i = 0; i < numberOfContours; i++) { + const endPt = glyf.getUint16(pos); + pos += 2; + endPtsOfContours.push(endPt); + } + const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; + const instructionLength = glyf.getUint16(pos); + pos += 2; + const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + const flags = []; + for (let i = 0; i < numberOfPt; pos++, i++) { + let flag = glyf.getUint8(pos); + flags.push(flag); + if (flag & REPEAT_FLAG) { + const count = glyf.getUint8(++pos); + flag ^= REPEAT_FLAG; + for (let m = 0; m < count; m++) { + flags.push(flag); + } + i += count; + } + } + const allXCoordinates = []; + let xCoordinates = []; + let yCoordinates = []; + let pointFlags = []; + const contours = []; + let endPtsOfContoursIndex = 0; + let lastCoordinate = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + const x = glyf.getUint8(pos++); + lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; + xCoordinates.push(lastCoordinate); + } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { + xCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + xCoordinates.push(lastCoordinate); + } + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + endPtsOfContoursIndex++; + allXCoordinates.push(xCoordinates); + xCoordinates = []; + } + } + lastCoordinate = 0; + endPtsOfContoursIndex = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + const y = glyf.getUint8(pos++); + lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; + yCoordinates.push(lastCoordinate); + } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { + yCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + yCoordinates.push(lastCoordinate); + } + pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + xCoordinates = allXCoordinates[endPtsOfContoursIndex]; + endPtsOfContoursIndex++; + contours.push(new Contour({ + flags: pointFlags, + xCoordinates, + yCoordinates + })); + yCoordinates = []; + pointFlags = []; + } + } + return new SimpleGlyph({ + contours, + instructions + }); + } + getSize() { + let size = this.contours.length * 2 + 2 + this.instructions.length; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + size += contour.flags.length; + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + const x = contour.xCoordinates[i]; + const y = contour.yCoordinates[i]; + let abs = Math.abs(x - lastX); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastX = x; + abs = Math.abs(y - lastY); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastY = y; + } + } + return size; + } + write(pos, buf) { + const spos = pos; + const xCoordinates = []; + const yCoordinates = []; + const flags = []; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + let flag = contour.flags[i]; + const x = contour.xCoordinates[i]; + let delta = x - lastX; + if (delta === 0) { + flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; + xCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; + xCoordinates.push(abs); + } else { + xCoordinates.push(delta); + } + } + lastX = x; + const y = contour.yCoordinates[i]; + delta = y - lastY; + if (delta === 0) { + flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; + yCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; + yCoordinates.push(abs); + } else { + yCoordinates.push(delta); + } + } + lastY = y; + flags.push(flag); + } + buf.setUint16(pos, xCoordinates.length - 1); + pos += 2; + } + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + for (const flag of flags) { + buf.setUint8(pos++, flag); + } + for (let i = 0, ii = xCoordinates.length; i < ii; i++) { + const x = xCoordinates[i]; + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + buf.setUint8(pos++, x); + } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { + buf.setInt16(pos, x); + pos += 2; + } + } + for (let i = 0, ii = yCoordinates.length; i < ii; i++) { + const y = yCoordinates[i]; + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + buf.setUint8(pos++, y); + } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { + buf.setInt16(pos, y); + pos += 2; + } + } + return pos - spos; + } + scale(x, factor) { + for (const contour of this.contours) { + if (contour.xCoordinates.length === 0) { + continue; + } + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); + } + } + } +} +class CompositeGlyph { + constructor({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + }) { + this.flags = flags; + this.glyphIndex = glyphIndex; + this.argument1 = argument1; + this.argument2 = argument2; + this.transf = transf; + this.instructions = instructions; + } + static parse(pos, glyf) { + const spos = pos; + const transf = []; + let flags = glyf.getUint16(pos); + const glyphIndex = glyf.getUint16(pos + 2); + pos += 4; + let argument1, argument2; + if (flags & ARG_1_AND_2_ARE_WORDS) { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt16(pos); + argument2 = glyf.getInt16(pos + 2); + } else { + argument1 = glyf.getUint16(pos); + argument2 = glyf.getUint16(pos + 2); + } + pos += 4; + flags ^= ARG_1_AND_2_ARE_WORDS; + } else { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt8(pos); + argument2 = glyf.getInt8(pos + 1); + } else { + argument1 = glyf.getUint8(pos); + argument2 = glyf.getUint8(pos + 1); + } + pos += 2; + } + if (flags & WE_HAVE_A_SCALE) { + transf.push(glyf.getUint16(pos)); + pos += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); + pos += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); + pos += 8; + } + let instructions = null; + if (flags & WE_HAVE_INSTRUCTIONS) { + const instructionLength = glyf.getUint16(pos); + pos += 2; + instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + } + return [pos - spos, new CompositeGlyph({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + })]; + } + getSize() { + let size = 2 + 2 + this.transf.length * 2; + if (this.flags & WE_HAVE_INSTRUCTIONS) { + size += 2 + this.instructions.length; + } + size += 2; + if (this.flags & 2) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + size += 2; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + size += 2; + } + return size; + } + write(pos, buf) { + const spos = pos; + if (this.flags & ARGS_ARE_XY_VALUES) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + buf.setUint16(pos, this.flags); + buf.setUint16(pos + 2, this.glyphIndex); + pos += 4; + if (this.flags & ARG_1_AND_2_ARE_WORDS) { + if (this.flags & ARGS_ARE_XY_VALUES) { + buf.setInt16(pos, this.argument1); + buf.setInt16(pos + 2, this.argument2); + } else { + buf.setUint16(pos, this.argument1); + buf.setUint16(pos + 2, this.argument2); + } + pos += 4; + } else { + buf.setUint8(pos, this.argument1); + buf.setUint8(pos + 1, this.argument2); + pos += 2; + } + if (this.flags & WE_HAVE_INSTRUCTIONS) { + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + } + return pos - spos; + } + scale(x, factor) {} +} + +;// ./src/core/opentype_file_builder.js + + +function writeInt16(dest, offset, num) { + dest[offset] = num >> 8 & 0xff; + dest[offset + 1] = num & 0xff; +} +function writeInt32(dest, offset, num) { + dest[offset] = num >> 24 & 0xff; + dest[offset + 1] = num >> 16 & 0xff; + dest[offset + 2] = num >> 8 & 0xff; + dest[offset + 3] = num & 0xff; +} +function writeData(dest, offset, data) { + if (data instanceof Uint8Array) { + dest.set(data, offset); + } else if (typeof data === "string") { + for (let i = 0, ii = data.length; i < ii; i++) { + dest[offset++] = data.charCodeAt(i) & 0xff; + } + } else { + for (const num of data) { + dest[offset++] = num & 0xff; + } + } +} +const OTF_HEADER_SIZE = 12; +const OTF_TABLE_ENTRY_SIZE = 16; +class OpenTypeFileBuilder { + constructor(sfnt) { + this.sfnt = sfnt; + this.tables = Object.create(null); + } + static getSearchParams(entriesCount, entrySize) { + let maxPower2 = 1, + log2 = 0; + while ((maxPower2 ^ entriesCount) > maxPower2) { + maxPower2 <<= 1; + log2++; + } + const searchRange = maxPower2 * entrySize; + return { + range: searchRange, + entry: log2, + rangeShift: entrySize * entriesCount - searchRange + }; + } + toArray() { + let sfnt = this.sfnt; + const tables = this.tables; + const tablesNames = Object.keys(tables); + tablesNames.sort(); + const numTables = tablesNames.length; + let i, j, jj, table, tableName; + let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; + const tableOffsets = [offset]; + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + const paddedLength = (table.length + 3 & ~3) >>> 0; + offset += paddedLength; + tableOffsets.push(offset); + } + const file = new Uint8Array(offset); + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + writeData(file, tableOffsets[i], table); + } + if (sfnt === "true") { + sfnt = string32(0x00010000); + } + file[0] = sfnt.charCodeAt(0) & 0xff; + file[1] = sfnt.charCodeAt(1) & 0xff; + file[2] = sfnt.charCodeAt(2) & 0xff; + file[3] = sfnt.charCodeAt(3) & 0xff; + writeInt16(file, 4, numTables); + const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); + writeInt16(file, 6, searchParams.range); + writeInt16(file, 8, searchParams.entry); + writeInt16(file, 10, searchParams.rangeShift); + offset = OTF_HEADER_SIZE; + for (i = 0; i < numTables; i++) { + tableName = tablesNames[i]; + file[offset] = tableName.charCodeAt(0) & 0xff; + file[offset + 1] = tableName.charCodeAt(1) & 0xff; + file[offset + 2] = tableName.charCodeAt(2) & 0xff; + file[offset + 3] = tableName.charCodeAt(3) & 0xff; + let checksum = 0; + for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + const quad = readUint32(file, j); + checksum = checksum + quad >>> 0; + } + writeInt32(file, offset + 4, checksum); + writeInt32(file, offset + 8, tableOffsets[i]); + writeInt32(file, offset + 12, tables[tableName].length); + offset += OTF_TABLE_ENTRY_SIZE; + } + return file; + } + addTable(tag, data) { + if (tag in this.tables) { + throw new Error("Table " + tag + " already exists"); + } + this.tables[tag] = data; + } +} + +;// ./src/core/type1_parser.js + + + + +const HINTING_ENABLED = false; +const COMMAND_MAP = { + hstem: [1], + vstem: [3], + vmoveto: [4], + rlineto: [5], + hlineto: [6], + vlineto: [7], + rrcurveto: [8], + callsubr: [10], + flex: [12, 35], + drop: [12, 18], + endchar: [14], + rmoveto: [21], + hmoveto: [22], + vhcurveto: [30], + hvcurveto: [31] +}; +class Type1CharString { + constructor() { + this.width = 0; + this.lsb = 0; + this.flexing = false; + this.output = []; + this.stack = []; + } + convert(encoded, subrs, seacAnalysisEnabled) { + const count = encoded.length; + let error = false; + let wx, sbx, subrNumber; + for (let i = 0; i < count; i++) { + let value = encoded[i]; + if (value < 32) { + if (value === 12) { + value = (value << 8) + encoded[++i]; + } + switch (value) { + case 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case 3: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case 4: + if (this.flexing) { + if (this.stack.length < 1) { + error = true; + break; + } + const dy = this.stack.pop(); + this.stack.push(0, dy); + break; + } + error = this.executeCommand(1, COMMAND_MAP.vmoveto); + break; + case 5: + error = this.executeCommand(2, COMMAND_MAP.rlineto); + break; + case 6: + error = this.executeCommand(1, COMMAND_MAP.hlineto); + break; + case 7: + error = this.executeCommand(1, COMMAND_MAP.vlineto); + break; + case 8: + error = this.executeCommand(6, COMMAND_MAP.rrcurveto); + break; + case 9: + this.stack = []; + break; + case 10: + if (this.stack.length < 1) { + error = true; + break; + } + subrNumber = this.stack.pop(); + if (!subrs[subrNumber]) { + error = true; + break; + } + error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); + break; + case 11: + return error; + case 13: + if (this.stack.length < 2) { + error = true; + break; + } + wx = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx); + error = this.executeCommand(2, COMMAND_MAP.hmoveto); + break; + case 14: + this.output.push(COMMAND_MAP.endchar[0]); + break; + case 21: + if (this.flexing) { + break; + } + error = this.executeCommand(2, COMMAND_MAP.rmoveto); + break; + case 22: + if (this.flexing) { + this.stack.push(0); + break; + } + error = this.executeCommand(1, COMMAND_MAP.hmoveto); + break; + case 30: + error = this.executeCommand(4, COMMAND_MAP.vhcurveto); + break; + case 31: + error = this.executeCommand(4, COMMAND_MAP.hvcurveto); + break; + case (12 << 8) + 0: + this.stack = []; + break; + case (12 << 8) + 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case (12 << 8) + 2: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case (12 << 8) + 6: + if (seacAnalysisEnabled) { + const asb = this.stack.at(-5); + this.seac = this.stack.splice(-4, 4); + this.seac[0] += this.lsb - asb; + error = this.executeCommand(0, COMMAND_MAP.endchar); + } else { + error = this.executeCommand(4, COMMAND_MAP.endchar); + } + break; + case (12 << 8) + 7: + if (this.stack.length < 4) { + error = true; + break; + } + this.stack.pop(); + wx = this.stack.pop(); + const sby = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx, sby); + error = this.executeCommand(3, COMMAND_MAP.rmoveto); + break; + case (12 << 8) + 12: + if (this.stack.length < 2) { + error = true; + break; + } + const num2 = this.stack.pop(); + const num1 = this.stack.pop(); + this.stack.push(num1 / num2); + break; + case (12 << 8) + 16: + if (this.stack.length < 2) { + error = true; + break; + } + subrNumber = this.stack.pop(); + const numArgs = this.stack.pop(); + if (subrNumber === 0 && numArgs === 3) { + const flexArgs = this.stack.splice(-17, 17); + this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); + error = this.executeCommand(13, COMMAND_MAP.flex, true); + this.flexing = false; + this.stack.push(flexArgs[15], flexArgs[16]); + } else if (subrNumber === 1 && numArgs === 0) { + this.flexing = true; + } + break; + case (12 << 8) + 17: + break; + case (12 << 8) + 33: + this.stack = []; + break; + default: + warn('Unknown type 1 charstring command of "' + value + '"'); + break; + } + if (error) { + break; + } + continue; + } else if (value <= 246) { + value -= 139; + } else if (value <= 250) { + value = (value - 247) * 256 + encoded[++i] + 108; + } else if (value <= 254) { + value = -((value - 251) * 256) - encoded[++i] - 108; + } else { + value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; + } + this.stack.push(value); + } + return error; + } + executeCommand(howManyArgs, command, keepStack) { + const stackLength = this.stack.length; + if (howManyArgs > stackLength) { + return true; + } + const start = stackLength - howManyArgs; + for (let i = start; i < stackLength; i++) { + let value = this.stack[i]; + if (Number.isInteger(value)) { + this.output.push(28, value >> 8 & 0xff, value & 0xff); + } else { + value = 65536 * value | 0; + this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + } + this.output.push(...command); + if (keepStack) { + this.stack.splice(start, howManyArgs); + } else { + this.stack.length = 0; + } + return false; + } +} +const EEXEC_ENCRYPT_KEY = 55665; +const CHAR_STRS_ENCRYPT_KEY = 4330; +function isHexDigit(code) { + return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; +} +function decrypt(data, key, discardNumber) { + if (discardNumber >= data.length) { + return new Uint8Array(0); + } + const c1 = 52845, + c2 = 22719; + let r = key | 0, + i, + j; + for (i = 0; i < discardNumber; i++) { + r = (data[i] + r) * c1 + c2 & (1 << 16) - 1; + } + const count = data.length - discardNumber; + const decrypted = new Uint8Array(count); + for (i = discardNumber, j = 0; j < count; i++, j++) { + const value = data[i]; + decrypted[j] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + return decrypted; +} +function decryptAscii(data, key, discardNumber) { + const c1 = 52845, + c2 = 22719; + let r = key | 0; + const count = data.length, + maybeLength = count >>> 1; + const decrypted = new Uint8Array(maybeLength); + let i, j; + for (i = 0, j = 0; i < count; i++) { + const digit1 = data[i]; + if (!isHexDigit(digit1)) { + continue; + } + i++; + let digit2; + while (i < count && !isHexDigit(digit2 = data[i])) { + i++; + } + if (i < count) { + const value = parseInt(String.fromCharCode(digit1, digit2), 16); + decrypted[j++] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + } + return decrypted.slice(discardNumber, j); +} +function isSpecial(c) { + return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29; +} +class Type1Parser { + constructor(stream, encrypted, seacAnalysisEnabled) { + if (encrypted) { + const data = stream.getBytes(); + const isBinary = !((isHexDigit(data[0]) || isWhiteSpace(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7])); + stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); + } + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + this.stream = stream; + this.nextChar(); + } + readNumberArray() { + this.getToken(); + const array = []; + while (true) { + const token = this.getToken(); + if (token === null || token === "]" || token === "}") { + break; + } + array.push(parseFloat(token || 0)); + } + return array; + } + readNumber() { + const token = this.getToken(); + return parseFloat(token || 0); + } + readInt() { + const token = this.getToken(); + return parseInt(token || 0, 10) | 0; + } + readBoolean() { + const token = this.getToken(); + return token === "true" ? 1 : 0; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + prevChar() { + this.stream.skip(-2); + return this.currentChar = this.stream.getByte(); + } + getToken() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch === -1) { + return null; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isWhiteSpace(ch)) { + break; + } + ch = this.nextChar(); + } + if (isSpecial(ch)) { + this.nextChar(); + return String.fromCharCode(ch); + } + let token = ""; + do { + token += String.fromCharCode(ch); + ch = this.nextChar(); + } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch)); + return token; + } + readCharStrings(bytes, lenIV) { + if (lenIV === -1) { + return bytes; + } + return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); + } + extractFontProgram(properties) { + const stream = this.stream; + const subrs = [], + charstrings = []; + const privateData = Object.create(null); + privateData.lenIV = 4; + const program = { + subrs: [], + charstrings: [], + properties: { + privateData + } + }; + let token, length, data, lenIV; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "CharStrings": + this.getToken(); + this.getToken(); + this.getToken(); + this.getToken(); + while (true) { + token = this.getToken(); + if (token === null || token === "end") { + break; + } + if (token !== "/") { + continue; + } + const glyph = this.getToken(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } else if (token === "/") { + this.prevChar(); + } + charstrings.push({ + glyph, + encoded + }); + } + break; + case "Subrs": + this.readInt(); + this.getToken(); + while (this.getToken() === "dup") { + const index = this.readInt(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } + subrs[index] = encoded; + } + break; + case "BlueValues": + case "OtherBlues": + case "FamilyBlues": + case "FamilyOtherBlues": + const blueArray = this.readNumberArray(); + if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { + program.properties.privateData[token] = blueArray; + } + break; + case "StemSnapH": + case "StemSnapV": + program.properties.privateData[token] = this.readNumberArray(); + break; + case "StdHW": + case "StdVW": + program.properties.privateData[token] = this.readNumberArray()[0]; + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + program.properties.privateData[token] = this.readNumber(); + break; + case "ExpansionFactor": + program.properties.privateData[token] = this.readNumber() || 0.06; + break; + case "ForceBold": + program.properties.privateData[token] = this.readBoolean(); + break; + } + } + for (const { + encoded, + glyph + } of charstrings) { + const charString = new Type1CharString(); + const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + let output = charString.output; + if (error) { + output = [14]; + } + const charStringObject = { + glyphName: glyph, + charstring: output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac + }; + if (glyph === ".notdef") { + program.charstrings.unshift(charStringObject); + } else { + program.charstrings.push(charStringObject); + } + if (properties.builtInEncoding) { + const index = properties.builtInEncoding.indexOf(glyph); + if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) { + properties.widths[index] = charString.width; + } + } + } + return program; + } + extractFontHeader(properties) { + let token; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "FontMatrix": + const matrix = this.readNumberArray(); + properties.fontMatrix = matrix; + break; + case "Encoding": + const encodingArg = this.getToken(); + let encoding; + if (!/^\d+$/.test(encodingArg)) { + encoding = getEncoding(encodingArg); + } else { + encoding = []; + const size = parseInt(encodingArg, 10) | 0; + this.getToken(); + for (let j = 0; j < size; j++) { + token = this.getToken(); + while (token !== "dup" && token !== "def") { + token = this.getToken(); + if (token === null) { + return; + } + } + if (token === "def") { + break; + } + const index = this.readInt(); + this.getToken(); + const glyph = this.getToken(); + encoding[index] = glyph; + this.getToken(); + } + } + properties.builtInEncoding = encoding; + break; + case "FontBBox": + const fontBBox = this.readNumberArray(); + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + break; + } + } + } +} + +;// ./src/core/type1_font.js + + + + + + +function findBlock(streamBytes, signature, startIndex) { + const streamBytesLength = streamBytes.length; + const signatureLength = signature.length; + const scanLength = streamBytesLength - signatureLength; + let i = startIndex, + found = false; + while (i < scanLength) { + let j = 0; + while (j < signatureLength && streamBytes[i + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + i += j; + while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) { + i++; + } + found = true; + break; + } + i++; + } + return { + found, + length: i + }; +} +function getHeaderBlock(stream, suggestedLength) { + const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; + const streamStartPos = stream.pos; + let headerBytes, headerBytesLength, block; + try { + headerBytes = stream.getBytes(suggestedLength); + headerBytesLength = headerBytes.length; + } catch {} + if (headerBytesLength === suggestedLength) { + block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); + if (block.found && block.length === suggestedLength) { + return { + stream: new Stream(headerBytes), + length: suggestedLength + }; + } + } + warn('Invalid "Length1" property in Type1 font -- trying to recover.'); + stream.pos = streamStartPos; + const SCAN_BLOCK_LENGTH = 2048; + let actualLength; + while (true) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); + if (block.length === 0) { + break; + } + stream.pos += block.length; + if (block.found) { + actualLength = stream.pos - streamStartPos; + break; + } + } + stream.pos = streamStartPos; + if (actualLength) { + return { + stream: new Stream(stream.getBytes(actualLength)), + length: actualLength + }; + } + warn('Unable to recover "Length1" property in Type1 font -- using as is.'); + return { + stream: new Stream(stream.getBytes(suggestedLength)), + length: suggestedLength + }; +} +function getEexecBlock(stream, suggestedLength) { + const eexecBytes = stream.getBytes(); + if (eexecBytes.length === 0) { + throw new FormatError("getEexecBlock - no font program found."); + } + return { + stream: new Stream(eexecBytes), + length: eexecBytes.length + }; +} +class Type1Font { + constructor(name, file, properties) { + const PFB_HEADER_SIZE = 6; + let headerBlockLength = properties.length1; + let eexecBlockLength = properties.length2; + let pfbHeader = file.peekBytes(PFB_HEADER_SIZE); + const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; + if (pfbHeaderPresent) { + file.skip(PFB_HEADER_SIZE); + headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const headerBlock = getHeaderBlock(file, headerBlockLength); + const headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED); + headerBlockParser.extractFontHeader(properties); + if (pfbHeaderPresent) { + pfbHeader = file.getBytes(PFB_HEADER_SIZE); + eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const eexecBlock = getEexecBlock(file, eexecBlockLength); + const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); + const data = eexecBlockParser.extractFontProgram(properties); + for (const key in data.properties) { + properties[key] = data.properties[key]; + } + const charstrings = data.charstrings; + const type2Charstrings = this.getType2Charstrings(charstrings); + const subrs = this.getType2Subrs(data.subrs); + this.charstrings = charstrings; + this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); + this.seacs = this.getSeacs(data.charstrings); + } + get numGlyphs() { + return this.charstrings.length + 1; + } + getCharset() { + const charset = [".notdef"]; + for (const { + glyphName + } of this.charstrings) { + charset.push(glyphName); + } + return charset; + } + getGlyphMapping(properties) { + const charstrings = this.charstrings; + if (properties.composite) { + const charCodeToGlyphId = Object.create(null); + for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) { + const charCode = properties.cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId + 1; + } + return charCodeToGlyphId; + } + const glyphNames = [".notdef"]; + let builtInEncoding, glyphId; + for (glyphId = 0; glyphId < charstrings.length; glyphId++) { + glyphNames.push(charstrings[glyphId].glyphName); + } + const encoding = properties.builtInEncoding; + if (encoding) { + builtInEncoding = Object.create(null); + for (const charCode in encoding) { + glyphId = glyphNames.indexOf(encoding[charCode]); + if (glyphId >= 0) { + builtInEncoding[charCode] = glyphId; + } + } + } + return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); + } + hasGlyphId(id) { + if (id < 0 || id >= this.numGlyphs) { + return false; + } + if (id === 0) { + return true; + } + const glyph = this.charstrings[id - 1]; + return glyph.charstring.length > 0; + } + getSeacs(charstrings) { + const seacMap = []; + for (let i = 0, ii = charstrings.length; i < ii; i++) { + const charstring = charstrings[i]; + if (charstring.seac) { + seacMap[i + 1] = charstring.seac; + } + } + return seacMap; + } + getType2Charstrings(type1Charstrings) { + const type2Charstrings = []; + for (const type1Charstring of type1Charstrings) { + type2Charstrings.push(type1Charstring.charstring); + } + return type2Charstrings; + } + getType2Subrs(type1Subrs) { + let bias = 0; + const count = type1Subrs.length; + if (count < 1133) { + bias = 107; + } else if (count < 33769) { + bias = 1131; + } else { + bias = 32768; + } + const type2Subrs = []; + let i; + for (i = 0; i < bias; i++) { + type2Subrs.push([0x0b]); + } + for (i = 0; i < count; i++) { + type2Subrs.push(type1Subrs[i]); + } + return type2Subrs; + } + wrap(name, glyphs, charstrings, subrs, properties) { + const cff = new CFF(); + cff.header = new CFFHeader(1, 0, 4, 4); + cff.names = [name]; + const topDict = new CFFTopDict(); + topDict.setByName("version", 391); + topDict.setByName("Notice", 392); + topDict.setByName("FullName", 393); + topDict.setByName("FamilyName", 394); + topDict.setByName("Weight", 395); + topDict.setByName("Encoding", null); + topDict.setByName("FontMatrix", properties.fontMatrix); + topDict.setByName("FontBBox", properties.bbox); + topDict.setByName("charset", null); + topDict.setByName("CharStrings", null); + topDict.setByName("Private", null); + cff.topDict = topDict; + const strings = new CFFStrings(); + strings.add("Version 0.11"); + strings.add("See original notice"); + strings.add(name); + strings.add(name); + strings.add("Medium"); + cff.strings = strings; + cff.globalSubrIndex = new CFFIndex(); + const count = glyphs.length; + const charsetArray = [".notdef"]; + let i, ii; + for (i = 0; i < count; i++) { + const glyphName = charstrings[i].glyphName; + const index = CFFStandardStrings.indexOf(glyphName); + if (index === -1) { + strings.add(glyphName); + } + charsetArray.push(glyphName); + } + cff.charset = new CFFCharset(false, 0, charsetArray); + const charStringsIndex = new CFFIndex(); + charStringsIndex.add([0x8b, 0x0e]); + for (i = 0; i < count; i++) { + charStringsIndex.add(glyphs[i]); + } + cff.charStrings = charStringsIndex; + const privateDict = new CFFPrivateDict(); + privateDict.setByName("Subrs", null); + const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; + for (i = 0, ii = fields.length; i < ii; i++) { + const field = fields[i]; + if (!(field in properties.privateData)) { + continue; + } + const value = properties.privateData[field]; + if (Array.isArray(value)) { + for (let j = value.length - 1; j > 0; j--) { + value[j] -= value[j - 1]; + } + } + privateDict.setByName(field, value); + } + cff.topDict.privateDict = privateDict; + const subrIndex = new CFFIndex(); + for (i = 0, ii = subrs.length; i < ii; i++) { + subrIndex.add(subrs[i]); + } + privateDict.subrsIndex = subrIndex; + const compiler = new CFFCompiler(cff); + return compiler.compile(); + } +} + +;// ./src/core/fonts.js + + + + + + + + + + + + + + + + + +const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; +const PDF_GLYPH_SPACE_UNITS = 1000; +const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "subtype", "systemFontInfo", "type", "vertical"]; +const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "toFontChar", "toUnicode", "vmetrics", "widths"]; +function adjustWidths(properties) { + if (!properties.fontMatrix) { + return; + } + if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { + return; + } + const scale = 0.001 / properties.fontMatrix[0]; + const glyphsWidths = properties.widths; + for (const glyph in glyphsWidths) { + glyphsWidths[glyph] *= scale; + } + properties.defaultWidth *= scale; +} +function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (properties.hasEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + if (!isSymbolicFont) { + return; + } + if (nameRecords.length === 0) { + return; + } + if (properties.defaultEncoding === WinAnsiEncoding) { + return; + } + for (const r of nameRecords) { + if (!isWinNameRecord(r)) { + return; + } + } + const encoding = WinAnsiEncoding; + const toUnicode = [], + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in encoding) { + const glyphName = encoding[charCode]; + if (glyphName === "") { + continue; + } + const unicode = glyphsUnicodeMap[glyphName]; + if (unicode === undefined) { + continue; + } + toUnicode[charCode] = String.fromCharCode(unicode); + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +function adjustType1ToUnicode(properties, builtInEncoding) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (builtInEncoding === properties.defaultEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = [], + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in builtInEncoding) { + if (properties.hasEncoding) { + if (properties.baseEncodingName || properties.differences[charCode] !== undefined) { + continue; + } + } + const glyphName = builtInEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toUnicode[charCode] = String.fromCharCode(unicode); + } + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +function amendFallbackToUnicode(properties) { + if (!properties.fallbackToUnicode) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = []; + for (const charCode in properties.fallbackToUnicode) { + if (properties.toUnicode.has(charCode)) { + continue; + } + toUnicode[charCode] = properties.fallbackToUnicode[charCode]; + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +class fonts_Glyph { + constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { + this.originalCharCode = originalCharCode; + this.fontChar = fontChar; + this.unicode = unicode; + this.accent = accent; + this.width = width; + this.vmetric = vmetric; + this.operatorListId = operatorListId; + this.isSpace = isSpace; + this.isInFont = isInFont; + } + get category() { + return shadow(this, "category", getCharUnicodeCategory(this.unicode), true); + } +} +function int16(b0, b1) { + return (b0 << 8) + b1; +} +function writeSignedInt16(bytes, index, value) { + bytes[index + 1] = value; + bytes[index] = value >>> 8; +} +function signedInt16(b0, b1) { + const value = (b0 << 8) + b1; + return value & 1 << 15 ? value - 0x10000 : value; +} +function writeUint32(bytes, index, value) { + bytes[index + 3] = value & 0xff; + bytes[index + 2] = value >>> 8; + bytes[index + 1] = value >>> 16; + bytes[index] = value >>> 24; +} +function int32(b0, b1, b2, b3) { + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; +} +function string16(value) { + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); +} +function safeString16(value) { + if (value > 0x7fff) { + value = 0x7fff; + } else if (value < -0x8000) { + value = -0x8000; + } + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); +} +function isTrueTypeFile(file) { + const header = file.peekBytes(4); + return readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true"; +} +function isTrueTypeCollectionFile(file) { + const header = file.peekBytes(4); + return bytesToString(header) === "ttcf"; +} +function isOpenTypeFile(file) { + const header = file.peekBytes(4); + return bytesToString(header) === "OTTO"; +} +function isType1File(file) { + const header = file.peekBytes(2); + if (header[0] === 0x25 && header[1] === 0x21) { + return true; + } + if (header[0] === 0x80 && header[1] === 0x01) { + return true; + } + return false; +} +function isCFFFile(file) { + const header = file.peekBytes(4); + if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) { + return true; + } + return false; +} +function getFontFileType(file, { + type, + subtype, + composite +}) { + let fileType, fileSubtype; + if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) { + fileType = composite ? "CIDFontType2" : "TrueType"; + } else if (isOpenTypeFile(file)) { + fileType = composite ? "CIDFontType2" : "OpenType"; + } else if (isType1File(file)) { + if (composite) { + fileType = "CIDFontType0"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + } + } else if (isCFFFile(file)) { + if (composite) { + fileType = "CIDFontType0"; + fileSubtype = "CIDFontType0C"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + fileSubtype = "Type1C"; + } + } else { + warn("getFontFileType: Unable to detect correct font file Type/Subtype."); + fileType = type; + fileSubtype = subtype; + } + return [fileType, fileSubtype]; +} +function applyStandardFontGlyphMap(map, glyphMap) { + for (const charCode in glyphMap) { + map[+charCode] = glyphMap[charCode]; + } +} +function buildToFontChar(encoding, glyphsUnicodeMap, differences) { + const toFontChar = []; + let unicode; + for (let i = 0, ii = encoding.length; i < ii; i++) { + unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[i] = unicode; + } + } + for (const charCode in differences) { + unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[+charCode] = unicode; + } + } + return toFontChar; +} +function isMacNameRecord(r) { + return r.platform === 1 && r.encoding === 0 && r.language === 0; +} +function isWinNameRecord(r) { + return r.platform === 3 && r.encoding === 1 && r.language === 0x409; +} +function convertCidString(charCode, cid, shouldThrow = false) { + switch (cid.length) { + case 1: + return cid.charCodeAt(0); + case 2: + return cid.charCodeAt(0) << 8 | cid.charCodeAt(1); + } + const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; + if (shouldThrow) { + throw new FormatError(msg); + } + warn(msg); + return cid; +} +function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { + const newMap = Object.create(null); + const toUnicodeExtraMap = new Map(); + const toFontChar = []; + const usedGlyphIds = new Set(); + let privateUseAreaIndex = 0; + const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + let nextAvailableFontCharCode = privateUseOffetStart; + let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + const isInPrivateArea = code => PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1] || PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]; + for (const originalCharCode in charCodeToGlyphId) { + let glyphId = charCodeToGlyphId[originalCharCode]; + if (!hasGlyph(glyphId)) { + continue; + } + if (nextAvailableFontCharCode > privateUseOffetEnd) { + privateUseAreaIndex++; + if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { + warn("Ran out of space in font private use area."); + break; + } + nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + } + const fontCharCode = nextAvailableFontCharCode++; + if (glyphId === 0) { + glyphId = newGlyphZeroId; + } + let unicode = toUnicode.get(originalCharCode); + if (typeof unicode === "string") { + unicode = unicode.codePointAt(0); + } + if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { + toUnicodeExtraMap.set(unicode, glyphId); + usedGlyphIds.add(glyphId); + } + newMap[fontCharCode] = glyphId; + toFontChar[originalCharCode] = fontCharCode; + } + return { + toFontChar, + charCodeToGlyphId: newMap, + toUnicodeExtraMap, + nextAvailableFontCharCode + }; +} +function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) { + const codes = []; + for (const charCode in glyphs) { + if (glyphs[charCode] >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: charCode | 0, + glyphId: glyphs[charCode] + }); + } + if (toUnicodeExtraMap) { + for (const [unicode, glyphId] of toUnicodeExtraMap) { + if (glyphId >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: unicode, + glyphId + }); + } + } + if (codes.length === 0) { + codes.push({ + fontCharCode: 0, + glyphId: 0 + }); + } + codes.sort(function fontGetRangesSort(a, b) { + return a.fontCharCode - b.fontCharCode; + }); + const ranges = []; + const length = codes.length; + for (let n = 0; n < length;) { + const start = codes[n].fontCharCode; + const codeIndices = [codes[n].glyphId]; + ++n; + let end = start; + while (n < length && end + 1 === codes[n].fontCharCode) { + codeIndices.push(codes[n].glyphId); + ++end; + ++n; + if (end === 0xffff) { + break; + } + } + ranges.push([start, end, codeIndices]); + } + return ranges; +} +function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { + const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); + const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; + let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + string32(4 + numTables * 8); + let i, ii, j, jj; + for (i = ranges.length - 1; i >= 0; --i) { + if (ranges[i][0] <= 0xffff) { + break; + } + } + const bmpLength = i + 1; + if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) { + ranges[i][1] = 0xfffe; + } + const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; + const segCount = bmpLength + trailingRangesCount; + const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); + let startCount = ""; + let endCount = ""; + let idDeltas = ""; + let idRangeOffsets = ""; + let glyphsIds = ""; + let bias = 0; + let range, start, end, codes; + for (i = 0, ii = bmpLength; i < ii; i++) { + range = ranges[i]; + start = range[0]; + end = range[1]; + startCount += string16(start); + endCount += string16(end); + codes = range[2]; + let contiguous = true; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + contiguous = false; + break; + } + } + if (!contiguous) { + const offset = (segCount - i) * 2 + bias * 2; + bias += end - start + 1; + idDeltas += string16(0); + idRangeOffsets += string16(offset); + for (j = 0, jj = codes.length; j < jj; ++j) { + glyphsIds += string16(codes[j]); + } + } else { + const startCode = codes[0]; + idDeltas += string16(startCode - start & 0xffff); + idRangeOffsets += string16(0); + } + } + if (trailingRangesCount > 0) { + endCount += "\xFF\xFF"; + startCount += "\xFF\xFF"; + idDeltas += "\x00\x01"; + idRangeOffsets += "\x00\x00"; + } + const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds; + let format31012 = ""; + let header31012 = ""; + if (numTables > 1) { + cmap += "\x00\x03" + "\x00\x0A" + string32(4 + numTables * 8 + 4 + format314.length); + format31012 = ""; + for (i = 0, ii = ranges.length; i < ii; i++) { + range = ranges[i]; + start = range[0]; + codes = range[2]; + let code = codes[0]; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + end = range[0] + j - 1; + format31012 += string32(start) + string32(end) + string32(code); + start = end + 1; + code = codes[j]; + } + } + format31012 += string32(start) + string32(range[1]) + string32(code); + } + header31012 = "\x00\x0C" + "\x00\x00" + string32(format31012.length + 16) + "\x00\x00\x00\x00" + string32(format31012.length / 12); + } + return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012; +} +function validateOS2Table(os2, file) { + file.pos = (file.start || 0) + os2.offset; + const version = file.getUint16(); + file.skip(60); + const selection = file.getUint16(); + if (version < 4 && selection & 0x0300) { + return false; + } + const firstChar = file.getUint16(); + const lastChar = file.getUint16(); + if (firstChar > lastChar) { + return false; + } + file.skip(6); + const usWinAscent = file.getUint16(); + if (usWinAscent === 0) { + return false; + } + os2.data[8] = os2.data[9] = 0; + return true; +} +function createOS2Table(properties, charstrings, override) { + override ||= { + unitsPerEm: 0, + yMax: 0, + yMin: 0, + ascent: 0, + descent: 0 + }; + let ulUnicodeRange1 = 0; + let ulUnicodeRange2 = 0; + let ulUnicodeRange3 = 0; + let ulUnicodeRange4 = 0; + let firstCharIndex = null; + let lastCharIndex = 0; + let position = -1; + if (charstrings) { + for (let code in charstrings) { + code |= 0; + if (firstCharIndex > code || !firstCharIndex) { + firstCharIndex = code; + } + if (lastCharIndex < code) { + lastCharIndex = code; + } + position = getUnicodeRangeFor(code, position); + if (position < 32) { + ulUnicodeRange1 |= 1 << position; + } else if (position < 64) { + ulUnicodeRange2 |= 1 << position - 32; + } else if (position < 96) { + ulUnicodeRange3 |= 1 << position - 64; + } else if (position < 123) { + ulUnicodeRange4 |= 1 << position - 96; + } else { + throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage"); + } + } + if (lastCharIndex > 0xffff) { + lastCharIndex = 0xffff; + } + } else { + firstCharIndex = 0; + lastCharIndex = 255; + } + const bbox = properties.bbox || [0, 0, 0, 0]; + const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000); + const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; + const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); + let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); + if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { + typoDescent = -typoDescent; + } + const winAscent = override.yMax || typoAscent; + const winDescent = -override.yMin || -typoDescent; + return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + "\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + "\x00\x00\x00\x00\x00\x00" + string32(ulUnicodeRange1) + string32(ulUnicodeRange2) + string32(ulUnicodeRange3) + string32(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + "\x00\x03"; +} +function createPostTable(properties) { + const angle = Math.floor(properties.italicAngle * 2 ** 16); + return "\x00\x03\x00\x00" + string32(angle) + "\x00\x00" + "\x00\x00" + string32(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"; +} +function createPostscriptName(name) { + return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); +} +function createNameTable(name, proto) { + if (!proto) { + proto = [[], []]; + } + const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"]; + const stringsUnicode = []; + let i, ii, j, jj, str; + for (i = 0, ii = strings.length; i < ii; i++) { + str = proto[1][i] || strings[i]; + const strBufUnicode = []; + for (j = 0, jj = str.length; j < jj; j++) { + strBufUnicode.push(string16(str.charCodeAt(j))); + } + stringsUnicode.push(strBufUnicode.join("")); + } + const names = [strings, stringsUnicode]; + const platforms = ["\x00\x01", "\x00\x03"]; + const encodings = ["\x00\x00", "\x00\x01"]; + const languages = ["\x00\x00", "\x04\x09"]; + const namesRecordCount = strings.length * platforms.length; + let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); + let strOffset = 0; + for (i = 0, ii = platforms.length; i < ii; i++) { + const strs = names[i]; + for (j = 0, jj = strs.length; j < jj; j++) { + str = strs[j]; + const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); + nameTable += nameRecord; + strOffset += str.length; + } + } + nameTable += strings.join("") + stringsUnicode.join(""); + return nameTable; +} +class Font { + constructor(name, file, properties) { + this.name = name; + this.psName = null; + this.mimetype = null; + this.disableFontFace = false; + this.loadedName = properties.loadedName; + this.isType3Font = properties.isType3Font; + this.missingFile = false; + this.cssFontInfo = properties.cssFontInfo; + this._charsCache = Object.create(null); + this._glyphCache = Object.create(null); + let isSerifFont = !!(properties.flags & FontFlags.Serif); + if (!isSerifFont && !properties.isSimulatedFlags) { + const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], + serifFonts = getSerifFonts(); + for (const namePart of baseName.split("+")) { + if (serifFonts[namePart]) { + isSerifFont = true; + break; + } + } + } + this.isSerifFont = isSerifFont; + this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); + let { + type, + subtype + } = properties; + this.type = type; + this.subtype = subtype; + this.systemFontInfo = properties.systemFontInfo; + const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); + this.isInvalidPDFjsFont = !!matches; + if (this.isInvalidPDFjsFont) { + this.fallbackName = matches[1]; + } else if (this.isMonospace) { + this.fallbackName = "monospace"; + } else if (this.isSerifFont) { + this.fallbackName = "serif"; + } else { + this.fallbackName = "sans-serif"; + } + if (this.systemFontInfo?.guessFallback) { + this.systemFontInfo.guessFallback = false; + this.systemFontInfo.css += `,${this.fallbackName}`; + } + this.differences = properties.differences; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.composite = properties.composite; + this.cMap = properties.cMap; + this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS; + this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; + this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; + this.lineHeight = this.ascent - this.descent; + this.fontMatrix = properties.fontMatrix; + this.bbox = properties.bbox; + this.defaultEncoding = properties.defaultEncoding; + this.toUnicode = properties.toUnicode; + this.toFontChar = []; + if (properties.type === "Type3") { + for (let charCode = 0; charCode < 256; charCode++) { + this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode]; + } + return; + } + this.cidEncoding = properties.cidEncoding || ""; + this.vertical = !!properties.vertical; + if (this.vertical) { + this.vmetrics = properties.vmetrics; + this.defaultVMetrics = properties.defaultVMetrics; + } + if (!file || file.isEmpty) { + if (file) { + warn('Font file is empty in "' + name + '" (' + this.loadedName + ")"); + } + this.fallbackToSystemFont(properties); + return; + } + [type, subtype] = getFontFileType(file, properties); + if (type !== this.type || subtype !== this.subtype) { + info("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`); + } + let data; + try { + switch (type) { + case "MMType1": + info("MMType1 font (" + name + "), falling back to Type1."); + case "Type1": + case "CIDFontType0": + this.mimetype = "font/opentype"; + const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : new Type1Font(name, file, properties); + adjustWidths(properties); + data = this.convert(name, cff, properties); + break; + case "OpenType": + case "TrueType": + case "CIDFontType2": + this.mimetype = "font/opentype"; + data = this.checkAndRepair(name, file, properties); + if (this.isOpenType) { + adjustWidths(properties); + type = "OpenType"; + } + break; + default: + throw new FormatError(`Font ${type} is not supported`); + } + } catch (e) { + warn(e); + this.fallbackToSystemFont(properties); + return; + } + amendFallbackToUnicode(properties); + this.data = data; + this.type = type; + this.subtype = subtype; + this.fontMatrix = properties.fontMatrix; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.toUnicode = properties.toUnicode; + this.seacMap = properties.seacMap; + } + get renderer() { + const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); + return shadow(this, "renderer", renderer); + } + exportData(extraProperties = false) { + const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES; + const data = Object.create(null); + let property, value; + for (property of exportDataProperties) { + value = this[property]; + if (value !== undefined) { + data[property] = value; + } + } + return data; + } + fallbackToSystemFont(properties) { + this.missingFile = true; + const { + name, + type + } = this; + let fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(), + nonStdFontMap = getNonStdFontMap(); + const isStandardFont = !!stdFontMap[fontName]; + const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + const fontBasicMetricsMap = getFontBasicMetrics(); + const metrics = fontBasicMetricsMap[fontName]; + if (metrics) { + if (isNaN(this.ascent)) { + this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.descent)) { + this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.capHeight)) { + this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; + } + } + this.bold = /bold/gi.test(fontName); + this.italic = /oblique|italic/gi.test(fontName); + this.black = /Black/g.test(name); + const isNarrow = /Narrow/g.test(name); + this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; + if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { + const cidToGidMap = properties.cidToGidMap; + const map = []; + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + if (/Arial-?Black/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack()); + } else if (/Calibri/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri()); + } + if (cidToGidMap) { + for (const charCode in map) { + const cid = map[charCode]; + if (cidToGidMap[cid] !== undefined) { + map[+charCode] = cidToGidMap[cid]; + } + } + if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + const cid = map[charCode]; + if (cidToGidMap[cid] === undefined) { + map[+charCode] = unicodeCharCode; + } + }); + } + } + if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + this.toUnicode = new ToUnicodeMap(map); + } else if (/Symbol/i.test(fontName)) { + this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences); + } else if (/Dingbats/i.test(fontName)) { + this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences); + } else if (isStandardFont || isMappedToStandardFont) { + const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences); + if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + } else { + const glyphsUnicodeMap = getGlyphsUnicode(); + const map = []; + this.toUnicode.forEach((charCode, unicodeCharCode) => { + if (!this.composite) { + const glyphName = this.differences[charCode] || this.defaultEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + unicodeCharCode = unicode; + } + } + map[+charCode] = unicodeCharCode; + }); + if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) { + if (/Tahoma|Verdana/i.test(name)) { + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + } + } + this.toFontChar = map; + } + amendFallbackToUnicode(properties); + this.loadedName = fontName.split("-", 1)[0]; + } + checkAndRepair(name, font, properties) { + const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "]; + function readTables(file, numTables) { + const tables = Object.create(null); + tables["OS/2"] = null; + tables.cmap = null; + tables.head = null; + tables.hhea = null; + tables.hmtx = null; + tables.maxp = null; + tables.name = null; + tables.post = null; + for (let i = 0; i < numTables; i++) { + const table = readTableEntry(file); + if (!VALID_TABLES.includes(table.tag)) { + continue; + } + if (table.length === 0) { + continue; + } + tables[table.tag] = table; + } + return tables; + } + function readTableEntry(file) { + const tag = file.getString(4); + const checksum = file.getInt32() >>> 0; + const offset = file.getInt32() >>> 0; + const length = file.getInt32() >>> 0; + const previousPosition = file.pos; + file.pos = file.start || 0; + file.skip(offset); + const data = file.getBytes(length); + file.pos = previousPosition; + if (tag === "head") { + data[8] = data[9] = data[10] = data[11] = 0; + data[17] |= 0x20; + } + return { + tag, + checksum, + length, + offset, + data + }; + } + function readOpenTypeHeader(ttf) { + return { + version: ttf.getString(4), + numTables: ttf.getUint16(), + searchRange: ttf.getUint16(), + entrySelector: ttf.getUint16(), + rangeShift: ttf.getUint16() + }; + } + function readTrueTypeCollectionHeader(ttc) { + const ttcTag = ttc.getString(4); + assert(ttcTag === "ttcf", "Must be a TrueType Collection font."); + const majorVersion = ttc.getUint16(); + const minorVersion = ttc.getUint16(); + const numFonts = ttc.getInt32() >>> 0; + const offsetTable = []; + for (let i = 0; i < numFonts; i++) { + offsetTable.push(ttc.getInt32() >>> 0); + } + const header = { + ttcTag, + majorVersion, + minorVersion, + numFonts, + offsetTable + }; + switch (majorVersion) { + case 1: + return header; + case 2: + header.dsigTag = ttc.getInt32() >>> 0; + header.dsigLength = ttc.getInt32() >>> 0; + header.dsigOffset = ttc.getInt32() >>> 0; + return header; + } + throw new FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`); + } + function readTrueTypeCollectionData(ttc, fontName) { + const { + numFonts, + offsetTable + } = readTrueTypeCollectionHeader(ttc); + const fontNameParts = fontName.split("+"); + let fallbackData; + for (let i = 0; i < numFonts; i++) { + ttc.pos = (ttc.start || 0) + offsetTable[i]; + const potentialHeader = readOpenTypeHeader(ttc); + const potentialTables = readTables(ttc, potentialHeader.numTables); + if (!potentialTables.name) { + throw new FormatError('TrueType Collection font must contain a "name" table.'); + } + const [nameTable] = readNameTable(potentialTables.name); + for (let j = 0, jj = nameTable.length; j < jj; j++) { + for (let k = 0, kk = nameTable[j].length; k < kk; k++) { + const nameEntry = nameTable[j][k]?.replaceAll(/\s/g, ""); + if (!nameEntry) { + continue; + } + if (nameEntry === fontName) { + return { + header: potentialHeader, + tables: potentialTables + }; + } + if (fontNameParts.length < 2) { + continue; + } + for (const part of fontNameParts) { + if (nameEntry === part) { + fallbackData = { + name: part, + header: potentialHeader, + tables: potentialTables + }; + } + } + } + } + } + if (fallbackData) { + warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`); + return { + header: fallbackData.header, + tables: fallbackData.tables + }; + } + throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`); + } + function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) { + if (!cmap) { + warn("No cmap table available."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + let segment; + let start = (file.start || 0) + cmap.offset; + file.pos = start; + file.skip(2); + const numTables = file.getUint16(); + let potentialTable; + let canBreak = false; + for (let i = 0; i < numTables; i++) { + const platformId = file.getUint16(); + const encodingId = file.getUint16(); + const offset = file.getInt32() >>> 0; + let useTable = false; + if (potentialTable?.platformId === platformId && potentialTable?.encodingId === encodingId) { + continue; + } + if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) { + useTable = true; + } else if (platformId === 1 && encodingId === 0) { + useTable = true; + } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) { + useTable = true; + if (!isSymbolicFont) { + canBreak = true; + } + } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { + useTable = true; + let correctlySorted = true; + if (i < numTables - 1) { + const nextBytes = file.peekBytes(2), + nextPlatformId = int16(nextBytes[0], nextBytes[1]); + if (nextPlatformId < platformId) { + correctlySorted = false; + } + } + if (correctlySorted) { + canBreak = true; + } + } + if (useTable) { + potentialTable = { + platformId, + encodingId, + offset + }; + } + if (canBreak) { + break; + } + } + if (potentialTable) { + file.pos = start + potentialTable.offset; + } + if (!potentialTable || file.peekByte() === -1) { + warn("Could not find a preferred cmap table."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + const format = file.getUint16(); + let hasShortCmap = false; + const mappings = []; + let j, glyphId; + if (format === 0) { + file.skip(2 + 2); + for (j = 0; j < 256; j++) { + const index = file.getByte(); + if (!index) { + continue; + } + mappings.push({ + charCode: j, + glyphId: index + }); + } + hasShortCmap = true; + } else if (format === 2) { + file.skip(2 + 2); + const subHeaderKeys = []; + let maxSubHeaderKey = 0; + for (let i = 0; i < 256; i++) { + const subHeaderKey = file.getUint16() >> 3; + subHeaderKeys.push(subHeaderKey); + maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey); + } + const subHeaders = []; + for (let i = 0; i <= maxSubHeaderKey; i++) { + subHeaders.push({ + firstCode: file.getUint16(), + entryCount: file.getUint16(), + idDelta: signedInt16(file.getByte(), file.getByte()), + idRangePos: file.pos + file.getUint16() + }); + } + for (let i = 0; i < 256; i++) { + if (subHeaderKeys[i] === 0) { + file.pos = subHeaders[0].idRangePos + 2 * i; + glyphId = file.getUint16(); + mappings.push({ + charCode: i, + glyphId + }); + } else { + const s = subHeaders[subHeaderKeys[i]]; + for (j = 0; j < s.entryCount; j++) { + const charCode = (i << 8) + j + s.firstCode; + file.pos = s.idRangePos + 2 * j; + glyphId = file.getUint16(); + if (glyphId !== 0) { + glyphId = (glyphId + s.idDelta) % 65536; + } + mappings.push({ + charCode, + glyphId + }); + } + } + } + } else if (format === 4) { + file.skip(2 + 2); + const segCount = file.getUint16() >> 1; + file.skip(6); + const segments = []; + let segIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments.push({ + end: file.getUint16() + }); + } + file.skip(2); + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].start = file.getUint16(); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].delta = file.getUint16(); + } + let offsetsCount = 0, + offsetIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + const rangeOffset = file.getUint16(); + if (!rangeOffset) { + segment.offsetIndex = -1; + continue; + } + offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); + segment.offsetIndex = offsetIndex; + offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); + } + const offsets = []; + for (j = 0; j < offsetsCount; j++) { + offsets.push(file.getUint16()); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + start = segment.start; + const end = segment.end; + const delta = segment.delta; + offsetIndex = segment.offsetIndex; + for (j = start; j <= end; j++) { + if (j === 0xffff) { + continue; + } + glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; + glyphId = glyphId + delta & 0xffff; + mappings.push({ + charCode: j, + glyphId + }); + } + } + } else if (format === 6) { + file.skip(2 + 2); + const firstCode = file.getUint16(); + const entryCount = file.getUint16(); + for (j = 0; j < entryCount; j++) { + glyphId = file.getUint16(); + const charCode = firstCode + j; + mappings.push({ + charCode, + glyphId + }); + } + } else if (format === 12) { + file.skip(2 + 4 + 4); + const nGroups = file.getInt32() >>> 0; + for (j = 0; j < nGroups; j++) { + const startCharCode = file.getInt32() >>> 0; + const endCharCode = file.getInt32() >>> 0; + let glyphCode = file.getInt32() >>> 0; + for (let charCode = startCharCode; charCode <= endCharCode; charCode++) { + mappings.push({ + charCode, + glyphId: glyphCode++ + }); + } + } + } else { + warn("cmap table has unsupported format: " + format); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + mappings.sort(function (a, b) { + return a.charCode - b.charCode; + }); + for (let i = 1; i < mappings.length; i++) { + if (mappings[i - 1].charCode === mappings[i].charCode) { + mappings.splice(i, 1); + i--; + } + } + return { + platformId: potentialTable.platformId, + encodingId: potentialTable.encodingId, + mappings, + hasShortCmap + }; + } + function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) { + if (!header) { + if (metrics) { + metrics.data = null; + } + return; + } + file.pos = (file.start || 0) + header.offset; + file.pos += 4; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + const caretOffset = file.getUint16(); + file.pos += 8; + file.pos += 2; + let numOfMetrics = file.getUint16(); + if (caretOffset !== 0) { + const macStyle = int16(headTable.data[44], headTable.data[45]); + if (!(macStyle & 2)) { + header.data[22] = 0; + header.data[23] = 0; + } + } + if (numOfMetrics > numGlyphs) { + info(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`); + numOfMetrics = numGlyphs; + header.data[34] = (numOfMetrics & 0xff00) >> 8; + header.data[35] = numOfMetrics & 0x00ff; + } + const numOfSidebearings = numGlyphs - numOfMetrics; + const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1); + if (numMissing > 0) { + const entries = new Uint8Array(metrics.length + numMissing * 2); + entries.set(metrics.data); + if (dupFirstEntry) { + entries[metrics.length] = metrics.data[2]; + entries[metrics.length + 1] = metrics.data[3]; + } + metrics.data = entries; + } + } + function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { + const glyphProfile = { + length: 0, + sizeOfInstructions: 0 + }; + if (sourceStart < 0 || sourceStart >= source.length || sourceEnd > source.length || sourceEnd - sourceStart <= 12) { + return glyphProfile; + } + const glyf = source.subarray(sourceStart, sourceEnd); + const xMin = signedInt16(glyf[2], glyf[3]); + const yMin = signedInt16(glyf[4], glyf[5]); + const xMax = signedInt16(glyf[6], glyf[7]); + const yMax = signedInt16(glyf[8], glyf[9]); + if (xMin > xMax) { + writeSignedInt16(glyf, 2, xMax); + writeSignedInt16(glyf, 6, xMin); + } + if (yMin > yMax) { + writeSignedInt16(glyf, 4, yMax); + writeSignedInt16(glyf, 8, yMin); + } + const contoursCount = signedInt16(glyf[0], glyf[1]); + if (contoursCount < 0) { + if (contoursCount < -1) { + return glyphProfile; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + let i, + j = 10, + flagsCount = 0; + for (i = 0; i < contoursCount; i++) { + const endPoint = glyf[j] << 8 | glyf[j + 1]; + flagsCount = endPoint + 1; + j += 2; + } + const instructionsStart = j; + const instructionsLength = glyf[j] << 8 | glyf[j + 1]; + glyphProfile.sizeOfInstructions = instructionsLength; + j += 2 + instructionsLength; + const instructionsEnd = j; + let coordinatesLength = 0; + for (i = 0; i < flagsCount; i++) { + const flag = glyf[j++]; + if (flag & 0xc0) { + glyf[j - 1] = flag & 0x3f; + } + let xLength = 2; + if (flag & 2) { + xLength = 1; + } else if (flag & 16) { + xLength = 0; + } + let yLength = 2; + if (flag & 4) { + yLength = 1; + } else if (flag & 32) { + yLength = 0; + } + const xyLength = xLength + yLength; + coordinatesLength += xyLength; + if (flag & 8) { + const repeat = glyf[j++]; + if (repeat === 0) { + glyf[j - 1] ^= 8; + } + i += repeat; + coordinatesLength += repeat * xyLength; + } + } + if (coordinatesLength === 0) { + return glyphProfile; + } + let glyphDataLength = j + coordinatesLength; + if (glyphDataLength > glyf.length) { + return glyphProfile; + } + if (!hintsValid && instructionsLength > 0) { + dest.set(glyf.subarray(0, instructionsStart), destStart); + dest.set([0, 0], destStart + instructionsStart); + dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); + glyphDataLength -= instructionsLength; + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + } + glyphProfile.length = glyphDataLength; + return glyphProfile; + } + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + dest.set(glyf.subarray(0, glyphDataLength), destStart); + glyphProfile.length = glyphDataLength; + return glyphProfile; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + function sanitizeHead(head, numGlyphs, locaLength) { + const data = head.data; + const version = int32(data[0], data[1], data[2], data[3]); + if (version >> 16 !== 1) { + info("Attempting to fix invalid version in head table: " + version); + data[0] = 0; + data[1] = 1; + data[2] = 0; + data[3] = 0; + } + const indexToLocFormat = int16(data[50], data[51]); + if (indexToLocFormat < 0 || indexToLocFormat > 1) { + info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat); + const numGlyphsPlusOne = numGlyphs + 1; + if (locaLength === numGlyphsPlusOne << 1) { + data[50] = 0; + data[51] = 0; + } else if (locaLength === numGlyphsPlusOne << 2) { + data[50] = 0; + data[51] = 1; + } else { + throw new FormatError("Could not fix indexToLocFormat: " + indexToLocFormat); + } + } + } + function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) { + let itemSize, itemDecode, itemEncode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = function fontItemDecodeLong(data, offset) { + return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; + }; + itemEncode = function fontItemEncodeLong(data, offset, value) { + data[offset] = value >>> 24 & 0xff; + data[offset + 1] = value >> 16 & 0xff; + data[offset + 2] = value >> 8 & 0xff; + data[offset + 3] = value & 0xff; + }; + } else { + itemSize = 2; + itemDecode = function fontItemDecode(data, offset) { + return data[offset] << 9 | data[offset + 1] << 1; + }; + itemEncode = function fontItemEncode(data, offset, value) { + data[offset] = value >> 9 & 0xff; + data[offset + 1] = value >> 1 & 0xff; + }; + } + const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs; + const locaDataSize = itemSize * (1 + numGlyphsOut); + const locaData = new Uint8Array(locaDataSize); + locaData.set(loca.data.subarray(0, locaDataSize)); + loca.data = locaData; + const oldGlyfData = glyf.data; + const oldGlyfDataLength = oldGlyfData.length; + const newGlyfData = new Uint8Array(oldGlyfDataLength); + let i, j; + const locaEntries = []; + for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) { + let offset = itemDecode(locaData, j); + if (offset > oldGlyfDataLength) { + offset = oldGlyfDataLength; + } + locaEntries.push({ + index: i, + offset, + endOffset: 0 + }); + } + locaEntries.sort((a, b) => a.offset - b.offset); + for (i = 0; i < numGlyphs; i++) { + locaEntries[i].endOffset = locaEntries[i + 1].offset; + } + locaEntries.sort((a, b) => a.index - b.index); + for (i = 0; i < numGlyphs; i++) { + const { + offset, + endOffset + } = locaEntries[i]; + if (offset !== 0 || endOffset !== 0) { + break; + } + const nextOffset = locaEntries[i + 1].offset; + if (nextOffset === 0) { + continue; + } + locaEntries[i].endOffset = nextOffset; + break; + } + const last = locaEntries.at(-2); + if (last.offset !== 0 && last.endOffset === 0) { + last.endOffset = oldGlyfDataLength; + } + const missingGlyphs = Object.create(null); + let writeOffset = 0; + itemEncode(locaData, 0, writeOffset); + for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { + const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); + const newLength = glyphProfile.length; + if (newLength === 0) { + missingGlyphs[i] = true; + } + if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) { + maxSizeOfInstructions = glyphProfile.sizeOfInstructions; + } + writeOffset += newLength; + itemEncode(locaData, j, writeOffset); + } + if (writeOffset === 0) { + const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); + for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) { + itemEncode(locaData, j, simpleGlyph.length); + } + glyf.data = simpleGlyph; + } else if (dupFirstEntry) { + const firstEntryLength = itemDecode(locaData, itemSize); + if (newGlyfData.length > firstEntryLength + writeOffset) { + glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); + } else { + glyf.data = new Uint8Array(firstEntryLength + writeOffset); + glyf.data.set(newGlyfData.subarray(0, writeOffset)); + } + glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); + itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); + } else { + glyf.data = newGlyfData.subarray(0, writeOffset); + } + return { + missingGlyphs, + maxSizeOfInstructions + }; + } + function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) { + const start = (font.start || 0) + post.offset; + font.pos = start; + const length = post.length, + end = start + length; + const version = font.getInt32(); + font.skip(28); + let glyphNames; + let valid = true; + let i; + switch (version) { + case 0x00010000: + glyphNames = MacStandardGlyphOrdering; + break; + case 0x00020000: + const numGlyphs = font.getUint16(); + if (numGlyphs !== maxpNumGlyphs) { + valid = false; + break; + } + const glyphNameIndexes = []; + for (i = 0; i < numGlyphs; ++i) { + const index = font.getUint16(); + if (index >= 32768) { + valid = false; + break; + } + glyphNameIndexes.push(index); + } + if (!valid) { + break; + } + const customNames = [], + strBuf = []; + while (font.pos < end) { + const stringLength = font.getByte(); + strBuf.length = stringLength; + for (i = 0; i < stringLength; ++i) { + strBuf[i] = String.fromCharCode(font.getByte()); + } + customNames.push(strBuf.join("")); + } + glyphNames = []; + for (i = 0; i < numGlyphs; ++i) { + const j = glyphNameIndexes[i]; + if (j < 258) { + glyphNames.push(MacStandardGlyphOrdering[j]); + continue; + } + glyphNames.push(customNames[j - 258]); + } + break; + case 0x00030000: + break; + default: + warn("Unknown/unsupported post table version " + version); + valid = false; + if (propertiesObj.defaultEncoding) { + glyphNames = propertiesObj.defaultEncoding; + } + break; + } + propertiesObj.glyphNames = glyphNames; + return valid; + } + function readNameTable(nameTable) { + const start = (font.start || 0) + nameTable.offset; + font.pos = start; + const names = [[], []], + records = []; + const length = nameTable.length, + end = start + length; + const format = font.getUint16(); + const FORMAT_0_HEADER_LENGTH = 6; + if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { + return [names, records]; + } + const numRecords = font.getUint16(); + const stringsStart = font.getUint16(); + const NAME_RECORD_LENGTH = 12; + let i, ii; + for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { + const r = { + platform: font.getUint16(), + encoding: font.getUint16(), + language: font.getUint16(), + name: font.getUint16(), + length: font.getUint16(), + offset: font.getUint16() + }; + if (isMacNameRecord(r) || isWinNameRecord(r)) { + records.push(r); + } + } + for (i = 0, ii = records.length; i < ii; i++) { + const record = records[i]; + if (record.length <= 0) { + continue; + } + const pos = start + stringsStart + record.offset; + if (pos + record.length > end) { + continue; + } + font.pos = pos; + const nameIndex = record.name; + if (record.encoding) { + let str = ""; + for (let j = 0, jj = record.length; j < jj; j += 2) { + str += String.fromCharCode(font.getUint16()); + } + names[1][nameIndex] = str; + } else { + names[0][nameIndex] = font.getString(record.length); + } + } + return [names, records]; + } + const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; + function sanitizeTTProgram(table, ttContext) { + let data = table.data; + let i = 0, + j, + n, + b, + funcId, + pc, + lastEndf = 0, + lastDeff = 0; + const stack = []; + const callstack = []; + const functionsCalled = []; + let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; + let inFDEF = false, + ifLevel = 0, + inELSE = 0; + for (let ii = data.length; i < ii;) { + const op = data[i++]; + if (op === 0x40) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if (op === 0x41) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(b << 8 | data[i++]); + } + } + } else if ((op & 0xf8) === 0xb0) { + n = op - 0xb0 + 1; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if ((op & 0xf8) === 0xb8) { + n = op - 0xb8 + 1; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(signedInt16(b, data[i++])); + } + } + } else if (op === 0x2b && !tooComplexToFollowFunctions) { + if (!inFDEF && !inELSE) { + funcId = stack.at(-1); + if (isNaN(funcId)) { + info("TT: CALL empty stack (or invalid entry)."); + } else { + ttContext.functionsUsed[funcId] = true; + if (funcId in ttContext.functionsStackDeltas) { + const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId]; + if (newStackLength < 0) { + warn("TT: CALL invalid functions stack delta."); + ttContext.hintsValid = false; + return; + } + stack.length = newStackLength; + } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) { + callstack.push({ + data, + i, + stackTop: stack.length - 1 + }); + functionsCalled.push(funcId); + pc = ttContext.functionsDefined[funcId]; + if (!pc) { + warn("TT: CALL non-existent function"); + ttContext.hintsValid = false; + return; + } + data = pc.data; + i = pc.i; + } + } + } + } else if (op === 0x2c && !tooComplexToFollowFunctions) { + if (inFDEF || inELSE) { + warn("TT: nested FDEFs not allowed"); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + funcId = stack.pop(); + ttContext.functionsDefined[funcId] = { + data, + i + }; + } else if (op === 0x2d) { + if (inFDEF) { + inFDEF = false; + lastEndf = i; + } else { + pc = callstack.pop(); + if (!pc) { + warn("TT: ENDF bad stack"); + ttContext.hintsValid = false; + return; + } + funcId = functionsCalled.pop(); + data = pc.data; + i = pc.i; + ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; + } + } else if (op === 0x89) { + if (inFDEF || inELSE) { + warn("TT: nested IDEFs not allowed"); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + } else if (op === 0x58) { + ++ifLevel; + } else if (op === 0x1b) { + inELSE = ifLevel; + } else if (op === 0x59) { + if (inELSE === ifLevel) { + inELSE = 0; + } + --ifLevel; + } else if (op === 0x1c) { + if (!inFDEF && !inELSE) { + const offset = stack.at(-1); + if (offset > 0) { + i += offset - 1; + } + } + } + if (!inFDEF && !inELSE) { + let stackDelta = 0; + if (op <= 0x8e) { + stackDelta = TTOpsStackDeltas[op]; + } else if (op >= 0xc0 && op <= 0xdf) { + stackDelta = -1; + } else if (op >= 0xe0) { + stackDelta = -2; + } + if (op >= 0x71 && op <= 0x75) { + n = stack.pop(); + if (!isNaN(n)) { + stackDelta = -n * 2; + } + } + while (stackDelta < 0 && stack.length > 0) { + stack.pop(); + stackDelta++; + } + while (stackDelta > 0) { + stack.push(NaN); + stackDelta--; + } + } + } + ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; + const content = [data]; + if (i > data.length) { + content.push(new Uint8Array(i - data.length)); + } + if (lastDeff > lastEndf) { + warn("TT: complementing a missing function tail"); + content.push(new Uint8Array([0x22, 0x2d])); + } + foldTTTable(table, content); + } + function checkInvalidFunctions(ttContext, maxFunctionDefs) { + if (ttContext.tooComplexToFollowFunctions) { + return; + } + if (ttContext.functionsDefined.length > maxFunctionDefs) { + warn("TT: more functions defined than expected"); + ttContext.hintsValid = false; + return; + } + for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { + if (j > maxFunctionDefs) { + warn("TT: invalid function id: " + j); + ttContext.hintsValid = false; + return; + } + if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { + warn("TT: undefined function: " + j); + ttContext.hintsValid = false; + return; + } + } + } + function foldTTTable(table, content) { + if (content.length > 1) { + let newLength = 0; + let j, jj; + for (j = 0, jj = content.length; j < jj; j++) { + newLength += content[j].length; + } + newLength = newLength + 3 & ~3; + const result = new Uint8Array(newLength); + let pos = 0; + for (j = 0, jj = content.length; j < jj; j++) { + result.set(content[j], pos); + pos += content[j].length; + } + table.data = result; + table.length = newLength; + } + } + function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { + const ttContext = { + functionsDefined: [], + functionsUsed: [], + functionsStackDeltas: [], + tooComplexToFollowFunctions: false, + hintsValid: true + }; + if (fpgm) { + sanitizeTTProgram(fpgm, ttContext); + } + if (prep) { + sanitizeTTProgram(prep, ttContext); + } + if (fpgm) { + checkInvalidFunctions(ttContext, maxFunctionDefs); + } + if (cvt && cvt.length & 1) { + const cvtData = new Uint8Array(cvt.length + 1); + cvtData.set(cvt.data); + cvt.data = cvtData; + } + return ttContext.hintsValid; + } + font = new Stream(new Uint8Array(font.getBytes())); + let header, tables; + if (isTrueTypeCollectionFile(font)) { + const ttcData = readTrueTypeCollectionData(font, this.name); + header = ttcData.header; + tables = ttcData.tables; + } else { + header = readOpenTypeHeader(font); + tables = readTables(font, header.numTables); + } + let cff, cffFile; + const isTrueType = !tables["CFF "]; + if (!isTrueType) { + const isComposite = properties.composite && (properties.cidToGidMap?.length > 0 || !(properties.cMap instanceof IdentityCMap)); + if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { + cffFile = new Stream(tables["CFF "].data); + cff = new CFFFont(cffFile, properties); + adjustWidths(properties); + return this.convert(name, cff, properties); + } + delete tables.glyf; + delete tables.loca; + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + this.isOpenType = true; + } else { + if (!tables.loca) { + throw new FormatError('Required "loca" table is not found'); + } + if (!tables.glyf) { + warn('Required "glyf" table is not found -- trying to recover.'); + tables.glyf = { + tag: "glyf", + data: new Uint8Array(0) + }; + } + this.isOpenType = false; + } + if (!tables.maxp) { + throw new FormatError('Required "maxp" table is not found'); + } + font.pos = (font.start || 0) + tables.maxp.offset; + let version = font.getInt32(); + const numGlyphs = font.getUint16(); + if (version !== 0x00010000 && version !== 0x00005000) { + if (tables.maxp.length === 6) { + version = 0x0005000; + } else if (tables.maxp.length >= 32) { + version = 0x00010000; + } else { + throw new FormatError(`"maxp" table has a wrong version number`); + } + writeUint32(tables.maxp.data, 0, version); + } + if (properties.scaleFactors?.length === numGlyphs && isTrueType) { + const { + scaleFactors + } = properties; + const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + const glyphs = new GlyfTable({ + glyfTable: tables.glyf.data, + isGlyphLocationsLong, + locaTable: tables.loca.data, + numGlyphs + }); + glyphs.scale(scaleFactors); + const { + glyf, + loca, + isLocationLong + } = glyphs.write(); + tables.glyf.data = glyf; + tables.loca.data = loca; + if (isLocationLong !== !!isGlyphLocationsLong) { + tables.head.data[50] = 0; + tables.head.data[51] = isLocationLong ? 1 : 0; + } + const metrics = tables.hmtx.data; + for (let i = 0; i < numGlyphs; i++) { + const j = 4 * i; + const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1])); + metrics[j] = advanceWidth >> 8 & 0xff; + metrics[j + 1] = advanceWidth & 0xff; + const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])); + writeSignedInt16(metrics, j + 2, lsb); + } + } + let numGlyphsOut = numGlyphs + 1; + let dupFirstEntry = true; + if (numGlyphsOut > 0xffff) { + dupFirstEntry = false; + numGlyphsOut = numGlyphs; + warn("Not enough space in glyfs to duplicate first glyph."); + } + let maxFunctionDefs = 0; + let maxSizeOfInstructions = 0; + if (version >= 0x00010000 && tables.maxp.length >= 32) { + font.pos += 8; + const maxZones = font.getUint16(); + if (maxZones > 2) { + tables.maxp.data[14] = 0; + tables.maxp.data[15] = 2; + } + font.pos += 4; + maxFunctionDefs = font.getUint16(); + font.pos += 4; + maxSizeOfInstructions = font.getUint16(); + } + tables.maxp.data[4] = numGlyphsOut >> 8; + tables.maxp.data[5] = numGlyphsOut & 255; + const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs); + if (!hintsValid) { + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + } + sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry); + if (!tables.head) { + throw new FormatError('Required "head" table is not found'); + } + sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); + let missingGlyphs = Object.create(null); + if (isTrueType) { + const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions); + missingGlyphs = glyphsInfo.missingGlyphs; + if (version >= 0x00010000 && tables.maxp.length >= 32) { + tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8; + tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255; + } + } + if (!tables.hhea) { + throw new FormatError('Required "hhea" table is not found'); + } + if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { + tables.hhea.data[10] = 0xff; + tables.hhea.data[11] = 0xff; + } + const metricsOverride = { + unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), + yMax: signedInt16(tables.head.data[42], tables.head.data[43]), + yMin: signedInt16(tables.head.data[38], tables.head.data[39]), + ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]), + descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]), + lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9]) + }; + this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; + this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; + this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm; + if (this.cssFontInfo?.lineHeight) { + this.lineHeight = this.cssFontInfo.metrics.lineHeight; + this.lineGap = this.cssFontInfo.metrics.lineGap; + } else { + this.lineHeight = this.ascent - this.descent + this.lineGap; + } + if (tables.post) { + readPostScriptTable(tables.post, properties, numGlyphs); + } + tables.post = { + tag: "post", + data: createPostTable(properties) + }; + const charCodeToGlyphId = Object.create(null); + function hasGlyph(glyphId) { + return !missingGlyphs[glyphId]; + } + if (properties.composite) { + const cidToGidMap = properties.cidToGidMap || []; + const isCidToGidMapEmpty = cidToGidMap.length === 0; + properties.cMap.forEach(function (charCode, cid) { + if (typeof cid === "string") { + cid = convertCidString(charCode, cid, true); + } + if (cid > 0xffff) { + throw new FormatError("Max size of CID is 65,535"); + } + let glyphId = -1; + if (isCidToGidMapEmpty) { + glyphId = cid; + } else if (cidToGidMap[cid] !== undefined) { + glyphId = cidToGidMap[cid]; + } + if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) { + charCodeToGlyphId[charCode] = glyphId; + } + }); + } else { + const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding); + const cmapPlatformId = cmapTable.platformId; + const cmapEncodingId = cmapTable.encodingId; + const cmapMappings = cmapTable.mappings; + let baseEncoding = [], + forcePostTable = false; + if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) { + baseEncoding = getEncoding(properties.baseEncodingName); + } + if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) { + const glyphsUnicodeMap = getGlyphsUnicode(); + for (let charCode = 0; charCode < 256; charCode++) { + let glyphName; + if (this.differences[charCode] !== undefined) { + glyphName = this.differences[charCode]; + } else if (baseEncoding.length && baseEncoding[charCode] !== "") { + glyphName = baseEncoding[charCode]; + } else { + glyphName = StandardEncoding[charCode]; + } + if (!glyphName) { + continue; + } + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + let unicodeOrCharCode; + if (cmapPlatformId === 3 && cmapEncodingId === 1) { + unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; + } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { + unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); + } + if (unicodeOrCharCode === undefined) { + if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) { + const unicode = this.toUnicode.get(charCode); + if (unicode) { + unicodeOrCharCode = unicode.codePointAt(0); + } + } + if (unicodeOrCharCode === undefined) { + continue; + } + } + for (const mapping of cmapMappings) { + if (mapping.charCode !== unicodeOrCharCode) { + continue; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + break; + } + } + } else if (cmapPlatformId === 0) { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; + } + forcePostTable = true; + } else if (cmapPlatformId === 3 && cmapEncodingId === 0) { + for (const mapping of cmapMappings) { + let charCode = mapping.charCode; + if (charCode >= 0xf000 && charCode <= 0xf0ff) { + charCode &= 0xff; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + } + } else { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; + } + } + if (properties.glyphNames && (baseEncoding.length || this.differences.length)) { + for (let i = 0; i < 256; ++i) { + if (!forcePostTable && charCodeToGlyphId[i] !== undefined) { + continue; + } + const glyphName = this.differences[i] || baseEncoding[i]; + if (!glyphName) { + continue; + } + const glyphId = properties.glyphNames.indexOf(glyphName); + if (glyphId > 0 && hasGlyph(glyphId)) { + charCodeToGlyphId[i] = glyphId; + } + } + } + } + if (charCodeToGlyphId.length === 0) { + charCodeToGlyphId[0] = 0; + } + let glyphZeroId = numGlyphsOut - 1; + if (!dupFirstEntry) { + glyphZeroId = 0; + } + if (!properties.cssFontInfo) { + const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode); + this.toFontChar = newMapping.toFontChar; + tables.cmap = { + tag: "cmap", + data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut) + }; + if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) { + tables["OS/2"] = { + tag: "OS/2", + data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) + }; + } + } + if (!isTrueType) { + try { + cffFile = new Stream(tables["CFF "].data); + const parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); + cff = parser.parse(); + cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(cff); + tables["CFF "].data = compiler.compile(); + } catch { + warn("Failed to compile font " + properties.loadedName); + } + } + if (!tables.name) { + tables.name = { + tag: "name", + data: createNameTable(this.name) + }; + } else { + const [namePrototype, nameRecords] = readNameTable(tables.name); + tables.name.data = createNameTable(name, namePrototype); + this.psName = namePrototype[0][6] || null; + if (!properties.composite) { + adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords); + } + } + const builder = new OpenTypeFileBuilder(header.version); + for (const tableTag in tables) { + builder.addTable(tableTag, tables[tableTag].data); + } + return builder.toArray(); + } + convert(fontName, font, properties) { + properties.fixedPitch = false; + if (properties.builtInEncoding) { + adjustType1ToUnicode(properties, properties.builtInEncoding); + } + let glyphZeroId = 1; + if (font instanceof CFFFont) { + glyphZeroId = font.numGlyphs - 1; + } + const mapping = font.getGlyphMapping(properties); + let newMapping = null; + let newCharCodeToGlyphId = mapping; + let toUnicodeExtraMap = null; + if (!properties.cssFontInfo) { + newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode); + this.toFontChar = newMapping.toFontChar; + newCharCodeToGlyphId = newMapping.charCodeToGlyphId; + toUnicodeExtraMap = newMapping.toUnicodeExtraMap; + } + const numGlyphs = font.numGlyphs; + function getCharCodes(charCodeToGlyphId, glyphId) { + let charCodes = null; + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + (charCodes ||= []).push(charCode | 0); + } + } + return charCodes; + } + function createCharCode(charCodeToGlyphId, glyphId) { + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + return charCode | 0; + } + } + newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; + return newMapping.nextAvailableFontCharCode++; + } + const seacs = font.seacs; + if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) { + const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; + const charset = font.getCharset(); + const seacMap = Object.create(null); + for (let glyphId in seacs) { + glyphId |= 0; + const seac = seacs[glyphId]; + const baseGlyphName = StandardEncoding[seac[2]]; + const accentGlyphName = StandardEncoding[seac[3]]; + const baseGlyphId = charset.indexOf(baseGlyphName); + const accentGlyphId = charset.indexOf(accentGlyphName); + if (baseGlyphId < 0 || accentGlyphId < 0) { + continue; + } + const accentOffset = { + x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], + y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] + }; + const charCodes = getCharCodes(mapping, glyphId); + if (!charCodes) { + continue; + } + for (const charCode of charCodes) { + const charCodeToGlyphId = newMapping.charCodeToGlyphId; + const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); + const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); + seacMap[charCode] = { + baseFontCharCode, + accentFontCharCode, + accentOffset + }; + } + } + properties.seacMap = seacMap; + } + const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000; + const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); + builder.addTable("CFF ", font.data); + builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); + builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)); + builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + "\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + "\x00\x00" + "\x00\x00"); + builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs)); + builder.addTable("hmtx", function fontFieldsHmtx() { + const charstrings = font.charstrings; + const cffWidths = font.cff ? font.cff.widths : null; + let hmtx = "\x00\x00\x00\x00"; + for (let i = 1, ii = numGlyphs; i < ii; i++) { + let width = 0; + if (charstrings) { + const charstring = charstrings[i - 1]; + width = "width" in charstring ? charstring.width : 0; + } else if (cffWidths) { + width = Math.ceil(cffWidths[i] || 0); + } + hmtx += string16(width) + string16(0); + } + return hmtx; + }()); + builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); + builder.addTable("name", createNameTable(fontName)); + builder.addTable("post", createPostTable(properties)); + return builder.toArray(); + } + get _spaceWidth() { + const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; + let width; + for (const glyphName of possibleSpaceReplacements) { + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + const glyphUnicode = glyphsUnicodeMap[glyphName]; + let charcode = 0; + if (this.composite && this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } + } + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + if (charcode <= 0) { + charcode = glyphUnicode; + } + width = this.widths[charcode]; + if (width) { + break; + } + } + return shadow(this, "_spaceWidth", width || this.defaultWidth); + } + _charToGlyph(charcode, isSpace = false) { + let glyph = this._glyphCache[charcode]; + if (glyph?.isSpace === isSpace) { + return glyph; + } + let fontCharCode, width, operatorListId; + let widthCode = charcode; + if (this.cMap?.contains(charcode)) { + widthCode = this.cMap.lookup(charcode); + if (typeof widthCode === "string") { + widthCode = convertCidString(charcode, widthCode); + } + } + width = this.widths[widthCode]; + if (typeof width !== "number") { + width = this.defaultWidth; + } + const vmetric = this.vmetrics?.[widthCode]; + let unicode = this.toUnicode.get(charcode) || charcode; + if (typeof unicode === "number") { + unicode = String.fromCharCode(unicode); + } + let isInFont = this.toFontChar[charcode] !== undefined; + fontCharCode = this.toFontChar[charcode] || charcode; + if (this.missingFile) { + const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; + if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { + fontCharCode = 0x20; + if (glyphName === "") { + width ||= this._spaceWidth; + unicode = String.fromCharCode(fontCharCode); + } + } + fontCharCode = mapSpecialUnicodeValues(fontCharCode); + } + if (this.isType3Font) { + operatorListId = fontCharCode; + } + let accent = null; + if (this.seacMap?.[charcode]) { + isInFont = true; + const seac = this.seacMap[charcode]; + fontCharCode = seac.baseFontCharCode; + accent = { + fontChar: String.fromCodePoint(seac.accentFontCharCode), + offset: seac.accentOffset + }; + } + let fontChar = ""; + if (typeof fontCharCode === "number") { + if (fontCharCode <= 0x10ffff) { + fontChar = String.fromCodePoint(fontCharCode); + } else { + warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); + } + } + if (this.missingFile && this.vertical && fontChar.length === 1) { + const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; + if (vertical) { + fontChar = unicode = String.fromCharCode(vertical); + } + } + glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); + return this._glyphCache[charcode] = glyph; + } + charsToGlyphs(chars) { + let glyphs = this._charsCache[chars]; + if (glyphs) { + return glyphs; + } + glyphs = []; + if (this.cMap) { + const c = Object.create(null), + ii = chars.length; + let i = 0; + while (i < ii) { + this.cMap.readCharCode(chars, i, c); + const { + charcode, + length + } = c; + i += length; + const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20); + glyphs.push(glyph); + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + const charcode = chars.charCodeAt(i); + const glyph = this._charToGlyph(charcode, charcode === 0x20); + glyphs.push(glyph); + } + } + return this._charsCache[chars] = glyphs; + } + getCharPositions(chars) { + const positions = []; + if (this.cMap) { + const c = Object.create(null); + let i = 0; + while (i < chars.length) { + this.cMap.readCharCode(chars, i, c); + const length = c.length; + positions.push([i, i + length]); + i += length; + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + positions.push([i, i + 1]); + } + } + return positions; + } + get glyphCacheValues() { + return Object.values(this._glyphCache); + } + encodeString(str) { + const buffers = []; + const currentBuf = []; + const hasCurrentBufErrors = () => buffers.length % 2 === 1; + const getCharCode = this.toUnicode instanceof IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode)); + for (let i = 0, ii = str.length; i < ii; i++) { + const unicode = str.codePointAt(i); + if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) { + i++; + } + if (this.toUnicode) { + const charCode = getCharCode(unicode); + if (charCode !== -1) { + if (hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1; + for (let j = charCodeLength - 1; j >= 0; j--) { + currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff)); + } + continue; + } + } + if (!hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + currentBuf.push(String.fromCodePoint(unicode)); + } + buffers.push(currentBuf.join("")); + return buffers; + } +} +class ErrorFont { + constructor(error) { + this.error = error; + this.loadedName = "g_font_error"; + this.missingFile = true; + } + charsToGlyphs() { + return []; + } + encodeString(chars) { + return [chars]; + } + exportData(extraProperties = false) { + return { + error: this.error + }; + } +} + +;// ./src/core/pattern.js + + + + +const ShadingType = { + FUNCTION_BASED: 1, + AXIAL: 2, + RADIAL: 3, + FREE_FORM_MESH: 4, + LATTICE_FORM_MESH: 5, + COONS_PATCH_MESH: 6, + TENSOR_PATCH_MESH: 7 +}; +class Pattern { + constructor() { + unreachable("Cannot initialize Pattern."); + } + static parseShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache) { + const dict = shading instanceof BaseStream ? shading.dict : shading; + const type = dict.get("ShadingType"); + try { + switch (type) { + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, localColorSpaceCache); + case ShadingType.FREE_FORM_MESH: + case ShadingType.LATTICE_FORM_MESH: + case ShadingType.COONS_PATCH_MESH: + case ShadingType.TENSOR_PATCH_MESH: + return new MeshShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache); + default: + throw new FormatError("Unsupported ShadingType: " + type); + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(ex); + return new DummyShading(); + } + } +} +class BaseShading { + static SMALL_NUMBER = 1e-6; + getIR() { + unreachable("Abstract method `getIR` called."); + } +} +class RadialAxialShading extends BaseShading { + constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) { + super(); + this.shadingType = dict.get("ShadingType"); + let coordsLen = 0; + if (this.shadingType === ShadingType.AXIAL) { + coordsLen = 4; + } else if (this.shadingType === ShadingType.RADIAL) { + coordsLen = 6; + } + this.coordsArr = dict.getArray("Coords"); + if (!isNumberArray(this.coordsArr, coordsLen)) { + throw new FormatError("RadialAxialShading: Invalid /Coords array."); + } + const cs = ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache + }); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + let t0 = 0.0, + t1 = 1.0; + const domainArr = dict.getArray("Domain"); + if (isNumberArray(domainArr, 2)) { + [t0, t1] = domainArr; + } + let extendStart = false, + extendEnd = false; + const extendArr = dict.getArray("Extend"); + if (isBooleanArray(extendArr, 2)) { + [extendStart, extendEnd] = extendArr; + } + if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { + const [x1, y1, r1, x2, y2, r2] = this.coordsArr; + const distance = Math.hypot(x1 - x2, y1 - y2); + if (r1 <= r2 + distance && r2 <= r1 + distance) { + warn("Unsupported radial gradient."); + } + } + this.extendStart = extendStart; + this.extendEnd = extendEnd; + const fnObj = dict.getRaw("Function"); + const fn = pdfFunctionFactory.createFromArray(fnObj); + const NUMBER_OF_SAMPLES = 840; + const step = (t1 - t0) / NUMBER_OF_SAMPLES; + const colorStops = this.colorStops = []; + if (t0 >= t1 || step <= 0) { + info("Bad shading domain."); + return; + } + const color = new Float32Array(cs.numComps), + ratio = new Float32Array(1); + let rgbColor; + let iBase = 0; + ratio[0] = t0; + fn(ratio, 0, color, 0); + let rgbBase = cs.getRgb(color, 0); + const cssColorBase = Util.makeHexColor(rgbBase[0], rgbBase[1], rgbBase[2]); + colorStops.push([0, cssColorBase]); + let iPrev = 1; + ratio[0] = t0 + step; + fn(ratio, 0, color, 0); + let rgbPrev = cs.getRgb(color, 0); + let maxSlopeR = rgbPrev[0] - rgbBase[0] + 1; + let maxSlopeG = rgbPrev[1] - rgbBase[1] + 1; + let maxSlopeB = rgbPrev[2] - rgbBase[2] + 1; + let minSlopeR = rgbPrev[0] - rgbBase[0] - 1; + let minSlopeG = rgbPrev[1] - rgbBase[1] - 1; + let minSlopeB = rgbPrev[2] - rgbBase[2] - 1; + for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { + ratio[0] = t0 + i * step; + fn(ratio, 0, color, 0); + rgbColor = cs.getRgb(color, 0); + const run = i - iBase; + maxSlopeR = Math.min(maxSlopeR, (rgbColor[0] - rgbBase[0] + 1) / run); + maxSlopeG = Math.min(maxSlopeG, (rgbColor[1] - rgbBase[1] + 1) / run); + maxSlopeB = Math.min(maxSlopeB, (rgbColor[2] - rgbBase[2] + 1) / run); + minSlopeR = Math.max(minSlopeR, (rgbColor[0] - rgbBase[0] - 1) / run); + minSlopeG = Math.max(minSlopeG, (rgbColor[1] - rgbBase[1] - 1) / run); + minSlopeB = Math.max(minSlopeB, (rgbColor[2] - rgbBase[2] - 1) / run); + const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; + if (!slopesExist) { + const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); + colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); + maxSlopeR = rgbColor[0] - rgbPrev[0] + 1; + maxSlopeG = rgbColor[1] - rgbPrev[1] + 1; + maxSlopeB = rgbColor[2] - rgbPrev[2] + 1; + minSlopeR = rgbColor[0] - rgbPrev[0] - 1; + minSlopeG = rgbColor[1] - rgbPrev[1] - 1; + minSlopeB = rgbColor[2] - rgbPrev[2] - 1; + iBase = iPrev; + rgbBase = rgbPrev; + } + iPrev = i; + rgbPrev = rgbColor; + } + const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); + colorStops.push([1, cssColor]); + let background = "transparent"; + if (dict.has("Background")) { + rgbColor = cs.getRgb(dict.get("Background"), 0); + background = Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); + } + if (!extendStart) { + colorStops.unshift([0, background]); + colorStops[1][0] += BaseShading.SMALL_NUMBER; + } + if (!extendEnd) { + colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; + colorStops.push([1, background]); + } + this.colorStops = colorStops; + } + getIR() { + const { + coordsArr, + shadingType + } = this; + let type, p0, p1, r0, r1; + if (shadingType === ShadingType.AXIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[2], coordsArr[3]]; + r0 = null; + r1 = null; + type = "axial"; + } else if (shadingType === ShadingType.RADIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[3], coordsArr[4]]; + r0 = coordsArr[2]; + r1 = coordsArr[5]; + type = "radial"; + } else { + unreachable(`getPattern type unknown: ${shadingType}`); + } + return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; + } +} +class MeshStreamReader { + constructor(stream, context) { + this.stream = stream; + this.context = context; + this.buffer = 0; + this.bufferLength = 0; + const numComps = context.numComps; + this.tmpCompsBuf = new Float32Array(numComps); + const csNumComps = context.colorSpace.numComps; + this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; + } + get hasData() { + if (this.stream.end) { + return this.stream.pos < this.stream.end; + } + if (this.bufferLength > 0) { + return true; + } + const nextByte = this.stream.getByte(); + if (nextByte < 0) { + return false; + } + this.buffer = nextByte; + this.bufferLength = 8; + return true; + } + readBits(n) { + let buffer = this.buffer; + let bufferLength = this.bufferLength; + if (n === 32) { + if (bufferLength === 0) { + return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0; + } + buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte(); + const nextByte = this.stream.getByte(); + this.buffer = nextByte & (1 << bufferLength) - 1; + return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; + } + if (n === 8 && bufferLength === 0) { + return this.stream.getByte(); + } + while (bufferLength < n) { + buffer = buffer << 8 | this.stream.getByte(); + bufferLength += 8; + } + bufferLength -= n; + this.bufferLength = bufferLength; + this.buffer = buffer & (1 << bufferLength) - 1; + return buffer >> bufferLength; + } + align() { + this.buffer = 0; + this.bufferLength = 0; + } + readFlag() { + return this.readBits(this.context.bitsPerFlag); + } + readCoordinate() { + const bitsPerCoordinate = this.context.bitsPerCoordinate; + const xi = this.readBits(bitsPerCoordinate); + const yi = this.readBits(bitsPerCoordinate); + const decode = this.context.decode; + const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; + return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; + } + readComponents() { + const numComps = this.context.numComps; + const bitsPerComponent = this.context.bitsPerComponent; + const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; + const decode = this.context.decode; + const components = this.tmpCompsBuf; + for (let i = 0, j = 4; i < numComps; i++, j += 2) { + const ci = this.readBits(bitsPerComponent); + components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; + } + const color = this.tmpCsCompsBuf; + if (this.context.colorFn) { + this.context.colorFn(components, 0, color, 0); + } + return this.context.colorSpace.getRgb(color, 0); + } +} +let bCache = Object.create(null); +function buildB(count) { + const lut = []; + for (let i = 0; i <= count; i++) { + const t = i / count, + t_ = 1 - t; + lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])); + } + return lut; +} +function getB(count) { + return bCache[count] ||= buildB(count); +} +function clearPatternCaches() { + bCache = Object.create(null); +} +class MeshShading extends BaseShading { + static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; + static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; + static TRIANGLE_DENSITY = 20; + constructor(stream, xref, resources, pdfFunctionFactory, localColorSpaceCache) { + super(); + if (!(stream instanceof BaseStream)) { + throw new FormatError("Mesh data is not a stream"); + } + const dict = stream.dict; + this.shadingType = dict.get("ShadingType"); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null; + this.coords = []; + this.colors = []; + this.figures = []; + const decodeContext = { + bitsPerCoordinate: dict.get("BitsPerCoordinate"), + bitsPerComponent: dict.get("BitsPerComponent"), + bitsPerFlag: dict.get("BitsPerFlag"), + decode: dict.getArray("Decode"), + colorFn: fn, + colorSpace: cs, + numComps: fn ? 1 : cs.numComps + }; + const reader = new MeshStreamReader(stream, decodeContext); + let patchMesh = false; + switch (this.shadingType) { + case ShadingType.FREE_FORM_MESH: + this._decodeType4Shading(reader); + break; + case ShadingType.LATTICE_FORM_MESH: + const verticesPerRow = dict.get("VerticesPerRow") | 0; + if (verticesPerRow < 2) { + throw new FormatError("Invalid VerticesPerRow"); + } + this._decodeType5Shading(reader, verticesPerRow); + break; + case ShadingType.COONS_PATCH_MESH: + this._decodeType6Shading(reader); + patchMesh = true; + break; + case ShadingType.TENSOR_PATCH_MESH: + this._decodeType7Shading(reader); + patchMesh = true; + break; + default: + unreachable("Unsupported mesh type."); + break; + } + if (patchMesh) { + this._updateBounds(); + for (let i = 0, ii = this.figures.length; i < ii; i++) { + this._buildFigureFromPatch(i); + } + } + this._updateBounds(); + this._packData(); + } + _decodeType4Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const operators = []; + const ps = []; + let verticesLeft = 0; + while (reader.hasData) { + const f = reader.readFlag(); + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + if (verticesLeft === 0) { + if (!(0 <= f && f <= 2)) { + throw new FormatError("Unknown type4 flag"); + } + switch (f) { + case 0: + verticesLeft = 3; + break; + case 1: + ps.push(ps.at(-2), ps.at(-1)); + verticesLeft = 1; + break; + case 2: + ps.push(ps.at(-3), ps.at(-1)); + verticesLeft = 1; + break; + } + operators.push(f); + } + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); + } + this.figures.push({ + type: "triangles", + coords: new Int32Array(ps), + colors: new Int32Array(ps) + }); + } + _decodeType5Shading(reader, verticesPerRow) { + const coords = this.coords; + const colors = this.colors; + const ps = []; + while (reader.hasData) { + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); + } + this.figures.push({ + type: "lattice", + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow + }); + } + _decodeType6Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type6 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + ps[5] = coords.length; + coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]); + ps[6] = coords.length; + coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]); + ps[9] = coords.length; + coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); + ps[10] = coords.length; + coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); + this.figures.push({ + type: "patch", + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _decodeType7Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type7 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[9] = pi + 13; + ps[10] = pi + 14; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[5] = pi + 12; + ps[6] = pi + 15; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + this.figures.push({ + type: "patch", + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _buildFigureFromPatch(index) { + const figure = this.figures[index]; + assert(figure.type === "patch", "Unexpected patch mesh figure"); + const coords = this.coords, + colors = this.colors; + const pi = figure.coords; + const ci = figure.colors; + const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); + splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); + let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); + splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); + const verticesPerRow = splitXBy + 1; + const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); + const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); + let k = 0; + const cl = new Uint8Array(3), + cr = new Uint8Array(3); + const c0 = colors[ci[0]], + c1 = colors[ci[1]], + c2 = colors[ci[2]], + c3 = colors[ci[3]]; + const bRow = getB(splitYBy), + bCol = getB(splitXBy); + for (let row = 0; row <= splitYBy; row++) { + cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; + cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; + cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; + cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; + cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; + cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; + for (let col = 0; col <= splitXBy; col++, k++) { + if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { + continue; + } + let x = 0, + y = 0; + let q = 0; + for (let i = 0; i <= 3; i++) { + for (let j = 0; j <= 3; j++, q++) { + const m = bRow[row][i] * bCol[col][j]; + x += coords[pi[q]][0] * m; + y += coords[pi[q]][1] * m; + } + } + figureCoords[k] = coords.length; + coords.push([x, y]); + figureColors[k] = colors.length; + const newColor = new Uint8Array(3); + newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; + newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; + newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; + colors.push(newColor); + } + } + figureCoords[0] = pi[0]; + figureColors[0] = ci[0]; + figureCoords[splitXBy] = pi[3]; + figureColors[splitXBy] = ci[1]; + figureCoords[verticesPerRow * splitYBy] = pi[12]; + figureColors[verticesPerRow * splitYBy] = ci[2]; + figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; + figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; + this.figures[index] = { + type: "lattice", + coords: figureCoords, + colors: figureColors, + verticesPerRow + }; + } + _updateBounds() { + let minX = this.coords[0][0], + minY = this.coords[0][1], + maxX = minX, + maxY = minY; + for (let i = 1, ii = this.coords.length; i < ii; i++) { + const x = this.coords[i][0], + y = this.coords[i][1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + this.bounds = [minX, minY, maxX, maxY]; + } + _packData() { + let i, ii, j, jj; + const coords = this.coords; + const coordsPacked = new Float32Array(coords.length * 2); + for (i = 0, j = 0, ii = coords.length; i < ii; i++) { + const xy = coords[i]; + coordsPacked[j++] = xy[0]; + coordsPacked[j++] = xy[1]; + } + this.coords = coordsPacked; + const colors = this.colors; + const colorsPacked = new Uint8Array(colors.length * 3); + for (i = 0, j = 0, ii = colors.length; i < ii; i++) { + const c = colors[i]; + colorsPacked[j++] = c[0]; + colorsPacked[j++] = c[1]; + colorsPacked[j++] = c[2]; + } + this.colors = colorsPacked; + const figures = this.figures; + for (i = 0, ii = figures.length; i < ii; i++) { + const figure = figures[i], + ps = figure.coords, + cs = figure.colors; + for (j = 0, jj = ps.length; j < jj; j++) { + ps[j] *= 2; + cs[j] *= 3; + } + } + } + getIR() { + const { + bounds + } = this; + if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) { + throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`); + } + return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, bounds, this.bbox, this.background]; + } +} +class DummyShading extends BaseShading { + getIR() { + return ["Dummy"]; + } +} +function getTilingPatternIR(operatorList, dict, color) { + const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { + throw new FormatError(`Invalid getTilingPatternIR /BBox array.`); + } + const xstep = dict.get("XStep"); + if (typeof xstep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /XStep value.`); + } + const ystep = dict.get("YStep"); + if (typeof ystep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /YStep value.`); + } + const paintType = dict.get("PaintType"); + if (!Number.isInteger(paintType)) { + throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`); + } + const tilingType = dict.get("TilingType"); + if (!Number.isInteger(tilingType)) { + throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`); + } + return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType]; +} + +;// ./src/core/calibri_factors.js +const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriBoldMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +const CalibriBoldItalicFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriBoldItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +const CalibriItalicFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85865, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +const CalibriRegularFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriRegularMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; + +;// ./src/core/helvetica_factors.js +const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const HelveticaBoldItalicFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973, 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaBoldItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2 +}; +const HelveticaItalicFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954, 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2 +}; +const HelveticaRegularFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043, 0.99953, 1.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; + +;// ./src/core/liberationsans_widths.js +const LiberationSansBoldWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556, 709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; +const LiberationSansBoldMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +const LiberationSansBoldItalicWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556, 736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; +const LiberationSansBoldItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +const LiberationSansItalicWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556, 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846, 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667, 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278, 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222, 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728, 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500, 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 667, 917, 614, 715, 715, 589, 686, 833, 722, 778, 725, 667, 722, 611, 639, 795, 667, 727, 673, 920, 923, 805, 886, 651, 694, 1022, 682, 556, 562, 522, 493, 553, 556, 688, 465, 556, 556, 472, 564, 686, 550, 556, 556, 556, 500, 833, 500, 835, 500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 556, 556, 556, 378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492, 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; +const LiberationSansItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +const LiberationSansRegularWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556, 669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; +const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; + +;// ./src/core/myriadpro_factors.js +const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const MyriadProBoldItalicFactors = [1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, 1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.20006, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProBoldItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const MyriadProItalicFactors = [1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, 1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const MyriadProRegularFactors = [1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; + +;// ./src/core/segoeui_factors.js +const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiBoldMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +const SegoeuiBoldItalicFactors = [1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiBoldItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +const SegoeuiItalicFactors = [1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, 1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +const SegoeuiRegularFactors = [1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, 1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiRegularMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; + +;// ./src/core/xfa_fonts.js + + + + + + + + +const getXFAFontMap = getLookupTableFactory(function (t) { + t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { + name: "LiberationSans-Regular", + factors: MyriadProRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: MyriadProRegularMetrics + }; + t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = { + name: "LiberationSans-Bold", + factors: MyriadProBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: MyriadProBoldMetrics + }; + t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = { + name: "LiberationSans-Italic", + factors: MyriadProItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: MyriadProItalicMetrics + }; + t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: MyriadProBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: MyriadProBoldItalicMetrics + }; + t.ArialMT = t.Arial = t["Arial-Regular"] = { + name: "LiberationSans-Regular", + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping + }; + t["Arial-BoldMT"] = t["Arial-Bold"] = { + name: "LiberationSans-Bold", + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping + }; + t["Arial-ItalicMT"] = t["Arial-Italic"] = { + name: "LiberationSans-Italic", + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping + }; + t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping + }; + t["Calibri-Regular"] = { + name: "LiberationSans-Regular", + factors: CalibriRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: CalibriRegularMetrics + }; + t["Calibri-Bold"] = { + name: "LiberationSans-Bold", + factors: CalibriBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: CalibriBoldMetrics + }; + t["Calibri-Italic"] = { + name: "LiberationSans-Italic", + factors: CalibriItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: CalibriItalicMetrics + }; + t["Calibri-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: CalibriBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: CalibriBoldItalicMetrics + }; + t["Segoeui-Regular"] = { + name: "LiberationSans-Regular", + factors: SegoeuiRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: SegoeuiRegularMetrics + }; + t["Segoeui-Bold"] = { + name: "LiberationSans-Bold", + factors: SegoeuiBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: SegoeuiBoldMetrics + }; + t["Segoeui-Italic"] = { + name: "LiberationSans-Italic", + factors: SegoeuiItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: SegoeuiItalicMetrics + }; + t["Segoeui-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: SegoeuiBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: SegoeuiBoldItalicMetrics + }; + t["Helvetica-Regular"] = t.Helvetica = { + name: "LiberationSans-Regular", + factors: HelveticaRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: HelveticaRegularMetrics + }; + t["Helvetica-Bold"] = { + name: "LiberationSans-Bold", + factors: HelveticaBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: HelveticaBoldMetrics + }; + t["Helvetica-Italic"] = { + name: "LiberationSans-Italic", + factors: HelveticaItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: HelveticaItalicMetrics + }; + t["Helvetica-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: HelveticaBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: HelveticaBoldItalicMetrics + }; +}); +function getXfaFontName(name) { + const fontName = normalizeFontName(name); + const fontMap = getXFAFontMap(); + return fontMap[fontName]; +} +function getXfaFontWidths(name) { + const info = getXfaFontName(name); + if (!info) { + return null; + } + const { + baseWidths, + baseMapping, + factors + } = info; + const rescaledBaseWidths = !factors ? baseWidths : baseWidths.map((w, i) => w * factors[i]); + let currentCode = -2; + let currentArray; + const newWidths = []; + for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort(([unicode1], [unicode2]) => unicode1 - unicode2)) { + if (unicode === -1) { + continue; + } + if (unicode === currentCode + 1) { + currentArray.push(rescaledBaseWidths[glyphIndex]); + currentCode += 1; + } else { + currentCode = unicode; + currentArray = [rescaledBaseWidths[glyphIndex]]; + newWidths.push(unicode, currentArray); + } + } + return newWidths; +} +function getXfaFontDict(name) { + const widths = getXfaFontWidths(name); + const dict = new Dict(null); + dict.set("BaseFont", Name.get(name)); + dict.set("Type", Name.get("Font")); + dict.set("Subtype", Name.get("CIDFontType2")); + dict.set("Encoding", Name.get("Identity-H")); + dict.set("CIDToGIDMap", Name.get("Identity")); + dict.set("W", widths); + dict.set("FirstChar", widths[0]); + dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1); + const descriptor = new Dict(null); + dict.set("FontDescriptor", descriptor); + const systemInfo = new Dict(null); + systemInfo.set("Ordering", "Identity"); + systemInfo.set("Registry", "Adobe"); + systemInfo.set("Supplement", 0); + dict.set("CIDSystemInfo", systemInfo); + return dict; +} + +;// ./src/core/ps_parser.js + + + +class PostScriptParser { + constructor(lexer) { + this.lexer = lexer; + this.operators = []; + this.token = null; + this.prev = null; + } + nextToken() { + this.prev = this.token; + this.token = this.lexer.getToken(); + } + accept(type) { + if (this.token.type === type) { + this.nextToken(); + return true; + } + return false; + } + expect(type) { + if (this.accept(type)) { + return true; + } + throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`); + } + parse() { + this.nextToken(); + this.expect(PostScriptTokenTypes.LBRACE); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + return this.operators; + } + parseBlock() { + while (true) { + if (this.accept(PostScriptTokenTypes.NUMBER)) { + this.operators.push(this.prev.value); + } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { + this.operators.push(this.prev.value); + } else if (this.accept(PostScriptTokenTypes.LBRACE)) { + this.parseCondition(); + } else { + return; + } + } + } + parseCondition() { + const conditionLocation = this.operators.length; + this.operators.push(null, null); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + if (this.accept(PostScriptTokenTypes.IF)) { + this.operators[conditionLocation] = this.operators.length; + this.operators[conditionLocation + 1] = "jz"; + } else if (this.accept(PostScriptTokenTypes.LBRACE)) { + const jumpLocation = this.operators.length; + this.operators.push(null, null); + const endOfTrue = this.operators.length; + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + this.expect(PostScriptTokenTypes.IFELSE); + this.operators[jumpLocation] = this.operators.length; + this.operators[jumpLocation + 1] = "j"; + this.operators[conditionLocation] = endOfTrue; + this.operators[conditionLocation + 1] = "jz"; + } else { + throw new FormatError("PS Function: error parsing conditional."); + } + } +} +const PostScriptTokenTypes = { + LBRACE: 0, + RBRACE: 1, + NUMBER: 2, + OPERATOR: 3, + IF: 4, + IFELSE: 5 +}; +class PostScriptToken { + static get opCache() { + return shadow(this, "opCache", Object.create(null)); + } + constructor(type, value) { + this.type = type; + this.value = value; + } + static getOperator(op) { + return PostScriptToken.opCache[op] ||= new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); + } + static get LBRACE() { + return shadow(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{")); + } + static get RBRACE() { + return shadow(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}")); + } + static get IF() { + return shadow(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF")); + } + static get IFELSE() { + return shadow(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE")); + } +} +class PostScriptLexer { + constructor(stream) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + getToken() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isWhiteSpace(ch)) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); + case 0x7b: + this.nextChar(); + return PostScriptToken.LBRACE; + case 0x7d: + this.nextChar(); + return PostScriptToken.RBRACE; + } + const strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) { + strBuf.push(String.fromCharCode(ch)); + } + const str = strBuf.join(""); + switch (str.toLowerCase()) { + case "if": + return PostScriptToken.IF; + case "ifelse": + return PostScriptToken.IFELSE; + default: + return PostScriptToken.getOperator(str); + } + } + getNumber() { + let ch = this.currentChar; + const strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) { + strBuf.push(String.fromCharCode(ch)); + } else { + break; + } + } + const value = parseFloat(strBuf.join("")); + if (isNaN(value)) { + throw new FormatError(`Invalid floating point number: ${value}`); + } + return value; + } +} + +;// ./src/core/image_utils.js + + +class BaseLocalCache { + constructor(options) { + this._onlyRefs = options?.onlyRefs === true; + if (!this._onlyRefs) { + this._nameRefMap = new Map(); + this._imageMap = new Map(); + } + this._imageCache = new RefSetCache(); + } + getByName(name) { + if (this._onlyRefs) { + unreachable("Should not call `getByName` method."); + } + const ref = this._nameRefMap.get(name); + if (ref) { + return this.getByRef(ref); + } + return this._imageMap.get(name) || null; + } + getByRef(ref) { + return this._imageCache.get(ref) || null; + } + set(name, ref, data) { + unreachable("Abstract method `set` called."); + } +} +class LocalImageCache extends BaseLocalCache { + set(name, ref = null, data) { + if (typeof name !== "string") { + throw new Error('LocalImageCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalColorSpaceCache extends BaseLocalCache { + set(name = null, ref = null, data) { + if (typeof name !== "string" && !ref) { + throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + if (name !== null) { + this._nameRefMap.set(name, ref); + } + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalFunctionCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('LocalFunctionCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class LocalGStateCache extends BaseLocalCache { + set(name, ref = null, data) { + if (typeof name !== "string") { + throw new Error('LocalGStateCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalTilingPatternCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class RegionalImageCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('RegionalImageCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class GlobalImageCache { + static NUM_PAGES_THRESHOLD = 2; + static MIN_IMAGES_TO_CACHE = 10; + static MAX_BYTE_SIZE = 5 * MAX_IMAGE_SIZE_TO_CACHE; + #decodeFailedSet = new RefSet(); + constructor() { + this._refCache = new RefSetCache(); + this._imageCache = new RefSetCache(); + } + get #byteSize() { + let byteSize = 0; + for (const imageData of this._imageCache) { + byteSize += imageData.byteSize; + } + return byteSize; + } + get #cacheLimitReached() { + if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { + return false; + } + if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) { + return false; + } + return true; + } + shouldCache(ref, pageIndex) { + let pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + pageIndexSet = new Set(); + this._refCache.put(ref, pageIndexSet); + } + pageIndexSet.add(pageIndex); + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return false; + } + if (!this._imageCache.has(ref) && this.#cacheLimitReached) { + return false; + } + return true; + } + addDecodeFailed(ref) { + this.#decodeFailedSet.put(ref); + } + hasDecodeFailed(ref) { + return this.#decodeFailedSet.has(ref); + } + addByteSize(ref, byteSize) { + const imageData = this._imageCache.get(ref); + if (!imageData) { + return; + } + if (imageData.byteSize) { + return; + } + imageData.byteSize = byteSize; + } + getData(ref, pageIndex) { + const pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + return null; + } + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return null; + } + const imageData = this._imageCache.get(ref); + if (!imageData) { + return null; + } + pageIndexSet.add(pageIndex); + return imageData; + } + setData(ref, data) { + if (!this._refCache.has(ref)) { + throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.'); + } + if (this._imageCache.has(ref)) { + return; + } + if (this.#cacheLimitReached) { + warn("GlobalImageCache.setData - cache limit reached."); + return; + } + this._imageCache.put(ref, data); + } + clear(onlyData = false) { + if (!onlyData) { + this.#decodeFailedSet.clear(); + this._refCache.clear(); + } + this._imageCache.clear(); + } +} + +;// ./src/core/function.js + + + + + + +class PDFFunctionFactory { + constructor({ + xref, + isEvalSupported = true + }) { + this.xref = xref; + this.isEvalSupported = isEvalSupported !== false; + } + create(fn) { + const cachedFunction = this.getCached(fn); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parse({ + xref: this.xref, + isEvalSupported: this.isEvalSupported, + fn: fn instanceof Ref ? this.xref.fetch(fn) : fn + }); + this._cache(fn, parsedFunction); + return parsedFunction; + } + createFromArray(fnObj) { + const cachedFunction = this.getCached(fnObj); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parseArray({ + xref: this.xref, + isEvalSupported: this.isEvalSupported, + fnObj: fnObj instanceof Ref ? this.xref.fetch(fnObj) : fnObj + }); + this._cache(fnObj, parsedFunction); + return parsedFunction; + } + getCached(cacheKey) { + let fnRef; + if (cacheKey instanceof Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof BaseStream) { + fnRef = cacheKey.dict?.objId; + } + if (fnRef) { + const localFunction = this._localFunctionCache.getByRef(fnRef); + if (localFunction) { + return localFunction; + } + } + return null; + } + _cache(cacheKey, parsedFunction) { + if (!parsedFunction) { + throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.'); + } + let fnRef; + if (cacheKey instanceof Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof BaseStream) { + fnRef = cacheKey.dict?.objId; + } + if (fnRef) { + this._localFunctionCache.set(null, fnRef, parsedFunction); + } + } + get _localFunctionCache() { + return shadow(this, "_localFunctionCache", new LocalFunctionCache()); + } +} +function toNumberArray(arr) { + if (!Array.isArray(arr)) { + return null; + } + if (!isNumberArray(arr, null)) { + return arr.map(x => +x); + } + return arr; +} +class PDFFunction { + static getSampleArray(size, outputSize, bps, stream) { + let i, ii; + let length = 1; + for (i = 0, ii = size.length; i < ii; i++) { + length *= size[i]; + } + length *= outputSize; + const array = new Array(length); + let codeSize = 0; + let codeBuf = 0; + const sampleMul = 1.0 / (2.0 ** bps - 1); + const strBytes = stream.getBytes((length * bps + 7) / 8); + let strIdx = 0; + for (i = 0; i < length; i++) { + while (codeSize < bps) { + codeBuf <<= 8; + codeBuf |= strBytes[strIdx++]; + codeSize += 8; + } + codeSize -= bps; + array[i] = (codeBuf >> codeSize) * sampleMul; + codeBuf &= (1 << codeSize) - 1; + } + return array; + } + static parse({ + xref, + isEvalSupported, + fn + }) { + const dict = fn.dict || fn; + const typeNum = dict.get("FunctionType"); + switch (typeNum) { + case 0: + return this.constructSampled({ + xref, + isEvalSupported, + fn, + dict + }); + case 1: + break; + case 2: + return this.constructInterpolated({ + xref, + isEvalSupported, + dict + }); + case 3: + return this.constructStiched({ + xref, + isEvalSupported, + dict + }); + case 4: + return this.constructPostScript({ + xref, + isEvalSupported, + fn, + dict + }); + } + throw new FormatError("Unknown type of function"); + } + static parseArray({ + xref, + isEvalSupported, + fnObj + }) { + if (!Array.isArray(fnObj)) { + return this.parse({ + xref, + isEvalSupported, + fn: fnObj + }); + } + const fnArray = []; + for (const fn of fnObj) { + fnArray.push(this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn) + })); + } + return function (src, srcOffset, dest, destOffset) { + for (let i = 0, ii = fnArray.length; i < ii; i++) { + fnArray[i](src, srcOffset, dest, destOffset + i); + } + }; + } + static constructSampled({ + xref, + isEvalSupported, + fn, + dict + }) { + function toMultiArray(arr) { + const inputLength = arr.length; + const out = []; + let index = 0; + for (let i = 0; i < inputLength; i += 2) { + out[index++] = [arr[i], arr[i + 1]]; + } + return out; + } + function interpolate(x, xmin, xmax, ymin, ymax) { + return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); + } + let domain = toNumberArray(dict.getArray("Domain")); + let range = toNumberArray(dict.getArray("Range")); + if (!domain || !range) { + throw new FormatError("No domain or range"); + } + const inputSize = domain.length / 2; + const outputSize = range.length / 2; + domain = toMultiArray(domain); + range = toMultiArray(range); + const size = toNumberArray(dict.getArray("Size")); + const bps = dict.get("BitsPerSample"); + const order = dict.get("Order") || 1; + if (order !== 1) { + info("No support for cubic spline interpolation: " + order); + } + let encode = toNumberArray(dict.getArray("Encode")); + if (!encode) { + encode = []; + for (let i = 0; i < inputSize; ++i) { + encode.push([0, size[i] - 1]); + } + } else { + encode = toMultiArray(encode); + } + let decode = toNumberArray(dict.getArray("Decode")); + decode = !decode ? range : toMultiArray(decode); + const samples = this.getSampleArray(size, outputSize, bps, fn); + return function constructSampledFn(src, srcOffset, dest, destOffset) { + const cubeVertices = 1 << inputSize; + const cubeN = new Float64Array(cubeVertices); + const cubeVertex = new Uint32Array(cubeVertices); + let i, j; + for (j = 0; j < cubeVertices; j++) { + cubeN[j] = 1; + } + let k = outputSize, + pos = 1; + for (i = 0; i < inputSize; ++i) { + const domain_2i = domain[i][0]; + const domain_2i_1 = domain[i][1]; + const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1); + let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); + const size_i = size[i]; + e = Math.min(Math.max(e, 0), size_i - 1); + const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; + const n0 = e0 + 1 - e; + const n1 = e - e0; + const offset0 = e0 * k; + const offset1 = offset0 + k; + for (j = 0; j < cubeVertices; j++) { + if (j & pos) { + cubeN[j] *= n1; + cubeVertex[j] += offset1; + } else { + cubeN[j] *= n0; + cubeVertex[j] += offset0; + } + } + k *= size_i; + pos <<= 1; + } + for (j = 0; j < outputSize; ++j) { + let rj = 0; + for (i = 0; i < cubeVertices; i++) { + rj += samples[cubeVertex[i] + j] * cubeN[i]; + } + rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); + dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); + } + }; + } + static constructInterpolated({ + xref, + isEvalSupported, + dict + }) { + const c0 = toNumberArray(dict.getArray("C0")) || [0]; + const c1 = toNumberArray(dict.getArray("C1")) || [1]; + const n = dict.get("N"); + const diff = []; + for (let i = 0, ii = c0.length; i < ii; ++i) { + diff.push(c1[i] - c0[i]); + } + const length = diff.length; + return function constructInterpolatedFn(src, srcOffset, dest, destOffset) { + const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n; + for (let j = 0; j < length; ++j) { + dest[destOffset + j] = c0[j] + x * diff[j]; + } + }; + } + static constructStiched({ + xref, + isEvalSupported, + dict + }) { + const domain = toNumberArray(dict.getArray("Domain")); + if (!domain) { + throw new FormatError("No domain"); + } + const inputSize = domain.length / 2; + if (inputSize !== 1) { + throw new FormatError("Bad domain for stiched function"); + } + const fns = []; + for (const fn of dict.get("Functions")) { + fns.push(this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn) + })); + } + const bounds = toNumberArray(dict.getArray("Bounds")); + const encode = toNumberArray(dict.getArray("Encode")); + const tmpBuf = new Float32Array(1); + return function constructStichedFn(src, srcOffset, dest, destOffset) { + const clip = function constructStichedFromIRClip(v, min, max) { + if (v > max) { + v = max; + } else if (v < min) { + v = min; + } + return v; + }; + const v = clip(src[srcOffset], domain[0], domain[1]); + const length = bounds.length; + let i; + for (i = 0; i < length; ++i) { + if (v < bounds[i]) { + break; + } + } + let dmin = domain[0]; + if (i > 0) { + dmin = bounds[i - 1]; + } + let dmax = domain[1]; + if (i < bounds.length) { + dmax = bounds[i]; + } + const rmin = encode[2 * i]; + const rmax = encode[2 * i + 1]; + tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); + fns[i](tmpBuf, 0, dest, destOffset); + }; + } + static constructPostScript({ + xref, + isEvalSupported, + fn, + dict + }) { + const domain = toNumberArray(dict.getArray("Domain")); + const range = toNumberArray(dict.getArray("Range")); + if (!domain) { + throw new FormatError("No domain."); + } + if (!range) { + throw new FormatError("No range."); + } + const lexer = new PostScriptLexer(fn); + const parser = new PostScriptParser(lexer); + const code = parser.parse(); + if (isEvalSupported && FeatureTest.isEvalSupported) { + const compiled = new PostScriptCompiler().compile(code, domain, range); + if (compiled) { + return new Function("src", "srcOffset", "dest", "destOffset", compiled); + } + } + info("Unable to compile PS function"); + const numOutputs = range.length >> 1; + const numInputs = domain.length >> 1; + const evaluator = new PostScriptEvaluator(code); + const cache = Object.create(null); + const MAX_CACHE_SIZE = 2048 * 4; + let cache_available = MAX_CACHE_SIZE; + const tmpBuf = new Float32Array(numInputs); + return function constructPostScriptFn(src, srcOffset, dest, destOffset) { + let i, value; + let key = ""; + const input = tmpBuf; + for (i = 0; i < numInputs; i++) { + value = src[srcOffset + i]; + input[i] = value; + key += value + "_"; + } + const cachedValue = cache[key]; + if (cachedValue !== undefined) { + dest.set(cachedValue, destOffset); + return; + } + const output = new Float32Array(numOutputs); + const stack = evaluator.execute(input); + const stackIndex = stack.length - numOutputs; + for (i = 0; i < numOutputs; i++) { + value = stack[stackIndex + i]; + let bound = range[i * 2]; + if (value < bound) { + value = bound; + } else { + bound = range[i * 2 + 1]; + if (value > bound) { + value = bound; + } + } + output[i] = value; + } + if (cache_available > 0) { + cache_available--; + cache[key] = output; + } + dest.set(output, destOffset); + }; + } +} +function isPDFFunction(v) { + let fnDict; + if (v instanceof Dict) { + fnDict = v; + } else if (v instanceof BaseStream) { + fnDict = v.dict; + } else { + return false; + } + return fnDict.has("FunctionType"); +} +class PostScriptStack { + static MAX_STACK_SIZE = 100; + constructor(initialStack) { + this.stack = initialStack ? Array.from(initialStack) : []; + } + push(value) { + if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { + throw new Error("PostScript function stack overflow."); + } + this.stack.push(value); + } + pop() { + if (this.stack.length <= 0) { + throw new Error("PostScript function stack underflow."); + } + return this.stack.pop(); + } + copy(n) { + if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { + throw new Error("PostScript function stack overflow."); + } + const stack = this.stack; + for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { + stack.push(stack[i]); + } + } + index(n) { + this.push(this.stack[this.stack.length - n - 1]); + } + roll(n, p) { + const stack = this.stack; + const l = stack.length - n; + const r = stack.length - 1; + const c = l + (p - Math.floor(p / n) * n); + for (let i = l, j = r; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + for (let i = l, j = c - 1; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + for (let i = c, j = r; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + } +} +class PostScriptEvaluator { + constructor(operators) { + this.operators = operators; + } + execute(initialStack) { + const stack = new PostScriptStack(initialStack); + let counter = 0; + const operators = this.operators; + const length = operators.length; + let operator, a, b; + while (counter < length) { + operator = operators[counter++]; + if (typeof operator === "number") { + stack.push(operator); + continue; + } + switch (operator) { + case "jz": + b = stack.pop(); + a = stack.pop(); + if (!a) { + counter = b; + } + break; + case "j": + a = stack.pop(); + counter = a; + break; + case "abs": + a = stack.pop(); + stack.push(Math.abs(a)); + break; + case "add": + b = stack.pop(); + a = stack.pop(); + stack.push(a + b); + break; + case "and": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a && b); + } else { + stack.push(a & b); + } + break; + case "atan": + b = stack.pop(); + a = stack.pop(); + a = Math.atan2(a, b) / Math.PI * 180; + if (a < 0) { + a += 360; + } + stack.push(a); + break; + case "bitshift": + b = stack.pop(); + a = stack.pop(); + if (a > 0) { + stack.push(a << b); + } else { + stack.push(a >> b); + } + break; + case "ceiling": + a = stack.pop(); + stack.push(Math.ceil(a)); + break; + case "copy": + a = stack.pop(); + stack.copy(a); + break; + case "cos": + a = stack.pop(); + stack.push(Math.cos(a % 360 / 180 * Math.PI)); + break; + case "cvi": + a = stack.pop() | 0; + stack.push(a); + break; + case "cvr": + break; + case "div": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b); + break; + case "dup": + stack.copy(1); + break; + case "eq": + b = stack.pop(); + a = stack.pop(); + stack.push(a === b); + break; + case "exch": + stack.roll(2, 1); + break; + case "exp": + b = stack.pop(); + a = stack.pop(); + stack.push(a ** b); + break; + case "false": + stack.push(false); + break; + case "floor": + a = stack.pop(); + stack.push(Math.floor(a)); + break; + case "ge": + b = stack.pop(); + a = stack.pop(); + stack.push(a >= b); + break; + case "gt": + b = stack.pop(); + a = stack.pop(); + stack.push(a > b); + break; + case "idiv": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b | 0); + break; + case "index": + a = stack.pop(); + stack.index(a); + break; + case "le": + b = stack.pop(); + a = stack.pop(); + stack.push(a <= b); + break; + case "ln": + a = stack.pop(); + stack.push(Math.log(a)); + break; + case "log": + a = stack.pop(); + stack.push(Math.log10(a)); + break; + case "lt": + b = stack.pop(); + a = stack.pop(); + stack.push(a < b); + break; + case "mod": + b = stack.pop(); + a = stack.pop(); + stack.push(a % b); + break; + case "mul": + b = stack.pop(); + a = stack.pop(); + stack.push(a * b); + break; + case "ne": + b = stack.pop(); + a = stack.pop(); + stack.push(a !== b); + break; + case "neg": + a = stack.pop(); + stack.push(-a); + break; + case "not": + a = stack.pop(); + if (typeof a === "boolean") { + stack.push(!a); + } else { + stack.push(~a); + } + break; + case "or": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a || b); + } else { + stack.push(a | b); + } + break; + case "pop": + stack.pop(); + break; + case "roll": + b = stack.pop(); + a = stack.pop(); + stack.roll(a, b); + break; + case "round": + a = stack.pop(); + stack.push(Math.round(a)); + break; + case "sin": + a = stack.pop(); + stack.push(Math.sin(a % 360 / 180 * Math.PI)); + break; + case "sqrt": + a = stack.pop(); + stack.push(Math.sqrt(a)); + break; + case "sub": + b = stack.pop(); + a = stack.pop(); + stack.push(a - b); + break; + case "true": + stack.push(true); + break; + case "truncate": + a = stack.pop(); + a = a < 0 ? Math.ceil(a) : Math.floor(a); + stack.push(a); + break; + case "xor": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a !== b); + } else { + stack.push(a ^ b); + } + break; + default: + throw new FormatError(`Unknown operator ${operator}`); + } + } + return stack.stack; + } +} +class AstNode { + constructor(type) { + this.type = type; + } + visit(visitor) { + unreachable("abstract method"); + } +} +class AstArgument extends AstNode { + constructor(index, min, max) { + super("args"); + this.index = index; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitArgument(this); + } +} +class AstLiteral extends AstNode { + constructor(number) { + super("literal"); + this.number = number; + this.min = number; + this.max = number; + } + visit(visitor) { + visitor.visitLiteral(this); + } +} +class AstBinaryOperation extends AstNode { + constructor(op, arg1, arg2, min, max) { + super("binary"); + this.op = op; + this.arg1 = arg1; + this.arg2 = arg2; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitBinaryOperation(this); + } +} +class AstMin extends AstNode { + constructor(arg, max) { + super("max"); + this.arg = arg; + this.min = arg.min; + this.max = max; + } + visit(visitor) { + visitor.visitMin(this); + } +} +class AstVariable extends AstNode { + constructor(index, min, max) { + super("var"); + this.index = index; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitVariable(this); + } +} +class AstVariableDefinition extends AstNode { + constructor(variable, arg) { + super("definition"); + this.variable = variable; + this.arg = arg; + } + visit(visitor) { + visitor.visitVariableDefinition(this); + } +} +class ExpressionBuilderVisitor { + constructor() { + this.parts = []; + } + visitArgument(arg) { + this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))"); + } + visitVariable(variable) { + this.parts.push("v", variable.index); + } + visitLiteral(literal) { + this.parts.push(literal.number); + } + visitBinaryOperation(operation) { + this.parts.push("("); + operation.arg1.visit(this); + this.parts.push(" ", operation.op, " "); + operation.arg2.visit(this); + this.parts.push(")"); + } + visitVariableDefinition(definition) { + this.parts.push("var "); + definition.variable.visit(this); + this.parts.push(" = "); + definition.arg.visit(this); + this.parts.push(";"); + } + visitMin(max) { + this.parts.push("Math.min("); + max.arg.visit(this); + this.parts.push(", ", max.max, ")"); + } + toString() { + return this.parts.join(""); + } +} +function buildAddOperation(num1, num2) { + if (num2.type === "literal" && num2.number === 0) { + return num1; + } + if (num1.type === "literal" && num1.number === 0) { + return num2; + } + if (num2.type === "literal" && num1.type === "literal") { + return new AstLiteral(num1.number + num2.number); + } + return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max); +} +function buildMulOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return new AstLiteral(0); + } else if (num2.number === 1) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number * num2.number); + } + } + if (num1.type === "literal") { + if (num1.number === 0) { + return new AstLiteral(0); + } else if (num1.number === 1) { + return num2; + } + } + const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + return new AstBinaryOperation("*", num1, num2, min, max); +} +function buildSubOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number - num2.number); + } + } + if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) { + return num2.arg2; + } + return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min); +} +function buildMinOperation(num1, max) { + if (num1.min >= max) { + return new AstLiteral(max); + } else if (num1.max <= max) { + return num1; + } + return new AstMin(num1, max); +} +class PostScriptCompiler { + compile(code, domain, range) { + const stack = []; + const instructions = []; + const inputSize = domain.length >> 1, + outputSize = range.length >> 1; + let lastRegister = 0; + let n, j; + let num1, num2, ast1, ast2, tmpVar, item; + for (let i = 0; i < inputSize; i++) { + stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); + } + for (let i = 0, ii = code.length; i < ii; i++) { + item = code[i]; + if (typeof item === "number") { + stack.push(new AstLiteral(item)); + continue; + } + switch (item) { + case "add": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildAddOperation(num1, num2)); + break; + case "cvr": + if (stack.length < 1) { + return null; + } + break; + case "mul": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildMulOperation(num1, num2)); + break; + case "sub": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildSubOperation(num1, num2)); + break; + case "exch": + if (stack.length < 2) { + return null; + } + ast1 = stack.pop(); + ast2 = stack.pop(); + stack.push(ast1, ast2); + break; + case "pop": + if (stack.length < 1) { + return null; + } + stack.pop(); + break; + case "index": + if (stack.length < 1) { + return null; + } + num1 = stack.pop(); + if (num1.type !== "literal") { + return null; + } + n = num1.number; + if (n < 0 || !Number.isInteger(n) || stack.length < n) { + return null; + } + ast1 = stack[stack.length - n - 1]; + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - n - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "dup": + if (stack.length < 1) { + return null; + } + if (typeof code[i + 1] === "number" && code[i + 2] === "gt" && code[i + 3] === i + 7 && code[i + 4] === "jz" && code[i + 5] === "pop" && code[i + 6] === code[i + 1]) { + num1 = stack.pop(); + stack.push(buildMinOperation(num1, code[i + 1])); + i += 6; + break; + } + ast1 = stack.at(-1); + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "roll": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + if (num2.type !== "literal" || num1.type !== "literal") { + return null; + } + j = num2.number; + n = num1.number; + if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) { + return null; + } + j = (j % n + n) % n; + if (j === 0) { + break; + } + stack.push(...stack.splice(stack.length - n, n - j)); + break; + default: + return null; + } + } + if (stack.length !== outputSize) { + return null; + } + const result = []; + for (const instruction of instructions) { + const statementBuilder = new ExpressionBuilderVisitor(); + instruction.visit(statementBuilder); + result.push(statementBuilder.toString()); + } + for (let i = 0, ii = stack.length; i < ii; i++) { + const expr = stack[i], + statementBuilder = new ExpressionBuilderVisitor(); + expr.visit(statementBuilder); + const min = range[i * 2], + max = range[i * 2 + 1]; + const out = [statementBuilder.toString()]; + if (min > expr.min) { + out.unshift("Math.max(", min, ", "); + out.push(")"); + } + if (max < expr.max) { + out.unshift("Math.min(", max, ", "); + out.push(")"); + } + out.unshift("dest[destOffset + ", i, "] = "); + out.push(";"); + result.push(out.join("")); + } + return result.join("\n"); + } +} + +;// ./src/core/bidi.js + +const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "L", "ON", "ON", "BN", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"]; +const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"]; +function isOdd(i) { + return (i & 1) !== 0; +} +function isEven(i) { + return (i & 1) === 0; +} +function findUnequal(arr, start, value) { + let j, jj; + for (j = start, jj = arr.length; j < jj; ++j) { + if (arr[j] !== value) { + return j; + } + } + return j; +} +function setValues(arr, start, end, value) { + for (let j = start; j < end; ++j) { + arr[j] = value; + } +} +function reverseValues(arr, start, end) { + for (let i = start, j = end - 1; i < j; ++i, --j) { + const temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } +} +function createBidiText(str, isLTR, vertical = false) { + let dir = "ltr"; + if (vertical) { + dir = "ttb"; + } else if (!isLTR) { + dir = "rtl"; + } + return { + str, + dir + }; +} +const chars = []; +const types = []; +function bidi(str, startLevel = -1, vertical = false) { + let isLTR = true; + const strLength = str.length; + if (strLength === 0 || vertical) { + return createBidiText(str, isLTR, vertical); + } + chars.length = strLength; + types.length = strLength; + let numBidi = 0; + let i, ii; + for (i = 0; i < strLength; ++i) { + chars[i] = str.charAt(i); + const charCode = str.charCodeAt(i); + let charType = "L"; + if (charCode <= 0x00ff) { + charType = baseTypes[charCode]; + } else if (0x0590 <= charCode && charCode <= 0x05f4) { + charType = "R"; + } else if (0x0600 <= charCode && charCode <= 0x06ff) { + charType = arabicTypes[charCode & 0xff]; + if (!charType) { + warn("Bidi: invalid Unicode character " + charCode.toString(16)); + } + } else if (0x0700 <= charCode && charCode <= 0x08ac || 0xfb50 <= charCode && charCode <= 0xfdff || 0xfe70 <= charCode && charCode <= 0xfeff) { + charType = "AL"; + } + if (charType === "R" || charType === "AL" || charType === "AN") { + numBidi++; + } + types[i] = charType; + } + if (numBidi === 0) { + isLTR = true; + return createBidiText(str, isLTR); + } + if (startLevel === -1) { + if (numBidi / strLength < 0.3 && strLength > 4) { + isLTR = true; + startLevel = 0; + } else { + isLTR = false; + startLevel = 1; + } + } + const levels = []; + for (i = 0; i < strLength; ++i) { + levels[i] = startLevel; + } + const e = isOdd(startLevel) ? "R" : "L"; + const sor = e; + const eor = sor; + let lastType = sor; + for (i = 0; i < strLength; ++i) { + if (types[i] === "NSM") { + types[i] = lastType; + } else { + lastType = types[i]; + } + } + lastType = sor; + let t; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "AL" ? "AN" : "EN"; + } else if (t === "R" || t === "L" || t === "AL") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "AL") { + types[i] = "R"; + } + } + for (i = 1; i < strLength - 1; ++i) { + if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") { + types[i] = "EN"; + } + if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) { + types[i] = types[i - 1]; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "EN") { + for (let j = i - 1; j >= 0; --j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + for (let j = i + 1; j < strLength; ++j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { + types[i] = "ON"; + } + } + lastType = sor; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "L" ? "L" : "EN"; + } else if (t === "R" || t === "L") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + const end = findUnequal(types, i + 1, "ON"); + let before = sor; + if (i > 0) { + before = types[i - 1]; + } + let after = eor; + if (end + 1 < strLength) { + after = types[end + 1]; + } + if (before !== "L") { + before = "R"; + } + if (after !== "L") { + after = "R"; + } + if (before === after) { + setValues(types, i, end, before); + } + i = end - 1; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + types[i] = e; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (isEven(levels[i])) { + if (t === "R") { + levels[i] += 1; + } else if (t === "AN" || t === "EN") { + levels[i] += 2; + } + } else if (t === "L" || t === "AN" || t === "EN") { + levels[i] += 1; + } + } + let highestLevel = -1; + let lowestOddLevel = 99; + let level; + for (i = 0, ii = levels.length; i < ii; ++i) { + level = levels[i]; + if (highestLevel < level) { + highestLevel = level; + } + if (lowestOddLevel > level && isOdd(level)) { + lowestOddLevel = level; + } + } + for (level = highestLevel; level >= lowestOddLevel; --level) { + let start = -1; + for (i = 0, ii = levels.length; i < ii; ++i) { + if (levels[i] < level) { + if (start >= 0) { + reverseValues(chars, start, i); + start = -1; + } + } else if (start < 0) { + start = i; + } + } + if (start >= 0) { + reverseValues(chars, start, levels.length); + } + } + for (i = 0, ii = chars.length; i < ii; ++i) { + const ch = chars[i]; + if (ch === "<" || ch === ">") { + chars[i] = ""; + } + } + return createBidiText(chars.join(""), isLTR); +} + +;// ./src/core/font_substitutions.js + + + +const NORMAL = { + style: "normal", + weight: "normal" +}; +const BOLD = { + style: "normal", + weight: "bold" +}; +const ITALIC = { + style: "italic", + weight: "normal" +}; +const BOLDITALIC = { + style: "italic", + weight: "bold" +}; +const substitutionMap = new Map([["Times-Roman", { + local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], + style: NORMAL, + ultimate: "serif" +}], ["Times-Bold", { + alias: "Times-Roman", + style: BOLD, + ultimate: "serif" +}], ["Times-Italic", { + alias: "Times-Roman", + style: ITALIC, + ultimate: "serif" +}], ["Times-BoldItalic", { + alias: "Times-Roman", + style: BOLDITALIC, + ultimate: "serif" +}], ["Helvetica", { + local: ["Helvetica", "Helvetica Neue", "Arial", "Arial Nova", "Liberation Sans", "Arimo", "Nimbus Sans", "Nimbus Sans L", "A030", "TeX Gyre Heros", "FreeSans", "DejaVu Sans", "Albany", "Bitstream Vera Sans", "Arial Unicode MS", "Microsoft Sans Serif", "Apple Symbols", "Cantarell"], + path: "LiberationSans-Regular.ttf", + style: NORMAL, + ultimate: "sans-serif" +}], ["Helvetica-Bold", { + alias: "Helvetica", + path: "LiberationSans-Bold.ttf", + style: BOLD, + ultimate: "sans-serif" +}], ["Helvetica-Oblique", { + alias: "Helvetica", + path: "LiberationSans-Italic.ttf", + style: ITALIC, + ultimate: "sans-serif" +}], ["Helvetica-BoldOblique", { + alias: "Helvetica", + path: "LiberationSans-BoldItalic.ttf", + style: BOLDITALIC, + ultimate: "sans-serif" +}], ["Courier", { + local: ["Courier", "Courier New", "Liberation Mono", "Nimbus Mono", "Nimbus Mono L", "Cousine", "Cumberland", "TeX Gyre Cursor", "FreeMono", "Linux Libertine Mono O", "Libertinus Mono"], + style: NORMAL, + ultimate: "monospace" +}], ["Courier-Bold", { + alias: "Courier", + style: BOLD, + ultimate: "monospace" +}], ["Courier-Oblique", { + alias: "Courier", + style: ITALIC, + ultimate: "monospace" +}], ["Courier-BoldOblique", { + alias: "Courier", + style: BOLDITALIC, + ultimate: "monospace" +}], ["ArialBlack", { + local: ["Arial Black"], + style: { + style: "normal", + weight: "900" + }, + fallback: "Helvetica-Bold" +}], ["ArialBlack-Bold", { + alias: "ArialBlack" +}], ["ArialBlack-Italic", { + alias: "ArialBlack", + style: { + style: "italic", + weight: "900" + }, + fallback: "Helvetica-BoldOblique" +}], ["ArialBlack-BoldItalic", { + alias: "ArialBlack-Italic" +}], ["ArialNarrow", { + local: ["Arial Narrow", "Liberation Sans Narrow", "Helvetica Condensed", "Nimbus Sans Narrow", "TeX Gyre Heros Cn"], + style: NORMAL, + fallback: "Helvetica" +}], ["ArialNarrow-Bold", { + alias: "ArialNarrow", + style: BOLD, + fallback: "Helvetica-Bold" +}], ["ArialNarrow-Italic", { + alias: "ArialNarrow", + style: ITALIC, + fallback: "Helvetica-Oblique" +}], ["ArialNarrow-BoldItalic", { + alias: "ArialNarrow", + style: BOLDITALIC, + fallback: "Helvetica-BoldOblique" +}], ["Calibri", { + local: ["Calibri", "Carlito"], + style: NORMAL, + fallback: "Helvetica" +}], ["Calibri-Bold", { + alias: "Calibri", + style: BOLD, + fallback: "Helvetica-Bold" +}], ["Calibri-Italic", { + alias: "Calibri", + style: ITALIC, + fallback: "Helvetica-Oblique" +}], ["Calibri-BoldItalic", { + alias: "Calibri", + style: BOLDITALIC, + fallback: "Helvetica-BoldOblique" +}], ["Wingdings", { + local: ["Wingdings", "URW Dingbats"], + style: NORMAL +}], ["Wingdings-Regular", { + alias: "Wingdings" +}], ["Wingdings-Bold", { + alias: "Wingdings" +}]]); +const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); +function getStyleToAppend(style) { + switch (style) { + case BOLD: + return "Bold"; + case ITALIC: + return "Italic"; + case BOLDITALIC: + return "Bold Italic"; + default: + if (style?.weight === "bold") { + return "Bold"; + } + if (style?.style === "italic") { + return "Italic"; + } + } + return ""; +} +function getFamilyName(str) { + const keywords = new Set(["thin", "extralight", "ultralight", "demilight", "semilight", "light", "book", "regular", "normal", "medium", "demibold", "semibold", "bold", "extrabold", "ultrabold", "black", "heavy", "extrablack", "ultrablack", "roman", "italic", "oblique", "ultracondensed", "extracondensed", "condensed", "semicondensed", "normal", "semiexpanded", "expanded", "extraexpanded", "ultraexpanded", "bolditalic"]); + return str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" "); +} +function generateFont({ + alias, + local, + path, + fallback, + style, + ultimate +}, src, localFontPath, useFallback = true, usePath = true, append = "") { + const result = { + style: null, + ultimate: null + }; + if (local) { + const extra = append ? ` ${append}` : ""; + for (const name of local) { + src.push(`local(${name}${extra})`); + } + } + if (alias) { + const substitution = substitutionMap.get(alias); + const aliasAppend = append || getStyleToAppend(style); + Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend)); + } + if (style) { + result.style = style; + } + if (ultimate) { + result.ultimate = ultimate; + } + if (useFallback && fallback) { + const fallbackInfo = substitutionMap.get(fallback); + const { + ultimate: fallbackUltimate + } = generateFont(fallbackInfo, src, localFontPath, useFallback, usePath && !path, append); + result.ultimate ||= fallbackUltimate; + } + if (usePath && path && localFontPath) { + src.push(`url(${localFontPath}${path})`); + } + return result; +} +function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) { + if (baseFontName.startsWith("InvalidPDFjsFont_")) { + return null; + } + if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) { + baseFontName = baseFontName.slice(7); + } + baseFontName = normalizeFontName(baseFontName); + const key = baseFontName; + let substitutionInfo = systemFontCache.get(key); + if (substitutionInfo) { + return substitutionInfo; + } + let substitution = substitutionMap.get(baseFontName); + if (!substitution) { + for (const [alias, subst] of fontAliases) { + if (baseFontName.startsWith(alias)) { + baseFontName = `${subst}${baseFontName.substring(alias.length)}`; + substitution = substitutionMap.get(baseFontName); + break; + } + } + } + let mustAddBaseFont = false; + if (!substitution) { + substitution = substitutionMap.get(standardFontName); + mustAddBaseFont = true; + } + const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`; + if (!substitution) { + if (!validateFontName(baseFontName)) { + warn(`Cannot substitute the font because of its name: ${baseFontName}`); + systemFontCache.set(key, null); + return null; + } + const bold = /bold/gi.test(baseFontName); + const italic = /oblique|italic/gi.test(baseFontName); + const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}`, + guessFallback: true, + loadedName, + baseFontName, + src: `local(${baseFontName})`, + style + }; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; + } + const src = []; + if (mustAddBaseFont && validateFontName(baseFontName)) { + src.push(`local(${baseFontName})`); + } + const { + style, + ultimate + } = generateFont(substitution, src, localFontPath); + const guessFallback = ultimate === null; + const fallback = guessFallback ? "" : `,${ultimate}`; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`, + guessFallback, + loadedName, + baseFontName, + src: src.join(","), + style + }; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; +} + +;// ./src/core/image_resizer.js + + + +const MIN_IMAGE_DIM = 2048; +const MAX_IMAGE_DIM = 65537; +const MAX_ERROR = 128; +class ImageResizer { + static #goodSquareLength = MIN_IMAGE_DIM; + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(imgData, isMask) { + this._imgData = imgData; + this._isMask = isMask; + } + static get canUseImageDecoder() { + return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false)); + } + static needsToBeResized(width, height) { + if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { + return false; + } + const { + MAX_DIM + } = this; + if (width > MAX_DIM || height > MAX_DIM) { + return true; + } + const area = width * height; + if (this._hasMaxArea) { + return area > this.MAX_AREA; + } + if (area < this.#goodSquareLength ** 2) { + return false; + } + if (this._areGoodDims(width, height)) { + this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height))); + return false; + } + this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0); + const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2; + return area > maxArea; + } + static get MAX_DIM() { + return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); + } + static get MAX_AREA() { + this._hasMaxArea = true; + return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); + } + static set MAX_AREA(area) { + if (area >= 0) { + this._hasMaxArea = true; + shadow(this, "MAX_AREA", area); + } + } + static setOptions({ + canvasMaxAreaInBytes = -1, + isImageDecoderSupported = false + }) { + if (!this._hasMaxArea) { + this.MAX_AREA = canvasMaxAreaInBytes >> 2; + } + this.#isImageDecoderSupported = isImageDecoderSupported; + } + static _areGoodDims(width, height) { + try { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.fillRect(0, 0, 1, 1); + const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; + canvas.width = canvas.height = 1; + return opacity !== 0; + } catch { + return false; + } + } + static _guessMax(start, end, tolerance, defaultHeight) { + while (start + tolerance + 1 < end) { + const middle = Math.floor((start + end) / 2); + const height = defaultHeight || middle; + if (this._areGoodDims(middle, height)) { + start = middle; + } else { + end = middle; + } + } + return start; + } + static async createImage(imgData, isMask = false) { + return new ImageResizer(imgData, isMask)._createImage(); + } + async _createImage() { + const { + _imgData: imgData + } = this; + const { + width, + height + } = imgData; + if (width * height * 4 > MAX_INT_32) { + const result = this.#rescaleImageData(); + if (result) { + return result; + } + } + const data = this._encodeBMP(); + let decoder, imagePromise; + if (await ImageResizer.canUseImageDecoder) { + decoder = new ImageDecoder({ + data, + type: "image/bmp", + preferAnimation: false, + transfer: [data.buffer] + }); + imagePromise = decoder.decode().catch(reason => { + warn(`BMP image decoding failed: ${reason}`); + return createImageBitmap(new Blob([this._encodeBMP().buffer], { + type: "image/bmp" + })); + }).finally(() => { + decoder.close(); + }); + } else { + imagePromise = createImageBitmap(new Blob([data.buffer], { + type: "image/bmp" + })); + } + const { + MAX_AREA, + MAX_DIM + } = ImageResizer; + const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); + const firstFactor = Math.max(minFactor, 2); + const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; + const N = Math.floor(Math.log2(factor)); + const steps = new Array(N + 2).fill(2); + steps[0] = firstFactor; + steps.splice(-1, 1, factor / (1 << N)); + let newWidth = width; + let newHeight = height; + const result = await imagePromise; + let bitmap = result.image || result; + for (const step of steps) { + const prevWidth = newWidth; + const prevHeight = newHeight; + newWidth = Math.floor(newWidth / step) - 1; + newHeight = Math.floor(newHeight / step) - 1; + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap.close(); + bitmap = canvas.transferToImageBitmap(); + } + imgData.data = null; + imgData.bitmap = bitmap; + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + #rescaleImageData() { + const { + _imgData: imgData + } = this; + const { + data, + width, + height, + kind + } = imgData; + const rgbaSize = width * height * 4; + const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32)); + const newWidth = width >> K; + const newHeight = height >> K; + let rgbaData; + let maxHeight = height; + try { + rgbaData = new Uint8Array(rgbaSize); + } catch { + let n = Math.floor(Math.log2(rgbaSize + 1)); + while (true) { + try { + rgbaData = new Uint8Array(2 ** n - 1); + break; + } catch { + n -= 1; + } + } + maxHeight = Math.floor((2 ** n - 1) / (width * 4)); + const newSize = width * maxHeight * 4; + if (newSize < rgbaData.length) { + rgbaData = new Uint8Array(newSize); + } + } + const src32 = new Uint32Array(rgbaData.buffer); + const dest32 = new Uint32Array(newWidth * newHeight); + let srcPos = 0; + let newIndex = 0; + const step = Math.ceil(height / maxHeight); + const remainder = height % maxHeight === 0 ? height : height % maxHeight; + for (let k = 0; k < step; k++) { + const h = k < step - 1 ? maxHeight : remainder; + ({ + srcPos + } = convertToRGBA({ + kind, + src: data, + dest: src32, + width, + height: h, + inverseDecode: this._isMask, + srcPos + })); + for (let i = 0, ii = h >> K; i < ii; i++) { + const buf = src32.subarray((i << K) * width); + for (let j = 0; j < newWidth; j++) { + dest32[newIndex++] = buf[j << K]; + } + } + } + if (ImageResizer.needsToBeResized(newWidth, newHeight)) { + imgData.data = dest32; + imgData.width = newWidth; + imgData.height = newHeight; + imgData.kind = ImageKind.RGBA_32BPP; + return null; + } + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0); + imgData.data = null; + imgData.bitmap = canvas.transferToImageBitmap(); + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + _encodeBMP() { + const { + width, + height, + kind + } = this._imgData; + let data = this._imgData.data; + let bitPerPixel; + let colorTable = new Uint8Array(0); + let maskTable = colorTable; + let compression = 0; + switch (kind) { + case ImageKind.GRAYSCALE_1BPP: + { + bitPerPixel = 1; + colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); + const rowLen = width + 7 >> 3; + const rowSize = rowLen + 3 & -4; + if (rowLen !== rowSize) { + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { + newData.set(data.subarray(i, i + rowLen), k); + } + data = newData; + } + break; + } + case ImageKind.RGB_24BPP: + { + bitPerPixel = 24; + if (width & 3) { + const rowLen = 3 * width; + const rowSize = rowLen + 3 & -4; + const extraLen = rowSize - rowLen; + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { + const row = data.subarray(i, i + rowLen); + for (let j = 0; j < rowLen; j += 3) { + newData[k++] = row[j + 2]; + newData[k++] = row[j + 1]; + newData[k++] = row[j]; + } + k += extraLen; + } + data = newData; + } else { + for (let i = 0, ii = data.length; i < ii; i += 3) { + const tmp = data[i]; + data[i] = data[i + 2]; + data[i + 2] = tmp; + } + } + break; + } + case ImageKind.RGBA_32BPP: + bitPerPixel = 32; + compression = 3; + maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); + const view = new DataView(maskTable.buffer); + if (FeatureTest.isLittleEndian) { + view.setUint32(0, 0x000000ff, true); + view.setUint32(4, 0x0000ff00, true); + view.setUint32(8, 0x00ff0000, true); + view.setUint32(12, 0xff000000, true); + } else { + view.setUint32(0, 0xff000000, true); + view.setUint32(4, 0x00ff0000, true); + view.setUint32(8, 0x0000ff00, true); + view.setUint32(12, 0x000000ff, true); + } + break; + default: + throw new Error("invalid format"); + } + let i = 0; + const headerLength = 40 + maskTable.length; + const fileLength = 14 + headerLength + colorTable.length + data.length; + const bmpData = new Uint8Array(fileLength); + const view = new DataView(bmpData.buffer); + view.setUint16(i, 0x4d42, true); + i += 2; + view.setUint32(i, fileLength, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setUint32(i, 14 + headerLength + colorTable.length, true); + i += 4; + view.setUint32(i, headerLength, true); + i += 4; + view.setInt32(i, width, true); + i += 4; + view.setInt32(i, -height, true); + i += 4; + view.setUint16(i, 1, true); + i += 2; + view.setUint16(i, bitPerPixel, true); + i += 2; + view.setUint32(i, compression, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setUint32(i, colorTable.length / 4, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + bmpData.set(maskTable, i); + i += maskTable.length; + bmpData.set(colorTable, i); + i += colorTable.length; + bmpData.set(data, i); + return bmpData; + } +} + +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/core/operator_list.js + +function addState(parentState, pattern, checkFn, iterateFn, processFn) { + let state = parentState; + for (let i = 0, ii = pattern.length - 1; i < ii; i++) { + const item = pattern[i]; + state = state[item] ||= []; + } + state[pattern.at(-1)] = { + checkFn, + iterateFn, + processFn + }; +} +const InitialState = []; +addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintInlineImageXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); +}, function foundInlineImageGroup(context, i) { + const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; + const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; + const MAX_WIDTH = 1000; + const IMAGE_PADDING = 1; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIIXO = curr - 1; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); + if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let maxX = 0; + const map = []; + let maxLineHeight = 0; + let currentX = IMAGE_PADDING, + currentY = IMAGE_PADDING; + for (let q = 0; q < count; q++) { + const transform = argsArray[iFirstTransform + (q << 2)]; + const img = argsArray[iFirstPIIXO + (q << 2)][0]; + if (currentX + img.width > MAX_WIDTH) { + maxX = Math.max(maxX, currentX); + currentY += maxLineHeight + 2 * IMAGE_PADDING; + currentX = 0; + maxLineHeight = 0; + } + map.push({ + transform, + x: currentX, + y: currentY, + w: img.width, + h: img.height + }); + currentX += img.width + 2 * IMAGE_PADDING; + maxLineHeight = Math.max(maxLineHeight, img.height); + } + const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; + const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; + const imgData = new Uint8Array(imgWidth * imgHeight * 4); + const imgRowSize = imgWidth << 2; + for (let q = 0; q < count; q++) { + const data = argsArray[iFirstPIIXO + (q << 2)][0].data; + const rowSize = map[q].w << 2; + let dataOffset = 0; + let offset = map[q].x + map[q].y * imgWidth << 2; + imgData.set(data.subarray(0, rowSize), offset - imgRowSize); + for (let k = 0, kk = map[q].h; k < kk; k++) { + imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); + dataOffset += rowSize; + offset += imgRowSize; + } + imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); + while (offset >= 0) { + data[offset - 4] = data[offset]; + data[offset - 3] = data[offset + 1]; + data[offset - 2] = data[offset + 2]; + data[offset - 1] = data[offset + 3]; + data[offset + rowSize] = data[offset + rowSize - 4]; + data[offset + rowSize + 1] = data[offset + rowSize - 3]; + data[offset + rowSize + 2] = data[offset + rowSize - 2]; + data[offset + rowSize + 3] = data[offset + rowSize - 1]; + offset -= imgRowSize; + } + } + const img = { + width: imgWidth, + height: imgHeight + }; + if (context.isOffscreenCanvasSupported) { + const canvas = new OffscreenCanvas(imgWidth, imgHeight); + const ctx = canvas.getContext("2d"); + ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); + img.bitmap = canvas.transferToImageBitmap(); + img.data = null; + } else { + img.kind = ImageKind.RGBA_32BPP; + img.data = imgData; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [img, map]); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintImageMaskXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); +}, function foundImageMaskGroup(context, i) { + const MIN_IMAGES_IN_MASKS_BLOCK = 10; + const MAX_IMAGES_IN_MASKS_BLOCK = 100; + const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIMXO = curr - 1; + let count = Math.floor((i - iFirstSave) / 4); + if (count < MIN_IMAGES_IN_MASKS_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let isSameImage = false; + let iTransform, transformArgs; + const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0], + firstTransformArg1 = argsArray[iFirstTransform][1], + firstTransformArg2 = argsArray[iFirstTransform][2], + firstTransformArg3 = argsArray[iFirstTransform][3]; + if (firstTransformArg1 === firstTransformArg2) { + isSameImage = true; + iTransform = iFirstTransform + 4; + let iPIMXO = iFirstPIMXO + 4; + for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { + transformArgs = argsArray[iTransform]; + if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } + break; + } + } + } + if (isSameImage) { + count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); + const positions = new Float32Array(count * 2); + iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); + } else { + count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); + const images = []; + for (let q = 0; q < count; q++) { + transformArgs = argsArray[iFirstTransform + (q << 2)]; + const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; + images.push({ + data: maskParams.data, + width: maskParams.width, + height: maskParams.height, + interpolate: maskParams.interpolate, + count: maskParams.count, + transform: transformArgs + }); + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); + } + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { + const argsArray = context.argsArray; + const iFirstTransform = context.iCurr - 2; + return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; +}, function iterateImageGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + if (fnArray[i] !== OPS.transform) { + return false; + } + const iFirstTransform = context.iCurr - 2; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { + return false; + } + return true; + case 2: + if (fnArray[i] !== OPS.paintImageXObject) { + return false; + } + const iFirstPIXO = context.iCurr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + if (argsArray[i][0] !== firstPIXOArg0) { + return false; + } + return true; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_IMAGES_IN_BLOCK = 3; + const MAX_IMAGES_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIXO = curr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); + if (count < MIN_IMAGES_IN_BLOCK) { + return i - (i - iFirstSave) % 4; + } + const positions = new Float32Array(count * 2); + let iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + const transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; + fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 4; + const pos = (i - iFirstSave) % 5; + switch (pos) { + case 0: + return fnArray[i] === OPS.beginText; + case 1: + return fnArray[i] === OPS.setFont; + case 2: + return fnArray[i] === OPS.setTextMatrix; + case 3: + if (fnArray[i] !== OPS.showText) { + return false; + } + const iFirstSetFont = context.iCurr - 3; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { + return false; + } + return true; + case 4: + return fnArray[i] === OPS.endText; + } + throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_CHARS_IN_BLOCK = 3; + const MAX_CHARS_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstBeginText = curr - 4; + const iFirstSetFont = curr - 3; + const iFirstSetTextMatrix = curr - 2; + const iFirstShowText = curr - 1; + const iFirstEndText = curr; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); + if (count < MIN_CHARS_IN_BLOCK) { + return i - (i - iFirstBeginText) % 5; + } + let iFirst = iFirstBeginText; + if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { + count++; + iFirst -= 5; + } + let iEndText = iFirst + 4; + for (let q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; + } + return iEndText + 1; +}); +class NullOptimizer { + constructor(queue) { + this.queue = queue; + } + _optimize() {} + push(fn, args) { + this.queue.fnArray.push(fn); + this.queue.argsArray.push(args); + this._optimize(); + } + flush() {} + reset() {} +} +class QueueOptimizer extends NullOptimizer { + constructor(queue) { + super(queue); + this.state = null; + this.context = { + iCurr: 0, + fnArray: queue.fnArray, + argsArray: queue.argsArray, + isOffscreenCanvasSupported: false + }; + this.match = null; + this.lastProcessed = 0; + } + set isOffscreenCanvasSupported(value) { + this.context.isOffscreenCanvasSupported = value; + } + _optimize() { + const fnArray = this.queue.fnArray; + let i = this.lastProcessed, + ii = fnArray.length; + let state = this.state; + let match = this.match; + if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { + this.lastProcessed = ii; + return; + } + const context = this.context; + while (i < ii) { + if (match) { + const iterate = (0, match.iterateFn)(context, i); + if (iterate) { + i++; + continue; + } + i = (0, match.processFn)(context, i + 1); + ii = fnArray.length; + match = null; + state = null; + if (i >= ii) { + break; + } + } + state = (state || InitialState)[fnArray[i]]; + if (!state || Array.isArray(state)) { + i++; + continue; + } + context.iCurr = i; + i++; + if (state.checkFn && !(0, state.checkFn)(context)) { + state = null; + continue; + } + match = state; + state = null; + } + this.state = state; + this.match = match; + this.lastProcessed = i; + } + flush() { + while (this.match) { + const length = this.queue.fnArray.length; + this.lastProcessed = (0, this.match.processFn)(this.context, length); + this.match = null; + this.state = null; + this._optimize(); + } + } + reset() { + this.state = null; + this.match = null; + this.lastProcessed = 0; + } +} +class OperatorList { + static CHUNK_SIZE = 1000; + static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; + constructor(intent = 0, streamSink) { + this._streamSink = streamSink; + this.fnArray = []; + this.argsArray = []; + this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); + this.dependencies = new Set(); + this._totalLength = 0; + this.weight = 0; + this._resolved = streamSink ? null : Promise.resolve(); + } + set isOffscreenCanvasSupported(value) { + this.optimizer.isOffscreenCanvasSupported = value; + } + get length() { + return this.argsArray.length; + } + get ready() { + return this._resolved || this._streamSink.ready; + } + get totalLength() { + return this._totalLength + this.length; + } + addOp(fn, args) { + this.optimizer.push(fn, args); + this.weight++; + if (this._streamSink) { + if (this.weight >= OperatorList.CHUNK_SIZE) { + this.flush(); + } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { + this.flush(); + } + } + } + addImageOps(fn, args, optionalContent, hasMask = false) { + if (hasMask) { + this.addOp(OPS.save); + this.addOp(OPS.setGState, [[["SMask", false]]]); + } + if (optionalContent !== undefined) { + this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + this.addOp(fn, args); + if (optionalContent !== undefined) { + this.addOp(OPS.endMarkedContent, []); + } + if (hasMask) { + this.addOp(OPS.restore); + } + } + addDependency(dependency) { + if (this.dependencies.has(dependency)) { + return; + } + this.dependencies.add(dependency); + this.addOp(OPS.dependency, [dependency]); + } + addDependencies(dependencies) { + for (const dependency of dependencies) { + this.addDependency(dependency); + } + } + addOpList(opList) { + if (!(opList instanceof OperatorList)) { + warn('addOpList - ignoring invalid "opList" parameter.'); + return; + } + for (const dependency of opList.dependencies) { + this.dependencies.add(dependency); + } + for (let i = 0, ii = opList.length; i < ii; i++) { + this.addOp(opList.fnArray[i], opList.argsArray[i]); + } + } + getIR() { + return { + fnArray: this.fnArray, + argsArray: this.argsArray, + length: this.length + }; + } + get _transfers() { + const transfers = []; + const { + fnArray, + argsArray, + length + } = this; + for (let i = 0; i < length; i++) { + switch (fnArray[i]) { + case OPS.paintInlineImageXObject: + case OPS.paintInlineImageXObjectGroup: + case OPS.paintImageMaskXObject: + const arg = argsArray[i][0]; + if (!arg.cached && arg.data?.buffer instanceof ArrayBuffer) { + transfers.push(arg.data.buffer); + } + break; + } + } + return transfers; + } + flush(lastChunk = false, separateAnnots = null) { + this.optimizer.flush(); + const length = this.length; + this._totalLength += length; + this._streamSink.enqueue({ + fnArray: this.fnArray, + argsArray: this.argsArray, + lastChunk, + separateAnnots, + length + }, 1, this._transfers); + this.dependencies.clear(); + this.fnArray.length = 0; + this.argsArray.length = 0; + this.weight = 0; + this.optimizer.reset(); + } +} + +;// ./src/core/image.js + + + + + + + + + +function decodeAndClamp(value, addend, coefficient, max) { + value = addend + value * coefficient; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + return value; +} +function resizeImageMask(src, bpc, w1, h1, w2, h2) { + const length = w2 * h2; + let dest; + if (bpc <= 8) { + dest = new Uint8Array(length); + } else if (bpc <= 16) { + dest = new Uint16Array(length); + } else { + dest = new Uint32Array(length); + } + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let i, + j, + py, + newIndex = 0, + oldIndex; + const xScaled = new Uint16Array(w2); + const w1Scanline = w1; + for (i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + for (i = 0; i < h2; i++) { + py = Math.floor(i * yRatio) * w1Scanline; + for (j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex]; + } + } + return dest; +} +class PDFImage { + constructor({ + xref, + res, + image, + isInline = false, + smask = null, + mask = null, + isMask = false, + pdfFunctionFactory, + localColorSpaceCache + }) { + this.image = image; + const dict = image.dict; + const filter = dict.get("F", "Filter"); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = xref.fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } + } + switch (filterName) { + case "JPXDecode": + ({ + width: image.width, + height: image.height, + componentsCount: image.numComps, + bitsPerComponent: image.bitsPerComponent + } = JpxImage.parseImageProperties(image.stream)); + image.stream.reset(); + this.jpxDecoderOptions = { + numComponents: 0, + isIndexedColormap: false, + smaskInData: dict.has("SMaskInData") + }; + break; + case "JBIG2Decode": + image.bitsPerComponent = 1; + image.numComps = 1; + break; + } + let width = dict.get("W", "Width"); + let height = dict.get("H", "Height"); + if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) { + warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary."); + width = image.width; + height = image.height; + } + if (width < 1 || height < 1) { + throw new FormatError(`Invalid image width: ${width} or height: ${height}`); + } + this.width = width; + this.height = height; + this.interpolate = dict.get("I", "Interpolate"); + this.imageMask = dict.get("IM", "ImageMask") || false; + this.matte = dict.get("Matte") || false; + let bitsPerComponent = image.bitsPerComponent; + if (!bitsPerComponent) { + bitsPerComponent = dict.get("BPC", "BitsPerComponent"); + if (!bitsPerComponent) { + if (this.imageMask) { + bitsPerComponent = 1; + } else { + throw new FormatError(`Bits per component missing in image: ${this.imageMask}`); + } + } + } + this.bpc = bitsPerComponent; + if (!this.imageMask) { + let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); + const hasColorSpace = !!colorSpace; + if (!hasColorSpace) { + if (this.jpxDecoderOptions) { + colorSpace = Name.get("DeviceRGBA"); + } else { + switch (image.numComps) { + case 1: + colorSpace = Name.get("DeviceGray"); + break; + case 3: + colorSpace = Name.get("DeviceRGB"); + break; + case 4: + colorSpace = Name.get("DeviceCMYK"); + break; + default: + throw new Error(`Images with ${image.numComps} color components not supported.`); + } + } + } else if (this.jpxDecoderOptions?.smaskInData) { + colorSpace = Name.get("DeviceRGBA"); + } + this.colorSpace = ColorSpace.parse({ + cs: colorSpace, + xref, + resources: isInline ? res : null, + pdfFunctionFactory, + localColorSpaceCache + }); + this.numComps = this.colorSpace.numComps; + if (this.jpxDecoderOptions) { + this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComp : 0; + this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; + } + } + this.decode = dict.getArray("D", "Decode"); + this.needsDecode = false; + if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) { + this.needsDecode = true; + const max = (1 << bitsPerComponent) - 1; + this.decodeCoefficients = []; + this.decodeAddends = []; + const isIndexed = this.colorSpace?.name === "Indexed"; + for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) { + const dmin = this.decode[i]; + const dmax = this.decode[i + 1]; + this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin; + this.decodeAddends[j] = isIndexed ? dmin : max * dmin; + } + } + if (smask) { + this.smask = new PDFImage({ + xref, + res, + image: smask, + isInline, + pdfFunctionFactory, + localColorSpaceCache + }); + } else if (mask) { + if (mask instanceof BaseStream) { + const maskDict = mask.dict, + imageMask = maskDict.get("IM", "ImageMask"); + if (!imageMask) { + warn("Ignoring /Mask in image without /ImageMask."); + } else { + this.mask = new PDFImage({ + xref, + res, + image: mask, + isInline, + isMask: true, + pdfFunctionFactory, + localColorSpaceCache + }); + } + } else { + this.mask = mask; + } + } + } + static async buildImage({ + xref, + res, + image, + isInline = false, + pdfFunctionFactory, + localColorSpaceCache + }) { + const imageData = image; + let smaskData = null; + let maskData = null; + const smask = image.dict.get("SMask"); + const mask = image.dict.get("Mask"); + if (smask) { + if (smask instanceof BaseStream) { + smaskData = smask; + } else { + warn("Unsupported /SMask format."); + } + } else if (mask) { + if (mask instanceof BaseStream || Array.isArray(mask)) { + maskData = mask; + } else { + warn("Unsupported /Mask format."); + } + } + return new PDFImage({ + xref, + res, + image: imageData, + isInline, + smask: smaskData, + mask: maskData, + pdfFunctionFactory, + localColorSpaceCache + }); + } + static createRawMask({ + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate + }) { + const computedLength = (width + 7 >> 3) * height; + const actualLength = imgArray.byteLength; + const haveFullData = computedLength === actualLength; + let data, i; + if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { + data = imgArray; + } else if (!inverseDecode) { + data = new Uint8Array(imgArray); + } else { + data = new Uint8Array(computedLength); + data.set(imgArray); + data.fill(0xff, actualLength); + } + if (inverseDecode) { + for (i = 0; i < actualLength; i++) { + data[i] ^= 0xff; + } + } + return { + data, + width, + height, + interpolate + }; + } + static async createMask({ + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate, + isOffscreenCanvasSupported = false + }) { + const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); + if (isSingleOpaquePixel) { + return { + isSingleOpaquePixel + }; + } + if (isOffscreenCanvasSupported) { + if (ImageResizer.needsToBeResized(width, height)) { + const data = new Uint8ClampedArray(width * height * 4); + convertBlackAndWhiteToRGBA({ + src: imgArray, + dest: data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + return ImageResizer.createImage({ + kind: ImageKind.RGBA_32BPP, + data, + width, + height, + interpolate + }); + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + const imgData = ctx.createImageData(width, height); + convertBlackAndWhiteToRGBA({ + src: imgArray, + dest: imgData.data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + interpolate, + bitmap + }; + } + return this.createRawMask({ + imgArray, + width, + height, + inverseDecode, + imageIsFromDecodeStream, + interpolate + }); + } + get drawWidth() { + return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0); + } + get drawHeight() { + return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0); + } + decodeBuffer(buffer) { + const bpc = this.bpc; + const numComps = this.numComps; + const decodeAddends = this.decodeAddends; + const decodeCoefficients = this.decodeCoefficients; + const max = (1 << bpc) - 1; + let i, ii; + if (bpc === 1) { + for (i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = +!buffer[i]; + } + return; + } + let index = 0; + for (i = 0, ii = this.width * this.height; i < ii; i++) { + for (let j = 0; j < numComps; j++) { + buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); + index++; + } + } + } + getComponents(buffer) { + const bpc = this.bpc; + if (bpc === 8) { + return buffer; + } + const width = this.width; + const height = this.height; + const numComps = this.numComps; + const length = width * height * numComps; + let bufferPos = 0; + let output; + if (bpc <= 8) { + output = new Uint8Array(length); + } else if (bpc <= 16) { + output = new Uint16Array(length); + } else { + output = new Uint32Array(length); + } + const rowComps = width * numComps; + const max = (1 << bpc) - 1; + let i = 0, + ii, + buf; + if (bpc === 1) { + let mask, loop1End, loop2End; + for (let j = 0; j < height; j++) { + loop1End = i + (rowComps & ~7); + loop2End = i + rowComps; + while (i < loop1End) { + buf = buffer[bufferPos++]; + output[i] = buf >> 7 & 1; + output[i + 1] = buf >> 6 & 1; + output[i + 2] = buf >> 5 & 1; + output[i + 3] = buf >> 4 & 1; + output[i + 4] = buf >> 3 & 1; + output[i + 5] = buf >> 2 & 1; + output[i + 6] = buf >> 1 & 1; + output[i + 7] = buf & 1; + i += 8; + } + if (i < loop2End) { + buf = buffer[bufferPos++]; + mask = 128; + while (i < loop2End) { + output[i++] = +!!(buf & mask); + mask >>= 1; + } + } + } + } else { + let bits = 0; + buf = 0; + for (i = 0, ii = length; i < ii; ++i) { + if (i % rowComps === 0) { + buf = 0; + bits = 0; + } + while (bits < bpc) { + buf = buf << 8 | buffer[bufferPos++]; + bits += 8; + } + const remainingBits = bits - bpc; + let value = buf >> remainingBits; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + output[i] = value; + buf &= (1 << remainingBits) - 1; + bits = remainingBits; + } + } + return output; + } + async fillOpacity(rgbaBuf, width, height, actualHeight, image) { + const smask = this.smask; + const mask = this.mask; + let alphaBuf, sw, sh, i, ii, j; + if (smask) { + sw = smask.width; + sh = smask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + await smask.fillGrayBuffer(alphaBuf); + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); + } + } else if (mask) { + if (mask instanceof PDFImage) { + sw = mask.width; + sh = mask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + mask.numComps = 1; + await mask.fillGrayBuffer(alphaBuf); + for (i = 0, ii = sw * sh; i < ii; ++i) { + alphaBuf[i] = 255 - alphaBuf[i]; + } + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); + } + } else if (Array.isArray(mask)) { + alphaBuf = new Uint8ClampedArray(width * height); + const numComps = this.numComps; + for (i = 0, ii = width * height; i < ii; ++i) { + let opacity = 0; + const imageOffset = i * numComps; + for (j = 0; j < numComps; ++j) { + const color = image[imageOffset + j]; + const maskOffset = j * 2; + if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { + opacity = 255; + break; + } + } + alphaBuf[i] = opacity; + } + } else { + throw new FormatError("Unknown mask format."); + } + } + if (alphaBuf) { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = alphaBuf[i]; + } + } else { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = 255; + } + } + } + undoPreblend(buffer, width, height) { + const matte = this.smask?.matte; + if (!matte) { + return; + } + const matteRgb = this.colorSpace.getRgb(matte, 0); + const matteR = matteRgb[0]; + const matteG = matteRgb[1]; + const matteB = matteRgb[2]; + const length = width * height * 4; + for (let i = 0; i < length; i += 4) { + const alpha = buffer[i + 3]; + if (alpha === 0) { + buffer[i] = 255; + buffer[i + 1] = 255; + buffer[i + 2] = 255; + continue; + } + const k = 255 / alpha; + buffer[i] = (buffer[i] - matteR) * k + matteR; + buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG; + buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; + } + } + async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) { + const drawWidth = this.drawWidth; + const drawHeight = this.drawHeight; + const imgData = { + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate, + kind: 0, + data: null + }; + const numComps = this.numComps; + const originalWidth = this.width; + const originalHeight = this.height; + const bpc = this.bpc; + const rowBytes = originalWidth * numComps * bpc + 7 >> 3; + const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight); + if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") { + imgData.kind = ImageKind.RGBA_32BPP; + const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {}); + if (isOffscreenCanvasSupported) { + if (!mustBeResized) { + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); + } + return ImageResizer.createImage(imgData, false); + } + return imgData; + } + if (!forceRGBA) { + let kind; + if (this.colorSpace.name === "DeviceGray" && bpc === 1) { + kind = ImageKind.GRAYSCALE_1BPP; + } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) { + kind = ImageKind.RGB_24BPP; + } + if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { + const image = await this.#getImage(originalWidth, originalHeight); + if (image) { + return image; + } + const data = await this.getImageBytes(originalHeight * rowBytes, {}); + if (isOffscreenCanvasSupported) { + if (mustBeResized) { + return ImageResizer.createImage({ + data, + kind, + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate + }, this.needsDecode); + } + return this.createBitmap(kind, originalWidth, originalHeight, data); + } + imgData.kind = kind; + imgData.data = data; + if (this.needsDecode) { + assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); + const buffer = imgData.data; + for (let i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] ^= 0xff; + } + } + return imgData; + } + if (this.image instanceof JpegStream && !this.smask && !this.mask && !this.needsDecode) { + let imageLength = originalHeight * rowBytes; + if (isOffscreenCanvasSupported && !mustBeResized) { + let isHandled = false; + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 4; + isHandled = true; + break; + case "DeviceRGB": + imageLength = imageLength / 3 * 4; + isHandled = true; + break; + case "DeviceCMYK": + isHandled = true; + break; + } + if (isHandled) { + const image = await this.#getImage(drawWidth, drawHeight); + if (image) { + return image; + } + const rgba = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGBA: true + }); + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); + } + } else { + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 3; + case "DeviceRGB": + case "DeviceCMYK": + imgData.kind = ImageKind.RGB_24BPP; + imgData.data = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGB: true + }); + if (mustBeResized) { + return ImageResizer.createImage(imgData); + } + return imgData; + } + } + } + } + const imgArray = await this.getImageBytes(originalHeight * rowBytes, { + internal: true + }); + const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; + const comps = this.getComponents(imgArray); + let alpha01, maybeUndoPreblend; + let canvas, ctx, canvasImgData, data; + if (isOffscreenCanvasSupported && !mustBeResized) { + canvas = new OffscreenCanvas(drawWidth, drawHeight); + ctx = canvas.getContext("2d"); + canvasImgData = ctx.createImageData(drawWidth, drawHeight); + data = canvasImgData.data; + } + imgData.kind = ImageKind.RGBA_32BPP; + if (!forceRGBA && !this.smask && !this.mask) { + if (!isOffscreenCanvasSupported || mustBeResized) { + imgData.kind = ImageKind.RGB_24BPP; + data = new Uint8ClampedArray(drawWidth * drawHeight * 3); + alpha01 = 0; + } else { + const arr = new Uint32Array(data.buffer); + arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); + alpha01 = 1; + } + maybeUndoPreblend = false; + } else { + if (!isOffscreenCanvasSupported || mustBeResized) { + data = new Uint8ClampedArray(drawWidth * drawHeight * 4); + } + alpha01 = 1; + maybeUndoPreblend = true; + await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); + if (maybeUndoPreblend) { + this.undoPreblend(data, drawWidth, actualHeight); + } + if (isOffscreenCanvasSupported && !mustBeResized) { + ctx.putImageData(canvasImgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width: drawWidth, + height: drawHeight, + bitmap, + interpolate: this.interpolate + }; + } + imgData.data = data; + if (mustBeResized) { + return ImageResizer.createImage(imgData); + } + return imgData; + } + async fillGrayBuffer(buffer) { + const numComps = this.numComps; + if (numComps !== 1) { + throw new FormatError(`Reading gray scale from a color image: ${numComps}`); + } + const width = this.width; + const height = this.height; + const bpc = this.bpc; + const rowBytes = width * numComps * bpc + 7 >> 3; + const imgArray = await this.getImageBytes(height * rowBytes, { + internal: true + }); + const comps = this.getComponents(imgArray); + let i, length; + if (bpc === 1) { + length = width * height; + if (this.needsDecode) { + for (i = 0; i < length; ++i) { + buffer[i] = comps[i] - 1 & 255; + } + } else { + for (i = 0; i < length; ++i) { + buffer[i] = -comps[i] & 255; + } + } + return; + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + length = width * height; + const scale = 255 / ((1 << bpc) - 1); + for (i = 0; i < length; ++i) { + buffer[i] = scale * comps[i]; + } + } + createBitmap(kind, width, height, src) { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + let imgData; + if (kind === ImageKind.RGBA_32BPP) { + imgData = new ImageData(src, width, height); + } else { + imgData = ctx.createImageData(width, height); + convertToRGBA({ + kind, + src, + dest: new Uint32Array(imgData.data.buffer), + width, + height, + inverseDecode: this.needsDecode + }); + } + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } + async #getImage(width, height) { + const bitmap = await this.image.getTransferableImage(); + if (!bitmap) { + return null; + } + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } + async getImageBytes(length, { + drawWidth, + drawHeight, + forceRGBA = false, + forceRGB = false, + internal = false + }) { + this.image.reset(); + this.image.drawWidth = drawWidth || this.width; + this.image.drawHeight = drawHeight || this.height; + this.image.forceRGBA = !!forceRGBA; + this.image.forceRGB = !!forceRGB; + const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions); + if (internal || this.image instanceof DecodeStream) { + return imageBytes; + } + assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.'); + return new Uint8Array(imageBytes); + } +} + +;// ./src/core/evaluator.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const DefaultPartialEvaluatorOptions = Object.freeze({ + maxImageSize: -1, + disableFontFace: false, + ignoreErrors: false, + isEvalSupported: true, + isOffscreenCanvasSupported: false, + isImageDecoderSupported: false, + canvasMaxAreaInBytes: -1, + fontExtraProperties: false, + useSystemFonts: true, + cMapUrl: null, + standardFontDataUrl: null +}); +const PatternType = { + TILING: 1, + SHADING: 2 +}; +const TEXT_CHUNK_BATCH_SIZE = 10; +const deferred = Promise.resolve(); +function normalizeBlendMode(value, parsingArray = false) { + if (Array.isArray(value)) { + for (const val of value) { + const maybeBM = normalizeBlendMode(val, true); + if (maybeBM) { + return maybeBM; + } + } + warn(`Unsupported blend mode Array: ${value}`); + return "source-over"; + } + if (!(value instanceof Name)) { + if (parsingArray) { + return null; + } + return "source-over"; + } + switch (value.name) { + case "Normal": + case "Compatible": + return "source-over"; + case "Multiply": + return "multiply"; + case "Screen": + return "screen"; + case "Overlay": + return "overlay"; + case "Darken": + return "darken"; + case "Lighten": + return "lighten"; + case "ColorDodge": + return "color-dodge"; + case "ColorBurn": + return "color-burn"; + case "HardLight": + return "hard-light"; + case "SoftLight": + return "soft-light"; + case "Difference": + return "difference"; + case "Exclusion": + return "exclusion"; + case "Hue": + return "hue"; + case "Saturation": + return "saturation"; + case "Color": + return "color"; + case "Luminosity": + return "luminosity"; + } + if (parsingArray) { + return null; + } + warn(`Unsupported blend mode: ${value.name}`); + return "source-over"; +} +function addLocallyCachedImageOps(opList, data) { + if (data.objId) { + opList.addDependency(data.objId); + } + opList.addImageOps(data.fn, data.args, data.optionalContent, data.hasMask); + if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) { + data.args[0].count++; + } +} +class TimeSlotManager { + static TIME_SLOT_DURATION_MS = 20; + static CHECK_TIME_EVERY = 100; + constructor() { + this.reset(); + } + check() { + if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { + return false; + } + this.checked = 0; + return this.endTime <= Date.now(); + } + reset() { + this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS; + this.checked = 0; + } +} +class PartialEvaluator { + constructor({ + xref, + handler, + pageIndex, + idFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + systemFontCache, + options = null + }) { + this.xref = xref; + this.handler = handler; + this.pageIndex = pageIndex; + this.idFactory = idFactory; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.options = options || DefaultPartialEvaluatorOptions; + this.type3FontRefs = null; + this._regionalImageCache = new RegionalImageCache(); + this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); + ImageResizer.setOptions(this.options); + JpegStream.setOptions(this.options); + } + get _pdfFunctionFactory() { + const pdfFunctionFactory = new PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.options.isEvalSupported + }); + return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); + } + get parsingType3Font() { + return !!this.type3FontRefs; + } + clone(newOptions = null) { + const newEvaluator = Object.create(this); + newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions); + return newEvaluator; + } + hasBlendModes(resources, nonBlendModesSet) { + if (!(resources instanceof Dict)) { + return false; + } + if (resources.objId && nonBlendModesSet.has(resources.objId)) { + return false; + } + const processed = new RefSet(nonBlendModesSet); + if (resources.objId) { + processed.put(resources.objId); + } + const nodes = [resources], + xref = this.xref; + while (nodes.length) { + const node = nodes.shift(); + const graphicStates = node.get("ExtGState"); + if (graphicStates instanceof Dict) { + for (let graphicState of graphicStates.getRawValues()) { + if (graphicState instanceof Ref) { + if (processed.has(graphicState)) { + continue; + } + try { + graphicState = xref.fetch(graphicState); + } catch (ex) { + processed.put(graphicState); + info(`hasBlendModes - ignoring ExtGState: "${ex}".`); + continue; + } + } + if (!(graphicState instanceof Dict)) { + continue; + } + if (graphicState.objId) { + processed.put(graphicState.objId); + } + const bm = graphicState.get("BM"); + if (bm instanceof Name) { + if (bm.name !== "Normal") { + return true; + } + continue; + } + if (bm !== undefined && Array.isArray(bm)) { + for (const element of bm) { + if (element instanceof Name && element.name !== "Normal") { + return true; + } + } + } + } + } + const xObjects = node.get("XObject"); + if (!(xObjects instanceof Dict)) { + continue; + } + for (let xObject of xObjects.getRawValues()) { + if (xObject instanceof Ref) { + if (processed.has(xObject)) { + continue; + } + try { + xObject = xref.fetch(xObject); + } catch (ex) { + processed.put(xObject); + info(`hasBlendModes - ignoring XObject: "${ex}".`); + continue; + } + } + if (!(xObject instanceof BaseStream)) { + continue; + } + if (xObject.dict.objId) { + processed.put(xObject.dict.objId); + } + const xResources = xObject.dict.get("Resources"); + if (!(xResources instanceof Dict)) { + continue; + } + if (xResources.objId && processed.has(xResources.objId)) { + continue; + } + nodes.push(xResources); + if (xResources.objId) { + processed.put(xResources.objId); + } + } + } + for (const ref of processed) { + nonBlendModesSet.put(ref); + } + return false; + } + async #fetchData(url) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`); + } + return new Uint8Array(await response.arrayBuffer()); + } + async fetchBuiltInCMap(name) { + const cachedData = this.builtInCMapCache.get(name); + if (cachedData) { + return cachedData; + } + let data; + if (this.options.cMapUrl !== null) { + const cMapData = await this.#fetchData(`${this.options.cMapUrl}${name}.bcmap`); + data = { + cMapData, + isCompressed: true + }; + } else { + data = await this.handler.sendWithPromise("FetchBuiltInCMap", { + name + }); + } + this.builtInCMapCache.set(name, data); + return data; + } + async fetchStandardFontData(name) { + const cachedData = this.standardFontDataCache.get(name); + if (cachedData) { + return new Stream(cachedData); + } + if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") { + return null; + } + const standardFontNameToFileName = getFontNameToFileMap(), + filename = standardFontNameToFileName[name]; + let data; + try { + if (this.options.standardFontDataUrl !== null) { + data = await this.#fetchData(`${this.options.standardFontDataUrl}${filename}`); + } else { + data = await this.handler.sendWithPromise("FetchStandardFontData", { + filename + }); + } + } catch (ex) { + warn(ex); + return null; + } + this.standardFontDataCache.set(name, data); + return new Stream(data); + } + async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) { + const dict = xobj.dict; + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + let optionalContent, groupOptions; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + const group = dict.get("Group"); + if (group) { + groupOptions = { + matrix, + bbox, + smask, + isolated: false, + knockout: false + }; + const groupSubtype = group.get("S"); + let colorSpace = null; + if (isName(groupSubtype, "Transparency")) { + groupOptions.isolated = group.get("I") || false; + groupOptions.knockout = group.get("K") || false; + if (group.has("CS")) { + const cs = group.getRaw("CS"); + const cachedColorSpace = ColorSpace.getCached(cs, this.xref, localColorSpaceCache); + if (cachedColorSpace) { + colorSpace = cachedColorSpace; + } else { + colorSpace = await this.parseColorSpace({ + cs, + resources, + localColorSpaceCache + }); + } + } + } + if (smask?.backdrop) { + colorSpace ||= ColorSpace.singletons.rgb; + smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); + } + operatorList.addOp(OPS.beginGroup, [groupOptions]); + } + const args = group ? [matrix, null] : [matrix, bbox]; + operatorList.addOp(OPS.paintFormXObjectBegin, args); + await this.getOperatorList({ + stream: xobj, + task, + resources: dict.get("Resources") || resources, + operatorList, + initialState + }); + operatorList.addOp(OPS.paintFormXObjectEnd, []); + if (group) { + operatorList.addOp(OPS.endGroup, [groupOptions]); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.endMarkedContent, []); + } + } + _sendImgData(objId, imgData, cacheGlobally = false) { + const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null; + if (this.parsingType3Font || cacheGlobally) { + return this.handler.send("commonobj", [objId, "Image", imgData], transfers); + } + return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers); + } + async buildPaintImageXObject({ + resources, + image, + isInline = false, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + }) { + const dict = image.dict; + const imageRef = dict.objId; + const w = dict.get("W", "Width"); + const h = dict.get("H", "Height"); + if (!(w && typeof w === "number") || !(h && typeof h === "number")) { + warn("Image dimensions are missing, or not numbers."); + return; + } + const maxImageSize = this.options.maxImageSize; + if (maxImageSize !== -1 && w * h > maxImageSize) { + const msg = "Image exceeded maximum allowed size and was removed."; + if (this.options.ignoreErrors) { + warn(msg); + return; + } + throw new Error(msg); + } + let optionalContent; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + const imageMask = dict.get("IM", "ImageMask") || false; + let imgData, args; + if (imageMask) { + const interpolate = dict.get("I", "Interpolate"); + const bitStrideLength = w + 7 >> 3; + const imgArray = image.getBytes(bitStrideLength * h); + const decode = dict.getArray("D", "Decode"); + if (this.parsingType3Font) { + imgData = PDFImage.createRawMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof DecodeStream, + inverseDecode: decode?.[0] > 0, + interpolate + }); + imgData.cached = !!cacheKey; + args = [imgData]; + operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); + if (cacheKey) { + const cacheData = { + fn: OPS.paintImageMaskXObject, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + imgData = await PDFImage.createMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof DecodeStream, + inverseDecode: decode?.[0] > 0, + interpolate, + isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported + }); + if (imgData.isSingleOpaquePixel) { + operatorList.addImageOps(OPS.paintSolidColorImageMask, [], optionalContent); + if (cacheKey) { + const cacheData = { + fn: OPS.paintSolidColorImageMask, + args: [], + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + const objId = `mask_${this.idFactory.createObjId()}`; + operatorList.addDependency(objId); + imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; + this._sendImgData(objId, imgData); + args = [{ + data: objId, + width: imgData.width, + height: imgData.height, + interpolate: imgData.interpolate, + count: 1 + }]; + operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); + if (cacheKey) { + const cacheData = { + objId, + fn: OPS.paintImageMaskXObject, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + const SMALL_IMAGE_DIMENSIONS = 200; + const hasMask = dict.has("SMask") || dict.has("Mask"); + if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) { + try { + const imageObj = new PDFImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }); + imgData = await imageObj.createImageData(true, false); + operatorList.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; + operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent); + } catch (reason) { + const msg = `Unable to decode inline image: "${reason}".`; + if (!this.options.ignoreErrors) { + throw new Error(msg); + } + warn(msg); + } + return; + } + let objId = `img_${this.idFactory.createObjId()}`, + cacheGlobally = false; + if (this.parsingType3Font) { + objId = `${this.idFactory.getDocId()}_type3_${objId}`; + } else if (cacheKey && imageRef) { + cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex); + if (cacheGlobally) { + assert(!isInline, "Cannot cache an inline image globally."); + objId = `${this.idFactory.getDocId()}_${objId}`; + } + } + operatorList.addDependency(objId); + args = [objId, w, h]; + operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent, hasMask); + if (cacheGlobally) { + if (this.globalImageCache.hasDecodeFailed(imageRef)) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + hasMask, + byteSize: 0 + }); + this._sendImgData(objId, null, cacheGlobally); + return; + } + if (w * h > 250000 || hasMask) { + const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { + imageRef + }]); + if (localLength) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + hasMask, + byteSize: 0 + }); + this.globalImageCache.addByteSize(imageRef, localLength); + return; + } + } + } + PDFImage.buildImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }).then(async imageObj => { + imgData = await imageObj.createImageData(false, this.options.isOffscreenCanvasSupported); + imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; + imgData.ref = imageRef; + if (cacheGlobally) { + this.globalImageCache.addByteSize(imageRef, imgData.dataLen); + } + return this._sendImgData(objId, imgData, cacheGlobally); + }).catch(reason => { + warn(`Unable to decode image "${objId}": "${reason}".`); + if (imageRef) { + this.globalImageCache.addDecodeFailed(imageRef); + } + return this._sendImgData(objId, null, cacheGlobally); + }); + if (cacheKey) { + const cacheData = { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + hasMask + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + if (cacheGlobally) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + hasMask, + byteSize: 0 + }); + } + } + } + } + handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) { + const smaskContent = smask.get("G"); + const smaskOptions = { + subtype: smask.get("S").name, + backdrop: smask.get("BC") + }; + const transferObj = smask.get("TR"); + if (isPDFFunction(transferObj)) { + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256); + const tmp = new Float32Array(1); + for (let i = 0; i < 256; i++) { + tmp[0] = i / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[i] = tmp[0] * 255 | 0; + } + smaskOptions.transferMap = transferMap; + } + return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache); + } + handleTransferFunction(tr) { + let transferArray; + if (Array.isArray(tr)) { + transferArray = tr; + } else if (isPDFFunction(tr)) { + transferArray = [tr]; + } else { + return null; + } + const transferMaps = []; + let numFns = 0, + numEffectfulFns = 0; + for (const entry of transferArray) { + const transferObj = this.xref.fetchIfRef(entry); + numFns++; + if (isName(transferObj, "Identity")) { + transferMaps.push(null); + continue; + } else if (!isPDFFunction(transferObj)) { + return null; + } + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256), + tmp = new Float32Array(1); + for (let j = 0; j < 256; j++) { + tmp[0] = j / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[j] = tmp[0] * 255 | 0; + } + transferMaps.push(transferMap); + numEffectfulFns++; + } + if (!(numFns === 1 || numFns === 4)) { + return null; + } + if (numEffectfulFns === 0) { + return null; + } + return transferMaps; + } + handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) { + const tilingOpList = new OperatorList(); + const patternResources = Dict.merge({ + xref: this.xref, + dictArray: [patternDict.get("Resources"), resources] + }); + return this.getOperatorList({ + stream: pattern, + task, + resources: patternResources, + operatorList: tilingOpList + }).then(function () { + const operatorListIR = tilingOpList.getIR(); + const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color); + operatorList.addDependencies(tilingOpList.dependencies); + operatorList.addOp(fn, tilingPatternIR); + if (patternDict.objId) { + localTilingPatternCache.set(null, patternDict.objId, { + operatorListIR, + dict: patternDict + }); + } + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`handleTilingType - ignoring pattern: "${reason}".`); + return; + } + throw reason; + }); + } + async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null) { + const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; + let translated = await this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo); + if (translated.font.isType3Font) { + try { + await translated.loadType3Data(this, resources, task); + operatorList.addDependencies(translated.type3Dependencies); + } catch (reason) { + translated = new TranslatedFont({ + loadedName: "g_font_error", + font: new ErrorFont(`Type3 font load error: ${reason}`), + dict: translated.font, + evaluatorOptions: this.options + }); + } + } + state.font = translated.font; + translated.send(this.handler); + return translated.loadedName; + } + handleText(chars, state) { + const font = state.font; + const glyphs = font.charsToGlyphs(chars); + if (font.data) { + const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || this.options.disableFontFace) { + PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options); + } + } + return glyphs; + } + ensureStateFont(state) { + if (state.font) { + return; + } + const reason = new FormatError("Missing setFont (Tf) operator before text rendering operator."); + if (this.options.ignoreErrors) { + warn(`ensureStateFont: "${reason}".`); + return; + } + throw reason; + } + async setGState({ + resources, + gState, + operatorList, + cacheKey, + task, + stateManager, + localGStateCache, + localColorSpaceCache + }) { + const gStateRef = gState.objId; + let isSimpleGState = true; + const gStateObj = []; + let promise = Promise.resolve(); + for (const key of gState.getKeys()) { + const value = gState.get(key); + switch (key) { + case "Type": + break; + case "LW": + case "LC": + case "LJ": + case "ML": + case "D": + case "RI": + case "FL": + case "CA": + case "ca": + gStateObj.push([key, value]); + break; + case "Font": + isSimpleGState = false; + promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { + operatorList.addDependency(loadedName); + gStateObj.push([key, [loadedName, value[1]]]); + })); + break; + case "BM": + gStateObj.push([key, normalizeBlendMode(value)]); + break; + case "SMask": + if (isName(value, "None")) { + gStateObj.push([key, false]); + break; + } + if (value instanceof Dict) { + isSimpleGState = false; + promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache)); + gStateObj.push([key, true]); + } else { + warn("Unsupported SMask type"); + } + break; + case "TR": + const transferMaps = this.handleTransferFunction(value); + gStateObj.push([key, transferMaps]); + break; + case "OP": + case "op": + case "OPM": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + case "TR2": + case "HT": + case "SM": + case "SA": + case "AIS": + case "TK": + info("graphic state operator " + key); + break; + default: + info("Unknown graphic state operator " + key); + break; + } + } + await promise; + if (gStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [gStateObj]); + } + if (isSimpleGState) { + localGStateCache.set(cacheKey, gStateRef, gStateObj); + } + } + loadFont(fontName, font, resources, fallbackFontDict = null, cssFontInfo = null) { + const errorFont = async () => { + return new TranslatedFont({ + loadedName: "g_font_error", + font: new ErrorFont(`Font "${fontName}" is not available.`), + dict: font, + evaluatorOptions: this.options + }); + }; + let fontRef; + if (font) { + if (font instanceof Ref) { + fontRef = font; + } + } else { + const fontRes = resources.get("Font"); + if (fontRes) { + fontRef = fontRes.getRaw(fontName); + } + } + if (fontRef) { + if (this.type3FontRefs?.has(fontRef)) { + return errorFont(); + } + if (this.fontCache.has(fontRef)) { + return this.fontCache.get(fontRef); + } + try { + font = this.xref.fetchIfRef(fontRef); + } catch (ex) { + warn(`loadFont - lookup failed: "${ex}".`); + } + } + if (!(font instanceof Dict)) { + if (!this.options.ignoreErrors && !this.parsingType3Font) { + warn(`Font "${fontName}" is not available.`); + return errorFont(); + } + warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`); + font = fallbackFontDict || PartialEvaluator.fallbackFontDict; + } + if (font.cacheKey && this.fontCache.has(font.cacheKey)) { + return this.fontCache.get(font.cacheKey); + } + const { + promise, + resolve + } = Promise.withResolvers(); + let preEvaluatedFont; + try { + preEvaluatedFont = this.preEvaluateFont(font); + preEvaluatedFont.cssFontInfo = cssFontInfo; + } catch (reason) { + warn(`loadFont - preEvaluateFont failed: "${reason}".`); + return errorFont(); + } + const { + descriptor, + hash + } = preEvaluatedFont; + const fontRefIsRef = fontRef instanceof Ref; + let fontID; + if (hash && descriptor instanceof Dict) { + const fontAliases = descriptor.fontAliases ||= Object.create(null); + if (fontAliases[hash]) { + const aliasFontRef = fontAliases[hash].aliasRef; + if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { + this.fontCache.putAlias(fontRef, aliasFontRef); + return this.fontCache.get(fontRef); + } + } else { + fontAliases[hash] = { + fontID: this.idFactory.createFontId() + }; + } + if (fontRefIsRef) { + fontAliases[hash].aliasRef = fontRef; + } + fontID = fontAliases[hash].fontID; + } else { + fontID = this.idFactory.createFontId(); + } + assert(fontID?.startsWith("f"), 'The "fontID" must be (correctly) defined.'); + if (fontRefIsRef) { + this.fontCache.put(fontRef, promise); + } else { + font.cacheKey = `cacheKey_${fontID}`; + this.fontCache.put(font.cacheKey, promise); + } + font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; + this.translateFont(preEvaluatedFont).then(translatedFont => { + resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: translatedFont, + dict: font, + evaluatorOptions: this.options + })); + }).catch(reason => { + warn(`loadFont - translateFont failed: "${reason}".`); + resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: new ErrorFont(reason instanceof Error ? reason.message : reason), + dict: font, + evaluatorOptions: this.options + })); + }); + return promise; + } + buildPath(operatorList, fn, args, parsingText = false) { + const lastIndex = operatorList.length - 1; + if (!args) { + args = []; + } + if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) { + if (parsingText) { + warn(`Encountered path operator "${fn}" inside of a text object.`); + operatorList.addOp(OPS.save, null); + } + let minMax; + switch (fn) { + case OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax = [Math.min(args[0], x), Math.min(args[1], y), Math.max(args[0], x), Math.max(args[1], y)]; + break; + case OPS.moveTo: + case OPS.lineTo: + minMax = [args[0], args[1], args[0], args[1]]; + break; + default: + minMax = [Infinity, Infinity, -Infinity, -Infinity]; + break; + } + operatorList.addOp(OPS.constructPath, [[fn], args, minMax]); + if (parsingText) { + operatorList.addOp(OPS.restore, null); + } + } else { + const opArgs = operatorList.argsArray[lastIndex]; + opArgs[0].push(fn); + opArgs[1].push(...args); + const minMax = opArgs[2]; + switch (fn) { + case OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax[0] = Math.min(minMax[0], args[0], x); + minMax[1] = Math.min(minMax[1], args[1], y); + minMax[2] = Math.max(minMax[2], args[0], x); + minMax[3] = Math.max(minMax[3], args[1], y); + break; + case OPS.moveTo: + case OPS.lineTo: + minMax[0] = Math.min(minMax[0], args[0]); + minMax[1] = Math.min(minMax[1], args[1]); + minMax[2] = Math.max(minMax[2], args[0]); + minMax[3] = Math.max(minMax[3], args[1]); + break; + } + } + } + parseColorSpace({ + cs, + resources, + localColorSpaceCache + }) { + return ColorSpace.parseAsync({ + cs, + xref: this.xref, + resources, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }).catch(reason => { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`); + return null; + } + throw reason; + }); + } + parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }) { + let id = localShadingPatternCache.get(shading); + if (id) { + return id; + } + let patternIR; + try { + const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, localColorSpaceCache); + patternIR = shadingFill.getIR(); + } catch (reason) { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`parseShading - ignoring shading: "${reason}".`); + localShadingPatternCache.set(shading, null); + return null; + } + throw reason; + } + id = `pattern_${this.idFactory.createObjId()}`; + if (this.parsingType3Font) { + id = `${this.idFactory.getDocId()}_type3_${id}`; + } + localShadingPatternCache.set(shading, id); + if (this.parsingType3Font) { + this.handler.send("commonobj", [id, "Pattern", patternIR]); + } else { + this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); + } + return id; + } + handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) { + const patternName = args.pop(); + if (patternName instanceof Name) { + const rawPattern = patterns.getRaw(patternName.name); + const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern); + if (localTilingPattern) { + try { + const color = cs.base ? cs.base.getRgb(args, 0) : null; + const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color); + operatorList.addOp(fn, tilingPatternIR); + return undefined; + } catch {} + } + const pattern = this.xref.fetchIfRef(rawPattern); + if (pattern) { + const dict = pattern instanceof BaseStream ? pattern.dict : pattern; + const typeNum = dict.get("PatternType"); + if (typeNum === PatternType.TILING) { + const color = cs.base ? cs.base.getRgb(args, 0) : null; + return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache); + } else if (typeNum === PatternType.SHADING) { + const shading = dict.get("Shading"); + const objId = this.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }); + if (objId) { + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + operatorList.addOp(fn, ["Shading", objId, matrix]); + } + return undefined; + } + throw new FormatError(`Unknown PatternType: ${typeNum}`); + } + } + throw new FormatError(`Unknown PatternName: ${patternName}`); + } + _parseVisibilityExpression(array, nestingCounter, currentResult) { + const MAX_NESTING = 10; + if (++nestingCounter > MAX_NESTING) { + warn("Visibility expression is too deeply nested"); + return; + } + const length = array.length; + const operator = this.xref.fetchIfRef(array[0]); + if (length < 2 || !(operator instanceof Name)) { + warn("Invalid visibility expression"); + return; + } + switch (operator.name) { + case "And": + case "Or": + case "Not": + currentResult.push(operator.name); + break; + default: + warn(`Invalid operator ${operator.name} in visibility expression`); + return; + } + for (let i = 1; i < length; i++) { + const raw = array[i]; + const object = this.xref.fetchIfRef(raw); + if (Array.isArray(object)) { + const nestedResult = []; + currentResult.push(nestedResult); + this._parseVisibilityExpression(object, nestingCounter, nestedResult); + } else if (raw instanceof Ref) { + currentResult.push(raw.toString()); + } + } + } + async parseMarkedContentProps(contentProperties, resources) { + let optionalContent; + if (contentProperties instanceof Name) { + const properties = resources.get("Properties"); + optionalContent = properties.get(contentProperties.name); + } else if (contentProperties instanceof Dict) { + optionalContent = contentProperties; + } else { + throw new FormatError("Optional content properties malformed."); + } + const optionalContentType = optionalContent.get("Type")?.name; + if (optionalContentType === "OCG") { + return { + type: optionalContentType, + id: optionalContent.objId + }; + } else if (optionalContentType === "OCMD") { + const expression = optionalContent.get("VE"); + if (Array.isArray(expression)) { + const result = []; + this._parseVisibilityExpression(expression, 0, result); + if (result.length > 0) { + return { + type: "OCMD", + expression: result + }; + } + } + const optionalContentGroups = optionalContent.get("OCGs"); + if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) { + const groupIds = []; + if (Array.isArray(optionalContentGroups)) { + for (const ocg of optionalContentGroups) { + groupIds.push(ocg.toString()); + } + } else { + groupIds.push(optionalContentGroups.objId); + } + return { + type: optionalContentType, + ids: groupIds, + policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null, + expression: null + }; + } else if (optionalContentGroups instanceof Ref) { + return { + type: optionalContentType, + id: optionalContentGroups.toString() + }; + } + } + return null; + } + getOperatorList({ + stream, + task, + resources, + operatorList, + initialState = null, + fallbackFontDict = null + }) { + resources ||= Dict.empty; + initialState ||= new EvalState(); + if (!operatorList) { + throw new Error('getOperatorList: missing "operatorList" parameter'); + } + const self = this; + const xref = this.xref; + let parsingText = false; + const localImageCache = new LocalImageCache(); + const localColorSpaceCache = new LocalColorSpaceCache(); + const localGStateCache = new LocalGStateCache(); + const localTilingPatternCache = new LocalTilingPatternCache(); + const localShadingPatternCache = new Map(); + const xobjs = resources.get("XObject") || Dict.empty; + const patterns = resources.get("Pattern") || Dict.empty; + const stateManager = new StateManager(initialState); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + const timeSlotManager = new TimeSlotManager(); + function closePendingRestoreOPS(argument) { + for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { + operatorList.addOp(OPS.restore, []); + } + } + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + Promise.all([promise, operatorList.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, i, ii, cs, name, isValidName; + while (!(stop = timeSlotManager.check())) { + operation.args = null; + if (!preprocessor.read(operation)) { + break; + } + let args = operation.args; + let fn = operation.fn; + switch (fn | 0) { + case OPS.paintXObject: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName) { + const localImage = localImageCache.getByName(name); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + args = null; + continue; + } + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); + if (globalImage) { + operatorList.addDependency(globalImage.objId); + operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent, globalImage.hasMask); + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { + throw new FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("XObject should have a Name subtype"); + } + if (type.name === "Form") { + stateManager.save(); + self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () { + stateManager.restore(); + resolveXObject(); + }, rejectXObject); + return; + } else if (type.name === "Image") { + self.buildPaintImageXObject({ + resources, + image: xobj, + operatorList, + cacheKey: name, + localImageCache, + localColorSpaceCache + }).then(resolveXObject, rejectXObject); + return; + } else if (type.name === "PS") { + info("Ignored XObject subtype PS"); + } else { + throw new FormatError(`Unhandled XObject subtype ${type.name}`); + } + resolveXObject(); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setFont: + const fontSize = args[1]; + next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) { + operatorList.addDependency(loadedName); + operatorList.addOp(OPS.setFont, [loadedName, fontSize]); + })); + return; + case OPS.beginText: + parsingText = true; + break; + case OPS.endText: + parsingText = false; + break; + case OPS.endInlineImage: + const cacheKey = args[0].cacheKey; + if (cacheKey) { + const localImage = localImageCache.getByName(cacheKey); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + args = null; + continue; + } + } + next(self.buildPaintImageXObject({ + resources, + image: args[0], + isInline: true, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + })); + return; + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + args[0] = self.handleText(args[0], stateManager.state); + break; + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const combinedGlyphs = [], + state = stateManager.state; + for (const arrItem of args[0]) { + if (typeof arrItem === "string") { + combinedGlyphs.push(...self.handleText(arrItem, state)); + } else if (typeof arrItem === "number") { + combinedGlyphs.push(arrItem); + } + } + args[0] = combinedGlyphs; + fn = OPS.showText; + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(OPS.nextLine); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(OPS.nextLine); + operatorList.addOp(OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.setTextRenderingMode: + stateManager.state.textRenderingMode = args[0]; + break; + case OPS.setFillColorSpace: + { + const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); + if (cachedColorSpace) { + stateManager.state.fillColorSpace = cachedColorSpace; + continue; + } + next(self.parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache + }).then(function (colorSpace) { + stateManager.state.fillColorSpace = colorSpace || ColorSpace.singletons.gray; + })); + return; + } + case OPS.setStrokeColorSpace: + { + const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); + if (cachedColorSpace) { + stateManager.state.strokeColorSpace = cachedColorSpace; + continue; + } + next(self.parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache + }).then(function (colorSpace) { + stateManager.state.strokeColorSpace = colorSpace || ColorSpace.singletons.gray; + })); + return; + } + case OPS.setFillColor: + cs = stateManager.state.fillColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColor: + cs = stateManager.state.strokeColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillGray: + stateManager.state.fillColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeGray: + stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillCMYKColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeCMYKColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillRGBColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setStrokeRGBColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setFillColorN: + cs = stateManager.state.patternFillColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + } + args = []; + fn = OPS.setFillTransparent; + break; + } + if (cs.name === "Pattern") { + next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColorN: + cs = stateManager.state.patternStrokeColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + } + args = []; + fn = OPS.setStrokeTransparent; + break; + } + if (cs.name === "Pattern") { + next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.shadingFill: + let shading; + try { + const shadingRes = resources.get("Shading"); + if (!shadingRes) { + throw new FormatError("No shading resource found"); + } + shading = shadingRes.get(args[0].name); + if (!shading) { + throw new FormatError("No shading object found"); + } + } catch (reason) { + if (reason instanceof AbortException) { + continue; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring Shading: "${reason}".`); + continue; + } + throw reason; + } + const patternId = self.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }); + if (!patternId) { + continue; + } + args = [patternId]; + fn = OPS.shadingFill; + break; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName) { + const localGStateObj = localGStateCache.getByName(name); + if (localGStateObj) { + if (localGStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [localGStateObj]); + } + args = null; + continue; + } + } + next(new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof Dict)) { + throw new FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof Dict)) { + throw new FormatError("GState should be a dictionary."); + } + self.setGState({ + resources, + gState, + operatorList, + cacheKey: name, + task, + stateManager, + localGStateCache, + localColorSpaceCache + }).then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.moveTo: + case OPS.lineTo: + case OPS.curveTo: + case OPS.curveTo2: + case OPS.curveTo3: + case OPS.closePath: + case OPS.rectangle: + self.buildPath(operatorList, fn, args, parsingText); + continue; + case OPS.markPoint: + case OPS.markPointProps: + case OPS.beginCompat: + case OPS.endCompat: + continue; + case OPS.beginMarkedContentProps: + if (!(args[0] instanceof Name)) { + warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`); + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); + continue; + } + if (args[0].name === "OC") { + next(self.parseMarkedContentProps(args[1], resources).then(data => { + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`); + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); + return; + } + throw reason; + })); + return; + } + args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null]; + break; + case OPS.beginMarkedContent: + case OPS.endMarkedContent: + default: + if (args !== null) { + for (i = 0, ii = args.length; i < ii; i++) { + if (args[i] instanceof Dict) { + break; + } + } + if (i < ii) { + warn("getOperatorList - ignoring operator: " + fn); + continue; + } + } + } + operatorList.addOp(fn, args); + } + if (stop) { + next(deferred); + return; + } + closePendingRestoreOPS(); + resolve(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + closePendingRestoreOPS(); + return; + } + throw reason; + }); + } + getTextContent({ + stream, + task, + resources, + stateManager = null, + includeMarkedContent = false, + sink, + seenStyles = new Set(), + viewBox, + lang = null, + markedContentData = null, + disableNormalization = false, + keepWhiteSpace = false + }) { + resources ||= Dict.empty; + stateManager ||= new StateManager(new TextState()); + if (includeMarkedContent) { + markedContentData ||= { + level: 0 + }; + } + const textContent = { + items: [], + styles: Object.create(null), + lang + }; + const textContentItem = { + initialized: false, + str: [], + totalWidth: 0, + totalHeight: 0, + width: 0, + height: 0, + vertical: false, + prevTransform: null, + textAdvanceScale: 0, + spaceInFlowMin: 0, + spaceInFlowMax: 0, + trackingSpaceMin: Infinity, + negativeSpaceMax: -Infinity, + notASpace: -Infinity, + transform: null, + fontName: null, + hasEOL: false + }; + const twoLastChars = [" ", " "]; + let twoLastCharsPos = 0; + function saveLastChar(char) { + const nextPos = (twoLastCharsPos + 1) % 2; + const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " "; + twoLastChars[twoLastCharsPos] = char; + twoLastCharsPos = nextPos; + return !keepWhiteSpace && ret; + } + function shouldAddWhitepsace() { + return !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " "; + } + function resetLastChars() { + twoLastChars[0] = twoLastChars[1] = " "; + twoLastCharsPos = 0; + } + const TRACKING_SPACE_FACTOR = 0.102; + const NOT_A_SPACE_FACTOR = 0.03; + const NEGATIVE_SPACE_FACTOR = -0.2; + const SPACE_IN_FLOW_MIN_FACTOR = 0.102; + const SPACE_IN_FLOW_MAX_FACTOR = 0.6; + const VERTICAL_SHIFT_RATIO = 0.25; + const self = this; + const xref = this.xref; + const showSpacedTextBuffer = []; + let xobjs = null; + const emptyXObjectCache = new LocalImageCache(); + const emptyGStateCache = new LocalGStateCache(); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + let textState; + function pushWhitespace({ + width = 0, + height = 0, + transform = textContentItem.prevTransform, + fontName = textContentItem.fontName + }) { + textContent.items.push({ + str: " ", + dir: "ltr", + width, + height, + transform, + fontName, + hasEOL: false + }); + } + function getCurrentTextTransform() { + const font = textState.font; + const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; + if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) { + const glyphHeight = font.bbox[3] - font.bbox[1]; + if (glyphHeight > 0) { + tsm[3] *= glyphHeight * textState.fontMatrix[3]; + } + } + return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); + } + function ensureTextContentItem() { + if (textContentItem.initialized) { + return textContentItem; + } + const { + font, + loadedName + } = textState; + if (!seenStyles.has(loadedName)) { + seenStyles.add(loadedName); + textContent.styles[loadedName] = { + fontFamily: font.fallbackName, + ascent: font.ascent, + descent: font.descent, + vertical: font.vertical + }; + if (self.options.fontExtraProperties && font.systemFontInfo) { + const style = textContent.styles[loadedName]; + style.fontSubstitution = font.systemFontInfo.css; + style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName; + } + } + textContentItem.fontName = loadedName; + const trm = textContentItem.transform = getCurrentTextTransform(); + if (!font.vertical) { + textContentItem.width = textContentItem.totalWidth = 0; + textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]); + textContentItem.vertical = false; + } else { + textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]); + textContentItem.height = textContentItem.totalHeight = 0; + textContentItem.vertical = true; + } + const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; + const { + fontSize + } = textState; + textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR; + textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR; + textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR; + textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR; + textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR; + textContentItem.hasEOL = false; + textContentItem.initialized = true; + return textContentItem; + } + function updateAdvanceScale() { + if (!textContentItem.initialized) { + return; + } + const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + const scaleFactor = scaleCtmX * scaleLineX; + if (scaleFactor === textContentItem.textAdvanceScale) { + return; + } + if (!textContentItem.vertical) { + textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; + textContentItem.width = 0; + } else { + textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; + textContentItem.height = 0; + } + textContentItem.textAdvanceScale = scaleFactor; + } + function runBidiTransform(textChunk) { + let text = textChunk.str.join(""); + if (!disableNormalization) { + text = normalizeUnicode(text); + } + const bidiResult = bidi(text, -1, textChunk.vertical); + return { + str: bidiResult.str, + dir: bidiResult.dir, + width: Math.abs(textChunk.totalWidth), + height: Math.abs(textChunk.totalHeight), + transform: textChunk.transform, + fontName: textChunk.fontName, + hasEOL: textChunk.hasEOL + }; + } + async function handleSetFont(fontName, fontRef) { + const translated = await self.loadFont(fontName, fontRef, resources); + if (translated.font.isType3Font) { + try { + await translated.loadType3Data(self, resources, task); + } catch {} + } + textState.loadedName = translated.loadedName; + textState.font = translated.font; + textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; + } + function applyInverseRotation(x, y, matrix) { + const scale = Math.hypot(matrix[0], matrix[1]); + return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale]; + } + function compareWithLastPosition(glyphWidth) { + const currentTransform = getCurrentTextTransform(); + let posX = currentTransform[4]; + let posY = currentTransform[5]; + if (textState.font?.vertical) { + if (posX < viewBox[0] || posX > viewBox[2] || posY + glyphWidth < viewBox[1] || posY > viewBox[3]) { + return false; + } + } else if (posX + glyphWidth < viewBox[0] || posX > viewBox[2] || posY < viewBox[1] || posY > viewBox[3]) { + return false; + } + if (!textState.font || !textContentItem.prevTransform) { + return true; + } + let lastPosX = textContentItem.prevTransform[4]; + let lastPosY = textContentItem.prevTransform[5]; + if (lastPosX === posX && lastPosY === posY) { + return true; + } + let rotate = -1; + if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) { + rotate = currentTransform[0] > 0 ? 0 : 180; + } else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) { + rotate = currentTransform[1] > 0 ? 90 : 270; + } + switch (rotate) { + case 0: + break; + case 90: + [posX, posY] = [posY, posX]; + [lastPosX, lastPosY] = [lastPosY, lastPosX]; + break; + case 180: + [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY]; + break; + case 270: + [posX, posY] = [-posY, -posX]; + [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; + break; + default: + [posX, posY] = applyInverseRotation(posX, posY, currentTransform); + [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform); + } + if (textState.font.vertical) { + const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; + const advanceX = posX - lastPosX; + const textOrientation = Math.sign(textContentItem.height); + if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceX) > 0.5 * textContentItem.width) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceX) > textContentItem.width) { + appendEOL(); + return true; + } + if (advanceY <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { + if (shouldAddWhitepsace()) { + resetLastChars(); + flushTextContentItem(); + pushWhitespace({ + height: Math.abs(advanceY) + }); + } else { + textContentItem.height += advanceY; + } + } else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) { + if (textContentItem.str.length === 0) { + resetLastChars(); + pushWhitespace({ + height: Math.abs(advanceY) + }); + } else { + textContentItem.height += advanceY; + } + } + if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; + } + const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; + const advanceY = posY - lastPosY; + const textOrientation = Math.sign(textContentItem.width); + if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceY) > 0.5 * textContentItem.height) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceY) > textContentItem.height) { + appendEOL(); + return true; + } + if (advanceX <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { + if (shouldAddWhitepsace()) { + resetLastChars(); + flushTextContentItem(); + pushWhitespace({ + width: Math.abs(advanceX) + }); + } else { + textContentItem.width += advanceX; + } + } else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) { + if (textContentItem.str.length === 0) { + resetLastChars(); + pushWhitespace({ + width: Math.abs(advanceX) + }); + } else { + textContentItem.width += advanceX; + } + } + if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; + } + function buildTextContentItem({ + chars, + extraSpacing + }) { + const font = textState.font; + if (!chars) { + const charSpacing = textState.charSpacing + extraSpacing; + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + if (keepWhiteSpace) { + compareWithLastPosition(0); + } + return; + } + const glyphs = font.charsToGlyphs(chars); + const scale = textState.fontMatrix[0] * textState.fontSize; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const glyph = glyphs[i]; + const { + category + } = glyph; + if (category.isInvisibleFormatMark) { + continue; + } + let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); + let glyphWidth = glyph.width; + if (font.vertical) { + glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; + } + let scaledDim = glyphWidth * scale; + if (!keepWhiteSpace && category.isWhitespace) { + if (!font.vertical) { + charSpacing += scaledDim + textState.wordSpacing; + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + charSpacing += -scaledDim + textState.wordSpacing; + textState.translateTextMatrix(0, -charSpacing); + } + saveLastChar(" "); + continue; + } + if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) { + if (!font.vertical) { + textState.translateTextMatrix(scaledDim * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, scaledDim); + } + continue; + } + const textChunk = ensureTextContentItem(); + if (category.isZeroWidthDiacritic) { + scaledDim = 0; + } + if (!font.vertical) { + scaledDim *= textState.textHScale; + textState.translateTextMatrix(scaledDim, 0); + textChunk.width += scaledDim; + } else { + textState.translateTextMatrix(0, scaledDim); + scaledDim = Math.abs(scaledDim); + textChunk.height += scaledDim; + } + if (scaledDim) { + textChunk.prevTransform = getCurrentTextTransform(); + } + const glyphUnicode = glyph.unicode; + if (saveLastChar(glyphUnicode)) { + textChunk.str.push(" "); + } + textChunk.str.push(glyphUnicode); + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + } + } + function appendEOL() { + resetLastChars(); + if (textContentItem.initialized) { + textContentItem.hasEOL = true; + flushTextContentItem(); + } else { + textContent.items.push({ + str: "", + dir: "ltr", + width: 0, + height: 0, + transform: getCurrentTextTransform(), + fontName: textState.loadedName, + hasEOL: true + }); + } + } + function addFakeSpaces(width, transf, textOrientation) { + if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) { + if (textContentItem.initialized) { + resetLastChars(); + textContentItem.str.push(" "); + } + return false; + } + const fontName = textContentItem.fontName; + let height = 0; + if (textContentItem.vertical) { + height = width; + width = 0; + } + flushTextContentItem(); + resetLastChars(); + pushWhitespace({ + width: Math.abs(width), + height: Math.abs(height), + transform: transf || getCurrentTextTransform(), + fontName + }); + return true; + } + function flushTextContentItem() { + if (!textContentItem.initialized || !textContentItem.str) { + return; + } + if (!textContentItem.vertical) { + textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; + } else { + textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; + } + textContent.items.push(runBidiTransform(textContentItem)); + textContentItem.initialized = false; + textContentItem.str.length = 0; + } + function enqueueChunk(batch = false) { + const length = textContent.items.length; + if (length === 0) { + return; + } + if (batch && length < TEXT_CHUNK_BATCH_SIZE) { + return; + } + sink.enqueue(textContent, length); + textContent.items = []; + textContent.styles = Object.create(null); + } + const timeSlotManager = new TimeSlotManager(); + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + enqueueChunk(true); + Promise.all([promise, sink.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, + name, + isValidName, + args = []; + while (!(stop = timeSlotManager.check())) { + args.length = 0; + operation.args = args; + if (!preprocessor.read(operation)) { + break; + } + const previousState = textState; + textState = stateManager.state; + const fn = operation.fn; + args = operation.args; + switch (fn | 0) { + case OPS.setFont: + const fontNameArg = args[0].name, + fontSizeArg = args[1]; + if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { + break; + } + flushTextContentItem(); + textState.fontName = fontNameArg; + textState.fontSize = fontSizeArg; + next(handleSetFont(fontNameArg, null)); + return; + case OPS.setTextRise: + textState.textRise = args[0]; + break; + case OPS.setHScale: + textState.textHScale = args[0] / 100; + break; + case OPS.setLeading: + textState.leading = args[0]; + break; + case OPS.moveText: + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.setLeadingMoveText: + textState.leading = -args[1]; + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.nextLine: + textState.carriageReturn(); + break; + case OPS.setTextMatrix: + textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + updateAdvanceScale(); + break; + case OPS.setCharSpacing: + textState.charSpacing = args[0]; + break; + case OPS.setWordSpacing: + textState.wordSpacing = args[0]; + break; + case OPS.beginText: + textState.textMatrix = IDENTITY_MATRIX.slice(); + textState.textLineMatrix = IDENTITY_MATRIX.slice(); + break; + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000; + const elements = args[0]; + for (let i = 0, ii = elements.length; i < ii; i++) { + const item = elements[i]; + if (typeof item === "string") { + showSpacedTextBuffer.push(item); + } else if (typeof item === "number" && item !== 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: item * spaceFactor + }); + } + } + if (showSpacedTextBuffer.length > 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: 0 + }); + } + break; + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.carriageReturn(); + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.wordSpacing = args[0]; + textState.charSpacing = args[1]; + textState.carriageReturn(); + buildTextContentItem({ + chars: args[2], + extraSpacing: 0 + }); + break; + case OPS.paintXObject: + flushTextContentItem(); + xobjs ??= resources.get("XObject") || Dict.empty; + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyXObjectCache.getByName(name)) { + break; + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + if (emptyXObjectCache.getByRef(xobj)) { + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); + if (globalImage) { + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { + throw new FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("XObject should have a Name subtype"); + } + if (type.name !== "Form") { + emptyXObjectCache.set(name, xobj.dict.objId, true); + resolveXObject(); + return; + } + const currentState = stateManager.state.clone(); + const xObjStateManager = new StateManager(currentState); + const matrix = lookupMatrix(xobj.dict.getArray("Matrix"), null); + if (matrix) { + xObjStateManager.transform(matrix); + } + enqueueChunk(); + const sinkWrapper = { + enqueueInvoked: false, + enqueue(chunk, size) { + this.enqueueInvoked = true; + sink.enqueue(chunk, size); + }, + get desiredSize() { + return sink.desiredSize; + }, + get ready() { + return sink.ready; + } + }; + self.getTextContent({ + stream: xobj, + task, + resources: xobj.dict.get("Resources") || resources, + stateManager: xObjStateManager, + includeMarkedContent, + sink: sinkWrapper, + seenStyles, + viewBox, + lang, + markedContentData, + disableNormalization, + keepWhiteSpace + }).then(function () { + if (!sinkWrapper.enqueueInvoked) { + emptyXObjectCache.set(name, xobj.dict.objId, true); + } + resolveXObject(); + }, rejectXObject); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyGStateCache.getByName(name)) { + break; + } + next(new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof Dict)) { + throw new FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof Dict)) { + throw new FormatError("GState should be a dictionary."); + } + const gStateFont = gState.get("Font"); + if (!gStateFont) { + emptyGStateCache.set(name, gState.objId, true); + resolveGState(); + return; + } + flushTextContentItem(); + textState.fontName = null; + textState.fontSize = gStateFont[1]; + handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.beginMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentData.level++; + textContent.items.push({ + type: "beginMarkedContent", + tag: args[0] instanceof Name ? args[0].name : null + }); + } + break; + case OPS.beginMarkedContentProps: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentData.level++; + let mcid = null; + if (args[1] instanceof Dict) { + mcid = args[1].get("MCID"); + } + textContent.items.push({ + type: "beginMarkedContentProps", + id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, + tag: args[0] instanceof Name ? args[0].name : null + }); + } + break; + case OPS.endMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + if (markedContentData.level === 0) { + break; + } + markedContentData.level--; + textContent.items.push({ + type: "endMarkedContent" + }); + } + break; + case OPS.restore: + if (previousState && (previousState.font !== textState.font || previousState.fontSize !== textState.fontSize || previousState.fontName !== textState.fontName)) { + flushTextContentItem(); + } + break; + } + if (textContent.items.length >= sink.desiredSize) { + stop = true; + break; + } + } + if (stop) { + next(deferred); + return; + } + flushTextContentItem(); + enqueueChunk(); + resolve(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + flushTextContentItem(); + enqueueChunk(); + return; + } + throw reason; + }); + } + async extractDataStructures(dict, properties) { + const xref = this.xref; + let cidToGidBytes; + const toUnicodePromise = this.readToUnicode(properties.toUnicode); + if (properties.composite) { + const cidSystemInfo = dict.get("CIDSystemInfo"); + if (cidSystemInfo instanceof Dict) { + properties.cidSystemInfo = { + registry: stringToPDFString(cidSystemInfo.get("Registry")), + ordering: stringToPDFString(cidSystemInfo.get("Ordering")), + supplement: cidSystemInfo.get("Supplement") + }; + } + try { + const cidToGidMap = dict.get("CIDToGIDMap"); + if (cidToGidMap instanceof BaseStream) { + cidToGidBytes = cidToGidMap.getBytes(); + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`); + } + } + const differences = []; + let baseEncodingName = null; + let encoding; + if (dict.has("Encoding")) { + encoding = dict.get("Encoding"); + if (encoding instanceof Dict) { + baseEncodingName = encoding.get("BaseEncoding"); + baseEncodingName = baseEncodingName instanceof Name ? baseEncodingName.name : null; + if (encoding.has("Differences")) { + const diffEncoding = encoding.get("Differences"); + let index = 0; + for (const entry of diffEncoding) { + const data = xref.fetchIfRef(entry); + if (typeof data === "number") { + index = data; + } else if (data instanceof Name) { + differences[index++] = data.name; + } else { + throw new FormatError(`Invalid entry in 'Differences' array: ${data}`); + } + } + } + } else if (encoding instanceof Name) { + baseEncodingName = encoding.name; + } else { + const msg = "Encoding is not a Name nor a Dict"; + if (!this.options.ignoreErrors) { + throw new FormatError(msg); + } + warn(msg); + } + if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") { + baseEncodingName = null; + } + } + const nonEmbeddedFont = !properties.file || properties.isInternalFont, + isSymbolsFontName = getSymbolsFonts()[properties.name]; + if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { + baseEncodingName = null; + } + if (baseEncodingName) { + properties.defaultEncoding = getEncoding(baseEncodingName); + } else { + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + encoding = StandardEncoding; + if (properties.type === "TrueType" && !isNonsymbolicFont) { + encoding = WinAnsiEncoding; + } + if (isSymbolicFont || isSymbolsFontName) { + encoding = MacRomanEncoding; + if (nonEmbeddedFont) { + if (/Symbol/i.test(properties.name)) { + encoding = SymbolSetEncoding; + } else if (/Dingbats/i.test(properties.name)) { + encoding = ZapfDingbatsEncoding; + } else if (/Wingdings/i.test(properties.name)) { + encoding = WinAnsiEncoding; + } + } + } + properties.defaultEncoding = encoding; + } + properties.differences = differences; + properties.baseEncodingName = baseEncodingName; + properties.hasEncoding = !!baseEncodingName || differences.length > 0; + properties.dict = dict; + properties.toUnicode = await toUnicodePromise; + const builtToUnicode = await this.buildToUnicode(properties); + properties.toUnicode = builtToUnicode; + if (cidToGidBytes) { + properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode); + } + return properties; + } + _simpleFontToUnicode(properties, forceGlyphs = false) { + assert(!properties.composite, "Must be a simple font."); + const toUnicode = []; + const encoding = properties.defaultEncoding.slice(); + const baseEncodingName = properties.baseEncodingName; + const differences = properties.differences; + for (const charcode in differences) { + const glyphName = differences[charcode]; + if (glyphName === ".notdef") { + continue; + } + encoding[charcode] = glyphName; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + for (const charcode in encoding) { + let glyphName = encoding[charcode]; + if (glyphName === "") { + continue; + } + let unicode = glyphsUnicodeMap[glyphName]; + if (unicode !== undefined) { + toUnicode[charcode] = String.fromCharCode(unicode); + continue; + } + let code = 0; + switch (glyphName[0]) { + case "G": + if (glyphName.length === 3) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "g": + if (glyphName.length === 5) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "C": + case "c": + if (glyphName.length >= 3 && glyphName.length <= 4) { + const codeStr = glyphName.substring(1); + if (forceGlyphs) { + code = parseInt(codeStr, 16); + break; + } + code = +codeStr; + if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { + return this._simpleFontToUnicode(properties, true); + } + } + break; + case "u": + unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + code = unicode; + } + break; + default: + switch (glyphName) { + case "f_h": + case "f_t": + case "T_h": + toUnicode[charcode] = glyphName.replaceAll("_", ""); + continue; + } + break; + } + if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { + if (baseEncodingName && code === +charcode) { + const baseEncoding = getEncoding(baseEncodingName); + if (baseEncoding && (glyphName = baseEncoding[charcode])) { + toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); + continue; + } + } + toUnicode[charcode] = String.fromCodePoint(code); + } + } + return toUnicode; + } + async buildToUnicode(properties) { + properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0; + if (properties.hasIncludedToUnicodeMap) { + if (!properties.composite && properties.hasEncoding) { + properties.fallbackToUnicode = this._simpleFontToUnicode(properties); + } + return properties.toUnicode; + } + if (!properties.composite) { + return new ToUnicodeMap(this._simpleFontToUnicode(properties)); + } + if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap) || properties.cidSystemInfo?.registry === "Adobe" && (properties.cidSystemInfo.ordering === "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" || properties.cidSystemInfo.ordering === "Korea1"))) { + const { + registry, + ordering + } = properties.cidSystemInfo; + const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`); + const ucs2CMap = await CMapFactory.create({ + encoding: ucs2CMapName, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + const toUnicode = [], + buf = []; + properties.cMap.forEach(function (charcode, cid) { + if (cid > 0xffff) { + throw new FormatError("Max size of CID is 65,535"); + } + const ucs2 = ucs2CMap.lookup(cid); + if (ucs2) { + buf.length = 0; + for (let i = 0, ii = ucs2.length; i < ii; i += 2) { + buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1)); + } + toUnicode[charcode] = String.fromCharCode(...buf); + } + }); + return new ToUnicodeMap(toUnicode); + } + return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar); + } + async readToUnicode(cmapObj) { + if (!cmapObj) { + return null; + } + if (cmapObj instanceof Name) { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + return new ToUnicodeMap(cmap.getMap()); + } + if (cmapObj instanceof BaseStream) { + try { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + const map = new Array(cmap.length); + cmap.forEach(function (charCode, token) { + if (typeof token === "number") { + map[charCode] = String.fromCodePoint(token); + return; + } + if (token.length % 2 !== 0) { + token = "\u0000" + token; + } + const str = []; + for (let k = 0; k < token.length; k += 2) { + const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + if ((w1 & 0xf800) !== 0xd800) { + str.push(w1); + continue; + } + k += 2; + const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + } + map[charCode] = String.fromCodePoint(...str); + }); + return new ToUnicodeMap(map); + } catch (reason) { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; + } + } + return null; + } + readCidToGidMap(glyphsData, toUnicode) { + const result = []; + for (let j = 0, jj = glyphsData.length; j < jj; j++) { + const glyphID = glyphsData[j++] << 8 | glyphsData[j]; + const code = j >> 1; + if (glyphID === 0 && !toUnicode.has(code)) { + continue; + } + result[code] = glyphID; + } + return result; + } + extractWidths(dict, descriptor, properties) { + const xref = this.xref; + let glyphsWidths = []; + let defaultWidth = 0; + const glyphsVMetrics = []; + let defaultVMetrics; + if (properties.composite) { + const dw = dict.get("DW"); + defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; + const widths = dict.get("W"); + if (Array.isArray(widths)) { + for (let i = 0, ii = widths.length; i < ii; i++) { + let start = xref.fetchIfRef(widths[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(widths[i]); + if (Array.isArray(code)) { + for (const c of code) { + const width = xref.fetchIfRef(c); + if (typeof width === "number") { + glyphsWidths[start] = width; + } + start++; + } + } else if (Number.isInteger(code)) { + const width = xref.fetchIfRef(widths[++i]); + if (typeof width !== "number") { + continue; + } + for (let j = start; j <= code; j++) { + glyphsWidths[j] = width; + } + } else { + break; + } + } + } + if (properties.vertical) { + const dw2 = dict.getArray("DW2"); + let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000]; + defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; + vmetrics = dict.get("W2"); + if (Array.isArray(vmetrics)) { + for (let i = 0, ii = vmetrics.length; i < ii; i++) { + let start = xref.fetchIfRef(vmetrics[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(vmetrics[i]); + if (Array.isArray(code)) { + for (let j = 0, jj = code.length; j < jj; j++) { + const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; + if (isNumberArray(vmetric, null)) { + glyphsVMetrics[start] = vmetric; + } + start++; + } + } else if (Number.isInteger(code)) { + const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])]; + if (!isNumberArray(vmetric, null)) { + continue; + } + for (let j = start; j <= code; j++) { + glyphsVMetrics[j] = vmetric; + } + } else { + break; + } + } + } + } + } else { + const widths = dict.get("Widths"); + if (Array.isArray(widths)) { + let j = properties.firstChar; + for (const w of widths) { + const width = xref.fetchIfRef(w); + if (typeof width === "number") { + glyphsWidths[j] = width; + } + j++; + } + const missingWidth = descriptor.get("MissingWidth"); + defaultWidth = typeof missingWidth === "number" ? missingWidth : 0; + } else { + const baseFontName = dict.get("BaseFont"); + if (baseFontName instanceof Name) { + const metrics = this.getBaseFontMetrics(baseFontName.name); + glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); + defaultWidth = metrics.defaultWidth; + } + } + } + let isMonospace = true; + let firstWidth = defaultWidth; + for (const glyph in glyphsWidths) { + const glyphWidth = glyphsWidths[glyph]; + if (!glyphWidth) { + continue; + } + if (!firstWidth) { + firstWidth = glyphWidth; + continue; + } + if (firstWidth !== glyphWidth) { + isMonospace = false; + break; + } + } + if (isMonospace) { + properties.flags |= FontFlags.FixedPitch; + } else { + properties.flags &= ~FontFlags.FixedPitch; + } + properties.defaultWidth = defaultWidth; + properties.widths = glyphsWidths; + properties.defaultVMetrics = defaultVMetrics; + properties.vmetrics = glyphsVMetrics; + } + isSerifFont(baseFontName) { + const fontNameWoStyle = baseFontName.split("-", 1)[0]; + return fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle); + } + getBaseFontMetrics(name) { + let defaultWidth = 0; + let widths = Object.create(null); + let monospace = false; + const stdFontMap = getStdFontMap(); + let lookupName = stdFontMap[name] || name; + const Metrics = getMetrics(); + if (!(lookupName in Metrics)) { + lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica"; + } + const glyphWidths = Metrics[lookupName]; + if (typeof glyphWidths === "number") { + defaultWidth = glyphWidths; + monospace = true; + } else { + widths = glyphWidths(); + } + return { + defaultWidth, + monospace, + widths + }; + } + buildCharCodeToWidth(widthsByGlyphName, properties) { + const widths = Object.create(null); + const differences = properties.differences; + const encoding = properties.defaultEncoding; + for (let charCode = 0; charCode < 256; charCode++) { + if (charCode in differences && widthsByGlyphName[differences[charCode]]) { + widths[charCode] = widthsByGlyphName[differences[charCode]]; + continue; + } + if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { + widths[charCode] = widthsByGlyphName[encoding[charCode]]; + continue; + } + } + return widths; + } + preEvaluateFont(dict) { + const baseDict = dict; + let type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("invalid font Subtype"); + } + let composite = false; + let hash; + if (type.name === "Type0") { + const df = dict.get("DescendantFonts"); + if (!df) { + throw new FormatError("Descendant fonts are not specified"); + } + dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df; + if (!(dict instanceof Dict)) { + throw new FormatError("Descendant font is not a dictionary."); + } + type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("invalid font Subtype"); + } + composite = true; + } + let firstChar = dict.get("FirstChar"); + if (!Number.isInteger(firstChar)) { + firstChar = 0; + } + let lastChar = dict.get("LastChar"); + if (!Number.isInteger(lastChar)) { + lastChar = composite ? 0xffff : 0xff; + } + const descriptor = dict.get("FontDescriptor"); + const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); + if (descriptor) { + hash = new MurmurHash3_64(); + const encoding = baseDict.getRaw("Encoding"); + if (encoding instanceof Name) { + hash.update(encoding.name); + } else if (encoding instanceof Ref) { + hash.update(encoding.toString()); + } else if (encoding instanceof Dict) { + for (const entry of encoding.getRawValues()) { + if (entry instanceof Name) { + hash.update(entry.name); + } else if (entry instanceof Ref) { + hash.update(entry.toString()); + } else if (Array.isArray(entry)) { + const diffLength = entry.length, + diffBuf = new Array(diffLength); + for (let j = 0; j < diffLength; j++) { + const diffEntry = entry[j]; + if (diffEntry instanceof Name) { + diffBuf[j] = diffEntry.name; + } else if (typeof diffEntry === "number" || diffEntry instanceof Ref) { + diffBuf[j] = diffEntry.toString(); + } + } + hash.update(diffBuf.join()); + } + } + } + hash.update(`${firstChar}-${lastChar}`); + if (toUnicode instanceof BaseStream) { + const stream = toUnicode.str || toUnicode; + const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); + hash.update(uint8array); + } else if (toUnicode instanceof Name) { + hash.update(toUnicode.name); + } + const widths = dict.get("Widths") || baseDict.get("Widths"); + if (Array.isArray(widths)) { + const widthsBuf = []; + for (const entry of widths) { + if (typeof entry === "number" || entry instanceof Ref) { + widthsBuf.push(entry.toString()); + } + } + hash.update(widthsBuf.join()); + } + if (composite) { + hash.update("compositeFont"); + const compositeWidths = dict.get("W") || baseDict.get("W"); + if (Array.isArray(compositeWidths)) { + const widthsBuf = []; + for (const entry of compositeWidths) { + if (typeof entry === "number" || entry instanceof Ref) { + widthsBuf.push(entry.toString()); + } else if (Array.isArray(entry)) { + const subWidthsBuf = []; + for (const element of entry) { + if (typeof element === "number" || element instanceof Ref) { + subWidthsBuf.push(element.toString()); + } + } + widthsBuf.push(`[${subWidthsBuf.join()}]`); + } + } + hash.update(widthsBuf.join()); + } + const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap"); + if (cidToGidMap instanceof Name) { + hash.update(cidToGidMap.name); + } else if (cidToGidMap instanceof Ref) { + hash.update(cidToGidMap.toString()); + } else if (cidToGidMap instanceof BaseStream) { + hash.update(cidToGidMap.peekBytes()); + } + } + } + return { + descriptor, + dict, + baseDict, + composite, + type: type.name, + firstChar, + lastChar, + toUnicode, + hash: hash ? hash.hexdigest() : "" + }; + } + async translateFont({ + descriptor, + dict, + baseDict, + composite, + type, + firstChar, + lastChar, + toUnicode, + cssFontInfo + }) { + const isType3Font = type === "Type3"; + if (!descriptor) { + if (isType3Font) { + const bbox = lookupNormalRect(dict.getArray("FontBBox"), [0, 0, 0, 0]); + descriptor = new Dict(null); + descriptor.set("FontName", Name.get(type)); + descriptor.set("FontBBox", bbox); + } else { + let baseFontName = dict.get("BaseFont"); + if (!(baseFontName instanceof Name)) { + throw new FormatError("Base font is not specified"); + } + baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); + const metrics = this.getBaseFontMetrics(baseFontName); + const fontNameWoStyle = baseFontName.split("-", 1)[0]; + const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); + const properties = { + type, + name: baseFontName, + loadedName: baseDict.loadedName, + systemFontInfo: null, + widths: metrics.widths, + defaultWidth: metrics.defaultWidth, + isSimulatedFlags: true, + flags, + firstChar, + lastChar, + toUnicode, + xHeight: 0, + capHeight: 0, + italicAngle: 0, + isType3Font + }; + const widths = dict.get("Widths"); + const standardFontName = getStandardFontName(baseFontName); + let file = null; + if (standardFontName) { + file = await this.fetchStandardFontData(standardFontName); + properties.isInternalFont = !!file; + } + if (!properties.isInternalFont && this.options.useSystemFonts) { + properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type); + } + const newProperties = await this.extractDataStructures(dict, properties); + if (Array.isArray(widths)) { + const glyphWidths = []; + let j = firstChar; + for (const w of widths) { + const width = this.xref.fetchIfRef(w); + if (typeof width === "number") { + glyphWidths[j] = width; + } + j++; + } + newProperties.widths = glyphWidths; + } else { + newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); + } + return new Font(baseFontName, file, newProperties); + } + } + let fontName = descriptor.get("FontName"); + let baseFont = dict.get("BaseFont"); + if (typeof fontName === "string") { + fontName = Name.get(fontName); + } + if (typeof baseFont === "string") { + baseFont = Name.get(baseFont); + } + const fontNameStr = fontName?.name; + const baseFontStr = baseFont?.name; + if (!isType3Font && fontNameStr !== baseFontStr) { + info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); + if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) { + fontName = null; + } + } + fontName ||= baseFont; + if (!(fontName instanceof Name)) { + throw new FormatError("invalid font name"); + } + let fontFile, subtype, length1, length2, length3; + try { + fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); + if (fontFile) { + if (!(fontFile instanceof BaseStream)) { + throw new FormatError("FontFile should be a stream"); + } else if (fontFile.isEmpty) { + throw new FormatError("FontFile is empty"); + } + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); + fontFile = null; + } + let isInternalFont = false; + let glyphScaleFactors = null; + let systemFontInfo = null; + if (fontFile) { + if (fontFile.dict) { + const subtypeEntry = fontFile.dict.get("Subtype"); + if (subtypeEntry instanceof Name) { + subtype = subtypeEntry.name; + } + length1 = fontFile.dict.get("Length1"); + length2 = fontFile.dict.get("Length2"); + length3 = fontFile.dict.get("Length3"); + } + } else if (cssFontInfo) { + const standardFontName = getXfaFontName(fontName.name); + if (standardFontName) { + cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`; + cssFontInfo.metrics = standardFontName.metrics || null; + glyphScaleFactors = standardFontName.factors || null; + fontFile = await this.fetchStandardFontData(standardFontName.name); + isInternalFont = !!fontFile; + baseDict = dict = getXfaFontDict(fontName.name); + composite = true; + } + } else if (!isType3Font) { + const standardFontName = getStandardFontName(fontName.name); + if (standardFontName) { + fontFile = await this.fetchStandardFontData(standardFontName); + isInternalFont = !!fontFile; + } + if (!isInternalFont && this.options.useSystemFonts) { + systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); + } + } + const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX); + const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), undefined); + let ascent = descriptor.get("Ascent"); + if (typeof ascent !== "number") { + ascent = undefined; + } + let descent = descriptor.get("Descent"); + if (typeof descent !== "number") { + descent = undefined; + } + let xHeight = descriptor.get("XHeight"); + if (typeof xHeight !== "number") { + xHeight = 0; + } + let capHeight = descriptor.get("CapHeight"); + if (typeof capHeight !== "number") { + capHeight = 0; + } + let flags = descriptor.get("Flags"); + if (!Number.isInteger(flags)) { + flags = 0; + } + let italicAngle = descriptor.get("ItalicAngle"); + if (typeof italicAngle !== "number") { + italicAngle = 0; + } + const properties = { + type, + name: fontName.name, + subtype, + file: fontFile, + length1, + length2, + length3, + isInternalFont, + loadedName: baseDict.loadedName, + composite, + fixedPitch: false, + fontMatrix, + firstChar, + lastChar, + toUnicode, + bbox, + ascent, + descent, + xHeight, + capHeight, + flags, + italicAngle, + isType3Font, + cssFontInfo, + scaleFactors: glyphScaleFactors, + systemFontInfo + }; + if (composite) { + const cidEncoding = baseDict.get("Encoding"); + if (cidEncoding instanceof Name) { + properties.cidEncoding = cidEncoding.name; + } + const cMap = await CMapFactory.create({ + encoding: cidEncoding, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + } + const newProperties = await this.extractDataStructures(dict, properties); + this.extractWidths(dict, descriptor, newProperties); + return new Font(fontName.name, fontFile, newProperties); + } + static buildFontPaths(font, glyphs, handler, evaluatorOptions) { + function buildPath(fontChar) { + const glyphName = `${font.loadedName}_path_${fontChar}`; + try { + if (font.renderer.hasBuiltPath(fontChar)) { + return; + } + handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); + } catch (reason) { + if (evaluatorOptions.ignoreErrors) { + warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); + return; + } + throw reason; + } + } + for (const glyph of glyphs) { + buildPath(glyph.fontChar); + const accent = glyph.accent; + if (accent?.fontChar) { + buildPath(accent.fontChar); + } + } + } + static get fallbackFontDict() { + const dict = new Dict(); + dict.set("BaseFont", Name.get("Helvetica")); + dict.set("Type", Name.get("FallbackType")); + dict.set("Subtype", Name.get("FallbackType")); + dict.set("Encoding", Name.get("WinAnsiEncoding")); + return shadow(this, "fallbackFontDict", dict); + } +} +class TranslatedFont { + constructor({ + loadedName, + font, + dict, + evaluatorOptions + }) { + this.loadedName = loadedName; + this.font = font; + this.dict = dict; + this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions; + this.type3Loaded = null; + this.type3Dependencies = font.isType3Font ? new Set() : null; + this.sent = false; + } + send(handler) { + if (this.sent) { + return; + } + this.sent = true; + handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._evaluatorOptions.fontExtraProperties)]); + } + fallback(handler) { + if (!this.font.data) { + return; + } + this.font.disableFontFace = true; + PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions); + } + loadType3Data(evaluator, resources, task) { + if (this.type3Loaded) { + return this.type3Loaded; + } + if (!this.font.isType3Font) { + throw new Error("Must be a Type3 font."); + } + const type3Evaluator = evaluator.clone({ + ignoreErrors: false + }); + const type3FontRefs = new RefSet(evaluator.type3FontRefs); + if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { + type3FontRefs.put(this.dict.objId); + } + type3Evaluator.type3FontRefs = type3FontRefs; + const translatedFont = this.font, + type3Dependencies = this.type3Dependencies; + let loadCharProcsPromise = Promise.resolve(); + const charProcs = this.dict.get("CharProcs"); + const fontResources = this.dict.get("Resources") || resources; + const charProcOperatorList = Object.create(null); + const fontBBox = Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]), + width = fontBBox[2] - fontBBox[0], + height = fontBBox[3] - fontBBox[1]; + const fontBBoxSize = Math.hypot(width, height); + for (const key of charProcs.getKeys()) { + loadCharProcsPromise = loadCharProcsPromise.then(() => { + const glyphStream = charProcs.get(key); + const operatorList = new OperatorList(); + return type3Evaluator.getOperatorList({ + stream: glyphStream, + task, + resources: fontResources, + operatorList + }).then(() => { + if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) { + this._removeType3ColorOperators(operatorList, fontBBoxSize); + } + charProcOperatorList[key] = operatorList.getIR(); + for (const dependency of operatorList.dependencies) { + type3Dependencies.add(dependency); + } + }).catch(function (reason) { + warn(`Type3 font resource "${key}" is not available.`); + const dummyOperatorList = new OperatorList(); + charProcOperatorList[key] = dummyOperatorList.getIR(); + }); + }); + } + this.type3Loaded = loadCharProcsPromise.then(() => { + translatedFont.charProcOperatorList = charProcOperatorList; + if (this._bbox) { + translatedFont.isCharBBox = true; + translatedFont.bbox = this._bbox; + } + }); + return this.type3Loaded; + } + _removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { + const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), + width = charBBox[2] - charBBox[0], + height = charBBox[3] - charBBox[1]; + const charBBoxSize = Math.hypot(width, height); + if (width === 0 || height === 0) { + operatorList.fnArray.splice(0, 1); + operatorList.argsArray.splice(0, 1); + } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) { + if (!this._bbox) { + this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; + } + this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); + this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); + this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); + this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); + } + let i = 0, + ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case OPS.setCharWidthAndBounds: + break; + case OPS.setStrokeColorSpace: + case OPS.setFillColorSpace: + case OPS.setStrokeColor: + case OPS.setStrokeColorN: + case OPS.setFillColor: + case OPS.setFillColorN: + case OPS.setStrokeGray: + case OPS.setFillGray: + case OPS.setStrokeRGBColor: + case OPS.setFillRGBColor: + case OPS.setStrokeCMYKColor: + case OPS.setFillCMYKColor: + case OPS.shadingFill: + case OPS.setRenderingIntent: + operatorList.fnArray.splice(i, 1); + operatorList.argsArray.splice(i, 1); + ii--; + continue; + case OPS.setGState: + const [gStateObj] = operatorList.argsArray[i]; + let j = 0, + jj = gStateObj.length; + while (j < jj) { + const [gStateKey] = gStateObj[j]; + switch (gStateKey) { + case "TR": + case "TR2": + case "HT": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + gStateObj.splice(j, 1); + jj--; + continue; + } + j++; + } + break; + } + i++; + } + } +} +class StateManager { + constructor(initialState = new EvalState()) { + this.state = initialState; + this.stateStack = []; + } + save() { + const old = this.state; + this.stateStack.push(this.state); + this.state = old.clone(); + } + restore() { + const prev = this.stateStack.pop(); + if (prev) { + this.state = prev; + } + } + transform(args) { + this.state.ctm = Util.transform(this.state.ctm, args); + } +} +class TextState { + constructor() { + this.ctm = new Float32Array(IDENTITY_MATRIX); + this.fontName = null; + this.fontSize = 0; + this.loadedName = null; + this.font = null; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.textMatrix = IDENTITY_MATRIX.slice(); + this.textLineMatrix = IDENTITY_MATRIX.slice(); + this.charSpacing = 0; + this.wordSpacing = 0; + this.leading = 0; + this.textHScale = 1; + this.textRise = 0; + } + setTextMatrix(a, b, c, d, e, f) { + const m = this.textMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + } + setTextLineMatrix(a, b, c, d, e, f) { + const m = this.textLineMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + } + translateTextMatrix(x, y) { + const m = this.textMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + } + translateTextLineMatrix(x, y) { + const m = this.textLineMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + } + carriageReturn() { + this.translateTextLineMatrix(0, -this.leading); + this.textMatrix = this.textLineMatrix.slice(); + } + clone() { + const clone = Object.create(this); + clone.textMatrix = this.textMatrix.slice(); + clone.textLineMatrix = this.textLineMatrix.slice(); + clone.fontMatrix = this.fontMatrix.slice(); + return clone; + } +} +class EvalState { + constructor() { + this.ctm = new Float32Array(IDENTITY_MATRIX); + this.font = null; + this.textRenderingMode = TextRenderingMode.FILL; + this._fillColorSpace = ColorSpace.singletons.gray; + this._strokeColorSpace = ColorSpace.singletons.gray; + this.patternFillColorSpace = null; + this.patternStrokeColorSpace = null; + } + get fillColorSpace() { + return this._fillColorSpace; + } + set fillColorSpace(colorSpace) { + this._fillColorSpace = this.patternFillColorSpace = colorSpace; + } + get strokeColorSpace() { + return this._strokeColorSpace; + } + set strokeColorSpace(colorSpace) { + this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; + } + clone() { + return Object.create(this); + } +} +class EvaluatorPreprocessor { + static get opMap() { + return shadow(this, "opMap", Object.assign(Object.create(null), { + w: { + id: OPS.setLineWidth, + numArgs: 1, + variableArgs: false + }, + J: { + id: OPS.setLineCap, + numArgs: 1, + variableArgs: false + }, + j: { + id: OPS.setLineJoin, + numArgs: 1, + variableArgs: false + }, + M: { + id: OPS.setMiterLimit, + numArgs: 1, + variableArgs: false + }, + d: { + id: OPS.setDash, + numArgs: 2, + variableArgs: false + }, + ri: { + id: OPS.setRenderingIntent, + numArgs: 1, + variableArgs: false + }, + i: { + id: OPS.setFlatness, + numArgs: 1, + variableArgs: false + }, + gs: { + id: OPS.setGState, + numArgs: 1, + variableArgs: false + }, + q: { + id: OPS.save, + numArgs: 0, + variableArgs: false + }, + Q: { + id: OPS.restore, + numArgs: 0, + variableArgs: false + }, + cm: { + id: OPS.transform, + numArgs: 6, + variableArgs: false + }, + m: { + id: OPS.moveTo, + numArgs: 2, + variableArgs: false + }, + l: { + id: OPS.lineTo, + numArgs: 2, + variableArgs: false + }, + c: { + id: OPS.curveTo, + numArgs: 6, + variableArgs: false + }, + v: { + id: OPS.curveTo2, + numArgs: 4, + variableArgs: false + }, + y: { + id: OPS.curveTo3, + numArgs: 4, + variableArgs: false + }, + h: { + id: OPS.closePath, + numArgs: 0, + variableArgs: false + }, + re: { + id: OPS.rectangle, + numArgs: 4, + variableArgs: false + }, + S: { + id: OPS.stroke, + numArgs: 0, + variableArgs: false + }, + s: { + id: OPS.closeStroke, + numArgs: 0, + variableArgs: false + }, + f: { + id: OPS.fill, + numArgs: 0, + variableArgs: false + }, + F: { + id: OPS.fill, + numArgs: 0, + variableArgs: false + }, + "f*": { + id: OPS.eoFill, + numArgs: 0, + variableArgs: false + }, + B: { + id: OPS.fillStroke, + numArgs: 0, + variableArgs: false + }, + "B*": { + id: OPS.eoFillStroke, + numArgs: 0, + variableArgs: false + }, + b: { + id: OPS.closeFillStroke, + numArgs: 0, + variableArgs: false + }, + "b*": { + id: OPS.closeEOFillStroke, + numArgs: 0, + variableArgs: false + }, + n: { + id: OPS.endPath, + numArgs: 0, + variableArgs: false + }, + W: { + id: OPS.clip, + numArgs: 0, + variableArgs: false + }, + "W*": { + id: OPS.eoClip, + numArgs: 0, + variableArgs: false + }, + BT: { + id: OPS.beginText, + numArgs: 0, + variableArgs: false + }, + ET: { + id: OPS.endText, + numArgs: 0, + variableArgs: false + }, + Tc: { + id: OPS.setCharSpacing, + numArgs: 1, + variableArgs: false + }, + Tw: { + id: OPS.setWordSpacing, + numArgs: 1, + variableArgs: false + }, + Tz: { + id: OPS.setHScale, + numArgs: 1, + variableArgs: false + }, + TL: { + id: OPS.setLeading, + numArgs: 1, + variableArgs: false + }, + Tf: { + id: OPS.setFont, + numArgs: 2, + variableArgs: false + }, + Tr: { + id: OPS.setTextRenderingMode, + numArgs: 1, + variableArgs: false + }, + Ts: { + id: OPS.setTextRise, + numArgs: 1, + variableArgs: false + }, + Td: { + id: OPS.moveText, + numArgs: 2, + variableArgs: false + }, + TD: { + id: OPS.setLeadingMoveText, + numArgs: 2, + variableArgs: false + }, + Tm: { + id: OPS.setTextMatrix, + numArgs: 6, + variableArgs: false + }, + "T*": { + id: OPS.nextLine, + numArgs: 0, + variableArgs: false + }, + Tj: { + id: OPS.showText, + numArgs: 1, + variableArgs: false + }, + TJ: { + id: OPS.showSpacedText, + numArgs: 1, + variableArgs: false + }, + "'": { + id: OPS.nextLineShowText, + numArgs: 1, + variableArgs: false + }, + '"': { + id: OPS.nextLineSetSpacingShowText, + numArgs: 3, + variableArgs: false + }, + d0: { + id: OPS.setCharWidth, + numArgs: 2, + variableArgs: false + }, + d1: { + id: OPS.setCharWidthAndBounds, + numArgs: 6, + variableArgs: false + }, + CS: { + id: OPS.setStrokeColorSpace, + numArgs: 1, + variableArgs: false + }, + cs: { + id: OPS.setFillColorSpace, + numArgs: 1, + variableArgs: false + }, + SC: { + id: OPS.setStrokeColor, + numArgs: 4, + variableArgs: true + }, + SCN: { + id: OPS.setStrokeColorN, + numArgs: 33, + variableArgs: true + }, + sc: { + id: OPS.setFillColor, + numArgs: 4, + variableArgs: true + }, + scn: { + id: OPS.setFillColorN, + numArgs: 33, + variableArgs: true + }, + G: { + id: OPS.setStrokeGray, + numArgs: 1, + variableArgs: false + }, + g: { + id: OPS.setFillGray, + numArgs: 1, + variableArgs: false + }, + RG: { + id: OPS.setStrokeRGBColor, + numArgs: 3, + variableArgs: false + }, + rg: { + id: OPS.setFillRGBColor, + numArgs: 3, + variableArgs: false + }, + K: { + id: OPS.setStrokeCMYKColor, + numArgs: 4, + variableArgs: false + }, + k: { + id: OPS.setFillCMYKColor, + numArgs: 4, + variableArgs: false + }, + sh: { + id: OPS.shadingFill, + numArgs: 1, + variableArgs: false + }, + BI: { + id: OPS.beginInlineImage, + numArgs: 0, + variableArgs: false + }, + ID: { + id: OPS.beginImageData, + numArgs: 0, + variableArgs: false + }, + EI: { + id: OPS.endInlineImage, + numArgs: 1, + variableArgs: false + }, + Do: { + id: OPS.paintXObject, + numArgs: 1, + variableArgs: false + }, + MP: { + id: OPS.markPoint, + numArgs: 1, + variableArgs: false + }, + DP: { + id: OPS.markPointProps, + numArgs: 2, + variableArgs: false + }, + BMC: { + id: OPS.beginMarkedContent, + numArgs: 1, + variableArgs: false + }, + BDC: { + id: OPS.beginMarkedContentProps, + numArgs: 2, + variableArgs: false + }, + EMC: { + id: OPS.endMarkedContent, + numArgs: 0, + variableArgs: false + }, + BX: { + id: OPS.beginCompat, + numArgs: 0, + variableArgs: false + }, + EX: { + id: OPS.endCompat, + numArgs: 0, + variableArgs: false + }, + BM: null, + BD: null, + true: null, + fa: null, + fal: null, + fals: null, + false: null, + nu: null, + nul: null, + null: null + })); + } + static MAX_INVALID_PATH_OPS = 10; + constructor(stream, xref, stateManager = new StateManager()) { + this.parser = new Parser({ + lexer: new Lexer(stream, EvaluatorPreprocessor.opMap), + xref + }); + this.stateManager = stateManager; + this.nonProcessedArgs = []; + this._isPathOp = false; + this._numInvalidPathOPS = 0; + } + get savedStatesDepth() { + return this.stateManager.stateStack.length; + } + read(operation) { + let args = operation.args; + while (true) { + const obj = this.parser.getObj(); + if (obj instanceof Cmd) { + const cmd = obj.cmd; + const opSpec = EvaluatorPreprocessor.opMap[cmd]; + if (!opSpec) { + warn(`Unknown command "${cmd}".`); + continue; + } + const fn = opSpec.id; + const numArgs = opSpec.numArgs; + let argsLength = args !== null ? args.length : 0; + if (!this._isPathOp) { + this._numInvalidPathOPS = 0; + } + this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath; + if (!opSpec.variableArgs) { + if (argsLength !== numArgs) { + const nonProcessedArgs = this.nonProcessedArgs; + while (argsLength > numArgs) { + nonProcessedArgs.push(args.shift()); + argsLength--; + } + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (args === null) { + args = []; + } + args.unshift(nonProcessedArgs.pop()); + argsLength++; + } + } + if (argsLength < numArgs) { + const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`; + if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) { + throw new FormatError(`Invalid ${partialMsg}`); + } + warn(`Skipping ${partialMsg}`); + if (args !== null) { + args.length = 0; + } + continue; + } + } else if (argsLength > numArgs) { + info(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`); + } + this.preprocessCommand(fn, args); + operation.fn = fn; + operation.args = args; + return true; + } + if (obj === EOF) { + return false; + } + if (obj !== null) { + if (args === null) { + args = []; + } + args.push(obj); + if (args.length > 33) { + throw new FormatError("Too many arguments"); + } + } + } + } + preprocessCommand(fn, args) { + switch (fn | 0) { + case OPS.save: + this.stateManager.save(); + break; + case OPS.restore: + this.stateManager.restore(); + break; + case OPS.transform: + this.stateManager.transform(args); + break; + } + } +} + +;// ./src/core/default_appearance.js + + + + + + + + +class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { + constructor(str) { + super(new StringStream(str)); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + const result = { + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3) + }; + try { + while (true) { + operation.args.length = 0; + if (!this.read(operation)) { + break; + } + if (this.savedStatesDepth !== 0) { + continue; + } + const { + fn, + args + } = operation; + switch (fn | 0) { + case OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize; + } + break; + case OPS.setFillRGBColor: + ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillGray: + ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + } + } + } catch (reason) { + warn(`parseDefaultAppearance - ignoring errors: "${reason}".`); + } + return result; + } +} +function parseDefaultAppearance(str) { + return new DefaultAppearanceEvaluator(str).parse(); +} +class AppearanceStreamEvaluator extends EvaluatorPreprocessor { + constructor(stream, evaluatorOptions, xref) { + super(stream); + this.stream = stream; + this.evaluatorOptions = evaluatorOptions; + this.xref = xref; + this.resources = stream.dict?.get("Resources"); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + let result = { + scaleFactor: 1, + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3), + fillColorSpace: ColorSpace.singletons.gray + }; + let breakLoop = false; + const stack = []; + try { + while (true) { + operation.args.length = 0; + if (breakLoop || !this.read(operation)) { + break; + } + const { + fn, + args + } = operation; + switch (fn | 0) { + case OPS.save: + stack.push({ + scaleFactor: result.scaleFactor, + fontSize: result.fontSize, + fontName: result.fontName, + fontColor: result.fontColor.slice(), + fillColorSpace: result.fillColorSpace + }); + break; + case OPS.restore: + result = stack.pop() || result; + break; + case OPS.setTextMatrix: + result.scaleFactor *= Math.hypot(args[0], args[1]); + break; + case OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize * result.scaleFactor; + } + break; + case OPS.setFillColorSpace: + result.fillColorSpace = ColorSpace.parse({ + cs: args[0], + xref: this.xref, + resources: this.resources, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache: this._localColorSpaceCache + }); + break; + case OPS.setFillColor: + const cs = result.fillColorSpace; + cs.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillRGBColor: + ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillGray: + ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.showText: + case OPS.showSpacedText: + case OPS.nextLineShowText: + case OPS.nextLineSetSpacingShowText: + breakLoop = true; + break; + } + } + } catch (reason) { + warn(`parseAppearanceStream - ignoring errors: "${reason}".`); + } + this.stream.reset(); + delete result.scaleFactor; + delete result.fillColorSpace; + return result; + } + get _localColorSpaceCache() { + return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); + } + get _pdfFunctionFactory() { + const pdfFunctionFactory = new PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.evaluatorOptions.isEvalSupported + }); + return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); + } +} +function parseAppearanceStream(stream, evaluatorOptions, xref) { + return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref).parse(); +} +function getPdfColor(color, isFill) { + if (color[0] === color[1] && color[1] === color[2]) { + const gray = color[0] / 255; + return `${numberToString(gray)} ${isFill ? "g" : "G"}`; + } + return Array.from(color, c => numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`; +} +function createDefaultAppearance({ + fontSize, + fontName, + fontColor +}) { + return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; +} +class FakeUnicodeFont { + constructor(xref, fontFamily) { + this.xref = xref; + this.widths = null; + this.firstChar = Infinity; + this.lastChar = -Infinity; + this.fontFamily = fontFamily; + const canvas = new OffscreenCanvas(1, 1); + this.ctxMeasure = canvas.getContext("2d", { + willReadFrequently: true + }); + if (!FakeUnicodeFont._fontNameId) { + FakeUnicodeFont._fontNameId = 1; + } + this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`); + } + get fontDescriptorRef() { + if (!FakeUnicodeFont._fontDescriptorRef) { + const fontDescriptor = new Dict(this.xref); + fontDescriptor.set("Type", Name.get("FontDescriptor")); + fontDescriptor.set("FontName", this.fontName); + fontDescriptor.set("FontFamily", "MyriadPro Regular"); + fontDescriptor.set("FontBBox", [0, 0, 0, 0]); + fontDescriptor.set("FontStretch", Name.get("Normal")); + fontDescriptor.set("FontWeight", 400); + fontDescriptor.set("ItalicAngle", 0); + FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); + } + return FakeUnicodeFont._fontDescriptorRef; + } + get descendantFontRef() { + const descendantFont = new Dict(this.xref); + descendantFont.set("BaseFont", this.fontName); + descendantFont.set("Type", Name.get("Font")); + descendantFont.set("Subtype", Name.get("CIDFontType0")); + descendantFont.set("CIDToGIDMap", Name.get("Identity")); + descendantFont.set("FirstChar", this.firstChar); + descendantFont.set("LastChar", this.lastChar); + descendantFont.set("FontDescriptor", this.fontDescriptorRef); + descendantFont.set("DW", 1000); + const widths = []; + const chars = [...this.widths.entries()].sort(); + let currentChar = null; + let currentWidths = null; + for (const [char, width] of chars) { + if (!currentChar) { + currentChar = char; + currentWidths = [width]; + continue; + } + if (char === currentChar + currentWidths.length) { + currentWidths.push(width); + } else { + widths.push(currentChar, currentWidths); + currentChar = char; + currentWidths = [width]; + } + } + if (currentChar) { + widths.push(currentChar, currentWidths); + } + descendantFont.set("W", widths); + const cidSystemInfo = new Dict(this.xref); + cidSystemInfo.set("Ordering", "Identity"); + cidSystemInfo.set("Registry", "Adobe"); + cidSystemInfo.set("Supplement", 0); + descendantFont.set("CIDSystemInfo", cidSystemInfo); + return this.xref.getNewPersistentRef(descendantFont); + } + get baseFontRef() { + const baseFont = new Dict(this.xref); + baseFont.set("BaseFont", this.fontName); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type0")); + baseFont.set("Encoding", Name.get("Identity-H")); + baseFont.set("DescendantFonts", [this.descendantFontRef]); + baseFont.set("ToUnicode", Name.get("Identity-H")); + return this.xref.getNewPersistentRef(baseFont); + } + get resources() { + const resources = new Dict(this.xref); + const font = new Dict(this.xref); + font.set(this.fontName.name, this.baseFontRef); + resources.set("Font", font); + return resources; + } + _createContext() { + this.widths = new Map(); + this.ctxMeasure.font = `1000px ${this.fontFamily}`; + return this.ctxMeasure; + } + createFontResources(text) { + const ctx = this._createContext(); + for (const line of text.split(/\r\n?|\n/)) { + for (const char of line.split("")) { + const code = char.charCodeAt(0); + if (this.widths.has(code)) { + continue; + } + const metrics = ctx.measureText(char); + const width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); + } + } + return this.resources; + } + static getFirstPositionInfo(rect, rotation, fontSize) { + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const lineHeight = LINE_FACTOR * fontSize; + const lineDescent = LINE_DESCENT_FACTOR * fontSize; + return { + coords: [0, h + lineDescent - lineHeight], + bbox: [0, 0, w, h], + matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined + }; + } + createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) { + const ctx = this._createContext(); + const lines = []; + let maxWidth = -Infinity; + for (const line of text.split(/\r\n?|\n/)) { + lines.push(line); + const lineWidth = ctx.measureText(line).width; + maxWidth = Math.max(maxWidth, lineWidth); + for (const code of codePointIter(line)) { + const char = String.fromCodePoint(code); + let width = this.widths.get(code); + if (width === undefined) { + const metrics = ctx.measureText(char); + width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); + } + } + } + maxWidth *= fontSize / 1000; + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + let hscale = 1; + if (maxWidth > w) { + hscale = w / maxWidth; + } + let vscale = 1; + const lineHeight = LINE_FACTOR * fontSize; + const lineDescent = LINE_DESCENT_FACTOR * fontSize; + const maxHeight = lineHeight * lines.length; + if (maxHeight > h) { + vscale = h / maxHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + const buffer = ["q", `0 0 ${numberToString(w)} ${numberToString(h)} re W n`, `BT`, `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${numberToString(newFontSize)} Tf`]; + const { + resources + } = this; + strokeAlpha = typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 ? strokeAlpha : 1; + if (strokeAlpha !== 1) { + buffer.push("/R0 gs"); + const extGState = new Dict(this.xref); + const r0 = new Dict(this.xref); + r0.set("ca", strokeAlpha); + r0.set("CA", strokeAlpha); + r0.set("Type", Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + } + const vShift = numberToString(lineHeight); + for (const line of lines) { + buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(this.xref); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, w, h]); + appearanceStreamDict.set("Length", appearance.length); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, w, h); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} + +;// ./src/core/name_number_tree.js + + +class NameOrNumberTree { + constructor(root, xref, type) { + this.root = root; + this.xref = xref; + this._type = type; + } + getAll() { + const map = new Map(); + if (!this.root) { + return map; + } + const xref = this.xref; + const processed = new RefSet(); + processed.put(this.root); + const queue = [this.root]; + while (queue.length > 0) { + const obj = xref.fetchIfRef(queue.shift()); + if (!(obj instanceof Dict)) { + continue; + } + if (obj.has("Kids")) { + const kids = obj.get("Kids"); + if (!Array.isArray(kids)) { + continue; + } + for (const kid of kids) { + if (processed.has(kid)) { + throw new FormatError(`Duplicate entry in "${this._type}" tree.`); + } + queue.push(kid); + processed.put(kid); + } + continue; + } + const entries = obj.get(this._type); + if (!Array.isArray(entries)) { + continue; + } + for (let i = 0, ii = entries.length; i < ii; i += 2) { + map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); + } + } + return map; + } + getRaw(key) { + if (!this.root) { + return null; + } + const xref = this.xref; + let kidsOrEntries = xref.fetchIfRef(this.root); + let loopCount = 0; + const MAX_LEVELS = 10; + while (kidsOrEntries.has("Kids")) { + if (++loopCount > MAX_LEVELS) { + warn(`Search depth limit reached for "${this._type}" tree.`); + return null; + } + const kids = kidsOrEntries.get("Kids"); + if (!Array.isArray(kids)) { + return null; + } + let l = 0, + r = kids.length - 1; + while (l <= r) { + const m = l + r >> 1; + const kid = xref.fetchIfRef(kids[m]); + const limits = kid.get("Limits"); + if (key < xref.fetchIfRef(limits[0])) { + r = m - 1; + } else if (key > xref.fetchIfRef(limits[1])) { + l = m + 1; + } else { + kidsOrEntries = kid; + break; + } + } + if (l > r) { + return null; + } + } + const entries = kidsOrEntries.get(this._type); + if (Array.isArray(entries)) { + let l = 0, + r = entries.length - 2; + while (l <= r) { + const tmp = l + r >> 1, + m = tmp + (tmp & 1); + const currentKey = xref.fetchIfRef(entries[m]); + if (key < currentKey) { + r = m - 2; + } else if (key > currentKey) { + l = m + 2; + } else { + return entries[m + 1]; + } + } + } + return null; + } + get(key) { + return this.xref.fetchIfRef(this.getRaw(key)); + } +} +class NameTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Names"); + } +} +class NumberTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Nums"); + } +} + +;// ./src/core/cleanup_helper.js + + + + +function clearGlobalCaches() { + clearPatternCaches(); + clearPrimitiveCaches(); + clearUnicodeCaches(); + JpxImage.cleanup(); +} + +;// ./src/core/file_spec.js + + + +function pickPlatformItem(dict) { + if (!(dict instanceof Dict)) { + return null; + } + if (dict.has("UF")) { + return dict.get("UF"); + } else if (dict.has("F")) { + return dict.get("F"); + } else if (dict.has("Unix")) { + return dict.get("Unix"); + } else if (dict.has("Mac")) { + return dict.get("Mac"); + } else if (dict.has("DOS")) { + return dict.get("DOS"); + } + return null; +} +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); +} +class FileSpec { + #contentAvailable = false; + constructor(root, xref, skipContent = false) { + if (!(root instanceof Dict)) { + return; + } + this.xref = xref; + this.root = root; + if (root.has("FS")) { + this.fs = root.get("FS"); + } + if (root.has("RF")) { + warn("Related file specifications are not supported"); + } + if (!skipContent) { + if (root.has("EF")) { + this.#contentAvailable = true; + } else { + warn("Non-embedded file specifications are not supported"); + } + } + } + get filename() { + let filename = ""; + const item = pickPlatformItem(this.root); + if (item && typeof item === "string") { + filename = stringToPDFString(item).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); + } + return shadow(this, "filename", filename || "unnamed"); + } + get content() { + if (!this.#contentAvailable) { + return null; + } + this._contentRef ||= pickPlatformItem(this.root?.get("EF")); + let content = null; + if (this._contentRef) { + const fileObj = this.xref.fetchIfRef(this._contentRef); + if (fileObj instanceof BaseStream) { + content = fileObj.getBytes(); + } else { + warn("Embedded file specification points to non-existing/invalid content"); + } + } else { + warn("Embedded file specification does not have any content"); + } + return content; + } + get description() { + let description = ""; + const desc = this.root?.get("Desc"); + if (desc && typeof desc === "string") { + description = stringToPDFString(desc); + } + return shadow(this, "description", description); + } + get serializable() { + return { + rawFilename: this.filename, + filename: stripPath(this.filename), + content: this.content, + description: this.description + }; + } +} + +;// ./src/core/xml_parser.js + +const XMLParserErrorCode = { + NoError: 0, + EndOfDocument: -1, + UnterminatedCdat: -2, + UnterminatedXmlDeclaration: -3, + UnterminatedDoctypeDeclaration: -4, + UnterminatedComment: -5, + MalformedElement: -6, + OutOfMemory: -7, + UnterminatedAttributeValue: -8, + UnterminatedElement: -9, + ElementNeverBegun: -10 +}; +function isWhitespace(s, index) { + const ch = s[index]; + return ch === " " || ch === "\n" || ch === "\r" || ch === "\t"; +} +function isWhitespaceString(s) { + for (let i = 0, ii = s.length; i < ii; i++) { + if (!isWhitespace(s, i)) { + return false; + } + } + return true; +} +class XMLParserBase { + _resolveEntities(s) { + return s.replaceAll(/&([^;]+);/g, (all, entity) => { + if (entity.substring(0, 2) === "#x") { + return String.fromCodePoint(parseInt(entity.substring(2), 16)); + } else if (entity.substring(0, 1) === "#") { + return String.fromCodePoint(parseInt(entity.substring(1), 10)); + } + switch (entity) { + case "lt": + return "<"; + case "gt": + return ">"; + case "amp": + return "&"; + case "quot": + return '"'; + case "apos": + return "'"; + } + return this.onResolveEntity(entity); + }); + } + _parseContent(s, start) { + const attributes = []; + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") { + skipWs(); + let attrName = "", + attrValue = ""; + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { + attrName += s[pos]; + ++pos; + } + skipWs(); + if (s[pos] !== "=") { + return null; + } + ++pos; + skipWs(); + const attrEndChar = s[pos]; + if (attrEndChar !== '"' && attrEndChar !== "'") { + return null; + } + const attrEndIndex = s.indexOf(attrEndChar, ++pos); + if (attrEndIndex < 0) { + return null; + } + attrValue = s.substring(pos, attrEndIndex); + attributes.push({ + name: attrName, + value: this._resolveEntities(attrValue) + }); + pos = attrEndIndex + 1; + skipWs(); + } + return { + name, + attributes, + parsed: pos - start + }; + } + _parseProcessingInstruction(s, start) { + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + const attrStart = pos; + while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) { + ++pos; + } + const value = s.substring(attrStart, pos); + return { + name, + value, + parsed: pos - start + }; + } + parseXml(s) { + let i = 0; + while (i < s.length) { + const ch = s[i]; + let j = i; + if (ch === "<") { + ++j; + const ch2 = s[j]; + let q; + switch (ch2) { + case "/": + ++j; + q = s.indexOf(">", j); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onEndElement(s.substring(j, q)); + j = q + 1; + break; + case "?": + ++j; + const pi = this._parseProcessingInstruction(s, j); + if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { + this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); + return; + } + this.onPi(pi.name, pi.value); + j += pi.parsed + 2; + break; + case "!": + if (s.substring(j + 1, j + 3) === "--") { + q = s.indexOf("-->", j + 3); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedComment); + return; + } + this.onComment(s.substring(j + 3, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "[CDATA[") { + q = s.indexOf("]]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedCdat); + return; + } + this.onCdata(s.substring(j + 8, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "DOCTYPE") { + const q2 = s.indexOf("[", j + 8); + let complexDoctype = false; + q = s.indexOf(">", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + if (q2 > 0 && q > q2) { + q = s.indexOf("]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + complexDoctype = true; + } + const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); + this.onDoctype(doctypeContent); + j = q + (complexDoctype ? 2 : 1); + } else { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + break; + default: + const content = this._parseContent(s, j); + if (content === null) { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + let isClosed = false; + if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { + isClosed = true; + } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onBeginElement(content.name, content.attributes, isClosed); + j += content.parsed + (isClosed ? 2 : 1); + break; + } + } else { + while (j < s.length && s[j] !== "<") { + j++; + } + const text = s.substring(i, j); + this.onText(this._resolveEntities(text)); + } + i = j; + } + } + onResolveEntity(name) { + return `&${name};`; + } + onPi(name, value) {} + onComment(text) {} + onCdata(text) {} + onDoctype(doctypeContent) {} + onText(text) {} + onBeginElement(name, attributes, isEmpty) {} + onEndElement(name) {} + onError(code) {} +} +class SimpleDOMNode { + constructor(nodeName, nodeValue) { + this.nodeName = nodeName; + this.nodeValue = nodeValue; + Object.defineProperty(this, "parentNode", { + value: null, + writable: true + }); + } + get firstChild() { + return this.childNodes?.[0]; + } + get nextSibling() { + const childNodes = this.parentNode.childNodes; + if (!childNodes) { + return undefined; + } + const index = childNodes.indexOf(this); + if (index === -1) { + return undefined; + } + return childNodes[index + 1]; + } + get textContent() { + if (!this.childNodes) { + return this.nodeValue || ""; + } + return this.childNodes.map(function (child) { + return child.textContent; + }).join(""); + } + get children() { + return this.childNodes || []; + } + hasChildNodes() { + return this.childNodes?.length > 0; + } + searchNode(paths, pos) { + if (pos >= paths.length) { + return this; + } + const component = paths[pos]; + if (component.name.startsWith("#") && pos < paths.length - 1) { + return this.searchNode(paths, pos + 1); + } + const stack = []; + let node = this; + while (true) { + if (component.name === node.nodeName) { + if (component.pos === 0) { + const res = node.searchNode(paths, pos + 1); + if (res !== null) { + return res; + } + } else if (stack.length === 0) { + return null; + } else { + const [parent] = stack.pop(); + let siblingPos = 0; + for (const child of parent.childNodes) { + if (component.name === child.nodeName) { + if (siblingPos === component.pos) { + return child.searchNode(paths, pos + 1); + } + siblingPos++; + } + } + return node.searchNode(paths, pos + 1); + } + } + if (node.childNodes?.length > 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; + } else { + while (stack.length !== 0) { + const [parent, currentPos] = stack.pop(); + const newPos = currentPos + 1; + if (newPos < parent.childNodes.length) { + stack.push([parent, newPos]); + node = parent.childNodes[newPos]; + break; + } + } + if (stack.length === 0) { + return null; + } + } + } + } + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push(encodeToXmlString(this.nodeValue)); + return; + } + buffer.push(`<${this.nodeName}`); + if (this.attributes) { + for (const attribute of this.attributes) { + buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`); + } + } + if (this.hasChildNodes()) { + buffer.push(">"); + for (const child of this.childNodes) { + child.dump(buffer); + } + buffer.push(``); + } else if (this.nodeValue) { + buffer.push(`>${encodeToXmlString(this.nodeValue)}`); + } else { + buffer.push("/>"); + } + } +} +class SimpleXMLParser extends XMLParserBase { + constructor({ + hasAttributes = false, + lowerCaseName = false + }) { + super(); + this._currentFragment = null; + this._stack = null; + this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; + } + parseFromString(data) { + this._currentFragment = []; + this._stack = []; + this._errorCode = XMLParserErrorCode.NoError; + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + const [documentElement] = this._currentFragment; + if (!documentElement) { + return undefined; + } + return { + documentElement + }; + } + onText(text) { + if (isWhitespaceString(text)) { + return; + } + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onCdata(text) { + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onBeginElement(name, attributes, isEmpty) { + if (this._lowerCaseName) { + name = name.toLowerCase(); + } + const node = new SimpleDOMNode(name); + node.childNodes = []; + if (this._hasAttributes) { + node.attributes = attributes; + } + this._currentFragment.push(node); + if (isEmpty) { + return; + } + this._stack.push(this._currentFragment); + this._currentFragment = node.childNodes; + } + onEndElement(name) { + this._currentFragment = this._stack.pop() || []; + const lastElement = this._currentFragment.at(-1); + if (!lastElement) { + return null; + } + for (const childNode of lastElement.childNodes) { + childNode.parentNode = lastElement; + } + return lastElement; + } + onError(code) { + this._errorCode = code; + } +} + +;// ./src/core/metadata_parser.js + +class MetadataParser { + constructor(data) { + data = this._repair(data); + const parser = new SimpleXMLParser({ + lowerCaseName: true + }); + const xmlDocument = parser.parseFromString(data); + this._metadataMap = new Map(); + this._data = data; + if (xmlDocument) { + this._parse(xmlDocument); + } + } + _repair(data) { + return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); + }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { + switch (name) { + case "amp": + return "&"; + case "apos": + return "'"; + case "gt": + return ">"; + case "lt": + return "<"; + case "quot": + return '"'; + } + throw new Error(`_repair: ${name} isn't defined.`); + }); + const charBuf = [">"]; + for (let i = 0, ii = bytes.length; i < ii; i += 2) { + const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); + if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { + charBuf.push(String.fromCharCode(code)); + } else { + charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); + } + } + return charBuf.join(""); + }); + } + _getSequence(entry) { + const name = entry.nodeName; + if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { + return null; + } + return entry.childNodes.filter(node => node.nodeName === "rdf:li"); + } + _parseArray(entry) { + if (!entry.hasChildNodes()) { + return; + } + const [seqNode] = entry.childNodes; + const sequence = this._getSequence(seqNode) || []; + this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); + } + _parse(xmlDocument) { + let rdf = xmlDocument.documentElement; + if (rdf.nodeName !== "rdf:rdf") { + rdf = rdf.firstChild; + while (rdf && rdf.nodeName !== "rdf:rdf") { + rdf = rdf.nextSibling; + } + } + if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { + return; + } + for (const desc of rdf.childNodes) { + if (desc.nodeName !== "rdf:description") { + continue; + } + for (const entry of desc.childNodes) { + const name = entry.nodeName; + switch (name) { + case "#text": + continue; + case "dc:creator": + case "dc:subject": + this._parseArray(entry); + continue; + } + this._metadataMap.set(name, entry.textContent.trim()); + } + } + } + get serializable() { + return { + parsedData: this._metadataMap, + rawData: this._data + }; + } +} + +;// ./src/core/struct_tree.js + + + + +const MAX_DEPTH = 40; +const StructElementType = { + PAGE_CONTENT: 1, + STREAM_CONTENT: 2, + OBJECT: 3, + ANNOTATION: 4, + ELEMENT: 5 +}; +class StructTreeRoot { + constructor(rootDict, rootRef) { + this.dict = rootDict; + this.ref = rootRef instanceof Ref ? rootRef : null; + this.roleMap = new Map(); + this.structParentIds = null; + } + init() { + this.readRoleMap(); + } + #addIdToPage(pageRef, id, type) { + if (!(pageRef instanceof Ref) || id < 0) { + return; + } + this.structParentIds ||= new RefSetCache(); + let ids = this.structParentIds.get(pageRef); + if (!ids) { + ids = []; + this.structParentIds.put(pageRef, ids); + } + ids.push([id, type]); + } + addAnnotationIdToPage(pageRef, id) { + this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION); + } + readRoleMap() { + const roleMapDict = this.dict.get("RoleMap"); + if (!(roleMapDict instanceof Dict)) { + return; + } + for (const [key, value] of roleMapDict) { + if (value instanceof Name) { + this.roleMap.set(key, value.name); + } + } + } + static async canCreateStructureTree({ + catalogRef, + pdfManager, + newAnnotationsByPage + }) { + if (!(catalogRef instanceof Ref)) { + warn("Cannot save the struct tree: no catalog reference."); + return false; + } + let nextKey = 0; + let hasNothingToUpdate = true; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const { + ref: pageRef + } = await pdfManager.getPage(pageIndex); + if (!(pageRef instanceof Ref)) { + warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`); + hasNothingToUpdate = true; + break; + } + for (const element of elements) { + if (element.accessibilityData?.type) { + element.parentTreeId = nextKey++; + hasNothingToUpdate = false; + } + } + } + if (hasNothingToUpdate) { + for (const elements of newAnnotationsByPage.values()) { + for (const element of elements) { + delete element.parentTreeId; + } + } + return false; + } + return true; + } + static async createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + changes + }) { + const root = pdfManager.catalog.cloneDict(); + const cache = new RefSetCache(); + cache.put(catalogRef, root); + const structTreeRootRef = xref.getNewTemporaryRef(); + root.set("StructTreeRoot", structTreeRootRef); + const structTreeRoot = new Dict(xref); + structTreeRoot.set("Type", Name.get("StructTreeRoot")); + const parentTreeRef = xref.getNewTemporaryRef(); + structTreeRoot.set("ParentTree", parentTreeRef); + const kids = []; + structTreeRoot.set("K", kids); + cache.put(structTreeRootRef, structTreeRoot); + const parentTree = new Dict(xref); + const nums = []; + parentTree.set("Nums", nums); + const nextKey = await this.#writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot: null, + kids, + nums, + xref, + pdfManager, + changes, + cache + }); + structTreeRoot.set("ParentTreeNextKey", nextKey); + cache.put(parentTreeRef, parentTree); + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } + } + async canUpdateStructTree({ + pdfManager, + xref, + newAnnotationsByPage + }) { + if (!this.ref) { + warn("Cannot update the struct tree: no root reference."); + return false; + } + let nextKey = this.dict.get("ParentTreeNextKey"); + if (!Number.isInteger(nextKey) || nextKey < 0) { + warn("Cannot update the struct tree: invalid next key."); + return false; + } + const parentTree = this.dict.get("ParentTree"); + if (!(parentTree instanceof Dict)) { + warn("Cannot update the struct tree: ParentTree isn't a dict."); + return false; + } + const nums = parentTree.get("Nums"); + if (!Array.isArray(nums)) { + warn("Cannot update the struct tree: nums isn't an array."); + return false; + } + const numberTree = new NumberTree(parentTree, xref); + for (const pageIndex of newAnnotationsByPage.keys()) { + const { + pageDict + } = await pdfManager.getPage(pageIndex); + if (!pageDict.has("StructParents")) { + continue; + } + const id = pageDict.get("StructParents"); + if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) { + warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`); + return false; + } + } + let hasNothingToUpdate = true; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const { + pageDict + } = await pdfManager.getPage(pageIndex); + StructTreeRoot.#collectParents({ + elements, + xref: this.dict.xref, + pageDict, + numberTree + }); + for (const element of elements) { + if (element.accessibilityData?.type) { + if (!(element.accessibilityData.structParent >= 0)) { + element.parentTreeId = nextKey++; + } + hasNothingToUpdate = false; + } + } + } + if (hasNothingToUpdate) { + for (const elements of newAnnotationsByPage.values()) { + for (const element of elements) { + delete element.parentTreeId; + delete element.structTreeParent; + } + } + return false; + } + return true; + } + async updateStructureTree({ + newAnnotationsByPage, + pdfManager, + changes + }) { + const xref = this.dict.xref; + const structTreeRoot = this.dict.clone(); + const structTreeRootRef = this.ref; + const cache = new RefSetCache(); + cache.put(structTreeRootRef, structTreeRoot); + let parentTreeRef = structTreeRoot.getRaw("ParentTree"); + let parentTree; + if (parentTreeRef instanceof Ref) { + parentTree = xref.fetch(parentTreeRef); + } else { + parentTree = parentTreeRef; + parentTreeRef = xref.getNewTemporaryRef(); + structTreeRoot.set("ParentTree", parentTreeRef); + } + parentTree = parentTree.clone(); + cache.put(parentTreeRef, parentTree); + let nums = parentTree.getRaw("Nums"); + let numsRef = null; + if (nums instanceof Ref) { + numsRef = nums; + nums = xref.fetch(numsRef); + } + nums = nums.slice(); + if (!numsRef) { + parentTree.set("Nums", nums); + } + const newNextKey = await StructTreeRoot.#writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot: this, + kids: null, + nums, + xref, + pdfManager, + changes, + cache + }); + if (newNextKey === -1) { + return; + } + structTreeRoot.set("ParentTreeNextKey", newNextKey); + if (numsRef) { + cache.put(numsRef, nums); + } + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } + } + static async #writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot, + kids, + nums, + xref, + pdfManager, + changes, + cache + }) { + const objr = Name.get("OBJR"); + let nextKey = -1; + let structTreePageObjs; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const page = await pdfManager.getPage(pageIndex); + const { + ref: pageRef + } = page; + const isPageRef = pageRef instanceof Ref; + for (const { + accessibilityData, + ref, + parentTreeId, + structTreeParent + } of elements) { + if (!accessibilityData?.type) { + continue; + } + const { + structParent + } = accessibilityData; + if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) { + let objs = (structTreePageObjs ||= new Map()).get(pageIndex); + if (objs === undefined) { + const structTreePage = new StructTreePage(structTreeRoot, page.pageDict); + objs = structTreePage.collectObjects(pageRef); + structTreePageObjs.set(pageIndex, objs); + } + const objRef = objs?.get(structParent); + if (objRef) { + const tagDict = xref.fetch(objRef).clone(); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + changes.put(objRef, { + data: tagDict + }); + continue; + } + } + nextKey = Math.max(nextKey, parentTreeId); + const tagRef = xref.getNewTemporaryRef(); + const tagDict = new Dict(xref); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + await this.#updateParentTag({ + structTreeParent, + tagDict, + newTagRef: tagRef, + structTreeRootRef, + fallbackKids: kids, + xref, + cache + }); + const objDict = new Dict(xref); + tagDict.set("K", objDict); + objDict.set("Type", objr); + if (isPageRef) { + objDict.set("Pg", pageRef); + } + objDict.set("Obj", ref); + cache.put(tagRef, tagDict); + nums.push(parentTreeId, tagRef); + } + } + return nextKey + 1; + } + static #writeProperties(tagDict, { + type, + title, + lang, + alt, + expanded, + actualText + }) { + tagDict.set("S", Name.get(type)); + if (title) { + tagDict.set("T", stringToAsciiOrUTF16BE(title)); + } + if (lang) { + tagDict.set("Lang", stringToAsciiOrUTF16BE(lang)); + } + if (alt) { + tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); + } + if (expanded) { + tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); + } + if (actualText) { + tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); + } + } + static #collectParents({ + elements, + xref, + pageDict, + numberTree + }) { + const idToElements = new Map(); + for (const element of elements) { + if (element.structTreeParentId) { + const id = parseInt(element.structTreeParentId.split("_mc")[1], 10); + let elems = idToElements.get(id); + if (!elems) { + elems = []; + idToElements.set(id, elems); + } + elems.push(element); + } + } + const id = pageDict.get("StructParents"); + if (!Number.isInteger(id)) { + return; + } + const parentArray = numberTree.get(id); + const updateElement = (kid, pageKid, kidRef) => { + const elems = idToElements.get(kid); + if (elems) { + const parentRef = pageKid.getRaw("P"); + const parentDict = xref.fetchIfRef(parentRef); + if (parentRef instanceof Ref && parentDict instanceof Dict) { + const params = { + ref: kidRef, + dict: pageKid + }; + for (const element of elems) { + element.structTreeParent = params; + } + } + return true; + } + return false; + }; + for (const kidRef of parentArray) { + if (!(kidRef instanceof Ref)) { + continue; + } + const pageKid = xref.fetch(kidRef); + const k = pageKid.get("K"); + if (Number.isInteger(k)) { + updateElement(k, pageKid, kidRef); + continue; + } + if (!Array.isArray(k)) { + continue; + } + for (let kid of k) { + kid = xref.fetchIfRef(kid); + if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) { + break; + } + if (!(kid instanceof Dict)) { + continue; + } + if (!isName(kid.get("Type"), "MCR")) { + break; + } + const mcid = kid.get("MCID"); + if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) { + break; + } + } + } + } + static async #updateParentTag({ + structTreeParent, + tagDict, + newTagRef, + structTreeRootRef, + fallbackKids, + xref, + cache + }) { + let ref = null; + let parentRef; + if (structTreeParent) { + ({ + ref + } = structTreeParent); + parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef; + } else { + parentRef = structTreeRootRef; + } + tagDict.set("P", parentRef); + const parentDict = xref.fetchIfRef(parentRef); + if (!parentDict) { + fallbackKids.push(newTagRef); + return; + } + let cachedParentDict = cache.get(parentRef); + if (!cachedParentDict) { + cachedParentDict = parentDict.clone(); + cache.put(parentRef, cachedParentDict); + } + const parentKidsRaw = cachedParentDict.getRaw("K"); + let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null; + if (!cachedParentKids) { + cachedParentKids = xref.fetchIfRef(parentKidsRaw); + cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw]; + const parentKidsRef = xref.getNewTemporaryRef(); + cachedParentDict.set("K", parentKidsRef); + cache.put(parentKidsRef, cachedParentKids); + } + const index = cachedParentKids.indexOf(ref); + cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef); + } +} +class StructElementNode { + constructor(tree, dict) { + this.tree = tree; + this.dict = dict; + this.kids = []; + this.parseKids(); + } + get role() { + const nameObj = this.dict.get("S"); + const name = nameObj instanceof Name ? nameObj.name : ""; + const { + root + } = this.tree; + if (root.roleMap.has(name)) { + return root.roleMap.get(name); + } + return name; + } + parseKids() { + let pageObjId = null; + const objRef = this.dict.getRaw("Pg"); + if (objRef instanceof Ref) { + pageObjId = objRef.toString(); + } + const kids = this.dict.get("K"); + if (Array.isArray(kids)) { + for (const kid of kids) { + const element = this.parseKid(pageObjId, kid); + if (element) { + this.kids.push(element); + } + } + } else { + const element = this.parseKid(pageObjId, kids); + if (element) { + this.kids.push(element); + } + } + } + parseKid(pageObjId, kid) { + if (Number.isInteger(kid)) { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + return new StructElement({ + type: StructElementType.PAGE_CONTENT, + mcid: kid, + pageObjId + }); + } + let kidDict = null; + if (kid instanceof Ref) { + kidDict = this.dict.xref.fetch(kid); + } else if (kid instanceof Dict) { + kidDict = kid; + } + if (!kidDict) { + return null; + } + const pageRef = kidDict.getRaw("Pg"); + if (pageRef instanceof Ref) { + pageObjId = pageRef.toString(); + } + const type = kidDict.get("Type") instanceof Name ? kidDict.get("Type").name : null; + if (type === "MCR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kidDict.getRaw("Stm"); + return new StructElement({ + type: StructElementType.STREAM_CONTENT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId, + mcid: kidDict.get("MCID") + }); + } + if (type === "OBJR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kidDict.getRaw("Obj"); + return new StructElement({ + type: StructElementType.OBJECT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId + }); + } + return new StructElement({ + type: StructElementType.ELEMENT, + dict: kidDict + }); + } +} +class StructElement { + constructor({ + type, + dict = null, + mcid = null, + pageObjId = null, + refObjId = null + }) { + this.type = type; + this.dict = dict; + this.mcid = mcid; + this.pageObjId = pageObjId; + this.refObjId = refObjId; + this.parentNode = null; + } +} +class StructTreePage { + constructor(structTreeRoot, pageDict) { + this.root = structTreeRoot; + this.rootDict = structTreeRoot ? structTreeRoot.dict : null; + this.pageDict = pageDict; + this.nodes = []; + } + collectObjects(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return null; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return null; + } + const ids = this.root.structParentIds?.get(pageRef); + if (!ids) { + return null; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.rootDict.xref); + for (const [elemId] of ids) { + const obj = numberTree.getRaw(elemId); + if (obj instanceof Ref) { + map.set(elemId, obj); + } + } + return map; + } + parse(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return; + } + const id = this.pageDict.get("StructParents"); + const ids = this.root.structParentIds?.get(pageRef); + if (!Number.isInteger(id) && !ids) { + return; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.rootDict.xref); + if (Number.isInteger(id)) { + const parentArray = numberTree.get(id); + if (Array.isArray(parentArray)) { + for (const ref of parentArray) { + if (ref instanceof Ref) { + this.addNode(this.rootDict.xref.fetch(ref), map); + } + } + } + } + if (!ids) { + return; + } + for (const [elemId, type] of ids) { + const obj = numberTree.get(elemId); + if (obj) { + const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map); + if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) { + elem.kids[0].type = type; + } + } + } + } + addNode(dict, map, level = 0) { + if (level > MAX_DEPTH) { + warn("StructTree MAX_DEPTH reached."); + return null; + } + if (!(dict instanceof Dict)) { + return null; + } + if (map.has(dict)) { + return map.get(dict); + } + const element = new StructElementNode(this, dict); + map.set(dict, element); + const parent = dict.get("P"); + if (!parent || isName(parent.get("Type"), "StructTreeRoot")) { + if (!this.addTopLevelNode(dict, element)) { + map.delete(dict); + } + return element; + } + const parentNode = this.addNode(parent, map, level + 1); + if (!parentNode) { + return element; + } + let save = false; + for (const kid of parentNode.kids) { + if (kid.type === StructElementType.ELEMENT && kid.dict === dict) { + kid.parentNode = element; + save = true; + } + } + if (!save) { + map.delete(dict); + } + return element; + } + addTopLevelNode(dict, element) { + const obj = this.rootDict.get("K"); + if (!obj) { + return false; + } + if (obj instanceof Dict) { + if (obj.objId !== dict.objId) { + return false; + } + this.nodes[0] = element; + return true; + } + if (!Array.isArray(obj)) { + return true; + } + let save = false; + for (let i = 0; i < obj.length; i++) { + const kidRef = obj[i]; + if (kidRef?.toString() === dict.objId) { + this.nodes[i] = element; + save = true; + } + } + return save; + } + get serializable() { + function nodeToSerializable(node, parent, level = 0) { + if (level > MAX_DEPTH) { + warn("StructTree too deep to be fully serialized."); + return; + } + const obj = Object.create(null); + obj.role = node.role; + obj.children = []; + parent.children.push(obj); + let alt = node.dict.get("Alt"); + if (typeof alt !== "string") { + alt = node.dict.get("ActualText"); + } + if (typeof alt === "string") { + obj.alt = stringToPDFString(alt); + } + const a = node.dict.get("A"); + if (a instanceof Dict) { + const bbox = lookupNormalRect(a.getArray("BBox"), null); + if (bbox) { + obj.bbox = bbox; + } else { + const width = a.get("Width"); + const height = a.get("Height"); + if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) { + obj.bbox = [0, 0, width, height]; + } + } + } + const lang = node.dict.get("Lang"); + if (typeof lang === "string") { + obj.lang = stringToPDFString(lang); + } + for (const kid of node.kids) { + const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null; + if (kidElement) { + nodeToSerializable(kidElement, obj, level + 1); + continue; + } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) { + obj.children.push({ + type: "content", + id: `p${kid.pageObjId}_mc${kid.mcid}` + }); + } else if (kid.type === StructElementType.OBJECT) { + obj.children.push({ + type: "object", + id: kid.refObjId + }); + } else if (kid.type === StructElementType.ANNOTATION) { + obj.children.push({ + type: "annotation", + id: `${AnnotationPrefix}${kid.refObjId}` + }); + } + } + } + const root = Object.create(null); + root.children = []; + root.role = "Root"; + for (const child of this.nodes) { + if (!child) { + continue; + } + nodeToSerializable(child, root); + } + return root; + } +} + +;// ./src/core/catalog.js + + + + + + + + + + + +function isValidExplicitDest(dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!(page instanceof Ref) && !Number.isInteger(page)) { + return false; + } + if (!(zoom instanceof Name)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (!(typeof arg === "number" || allowNull && arg === null)) { + return false; + } + } + return true; +} +function fetchDest(dest) { + if (dest instanceof Dict) { + dest = dest.get("D"); + } + return isValidExplicitDest(dest) ? dest : null; +} +function fetchRemoteDest(action) { + let dest = action.get("D"); + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + return stringToPDFString(dest); + } else if (isValidExplicitDest(dest)) { + return JSON.stringify(dest); + } + } + return null; +} +class Catalog { + constructor(pdfManager, xref) { + this.pdfManager = pdfManager; + this.xref = xref; + this._catDict = xref.getCatalogObj(); + if (!(this._catDict instanceof Dict)) { + throw new FormatError("Catalog object is not a dictionary."); + } + this.toplevelPagesDict; + this._actualNumPages = null; + this.fontCache = new RefSetCache(); + this.builtInCMapCache = new Map(); + this.standardFontDataCache = new Map(); + this.globalImageCache = new GlobalImageCache(); + this.pageKidsCountCache = new RefSetCache(); + this.pageIndexCache = new RefSetCache(); + this.pageDictCache = new RefSetCache(); + this.nonBlendModesSet = new RefSet(); + this.systemFontCache = new Map(); + } + cloneDict() { + return this._catDict.clone(); + } + get version() { + const version = this._catDict.get("Version"); + if (version instanceof Name) { + if (PDF_VERSION_REGEXP.test(version.name)) { + return shadow(this, "version", version.name); + } + warn(`Invalid PDF catalog version: ${version.name}`); + } + return shadow(this, "version", null); + } + get lang() { + const lang = this._catDict.get("Lang"); + return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null); + } + get needsRendering() { + const needsRendering = this._catDict.get("NeedsRendering"); + return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false); + } + get collection() { + let collection = null; + try { + const obj = this._catDict.get("Collection"); + if (obj instanceof Dict && obj.size > 0) { + collection = obj; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info("Cannot fetch Collection entry; assuming no collection is present."); + } + return shadow(this, "collection", collection); + } + get acroForm() { + let acroForm = null; + try { + const obj = this._catDict.get("AcroForm"); + if (obj instanceof Dict && obj.size > 0) { + acroForm = obj; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info("Cannot fetch AcroForm entry; assuming no forms are present."); + } + return shadow(this, "acroForm", acroForm); + } + get acroFormRef() { + const value = this._catDict.getRaw("AcroForm"); + return shadow(this, "acroFormRef", value instanceof Ref ? value : null); + } + get metadata() { + const streamRef = this._catDict.getRaw("Metadata"); + if (!(streamRef instanceof Ref)) { + return shadow(this, "metadata", null); + } + let metadata = null; + try { + const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata); + if (stream instanceof BaseStream && stream.dict instanceof Dict) { + const type = stream.dict.get("Type"); + const subtype = stream.dict.get("Subtype"); + if (isName(type, "Metadata") && isName(subtype, "XML")) { + const data = stringToUTF8String(stream.getString()); + if (data) { + metadata = new MetadataParser(data).serializable; + } + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info(`Skipping invalid Metadata: "${ex}".`); + } + return shadow(this, "metadata", metadata); + } + get markInfo() { + let markInfo = null; + try { + markInfo = this._readMarkInfo(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read mark info."); + } + return shadow(this, "markInfo", markInfo); + } + _readMarkInfo() { + const obj = this._catDict.get("MarkInfo"); + if (!(obj instanceof Dict)) { + return null; + } + const markInfo = { + Marked: false, + UserProperties: false, + Suspects: false + }; + for (const key in markInfo) { + const value = obj.get(key); + if (typeof value === "boolean") { + markInfo[key] = value; + } + } + return markInfo; + } + get structTreeRoot() { + let structTree = null; + try { + structTree = this._readStructTreeRoot(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable read to structTreeRoot info."); + } + return shadow(this, "structTreeRoot", structTree); + } + _readStructTreeRoot() { + const rawObj = this._catDict.getRaw("StructTreeRoot"); + const obj = this.xref.fetchIfRef(rawObj); + if (!(obj instanceof Dict)) { + return null; + } + const root = new StructTreeRoot(obj, rawObj); + root.init(); + return root; + } + get toplevelPagesDict() { + const pagesObj = this._catDict.get("Pages"); + if (!(pagesObj instanceof Dict)) { + throw new FormatError("Invalid top-level pages dictionary."); + } + return shadow(this, "toplevelPagesDict", pagesObj); + } + get documentOutline() { + let obj = null; + try { + obj = this._readDocumentOutline(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read document outline."); + } + return shadow(this, "documentOutline", obj); + } + _readDocumentOutline() { + let obj = this._catDict.get("Outlines"); + if (!(obj instanceof Dict)) { + return null; + } + obj = obj.getRaw("First"); + if (!(obj instanceof Ref)) { + return null; + } + const root = { + items: [] + }; + const queue = [{ + obj, + parent: root + }]; + const processed = new RefSet(); + processed.put(obj); + const xref = this.xref, + blackColor = new Uint8ClampedArray(3); + while (queue.length > 0) { + const i = queue.shift(); + const outlineDict = xref.fetchIfRef(i.obj); + if (outlineDict === null) { + continue; + } + if (!outlineDict.has("Title")) { + warn("Invalid outline item encountered."); + } + const data = { + url: null, + dest: null, + action: null + }; + Catalog.parseDestDictionary({ + destDict: outlineDict, + resultObj: data, + docBaseUrl: this.baseUrl, + docAttachments: this.attachments + }); + const title = outlineDict.get("Title"); + const flags = outlineDict.get("F") || 0; + const color = outlineDict.getArray("C"); + const count = outlineDict.get("Count"); + let rgbColor = blackColor; + if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { + rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); + } + const outlineItem = { + action: data.action, + attachment: data.attachment, + dest: data.dest, + url: data.url, + unsafeUrl: data.unsafeUrl, + newWindow: data.newWindow, + setOCGState: data.setOCGState, + title: typeof title === "string" ? stringToPDFString(title) : "", + color: rgbColor, + count: Number.isInteger(count) ? count : undefined, + bold: !!(flags & 2), + italic: !!(flags & 1), + items: [] + }; + i.parent.items.push(outlineItem); + obj = outlineDict.getRaw("First"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: outlineItem + }); + processed.put(obj); + } + obj = outlineDict.getRaw("Next"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: i.parent + }); + processed.put(obj); + } + } + return root.items.length > 0 ? root.items : null; + } + get permissions() { + let permissions = null; + try { + permissions = this._readPermissions(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read permissions."); + } + return shadow(this, "permissions", permissions); + } + _readPermissions() { + const encrypt = this.xref.trailer.get("Encrypt"); + if (!(encrypt instanceof Dict)) { + return null; + } + let flags = encrypt.get("P"); + if (typeof flags !== "number") { + return null; + } + flags += 2 ** 32; + const permissions = []; + for (const key in PermissionFlag) { + const value = PermissionFlag[key]; + if (flags & value) { + permissions.push(value); + } + } + return permissions; + } + get optionalContentConfig() { + let config = null; + try { + const properties = this._catDict.get("OCProperties"); + if (!properties) { + return shadow(this, "optionalContentConfig", null); + } + const defaultConfig = properties.get("D"); + if (!defaultConfig) { + return shadow(this, "optionalContentConfig", null); + } + const groupsData = properties.get("OCGs"); + if (!Array.isArray(groupsData)) { + return shadow(this, "optionalContentConfig", null); + } + const groupRefCache = new RefSetCache(); + for (const groupRef of groupsData) { + if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { + continue; + } + groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); + } + config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Unable to read optional content config: ${ex}`); + } + return shadow(this, "optionalContentConfig", config); + } + #readOptionalContentGroup(groupRef) { + const group = this.xref.fetch(groupRef); + const obj = { + id: groupRef.toString(), + name: null, + intent: null, + usage: { + print: null, + view: null + }, + rbGroups: [] + }; + const name = group.get("Name"); + if (typeof name === "string") { + obj.name = stringToPDFString(name); + } + let intent = group.getArray("Intent"); + if (!Array.isArray(intent)) { + intent = [intent]; + } + if (intent.every(i => i instanceof Name)) { + obj.intent = intent.map(i => i.name); + } + const usage = group.get("Usage"); + if (!(usage instanceof Dict)) { + return obj; + } + const usageObj = obj.usage; + const print = usage.get("Print"); + if (print instanceof Dict) { + const printState = print.get("PrintState"); + if (printState instanceof Name) { + switch (printState.name) { + case "ON": + case "OFF": + usageObj.print = { + printState: printState.name + }; + } + } + } + const view = usage.get("View"); + if (view instanceof Dict) { + const viewState = view.get("ViewState"); + if (viewState instanceof Name) { + switch (viewState.name) { + case "ON": + case "OFF": + usageObj.view = { + viewState: viewState.name + }; + } + } + } + return obj; + } + #readOptionalContentConfig(config, groupRefCache) { + function parseOnOff(refs) { + const onParsed = []; + if (Array.isArray(refs)) { + for (const value of refs) { + if (value instanceof Ref && groupRefCache.has(value)) { + onParsed.push(value.toString()); + } + } + } + return onParsed; + } + function parseOrder(refs, nestedLevels = 0) { + if (!Array.isArray(refs)) { + return null; + } + const order = []; + for (const value of refs) { + if (value instanceof Ref && groupRefCache.has(value)) { + parsedOrderRefs.put(value); + order.push(value.toString()); + continue; + } + const nestedOrder = parseNestedOrder(value, nestedLevels); + if (nestedOrder) { + order.push(nestedOrder); + } + } + if (nestedLevels > 0) { + return order; + } + const hiddenGroups = []; + for (const [groupRef] of groupRefCache.items()) { + if (parsedOrderRefs.has(groupRef)) { + continue; + } + hiddenGroups.push(groupRef.toString()); + } + if (hiddenGroups.length) { + order.push({ + name: null, + order: hiddenGroups + }); + } + return order; + } + function parseNestedOrder(ref, nestedLevels) { + if (++nestedLevels > MAX_NESTED_LEVELS) { + warn("parseNestedOrder - reached MAX_NESTED_LEVELS."); + return null; + } + const value = xref.fetchIfRef(ref); + if (!Array.isArray(value)) { + return null; + } + const nestedName = xref.fetchIfRef(value[0]); + if (typeof nestedName !== "string") { + return null; + } + const nestedOrder = parseOrder(value.slice(1), nestedLevels); + if (!nestedOrder?.length) { + return null; + } + return { + name: stringToPDFString(nestedName), + order: nestedOrder + }; + } + function parseRBGroups(rbGroups) { + if (!Array.isArray(rbGroups)) { + return; + } + for (const value of rbGroups) { + const rbGroup = xref.fetchIfRef(value); + if (!Array.isArray(rbGroup) || !rbGroup.length) { + continue; + } + const parsedRbGroup = new Set(); + for (const ref of rbGroup) { + if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) { + parsedRbGroup.add(ref.toString()); + groupRefCache.get(ref).rbGroups.push(parsedRbGroup); + } + } + } + } + const xref = this.xref, + parsedOrderRefs = new RefSet(), + MAX_NESTED_LEVELS = 10; + parseRBGroups(config.get("RBGroups")); + return { + name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null, + creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null, + baseState: config.get("BaseState") instanceof Name ? config.get("BaseState").name : null, + on: parseOnOff(config.get("ON")), + off: parseOnOff(config.get("OFF")), + order: parseOrder(config.get("Order")), + groups: [...groupRefCache] + }; + } + setActualNumPages(num = null) { + this._actualNumPages = num; + } + get hasActualNumPages() { + return this._actualNumPages !== null; + } + get _pagesCount() { + const obj = this.toplevelPagesDict.get("Count"); + if (!Number.isInteger(obj)) { + throw new FormatError("Page count in top-level pages dictionary is not an integer."); + } + return shadow(this, "_pagesCount", obj); + } + get numPages() { + return this.hasActualNumPages ? this._actualNumPages : this._pagesCount; + } + get destinations() { + const obj = this._readDests(), + dests = Object.create(null); + if (obj instanceof NameTree) { + for (const [key, value] of obj.getAll()) { + const dest = fetchDest(value); + if (dest) { + dests[stringToPDFString(key)] = dest; + } + } + } else if (obj instanceof Dict) { + for (const [key, value] of obj) { + const dest = fetchDest(value); + if (dest) { + dests[key] = dest; + } + } + } + return shadow(this, "destinations", dests); + } + getDestination(id) { + const obj = this._readDests(); + if (obj instanceof NameTree) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } + const allDest = this.destinations[id]; + if (allDest) { + warn(`Found "${id}" at an incorrect position in the NameTree.`); + return allDest; + } + } else if (obj instanceof Dict) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } + } + return null; + } + _readDests() { + const obj = this._catDict.get("Names"); + if (obj?.has("Dests")) { + return new NameTree(obj.getRaw("Dests"), this.xref); + } else if (this._catDict.has("Dests")) { + return this._catDict.get("Dests"); + } + return undefined; + } + get pageLabels() { + let obj = null; + try { + obj = this._readPageLabels(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read page labels."); + } + return shadow(this, "pageLabels", obj); + } + _readPageLabels() { + const obj = this._catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + const pageLabels = new Array(this.numPages); + let style = null, + prefix = ""; + const numberTree = new NumberTree(obj, this.xref); + const nums = numberTree.getAll(); + let currentLabel = "", + currentIndex = 1; + for (let i = 0, ii = this.numPages; i < ii; i++) { + const labelDict = nums.get(i); + if (labelDict !== undefined) { + if (!(labelDict instanceof Dict)) { + throw new FormatError("PageLabel is not a dictionary."); + } + if (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) { + throw new FormatError("Invalid type in PageLabel dictionary."); + } + if (labelDict.has("S")) { + const s = labelDict.get("S"); + if (!(s instanceof Name)) { + throw new FormatError("Invalid style in PageLabel dictionary."); + } + style = s.name; + } else { + style = null; + } + if (labelDict.has("P")) { + const p = labelDict.get("P"); + if (typeof p !== "string") { + throw new FormatError("Invalid prefix in PageLabel dictionary."); + } + prefix = stringToPDFString(p); + } else { + prefix = ""; + } + if (labelDict.has("St")) { + const st = labelDict.get("St"); + if (!(Number.isInteger(st) && st >= 1)) { + throw new FormatError("Invalid start in PageLabel dictionary."); + } + currentIndex = st; + } else { + currentIndex = 1; + } + } + switch (style) { + case "D": + currentLabel = currentIndex; + break; + case "R": + case "r": + currentLabel = toRomanNumerals(currentIndex, style === "r"); + break; + case "A": + case "a": + const LIMIT = 26; + const A_UPPER_CASE = 0x41, + A_LOWER_CASE = 0x61; + const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE; + const letterIndex = currentIndex - 1; + const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT); + currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); + break; + default: + if (style) { + throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`); + } + currentLabel = ""; + } + pageLabels[i] = prefix + currentLabel; + currentIndex++; + } + return pageLabels; + } + get pageLayout() { + const obj = this._catDict.get("PageLayout"); + let pageLayout = ""; + if (obj instanceof Name) { + switch (obj.name) { + case "SinglePage": + case "OneColumn": + case "TwoColumnLeft": + case "TwoColumnRight": + case "TwoPageLeft": + case "TwoPageRight": + pageLayout = obj.name; + } + } + return shadow(this, "pageLayout", pageLayout); + } + get pageMode() { + const obj = this._catDict.get("PageMode"); + let pageMode = "UseNone"; + if (obj instanceof Name) { + switch (obj.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "FullScreen": + case "UseOC": + case "UseAttachments": + pageMode = obj.name; + } + } + return shadow(this, "pageMode", pageMode); + } + get viewerPreferences() { + const obj = this._catDict.get("ViewerPreferences"); + if (!(obj instanceof Dict)) { + return shadow(this, "viewerPreferences", null); + } + let prefs = null; + for (const key of obj.getKeys()) { + const value = obj.get(key); + let prefValue; + switch (key) { + case "HideToolbar": + case "HideMenubar": + case "HideWindowUI": + case "FitWindow": + case "CenterWindow": + case "DisplayDocTitle": + case "PickTrayByPDFSize": + if (typeof value === "boolean") { + prefValue = value; + } + break; + case "NonFullScreenPageMode": + if (value instanceof Name) { + switch (value.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "UseOC": + prefValue = value.name; + break; + default: + prefValue = "UseNone"; + } + } + break; + case "Direction": + if (value instanceof Name) { + switch (value.name) { + case "L2R": + case "R2L": + prefValue = value.name; + break; + default: + prefValue = "L2R"; + } + } + break; + case "ViewArea": + case "ViewClip": + case "PrintArea": + case "PrintClip": + if (value instanceof Name) { + switch (value.name) { + case "MediaBox": + case "CropBox": + case "BleedBox": + case "TrimBox": + case "ArtBox": + prefValue = value.name; + break; + default: + prefValue = "CropBox"; + } + } + break; + case "PrintScaling": + if (value instanceof Name) { + switch (value.name) { + case "None": + case "AppDefault": + prefValue = value.name; + break; + default: + prefValue = "AppDefault"; + } + } + break; + case "Duplex": + if (value instanceof Name) { + switch (value.name) { + case "Simplex": + case "DuplexFlipShortEdge": + case "DuplexFlipLongEdge": + prefValue = value.name; + break; + default: + prefValue = "None"; + } + } + break; + case "PrintPageRange": + if (Array.isArray(value) && value.length % 2 === 0) { + const isValid = value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages); + if (isValid) { + prefValue = value; + } + } + break; + case "NumCopies": + if (Number.isInteger(value) && value > 0) { + prefValue = value; + } + break; + default: + warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`); + continue; + } + if (prefValue === undefined) { + warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); + continue; + } + if (!prefs) { + prefs = Object.create(null); + } + prefs[key] = prefValue; + } + return shadow(this, "viewerPreferences", prefs); + } + get openAction() { + const obj = this._catDict.get("OpenAction"); + const openAction = Object.create(null); + if (obj instanceof Dict) { + const destDict = new Dict(this.xref); + destDict.set("A", obj); + const resultObj = { + url: null, + dest: null, + action: null + }; + Catalog.parseDestDictionary({ + destDict, + resultObj + }); + if (Array.isArray(resultObj.dest)) { + openAction.dest = resultObj.dest; + } else if (resultObj.action) { + openAction.action = resultObj.action; + } + } else if (Array.isArray(obj)) { + openAction.dest = obj; + } + return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null); + } + get attachments() { + const obj = this._catDict.get("Names"); + let attachments = null; + if (obj instanceof Dict && obj.has("EmbeddedFiles")) { + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + for (const [key, value] of nameTree.getAll()) { + const fs = new FileSpec(value, this.xref); + if (!attachments) { + attachments = Object.create(null); + } + attachments[stringToPDFString(key)] = fs.serializable; + } + } + return shadow(this, "attachments", attachments); + } + get xfaImages() { + const obj = this._catDict.get("Names"); + let xfaImages = null; + if (obj instanceof Dict && obj.has("XFAImages")) { + const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); + for (const [key, value] of nameTree.getAll()) { + if (!xfaImages) { + xfaImages = new Dict(this.xref); + } + xfaImages.set(stringToPDFString(key), value); + } + } + return shadow(this, "xfaImages", xfaImages); + } + _collectJavaScript() { + const obj = this._catDict.get("Names"); + let javaScript = null; + function appendIfJavaScriptDict(name, jsDict) { + if (!(jsDict instanceof Dict)) { + return; + } + if (!isName(jsDict.get("S"), "JavaScript")) { + return; + } + let js = jsDict.get("JS"); + if (js instanceof BaseStream) { + js = js.getString(); + } else if (typeof js !== "string") { + return; + } + js = stringToPDFString(js).replaceAll("\x00", ""); + if (js) { + (javaScript ||= new Map()).set(name, js); + } + } + if (obj instanceof Dict && obj.has("JavaScript")) { + const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref); + for (const [key, value] of nameTree.getAll()) { + appendIfJavaScriptDict(stringToPDFString(key), value); + } + } + const openAction = this._catDict.get("OpenAction"); + if (openAction) { + appendIfJavaScriptDict("OpenAction", openAction); + } + return javaScript; + } + get jsActions() { + const javaScript = this._collectJavaScript(); + let actions = collectActions(this.xref, this._catDict, DocumentActionEventType); + if (javaScript) { + actions ||= Object.create(null); + for (const [key, val] of javaScript) { + if (key in actions) { + actions[key].push(val); + } else { + actions[key] = [val]; + } + } + } + return shadow(this, "jsActions", actions); + } + async fontFallback(id, handler) { + const translatedFonts = await Promise.all(this.fontCache); + for (const translatedFont of translatedFonts) { + if (translatedFont.loadedName === id) { + translatedFont.fallback(handler); + return; + } + } + } + async cleanup(manuallyTriggered = false) { + clearGlobalCaches(); + this.globalImageCache.clear(manuallyTriggered); + this.pageKidsCountCache.clear(); + this.pageIndexCache.clear(); + this.pageDictCache.clear(); + this.nonBlendModesSet.clear(); + const translatedFonts = await Promise.all(this.fontCache); + for (const { + dict + } of translatedFonts) { + delete dict.cacheKey; + } + this.fontCache.clear(); + this.builtInCMapCache.clear(); + this.standardFontDataCache.clear(); + this.systemFontCache.clear(); + } + async getPageDict(pageIndex) { + const nodesToVisit = [this.toplevelPagesDict]; + const visitedNodes = new RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof Ref) { + visitedNodes.put(pagesRef); + } + const xref = this.xref, + pageKidsCountCache = this.pageKidsCountCache, + pageIndexCache = this.pageIndexCache, + pageDictCache = this.pageDictCache; + let currentPageIndex = 0; + while (nodesToVisit.length) { + const currentNode = nodesToVisit.pop(); + if (currentNode instanceof Ref) { + const count = pageKidsCountCache.get(currentNode); + if (count >= 0 && currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + if (visitedNodes.has(currentNode)) { + throw new FormatError("Pages tree contains circular reference."); + } + visitedNodes.put(currentNode); + const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode)); + if (obj instanceof Dict) { + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !obj.has("Kids")) { + if (!pageKidsCountCache.has(currentNode)) { + pageKidsCountCache.put(currentNode, 1); + } + if (!pageIndexCache.has(currentNode)) { + pageIndexCache.put(currentNode, currentPageIndex); + } + if (currentPageIndex === pageIndex) { + return [obj, currentNode]; + } + currentPageIndex++; + continue; + } + } + nodesToVisit.push(obj); + continue; + } + if (!(currentNode instanceof Dict)) { + throw new FormatError("Page dictionary kid reference points to wrong type of object."); + } + const { + objId + } = currentNode; + let count = currentNode.getRaw("Count"); + if (count instanceof Ref) { + count = await xref.fetchAsync(count); + } + if (Number.isInteger(count) && count >= 0) { + if (objId && !pageKidsCountCache.has(objId)) { + pageKidsCountCache.put(objId, count); + } + if (currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + } + let kids = currentNode.getRaw("Kids"); + if (kids instanceof Ref) { + kids = await xref.fetchAsync(kids); + } + if (!Array.isArray(kids)) { + let type = currentNode.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !currentNode.has("Kids")) { + if (currentPageIndex === pageIndex) { + return [currentNode, null]; + } + currentPageIndex++; + continue; + } + throw new FormatError("Page dictionary kids object is not an array."); + } + for (let last = kids.length - 1; last >= 0; last--) { + const lastKid = kids[last]; + nodesToVisit.push(lastKid); + if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) { + pageDictCache.put(lastKid, xref.fetchAsync(lastKid)); + } + } + } + throw new Error(`Page index ${pageIndex} not found.`); + } + async getAllPageDicts(recoveryMode = false) { + const { + ignoreErrors + } = this.pdfManager.evaluatorOptions; + const queue = [{ + currentNode: this.toplevelPagesDict, + posInKids: 0 + }]; + const visitedNodes = new RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof Ref) { + visitedNodes.put(pagesRef); + } + const map = new Map(), + xref = this.xref, + pageIndexCache = this.pageIndexCache; + let pageIndex = 0; + function addPageDict(pageDict, pageRef) { + if (pageRef && !pageIndexCache.has(pageRef)) { + pageIndexCache.put(pageRef, pageIndex); + } + map.set(pageIndex++, [pageDict, pageRef]); + } + function addPageError(error) { + if (error instanceof XRefEntryException && !recoveryMode) { + throw error; + } + if (recoveryMode && ignoreErrors && pageIndex === 0) { + warn(`getAllPageDicts - Skipping invalid first page: "${error}".`); + error = Dict.empty; + } + map.set(pageIndex++, [error, null]); + } + while (queue.length > 0) { + const queueItem = queue.at(-1); + const { + currentNode, + posInKids + } = queueItem; + let kids = currentNode.getRaw("Kids"); + if (kids instanceof Ref) { + try { + kids = await xref.fetchAsync(kids); + } catch (ex) { + addPageError(ex); + break; + } + } + if (!Array.isArray(kids)) { + addPageError(new FormatError("Page dictionary kids object is not an array.")); + break; + } + if (posInKids >= kids.length) { + queue.pop(); + continue; + } + const kidObj = kids[posInKids]; + let obj; + if (kidObj instanceof Ref) { + if (visitedNodes.has(kidObj)) { + addPageError(new FormatError("Pages tree contains circular reference.")); + break; + } + visitedNodes.put(kidObj); + try { + obj = await xref.fetchAsync(kidObj); + } catch (ex) { + addPageError(ex); + break; + } + } else { + obj = kidObj; + } + if (!(obj instanceof Dict)) { + addPageError(new FormatError("Page dictionary kid reference points to wrong type of object.")); + break; + } + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + try { + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); + break; + } + } + if (isName(type, "Page") || !obj.has("Kids")) { + addPageDict(obj, kidObj instanceof Ref ? kidObj : null); + } else { + queue.push({ + currentNode: obj, + posInKids: 0 + }); + } + queueItem.posInKids++; + } + return map; + } + getPageIndex(pageRef) { + const cachedPageIndex = this.pageIndexCache.get(pageRef); + if (cachedPageIndex !== undefined) { + return Promise.resolve(cachedPageIndex); + } + const xref = this.xref; + function pagesBeforeRef(kidRef) { + let total = 0, + parentRef; + return xref.fetchAsync(kidRef).then(function (node) { + if (isRefsEqual(kidRef, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) { + throw new FormatError("The reference does not point to a /Page dictionary."); + } + if (!node) { + return null; + } + if (!(node instanceof Dict)) { + throw new FormatError("Node must be a dictionary."); + } + parentRef = node.getRaw("Parent"); + return node.getAsync("Parent"); + }).then(function (parent) { + if (!parent) { + return null; + } + if (!(parent instanceof Dict)) { + throw new FormatError("Parent must be a dictionary."); + } + return parent.getAsync("Kids"); + }).then(function (kids) { + if (!kids) { + return null; + } + const kidPromises = []; + let found = false; + for (const kid of kids) { + if (!(kid instanceof Ref)) { + throw new FormatError("Kid must be a reference."); + } + if (isRefsEqual(kid, kidRef)) { + found = true; + break; + } + kidPromises.push(xref.fetchAsync(kid).then(function (obj) { + if (!(obj instanceof Dict)) { + throw new FormatError("Kid node must be a dictionary."); + } + if (obj.has("Count")) { + total += obj.get("Count"); + } else { + total++; + } + })); + } + if (!found) { + throw new FormatError("Kid reference not found in parent's kids."); + } + return Promise.all(kidPromises).then(function () { + return [total, parentRef]; + }); + }); + } + let total = 0; + const next = ref => pagesBeforeRef(ref).then(args => { + if (!args) { + this.pageIndexCache.put(pageRef, total); + return total; + } + const [count, parentRef] = args; + total += count; + return next(parentRef); + }); + return next(pageRef); + } + get baseUrl() { + const uri = this._catDict.get("URI"); + if (uri instanceof Dict) { + const base = uri.get("Base"); + if (typeof base === "string") { + const absoluteUrl = createValidAbsoluteUrl(base, null, { + tryConvertEncoding: true + }); + if (absoluteUrl) { + return shadow(this, "baseUrl", absoluteUrl.href); + } + } + } + return shadow(this, "baseUrl", this.pdfManager.docBaseUrl); + } + static parseDestDictionary({ + destDict, + resultObj, + docBaseUrl = null, + docAttachments = null + }) { + if (!(destDict instanceof Dict)) { + warn("parseDestDictionary: `destDict` must be a dictionary."); + return; + } + let action = destDict.get("A"), + url, + dest; + if (!(action instanceof Dict)) { + if (destDict.has("Dest")) { + action = destDict.get("Dest"); + } else { + action = destDict.get("AA"); + if (action instanceof Dict) { + if (action.has("D")) { + action = action.get("D"); + } else if (action.has("U")) { + action = action.get("U"); + } + } + } + } + if (action instanceof Dict) { + const actionType = action.get("S"); + if (!(actionType instanceof Name)) { + warn("parseDestDictionary: Invalid type in Action dictionary."); + return; + } + const actionName = actionType.name; + switch (actionName) { + case "ResetForm": + const flags = action.get("Flags"); + const include = ((typeof flags === "number" ? flags : 0) & 1) === 0; + const fields = []; + const refs = []; + for (const obj of action.get("Fields") || []) { + if (obj instanceof Ref) { + refs.push(obj.toString()); + } else if (typeof obj === "string") { + fields.push(stringToPDFString(obj)); + } + } + resultObj.resetForm = { + fields, + refs, + include + }; + break; + case "URI": + url = action.get("URI"); + if (url instanceof Name) { + url = "/" + url.name; + } + break; + case "GoTo": + dest = action.get("D"); + break; + case "Launch": + case "GoToR": + const urlDict = action.get("F"); + if (urlDict instanceof Dict) { + const fs = new FileSpec(urlDict, null, true); + const { + rawFilename + } = fs.serializable; + url = rawFilename; + } else if (typeof urlDict === "string") { + url = urlDict; + } + const remoteDest = fetchRemoteDest(action); + if (remoteDest && typeof url === "string") { + url = url.split("#", 1)[0] + "#" + remoteDest; + } + const newWindow = action.get("NewWindow"); + if (typeof newWindow === "boolean") { + resultObj.newWindow = newWindow; + } + break; + case "GoToE": + const target = action.get("T"); + let attachment; + if (docAttachments && target instanceof Dict) { + const relationship = target.get("R"); + const name = target.get("N"); + if (isName(relationship, "C") && typeof name === "string") { + attachment = docAttachments[stringToPDFString(name)]; + } + } + if (attachment) { + resultObj.attachment = attachment; + const attachmentDest = fetchRemoteDest(action); + if (attachmentDest) { + resultObj.attachmentDest = attachmentDest; + } + } else { + warn(`parseDestDictionary - unimplemented "GoToE" action.`); + } + break; + case "Named": + const namedAction = action.get("N"); + if (namedAction instanceof Name) { + resultObj.action = namedAction.name; + } + break; + case "SetOCGState": + const state = action.get("State"); + const preserveRB = action.get("PreserveRB"); + if (!Array.isArray(state) || state.length === 0) { + break; + } + const stateArr = []; + for (const elem of state) { + if (elem instanceof Name) { + switch (elem.name) { + case "ON": + case "OFF": + case "Toggle": + stateArr.push(elem.name); + break; + } + } else if (elem instanceof Ref) { + stateArr.push(elem.toString()); + } + } + if (stateArr.length !== state.length) { + break; + } + resultObj.setOCGState = { + state: stateArr, + preserveRB: typeof preserveRB === "boolean" ? preserveRB : true + }; + break; + case "JavaScript": + const jsAction = action.get("JS"); + let js; + if (jsAction instanceof BaseStream) { + js = jsAction.getString(); + } else if (typeof jsAction === "string") { + js = jsAction; + } + const jsURL = js && recoverJsURL(stringToPDFString(js)); + if (jsURL) { + url = jsURL.url; + resultObj.newWindow = jsURL.newWindow; + break; + } + default: + if (actionName === "JavaScript" || actionName === "SubmitForm") { + break; + } + warn(`parseDestDictionary - unsupported action: "${actionName}".`); + break; + } + } else if (destDict.has("Dest")) { + dest = destDict.get("Dest"); + } + if (typeof url === "string") { + const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, { + addDefaultProtocol: true, + tryConvertEncoding: true + }); + if (absoluteUrl) { + resultObj.url = absoluteUrl.href; + } + resultObj.unsafeUrl = url; + } + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + resultObj.dest = stringToPDFString(dest); + } else if (isValidExplicitDest(dest)) { + resultObj.dest = dest; + } + } + } +} + +;// ./src/core/object_loader.js + + + + +function mayHaveChildren(value) { + return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value); +} +function addChildren(node, nodesToVisit) { + if (node instanceof Dict) { + node = node.getRawValues(); + } else if (node instanceof BaseStream) { + node = node.dict.getRawValues(); + } else if (!Array.isArray(node)) { + return; + } + for (const rawValue of node) { + if (mayHaveChildren(rawValue)) { + nodesToVisit.push(rawValue); + } + } +} +class ObjectLoader { + constructor(dict, keys, xref) { + this.dict = dict; + this.keys = keys; + this.xref = xref; + this.refSet = null; + } + async load() { + if (this.xref.stream.isDataLoaded) { + return undefined; + } + const { + keys, + dict + } = this; + this.refSet = new RefSet(); + const nodesToVisit = []; + for (const key of keys) { + const rawValue = dict.getRaw(key); + if (rawValue !== undefined) { + nodesToVisit.push(rawValue); + } + } + return this._walk(nodesToVisit); + } + async _walk(nodesToVisit) { + const nodesToRevisit = []; + const pendingRequests = []; + while (nodesToVisit.length) { + let currentNode = nodesToVisit.pop(); + if (currentNode instanceof Ref) { + if (this.refSet.has(currentNode)) { + continue; + } + try { + this.refSet.put(currentNode); + currentNode = this.xref.fetch(currentNode); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + warn(`ObjectLoader._walk - requesting all data: "${ex}".`); + this.refSet = null; + const { + manager + } = this.xref.stream; + return manager.requestAllChunks(); + } + nodesToRevisit.push(currentNode); + pendingRequests.push({ + begin: ex.begin, + end: ex.end + }); + } + } + if (currentNode instanceof BaseStream) { + const baseStreams = currentNode.getBaseStreams(); + if (baseStreams) { + let foundMissingData = false; + for (const stream of baseStreams) { + if (stream.isDataLoaded) { + continue; + } + foundMissingData = true; + pendingRequests.push({ + begin: stream.start, + end: stream.end + }); + } + if (foundMissingData) { + nodesToRevisit.push(currentNode); + } + } + } + addChildren(currentNode, nodesToVisit); + } + if (pendingRequests.length) { + await this.xref.stream.manager.requestRanges(pendingRequests); + for (const node of nodesToRevisit) { + if (node instanceof Ref) { + this.refSet.remove(node); + } + } + return this._walk(nodesToRevisit); + } + this.refSet = null; + return undefined; + } +} + +;// ./src/core/xfa/symbol_utils.js +const $acceptWhitespace = Symbol(); +const $addHTML = Symbol(); +const $appendChild = Symbol(); +const $childrenToHTML = Symbol(); +const $clean = Symbol(); +const $cleanPage = Symbol(); +const $cleanup = Symbol(); +const $clone = Symbol(); +const $consumed = Symbol(); +const $content = Symbol("content"); +const $data = Symbol("data"); +const $dump = Symbol(); +const $extra = Symbol("extra"); +const $finalize = Symbol(); +const $flushHTML = Symbol(); +const $getAttributeIt = Symbol(); +const $getAttributes = Symbol(); +const $getAvailableSpace = Symbol(); +const $getChildrenByClass = Symbol(); +const $getChildrenByName = Symbol(); +const $getChildrenByNameIt = Symbol(); +const $getDataValue = Symbol(); +const $getExtra = Symbol(); +const $getRealChildrenByNameIt = Symbol(); +const $getChildren = Symbol(); +const $getContainedChildren = Symbol(); +const $getNextPage = Symbol(); +const $getSubformParent = Symbol(); +const $getParent = Symbol(); +const $getTemplateRoot = Symbol(); +const $globalData = Symbol(); +const $hasSettableValue = Symbol(); +const $ids = Symbol(); +const $indexOf = Symbol(); +const $insertAt = Symbol(); +const $isCDATAXml = Symbol(); +const $isBindable = Symbol(); +const $isDataValue = Symbol(); +const $isDescendent = Symbol(); +const $isNsAgnostic = Symbol(); +const $isSplittable = Symbol(); +const $isThereMoreWidth = Symbol(); +const $isTransparent = Symbol(); +const $isUsable = Symbol(); +const $lastAttribute = Symbol(); +const $namespaceId = Symbol("namespaceId"); +const $nodeName = Symbol("nodeName"); +const $nsAttributes = Symbol(); +const $onChild = Symbol(); +const $onChildCheck = Symbol(); +const $onText = Symbol(); +const $pushGlyphs = Symbol(); +const $popPara = Symbol(); +const $pushPara = Symbol(); +const $removeChild = Symbol(); +const $root = Symbol("root"); +const $resolvePrototypes = Symbol(); +const $searchNode = Symbol(); +const $setId = Symbol(); +const $setSetAttributes = Symbol(); +const $setValue = Symbol(); +const $tabIndex = Symbol(); +const $text = Symbol(); +const $toPages = Symbol(); +const $toHTML = Symbol(); +const $toString = Symbol(); +const $toStyle = Symbol(); +const $uid = Symbol("uid"); + +;// ./src/core/xfa/namespaces.js +const $buildXFAObject = Symbol(); +const NamespaceIds = { + config: { + id: 0, + check: ns => ns.startsWith("http://www.xfa.org/schema/xci/") + }, + connectionSet: { + id: 1, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/") + }, + datasets: { + id: 2, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/") + }, + form: { + id: 3, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/") + }, + localeSet: { + id: 4, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/") + }, + pdf: { + id: 5, + check: ns => ns === "http://ns.adobe.com/xdp/pdf/" + }, + signature: { + id: 6, + check: ns => ns === "http://www.w3.org/2000/09/xmldsig#" + }, + sourceSet: { + id: 7, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/") + }, + stylesheet: { + id: 8, + check: ns => ns === "http://www.w3.org/1999/XSL/Transform" + }, + template: { + id: 9, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/") + }, + xdc: { + id: 10, + check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/") + }, + xdp: { + id: 11, + check: ns => ns === "http://ns.adobe.com/xdp/" + }, + xfdf: { + id: 12, + check: ns => ns === "http://ns.adobe.com/xfdf/" + }, + xhtml: { + id: 13, + check: ns => ns === "http://www.w3.org/1999/xhtml" + }, + xmpmeta: { + id: 14, + check: ns => ns === "http://ns.adobe.com/xmpmeta/" + } +}; + +;// ./src/core/xfa/utils.js + +const dimConverters = { + pt: x => x, + cm: x => x / 2.54 * 72, + mm: x => x / (10 * 2.54) * 72, + in: x => x * 72, + px: x => x +}; +const measurementPattern = /([+-]?\d+\.?\d*)(.*)/; +function stripQuotes(str) { + if (str.startsWith("'") || str.startsWith('"')) { + return str.slice(1, -1); + } + return str; +} +function getInteger({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseInt(data, 10); + if (!isNaN(n) && validate(n)) { + return n; + } + return defaultValue; +} +function getFloat({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseFloat(data); + if (!isNaN(n) && validate(n)) { + return n; + } + return defaultValue; +} +function getKeyword({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + if (validate(data)) { + return data; + } + return defaultValue; +} +function getStringOption(data, options) { + return getKeyword({ + data, + defaultValue: options[0], + validate: k => options.includes(k) + }); +} +function getMeasurement(str, def = "0") { + def ||= "0"; + if (!str) { + return getMeasurement(def); + } + const match = str.trim().match(measurementPattern); + if (!match) { + return getMeasurement(def); + } + const [, valueStr, unit] = match; + const value = parseFloat(valueStr); + if (isNaN(value)) { + return getMeasurement(def); + } + if (value === 0) { + return 0; + } + const conv = dimConverters[unit]; + if (conv) { + return conv(value); + } + return value; +} +function getRatio(data) { + if (!data) { + return { + num: 1, + den: 1 + }; + } + const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x)); + if (ratio.length === 1) { + ratio.push(1); + } + if (ratio.length === 0) { + return { + num: 1, + den: 1 + }; + } + const [num, den] = ratio; + return { + num, + den + }; +} +function getRelevant(data) { + if (!data) { + return []; + } + return data.trim().split(/\s+/).map(e => ({ + excluded: e[0] === "-", + viewname: e.substring(1) + })); +} +function getColor(data, def = [0, 0, 0]) { + let [r, g, b] = def; + if (!data) { + return { + r, + g, + b + }; + } + const color = data.trim().split(/\s*,\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 255)).map(c => isNaN(c) ? 0 : c); + if (color.length < 3) { + return { + r, + g, + b + }; + } + [r, g, b] = color; + return { + r, + g, + b + }; +} +function getBBox(data) { + const def = -1; + if (!data) { + return { + x: def, + y: def, + width: def, + height: def + }; + } + const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1")); + if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) { + return { + x: def, + y: def, + width: def, + height: def + }; + } + const [x, y, width, height] = bbox; + return { + x, + y, + width, + height + }; +} +class HTMLResult { + static get FAILURE() { + return shadow(this, "FAILURE", new HTMLResult(false, null, null, null)); + } + static get EMPTY() { + return shadow(this, "EMPTY", new HTMLResult(true, null, null, null)); + } + constructor(success, html, bbox, breakNode) { + this.success = success; + this.html = html; + this.bbox = bbox; + this.breakNode = breakNode; + } + isBreak() { + return !!this.breakNode; + } + static breakNode(node) { + return new HTMLResult(false, null, null, node); + } + static success(html, bbox = null) { + return new HTMLResult(true, html, bbox, null); + } +} + +;// ./src/core/xfa/fonts.js + + + +class FontFinder { + constructor(pdfFonts) { + this.fonts = new Map(); + this.cache = new Map(); + this.warned = new Set(); + this.defaultFont = null; + this.add(pdfFonts); + } + add(pdfFonts, reallyMissingFonts = null) { + for (const pdfFont of pdfFonts) { + this.addPdfFont(pdfFont); + } + for (const pdfFont of this.fonts.values()) { + if (!pdfFont.regular) { + pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic; + } + } + if (!reallyMissingFonts || reallyMissingFonts.size === 0) { + return; + } + const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); + for (const missing of reallyMissingFonts) { + this.fonts.set(missing, myriad); + } + } + addPdfFont(pdfFont) { + const cssFontInfo = pdfFont.cssFontInfo; + const name = cssFontInfo.fontFamily; + let font = this.fonts.get(name); + if (!font) { + font = Object.create(null); + this.fonts.set(name, font); + if (!this.defaultFont) { + this.defaultFont = font; + } + } + let property = ""; + const fontWeight = parseFloat(cssFontInfo.fontWeight); + if (parseFloat(cssFontInfo.italicAngle) !== 0) { + property = fontWeight >= 700 ? "bolditalic" : "italic"; + } else if (fontWeight >= 700) { + property = "bold"; + } + if (!property) { + if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) { + property = "bold"; + } + if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) { + property += "italic"; + } + } + if (!property) { + property = "regular"; + } + font[property] = pdfFont; + } + getDefault() { + return this.defaultFont; + } + find(fontName, mustWarn = true) { + let font = this.fonts.get(fontName) || this.cache.get(fontName); + if (font) { + return font; + } + const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; + let name = fontName.replaceAll(pattern, ""); + font = this.fonts.get(name); + if (font) { + this.cache.set(fontName, font); + return font; + } + name = name.toLowerCase(); + const maybe = []; + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + if (maybe.length === 0) { + for (const [, pdfFont] of this.fonts.entries()) { + if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + name = name.replaceAll(/psmt|mt/gi, ""); + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + for (const pdfFont of this.fonts.values()) { + if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length >= 1) { + if (maybe.length !== 1 && mustWarn) { + warn(`XFA - Too many choices to guess the correct font: ${fontName}`); + } + this.cache.set(fontName, maybe[0]); + return maybe[0]; + } + if (mustWarn && !this.warned.has(fontName)) { + this.warned.add(fontName); + warn(`XFA - Cannot find the font: ${fontName}`); + } + return null; + } +} +function selectFont(xfaFont, typeface) { + if (xfaFont.posture === "italic") { + if (xfaFont.weight === "bold") { + return typeface.bolditalic; + } + return typeface.italic; + } else if (xfaFont.weight === "bold") { + return typeface.bold; + } + return typeface.regular; +} +function fonts_getMetrics(xfaFont, real = false) { + let pdfFont = null; + if (xfaFont) { + const name = stripQuotes(xfaFont.typeface); + const typeface = xfaFont[$globalData].fontFinder.find(name); + pdfFont = selectFont(xfaFont, typeface); + } + if (!pdfFont) { + return { + lineHeight: 12, + lineGap: 2, + lineNoGap: 10 + }; + } + const size = xfaFont.size || 10; + const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + return { + lineHeight: lineHeight * size, + lineGap: lineGap * size, + lineNoGap: Math.max(1, lineHeight - lineGap) * size + }; +} + +;// ./src/core/xfa/text.js + +const WIDTH_FACTOR = 1.02; +class FontInfo { + constructor(xfaFont, margin, lineHeight, fontFinder) { + this.lineHeight = lineHeight; + this.paraMargin = margin || { + top: 0, + bottom: 0, + left: 0, + right: 0 + }; + if (!xfaFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.xfaFont = { + typeface: xfaFont.typeface, + posture: xfaFont.posture, + weight: xfaFont.weight, + size: xfaFont.size, + letterSpacing: xfaFont.letterSpacing + }; + const typeface = fontFinder.find(xfaFont.typeface); + if (!typeface) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.pdfFont = selectFont(xfaFont, typeface); + if (!this.pdfFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + } + } + defaultFont(fontFinder) { + const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault(); + if (font?.regular) { + const pdfFont = font.regular; + const info = pdfFont.cssFontInfo; + const xfaFont = { + typeface: info.fontFamily, + posture: "normal", + weight: "normal", + size: 10, + letterSpacing: 0 + }; + return [pdfFont, xfaFont]; + } + const xfaFont = { + typeface: "Courier", + posture: "normal", + weight: "normal", + size: 10, + letterSpacing: 0 + }; + return [null, xfaFont]; + } +} +class FontSelector { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) { + this.fontFinder = fontFinder; + this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)]; + } + pushData(xfaFont, margin, lineHeight) { + const lastFont = this.stack.at(-1); + for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { + if (!xfaFont[name]) { + xfaFont[name] = lastFont.xfaFont[name]; + } + } + for (const name of ["top", "bottom", "left", "right"]) { + if (isNaN(margin[name])) { + margin[name] = lastFont.paraMargin[name]; + } + } + const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder); + if (!fontInfo.pdfFont) { + fontInfo.pdfFont = lastFont.pdfFont; + } + this.stack.push(fontInfo); + } + popFont() { + this.stack.pop(); + } + topFont() { + return this.stack.at(-1); + } +} +class TextMeasure { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { + this.glyphs = []; + this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts); + this.extraHeight = 0; + } + pushData(xfaFont, margin, lineHeight) { + this.fontSelector.pushData(xfaFont, margin, lineHeight); + } + popFont(xfaFont) { + return this.fontSelector.popFont(); + } + addPara() { + const lastFont = this.fontSelector.topFont(); + this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; + } + addString(str) { + if (!str) { + return; + } + const lastFont = this.fontSelector.topFont(); + const fontSize = lastFont.xfaFont.size; + if (lastFont.pdfFont) { + const letterSpacing = lastFont.xfaFont.letterSpacing; + const pdfFont = lastFont.pdfFont; + const fontLineHeight = pdfFont.lineHeight || 1.2; + const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + const noGap = fontLineHeight - lineGap; + const firstLineHeight = Math.max(1, noGap) * fontSize; + const scale = fontSize / 1000; + const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width; + for (const line of str.split(/[\u2029\n]/)) { + const encodedLine = pdfFont.encodeString(line).join(""); + const glyphs = pdfFont.charsToGlyphs(encodedLine); + for (const glyph of glyphs) { + const width = glyph.width || fallbackWidth; + this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]); + } + this.glyphs.push([0, 0, 0, "\n", true]); + } + this.glyphs.pop(); + return; + } + for (const line of str.split(/[\u2029\n]/)) { + for (const char of line.split("")) { + this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]); + } + this.glyphs.push([0, 0, 0, "\n", true]); + } + this.glyphs.pop(); + } + compute(maxWidth) { + let lastSpacePos = -1, + lastSpaceWidth = 0, + width = 0, + height = 0, + currentLineWidth = 0, + currentLineHeight = 0; + let isBroken = false; + let isFirstLine = true; + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i]; + const isSpace = char === " "; + const glyphHeight = isFirstLine ? firstLineHeight : lineHeight; + if (isEOL) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isFirstLine = false; + continue; + } + if (isSpace) { + if (currentLineWidth + glyphWidth > maxWidth) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isBroken = true; + isFirstLine = false; + } else { + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + lastSpaceWidth = currentLineWidth; + currentLineWidth += glyphWidth; + lastSpacePos = i; + } + continue; + } + if (currentLineWidth + glyphWidth > maxWidth) { + height += currentLineHeight; + currentLineHeight = glyphHeight; + if (lastSpacePos !== -1) { + i = lastSpacePos; + width = Math.max(width, lastSpaceWidth); + currentLineWidth = 0; + lastSpacePos = -1; + lastSpaceWidth = 0; + } else { + width = Math.max(width, currentLineWidth); + currentLineWidth = glyphWidth; + } + isBroken = true; + isFirstLine = false; + continue; + } + currentLineWidth += glyphWidth; + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + } + width = Math.max(width, currentLineWidth); + height += currentLineHeight + this.extraHeight; + return { + width: WIDTH_FACTOR * width, + height, + isBroken + }; + } +} + +;// ./src/core/xfa/som.js + + +const namePattern = /^[^.[]+/; +const indexPattern = /^[^\]]+/; +const operators = { + dot: 0, + dotDot: 1, + dotHash: 2, + dotBracket: 3, + dotParen: 4 +}; +const shortcuts = new Map([["$data", (root, current) => root.datasets ? root.datasets.data : root], ["$record", (root, current) => (root.datasets ? root.datasets.data : root)[$getChildren]()[0]], ["$template", (root, current) => root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], ["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, current) => current]]); +const somCache = new WeakMap(); +function parseIndex(index) { + index = index.trim(); + if (index === "*") { + return Infinity; + } + return parseInt(index, 10) || 0; +} +function parseExpression(expr, dotDotAllowed, noExpr = true) { + let match = expr.match(namePattern); + if (!match) { + return null; + } + let [name] = match; + const parsed = [{ + name, + cacheName: "." + name, + index: 0, + js: null, + formCalc: null, + operator: operators.dot + }]; + let pos = name.length; + while (pos < expr.length) { + const spos = pos; + const char = expr.charAt(pos++); + if (char === "[") { + match = expr.slice(pos).match(indexPattern); + if (!match) { + warn("XFA - Invalid index in SOM expression"); + return null; + } + parsed.at(-1).index = parseIndex(match[0]); + pos += match[0].length + 1; + continue; + } + let operator; + switch (expr.charAt(pos)) { + case ".": + if (!dotDotAllowed) { + return null; + } + pos++; + operator = operators.dotDot; + break; + case "#": + pos++; + operator = operators.dotHash; + break; + case "[": + if (noExpr) { + warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now."); + return null; + } + operator = operators.dotBracket; + break; + case "(": + if (noExpr) { + warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now."); + return null; + } + operator = operators.dotParen; + break; + default: + operator = operators.dot; + break; + } + match = expr.slice(pos).match(namePattern); + if (!match) { + break; + } + [name] = match; + pos += name.length; + parsed.push({ + name, + cacheName: expr.slice(spos, pos), + operator, + index: 0, + js: null, + formCalc: null + }); + } + return parsed; +} +function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) { + const parsed = parseExpression(expr, dotDotAllowed); + if (!parsed) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + let isQualified; + if (fn) { + isQualified = true; + root = [fn(root, container)]; + i = 1; + } else { + isQualified = container === null; + root = [container || root]; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + cacheName, + operator, + index + } = parsed[i]; + const nodes = []; + for (const node of root) { + if (!node.isXFAObject) { + continue; + } + let children, cached; + if (useCache) { + cached = somCache.get(node); + if (!cached) { + cached = new Map(); + somCache.set(node, cached); + } + children = cached.get(cacheName); + } + if (!children) { + switch (operator) { + case operators.dot: + children = node[$getChildrenByName](name, false); + break; + case operators.dotDot: + children = node[$getChildrenByName](name, true); + break; + case operators.dotHash: + children = node[$getChildrenByClass](name); + children = children.isXFAObjectArray ? children.children : [children]; + break; + default: + break; + } + if (useCache) { + cached.set(cacheName, children); + } + } + if (children.length > 0) { + nodes.push(children); + } + } + if (nodes.length === 0 && !isQualified && i === 0) { + const parent = container[$getParent](); + container = parent; + if (!container) { + return null; + } + i = -1; + root = [container]; + continue; + } + root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat(); + } + if (root.length === 0) { + return null; + } + return root; +} +function createDataNode(root, container, expr) { + const parsed = parseExpression(expr); + if (!parsed) { + return null; + } + if (parsed.some(x => x.operator === operators.dotDot)) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + if (fn) { + root = fn(root, container); + i = 1; + } else { + root = container || root; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + operator, + index + } = parsed[i]; + if (!isFinite(index)) { + parsed[i].index = 0; + return root.createNodes(parsed.slice(i)); + } + let children; + switch (operator) { + case operators.dot: + children = root[$getChildrenByName](name, false); + break; + case operators.dotDot: + children = root[$getChildrenByName](name, true); + break; + case operators.dotHash: + children = root[$getChildrenByClass](name); + children = children.isXFAObjectArray ? children.children : [children]; + break; + default: + break; + } + if (children.length === 0) { + return root.createNodes(parsed.slice(i)); + } + if (index < children.length) { + const child = children[index]; + if (!child.isXFAObject) { + warn(`XFA - Cannot create a node.`); + return null; + } + root = child; + } else { + parsed[i].index = index - children.length; + return root.createNodes(parsed.slice(i)); + } + } + return null; +} + +;// ./src/core/xfa/xfa_object.js + + + + + + +const _applyPrototype = Symbol(); +const _attributes = Symbol(); +const _attributeNames = Symbol(); +const _children = Symbol("_children"); +const _cloneAttribute = Symbol(); +const _dataValue = Symbol(); +const _defaultValue = Symbol(); +const _filteredChildrenGenerator = Symbol(); +const _getPrototype = Symbol(); +const _getUnsetAttributes = Symbol(); +const _hasChildren = Symbol(); +const _max = Symbol(); +const _options = Symbol(); +const _parent = Symbol("parent"); +const _resolvePrototypesHelper = Symbol(); +const _setAttributes = Symbol(); +const _validator = Symbol(); +let uid = 0; +const NS_DATASETS = NamespaceIds.datasets.id; +class XFAObject { + constructor(nsId, name, hasChildren = false) { + this[$namespaceId] = nsId; + this[$nodeName] = name; + this[_hasChildren] = hasChildren; + this[_parent] = null; + this[_children] = []; + this[$uid] = `${name}${uid++}`; + this[$globalData] = null; + } + get isXFAObject() { + return true; + } + get isXFAObjectArray() { + return false; + } + createNodes(path) { + let root = this, + node = null; + for (const { + name, + index + } of path) { + for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) { + const nsId = root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId]; + node = new XmlObject(nsId, name); + root[$appendChild](node); + } + root = node; + } + return node; + } + [$onChild](child) { + if (!this[_hasChildren] || !this[$onChildCheck](child)) { + return false; + } + const name = child[$nodeName]; + const node = this[name]; + if (node instanceof XFAObjectArray) { + if (node.push(child)) { + this[$appendChild](child); + return true; + } + } else { + if (node !== null) { + this[$removeChild](node); + } + this[name] = child; + this[$appendChild](child); + return true; + } + let id = ""; + if (this.id) { + id = ` (id: ${this.id})`; + } else if (this.name) { + id = ` (name: ${this.name} ${this.h.value})`; + } + warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); + return false; + } + [$onChildCheck](child) { + return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; + } + [$isNsAgnostic]() { + return false; + } + [$acceptWhitespace]() { + return false; + } + [$isCDATAXml]() { + return false; + } + [$isBindable]() { + return false; + } + [$popPara]() { + if (this.para) { + this[$getTemplateRoot]()[$extra].paraStack.pop(); + } + } + [$pushPara]() { + this[$getTemplateRoot]()[$extra].paraStack.push(this.para); + } + [$setId](ids) { + if (this.id && this[$namespaceId] === NamespaceIds.template.id) { + ids.set(this.id, this); + } + } + [$getTemplateRoot]() { + return this[$globalData].template; + } + [$isSplittable]() { + return false; + } + [$isThereMoreWidth]() { + return false; + } + [$appendChild](child) { + child[_parent] = this; + this[_children].push(child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$removeChild](child) { + const i = this[_children].indexOf(child); + this[_children].splice(i, 1); + } + [$hasSettableValue]() { + return this.hasOwnProperty("value"); + } + [$setValue](_) {} + [$onText](_) {} + [$finalize]() {} + [$clean](builder) { + delete this[_hasChildren]; + if (this[$cleanup]) { + builder.clean(this[$cleanup]); + delete this[$cleanup]; + } + } + [$indexOf](child) { + return this[_children].indexOf(child); + } + [$insertAt](i, child) { + child[_parent] = this; + this[_children].splice(i, 0, child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$isTransparent]() { + return !this.name; + } + [$lastAttribute]() { + return ""; + } + [$text]() { + if (this[_children].length === 0) { + return this[$content]; + } + return this[_children].map(c => c[$text]()).join(""); + } + get [_attributeNames]() { + const proto = Object.getPrototypeOf(this); + if (!proto._attributes) { + const attributes = proto._attributes = new Set(); + for (const name of Object.getOwnPropertyNames(this)) { + if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) { + break; + } + attributes.add(name); + } + } + return shadow(this, _attributeNames, proto._attributes); + } + [$isDescendent](parent) { + let node = this; + while (node) { + if (node === parent) { + return true; + } + node = node[$getParent](); + } + return false; + } + [$getParent]() { + return this[_parent]; + } + [$getSubformParent]() { + return this[$getParent](); + } + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[name]; + } + [$dump]() { + const dumped = Object.create(null); + if (this[$content]) { + dumped.$content = this[$content]; + } + for (const name of Object.getOwnPropertyNames(this)) { + const value = this[name]; + if (value === null) { + continue; + } + if (value instanceof XFAObject) { + dumped[name] = value[$dump](); + } else if (value instanceof XFAObjectArray) { + if (!value.isEmpty()) { + dumped[name] = value.dump(); + } + } else { + dumped[name] = value; + } + } + return dumped; + } + [$toStyle]() { + return null; + } + [$toHTML]() { + return HTMLResult.EMPTY; + } + *[$getContainedChildren]() { + for (const node of this[$getChildren]()) { + yield node; + } + } + *[_filteredChildrenGenerator](filter, include) { + for (const node of this[$getContainedChildren]()) { + if (!filter || include === filter.has(node[$nodeName])) { + const availableSpace = this[$getAvailableSpace](); + const res = node[$toHTML](availableSpace); + if (!res.success) { + this[$extra].failingNode = node; + } + yield res; + } + } + } + [$flushHTML]() { + return null; + } + [$addHTML](html, bbox) { + this[$extra].children.push(html); + } + [$getAvailableSpace]() {} + [$childrenToHTML]({ + filter = null, + include = true + }) { + if (!this[$extra].generator) { + this[$extra].generator = this[_filteredChildrenGenerator](filter, include); + } else { + const availableSpace = this[$getAvailableSpace](); + const res = this[$extra].failingNode[$toHTML](availableSpace); + if (!res.success) { + return res; + } + if (res.html) { + this[$addHTML](res.html, res.bbox); + } + delete this[$extra].failingNode; + } + while (true) { + const gen = this[$extra].generator.next(); + if (gen.done) { + break; + } + const res = gen.value; + if (!res.success) { + return res; + } + if (res.html) { + this[$addHTML](res.html, res.bbox); + } + } + this[$extra].generator = null; + return HTMLResult.EMPTY; + } + [$setSetAttributes](attributes) { + this[_setAttributes] = new Set(Object.keys(attributes)); + } + [_getUnsetAttributes](protoAttributes) { + const allAttr = this[_attributeNames]; + const setAttr = this[_setAttributes]; + return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x)); + } + [$resolvePrototypes](ids, ancestors = new Set()) { + for (const child of this[_children]) { + child[_resolvePrototypesHelper](ids, ancestors); + } + } + [_resolvePrototypesHelper](ids, ancestors) { + const proto = this[_getPrototype](ids, ancestors); + if (proto) { + this[_applyPrototype](proto, ids, ancestors); + } else { + this[$resolvePrototypes](ids, ancestors); + } + } + [_getPrototype](ids, ancestors) { + const { + use, + usehref + } = this; + if (!use && !usehref) { + return null; + } + let proto = null; + let somExpression = null; + let id = null; + let ref = use; + if (usehref) { + ref = usehref; + if (usehref.startsWith("#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice("#som(".length, -1); + } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice(".#som(".length, -1); + } else if (usehref.startsWith("#")) { + id = usehref.slice(1); + } else if (usehref.startsWith(".#")) { + id = usehref.slice(2); + } + } else if (use.startsWith("#")) { + id = use.slice(1); + } else { + somExpression = use; + } + this.use = this.usehref = ""; + if (id) { + proto = ids.get(id); + } else { + proto = searchNode(ids.get($root), this, somExpression, true, false); + if (proto) { + proto = proto[0]; + } + } + if (!proto) { + warn(`XFA - Invalid prototype reference: ${ref}.`); + return null; + } + if (proto[$nodeName] !== this[$nodeName]) { + warn(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`); + return null; + } + if (ancestors.has(proto)) { + warn(`XFA - Cycle detected in prototypes use.`); + return null; + } + ancestors.add(proto); + const protoProto = proto[_getPrototype](ids, ancestors); + if (protoProto) { + proto[_applyPrototype](protoProto, ids, ancestors); + } + proto[$resolvePrototypes](ids, ancestors); + ancestors.delete(proto); + return proto; + } + [_applyPrototype](proto, ids, ancestors) { + if (ancestors.has(proto)) { + warn(`XFA - Cycle detected in prototypes use.`); + return; + } + if (!this[$content] && proto[$content]) { + this[$content] = proto[$content]; + } + const newAncestors = new Set(ancestors); + newAncestors.add(proto); + for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) { + this[unsetAttrName] = proto[unsetAttrName]; + if (this[_setAttributes]) { + this[_setAttributes].add(unsetAttrName); + } + } + for (const name of Object.getOwnPropertyNames(this)) { + if (this[_attributeNames].has(name)) { + continue; + } + const value = this[name]; + const protoValue = proto[name]; + if (value instanceof XFAObjectArray) { + for (const child of value[_children]) { + child[_resolvePrototypesHelper](ids, ancestors); + } + for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) { + const child = proto[_children][i][$clone](); + if (value.push(child)) { + child[_parent] = this; + this[_children].push(child); + child[_resolvePrototypesHelper](ids, ancestors); + } else { + break; + } + } + continue; + } + if (value !== null) { + value[$resolvePrototypes](ids, ancestors); + if (protoValue) { + value[_applyPrototype](protoValue, ids, ancestors); + } + continue; + } + if (protoValue !== null) { + const child = protoValue[$clone](); + child[_parent] = this; + this[name] = child; + this[_children].push(child); + child[_resolvePrototypesHelper](ids, ancestors); + } + } + } + static [_cloneAttribute](obj) { + if (Array.isArray(obj)) { + return obj.map(x => XFAObject[_cloneAttribute](x)); + } + if (typeof obj === "object" && obj !== null) { + return Object.assign({}, obj); + } + return obj; + } + [$clone]() { + const clone = Object.create(Object.getPrototypeOf(this)); + for (const $symbol of Object.getOwnPropertySymbols(this)) { + try { + clone[$symbol] = this[$symbol]; + } catch { + shadow(clone, $symbol, this[$symbol]); + } + } + clone[$uid] = `${clone[$nodeName]}${uid++}`; + clone[_children] = []; + for (const name of Object.getOwnPropertyNames(this)) { + if (this[_attributeNames].has(name)) { + clone[name] = XFAObject[_cloneAttribute](this[name]); + continue; + } + const value = this[name]; + clone[name] = value instanceof XFAObjectArray ? new XFAObjectArray(value[_max]) : null; + } + for (const child of this[_children]) { + const name = child[$nodeName]; + const clonedChild = child[$clone](); + clone[_children].push(clonedChild); + clonedChild[_parent] = clone; + if (clone[name] === null) { + clone[name] = clonedChild; + } else { + clone[name][_children].push(clonedChild); + } + } + return clone; + } + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[_children].filter(c => c[$nodeName] === name); + } + [$getChildrenByClass](name) { + return this[name]; + } + [$getChildrenByName](name, allTransparent, first = true) { + return Array.from(this[$getChildrenByNameIt](name, allTransparent, first)); + } + *[$getChildrenByNameIt](name, allTransparent, first = true) { + if (name === "parent") { + yield this[_parent]; + return; + } + for (const child of this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (child.name === name) { + yield child; + } + if (allTransparent || child[$isTransparent]()) { + yield* child[$getChildrenByNameIt](name, allTransparent, false); + } + } + if (first && this[_attributeNames].has(name)) { + yield new XFAAttribute(this, name, this[name]); + } + } +} +class XFAObjectArray { + constructor(max = Infinity) { + this[_max] = max; + this[_children] = []; + } + get isXFAObject() { + return false; + } + get isXFAObjectArray() { + return true; + } + push(child) { + const len = this[_children].length; + if (len <= this[_max]) { + this[_children].push(child); + return true; + } + warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`); + return false; + } + isEmpty() { + return this[_children].length === 0; + } + dump() { + return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]()); + } + [$clone]() { + const clone = new XFAObjectArray(this[_max]); + clone[_children] = this[_children].map(c => c[$clone]()); + return clone; + } + get children() { + return this[_children]; + } + clear() { + this[_children].length = 0; + } +} +class XFAAttribute { + constructor(node, name, value) { + this[_parent] = node; + this[$nodeName] = name; + this[$content] = value; + this[$consumed] = false; + this[$uid] = `attribute${uid++}`; + } + [$getParent]() { + return this[_parent]; + } + [$isDataValue]() { + return true; + } + [$getDataValue]() { + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$text]() { + return this[$content]; + } + [$isDescendent](parent) { + return this[_parent] === parent || this[_parent][$isDescendent](parent); + } +} +class XmlObject extends XFAObject { + constructor(nsId, name, attributes = {}) { + super(nsId, name); + this[$content] = ""; + this[_dataValue] = null; + if (name !== "#text") { + const map = new Map(); + this[_attributes] = map; + for (const [attrName, value] of Object.entries(attributes)) { + map.set(attrName, new XFAAttribute(this, attrName, value)); + } + if (attributes.hasOwnProperty($nsAttributes)) { + const dataNode = attributes[$nsAttributes].xfa.dataNode; + if (dataNode !== undefined) { + if (dataNode === "dataGroup") { + this[_dataValue] = false; + } else if (dataNode === "dataValue") { + this[_dataValue] = true; + } + } + } + } + this[$consumed] = false; + } + [$toString](buf) { + const tagName = this[$nodeName]; + if (tagName === "#text") { + buf.push(encodeToXmlString(this[$content])); + return; + } + const utf8TagName = utf8StringToString(tagName); + const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; + buf.push(`<${prefix}${utf8TagName}`); + for (const [name, value] of this[_attributes].entries()) { + const utf8Name = utf8StringToString(name); + buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); + } + if (this[_dataValue] !== null) { + if (this[_dataValue]) { + buf.push(` xfa:dataNode="dataValue"`); + } else { + buf.push(` xfa:dataNode="dataGroup"`); + } + } + if (!this[$content] && this[_children].length === 0) { + buf.push("/>"); + return; + } + buf.push(">"); + if (this[$content]) { + if (typeof this[$content] === "string") { + buf.push(encodeToXmlString(this[$content])); + } else { + this[$content][$toString](buf); + } + } else { + for (const child of this[_children]) { + child[$toString](buf); + } + } + buf.push(``); + } + [$onChild](child) { + if (this[$content]) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + this[$content] = ""; + } + this[$appendChild](child); + return true; + } + [$onText](str) { + this[$content] += str; + } + [$finalize]() { + if (this[$content] && this[_children].length > 0) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + delete this[$content]; + } + } + [$toHTML]() { + if (this[$nodeName] === "#text") { + return HTMLResult.success({ + name: "#text", + value: this[$content] + }); + } + return HTMLResult.EMPTY; + } + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[_children].filter(c => c[$nodeName] === name); + } + [$getAttributes]() { + return this[_attributes]; + } + [$getChildrenByClass](name) { + const value = this[_attributes].get(name); + if (value !== undefined) { + return value; + } + return this[$getChildren](name); + } + *[$getChildrenByNameIt](name, allTransparent) { + const value = this[_attributes].get(name); + if (value) { + yield value; + } + for (const child of this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (allTransparent) { + yield* child[$getChildrenByNameIt](name, allTransparent); + } + } + } + *[$getAttributeIt](name, skipConsumed) { + const value = this[_attributes].get(name); + if (value && (!skipConsumed || !value[$consumed])) { + yield value; + } + for (const child of this[_children]) { + yield* child[$getAttributeIt](name, skipConsumed); + } + } + *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) { + for (const child of this[_children]) { + if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) { + yield child; + } + if (allTransparent) { + yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed); + } + } + } + [$isDataValue]() { + if (this[_dataValue] === null) { + return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id; + } + return this[_dataValue]; + } + [$getDataValue]() { + if (this[_dataValue] === null) { + if (this[_children].length === 0) { + return this[$content].trim(); + } + if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) { + return this[_children][0][$text]().trim(); + } + return null; + } + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$dump](hasNS = false) { + const dumped = Object.create(null); + if (hasNS) { + dumped.$ns = this[$namespaceId]; + } + if (this[$content]) { + dumped.$content = this[$content]; + } + dumped.$name = this[$nodeName]; + dumped.children = []; + for (const child of this[_children]) { + dumped.children.push(child[$dump](hasNS)); + } + dumped.attributes = Object.create(null); + for (const [name, value] of this[_attributes]) { + dumped.attributes[name] = value[$content]; + } + return dumped; + } +} +class ContentObject extends XFAObject { + constructor(nsId, name) { + super(nsId, name); + this[$content] = ""; + } + [$onText](text) { + this[$content] += text; + } + [$finalize]() {} +} +class OptionObject extends ContentObject { + constructor(nsId, name, options) { + super(nsId, name); + this[_options] = options; + } + [$finalize]() { + this[$content] = getKeyword({ + data: this[$content], + defaultValue: this[_options][0], + validate: k => this[_options].includes(k) + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_options]; + } +} +class StringObject extends ContentObject { + [$finalize]() { + this[$content] = this[$content].trim(); + } +} +class IntegerObject extends ContentObject { + constructor(nsId, name, defaultValue, validator) { + super(nsId, name); + this[_defaultValue] = defaultValue; + this[_validator] = validator; + } + [$finalize]() { + this[$content] = getInteger({ + data: this[$content], + defaultValue: this[_defaultValue], + validate: this[_validator] + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_defaultValue]; + delete this[_validator]; + } +} +class Option01 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 0, n => n === 1); + } +} +class Option10 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 1, n => n === 0); + } +} + +;// ./src/core/xfa/html_utils.js + + + + + + +function measureToString(m) { + if (typeof m === "string") { + return "0px"; + } + return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`; +} +const converters = { + anchorType(node, style) { + const parent = node[$getSubformParent](); + if (!parent || parent.layout && parent.layout !== "position") { + return; + } + if (!("transform" in style)) { + style.transform = ""; + } + switch (node.anchorType) { + case "bottomCenter": + style.transform += "translate(-50%, -100%)"; + break; + case "bottomLeft": + style.transform += "translate(0,-100%)"; + break; + case "bottomRight": + style.transform += "translate(-100%,-100%)"; + break; + case "middleCenter": + style.transform += "translate(-50%,-50%)"; + break; + case "middleLeft": + style.transform += "translate(0,-50%)"; + break; + case "middleRight": + style.transform += "translate(-100%,-50%)"; + break; + case "topCenter": + style.transform += "translate(-50%,0)"; + break; + case "topRight": + style.transform += "translate(-100%,0)"; + break; + } + }, + dimensions(node, style) { + const parent = node[$getSubformParent](); + let width = node.w; + const height = node.h; + if (parent.layout?.includes("row")) { + const extra = parent[$extra]; + const colSpan = node.colSpan; + let w; + if (colSpan === -1) { + w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0); + extra.currentColumn = 0; + } else { + w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a + x, 0); + extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; + } + if (!isNaN(w)) { + width = node.w = w; + } + } + style.width = width !== "" ? measureToString(width) : "auto"; + style.height = height !== "" ? measureToString(height) : "auto"; + }, + position(node, style) { + const parent = node[$getSubformParent](); + if (parent?.layout && parent.layout !== "position") { + return; + } + style.position = "absolute"; + style.left = measureToString(node.x); + style.top = measureToString(node.y); + }, + rotate(node, style) { + if (node.rotate) { + if (!("transform" in style)) { + style.transform = ""; + } + style.transform += `rotate(-${node.rotate}deg)`; + style.transformOrigin = "top left"; + } + }, + presence(node, style) { + switch (node.presence) { + case "invisible": + style.visibility = "hidden"; + break; + case "hidden": + case "inactive": + style.display = "none"; + break; + } + }, + hAlign(node, style) { + if (node[$nodeName] === "para") { + switch (node.hAlign) { + case "justifyAll": + style.textAlign = "justify-all"; + break; + case "radix": + style.textAlign = "left"; + break; + default: + style.textAlign = node.hAlign; + } + } else { + switch (node.hAlign) { + case "left": + style.alignSelf = "start"; + break; + case "center": + style.alignSelf = "center"; + break; + case "right": + style.alignSelf = "end"; + break; + } + } + }, + margin(node, style) { + if (node.margin) { + style.margin = node.margin[$toStyle]().margin; + } + } +}; +function setMinMaxDimensions(node, style) { + const parent = node[$getSubformParent](); + if (parent.layout === "position") { + if (node.minW > 0) { + style.minWidth = measureToString(node.minW); + } + if (node.maxW > 0) { + style.maxWidth = measureToString(node.maxW); + } + if (node.minH > 0) { + style.minHeight = measureToString(node.minH); + } + if (node.maxH > 0) { + style.maxHeight = measureToString(node.maxH); + } + } +} +function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) { + const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder); + if (typeof text === "string") { + measure.addString(text); + } else { + text[$pushGlyphs](measure); + } + return measure.compute(width); +} +function layoutNode(node, availableSpace) { + let height = null; + let width = null; + let isBroken = false; + if ((!node.w || !node.h) && node.value) { + let marginH = 0; + let marginV = 0; + if (node.margin) { + marginH = node.margin.leftInset + node.margin.rightInset; + marginV = node.margin.topInset + node.margin.bottomInset; + } + let lineHeight = null; + let margin = null; + if (node.para) { + margin = Object.create(null); + lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight; + margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove; + margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow; + margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft; + margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight; + } + let font = node.font; + if (!font) { + const root = node[$getTemplateRoot](); + let parent = node[$getParent](); + while (parent && parent !== root) { + if (parent.font) { + font = parent.font; + break; + } + parent = parent[$getParent](); + } + } + const maxWidth = (node.w || availableSpace.width) - marginH; + const fontFinder = node[$globalData].fontFinder; + if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") { + const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } else { + const text = node.value[$text](); + if (text) { + const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } + } + if (width !== null && !node.w) { + width += marginH; + } + if (height !== null && !node.h) { + height += marginV; + } + } + return { + w: width, + h: height, + isBroken + }; +} +function computeBbox(node, html, availableSpace) { + let bbox; + if (node.w !== "" && node.h !== "") { + bbox = [node.x, node.y, node.w, node.h]; + } else { + if (!availableSpace) { + return null; + } + let width = node.w; + if (width === "") { + if (node.maxW === 0) { + const parent = node[$getSubformParent](); + width = parent.layout === "position" && parent.w !== "" ? 0 : node.minW; + } else { + width = Math.min(node.maxW, availableSpace.width); + } + html.attributes.style.width = measureToString(width); + } + let height = node.h; + if (height === "") { + if (node.maxH === 0) { + const parent = node[$getSubformParent](); + height = parent.layout === "position" && parent.h !== "" ? 0 : node.minH; + } else { + height = Math.min(node.maxH, availableSpace.height); + } + html.attributes.style.height = measureToString(height); + } + bbox = [node.x, node.y, width, height]; + } + return bbox; +} +function fixDimensions(node) { + const parent = node[$getSubformParent](); + if (parent.layout?.includes("row")) { + const extra = parent[$extra]; + const colSpan = node.colSpan; + let width; + if (colSpan === -1) { + width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0); + } else { + width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => a + w, 0); + } + if (!isNaN(width)) { + node.w = width; + } + } + if (parent.layout && parent.layout !== "position") { + node.x = node.y = 0; + } + if (node.layout === "table") { + if (node.w === "" && Array.isArray(node.columnWidths)) { + node.w = node.columnWidths.reduce((a, x) => a + x, 0); + } + } +} +function layoutClass(node) { + switch (node.layout) { + case "position": + return "xfaPosition"; + case "lr-tb": + return "xfaLrTb"; + case "rl-row": + return "xfaRlRow"; + case "rl-tb": + return "xfaRlTb"; + case "row": + return "xfaRow"; + case "table": + return "xfaTable"; + case "tb": + return "xfaTb"; + default: + return "xfaPosition"; + } +} +function toStyle(node, ...names) { + const style = Object.create(null); + for (const name of names) { + const value = node[name]; + if (value === null) { + continue; + } + if (converters.hasOwnProperty(name)) { + converters[name](node, style); + continue; + } + if (value instanceof XFAObject) { + const newStyle = value[$toStyle](); + if (newStyle) { + Object.assign(style, newStyle); + } else { + warn(`(DEBUG) - XFA - style for ${name} not implemented yet`); + } + } + } + return style; +} +function createWrapper(node, html) { + const { + attributes + } = html; + const { + style + } = attributes; + const wrapper = { + name: "div", + attributes: { + class: ["xfaWrapper"], + style: Object.create(null) + }, + children: [] + }; + attributes.class.push("xfaWrapped"); + if (node.border) { + const { + widths, + insets + } = node.border[$extra]; + let width, height; + let top = insets[0]; + let left = insets[3]; + const insetsH = insets[0] + insets[2]; + const insetsW = insets[1] + insets[3]; + switch (node.border.hand) { + case "even": + top -= widths[0] / 2; + left -= widths[3] / 2; + width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`; + height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`; + break; + case "left": + top -= widths[0]; + left -= widths[3]; + width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`; + height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`; + break; + case "right": + width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; + height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; + break; + } + const classNames = ["xfaBorder"]; + if (isPrintOnly(node.border)) { + classNames.push("xfaPrintOnly"); + } + const border = { + name: "div", + attributes: { + class: classNames, + style: { + top: `${top}px`, + left: `${left}px`, + width, + height + } + }, + children: [] + }; + for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) { + if (style[key] !== undefined) { + border.attributes.style[key] = style[key]; + delete style[key]; + } + } + wrapper.children.push(border, html); + } else { + wrapper.children.push(html); + } + for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) { + if (style[key] !== undefined) { + wrapper.attributes.style[key] = style[key]; + delete style[key]; + } + } + wrapper.attributes.style.position = style.position === "absolute" ? "absolute" : "relative"; + delete style.position; + if (style.alignSelf) { + wrapper.attributes.style.alignSelf = style.alignSelf; + delete style.alignSelf; + } + return wrapper; +} +function fixTextIndent(styles) { + const indent = getMeasurement(styles.textIndent, "0px"); + if (indent >= 0) { + return; + } + const align = styles.textAlign === "right" ? "right" : "left"; + const name = "padding" + (align === "left" ? "Left" : "Right"); + const padding = getMeasurement(styles[name], "0px"); + styles[name] = `${padding - indent}px`; +} +function setAccess(node, classNames) { + switch (node.access) { + case "nonInteractive": + classNames.push("xfaNonInteractive"); + break; + case "readOnly": + classNames.push("xfaReadOnly"); + break; + case "protected": + classNames.push("xfaDisabled"); + break; + } +} +function isPrintOnly(node) { + return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print"; +} +function getCurrentPara(node) { + const stack = node[$getTemplateRoot]()[$extra].paraStack; + return stack.length ? stack.at(-1) : null; +} +function setPara(node, nodeStyle, value) { + if (value.attributes.class?.includes("xfaRich")) { + if (nodeStyle) { + if (node.h === "") { + nodeStyle.height = "auto"; + } + if (node.w === "") { + nodeStyle.width = "auto"; + } + } + const para = getCurrentPara(node); + if (para) { + const valueStyle = value.attributes.style; + valueStyle.display = "flex"; + valueStyle.flexDirection = "column"; + switch (para.vAlign) { + case "top": + valueStyle.justifyContent = "start"; + break; + case "bottom": + valueStyle.justifyContent = "end"; + break; + case "middle": + valueStyle.justifyContent = "center"; + break; + } + const paraStyle = para[$toStyle](); + for (const [key, val] of Object.entries(paraStyle)) { + if (!(key in valueStyle)) { + valueStyle[key] = val; + } + } + } + } +} +function setFontFamily(xfaFont, node, fontFinder, style) { + if (!fontFinder) { + delete style.fontFamily; + return; + } + const name = stripQuotes(xfaFont.typeface); + style.fontFamily = `"${name}"`; + const typeface = fontFinder.find(name); + if (typeface) { + const { + fontFamily + } = typeface.regular.cssFontInfo; + if (fontFamily !== name) { + style.fontFamily = `"${fontFamily}"`; + } + const para = getCurrentPara(node); + if (para && para.lineHeight !== "") { + return; + } + if (style.lineHeight) { + return; + } + const pdfFont = selectFont(xfaFont, typeface); + if (pdfFont) { + style.lineHeight = Math.max(1.2, pdfFont.lineHeight); + } + } +} +function fixURL(str) { + const absoluteUrl = createValidAbsoluteUrl(str, null, { + addDefaultProtocol: true, + tryConvertEncoding: true + }); + return absoluteUrl ? absoluteUrl.href : null; +} + +;// ./src/core/xfa/layout.js + + +function createLine(node, children) { + return { + name: "div", + attributes: { + class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"] + }, + children + }; +} +function flushHTML(node) { + if (!node[$extra]) { + return null; + } + const attributes = node[$extra].attributes; + const html = { + name: "div", + attributes, + children: node[$extra].children + }; + if (node[$extra].failingNode) { + const htmlFromFailing = node[$extra].failingNode[$flushHTML](); + if (htmlFromFailing) { + if (node.layout.endsWith("-tb")) { + html.children.push(createLine(node, [htmlFromFailing])); + } else { + html.children.push(htmlFromFailing); + } + } + } + if (html.children.length === 0) { + return null; + } + return html; +} +function addHTML(node, html, bbox) { + const extra = node[$extra]; + const availableSpace = extra.availableSpace; + const [x, y, w, h] = bbox; + switch (node.layout) { + case "position": + { + extra.width = Math.max(extra.width, x + w); + extra.height = Math.max(extra.height, y + h); + extra.children.push(html); + break; + } + case "lr-tb": + case "rl-tb": + if (!extra.line || extra.attempt === 1) { + extra.line = createLine(node, []); + extra.children.push(extra.line); + extra.numberInLine = 0; + } + extra.numberInLine += 1; + extra.line.children.push(html); + if (extra.attempt === 0) { + extra.currentWidth += w; + extra.height = Math.max(extra.height, extra.prevHeight + h); + } else { + extra.currentWidth = w; + extra.prevHeight = extra.height; + extra.height += h; + extra.attempt = 0; + } + extra.width = Math.max(extra.width, extra.currentWidth); + break; + case "rl-row": + case "row": + { + extra.children.push(html); + extra.width += w; + extra.height = Math.max(extra.height, h); + const height = measureToString(extra.height); + for (const child of extra.children) { + child.attributes.style.height = height; + } + break; + } + case "table": + { + extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); + break; + } + case "tb": + { + extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); + break; + } + } +} +function getAvailableSpace(node) { + const availableSpace = node[$extra].availableSpace; + const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0; + const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0; + switch (node.layout) { + case "lr-tb": + case "rl-tb": + if (node[$extra].attempt === 0) { + return { + width: availableSpace.width - marginH - node[$extra].currentWidth, + height: availableSpace.height - marginV - node[$extra].prevHeight + }; + } + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height + }; + case "rl-row": + case "row": + const width = node[$extra].columnWidths.slice(node[$extra].currentColumn).reduce((a, x) => a + x); + return { + width, + height: availableSpace.height - marginH + }; + case "table": + case "tb": + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height + }; + case "position": + default: + return availableSpace; + } +} +function getTransformedBBox(node) { + let w = node.w === "" ? NaN : node.w; + let h = node.h === "" ? NaN : node.h; + let [centerX, centerY] = [0, 0]; + switch (node.anchorType || "") { + case "bottomCenter": + [centerX, centerY] = [w / 2, h]; + break; + case "bottomLeft": + [centerX, centerY] = [0, h]; + break; + case "bottomRight": + [centerX, centerY] = [w, h]; + break; + case "middleCenter": + [centerX, centerY] = [w / 2, h / 2]; + break; + case "middleLeft": + [centerX, centerY] = [0, h / 2]; + break; + case "middleRight": + [centerX, centerY] = [w, h / 2]; + break; + case "topCenter": + [centerX, centerY] = [w / 2, 0]; + break; + case "topRight": + [centerX, centerY] = [w, 0]; + break; + } + let x, y; + switch (node.rotate || 0) { + case 0: + [x, y] = [-centerX, -centerY]; + break; + case 90: + [x, y] = [-centerY, centerX]; + [w, h] = [h, -w]; + break; + case 180: + [x, y] = [centerX, centerY]; + [w, h] = [-w, -h]; + break; + case 270: + [x, y] = [centerY, -centerX]; + [w, h] = [-h, w]; + break; + } + return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)]; +} +function checkDimensions(node, space) { + if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) { + return true; + } + if (node.w === 0 || node.h === 0) { + return true; + } + const ERROR = 2; + const parent = node[$getSubformParent](); + const attempt = parent[$extra]?.attempt || 0; + const [, y, w, h] = getTransformedBBox(node); + switch (parent.layout) { + case "lr-tb": + case "rl-tb": + if (attempt === 0) { + if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) { + if (node.h !== "" && Math.round(h - space.height) > ERROR) { + return false; + } + if (node.w !== "") { + if (Math.round(w - space.width) <= ERROR) { + return true; + } + if (parent[$extra].numberInLine === 0) { + return space.height > ERROR; + } + return false; + } + return space.width > ERROR; + } + if (node.w !== "") { + return Math.round(w - space.width) <= ERROR; + } + return space.width > ERROR; + } + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && Math.round(h - space.height) > ERROR) { + return false; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; + case "table": + case "tb": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && !node[$isSplittable]()) { + return Math.round(h - space.height) <= ERROR; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; + case "position": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h === "" || Math.round(h + y - space.height) <= ERROR) { + return true; + } + const area = node[$getTemplateRoot]()[$extra].currentContentArea; + return h + y > area.h; + case "rl-row": + case "row": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "") { + return Math.round(h - space.height) <= ERROR; + } + return true; + default: + return true; + } +} + +;// ./src/core/xfa/template.js + + + + + + + + + + +const TEMPLATE_NS_ID = NamespaceIds.template.id; +const SVG_NS = "http://www.w3.org/2000/svg"; +const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; +const MAX_EMPTY_PAGES = 3; +const DEFAULT_TAB_INDEX = 5000; +const HEADING_PATTERN = /^H(\d+)$/; +const MIMES = new Set(["image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/png", "image/apng", "image/x-png", "image/bmp", "image/x-ms-bmp", "image/tiff", "image/tif", "application/octet-stream"]); +const IMAGES_HEADERS = [[[0x42, 0x4d], "image/bmp"], [[0xff, 0xd8, 0xff], "image/jpeg"], [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"]]; +function getBorderDims(node) { + if (!node || !node.border) { + return { + w: 0, + h: 0 + }; + } + const borderExtra = node.border[$getExtra](); + if (!borderExtra) { + return { + w: 0, + h: 0 + }; + } + return { + w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2], + h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3] + }; +} +function hasMargin(node) { + return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset); +} +function _setValue(templateNode, value) { + if (!templateNode.value) { + const nodeValue = new Value({}); + templateNode[$appendChild](nodeValue); + templateNode.value = nodeValue; + } + templateNode.value[$setValue](value); +} +function* getContainedChildren(node) { + for (const child of node[$getChildren]()) { + if (child instanceof SubformSet) { + yield* child[$getContainedChildren](); + continue; + } + yield child; + } +} +function isRequired(node) { + return node.validate?.nullTest === "error"; +} +function setTabIndex(node) { + while (node) { + if (!node.traversal) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; + return; + } + if (node[$tabIndex]) { + return; + } + let next = null; + for (const child of node.traversal[$getChildren]()) { + if (child.operation === "next") { + next = child; + break; + } + } + if (!next || !next.ref) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; + return; + } + const root = node[$getTemplateRoot](); + node[$tabIndex] = ++root[$tabIndex]; + const ref = root[$searchNode](next.ref, node); + if (!ref) { + return; + } + node = ref[0]; + } +} +function applyAssist(obj, attributes) { + const assist = obj.assist; + if (assist) { + const assistTitle = assist[$toHTML](); + if (assistTitle) { + attributes.title = assistTitle; + } + const role = assist.role; + const match = role.match(HEADING_PATTERN); + if (match) { + const ariaRole = "heading"; + const ariaLevel = match[1]; + attributes.role = ariaRole; + attributes["aria-level"] = ariaLevel; + } + } + if (obj.layout === "table") { + attributes.role = "table"; + } else if (obj.layout === "row") { + attributes.role = "row"; + } else { + const parent = obj[$getParent](); + if (parent.layout === "row") { + attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell"; + } + } +} +function ariaLabel(obj) { + if (!obj.assist) { + return null; + } + const assist = obj.assist; + if (assist.speak && assist.speak[$content] !== "") { + return assist.speak[$content]; + } + if (assist.toolTip) { + return assist.toolTip[$content]; + } + return null; +} +function valueToHtml(value) { + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: Object.create(null) + }, + children: [{ + name: "span", + attributes: { + style: Object.create(null) + }, + value + }] + }); +} +function setFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === null) { + root[$extra].firstUnsplittable = node; + root[$extra].noLayoutFailure = true; + } +} +function unsetFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === node) { + root[$extra].noLayoutFailure = false; + } +} +function handleBreak(node) { + if (node[$extra]) { + return false; + } + node[$extra] = Object.create(null); + if (node.targetType === "auto") { + return false; + } + const root = node[$getTemplateRoot](); + let target = null; + if (node.target) { + target = root[$searchNode](node.target, node[$getParent]()); + if (!target) { + return false; + } + target = target[0]; + } + const { + currentPageArea, + currentContentArea + } = root[$extra]; + if (node.targetType === "pageArea") { + if (!(target instanceof PageArea)) { + target = null; + } + if (node.startNew) { + node[$extra].target = target || currentPageArea; + return true; + } else if (target && target !== currentPageArea) { + node[$extra].target = target; + return true; + } + return false; + } + if (!(target instanceof ContentArea)) { + target = null; + } + const pageArea = target && target[$getParent](); + let index; + let nextPageArea = pageArea; + if (node.startNew) { + if (target) { + const contentAreas = pageArea.contentArea.children; + const indexForCurrent = contentAreas.indexOf(currentContentArea); + const indexForTarget = contentAreas.indexOf(target); + if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) { + nextPageArea = null; + } + index = indexForTarget - 1; + } else { + index = currentPageArea.contentArea.children.indexOf(currentContentArea); + } + } else if (target && target !== currentContentArea) { + const contentAreas = pageArea.contentArea.children; + index = contentAreas.indexOf(target) - 1; + nextPageArea = pageArea === currentPageArea ? null : pageArea; + } else { + return false; + } + node[$extra].target = nextPageArea; + node[$extra].index = index; + return true; +} +function handleOverflow(node, extraNode, space) { + const root = node[$getTemplateRoot](); + const saved = root[$extra].noLayoutFailure; + const savedMethod = extraNode[$getSubformParent]; + extraNode[$getSubformParent] = () => node; + root[$extra].noLayoutFailure = true; + const res = extraNode[$toHTML](space); + node[$addHTML](res.html, res.bbox); + root[$extra].noLayoutFailure = saved; + extraNode[$getSubformParent] = savedMethod; +} +class AppearanceFilter extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "appearanceFilter"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Arc extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "arc", true); + this.circular = getInteger({ + data: attributes.circular, + defaultValue: 0, + validate: x => x === 1 + }); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.startAngle = getFloat({ + data: attributes.startAngle, + defaultValue: 0, + validate: x => true + }); + this.sweepAngle = getFloat({ + data: attributes.sweepAngle, + defaultValue: 360, + validate: x => true + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + this.fill = null; + } + [$toHTML]() { + const edge = this.edge || new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); + style.stroke = edgeStyle.color; + let arc; + const attributes = { + xmlns: SVG_NS, + style: { + width: "100%", + height: "100%", + overflow: "visible" + } + }; + if (this.sweepAngle === 360) { + arc = { + name: "ellipse", + attributes: { + xmlns: SVG_NS, + cx: "50%", + cy: "50%", + rx: "50%", + ry: "50%", + style + } + }; + } else { + const startAngle = this.startAngle * Math.PI / 180; + const sweepAngle = this.sweepAngle * Math.PI / 180; + const largeArc = this.sweepAngle > 180 ? 1 : 0; + const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + Math.cos(startAngle + sweepAngle)), 50 * (1 - Math.sin(startAngle + sweepAngle))]; + arc = { + name: "path", + attributes: { + xmlns: SVG_NS, + d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, + vectorEffect: "non-scaling-stroke", + style + } + }; + Object.assign(attributes, { + viewBox: "0 0 100 100", + preserveAspectRatio: "none" + }); + } + const svg = { + name: "svg", + children: [arc], + attributes + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class Area extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "area", true); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.desc = null; + this.extras = null; + this.area = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$isTransparent]() { + return true; + } + [$isBindable]() { + return true; + } + [$addHTML](html, bbox) { + const [x, y, w, h] = bbox; + this[$extra].width = Math.max(this[$extra].width, x + w); + this[$extra].height = Math.max(this[$extra].height, y + h); + this[$extra].children.push(html); + } + [$getAvailableSpace]() { + return this[$extra].availableSpace; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "position"); + const attributes = { + style, + id: this[$uid], + class: ["xfaArea"] + }; + if (isPrintOnly(this)) { + attributes.class.push("xfaPrintOnly"); + } + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + this[$extra] = { + children, + width: 0, + height: 0, + availableSpace + }; + const result = this[$childrenToHTML]({ + filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]), + include: true + }); + if (!result.success) { + if (result.isBreak()) { + return result; + } + delete this[$extra]; + return HTMLResult.FAILURE; + } + style.width = measureToString(this[$extra].width); + style.height = measureToString(this[$extra].height); + const html = { + name: "div", + attributes, + children + }; + const bbox = [this.x, this.y, this[$extra].width, this[$extra].height]; + delete this[$extra]; + return HTMLResult.success(html, bbox); + } +} +class Assist extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "assist", true); + this.id = attributes.id || ""; + this.role = attributes.role || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.speak = null; + this.toolTip = null; + } + [$toHTML]() { + return this.toolTip?.[$content] || null; + } +} +class Barcode extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "barcode", true); + this.charEncoding = getKeyword({ + data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]); + this.dataColumnCount = getInteger({ + data: attributes.dataColumnCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataLength = getInteger({ + data: attributes.dataLength, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]); + this.dataRowCount = getInteger({ + data: attributes.dataRowCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.endChar = attributes.endChar || ""; + this.errorCorrectionLevel = getInteger({ + data: attributes.errorCorrectionLevel, + defaultValue: -1, + validate: x => x >= 0 && x <= 8 + }); + this.id = attributes.id || ""; + this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm"); + this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm"); + this.printCheckDigit = getInteger({ + data: attributes.printCheckDigit, + defaultValue: 0, + validate: x => x === 1 + }); + this.rowColumnRatio = getRatio(attributes.rowColumnRatio); + this.startChar = attributes.startChar || ""; + this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]); + this.truncate = getInteger({ + data: attributes.truncate, + defaultValue: 0, + validate: x => x === 1 + }); + this.type = getStringOption(attributes.type ? attributes.type.toLowerCase() : "", ["aztec", "codabar", "code2of5industrial", "code2of5interleaved", "code2of5matrix", "code2of5standard", "code3of9", "code3of9extended", "code11", "code49", "code93", "code128", "code128a", "code128b", "code128c", "code128sscc", "datamatrix", "ean8", "ean8add2", "ean8add5", "ean13", "ean13add2", "ean13add5", "ean13pwcd", "fim", "logmars", "maxicode", "msi", "pdf417", "pdf417macro", "plessey", "postauscust2", "postauscust3", "postausreplypaid", "postausstandard", "postukrm4scc", "postusdpbc", "postusimb", "postusstandard", "postus5zip", "qrcode", "rfid", "rss14", "rss14expanded", "rss14limited", "rss14stacked", "rss14stackedomni", "rss14truncated", "telepen", "ucc128", "ucc128random", "ucc128sscc", "upca", "upcaadd2", "upcaadd5", "upcapwcd", "upce", "upceadd2", "upceadd5", "upcean2", "upcean5", "upsmaxicode"]); + this.upsMode = getStringOption(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio); + this.encrypt = null; + this.extras = null; + } +} +class Bind extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bind", true); + this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]); + this.ref = attributes.ref || ""; + this.picture = null; + } +} +class BindItems extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bindItems"); + this.connection = attributes.connection || ""; + this.labelRef = attributes.labelRef || ""; + this.ref = attributes.ref || ""; + this.valueRef = attributes.valueRef || ""; + } +} +class Bookend extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bookend"); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class BooleanElement extends Option01 { + constructor(attributes) { + super(TEMPLATE_NS_ID, "boolean"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] === 1 ? "1" : "0"); + } +} +class Border extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "border", true); + this.break = getStringOption(attributes.break, ["close", "open"]); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.corner = new XFAObjectArray(4); + this.edge = new XFAObjectArray(4); + this.extras = null; + this.fill = null; + this.margin = null; + } + [$getExtra]() { + if (!this[$extra]) { + const edges = this.edge.children.slice(); + if (edges.length < 4) { + const defaultEdge = edges.at(-1) || new Edge({}); + for (let i = edges.length; i < 4; i++) { + edges.push(defaultEdge); + } + } + const widths = edges.map(edge => edge.thickness); + const insets = [0, 0, 0, 0]; + if (this.margin) { + insets[0] = this.margin.topInset; + insets[1] = this.margin.rightInset; + insets[2] = this.margin.bottomInset; + insets[3] = this.margin.leftInset; + } + this[$extra] = { + widths, + insets, + edges + }; + } + return this[$extra]; + } + [$toStyle]() { + const { + edges + } = this[$getExtra](); + const edgeStyles = edges.map(node => { + const style = node[$toStyle](); + style.color ||= "#000000"; + return style; + }); + const style = Object.create(null); + if (this.margin) { + Object.assign(style, this.margin[$toStyle]()); + } + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } + if (this.corner.children.some(node => node.radius !== 0)) { + const cornerStyles = this.corner.children.map(node => node[$toStyle]()); + if (cornerStyles.length === 2 || cornerStyles.length === 3) { + const last = cornerStyles.at(-1); + for (let i = cornerStyles.length; i < 4; i++) { + cornerStyles.push(last); + } + } + style.borderRadius = cornerStyles.map(s => s.radius).join(" "); + } + switch (this.presence) { + case "invisible": + case "hidden": + style.borderStyle = ""; + break; + case "inactive": + style.borderStyle = "none"; + break; + default: + style.borderStyle = edgeStyles.map(s => s.style).join(" "); + break; + } + style.borderWidth = edgeStyles.map(s => s.width).join(" "); + style.borderColor = edgeStyles.map(s => s.color).join(" "); + return style; + } +} +class Break extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "break", true); + this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.afterTarget = attributes.afterTarget || ""; + this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.beforeTarget = attributes.beforeTarget || ""; + this.bookendLeader = attributes.bookendLeader || ""; + this.bookendTrailer = attributes.bookendTrailer || ""; + this.id = attributes.id || ""; + this.overflowLeader = attributes.overflowLeader || ""; + this.overflowTarget = attributes.overflowTarget || ""; + this.overflowTrailer = attributes.overflowTrailer || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class BreakAfter extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakAfter", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } +} +class BreakBefore extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakBefore", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } + [$toHTML](availableSpace) { + this[$extra] = {}; + return HTMLResult.FAILURE; + } +} +class Button extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "button", true); + this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toHTML](availableSpace) { + const parent = this[$getParent](); + const grandpa = parent[$getParent](); + const htmlButton = { + name: "button", + attributes: { + id: this[$uid], + class: ["xfaButton"], + style: {} + }, + children: [] + }; + for (const event of grandpa.event.children) { + if (event.activity !== "click" || !event.script) { + continue; + } + const jsURL = recoverJsURL(event.script[$content]); + if (!jsURL) { + continue; + } + const href = fixURL(jsURL.url); + if (!href) { + continue; + } + htmlButton.children.push({ + name: "a", + attributes: { + id: "link" + this[$uid], + href, + newWindow: jsURL.newWindow, + class: ["xfaLink"], + style: {} + }, + children: [] + }); + } + return HTMLResult.success(htmlButton); + } +} +class Calculate extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "calculate", true); + this.id = attributes.id || ""; + this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.script = null; + } +} +class Caption extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "caption", true); + this.id = attributes.id || ""; + this.placement = getStringOption(attributes.placement, ["left", "bottom", "inline", "right", "top"]); + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.reserve = Math.ceil(getMeasurement(attributes.reserve)); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.font = null; + this.margin = null; + this.para = null; + this.value = null; + } + [$setValue](value) { + _setValue(this, value); + } + [$getExtra](availableSpace) { + if (!this[$extra]) { + let { + width, + height + } = availableSpace; + switch (this.placement) { + case "left": + case "right": + case "inline": + width = this.reserve <= 0 ? width : this.reserve; + break; + case "top": + case "bottom": + height = this.reserve <= 0 ? height : this.reserve; + break; + } + this[$extra] = layoutNode(this, { + width, + height + }); + } + return this[$extra]; + } + [$toHTML](availableSpace) { + if (!this.value) { + return HTMLResult.EMPTY; + } + this[$pushPara](); + const value = this.value[$toHTML](availableSpace).html; + if (!value) { + this[$popPara](); + return HTMLResult.EMPTY; + } + const savedReserve = this.reserve; + if (this.reserve <= 0) { + const { + w, + h + } = this[$getExtra](availableSpace); + switch (this.placement) { + case "left": + case "right": + case "inline": + this.reserve = w; + break; + case "top": + case "bottom": + this.reserve = h; + break; + } + } + const children = []; + if (typeof value === "string") { + children.push({ + name: "#text", + value + }); + } else { + children.push(value); + } + const style = toStyle(this, "font", "margin", "visibility"); + switch (this.placement) { + case "left": + case "right": + if (this.reserve > 0) { + style.width = measureToString(this.reserve); + } + break; + case "top": + case "bottom": + if (this.reserve > 0) { + style.height = measureToString(this.reserve); + } + break; + } + setPara(this, null, value); + this[$popPara](); + this.reserve = savedReserve; + return HTMLResult.success({ + name: "div", + attributes: { + style, + class: ["xfaCaption"] + }, + children + }); + } +} +class Certificate extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificate"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Certificates extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificates", true); + this.credentialServerPolicy = getStringOption(attributes.credentialServerPolicy, ["optional", "required"]); + this.id = attributes.id || ""; + this.url = attributes.url || ""; + this.urlPolicy = attributes.urlPolicy || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encryption = null; + this.issuers = null; + this.keyUsage = null; + this.oids = null; + this.signing = null; + this.subjectDNs = null; + } +} +class CheckButton extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "checkButton", true); + this.id = attributes.id || ""; + this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]); + this.shape = getStringOption(attributes.shape, ["square", "round"]); + this.size = getMeasurement(attributes.size, "10pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle("margin"); + const size = measureToString(this.size); + style.width = style.height = size; + let type; + let className; + let groupId; + const field = this[$getParent]()[$getParent](); + const items = field.items.children.length && field.items.children[0][$toHTML]().html || []; + const exportedValue = { + on: (items[0] !== undefined ? items[0] : "on").toString(), + off: (items[1] !== undefined ? items[1] : "off").toString() + }; + const value = field.value?.[$text]() || "off"; + const checked = value === exportedValue.on || undefined; + const container = field[$getSubformParent](); + const fieldId = field[$uid]; + let dataId; + if (container instanceof ExclGroup) { + groupId = container[$uid]; + type = "radio"; + className = "xfaRadio"; + dataId = container[$data]?.[$uid] || container[$uid]; + } else { + type = "checkbox"; + className = "xfaCheckbox"; + dataId = field[$data]?.[$uid] || field[$uid]; + } + const input = { + name: "input", + attributes: { + class: [className], + style, + fieldId, + dataId, + type, + checked, + xfaOn: exportedValue.on, + xfaOff: exportedValue.off, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (groupId) { + input.attributes.name = groupId; + } + if (isRequired(field)) { + input.attributes["aria-required"] = true; + input.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [input] + }); + } +} +class ChoiceList extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "choiceList", true); + this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]); + this.id = attributes.id || ""; + this.open = getStringOption(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]); + this.textEntry = getInteger({ + data: attributes.textEntry, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "margin"); + const ui = this[$getParent](); + const field = ui[$getParent](); + const fontSize = field.font?.size || 10; + const optionStyle = { + fontSize: `calc(${fontSize}px * var(--scale-factor))` + }; + const children = []; + if (field.items.children.length > 0) { + const items = field.items; + let displayedIndex = 0; + let saveIndex = 0; + if (items.children.length === 2) { + displayedIndex = items.children[0].save; + saveIndex = 1 - displayedIndex; + } + const displayed = items.children[displayedIndex][$toHTML]().html; + const values = items.children[saveIndex][$toHTML]().html; + let selected = false; + const value = field.value?.[$text]() || ""; + for (let i = 0, ii = displayed.length; i < ii; i++) { + const option = { + name: "option", + attributes: { + value: values[i] || displayed[i], + style: optionStyle + }, + value: displayed[i] + }; + if (values[i] === value) { + option.attributes.selected = selected = true; + } + children.push(option); + } + if (!selected) { + children.splice(0, 0, { + name: "option", + attributes: { + hidden: true, + selected: true + }, + value: " " + }); + } + } + const selectAttributes = { + class: ["xfaSelect"], + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + style, + "aria-label": ariaLabel(field), + "aria-required": false + }; + if (isRequired(field)) { + selectAttributes["aria-required"] = true; + selectAttributes.required = true; + } + if (this.open === "multiSelect") { + selectAttributes.multiple = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [{ + name: "select", + children, + attributes: selectAttributes + }] + }); + } +} +class Color extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "color", true); + this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.value = attributes.value ? getColor(attributes.value) : ""; + this.extras = null; + } + [$hasSettableValue]() { + return false; + } + [$toStyle]() { + return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; + } +} +class Comb extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "comb"); + this.id = attributes.id || ""; + this.numberOfCells = getInteger({ + data: attributes.numberOfCells, + defaultValue: 0, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Connect extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "connect", true); + this.connection = attributes.connection || ""; + this.id = attributes.id || ""; + this.ref = attributes.ref || ""; + this.usage = getStringOption(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.picture = null; + } +} +class ContentArea extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "contentArea", true); + this.h = getMeasurement(attributes.h); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = getMeasurement(attributes.w); + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.desc = null; + this.extras = null; + } + [$toHTML](availableSpace) { + const left = measureToString(this.x); + const top = measureToString(this.y); + const style = { + left, + top, + width: measureToString(this.w), + height: measureToString(this.h) + }; + const classNames = ["xfaContentarea"]; + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + return HTMLResult.success({ + name: "div", + children: [], + attributes: { + style, + class: classNames, + id: this[$uid] + } + }); + } +} +class Corner extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "corner", true); + this.id = attributes.id || ""; + this.inverted = getInteger({ + data: attributes.inverted, + defaultValue: 0, + validate: x => x === 1 + }); + this.join = getStringOption(attributes.join, ["square", "round"]); + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.radius = getMeasurement(attributes.radius); + this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle]() { + const style = toStyle(this, "visibility"); + style.radius = measureToString(this.join === "square" ? 0 : this.radius); + return style; + } +} +class DateElement extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "date"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class DateTime extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTime"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class DateTimeEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTimeEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.picker = getStringOption(attributes.picker, ["host", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + const field = this[$getParent]()[$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Decimal extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "decimal"); + this.fracDigits = getInteger({ + data: attributes.fracDigits, + defaultValue: 2, + validate: x => true + }); + this.id = attributes.id || ""; + this.leadDigits = getInteger({ + data: attributes.leadDigits, + defaultValue: -1, + validate: x => true + }); + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class DefaultUi extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "defaultUi", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class Desc extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "desc", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class DigestMethod extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class DigestMethods extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethods", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.digestMethod = new XFAObjectArray(); + } +} +class Draw extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "draw", true); + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.rotate = getInteger({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.border = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.value = null; + this.setProperty = new XFAObjectArray(); + } + [$setValue](value) { + _setValue(this, value); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive") { + return HTMLResult.EMPTY; + } + fixDimensions(this); + this[$pushPara](); + const savedW = this.w; + const savedH = this.h; + const { + w, + h, + isBroken + } = layoutNode(this, availableSpace); + if (w && this.w === "") { + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); + return HTMLResult.FAILURE; + } + this.w = w; + } + if (h && this.h === "") { + this.h = h; + } + setFirstUnsplittable(this); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin"); + setMinMaxDimensions(this, style); + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + const classNames = ["xfaDraw"]; + if (this.font) { + classNames.push("xfaFont"); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[$uid], + class: classNames + }; + if (this.name) { + attributes.xfaName = this.name; + } + const html = { + name: "div", + attributes, + children: [] + }; + applyAssist(this, attributes); + const bbox = computeBbox(this, html, availableSpace); + const value = this.value ? this.value[$toHTML](availableSpace).html : null; + if (value === null) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.success(createWrapper(this, html), bbox); + } + html.children.push(value); + setPara(this, style, value); + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Edge extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "edge", true); + this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle]() { + const style = toStyle(this, "visibility"); + Object.assign(style, { + linecap: this.cap, + width: measureToString(this.thickness), + color: this.color ? this.color[$toStyle]() : "#000000", + style: "" + }); + if (this.presence !== "visible") { + style.style = "none"; + } else { + switch (this.stroke) { + case "solid": + style.style = "solid"; + break; + case "dashDot": + style.style = "dashed"; + break; + case "dashDotDot": + style.style = "dashed"; + break; + case "dashed": + style.style = "dashed"; + break; + case "dotted": + style.style = "dotted"; + break; + case "embossed": + style.style = "ridge"; + break; + case "etched": + style.style = "groove"; + break; + case "lowered": + style.style = "inset"; + break; + case "raised": + style.style = "outset"; + break; + } + } + return style; + } +} +class Encoding extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Encodings extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encodings", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encoding = new XFAObjectArray(); + } +} +class Encrypt extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encrypt", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = null; + } +} +class EncryptData extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptData", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["encrypt", "decrypt"]); + this.target = attributes.target || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.filter = null; + this.manifest = null; + } +} +class Encryption extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryption", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new XFAObjectArray(); + } +} +class EncryptionMethod extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EncryptionMethods extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethods", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encryptionMethod = new XFAObjectArray(); + } +} +class Event extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "event", true); + this.activity = getStringOption(attributes.activity, ["click", "change", "docClose", "docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", "mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", "preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]); + this.id = attributes.id || ""; + this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]); + this.name = attributes.name || ""; + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.encryptData = null; + this.execute = null; + this.script = null; + this.signData = null; + this.submit = null; + } +} +class ExData extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exData"); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.maxLength = getInteger({ + data: attributes.maxLength, + defaultValue: -1, + validate: x => x >= -1 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$isCDATAXml]() { + return this.contentType === "text/html"; + } + [$onChild](child) { + if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; + } + if (this.contentType === "text/xml") { + this[$content] = child; + return true; + } + return false; + } + [$toHTML](availableSpace) { + if (this.contentType !== "text/html" || !this[$content]) { + return HTMLResult.EMPTY; + } + return this[$content][$toHTML](availableSpace); + } +} +class ExObject extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exObject", true); + this.archive = attributes.archive || ""; + this.classId = attributes.classId || ""; + this.codeBase = attributes.codeBase || ""; + this.codeType = attributes.codeType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class ExclGroup extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exclGroup", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.border = null; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.connect = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + } + [$isBindable]() { + return true; + } + [$hasSettableValue]() { + return true; + } + [$setValue](value) { + for (const field of this.field.children) { + if (!field.value) { + const nodeValue = new Value({}); + field[$appendChild](nodeValue); + field.value = nodeValue; + } + field.value[$setValue](value); + } + } + [$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); + } + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; + } + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[$extra]._isSplittable = false; + return false; + } + if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { + return false; + } + this[$extra]._isSplittable = true; + return true; + } + [$flushHTML]() { + return flushHTML(this); + } + [$addHTML](html, bbox) { + addHTML(this, html, bbox); + } + [$getAvailableSpace]() { + return getAvailableSpace(this); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return HTMLResult.EMPTY; + } + fixDimensions(this); + const children = []; + const attributes = { + id: this[$uid], + class: [] + }; + setAccess(this, attributes.class); + if (!this[$extra]) { + this[$extra] = Object.create(null); + } + Object.assign(this[$extra], { + children, + attributes, + attempt: 0, + line: null, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set(["field"]); + if (this.layout.includes("row")) { + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; + } + } + const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); + const classNames = ["xfaExclgroup"]; + const cl = layoutClass(this); + if (cl) { + classNames.push(cl); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + this[$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { + if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[$extra].numberInLine = 0; + } + const result = this[$childrenToHTML]({ + filter, + include: true + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[$popPara](); + return result; + } + if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) { + this[$extra].attempt = maxRun; + break; + } + } + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + if (this[$extra].attempt === maxRun) { + if (!isSplittable) { + delete this[$extra]; + } + return HTMLResult.FAILURE; + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[$extra].width + marginH, this.w || 0); + const height = Math.max(this[$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = measureToString(width); + } + if (this.h === "") { + style.height = measureToString(height); + } + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + delete this[$extra]; + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Execute extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "execute"); + this.connection = attributes.connection || ""; + this.executeType = getStringOption(attributes.executeType, ["import", "remerge"]); + this.id = attributes.id || ""; + this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Extras extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "extras", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.extras = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class Field extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "field", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.rotate = getInteger({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.border = null; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.format = null; + this.items = new XFAObjectArray(2); + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.validate = null; + this.value = null; + this.bindItems = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + } + [$isBindable]() { + return true; + } + [$setValue](value) { + _setValue(this, value); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (!this.ui) { + this.ui = new Ui({}); + this.ui[$globalData] = this[$globalData]; + this[$appendChild](this.ui); + let node; + switch (this.items.children.length) { + case 0: + node = new TextEdit({}); + this.ui.textEdit = node; + break; + case 1: + node = new CheckButton({}); + this.ui.checkButton = node; + break; + case 2: + node = new ChoiceList({}); + this.ui.choiceList = node; + break; + } + this.ui[$appendChild](node); + } + if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return HTMLResult.EMPTY; + } + if (this.caption) { + delete this.caption[$extra]; + } + this[$pushPara](); + const caption = this.caption ? this.caption[$toHTML](availableSpace).html : null; + const savedW = this.w; + const savedH = this.h; + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + let borderDims = null; + if (this.w === "" || this.h === "") { + let width = null; + let height = null; + let uiW = 0; + let uiH = 0; + if (this.ui.checkButton) { + uiW = uiH = this.ui.checkButton.size; + } else { + const { + w, + h + } = layoutNode(this, availableSpace); + if (w !== null) { + uiW = w; + uiH = h; + } else { + uiH = fonts_getMetrics(this.font, true).lineNoGap; + } + } + borderDims = getBorderDims(this.ui[$getExtra]()); + uiW += borderDims.w; + uiH += borderDims.h; + if (this.caption) { + const { + w, + h, + isBroken + } = this.caption[$getExtra](availableSpace); + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); + return HTMLResult.FAILURE; + } + width = w; + height = h; + switch (this.caption.placement) { + case "left": + case "right": + case "inline": + width += uiW; + break; + case "top": + case "bottom": + height += uiH; + break; + } + } else { + width = uiW; + height = uiH; + } + if (width && this.w === "") { + width += marginH; + this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW); + } + if (height && this.h === "") { + height += marginV; + this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH); + } + } + this[$popPara](); + fixDimensions(this); + setFirstUnsplittable(this); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign"); + setMinMaxDimensions(this, style); + const classNames = ["xfaField"]; + if (this.font) { + classNames.push("xfaFont"); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[$uid], + class: classNames + }; + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + setAccess(this, classNames); + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const borderStyle = this.border ? this.border[$toStyle]() : null; + const bbox = computeBbox(this, html, availableSpace); + const ui = this.ui[$toHTML]().html; + if (!ui) { + Object.assign(style, borderStyle); + return HTMLResult.success(createWrapper(this, html), bbox); + } + if (this[$tabIndex]) { + if (ui.children?.[0]) { + ui.children[0].attributes.tabindex = this[$tabIndex]; + } else { + ui.attributes.tabindex = this[$tabIndex]; + } + } + if (!ui.attributes.style) { + ui.attributes.style = Object.create(null); + } + let aElement = null; + if (this.ui.button) { + if (ui.children.length === 1) { + [aElement] = ui.children.splice(0, 1); + } + Object.assign(ui.attributes.style, borderStyle); + } else { + Object.assign(style, borderStyle); + } + children.push(ui); + if (this.value) { + if (this.ui.imageEdit) { + ui.children.push(this.value[$toHTML]().html); + } else if (!this.ui.button) { + let value = ""; + if (this.value.exData) { + value = this.value.exData[$text](); + } else if (this.value.text) { + value = this.value.text[$getExtra](); + } else { + const htmlValue = this.value[$toHTML]().html; + if (htmlValue !== null) { + value = htmlValue.children[0].value; + } + } + if (this.ui.textEdit && this.value.text?.maxChars) { + ui.children[0].attributes.maxLength = this.value.text.maxChars; + } + if (value) { + if (this.ui.numericEdit) { + value = parseFloat(value); + value = isNaN(value) ? "" : value.toString(); + } + if (ui.children[0].name === "textarea") { + ui.children[0].attributes.textContent = value; + } else { + ui.children[0].attributes.value = value; + } + } + } + } + if (!this.ui.imageEdit && ui.children?.[0] && this.h) { + borderDims = borderDims || getBorderDims(this.ui[$getExtra]()); + let captionHeight = 0; + if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { + captionHeight = this.caption.reserve; + if (captionHeight <= 0) { + captionHeight = this.caption[$getExtra](availableSpace).h; + } + const inputHeight = this.h - captionHeight - marginV - borderDims.h; + ui.children[0].attributes.style.height = measureToString(inputHeight); + } else { + ui.children[0].attributes.style.height = "100%"; + } + } + if (aElement) { + ui.children.push(aElement); + } + if (!caption) { + if (ui.attributes.class) { + ui.attributes.class.push("xfaLeft"); + } + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); + } + if (this.ui.button) { + if (style.padding) { + delete style.padding; + } + if (caption.name === "div") { + caption.name = "span"; + } + ui.children.push(caption); + return HTMLResult.success(html, bbox); + } else if (this.ui.checkButton) { + caption.attributes.class[0] = "xfaCaptionForCheckButton"; + } + if (!ui.attributes.class) { + ui.attributes.class = []; + } + ui.children.splice(0, 0, caption); + switch (this.caption.placement) { + case "left": + ui.attributes.class.push("xfaLeft"); + break; + case "right": + ui.attributes.class.push("xfaRight"); + break; + case "top": + ui.attributes.class.push("xfaTop"); + break; + case "bottom": + ui.attributes.class.push("xfaBottom"); + break; + case "inline": + ui.attributes.class.push("xfaLeft"); + break; + } + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Fill extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "fill", true); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + this.linear = null; + this.pattern = null; + this.radial = null; + this.solid = null; + this.stipple = null; + } + [$toStyle]() { + const parent = this[$getParent](); + const grandpa = parent[$getParent](); + const ggrandpa = grandpa[$getParent](); + const style = Object.create(null); + let propName = "color"; + let altPropName = propName; + if (parent instanceof Border) { + propName = "background-color"; + altPropName = "background"; + if (ggrandpa instanceof Ui) { + style.backgroundColor = "white"; + } + } + if (parent instanceof Rectangle || parent instanceof Arc) { + propName = altPropName = "fill"; + style.fill = "white"; + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "color") { + continue; + } + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + const color = obj[$toStyle](this.color); + if (color) { + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } + if (this.color?.value) { + const color = this.color[$toStyle](); + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } +} +class Filter extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "filter", true); + this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.version = getInteger({ + data: this.version, + defaultValue: 5, + validate: x => x >= 1 && x <= 5 + }); + this.appearanceFilter = null; + this.certificates = null; + this.digestMethods = null; + this.encodings = null; + this.encryptionMethods = null; + this.handler = null; + this.lockDocument = null; + this.mdp = null; + this.reasons = null; + this.timeStamp = null; + } +} +class Float extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "float"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class template_Font extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "font", true); + this.baselineShift = getMeasurement(attributes.baselineShift); + this.fontHorizontalScale = getFloat({ + data: attributes.fontHorizontalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.fontVerticalScale = getFloat({ + data: attributes.fontVerticalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.id = attributes.id || ""; + this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]); + this.letterSpacing = getMeasurement(attributes.letterSpacing, "0"); + this.lineThrough = getInteger({ + data: attributes.lineThrough, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]); + this.overline = getInteger({ + data: attributes.overline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.overlinePeriod = getStringOption(attributes.overlinePeriod, ["all", "word"]); + this.posture = getStringOption(attributes.posture, ["normal", "italic"]); + this.size = getMeasurement(attributes.size, "10pt"); + this.typeface = attributes.typeface || "Courier"; + this.underline = getInteger({ + data: attributes.underline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.underlinePeriod = getStringOption(attributes.underlinePeriod, ["all", "word"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.weight = getStringOption(attributes.weight, ["normal", "bold"]); + this.extras = null; + this.fill = null; + } + [$clean](builder) { + super[$clean](builder); + this[$globalData].usedTypefaces.add(this.typeface); + } + [$toStyle]() { + const style = toStyle(this, "fill"); + const color = style.color; + if (color) { + if (color === "#000000") { + delete style.color; + } else if (!color.startsWith("#")) { + style.background = color; + style.backgroundClip = "text"; + style.color = "transparent"; + } + } + if (this.baselineShift) { + style.verticalAlign = measureToString(this.baselineShift); + } + style.fontKerning = this.kerningMode === "none" ? "none" : "normal"; + style.letterSpacing = measureToString(this.letterSpacing); + if (this.lineThrough !== 0) { + style.textDecoration = "line-through"; + if (this.lineThrough === 2) { + style.textDecorationStyle = "double"; + } + } + if (this.overline !== 0) { + style.textDecoration = "overline"; + if (this.overline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontStyle = this.posture; + style.fontSize = measureToString(0.99 * this.size); + setFontFamily(this, this, this[$globalData].fontFinder, style); + if (this.underline !== 0) { + style.textDecoration = "underline"; + if (this.underline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontWeight = this.weight; + return style; + } +} +class Format extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "format", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + } +} +class Handler extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "handler"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Hyphenation extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "hyphenation"); + this.excludeAllCaps = getInteger({ + data: attributes.excludeAllCaps, + defaultValue: 0, + validate: x => x === 1 + }); + this.excludeInitialCap = getInteger({ + data: attributes.excludeInitialCap, + defaultValue: 0, + validate: x => x === 1 + }); + this.hyphenate = getInteger({ + data: attributes.hyphenate, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.pushCharacterCount = getInteger({ + data: attributes.pushCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.remainCharacterCount = getInteger({ + data: attributes.remainCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wordCharacterCount = getInteger({ + data: attributes.wordCharacterCount, + defaultValue: 7, + validate: x => x >= 0 + }); + } +} +class Image extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "image"); + this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$toHTML]() { + if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { + return HTMLResult.EMPTY; + } + let buffer = this[$globalData].images && this[$globalData].images.get(this.href); + if (!buffer && (this.href || !this[$content])) { + return HTMLResult.EMPTY; + } + if (!buffer && this.transferEncoding === "base64") { + buffer = fromBase64Util(this[$content]); + } + if (!buffer) { + return HTMLResult.EMPTY; + } + if (!this.contentType) { + for (const [header, type] of IMAGES_HEADERS) { + if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) { + this.contentType = type; + break; + } + } + if (!this.contentType) { + return HTMLResult.EMPTY; + } + } + const blob = new Blob([buffer], { + type: this.contentType + }); + let style; + switch (this.aspect) { + case "fit": + case "actual": + break; + case "height": + style = { + height: "100%", + objectFit: "fill" + }; + break; + case "none": + style = { + width: "100%", + height: "100%", + objectFit: "fill" + }; + break; + case "width": + style = { + width: "100%", + objectFit: "fill" + }; + break; + } + const parent = this[$getParent](); + return HTMLResult.success({ + name: "img", + attributes: { + class: ["xfaImage"], + style, + src: URL.createObjectURL(blob), + alt: parent ? ariaLabel(parent[$getParent]()) : null + } + }); + } +} +class ImageEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "imageEdit", true); + this.data = getStringOption(attributes.data, ["link", "embed"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + if (this.data === "embed") { + return HTMLResult.success({ + name: "div", + children: [], + attributes: {} + }); + } + return HTMLResult.EMPTY; + } +} +class Integer extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "integer"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseInt(this[$content].trim(), 10); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class Issuers extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "issuers", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new XFAObjectArray(); + } +} +class Items extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "items", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.ref = attributes.ref || ""; + this.save = getInteger({ + data: attributes.save, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } + [$toHTML]() { + const output = []; + for (const child of this[$getChildren]()) { + output.push(child[$text]()); + } + return HTMLResult.success(output); + } +} +class Keep extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "keep", true); + this.id = attributes.id || ""; + const options = ["none", "contentArea", "pageArea"]; + this.intact = getStringOption(attributes.intact, options); + this.next = getStringOption(attributes.next, options); + this.previous = getStringOption(attributes.previous, options); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class KeyUsage extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "keyUsage"); + const options = ["", "yes", "no"]; + this.crlSign = getStringOption(attributes.crlSign, options); + this.dataEncipherment = getStringOption(attributes.dataEncipherment, options); + this.decipherOnly = getStringOption(attributes.decipherOnly, options); + this.digitalSignature = getStringOption(attributes.digitalSignature, options); + this.encipherOnly = getStringOption(attributes.encipherOnly, options); + this.id = attributes.id || ""; + this.keyAgreement = getStringOption(attributes.keyAgreement, options); + this.keyCertSign = getStringOption(attributes.keyCertSign, options); + this.keyEncipherment = getStringOption(attributes.keyEncipherment, options); + this.nonRepudiation = getStringOption(attributes.nonRepudiation, options); + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Line extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "line", true); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.slope = getStringOption(attributes.slope, ["\\", "/"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + } + [$toHTML]() { + const parent = this[$getParent]()[$getParent](); + const edge = this.edge || new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + const thickness = edge.presence === "visible" ? edge.thickness : 0; + style.strokeWidth = measureToString(thickness); + style.stroke = edgeStyle.color; + let x1, y1, x2, y2; + let width = "100%"; + let height = "100%"; + if (parent.w <= thickness) { + [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"]; + width = style.strokeWidth; + } else if (parent.h <= thickness) { + [x1, y1, x2, y2] = [0, "50%", "100%", "50%"]; + height = style.strokeWidth; + } else if (this.slope === "\\") { + [x1, y1, x2, y2] = [0, 0, "100%", "100%"]; + } else { + [x1, y1, x2, y2] = [0, "100%", "100%", 0]; + } + const line = { + name: "line", + attributes: { + xmlns: SVG_NS, + x1, + y1, + x2, + y2, + style + } + }; + const svg = { + name: "svg", + children: [line], + attributes: { + xmlns: SVG_NS, + width, + height, + style: { + overflow: "visible" + } + } + }; + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class Linear extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "linear", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase(); + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + return `linear-gradient(${transf}, ${startColor}, ${endColor})`; + } +} +class LockDocument extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "lockDocument"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + this[$content] = getStringOption(this[$content], ["auto", "0", "1"]); + } +} +class Manifest extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "manifest", true); + this.action = getStringOption(attributes.action, ["include", "all", "exclude"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.ref = new XFAObjectArray(); + } +} +class Margin extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "margin", true); + this.bottomInset = getMeasurement(attributes.bottomInset, "0"); + this.id = attributes.id || ""; + this.leftInset = getMeasurement(attributes.leftInset, "0"); + this.rightInset = getMeasurement(attributes.rightInset, "0"); + this.topInset = getMeasurement(attributes.topInset, "0"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toStyle]() { + return { + margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset) + }; + } +} +class Mdp extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "mdp"); + this.id = attributes.id || ""; + this.permissions = getInteger({ + data: attributes.permissions, + defaultValue: 2, + validate: x => x === 1 || x === 3 + }); + this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Medium extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "medium"); + this.id = attributes.id || ""; + this.imagingBBox = getBBox(attributes.imagingBBox); + this.long = getMeasurement(attributes.long); + this.orientation = getStringOption(attributes.orientation, ["portrait", "landscape"]); + this.short = getMeasurement(attributes.short); + this.stock = attributes.stock || ""; + this.trayIn = getStringOption(attributes.trayIn, ["auto", "delegate", "pageFront"]); + this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Message extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "message", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.text = new XFAObjectArray(); + } +} +class NumericEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "numericEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + const field = this[$getParent]()[$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Occur extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "occur", true); + this.id = attributes.id || ""; + this.initial = attributes.initial !== "" ? getInteger({ + data: attributes.initial, + defaultValue: "", + validate: x => true + }) : ""; + this.max = attributes.max !== "" ? getInteger({ + data: attributes.max, + defaultValue: 1, + validate: x => true + }) : ""; + this.min = attributes.min !== "" ? getInteger({ + data: attributes.min, + defaultValue: 1, + validate: x => true + }) : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$clean]() { + const parent = this[$getParent](); + const originalMin = this.min; + if (this.min === "") { + this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1; + } + if (this.max === "") { + if (originalMin === "") { + this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1; + } else { + this.max = this.min; + } + } + if (this.max !== -1 && this.max < this.min) { + this.max = this.min; + } + if (this.initial === "") { + this.initial = parent instanceof Template ? 1 : this.min; + } + } +} +class Oid extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "oid"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Oids extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "oids", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.oid = new XFAObjectArray(); + } +} +class Overflow extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "overflow"); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.target = attributes.target || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$getExtra]() { + if (!this[$extra]) { + const parent = this[$getParent](); + const root = this[$getTemplateRoot](); + const target = root[$searchNode](this.target, parent); + const leader = root[$searchNode](this.leader, parent); + const trailer = root[$searchNode](this.trailer, parent); + this[$extra] = { + target: target?.[0] || null, + leader: leader?.[0] || null, + trailer: trailer?.[0] || null, + addLeader: false, + addTrailer: false + }; + } + return this[$extra]; + } +} +class PageArea extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageArea", true); + this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]); + this.id = attributes.id || ""; + this.initialNumber = getInteger({ + data: attributes.initialNumber, + defaultValue: 1, + validate: x => true + }); + this.name = attributes.name || ""; + this.numbered = getInteger({ + data: attributes.numbered, + defaultValue: 1, + validate: x => true + }); + this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]); + this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.desc = null; + this.extras = null; + this.medium = null; + this.occur = null; + this.area = new XFAObjectArray(); + this.contentArea = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + } + [$isUsable]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0 + }; + return true; + } + return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; + } + [$cleanPage]() { + delete this[$extra]; + } + [$getNextPage]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0 + }; + } + const parent = this[$getParent](); + if (parent.relation === "orderedOccurrence") { + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + return this; + } + } + return parent[$getNextPage](); + } + [$getAvailableSpace]() { + return this[$extra].space || { + width: 0, + height: 0 + }; + } + [$toHTML]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 1 + }; + } + const children = []; + this[$extra].children = children; + const style = Object.create(null); + if (this.medium && this.medium.short && this.medium.long) { + style.width = measureToString(this.medium.short); + style.height = measureToString(this.medium.long); + this[$extra].space = { + width: this.medium.short, + height: this.medium.long + }; + if (this.medium.orientation === "landscape") { + const x = style.width; + style.width = style.height; + style.height = x; + this[$extra].space = { + width: this.medium.long, + height: this.medium.short + }; + } + } else { + warn("XFA - No medium specified in pageArea: please file a bug."); + } + this[$childrenToHTML]({ + filter: new Set(["area", "draw", "field", "subform"]), + include: true + }); + this[$childrenToHTML]({ + filter: new Set(["contentArea"]), + include: true + }); + return HTMLResult.success({ + name: "div", + children, + attributes: { + class: ["xfaPage"], + id: this[$uid], + style, + xfaName: this.name + } + }); + } +} +class PageSet extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageSet", true); + this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.occur = null; + this.pageArea = new XFAObjectArray(); + this.pageSet = new XFAObjectArray(); + } + [$cleanPage]() { + for (const page of this.pageArea.children) { + page[$cleanPage](); + } + for (const page of this.pageSet.children) { + page[$cleanPage](); + } + } + [$isUsable]() { + return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; + } + [$getNextPage]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 1, + pageIndex: -1, + pageSetIndex: -1 + }; + } + if (this.relation === "orderedOccurrence") { + if (this[$extra].pageIndex + 1 < this.pageArea.children.length) { + this[$extra].pageIndex += 1; + const pageArea = this.pageArea.children[this[$extra].pageIndex]; + return pageArea[$getNextPage](); + } + if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) { + this[$extra].pageSetIndex += 1; + return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage](); + } + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + this[$extra].pageIndex = -1; + this[$extra].pageSetIndex = -1; + return this[$getNextPage](); + } + const parent = this[$getParent](); + if (parent instanceof PageSet) { + return parent[$getNextPage](); + } + this[$cleanPage](); + return this[$getNextPage](); + } + const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber; + const parity = pageNumber % 2 === 0 ? "even" : "odd"; + const position = pageNumber === 0 ? "first" : "rest"; + let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any"); + if (page) { + return page; + } + return this.pageArea.children[0]; + } +} +class Para extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "para", true); + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.lineHeight = attributes.lineHeight ? getMeasurement(attributes.lineHeight, "0pt") : ""; + this.marginLeft = attributes.marginLeft ? getMeasurement(attributes.marginLeft, "0pt") : ""; + this.marginRight = attributes.marginRight ? getMeasurement(attributes.marginRight, "0pt") : ""; + this.orphans = getInteger({ + data: attributes.orphans, + defaultValue: 0, + validate: x => x >= 0 + }); + this.preserve = attributes.preserve || ""; + this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : ""; + this.spaceAbove = attributes.spaceAbove ? getMeasurement(attributes.spaceAbove, "0pt") : ""; + this.spaceBelow = attributes.spaceBelow ? getMeasurement(attributes.spaceBelow, "0pt") : ""; + this.tabDefault = attributes.tabDefault ? getMeasurement(this.tabDefault) : ""; + this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? getMeasurement(x) : x); + this.textIndent = attributes.textIndent ? getMeasurement(attributes.textIndent, "0pt") : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vAlign = getStringOption(attributes.vAlign, ["top", "bottom", "middle"]); + this.widows = getInteger({ + data: attributes.widows, + defaultValue: 0, + validate: x => x >= 0 + }); + this.hyphenation = null; + } + [$toStyle]() { + const style = toStyle(this, "hAlign"); + if (this.marginLeft !== "") { + style.paddingLeft = measureToString(this.marginLeft); + } + if (this.marginRight !== "") { + style.paddingRight = measureToString(this.marginRight); + } + if (this.spaceAbove !== "") { + style.paddingTop = measureToString(this.spaceAbove); + } + if (this.spaceBelow !== "") { + style.paddingBottom = measureToString(this.spaceBelow); + } + if (this.textIndent !== "") { + style.textIndent = measureToString(this.textIndent); + fixTextIndent(style); + } + if (this.lineHeight > 0) { + style.lineHeight = measureToString(this.lineHeight); + } + if (this.tabDefault !== "") { + style.tabSize = measureToString(this.tabDefault); + } + if (this.tabStops.length > 0) {} + if (this.hyphenatation) { + Object.assign(style, this.hyphenatation[$toStyle]()); + } + return style; + } +} +class PasswordEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "passwordEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.passwordChar = attributes.passwordChar || "*"; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } +} +class template_Pattern extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pattern", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + const width = 5; + const cmd = "repeating-linear-gradient"; + const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`; + switch (this.type) { + case "crossHatch": + return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`; + case "crossDiagonal": + return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; + case "diagonalLeft": + return `${cmd}(45deg,${colors})`; + case "diagonalRight": + return `${cmd}(-45deg,${colors})`; + case "horizontal": + return `${cmd}(to top,${colors})`; + case "vertical": + return `${cmd}(to right,${colors})`; + } + return ""; + } +} +class Picture extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "picture"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Proto extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "proto", true); + this.appearanceFilter = new XFAObjectArray(); + this.arc = new XFAObjectArray(); + this.area = new XFAObjectArray(); + this.assist = new XFAObjectArray(); + this.barcode = new XFAObjectArray(); + this.bindItems = new XFAObjectArray(); + this.bookend = new XFAObjectArray(); + this.boolean = new XFAObjectArray(); + this.border = new XFAObjectArray(); + this.break = new XFAObjectArray(); + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.button = new XFAObjectArray(); + this.calculate = new XFAObjectArray(); + this.caption = new XFAObjectArray(); + this.certificate = new XFAObjectArray(); + this.certificates = new XFAObjectArray(); + this.checkButton = new XFAObjectArray(); + this.choiceList = new XFAObjectArray(); + this.color = new XFAObjectArray(); + this.comb = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.contentArea = new XFAObjectArray(); + this.corner = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.dateTimeEdit = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.defaultUi = new XFAObjectArray(); + this.desc = new XFAObjectArray(); + this.digestMethod = new XFAObjectArray(); + this.digestMethods = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.edge = new XFAObjectArray(); + this.encoding = new XFAObjectArray(); + this.encodings = new XFAObjectArray(); + this.encrypt = new XFAObjectArray(); + this.encryptData = new XFAObjectArray(); + this.encryption = new XFAObjectArray(); + this.encryptionMethod = new XFAObjectArray(); + this.encryptionMethods = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.execute = new XFAObjectArray(); + this.extras = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.fill = new XFAObjectArray(); + this.filter = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.font = new XFAObjectArray(); + this.format = new XFAObjectArray(); + this.handler = new XFAObjectArray(); + this.hyphenation = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.imageEdit = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.issuers = new XFAObjectArray(); + this.items = new XFAObjectArray(); + this.keep = new XFAObjectArray(); + this.keyUsage = new XFAObjectArray(); + this.line = new XFAObjectArray(); + this.linear = new XFAObjectArray(); + this.lockDocument = new XFAObjectArray(); + this.manifest = new XFAObjectArray(); + this.margin = new XFAObjectArray(); + this.mdp = new XFAObjectArray(); + this.medium = new XFAObjectArray(); + this.message = new XFAObjectArray(); + this.numericEdit = new XFAObjectArray(); + this.occur = new XFAObjectArray(); + this.oid = new XFAObjectArray(); + this.oids = new XFAObjectArray(); + this.overflow = new XFAObjectArray(); + this.pageArea = new XFAObjectArray(); + this.pageSet = new XFAObjectArray(); + this.para = new XFAObjectArray(); + this.passwordEdit = new XFAObjectArray(); + this.pattern = new XFAObjectArray(); + this.picture = new XFAObjectArray(); + this.radial = new XFAObjectArray(); + this.reason = new XFAObjectArray(); + this.reasons = new XFAObjectArray(); + this.rectangle = new XFAObjectArray(); + this.ref = new XFAObjectArray(); + this.script = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + this.signData = new XFAObjectArray(); + this.signature = new XFAObjectArray(); + this.signing = new XFAObjectArray(); + this.solid = new XFAObjectArray(); + this.speak = new XFAObjectArray(); + this.stipple = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + this.subjectDN = new XFAObjectArray(); + this.subjectDNs = new XFAObjectArray(); + this.submit = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.textEdit = new XFAObjectArray(); + this.time = new XFAObjectArray(); + this.timeStamp = new XFAObjectArray(); + this.toolTip = new XFAObjectArray(); + this.traversal = new XFAObjectArray(); + this.traverse = new XFAObjectArray(); + this.ui = new XFAObjectArray(); + this.validate = new XFAObjectArray(); + this.value = new XFAObjectArray(); + this.variables = new XFAObjectArray(); + } +} +class Radial extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "radial", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`; + return `radial-gradient(circle at center, ${colors})`; + } +} +class Reason extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "reason"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Reasons extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "reasons", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.reason = new XFAObjectArray(); + } +} +class Rectangle extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "rectangle", true); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.corner = new XFAObjectArray(4); + this.edge = new XFAObjectArray(4); + this.fill = null; + } + [$toHTML]() { + const edge = this.edge.children.length ? this.edge.children[0] : new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); + style.stroke = edgeStyle.color; + const corner = this.corner.children.length ? this.corner.children[0] : new Corner({}); + const cornerStyle = corner[$toStyle](); + const rect = { + name: "rect", + attributes: { + xmlns: SVG_NS, + width: "100%", + height: "100%", + x: 0, + y: 0, + rx: cornerStyle.radius, + ry: cornerStyle.radius, + style + } + }; + const svg = { + name: "svg", + children: [rect], + attributes: { + xmlns: SVG_NS, + style: { + overflow: "visible" + }, + width: "100%", + height: "100%" + } + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class RefElement extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ref"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Script extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "script"); + this.binding = attributes.binding || ""; + this.contentType = attributes.contentType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SetProperty extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "setProperty"); + this.connection = attributes.connection || ""; + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + } +} +class SignData extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signData", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["sign", "clear", "verify"]); + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.filter = null; + this.manifest = null; + } +} +class Signature extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signature", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.filter = null; + this.manifest = null; + this.margin = null; + } +} +class Signing extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signing", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new XFAObjectArray(); + } +} +class Solid extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "solid", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toStyle](startColor) { + return startColor ? startColor[$toStyle]() : "#FFFFFF"; + } +} +class Speak extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "speak"); + this.disable = getInteger({ + data: attributes.disable, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]); + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Stipple extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "stipple", true); + this.id = attributes.id || ""; + this.rate = getInteger({ + data: attributes.rate, + defaultValue: 50, + validate: x => x >= 0 && x <= 100 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](bgColor) { + const alpha = this.rate / 100; + return Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha)); + } +} +class Subform extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subform", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.allowMacro = getInteger({ + data: attributes.allowMacro, + defaultValue: 0, + validate: x => x === 1 + }); + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x)); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.mergeMode = getStringOption(attributes.mergeMode, ["consumeData", "matchTemplate"]); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.restoreState = getStringOption(attributes.restoreState, ["manual", "auto"]); + this.scope = getStringOption(attributes.scope, ["name", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.bookend = null; + this.border = null; + this.break = null; + this.calculate = null; + this.desc = null; + this.extras = null; + this.keep = null; + this.margin = null; + this.occur = null; + this.overflow = null; + this.pageSet = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.variables = null; + this.area = new XFAObjectArray(); + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.proto = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + [$getSubformParent]() { + const parent = this[$getParent](); + if (parent instanceof SubformSet) { + return parent[$getSubformParent](); + } + return parent; + } + [$isBindable]() { + return true; + } + [$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$flushHTML]() { + return flushHTML(this); + } + [$addHTML](html, bbox) { + addHTML(this, html, bbox); + } + [$getAvailableSpace]() { + return getAvailableSpace(this); + } + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; + } + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[$extra]._isSplittable = false; + return false; + } + if (this.keep && this.keep.intact !== "none") { + this[$extra]._isSplittable = false; + return false; + } + if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { + return false; + } + this[$extra]._isSplittable = true; + return true; + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.break) { + if (this.break.after !== "auto" || this.break.afterTarget !== "") { + const node = new BreakAfter({ + targetType: this.break.after, + target: this.break.afterTarget, + startNew: this.break.startNew.toString() + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakAfter.push(node); + } + if (this.break.before !== "auto" || this.break.beforeTarget !== "") { + const node = new BreakBefore({ + targetType: this.break.before, + target: this.break.beforeTarget, + startNew: this.break.startNew.toString() + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakBefore.push(node); + } + if (this.break.overflowTarget !== "") { + const node = new Overflow({ + target: this.break.overflowTarget, + leader: this.break.overflowLeader, + trailer: this.break.overflowTrailer + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.overflow.push(node); + } + this[$removeChild](this.break); + this.break = null; + } + if (this.presence === "hidden" || this.presence === "inactive") { + return HTMLResult.EMPTY; + } + if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) { + warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug."); + } + if (this.breakBefore.children.length >= 1) { + const breakBefore = this.breakBefore.children[0]; + if (handleBreak(breakBefore)) { + return HTMLResult.breakNode(breakBefore); + } + } + if (this[$extra]?.afterBreakAfter) { + return HTMLResult.EMPTY; + } + fixDimensions(this); + const children = []; + const attributes = { + id: this[$uid], + class: [] + }; + setAccess(this, attributes.class); + if (!this[$extra]) { + this[$extra] = Object.create(null); + } + Object.assign(this[$extra], { + children, + line: null, + attributes, + attempt: 0, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const root = this[$getTemplateRoot](); + const savedNoLayoutFailure = root[$extra].noLayoutFailure; + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]); + if (this.layout.includes("row")) { + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; + } + } + const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); + const classNames = ["xfaSubform"]; + const cl = layoutClass(this); + if (cl) { + classNames.push(cl); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + if (this.overflow) { + const overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addLeader) { + overflowExtra.addLeader = false; + handleOverflow(this, overflowExtra.leader, availableSpace); + } + } + this[$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { + if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[$extra].numberInLine = 0; + } + const result = this[$childrenToHTML]({ + filter, + include: true + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[$popPara](); + return result; + } + if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) { + this[$extra].attempt = maxRun; + break; + } + } + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + root[$extra].noLayoutFailure = savedNoLayoutFailure; + if (this[$extra].attempt === maxRun) { + if (this.overflow) { + this[$getTemplateRoot]()[$extra].overflowNode = this.overflow; + } + if (!isSplittable) { + delete this[$extra]; + } + return HTMLResult.FAILURE; + } + if (this.overflow) { + const overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addTrailer) { + overflowExtra.addTrailer = false; + handleOverflow(this, overflowExtra.trailer, availableSpace); + } + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[$extra].width + marginH, this.w || 0); + const height = Math.max(this[$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = measureToString(width); + } + if (this.h === "") { + style.height = measureToString(height); + } + if ((style.width === "0px" || style.height === "0px") && children.length === 0) { + return HTMLResult.EMPTY; + } + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const result = HTMLResult.success(createWrapper(this, html), bbox); + if (this.breakAfter.children.length >= 1) { + const breakAfter = this.breakAfter.children[0]; + if (handleBreak(breakAfter)) { + this[$extra].afterBreakAfter = result; + return HTMLResult.breakNode(breakAfter); + } + } + delete this[$extra]; + return result; + } +} +class SubformSet extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subformSet", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, ["ordered", "choice", "unordered"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.bookend = null; + this.break = null; + this.desc = null; + this.extras = null; + this.occur = null; + this.overflow = null; + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$getSubformParent]() { + let parent = this[$getParent](); + while (!(parent instanceof Subform)) { + parent = parent[$getParent](); + } + return parent; + } + [$isBindable]() { + return true; + } +} +class SubjectDN extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDN"); + this.delimiter = attributes.delimiter || ","; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + this[$content] = new Map(this[$content].split(this.delimiter).map(kv => { + kv = kv.split("=", 2); + kv[0] = kv[0].trim(); + return kv; + })); + } +} +class SubjectDNs extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDNs", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.subjectDN = new XFAObjectArray(); + } +} +class Submit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "submit", true); + this.embedPDF = getInteger({ + data: attributes.embedPDF, + defaultValue: 0, + validate: x => x === 1 + }); + this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]); + this.id = attributes.id || ""; + this.target = attributes.target || ""; + this.textEncoding = getKeyword({ + data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.xdpContent = attributes.xdpContent || ""; + this.encrypt = null; + this.encryptData = new XFAObjectArray(); + this.signData = new XFAObjectArray(); + } +} +class Template extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "template", true); + this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]); + this.extras = null; + this.subform = new XFAObjectArray(); + } + [$finalize]() { + if (this.subform.children.length === 0) { + warn("XFA - No subforms in template node."); + } + if (this.subform.children.length >= 2) { + warn("XFA - Several subforms in template node: please file a bug."); + } + this[$tabIndex] = DEFAULT_TAB_INDEX; + } + [$isSplittable]() { + return true; + } + [$searchNode](expr, container) { + if (expr.startsWith("#")) { + return [this[$ids].get(expr.slice(1))]; + } + return searchNode(this, container, expr, true, true); + } + *[$toPages]() { + if (!this.subform.children.length) { + return HTMLResult.success({ + name: "div", + children: [] + }); + } + this[$extra] = { + overflowNode: null, + firstUnsplittable: null, + currentContentArea: null, + currentPageArea: null, + noLayoutFailure: false, + pageNumber: 1, + pagePosition: "first", + oddOrEven: "odd", + blankOrNotBlank: "nonBlank", + paraStack: [] + }; + const root = this.subform.children[0]; + root.pageSet[$cleanPage](); + const pageAreas = root.pageSet.pageArea.children; + const mainHtml = { + name: "div", + children: [] + }; + let pageArea = null; + let breakBefore = null; + let breakBeforeTarget = null; + if (root.breakBefore.children.length >= 1) { + breakBefore = root.breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) { + breakBefore = root.subform.children[0].breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.break?.beforeTarget) { + breakBefore = root.break; + breakBeforeTarget = breakBefore.beforeTarget; + } else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) { + breakBefore = root.subform.children[0].break; + breakBeforeTarget = breakBefore.beforeTarget; + } + if (breakBefore) { + const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]()); + if (target instanceof PageArea) { + pageArea = target; + breakBefore[$extra] = {}; + } + } + if (!pageArea) { + pageArea = pageAreas[0]; + } + pageArea[$extra] = { + numberOfUse: 1 + }; + const pageAreaParent = pageArea[$getParent](); + pageAreaParent[$extra] = { + numberOfUse: 1, + pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), + pageSetIndex: 0 + }; + let targetPageArea; + let leader = null; + let trailer = null; + let hasSomething = true; + let hasSomethingCounter = 0; + let startIndex = 0; + while (true) { + if (!hasSomething) { + mainHtml.children.pop(); + if (++hasSomethingCounter === MAX_EMPTY_PAGES) { + warn("XFA - Something goes wrong: please file a bug."); + return mainHtml; + } + } else { + hasSomethingCounter = 0; + } + targetPageArea = null; + this[$extra].currentPageArea = pageArea; + const page = pageArea[$toHTML]().html; + mainHtml.children.push(page); + if (leader) { + this[$extra].noLayoutFailure = true; + page.children.push(leader[$toHTML](pageArea[$extra].space).html); + leader = null; + } + if (trailer) { + this[$extra].noLayoutFailure = true; + page.children.push(trailer[$toHTML](pageArea[$extra].space).html); + trailer = null; + } + const contentAreas = pageArea.contentArea.children; + const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea")); + hasSomething = false; + this[$extra].firstUnsplittable = null; + this[$extra].noLayoutFailure = false; + const flush = index => { + const html = root[$flushHTML](); + if (html) { + hasSomething ||= html.children?.length > 0; + htmlContentAreas[index].children.push(html); + } + }; + for (let i = startIndex, ii = contentAreas.length; i < ii; i++) { + const contentArea = this[$extra].currentContentArea = contentAreas[i]; + const space = { + width: contentArea.w, + height: contentArea.h + }; + startIndex = 0; + if (leader) { + htmlContentAreas[i].children.push(leader[$toHTML](space).html); + leader = null; + } + if (trailer) { + htmlContentAreas[i].children.push(trailer[$toHTML](space).html); + trailer = null; + } + const html = root[$toHTML](space); + if (html.success) { + if (html.html) { + hasSomething ||= html.html.children?.length > 0; + htmlContentAreas[i].children.push(html.html); + } else if (!hasSomething && mainHtml.children.length > 1) { + mainHtml.children.pop(); + } + return mainHtml; + } + if (html.isBreak()) { + const node = html.breakNode; + flush(i); + if (node.targetType === "auto") { + continue; + } + if (node.leader) { + leader = this[$searchNode](node.leader, node[$getParent]()); + leader = leader ? leader[0] : null; + } + if (node.trailer) { + trailer = this[$searchNode](node.trailer, node[$getParent]()); + trailer = trailer ? trailer[0] : null; + } + if (node.targetType === "pageArea") { + targetPageArea = node[$extra].target; + i = Infinity; + } else if (!node[$extra].target) { + i = node[$extra].index; + } else { + targetPageArea = node[$extra].target; + startIndex = node[$extra].index + 1; + i = Infinity; + } + continue; + } + if (this[$extra].overflowNode) { + const node = this[$extra].overflowNode; + this[$extra].overflowNode = null; + const overflowExtra = node[$getExtra](); + const target = overflowExtra.target; + overflowExtra.addLeader = overflowExtra.leader !== null; + overflowExtra.addTrailer = overflowExtra.trailer !== null; + flush(i); + const currentIndex = i; + i = Infinity; + if (target instanceof PageArea) { + targetPageArea = target; + } else if (target instanceof ContentArea) { + const index = contentAreas.indexOf(target); + if (index !== -1) { + if (index > currentIndex) { + i = index - 1; + } else { + startIndex = index; + } + } else { + targetPageArea = target[$getParent](); + startIndex = targetPageArea.contentArea.children.indexOf(target); + } + } + continue; + } + flush(i); + } + this[$extra].pageNumber += 1; + if (targetPageArea) { + if (targetPageArea[$isUsable]()) { + targetPageArea[$extra].numberOfUse += 1; + } else { + targetPageArea = null; + } + } + pageArea = targetPageArea || pageArea[$getNextPage](); + yield null; + } + } +} +class Text extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "text"); + this.id = attributes.id || ""; + this.maxChars = getInteger({ + data: attributes.maxChars, + defaultValue: 0, + validate: x => x >= 0 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$acceptWhitespace]() { + return true; + } + [$onChild](child) { + if (child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; + } + warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`); + return false; + } + [$onText](str) { + if (this[$content] instanceof XFAObject) { + return; + } + super[$onText](str); + } + [$finalize]() { + if (typeof this[$content] === "string") { + this[$content] = this[$content].replaceAll("\r\n", "\n"); + } + } + [$getExtra]() { + if (typeof this[$content] === "string") { + return this[$content].split(/[\u2029\u2028\n]/).reduce((acc, line) => { + if (line) { + acc.push(line); + } + return acc; + }, []).join("\n"); + } + return this[$content][$text](); + } + [$toHTML](availableSpace) { + if (typeof this[$content] === "string") { + const html = valueToHtml(this[$content]).html; + if (this[$content].includes("\u2029")) { + html.name = "div"; + html.children = []; + this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) => { + acc.push({ + name: "span", + value: line + }, { + name: "br" + }); + return acc; + }, [])).forEach(lines => { + html.children.push({ + name: "p", + children: lines + }); + }); + } else if (/[\u2028\n]/.test(this[$content])) { + html.name = "div"; + html.children = []; + this[$content].split(/[\u2028\n]/).forEach(line => { + html.children.push({ + name: "span", + value: line + }, { + name: "br" + }); + }); + } + return HTMLResult.success(html); + } + return this[$content][$toHTML](availableSpace); + } +} +class TextEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "textEdit", true); + this.allowRichText = getInteger({ + data: attributes.allowRichText, + defaultValue: 0, + validate: x => x === 1 + }); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.multiLine = getInteger({ + data: attributes.multiLine, + defaultValue: "", + validate: x => x === 0 || x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]); + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + let html; + const field = this[$getParent]()[$getParent](); + if (this.multiLine === "") { + this.multiLine = field instanceof Draw ? 1 : 0; + } + if (this.multiLine === 1) { + html = { + name: "textarea", + attributes: { + dataId: field[$data]?.[$uid] || field[$uid], + fieldId: field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + } else { + html = { + name: "input", + attributes: { + type: "text", + dataId: field[$data]?.[$uid] || field[$uid], + fieldId: field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + } + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Time extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "time"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class TimeStamp extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "timeStamp"); + this.id = attributes.id || ""; + this.server = attributes.server || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class ToolTip extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "toolTip"); + this.id = attributes.id || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Traversal extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "traversal", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.traverse = new XFAObjectArray(); + } +} +class Traverse extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "traverse", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]); + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.script = null; + } + get name() { + return this.operation; + } + [$isTransparent]() { + return false; + } +} +class Ui extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ui", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + this.barcode = null; + this.button = null; + this.checkButton = null; + this.choiceList = null; + this.dateTimeEdit = null; + this.defaultUi = null; + this.imageEdit = null; + this.numericEdit = null; + this.passwordEdit = null; + this.signature = null; + this.textEdit = null; + } + [$getExtra]() { + if (this[$extra] === undefined) { + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "picture") { + continue; + } + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + this[$extra] = obj; + return obj; + } + this[$extra] = null; + } + return this[$extra]; + } + [$toHTML](availableSpace) { + const obj = this[$getExtra](); + if (obj) { + return obj[$toHTML](availableSpace); + } + return HTMLResult.EMPTY; + } +} +class Validate extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "validate", true); + this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]); + this.id = attributes.id || ""; + this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]); + this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.picture = null; + this.script = null; + } +} +class Value extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "value", true); + this.id = attributes.id || ""; + this.override = getInteger({ + data: attributes.override, + defaultValue: 0, + validate: x => x === 1 + }); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.arc = null; + this.boolean = null; + this.date = null; + this.dateTime = null; + this.decimal = null; + this.exData = null; + this.float = null; + this.image = null; + this.integer = null; + this.line = null; + this.rectangle = null; + this.text = null; + this.time = null; + } + [$setValue](value) { + const parent = this[$getParent](); + if (parent instanceof Field) { + if (parent.ui?.imageEdit) { + if (!this.image) { + this.image = new Image({}); + this[$appendChild](this.image); + } + this.image[$content] = value[$content]; + return; + } + } + const valueName = value[$nodeName]; + if (this[valueName] !== null) { + this[valueName][$content] = value[$content]; + return; + } + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (obj instanceof XFAObject) { + this[name] = null; + this[$removeChild](obj); + } + } + this[value[$nodeName]] = value; + this[$appendChild](value); + } + [$text]() { + if (this.exData) { + if (typeof this.exData[$content] === "string") { + return this.exData[$content].trim(); + } + return this.exData[$content][$text]().trim(); + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "image") { + continue; + } + const obj = this[name]; + if (obj instanceof XFAObject) { + return (obj[$content] || "").toString().trim(); + } + } + return null; + } + [$toHTML](availableSpace) { + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + return obj[$toHTML](availableSpace); + } + return HTMLResult.EMPTY; + } +} +class Variables extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "variables", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.manifest = new XFAObjectArray(); + this.script = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } + [$isTransparent]() { + return true; + } +} +class TemplateNamespace { + static [$buildXFAObject](name, attributes) { + if (TemplateNamespace.hasOwnProperty(name)) { + const node = TemplateNamespace[name](attributes); + node[$setSetAttributes](attributes); + return node; + } + return undefined; + } + static appearanceFilter(attrs) { + return new AppearanceFilter(attrs); + } + static arc(attrs) { + return new Arc(attrs); + } + static area(attrs) { + return new Area(attrs); + } + static assist(attrs) { + return new Assist(attrs); + } + static barcode(attrs) { + return new Barcode(attrs); + } + static bind(attrs) { + return new Bind(attrs); + } + static bindItems(attrs) { + return new BindItems(attrs); + } + static bookend(attrs) { + return new Bookend(attrs); + } + static boolean(attrs) { + return new BooleanElement(attrs); + } + static border(attrs) { + return new Border(attrs); + } + static break(attrs) { + return new Break(attrs); + } + static breakAfter(attrs) { + return new BreakAfter(attrs); + } + static breakBefore(attrs) { + return new BreakBefore(attrs); + } + static button(attrs) { + return new Button(attrs); + } + static calculate(attrs) { + return new Calculate(attrs); + } + static caption(attrs) { + return new Caption(attrs); + } + static certificate(attrs) { + return new Certificate(attrs); + } + static certificates(attrs) { + return new Certificates(attrs); + } + static checkButton(attrs) { + return new CheckButton(attrs); + } + static choiceList(attrs) { + return new ChoiceList(attrs); + } + static color(attrs) { + return new Color(attrs); + } + static comb(attrs) { + return new Comb(attrs); + } + static connect(attrs) { + return new Connect(attrs); + } + static contentArea(attrs) { + return new ContentArea(attrs); + } + static corner(attrs) { + return new Corner(attrs); + } + static date(attrs) { + return new DateElement(attrs); + } + static dateTime(attrs) { + return new DateTime(attrs); + } + static dateTimeEdit(attrs) { + return new DateTimeEdit(attrs); + } + static decimal(attrs) { + return new Decimal(attrs); + } + static defaultUi(attrs) { + return new DefaultUi(attrs); + } + static desc(attrs) { + return new Desc(attrs); + } + static digestMethod(attrs) { + return new DigestMethod(attrs); + } + static digestMethods(attrs) { + return new DigestMethods(attrs); + } + static draw(attrs) { + return new Draw(attrs); + } + static edge(attrs) { + return new Edge(attrs); + } + static encoding(attrs) { + return new Encoding(attrs); + } + static encodings(attrs) { + return new Encodings(attrs); + } + static encrypt(attrs) { + return new Encrypt(attrs); + } + static encryptData(attrs) { + return new EncryptData(attrs); + } + static encryption(attrs) { + return new Encryption(attrs); + } + static encryptionMethod(attrs) { + return new EncryptionMethod(attrs); + } + static encryptionMethods(attrs) { + return new EncryptionMethods(attrs); + } + static event(attrs) { + return new Event(attrs); + } + static exData(attrs) { + return new ExData(attrs); + } + static exObject(attrs) { + return new ExObject(attrs); + } + static exclGroup(attrs) { + return new ExclGroup(attrs); + } + static execute(attrs) { + return new Execute(attrs); + } + static extras(attrs) { + return new Extras(attrs); + } + static field(attrs) { + return new Field(attrs); + } + static fill(attrs) { + return new Fill(attrs); + } + static filter(attrs) { + return new Filter(attrs); + } + static float(attrs) { + return new Float(attrs); + } + static font(attrs) { + return new template_Font(attrs); + } + static format(attrs) { + return new Format(attrs); + } + static handler(attrs) { + return new Handler(attrs); + } + static hyphenation(attrs) { + return new Hyphenation(attrs); + } + static image(attrs) { + return new Image(attrs); + } + static imageEdit(attrs) { + return new ImageEdit(attrs); + } + static integer(attrs) { + return new Integer(attrs); + } + static issuers(attrs) { + return new Issuers(attrs); + } + static items(attrs) { + return new Items(attrs); + } + static keep(attrs) { + return new Keep(attrs); + } + static keyUsage(attrs) { + return new KeyUsage(attrs); + } + static line(attrs) { + return new Line(attrs); + } + static linear(attrs) { + return new Linear(attrs); + } + static lockDocument(attrs) { + return new LockDocument(attrs); + } + static manifest(attrs) { + return new Manifest(attrs); + } + static margin(attrs) { + return new Margin(attrs); + } + static mdp(attrs) { + return new Mdp(attrs); + } + static medium(attrs) { + return new Medium(attrs); + } + static message(attrs) { + return new Message(attrs); + } + static numericEdit(attrs) { + return new NumericEdit(attrs); + } + static occur(attrs) { + return new Occur(attrs); + } + static oid(attrs) { + return new Oid(attrs); + } + static oids(attrs) { + return new Oids(attrs); + } + static overflow(attrs) { + return new Overflow(attrs); + } + static pageArea(attrs) { + return new PageArea(attrs); + } + static pageSet(attrs) { + return new PageSet(attrs); + } + static para(attrs) { + return new Para(attrs); + } + static passwordEdit(attrs) { + return new PasswordEdit(attrs); + } + static pattern(attrs) { + return new template_Pattern(attrs); + } + static picture(attrs) { + return new Picture(attrs); + } + static proto(attrs) { + return new Proto(attrs); + } + static radial(attrs) { + return new Radial(attrs); + } + static reason(attrs) { + return new Reason(attrs); + } + static reasons(attrs) { + return new Reasons(attrs); + } + static rectangle(attrs) { + return new Rectangle(attrs); + } + static ref(attrs) { + return new RefElement(attrs); + } + static script(attrs) { + return new Script(attrs); + } + static setProperty(attrs) { + return new SetProperty(attrs); + } + static signData(attrs) { + return new SignData(attrs); + } + static signature(attrs) { + return new Signature(attrs); + } + static signing(attrs) { + return new Signing(attrs); + } + static solid(attrs) { + return new Solid(attrs); + } + static speak(attrs) { + return new Speak(attrs); + } + static stipple(attrs) { + return new Stipple(attrs); + } + static subform(attrs) { + return new Subform(attrs); + } + static subformSet(attrs) { + return new SubformSet(attrs); + } + static subjectDN(attrs) { + return new SubjectDN(attrs); + } + static subjectDNs(attrs) { + return new SubjectDNs(attrs); + } + static submit(attrs) { + return new Submit(attrs); + } + static template(attrs) { + return new Template(attrs); + } + static text(attrs) { + return new Text(attrs); + } + static textEdit(attrs) { + return new TextEdit(attrs); + } + static time(attrs) { + return new Time(attrs); + } + static timeStamp(attrs) { + return new TimeStamp(attrs); + } + static toolTip(attrs) { + return new ToolTip(attrs); + } + static traversal(attrs) { + return new Traversal(attrs); + } + static traverse(attrs) { + return new Traverse(attrs); + } + static ui(attrs) { + return new Ui(attrs); + } + static validate(attrs) { + return new Validate(attrs); + } + static value(attrs) { + return new Value(attrs); + } + static variables(attrs) { + return new Variables(attrs); + } +} + +;// ./src/core/xfa/bind.js + + + + + + +const bind_NS_DATASETS = NamespaceIds.datasets.id; +function createText(content) { + const node = new Text({}); + node[$content] = content; + return node; +} +class Binder { + constructor(root) { + this.root = root; + this.datasets = root.datasets; + this.data = root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data"); + this.emptyMerge = this.data[$getChildren]().length === 0; + this.root.form = this.form = root.template[$clone](); + } + _isConsumeData() { + return !this.emptyMerge && this._mergeMode; + } + _isMatchTemplate() { + return !this._isConsumeData(); + } + bind() { + this._bindElement(this.form, this.data); + return this.form; + } + getData() { + return this.data; + } + _bindValue(formNode, data, picture) { + formNode[$data] = data; + if (formNode[$hasSettableValue]()) { + if (data[$isDataValue]()) { + const value = data[$getDataValue](); + formNode[$setValue](createText(value)); + } else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") { + const value = data[$getChildren]().map(child => child[$content].trim()).join("\n"); + formNode[$setValue](createText(value)); + } else if (this._isConsumeData()) { + warn(`XFA - Nodes haven't the same type.`); + } + } else if (!data[$isDataValue]() || this._isMatchTemplate()) { + this._bindElement(formNode, data); + } else { + warn(`XFA - Nodes haven't the same type.`); + } + } + _findDataByNameToConsume(name, isValue, dataNode, global) { + if (!name) { + return null; + } + let generator, match; + for (let i = 0; i < 3; i++) { + generator = dataNode[$getRealChildrenByNameIt](name, false, true); + while (true) { + match = generator.next().value; + if (!match) { + break; + } + if (isValue === match[$isDataValue]()) { + return match; + } + } + if (dataNode[$namespaceId] === NamespaceIds.datasets.id && dataNode[$nodeName] === "data") { + break; + } + dataNode = dataNode[$getParent](); + } + if (!global) { + return null; + } + generator = this.data[$getRealChildrenByNameIt](name, true, false); + match = generator.next().value; + if (match) { + return match; + } + generator = this.data[$getAttributeIt](name, true); + match = generator.next().value; + if (match?.[$isDataValue]()) { + return match; + } + return null; + } + _setProperties(formNode, dataNode) { + if (!formNode.hasOwnProperty("setProperty")) { + return; + } + for (const { + ref, + target, + connection + } of formNode.setProperty.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = searchNode(this.root, dataNode, ref, false, false); + if (!nodes) { + warn(`XFA - Invalid reference: ${ref}.`); + continue; + } + const [node] = nodes; + if (!node[$isDescendent](this.data)) { + warn(`XFA - Invalid node: must be a data node.`); + continue; + } + const targetNodes = searchNode(this.root, formNode, target, false, false); + if (!targetNodes) { + warn(`XFA - Invalid target: ${target}.`); + continue; + } + const [targetNode] = targetNodes; + if (!targetNode[$isDescendent](formNode)) { + warn(`XFA - Invalid target: must be a property or subproperty.`); + continue; + } + const targetParent = targetNode[$getParent](); + if (targetNode instanceof SetProperty || targetParent instanceof SetProperty) { + warn(`XFA - Invalid target: cannot be a setProperty or one of its properties.`); + continue; + } + if (targetNode instanceof BindItems || targetParent instanceof BindItems) { + warn(`XFA - Invalid target: cannot be a bindItems or one of its properties.`); + continue; + } + const content = node[$text](); + const name = targetNode[$nodeName]; + if (targetNode instanceof XFAAttribute) { + const attrs = Object.create(null); + attrs[name] = content; + const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]); + targetParent[name] = obj[name]; + continue; + } + if (!targetNode.hasOwnProperty($content)) { + warn(`XFA - Invalid node to use in setProperty`); + continue; + } + targetNode[$data] = node; + targetNode[$content] = content; + targetNode[$finalize](); + } + } + _bindItems(formNode, dataNode) { + if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) { + return; + } + for (const item of formNode.items.children) { + formNode[$removeChild](item); + } + formNode.items.clear(); + const labels = new Items({}); + const values = new Items({}); + formNode[$appendChild](labels); + formNode.items.push(labels); + formNode[$appendChild](values); + formNode.items.push(values); + for (const { + ref, + labelRef, + valueRef, + connection + } of formNode.bindItems.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = searchNode(this.root, dataNode, ref, false, false); + if (!nodes) { + warn(`XFA - Invalid reference: ${ref}.`); + continue; + } + for (const node of nodes) { + if (!node[$isDescendent](this.datasets)) { + warn(`XFA - Invalid ref (${ref}): must be a datasets child.`); + continue; + } + const labelNodes = searchNode(this.root, node, labelRef, true, false); + if (!labelNodes) { + warn(`XFA - Invalid label: ${labelRef}.`); + continue; + } + const [labelNode] = labelNodes; + if (!labelNode[$isDescendent](this.datasets)) { + warn(`XFA - Invalid label: must be a datasets child.`); + continue; + } + const valueNodes = searchNode(this.root, node, valueRef, true, false); + if (!valueNodes) { + warn(`XFA - Invalid value: ${valueRef}.`); + continue; + } + const [valueNode] = valueNodes; + if (!valueNode[$isDescendent](this.datasets)) { + warn(`XFA - Invalid value: must be a datasets child.`); + continue; + } + const label = createText(labelNode[$text]()); + const value = createText(valueNode[$text]()); + labels[$appendChild](label); + labels.text.push(label); + values[$appendChild](value); + values.text.push(value); + } + } + } + _bindOccurrences(formNode, matches, picture) { + let baseClone; + if (matches.length > 1) { + baseClone = formNode[$clone](); + baseClone[$removeChild](baseClone.occur); + baseClone.occur = null; + } + this._bindValue(formNode, matches[0], picture); + this._setProperties(formNode, matches[0]); + this._bindItems(formNode, matches[0]); + if (matches.length === 1) { + return; + } + const parent = formNode[$getParent](); + const name = formNode[$nodeName]; + const pos = parent[$indexOf](formNode); + for (let i = 1, ii = matches.length; i < ii; i++) { + const match = matches[i]; + const clone = baseClone[$clone](); + parent[name].push(clone); + parent[$insertAt](pos + i, clone); + this._bindValue(clone, match, picture); + this._setProperties(clone, match); + this._bindItems(clone, match); + } + } + _createOccurrences(formNode) { + if (!this.emptyMerge) { + return; + } + const { + occur + } = formNode; + if (!occur || occur.initial <= 1) { + return; + } + const parent = formNode[$getParent](); + const name = formNode[$nodeName]; + if (!(parent[name] instanceof XFAObjectArray)) { + return; + } + let currentNumber; + if (formNode.name) { + currentNumber = parent[name].children.filter(e => e.name === formNode.name).length; + } else { + currentNumber = parent[name].children.length; + } + const pos = parent[$indexOf](formNode) + 1; + const ii = occur.initial - currentNumber; + if (ii) { + const nodeClone = formNode[$clone](); + nodeClone[$removeChild](nodeClone.occur); + nodeClone.occur = null; + parent[name].push(nodeClone); + parent[$insertAt](pos, nodeClone); + for (let i = 1; i < ii; i++) { + const clone = nodeClone[$clone](); + parent[name].push(clone); + parent[$insertAt](pos + i, clone); + } + } + } + _getOccurInfo(formNode) { + const { + name, + occur + } = formNode; + if (!occur || !name) { + return [1, 1]; + } + const max = occur.max === -1 ? Infinity : occur.max; + return [occur.min, max]; + } + _setAndBind(formNode, dataNode) { + this._setProperties(formNode, dataNode); + this._bindItems(formNode, dataNode); + this._bindElement(formNode, dataNode); + } + _bindElement(formNode, dataNode) { + const uselessNodes = []; + this._createOccurrences(formNode); + for (const child of formNode[$getChildren]()) { + if (child[$data]) { + continue; + } + if (this._mergeMode === undefined && child[$nodeName] === "subform") { + this._mergeMode = child.mergeMode === "consumeData"; + const dataChildren = dataNode[$getChildren](); + if (dataChildren.length > 0) { + this._bindOccurrences(child, [dataChildren[0]], null); + } else if (this.emptyMerge) { + const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; + const dataChild = child[$data] = new XmlObject(nsId, child.name || "root"); + dataNode[$appendChild](dataChild); + this._bindElement(child, dataChild); + } + continue; + } + if (!child[$isBindable]()) { + continue; + } + let global = false; + let picture = null; + let ref = null; + let match = null; + if (child.bind) { + switch (child.bind.match) { + case "none": + this._setAndBind(child, dataNode); + continue; + case "global": + global = true; + break; + case "dataRef": + if (!child.bind.ref) { + warn(`XFA - ref is empty in node ${child[$nodeName]}.`); + this._setAndBind(child, dataNode); + continue; + } + ref = child.bind.ref; + break; + default: + break; + } + if (child.bind.picture) { + picture = child.bind.picture[$content]; + } + } + const [min, max] = this._getOccurInfo(child); + if (ref) { + match = searchNode(this.root, dataNode, ref, true, false); + if (match === null) { + match = createDataNode(this.data, dataNode, ref); + if (!match) { + continue; + } + if (this._isConsumeData()) { + match[$consumed] = true; + } + this._setAndBind(child, match); + continue; + } else { + if (this._isConsumeData()) { + match = match.filter(node => !node[$consumed]); + } + if (match.length > max) { + match = match.slice(0, max); + } else if (match.length === 0) { + match = null; + } + if (match && this._isConsumeData()) { + match.forEach(node => { + node[$consumed] = true; + }); + } + } + } else { + if (!child.name) { + this._setAndBind(child, dataNode); + continue; + } + if (this._isConsumeData()) { + const matches = []; + while (matches.length < max) { + const found = this._findDataByNameToConsume(child.name, child[$hasSettableValue](), dataNode, global); + if (!found) { + break; + } + found[$consumed] = true; + matches.push(found); + } + match = matches.length > 0 ? matches : null; + } else { + match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value; + if (!match) { + if (min === 0) { + uselessNodes.push(child); + continue; + } + const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; + match = child[$data] = new XmlObject(nsId, child.name); + if (this.emptyMerge) { + match[$consumed] = true; + } + dataNode[$appendChild](match); + this._setAndBind(child, match); + continue; + } + if (this.emptyMerge) { + match[$consumed] = true; + } + match = [match]; + } + } + if (match) { + this._bindOccurrences(child, match, picture); + } else if (min > 0) { + this._setAndBind(child, dataNode); + } else { + uselessNodes.push(child); + } + } + uselessNodes.forEach(node => node[$getParent]()[$removeChild](node)); + } +} + +;// ./src/core/xfa/data.js + +class DataHandler { + constructor(root, data) { + this.data = data; + this.dataset = root.datasets || null; + } + serialize(storage) { + const stack = [[-1, this.data[$getChildren]()]]; + while (stack.length > 0) { + const last = stack.at(-1); + const [i, children] = last; + if (i + 1 === children.length) { + stack.pop(); + continue; + } + const child = children[++last[0]]; + const storageEntry = storage.get(child[$uid]); + if (storageEntry) { + child[$setValue](storageEntry); + } else { + const attributes = child[$getAttributes](); + for (const value of attributes.values()) { + const entry = storage.get(value[$uid]); + if (entry) { + value[$setValue](entry); + break; + } + } + } + const nodes = child[$getChildren](); + if (nodes.length > 0) { + stack.push([-1, nodes]); + } + } + const buf = [``]; + if (this.dataset) { + for (const child of this.dataset[$getChildren]()) { + if (child[$nodeName] !== "data") { + child[$toString](buf); + } + } + } + this.data[$toString](buf); + buf.push(""); + return buf.join(""); + } +} + +;// ./src/core/xfa/config.js + + + + + +const CONFIG_NS_ID = NamespaceIds.config.id; +class Acrobat extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat", true); + this.acrobat7 = null; + this.autoSave = null; + this.common = null; + this.validate = null; + this.validateApprovalSignatures = null; + this.submitUrl = new XFAObjectArray(); + } +} +class Acrobat7 extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat7", true); + this.dynamicRender = null; + } +} +class ADBE_JSConsole extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); + } +} +class ADBE_JSDebugger extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); + } +} +class AddSilentPrint extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addSilentPrint"); + } +} +class AddViewerPreferences extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addViewerPreferences"); + } +} +class AdjustData extends Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "adjustData"); + } +} +class AdobeExtensionLevel extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8); + } +} +class Agent extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "agent", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.common = new XFAObjectArray(); + } +} +class AlwaysEmbed extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "alwaysEmbed"); + } +} +class Amd extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "amd"); + } +} +class config_Area extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "area"); + this.level = getInteger({ + data: attributes.level, + defaultValue: 0, + validate: n => n >= 1 && n <= 3 + }); + this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]); + } +} +class Attributes extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); + } +} +class AutoSave extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); + } +} +class Base extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "base"); + } +} +class BatchOutput extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "batchOutput"); + this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]); + } +} +class BehaviorOverride extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "behaviorOverride"); + } + [$finalize]() { + this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2))); + } +} +class Cache extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "cache", true); + this.templateCache = null; + } +} +class Change extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "change"); + } +} +class Common extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "common", true); + this.data = null; + this.locale = null; + this.localeSet = null; + this.messaging = null; + this.suppressBanner = null; + this.template = null; + this.validationMessaging = null; + this.versionControl = null; + this.log = new XFAObjectArray(); + } +} +class Compress extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compress"); + this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]); + } +} +class CompressLogicalStructure extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressLogicalStructure"); + } +} +class CompressObjectStream extends Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressObjectStream"); + } +} +class Compression extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compression", true); + this.compressLogicalStructure = null; + this.compressObjectStream = null; + this.level = null; + this.type = null; + } +} +class Config extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "config", true); + this.acrobat = null; + this.present = null; + this.trace = null; + this.agent = new XFAObjectArray(); + } +} +class Conformance extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "conformance", ["A", "B"]); + } +} +class ContentCopy extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "contentCopy"); + } +} +class Copies extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "copies", 1, n => n >= 1); + } +} +class Creator extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "creator"); + } +} +class CurrentPage extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0); + } +} +class Data extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "data", true); + this.adjustData = null; + this.attributes = null; + this.incrementalLoad = null; + this.outputXSL = null; + this.range = null; + this.record = null; + this.startNode = null; + this.uri = null; + this.window = null; + this.xsl = null; + this.excludeNS = new XFAObjectArray(); + this.transform = new XFAObjectArray(); + } +} +class Debug extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "debug", true); + this.uri = null; + } +} +class DefaultTypeface extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "defaultTypeface"); + this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]); + } +} +class Destination extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); + } +} +class DocumentAssembly extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "documentAssembly"); + } +} +class Driver extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "driver", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class DuplexOption extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]); + } +} +class DynamicRender extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); + } +} +class Embed extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "embed"); + } +} +class config_Encrypt extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "encrypt"); + } +} +class config_Encryption extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryption", true); + this.encrypt = null; + this.encryptionLevel = null; + this.permissions = null; + } +} +class EncryptionLevel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); + } +} +class Enforce extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "enforce"); + } +} +class Equate extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equate"); + this.force = getInteger({ + data: attributes.force, + defaultValue: 1, + validate: n => n === 0 + }); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + } +} +class EquateRange extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equateRange"); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + this._unicodeRange = attributes.unicodeRange || ""; + } + get unicodeRange() { + const ranges = []; + const unicodeRegex = /U\+([0-9a-fA-F]+)/; + const unicodeRange = this._unicodeRange; + for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) { + range = range.split("-", 2).map(x => { + const found = x.match(unicodeRegex); + if (!found) { + return 0; + } + return parseInt(found[1], 16); + }); + if (range.length === 1) { + range.push(range[0]); + } + ranges.push(range); + } + return shadow(this, "unicodeRange", ranges); + } +} +class Exclude extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "exclude"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x)); + } +} +class ExcludeNS extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "excludeNS"); + } +} +class FlipLabel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); + } +} +class config_FontInfo extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "fontInfo", true); + this.embed = null; + this.map = null; + this.subsetBelow = null; + this.alwaysEmbed = new XFAObjectArray(); + this.defaultTypeface = new XFAObjectArray(); + this.neverEmbed = new XFAObjectArray(); + } +} +class FormFieldFilling extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "formFieldFilling"); + } +} +class GroupParent extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "groupParent"); + } +} +class IfEmpty extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); + } +} +class IncludeXDPContent extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "includeXDPContent"); + } +} +class IncrementalLoad extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); + } +} +class IncrementalMerge extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalMerge"); + } +} +class Interactive extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "interactive"); + } +} +class Jog extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); + } +} +class LabelPrinter extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "labelPrinter", true); + this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]); + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class Layout extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); + } +} +class Level extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "level", 0, n => n > 0); + } +} +class Linearized extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "linearized"); + } +} +class Locale extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "locale"); + } +} +class LocaleSet extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "localeSet"); + } +} +class Log extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "log", true); + this.mode = null; + this.threshold = null; + this.to = null; + this.uri = null; + } +} +class MapElement extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "map", true); + this.equate = new XFAObjectArray(); + this.equateRange = new XFAObjectArray(); + } +} +class MediumInfo extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mediumInfo", true); + this.map = null; + } +} +class config_Message extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "message", true); + this.msgId = null; + this.severity = null; + } +} +class Messaging extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "messaging", true); + this.message = new XFAObjectArray(); + } +} +class Mode extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); + } +} +class ModifyAnnots extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "modifyAnnots"); + } +} +class MsgId extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "msgId", 1, n => n >= 1); + } +} +class NameAttr extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "nameAttr"); + } +} +class NeverEmbed extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "neverEmbed"); + } +} +class NumberOfCopies extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5); + } +} +class OpenAction extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "openAction", true); + this.destination = null; + } +} +class Output extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "output", true); + this.to = null; + this.type = null; + this.uri = null; + } +} +class OutputBin extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputBin"); + } +} +class OutputXSL extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputXSL", true); + this.uri = null; + } +} +class Overprint extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); + } +} +class Packets extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "packets"); + } + [$finalize]() { + if (this[$content] === "*") { + return; + } + this[$content] = this[$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x)); + } +} +class PageOffset extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageOffset"); + this.x = getInteger({ + data: attributes.x, + defaultValue: "useXDCSetting", + validate: n => true + }); + this.y = getInteger({ + data: attributes.y, + defaultValue: "useXDCSetting", + validate: n => true + }); + } +} +class PageRange extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageRange"); + } + [$finalize]() { + const numbers = this[$content].trim().split(/\s+/).map(x => parseInt(x, 10)); + const ranges = []; + for (let i = 0, ii = numbers.length; i < ii; i += 2) { + ranges.push(numbers.slice(i, i + 2)); + } + this[$content] = ranges; + } +} +class Pagination extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); + } +} +class PaginationOverride extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]); + } +} +class Part extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "part", 1, n => false); + } +} +class Pcl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pcl", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.pageOffset = null; + this.staple = null; + this.xdc = null; + } +} +class Pdf extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdf", true); + this.name = attributes.name || ""; + this.adobeExtensionLevel = null; + this.batchOutput = null; + this.compression = null; + this.creator = null; + this.encryption = null; + this.fontInfo = null; + this.interactive = null; + this.linearized = null; + this.openAction = null; + this.pdfa = null; + this.producer = null; + this.renderPolicy = null; + this.scriptModel = null; + this.silentPrint = null; + this.submitFormat = null; + this.tagged = null; + this.version = null; + this.viewerPreferences = null; + this.xdc = null; + } +} +class Pdfa extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdfa", true); + this.amd = null; + this.conformance = null; + this.includeXDPContent = null; + this.part = null; + } +} +class Permissions extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "permissions", true); + this.accessibleContent = null; + this.change = null; + this.contentCopy = null; + this.documentAssembly = null; + this.formFieldFilling = null; + this.modifyAnnots = null; + this.plaintextMetadata = null; + this.print = null; + this.printHighQuality = null; + } +} +class PickTrayByPDFSize extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "pickTrayByPDFSize"); + } +} +class config_Picture extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "picture"); + } +} +class PlaintextMetadata extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "plaintextMetadata"); + } +} +class Presence extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]); + } +} +class Present extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "present", true); + this.behaviorOverride = null; + this.cache = null; + this.common = null; + this.copies = null; + this.destination = null; + this.incrementalMerge = null; + this.layout = null; + this.output = null; + this.overprint = null; + this.pagination = null; + this.paginationOverride = null; + this.script = null; + this.validate = null; + this.xdp = null; + this.driver = new XFAObjectArray(); + this.labelPrinter = new XFAObjectArray(); + this.pcl = new XFAObjectArray(); + this.pdf = new XFAObjectArray(); + this.ps = new XFAObjectArray(); + this.submitUrl = new XFAObjectArray(); + this.webClient = new XFAObjectArray(); + this.zpl = new XFAObjectArray(); + } +} +class Print extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "print"); + } +} +class PrintHighQuality extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "printHighQuality"); + } +} +class PrintScaling extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); + } +} +class PrinterName extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printerName"); + } +} +class Producer extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "producer"); + } +} +class Ps extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ps", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.staple = null; + this.xdc = null; + } +} +class Range extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "range"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s*,\s*/, 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { + if (range.length === 1) { + range.push(range[0]); + } + return range; + }); + } +} +class Record extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "record"); + } + [$finalize]() { + this[$content] = this[$content].trim(); + const n = parseInt(this[$content], 10); + if (!isNaN(n) && n >= 0) { + this[$content] = n; + } + } +} +class Relevant extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "relevant"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/); + } +} +class Rename extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "rename"); + } + [$finalize]() { + this[$content] = this[$content].trim(); + if (this[$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content])) { + warn("XFA - Rename: invalid XFA name"); + } + } +} +class RenderPolicy extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); + } +} +class RunScripts extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); + } +} +class config_Script extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "script", true); + this.currentPage = null; + this.exclude = null; + this.runScripts = null; + } +} +class ScriptModel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); + } +} +class Severity extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]); + } +} +class SilentPrint extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "silentPrint", true); + this.addSilentPrint = null; + this.printerName = null; + } +} +class Staple extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "staple"); + this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]); + } +} +class StartNode extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startNode"); + } +} +class StartPage extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startPage", 0, n => true); + } +} +class SubmitFormat extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); + } +} +class SubmitUrl extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitUrl"); + } +} +class SubsetBelow extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100); + } +} +class SuppressBanner extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "suppressBanner"); + } +} +class Tagged extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "tagged"); + } +} +class config_Template extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "template", true); + this.base = null; + this.relevant = null; + this.startPage = null; + this.uri = null; + this.xsl = null; + } +} +class Threshold extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]); + } +} +class To extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); + } +} +class TemplateCache extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "templateCache"); + this.maxEntries = getInteger({ + data: attributes.maxEntries, + defaultValue: 5, + validate: n => n >= 0 + }); + } +} +class Trace extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "trace", true); + this.area = new XFAObjectArray(); + } +} +class Transform extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "transform", true); + this.groupParent = null; + this.ifEmpty = null; + this.nameAttr = null; + this.picture = null; + this.presence = null; + this.rename = null; + this.whitespace = null; + } +} +class Type extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]); + } +} +class Uri extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "uri"); + } +} +class config_Validate extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); + } +} +class ValidateApprovalSignatures extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validateApprovalSignatures"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x)); + } +} +class ValidationMessaging extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]); + } +} +class Version extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); + } +} +class VersionControl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "VersionControl"); + this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]); + this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]); + this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]); + } +} +class ViewerPreferences extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "viewerPreferences", true); + this.ADBE_JSConsole = null; + this.ADBE_JSDebugger = null; + this.addViewerPreferences = null; + this.duplexOption = null; + this.enforce = null; + this.numberOfCopies = null; + this.pageRange = null; + this.pickTrayByPDFSize = null; + this.printScaling = null; + } +} +class WebClient extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "webClient", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class Whitespace extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]); + } +} +class Window extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "window"); + } + [$finalize]() { + const pair = this[$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10)); + if (pair.some(x => isNaN(x))) { + this[$content] = [0, 0]; + return; + } + if (pair.length === 1) { + pair.push(pair[0]); + } + this[$content] = pair; + } +} +class Xdc extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdc", true); + this.uri = new XFAObjectArray(); + this.xsl = new XFAObjectArray(); + } +} +class Xdp extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdp", true); + this.packets = null; + } +} +class Xsl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xsl", true); + this.debug = null; + this.uri = null; + } +} +class Zpl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "zpl", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class ConfigNamespace { + static [$buildXFAObject](name, attributes) { + if (ConfigNamespace.hasOwnProperty(name)) { + return ConfigNamespace[name](attributes); + } + return undefined; + } + static acrobat(attrs) { + return new Acrobat(attrs); + } + static acrobat7(attrs) { + return new Acrobat7(attrs); + } + static ADBE_JSConsole(attrs) { + return new ADBE_JSConsole(attrs); + } + static ADBE_JSDebugger(attrs) { + return new ADBE_JSDebugger(attrs); + } + static addSilentPrint(attrs) { + return new AddSilentPrint(attrs); + } + static addViewerPreferences(attrs) { + return new AddViewerPreferences(attrs); + } + static adjustData(attrs) { + return new AdjustData(attrs); + } + static adobeExtensionLevel(attrs) { + return new AdobeExtensionLevel(attrs); + } + static agent(attrs) { + return new Agent(attrs); + } + static alwaysEmbed(attrs) { + return new AlwaysEmbed(attrs); + } + static amd(attrs) { + return new Amd(attrs); + } + static area(attrs) { + return new config_Area(attrs); + } + static attributes(attrs) { + return new Attributes(attrs); + } + static autoSave(attrs) { + return new AutoSave(attrs); + } + static base(attrs) { + return new Base(attrs); + } + static batchOutput(attrs) { + return new BatchOutput(attrs); + } + static behaviorOverride(attrs) { + return new BehaviorOverride(attrs); + } + static cache(attrs) { + return new Cache(attrs); + } + static change(attrs) { + return new Change(attrs); + } + static common(attrs) { + return new Common(attrs); + } + static compress(attrs) { + return new Compress(attrs); + } + static compressLogicalStructure(attrs) { + return new CompressLogicalStructure(attrs); + } + static compressObjectStream(attrs) { + return new CompressObjectStream(attrs); + } + static compression(attrs) { + return new Compression(attrs); + } + static config(attrs) { + return new Config(attrs); + } + static conformance(attrs) { + return new Conformance(attrs); + } + static contentCopy(attrs) { + return new ContentCopy(attrs); + } + static copies(attrs) { + return new Copies(attrs); + } + static creator(attrs) { + return new Creator(attrs); + } + static currentPage(attrs) { + return new CurrentPage(attrs); + } + static data(attrs) { + return new Data(attrs); + } + static debug(attrs) { + return new Debug(attrs); + } + static defaultTypeface(attrs) { + return new DefaultTypeface(attrs); + } + static destination(attrs) { + return new Destination(attrs); + } + static documentAssembly(attrs) { + return new DocumentAssembly(attrs); + } + static driver(attrs) { + return new Driver(attrs); + } + static duplexOption(attrs) { + return new DuplexOption(attrs); + } + static dynamicRender(attrs) { + return new DynamicRender(attrs); + } + static embed(attrs) { + return new Embed(attrs); + } + static encrypt(attrs) { + return new config_Encrypt(attrs); + } + static encryption(attrs) { + return new config_Encryption(attrs); + } + static encryptionLevel(attrs) { + return new EncryptionLevel(attrs); + } + static enforce(attrs) { + return new Enforce(attrs); + } + static equate(attrs) { + return new Equate(attrs); + } + static equateRange(attrs) { + return new EquateRange(attrs); + } + static exclude(attrs) { + return new Exclude(attrs); + } + static excludeNS(attrs) { + return new ExcludeNS(attrs); + } + static flipLabel(attrs) { + return new FlipLabel(attrs); + } + static fontInfo(attrs) { + return new config_FontInfo(attrs); + } + static formFieldFilling(attrs) { + return new FormFieldFilling(attrs); + } + static groupParent(attrs) { + return new GroupParent(attrs); + } + static ifEmpty(attrs) { + return new IfEmpty(attrs); + } + static includeXDPContent(attrs) { + return new IncludeXDPContent(attrs); + } + static incrementalLoad(attrs) { + return new IncrementalLoad(attrs); + } + static incrementalMerge(attrs) { + return new IncrementalMerge(attrs); + } + static interactive(attrs) { + return new Interactive(attrs); + } + static jog(attrs) { + return new Jog(attrs); + } + static labelPrinter(attrs) { + return new LabelPrinter(attrs); + } + static layout(attrs) { + return new Layout(attrs); + } + static level(attrs) { + return new Level(attrs); + } + static linearized(attrs) { + return new Linearized(attrs); + } + static locale(attrs) { + return new Locale(attrs); + } + static localeSet(attrs) { + return new LocaleSet(attrs); + } + static log(attrs) { + return new Log(attrs); + } + static map(attrs) { + return new MapElement(attrs); + } + static mediumInfo(attrs) { + return new MediumInfo(attrs); + } + static message(attrs) { + return new config_Message(attrs); + } + static messaging(attrs) { + return new Messaging(attrs); + } + static mode(attrs) { + return new Mode(attrs); + } + static modifyAnnots(attrs) { + return new ModifyAnnots(attrs); + } + static msgId(attrs) { + return new MsgId(attrs); + } + static nameAttr(attrs) { + return new NameAttr(attrs); + } + static neverEmbed(attrs) { + return new NeverEmbed(attrs); + } + static numberOfCopies(attrs) { + return new NumberOfCopies(attrs); + } + static openAction(attrs) { + return new OpenAction(attrs); + } + static output(attrs) { + return new Output(attrs); + } + static outputBin(attrs) { + return new OutputBin(attrs); + } + static outputXSL(attrs) { + return new OutputXSL(attrs); + } + static overprint(attrs) { + return new Overprint(attrs); + } + static packets(attrs) { + return new Packets(attrs); + } + static pageOffset(attrs) { + return new PageOffset(attrs); + } + static pageRange(attrs) { + return new PageRange(attrs); + } + static pagination(attrs) { + return new Pagination(attrs); + } + static paginationOverride(attrs) { + return new PaginationOverride(attrs); + } + static part(attrs) { + return new Part(attrs); + } + static pcl(attrs) { + return new Pcl(attrs); + } + static pdf(attrs) { + return new Pdf(attrs); + } + static pdfa(attrs) { + return new Pdfa(attrs); + } + static permissions(attrs) { + return new Permissions(attrs); + } + static pickTrayByPDFSize(attrs) { + return new PickTrayByPDFSize(attrs); + } + static picture(attrs) { + return new config_Picture(attrs); + } + static plaintextMetadata(attrs) { + return new PlaintextMetadata(attrs); + } + static presence(attrs) { + return new Presence(attrs); + } + static present(attrs) { + return new Present(attrs); + } + static print(attrs) { + return new Print(attrs); + } + static printHighQuality(attrs) { + return new PrintHighQuality(attrs); + } + static printScaling(attrs) { + return new PrintScaling(attrs); + } + static printerName(attrs) { + return new PrinterName(attrs); + } + static producer(attrs) { + return new Producer(attrs); + } + static ps(attrs) { + return new Ps(attrs); + } + static range(attrs) { + return new Range(attrs); + } + static record(attrs) { + return new Record(attrs); + } + static relevant(attrs) { + return new Relevant(attrs); + } + static rename(attrs) { + return new Rename(attrs); + } + static renderPolicy(attrs) { + return new RenderPolicy(attrs); + } + static runScripts(attrs) { + return new RunScripts(attrs); + } + static script(attrs) { + return new config_Script(attrs); + } + static scriptModel(attrs) { + return new ScriptModel(attrs); + } + static severity(attrs) { + return new Severity(attrs); + } + static silentPrint(attrs) { + return new SilentPrint(attrs); + } + static staple(attrs) { + return new Staple(attrs); + } + static startNode(attrs) { + return new StartNode(attrs); + } + static startPage(attrs) { + return new StartPage(attrs); + } + static submitFormat(attrs) { + return new SubmitFormat(attrs); + } + static submitUrl(attrs) { + return new SubmitUrl(attrs); + } + static subsetBelow(attrs) { + return new SubsetBelow(attrs); + } + static suppressBanner(attrs) { + return new SuppressBanner(attrs); + } + static tagged(attrs) { + return new Tagged(attrs); + } + static template(attrs) { + return new config_Template(attrs); + } + static templateCache(attrs) { + return new TemplateCache(attrs); + } + static threshold(attrs) { + return new Threshold(attrs); + } + static to(attrs) { + return new To(attrs); + } + static trace(attrs) { + return new Trace(attrs); + } + static transform(attrs) { + return new Transform(attrs); + } + static type(attrs) { + return new Type(attrs); + } + static uri(attrs) { + return new Uri(attrs); + } + static validate(attrs) { + return new config_Validate(attrs); + } + static validateApprovalSignatures(attrs) { + return new ValidateApprovalSignatures(attrs); + } + static validationMessaging(attrs) { + return new ValidationMessaging(attrs); + } + static version(attrs) { + return new Version(attrs); + } + static versionControl(attrs) { + return new VersionControl(attrs); + } + static viewerPreferences(attrs) { + return new ViewerPreferences(attrs); + } + static webClient(attrs) { + return new WebClient(attrs); + } + static whitespace(attrs) { + return new Whitespace(attrs); + } + static window(attrs) { + return new Window(attrs); + } + static xdc(attrs) { + return new Xdc(attrs); + } + static xdp(attrs) { + return new Xdp(attrs); + } + static xsl(attrs) { + return new Xsl(attrs); + } + static zpl(attrs) { + return new Zpl(attrs); + } +} + +;// ./src/core/xfa/connection_set.js + + +const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; +class ConnectionSet extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "connectionSet", true); + this.wsdlConnection = new XFAObjectArray(); + this.xmlConnection = new XFAObjectArray(); + this.xsdConnection = new XFAObjectArray(); + } +} +class EffectiveInputPolicy extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "effectiveInputPolicy"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EffectiveOutputPolicy extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Operation extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "operation"); + this.id = attributes.id || ""; + this.input = attributes.input || ""; + this.name = attributes.name || ""; + this.output = attributes.output || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class RootElement extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "rootElement"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SoapAction extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "soapAction"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SoapAddress extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "soapAddress"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class connection_set_Uri extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "uri"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class WsdlAddress extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlAddress"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class WsdlConnection extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.effectiveInputPolicy = null; + this.effectiveOutputPolicy = null; + this.operation = null; + this.soapAction = null; + this.soapAddress = null; + this.wsdlAddress = null; + } +} +class XmlConnection extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xmlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.uri = null; + } +} +class XsdConnection extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xsdConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.rootElement = null; + this.uri = null; + } +} +class ConnectionSetNamespace { + static [$buildXFAObject](name, attributes) { + if (ConnectionSetNamespace.hasOwnProperty(name)) { + return ConnectionSetNamespace[name](attributes); + } + return undefined; + } + static connectionSet(attrs) { + return new ConnectionSet(attrs); + } + static effectiveInputPolicy(attrs) { + return new EffectiveInputPolicy(attrs); + } + static effectiveOutputPolicy(attrs) { + return new EffectiveOutputPolicy(attrs); + } + static operation(attrs) { + return new Operation(attrs); + } + static rootElement(attrs) { + return new RootElement(attrs); + } + static soapAction(attrs) { + return new SoapAction(attrs); + } + static soapAddress(attrs) { + return new SoapAddress(attrs); + } + static uri(attrs) { + return new connection_set_Uri(attrs); + } + static wsdlAddress(attrs) { + return new WsdlAddress(attrs); + } + static wsdlConnection(attrs) { + return new WsdlConnection(attrs); + } + static xmlConnection(attrs) { + return new XmlConnection(attrs); + } + static xsdConnection(attrs) { + return new XsdConnection(attrs); + } +} + +;// ./src/core/xfa/datasets.js + + + +const DATASETS_NS_ID = NamespaceIds.datasets.id; +class datasets_Data extends XmlObject { + constructor(attributes) { + super(DATASETS_NS_ID, "data", attributes); + } + [$isNsAgnostic]() { + return true; + } +} +class Datasets extends XFAObject { + constructor(attributes) { + super(DATASETS_NS_ID, "datasets", true); + this.data = null; + this.Signature = null; + } + [$onChild](child) { + const name = child[$nodeName]; + if (name === "data" && child[$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[$namespaceId] === NamespaceIds.signature.id) { + this[name] = child; + } + this[$appendChild](child); + } +} +class DatasetsNamespace { + static [$buildXFAObject](name, attributes) { + if (DatasetsNamespace.hasOwnProperty(name)) { + return DatasetsNamespace[name](attributes); + } + return undefined; + } + static datasets(attributes) { + return new Datasets(attributes); + } + static data(attributes) { + return new datasets_Data(attributes); + } +} + +;// ./src/core/xfa/locale_set.js + + + +const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id; +class CalendarSymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "calendarSymbols", true); + this.name = "gregorian"; + this.dayNames = new XFAObjectArray(2); + this.eraNames = null; + this.meridiemNames = null; + this.monthNames = new XFAObjectArray(2); + } +} +class CurrencySymbol extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbol"); + this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]); + } +} +class CurrencySymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbols", true); + this.currencySymbol = new XFAObjectArray(3); + } +} +class DatePattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class DatePatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePatterns", true); + this.datePattern = new XFAObjectArray(4); + } +} +class DateTimeSymbols extends ContentObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dateTimeSymbols"); + } +} +class Day extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "day"); + } +} +class DayNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dayNames", true); + this.abbr = getInteger({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.day = new XFAObjectArray(7); + } +} +class Era extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "era"); + } +} +class EraNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "eraNames", true); + this.era = new XFAObjectArray(2); + } +} +class locale_set_Locale extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "locale", true); + this.desc = attributes.desc || ""; + this.name = "isoname"; + this.calendarSymbols = null; + this.currencySymbols = null; + this.datePatterns = null; + this.dateTimeSymbols = null; + this.numberPatterns = null; + this.numberSymbols = null; + this.timePatterns = null; + this.typeFaces = null; + } +} +class locale_set_LocaleSet extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "localeSet", true); + this.locale = new XFAObjectArray(); + } +} +class Meridiem extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiem"); + } +} +class MeridiemNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiemNames", true); + this.meridiem = new XFAObjectArray(2); + } +} +class Month extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "month"); + } +} +class MonthNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "monthNames", true); + this.abbr = getInteger({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.month = new XFAObjectArray(12); + } +} +class NumberPattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class NumberPatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPatterns", true); + this.numberPattern = new XFAObjectArray(4); + } +} +class NumberSymbol extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbol"); + this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]); + } +} +class NumberSymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbols", true); + this.numberSymbol = new XFAObjectArray(5); + } +} +class TimePattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class TimePatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePatterns", true); + this.timePattern = new XFAObjectArray(4); + } +} +class TypeFace extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFace", true); + this.name = attributes.name | ""; + } +} +class TypeFaces extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFaces", true); + this.typeFace = new XFAObjectArray(); + } +} +class LocaleSetNamespace { + static [$buildXFAObject](name, attributes) { + if (LocaleSetNamespace.hasOwnProperty(name)) { + return LocaleSetNamespace[name](attributes); + } + return undefined; + } + static calendarSymbols(attrs) { + return new CalendarSymbols(attrs); + } + static currencySymbol(attrs) { + return new CurrencySymbol(attrs); + } + static currencySymbols(attrs) { + return new CurrencySymbols(attrs); + } + static datePattern(attrs) { + return new DatePattern(attrs); + } + static datePatterns(attrs) { + return new DatePatterns(attrs); + } + static dateTimeSymbols(attrs) { + return new DateTimeSymbols(attrs); + } + static day(attrs) { + return new Day(attrs); + } + static dayNames(attrs) { + return new DayNames(attrs); + } + static era(attrs) { + return new Era(attrs); + } + static eraNames(attrs) { + return new EraNames(attrs); + } + static locale(attrs) { + return new locale_set_Locale(attrs); + } + static localeSet(attrs) { + return new locale_set_LocaleSet(attrs); + } + static meridiem(attrs) { + return new Meridiem(attrs); + } + static meridiemNames(attrs) { + return new MeridiemNames(attrs); + } + static month(attrs) { + return new Month(attrs); + } + static monthNames(attrs) { + return new MonthNames(attrs); + } + static numberPattern(attrs) { + return new NumberPattern(attrs); + } + static numberPatterns(attrs) { + return new NumberPatterns(attrs); + } + static numberSymbol(attrs) { + return new NumberSymbol(attrs); + } + static numberSymbols(attrs) { + return new NumberSymbols(attrs); + } + static timePattern(attrs) { + return new TimePattern(attrs); + } + static timePatterns(attrs) { + return new TimePatterns(attrs); + } + static typeFace(attrs) { + return new TypeFace(attrs); + } + static typeFaces(attrs) { + return new TypeFaces(attrs); + } +} + +;// ./src/core/xfa/signature.js + + +const SIGNATURE_NS_ID = NamespaceIds.signature.id; +class signature_Signature extends XFAObject { + constructor(attributes) { + super(SIGNATURE_NS_ID, "signature", true); + } +} +class SignatureNamespace { + static [$buildXFAObject](name, attributes) { + if (SignatureNamespace.hasOwnProperty(name)) { + return SignatureNamespace[name](attributes); + } + return undefined; + } + static signature(attributes) { + return new signature_Signature(attributes); + } +} + +;// ./src/core/xfa/stylesheet.js + + +const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; +class Stylesheet extends XFAObject { + constructor(attributes) { + super(STYLESHEET_NS_ID, "stylesheet", true); + } +} +class StylesheetNamespace { + static [$buildXFAObject](name, attributes) { + if (StylesheetNamespace.hasOwnProperty(name)) { + return StylesheetNamespace[name](attributes); + } + return undefined; + } + static stylesheet(attributes) { + return new Stylesheet(attributes); + } +} + +;// ./src/core/xfa/xdp.js + + + +const XDP_NS_ID = NamespaceIds.xdp.id; +class xdp_Xdp extends XFAObject { + constructor(attributes) { + super(XDP_NS_ID, "xdp", true); + this.uuid = attributes.uuid || ""; + this.timeStamp = attributes.timeStamp || ""; + this.config = null; + this.connectionSet = null; + this.datasets = null; + this.localeSet = null; + this.stylesheet = new XFAObjectArray(); + this.template = null; + } + [$onChildCheck](child) { + const ns = NamespaceIds[child[$nodeName]]; + return ns && child[$namespaceId] === ns.id; + } +} +class XdpNamespace { + static [$buildXFAObject](name, attributes) { + if (XdpNamespace.hasOwnProperty(name)) { + return XdpNamespace[name](attributes); + } + return undefined; + } + static xdp(attributes) { + return new xdp_Xdp(attributes); + } +} + +;// ./src/core/xfa/xhtml.js + + + + + +const XHTML_NS_ID = NamespaceIds.xhtml.id; +const $richText = Symbol(); +const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); +const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { + value = original.fontSize = Math.abs(getMeasurement(value)); + return measureToString(0.99 * value); +}], ["letter-spacing", value => measureToString(getMeasurement(value))], ["line-height", value => measureToString(getMeasurement(value))], ["margin", value => measureToString(getMeasurement(value))], ["margin-bottom", value => measureToString(getMeasurement(value))], ["margin-left", value => measureToString(getMeasurement(value))], ["margin-right", value => measureToString(getMeasurement(value))], ["margin-top", value => measureToString(getMeasurement(value))], ["text-indent", value => measureToString(getMeasurement(value))], ["font-family", value => value], ["vertical-align", value => measureToString(getMeasurement(value))]]); +const spacesRegExp = /\s+/g; +const crlfRegExp = /[\r\n]+/g; +const crlfForRichTextRegExp = /\r\n?/g; +function mapStyle(styleStr, node, richText) { + const style = Object.create(null); + if (!styleStr) { + return style; + } + const original = Object.create(null); + for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) { + const mapping = StyleMapping.get(key); + if (mapping === "") { + continue; + } + let newValue = value; + if (mapping) { + newValue = typeof mapping === "string" ? mapping : mapping(value, original); + } + if (key.endsWith("scale")) { + style.transform = style.transform ? `${style[key]} ${newValue}` : newValue; + } else { + style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue; + } + } + if (style.fontFamily) { + setFontFamily({ + typeface: style.fontFamily, + weight: style.fontWeight || "normal", + posture: style.fontStyle || "normal", + size: original.fontSize || 0 + }, node, node[$globalData].fontFinder, style); + } + if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) { + const SUB_SUPER_SCRIPT_FACTOR = 0.583; + const VERTICAL_FACTOR = 0.333; + const fontSize = getMeasurement(style.fontSize); + style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR); + style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR); + } + if (richText && style.fontSize) { + style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`; + } + fixTextIndent(style); + return style; +} +function checkStyle(node) { + if (!node.style) { + return ""; + } + return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(([key, value]) => { + if (key === "font-family") { + node[$globalData].usedTypefaces.add(value); + } + return VALID_STYLES.has(key); + }).map(kv => kv.join(":")).join(";"); +} +const NoWhites = new Set(["body", "html"]); +class XhtmlObject extends XmlObject { + constructor(attributes, name) { + super(XHTML_NS_ID, name); + this[$richText] = false; + this.style = attributes.style || ""; + } + [$clean](builder) { + super[$clean](builder); + this.style = checkStyle(this); + } + [$acceptWhitespace]() { + return !NoWhites.has(this[$nodeName]); + } + [$onText](str, richText = false) { + if (!richText) { + str = str.replaceAll(crlfRegExp, ""); + if (!this.style.includes("xfa-spacerun:yes")) { + str = str.replaceAll(spacesRegExp, " "); + } + } else { + this[$richText] = true; + } + if (str) { + this[$content] += str; + } + } + [$pushGlyphs](measure, mustPop = true) { + const xfaFont = Object.create(null); + const margin = { + top: NaN, + bottom: NaN, + left: NaN, + right: NaN + }; + let lineHeight = null; + for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) { + switch (key) { + case "font-family": + xfaFont.typeface = stripQuotes(value); + break; + case "font-size": + xfaFont.size = getMeasurement(value); + break; + case "font-weight": + xfaFont.weight = value; + break; + case "font-style": + xfaFont.posture = value; + break; + case "letter-spacing": + xfaFont.letterSpacing = getMeasurement(value); + break; + case "margin": + const values = value.split(/ \t/).map(x => getMeasurement(x)); + switch (values.length) { + case 1: + margin.top = margin.bottom = margin.left = margin.right = values[0]; + break; + case 2: + margin.top = margin.bottom = values[0]; + margin.left = margin.right = values[1]; + break; + case 3: + margin.top = values[0]; + margin.bottom = values[2]; + margin.left = margin.right = values[1]; + break; + case 4: + margin.top = values[0]; + margin.left = values[1]; + margin.bottom = values[2]; + margin.right = values[3]; + break; + } + break; + case "margin-top": + margin.top = getMeasurement(value); + break; + case "margin-bottom": + margin.bottom = getMeasurement(value); + break; + case "margin-left": + margin.left = getMeasurement(value); + break; + case "margin-right": + margin.right = getMeasurement(value); + break; + case "line-height": + lineHeight = getMeasurement(value); + break; + } + } + measure.pushData(xfaFont, margin, lineHeight); + if (this[$content]) { + measure.addString(this[$content]); + } else { + for (const child of this[$getChildren]()) { + if (child[$nodeName] === "#text") { + measure.addString(child[$content]); + continue; + } + child[$pushGlyphs](measure); + } + } + if (mustPop) { + measure.popFont(); + } + } + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children + }; + this[$childrenToHTML]({}); + if (children.length === 0 && !this[$content]) { + return HTMLResult.EMPTY; + } + let value; + if (this[$richText]) { + value = this[$content] ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined; + } else { + value = this[$content] || undefined; + } + return HTMLResult.success({ + name: this[$nodeName], + attributes: { + href: this.href, + style: mapStyle(this.style, this, this[$richText]) + }, + children, + value + }); + } +} +class A extends XhtmlObject { + constructor(attributes) { + super(attributes, "a"); + this.href = fixURL(attributes.href) || ""; + } +} +class B extends XhtmlObject { + constructor(attributes) { + super(attributes, "b"); + } + [$pushGlyphs](measure) { + measure.pushFont({ + weight: "bold" + }); + super[$pushGlyphs](measure); + measure.popFont(); + } +} +class Body extends XhtmlObject { + constructor(attributes) { + super(attributes, "body"); + } + [$toHTML](availableSpace) { + const res = super[$toHTML](availableSpace); + const { + html + } = res; + if (!html) { + return HTMLResult.EMPTY; + } + html.name = "div"; + html.attributes.class = ["xfaRich"]; + return res; + } +} +class Br extends XhtmlObject { + constructor(attributes) { + super(attributes, "br"); + } + [$text]() { + return "\n"; + } + [$pushGlyphs](measure) { + measure.addString("\n"); + } + [$toHTML](availableSpace) { + return HTMLResult.success({ + name: "br" + }); + } +} +class Html extends XhtmlObject { + constructor(attributes) { + super(attributes, "html"); + } + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children + }; + this[$childrenToHTML]({}); + if (children.length === 0) { + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + value: this[$content] || "" + }); + } + if (children.length === 1) { + const child = children[0]; + if (child.attributes?.class.includes("xfaRich")) { + return HTMLResult.success(child); + } + } + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + children + }); + } +} +class I extends XhtmlObject { + constructor(attributes) { + super(attributes, "i"); + } + [$pushGlyphs](measure) { + measure.pushFont({ + posture: "italic" + }); + super[$pushGlyphs](measure); + measure.popFont(); + } +} +class Li extends XhtmlObject { + constructor(attributes) { + super(attributes, "li"); + } +} +class Ol extends XhtmlObject { + constructor(attributes) { + super(attributes, "ol"); + } +} +class P extends XhtmlObject { + constructor(attributes) { + super(attributes, "p"); + } + [$pushGlyphs](measure) { + super[$pushGlyphs](measure, false); + measure.addString("\n"); + measure.addPara(); + measure.popFont(); + } + [$text]() { + const siblings = this[$getParent]()[$getChildren](); + if (siblings.at(-1) === this) { + return super[$text](); + } + return super[$text]() + "\n"; + } +} +class Span extends XhtmlObject { + constructor(attributes) { + super(attributes, "span"); + } +} +class Sub extends XhtmlObject { + constructor(attributes) { + super(attributes, "sub"); + } +} +class Sup extends XhtmlObject { + constructor(attributes) { + super(attributes, "sup"); + } +} +class Ul extends XhtmlObject { + constructor(attributes) { + super(attributes, "ul"); + } +} +class XhtmlNamespace { + static [$buildXFAObject](name, attributes) { + if (XhtmlNamespace.hasOwnProperty(name)) { + return XhtmlNamespace[name](attributes); + } + return undefined; + } + static a(attributes) { + return new A(attributes); + } + static b(attributes) { + return new B(attributes); + } + static body(attributes) { + return new Body(attributes); + } + static br(attributes) { + return new Br(attributes); + } + static html(attributes) { + return new Html(attributes); + } + static i(attributes) { + return new I(attributes); + } + static li(attributes) { + return new Li(attributes); + } + static ol(attributes) { + return new Ol(attributes); + } + static p(attributes) { + return new P(attributes); + } + static span(attributes) { + return new Span(attributes); + } + static sub(attributes) { + return new Sub(attributes); + } + static sup(attributes) { + return new Sup(attributes); + } + static ul(attributes) { + return new Ul(attributes); + } +} + +;// ./src/core/xfa/setup.js + + + + + + + + + +const NamespaceSetUp = { + config: ConfigNamespace, + connection: ConnectionSetNamespace, + datasets: DatasetsNamespace, + localeSet: LocaleSetNamespace, + signature: SignatureNamespace, + stylesheet: StylesheetNamespace, + template: TemplateNamespace, + xdp: XdpNamespace, + xhtml: XhtmlNamespace +}; + +;// ./src/core/xfa/unknown.js + + +class UnknownNamespace { + constructor(nsId) { + this.namespaceId = nsId; + } + [$buildXFAObject](name, attributes) { + return new XmlObject(this.namespaceId, name, attributes); + } +} + +;// ./src/core/xfa/builder.js + + + + + + + +class Root extends XFAObject { + constructor(ids) { + super(-1, "root", Object.create(null)); + this.element = null; + this[$ids] = ids; + } + [$onChild](child) { + this.element = child; + return true; + } + [$finalize]() { + super[$finalize](); + if (this.element.template instanceof Template) { + this[$ids].set($root, this.element); + this.element.template[$resolvePrototypes](this[$ids]); + this.element.template[$ids] = this[$ids]; + } + } +} +class Empty extends XFAObject { + constructor() { + super(-1, "", Object.create(null)); + } + [$onChild](_) { + return false; + } +} +class Builder { + constructor(rootNameSpace = null) { + this._namespaceStack = []; + this._nsAgnosticLevel = 0; + this._namespacePrefixes = new Map(); + this._namespaces = new Map(); + this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({ + id + }) => id)); + this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId); + } + buildRoot(ids) { + return new Root(ids); + } + build({ + nsPrefix, + name, + attributes, + namespace, + prefixes + }) { + const hasNamespaceDef = namespace !== null; + if (hasNamespaceDef) { + this._namespaceStack.push(this._currentNamespace); + this._currentNamespace = this._searchNamespace(namespace); + } + if (prefixes) { + this._addNamespacePrefix(prefixes); + } + if (attributes.hasOwnProperty($nsAttributes)) { + const dataTemplate = NamespaceSetUp.datasets; + const nsAttrs = attributes[$nsAttributes]; + let xfaAttrs = null; + for (const [ns, attrs] of Object.entries(nsAttrs)) { + const nsToUse = this._getNamespaceToUse(ns); + if (nsToUse === dataTemplate) { + xfaAttrs = { + xfa: attrs + }; + break; + } + } + if (xfaAttrs) { + attributes[$nsAttributes] = xfaAttrs; + } else { + delete attributes[$nsAttributes]; + } + } + const namespaceToUse = this._getNamespaceToUse(nsPrefix); + const node = namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty(); + if (node[$isNsAgnostic]()) { + this._nsAgnosticLevel++; + } + if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) { + node[$cleanup] = { + hasNamespace: hasNamespaceDef, + prefixes, + nsAgnostic: node[$isNsAgnostic]() + }; + } + return node; + } + isNsAgnostic() { + return this._nsAgnosticLevel > 0; + } + _searchNamespace(nsName) { + let ns = this._namespaces.get(nsName); + if (ns) { + return ns; + } + for (const [name, { + check + }] of Object.entries(NamespaceIds)) { + if (check(nsName)) { + ns = NamespaceSetUp[name]; + if (ns) { + this._namespaces.set(nsName, ns); + return ns; + } + break; + } + } + ns = new UnknownNamespace(++this._nextNsId); + this._namespaces.set(nsName, ns); + return ns; + } + _addNamespacePrefix(prefixes) { + for (const { + prefix, + value + } of prefixes) { + const namespace = this._searchNamespace(value); + let prefixStack = this._namespacePrefixes.get(prefix); + if (!prefixStack) { + prefixStack = []; + this._namespacePrefixes.set(prefix, prefixStack); + } + prefixStack.push(namespace); + } + } + _getNamespaceToUse(prefix) { + if (!prefix) { + return this._currentNamespace; + } + const prefixStack = this._namespacePrefixes.get(prefix); + if (prefixStack?.length > 0) { + return prefixStack.at(-1); + } + warn(`Unknown namespace prefix: ${prefix}.`); + return null; + } + clean(data) { + const { + hasNamespace, + prefixes, + nsAgnostic + } = data; + if (hasNamespace) { + this._currentNamespace = this._namespaceStack.pop(); + } + if (prefixes) { + prefixes.forEach(({ + prefix + }) => { + this._namespacePrefixes.get(prefix).pop(); + }); + } + if (nsAgnostic) { + this._nsAgnosticLevel--; + } + } +} + +;// ./src/core/xfa/parser.js + + + + +class XFAParser extends XMLParserBase { + constructor(rootNameSpace = null, richText = false) { + super(); + this._builder = new Builder(rootNameSpace); + this._stack = []; + this._globalData = { + usedTypefaces: new Set() + }; + this._ids = new Map(); + this._current = this._builder.buildRoot(this._ids); + this._errorCode = XMLParserErrorCode.NoError; + this._whiteRegex = /^\s+$/; + this._nbsps = /\xa0+/g; + this._richText = richText; + } + parse(data) { + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + this._current[$finalize](); + return this._current.element; + } + onText(text) { + text = text.replace(this._nbsps, match => match.slice(1) + " "); + if (this._richText || this._current[$acceptWhitespace]()) { + this._current[$onText](text, this._richText); + return; + } + if (this._whiteRegex.test(text)) { + return; + } + this._current[$onText](text.trim()); + } + onCdata(text) { + this._current[$onText](text); + } + _mkAttributes(attributes, tagName) { + let namespace = null; + let prefixes = null; + const attributeObj = Object.create({}); + for (const { + name, + value + } of attributes) { + if (name === "xmlns") { + if (!namespace) { + namespace = value; + } else { + warn(`XFA - multiple namespace definition in <${tagName}>`); + } + } else if (name.startsWith("xmlns:")) { + const prefix = name.substring("xmlns:".length); + if (!prefixes) { + prefixes = []; + } + prefixes.push({ + prefix, + value + }); + } else { + const i = name.indexOf(":"); + if (i === -1) { + attributeObj[name] = value; + } else { + let nsAttrs = attributeObj[$nsAttributes]; + if (!nsAttrs) { + nsAttrs = attributeObj[$nsAttributes] = Object.create(null); + } + const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; + const attrs = nsAttrs[ns] ||= Object.create(null); + attrs[attrName] = value; + } + } + } + return [namespace, prefixes, attributeObj]; + } + _getNameAndPrefix(name, nsAgnostic) { + const i = name.indexOf(":"); + if (i === -1) { + return [name, null]; + } + return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)]; + } + onBeginElement(tagName, attributes, isEmpty) { + const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName); + const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic()); + const node = this._builder.build({ + nsPrefix, + name, + attributes: attributesObj, + namespace, + prefixes + }); + node[$globalData] = this._globalData; + if (isEmpty) { + node[$finalize](); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); + return; + } + this._stack.push(this._current); + this._current = node; + } + onEndElement(name) { + const node = this._current; + if (node[$isCDATAXml]() && typeof node[$content] === "string") { + const parser = new XFAParser(); + parser._globalData = this._globalData; + const root = parser.parse(node[$content]); + node[$content] = null; + node[$onChild](root); + } + node[$finalize](); + this._current = this._stack.pop(); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); + } + onError(code) { + this._errorCode = code; + } +} + +;// ./src/core/xfa/factory.js + + + + + + + + +class XFAFactory { + constructor(data) { + try { + this.root = new XFAParser().parse(XFAFactory._createDocument(data)); + const binder = new Binder(this.root); + this.form = binder.bind(); + this.dataHandler = new DataHandler(this.root, binder.getData()); + this.form[$globalData].template = this.form; + } catch (e) { + warn(`XFA - an error occurred during parsing and binding: ${e}`); + } + } + isValid() { + return this.root && this.form; + } + _createPagesHelper() { + const iterator = this.form[$toPages](); + return new Promise((resolve, reject) => { + const nextIteration = () => { + try { + const value = iterator.next(); + if (value.done) { + resolve(value.value); + } else { + setTimeout(nextIteration, 0); + } + } catch (e) { + reject(e); + } + }; + setTimeout(nextIteration, 0); + }); + } + async _createPages() { + try { + this.pages = await this._createPagesHelper(); + this.dims = this.pages.children.map(c => { + const { + width, + height + } = c.attributes.style; + return [0, 0, parseInt(width), parseInt(height)]; + }); + } catch (e) { + warn(`XFA - an error occurred during layout: ${e}`); + } + } + getBoundingBox(pageIndex) { + return this.dims[pageIndex]; + } + async getNumPages() { + if (!this.pages) { + await this._createPages(); + } + return this.dims.length; + } + setImages(images) { + this.form[$globalData].images = images; + } + setFonts(fonts) { + this.form[$globalData].fontFinder = new FontFinder(fonts); + const missingFonts = []; + for (let typeface of this.form[$globalData].usedTypefaces) { + typeface = stripQuotes(typeface); + const font = this.form[$globalData].fontFinder.find(typeface); + if (!font) { + missingFonts.push(typeface); + } + } + if (missingFonts.length > 0) { + return missingFonts; + } + return null; + } + appendFonts(fonts, reallyMissingFonts) { + this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts); + } + async getPages() { + if (!this.pages) { + await this._createPages(); + } + const pages = this.pages; + this.pages = null; + return pages; + } + serializeData(storage) { + return this.dataHandler.serialize(storage); + } + static _createDocument(data) { + if (!data["/xdp:xdp"]) { + return data["xdp:xdp"]; + } + return Object.values(data).join(""); + } + static getRichTextAsHtml(rc) { + if (!rc || typeof rc !== "string") { + return null; + } + try { + let root = new XFAParser(XhtmlNamespace, true).parse(rc); + if (!["body", "xhtml"].includes(root[$nodeName])) { + const newRoot = XhtmlNamespace.body({}); + newRoot[$appendChild](root); + root = newRoot; + } + const result = root[$toHTML](); + if (!result.success) { + return null; + } + const { + html + } = result; + const { + attributes + } = html; + if (attributes) { + if (attributes.class) { + attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa")); + } + attributes.dir = "auto"; + } + return { + html, + str: root[$text]() + }; + } catch (e) { + warn(`XFA - an error occurred during parsing of rich text: ${e}`); + } + return null; + } +} + +;// ./src/core/annotation.js + + + + + + + + + + + + + + +class AnnotationFactory { + static createGlobals(pdfManager) { + return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments]) => { + return { + pdfManager, + acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, + xfaDatasets, + structTreeRoot, + baseUrl, + attachments + }; + }, reason => { + warn(`createGlobals: "${reason}".`); + return null; + }); + } + static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageRef) { + const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null; + return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageIndex, pageRef]); + } + static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, pageIndex = null, pageRef = null) { + const dict = xref.fetchIfRef(ref); + if (!(dict instanceof Dict)) { + return undefined; + } + const { + acroForm, + pdfManager + } = annotationGlobals; + const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; + let subtype = dict.get("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + const parameters = { + xref, + ref, + dict, + subtype, + id, + annotationGlobals, + collectFields, + orphanFields, + needAppearances: !collectFields && acroForm.get("NeedAppearances") === true, + pageIndex, + evaluatorOptions: pdfManager.evaluatorOptions, + pageRef + }; + switch (subtype) { + case "Link": + return new LinkAnnotation(parameters); + case "Text": + return new TextAnnotation(parameters); + case "Widget": + let fieldType = getInheritableProperty({ + dict, + key: "FT" + }); + fieldType = fieldType instanceof Name ? fieldType.name : null; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotation(parameters); + case "Btn": + return new ButtonWidgetAnnotation(parameters); + case "Ch": + return new ChoiceWidgetAnnotation(parameters); + case "Sig": + return new SignatureWidgetAnnotation(parameters); + } + warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type."); + return new WidgetAnnotation(parameters); + case "Popup": + return new PopupAnnotation(parameters); + case "FreeText": + return new FreeTextAnnotation(parameters); + case "Line": + return new LineAnnotation(parameters); + case "Square": + return new SquareAnnotation(parameters); + case "Circle": + return new CircleAnnotation(parameters); + case "PolyLine": + return new PolylineAnnotation(parameters); + case "Polygon": + return new PolygonAnnotation(parameters); + case "Caret": + return new CaretAnnotation(parameters); + case "Ink": + return new InkAnnotation(parameters); + case "Highlight": + return new HighlightAnnotation(parameters); + case "Underline": + return new UnderlineAnnotation(parameters); + case "Squiggly": + return new SquigglyAnnotation(parameters); + case "StrikeOut": + return new StrikeOutAnnotation(parameters); + case "Stamp": + return new StampAnnotation(parameters); + case "FileAttachment": + return new FileAttachmentAnnotation(parameters); + default: + if (!collectFields) { + if (!subtype) { + warn("Annotation is missing the required /Subtype."); + } else { + warn(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation."); + } + } + return new Annotation(parameters); + } + } + static async _getPageIndex(xref, ref, pdfManager) { + try { + const annotDict = await xref.fetchIfRefAsync(ref); + if (!(annotDict instanceof Dict)) { + return -1; + } + const pageRef = annotDict.getRaw("P"); + if (pageRef instanceof Ref) { + try { + const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]); + return pageIndex; + } catch (ex) { + info(`_getPageIndex -- not a valid page reference: "${ex}".`); + } + } + if (annotDict.has("Kids")) { + return -1; + } + const numPages = await pdfManager.ensureDoc("numPages"); + for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { + const page = await pdfManager.getPage(pageIndex); + const annotations = await pdfManager.ensure(page, "annotations"); + for (const annotRef of annotations) { + if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) { + return pageIndex; + } + } + } + } catch (ex) { + warn(`_getPageIndex: "${ex}".`); + } + return -1; + } + static generateImages(annotations, xref, isOffscreenCanvasSupported) { + if (!isOffscreenCanvasSupported) { + warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images."); + return null; + } + let imagePromises; + for (const { + bitmapId, + bitmap + } of annotations) { + if (!bitmap) { + continue; + } + imagePromises ||= new Map(); + imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref)); + } + return imagePromises; + } + static async saveNewAnnotations(evaluator, task, annotations, imagePromises, changes) { + const xref = evaluator.xref; + let baseFontRef; + const promises = []; + const { + isOffscreenCanvasSupported + } = evaluator.options; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + if (!baseFontRef) { + const baseFont = new Dict(xref); + baseFont.set("BaseFont", Name.get("Helvetica")); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type1")); + baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + baseFontRef = xref.getNewTemporaryRef(); + changes.put(baseFontRef, { + data: baseFont + }); + } + promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, { + evaluator, + task, + baseFontRef + })); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes)); + } else { + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); + } + break; + case AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); + break; + case AnnotationEditorType.STAMP: + const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { + const { + imageStream, + smaskStream + } = image; + if (smaskStream) { + const smaskRef = xref.getNewTemporaryRef(); + changes.put(smaskRef, { + data: smaskStream + }); + imageStream.dict.set("SMask", smaskRef); + } + const imageRef = image.imageRef = xref.getNewTemporaryRef(); + changes.put(imageRef, { + data: imageStream + }); + image.imageStream = image.smaskStream = null; + } + promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, { + image + })); + break; + } + } + return { + annotations: await Promise.all(promises) + }; + } + static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) { + if (!annotations) { + return null; + } + const { + options, + xref + } = evaluator; + const promises = []; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + promises.push(FreeTextAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluator, + task, + evaluatorOptions: options + })); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push(HighlightAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + } else { + promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + } + break; + case AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + break; + case AnnotationEditorType.STAMP: + const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { + const { + imageStream, + smaskStream + } = image; + if (smaskStream) { + imageStream.dict.set("SMask", smaskStream); + } + image.imageRef = new JpegStream(imageStream, imageStream.length); + image.imageStream = image.smaskStream = null; + } + promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + image, + evaluatorOptions: options + })); + break; + } + } + return Promise.all(promises); + } +} +function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) { + if (!Array.isArray(color)) { + return defaultColor; + } + const rgbColor = defaultColor || new Uint8ClampedArray(3); + switch (color.length) { + case 0: + return null; + case 1: + ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 3: + ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 4: + ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + default: + return defaultColor; + } +} +function getPdfColorArray(color) { + return Array.from(color, c => c / 255); +} +function getQuadPoints(dict, rect) { + const quadPoints = dict.getArray("QuadPoints"); + if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { + return null; + } + const newQuadPoints = new Float32Array(quadPoints.length); + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); + const minX = Math.min(x1, x2, x3, x4); + const maxX = Math.max(x1, x2, x3, x4); + const minY = Math.min(y1, y2, y3, y4); + const maxY = Math.max(y1, y2, y3, y4); + if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { + return null; + } + newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); + } + return newQuadPoints; +} +function getTransformMatrix(rect, bbox, matrix) { + const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(bbox, matrix); + if (minX === maxX || minY === maxY) { + return [1, 0, 0, 1, rect[0], rect[1]]; + } + const xRatio = (rect[2] - rect[0]) / (maxX - minX); + const yRatio = (rect[3] - rect[1]) / (maxY - minY); + return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio]; +} +class Annotation { + constructor(params) { + const { + dict, + xref, + annotationGlobals, + ref, + orphanFields + } = params; + const parentRef = orphanFields?.get(ref); + if (parentRef) { + dict.set("Parent", parentRef); + } + this.setTitle(dict.get("T")); + this.setContents(dict.get("Contents")); + this.setModificationDate(dict.get("M")); + this.setFlags(dict.get("F")); + this.setRectangle(dict.getArray("Rect")); + this.setColor(dict.getArray("C")); + this.setBorderStyle(dict); + this.setAppearance(dict); + this.setOptionalContent(dict); + const MK = dict.get("MK"); + this.setBorderAndBackgroundColors(MK); + this.setRotation(MK, dict); + this.ref = params.ref instanceof Ref ? params.ref : null; + this._streams = []; + if (this.appearance) { + this._streams.push(this.appearance); + } + const isLocked = !!(this.flags & AnnotationFlag.LOCKED); + const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS); + this.data = { + annotationFlags: this.flags, + borderStyle: this.borderStyle, + color: this.color, + backgroundColor: this.backgroundColor, + borderColor: this.borderColor, + rotation: this.rotation, + contentsObj: this._contents, + hasAppearance: !!this.appearance, + id: params.id, + modificationDate: this.modificationDate, + rect: this.rectangle, + subtype: params.subtype, + hasOwnCanvas: false, + noRotate: !!(this.flags & AnnotationFlag.NOROTATE), + noHTML: isLocked && isContentLocked, + isEditable: false, + structParent: -1 + }; + if (annotationGlobals.structTreeRoot) { + let structParent = dict.get("StructParent"); + this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; + annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent); + } + if (params.collectFields) { + const kids = dict.get("Kids"); + if (Array.isArray(kids)) { + const kidIds = []; + for (const kid of kids) { + if (kid instanceof Ref) { + kidIds.push(kid.toString()); + } + } + if (kidIds.length !== 0) { + this.data.kidIds = kidIds; + } + } + this.data.actions = collectActions(xref, dict, AnnotationActionEventType); + this.data.fieldName = this._constructFieldName(dict); + this.data.pageIndex = params.pageIndex; + } + const it = dict.get("IT"); + if (it instanceof Name) { + this.data.it = it.name; + } + this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported; + this._fallbackFontDict = null; + this._needAppearances = false; + } + _hasFlag(flags, flag) { + return !!(flags & flag); + } + _buildFlags(noView, noPrint) { + let { + flags + } = this; + if (noView === undefined) { + if (noPrint === undefined) { + return undefined; + } + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT; + } + if (noView) { + flags |= AnnotationFlag.PRINT; + if (noPrint) { + return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN; + } + return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW; + } + flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW); + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags | AnnotationFlag.PRINT; + } + _isViewable(flags) { + return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); + } + _isPrintable(flags) { + return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE); + } + mustBeViewed(annotationStorage, _renderForms) { + const noView = annotationStorage?.get(this.data.id)?.noView; + if (noView !== undefined) { + return !noView; + } + return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN); + } + mustBePrinted(annotationStorage) { + const noPrint = annotationStorage?.get(this.data.id)?.noPrint; + if (noPrint !== undefined) { + return !noPrint; + } + return this.printable; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); + } + get viewable() { + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return true; + } + return this._isViewable(this.flags); + } + get printable() { + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return false; + } + return this._isPrintable(this.flags); + } + _parseStringHelper(data) { + const str = typeof data === "string" ? stringToPDFString(data) : ""; + const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr"; + return { + str, + dir + }; + } + setDefaultAppearance(params) { + const { + dict, + annotationGlobals + } = params; + const defaultAppearance = getInheritableProperty({ + dict, + key: "DA" + }) || annotationGlobals.acroForm.get("DA"); + this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : ""; + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance); + } + setTitle(title) { + this._title = this._parseStringHelper(title); + } + setContents(contents) { + this._contents = this._parseStringHelper(contents); + } + setModificationDate(modificationDate) { + this.modificationDate = typeof modificationDate === "string" ? modificationDate : null; + } + setFlags(flags) { + this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0; + if (this.flags & AnnotationFlag.INVISIBLE && this.constructor.name !== "Annotation") { + this.flags ^= AnnotationFlag.INVISIBLE; + } + } + hasFlag(flag) { + return this._hasFlag(this.flags, flag); + } + setRectangle(rectangle) { + this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); + } + setColor(color) { + this.color = getRgbColor(color); + } + setLineEndings(lineEndings) { + this.lineEndings = ["None", "None"]; + if (Array.isArray(lineEndings) && lineEndings.length === 2) { + for (let i = 0; i < 2; i++) { + const obj = lineEndings[i]; + if (obj instanceof Name) { + switch (obj.name) { + case "None": + continue; + case "Square": + case "Circle": + case "Diamond": + case "OpenArrow": + case "ClosedArrow": + case "Butt": + case "ROpenArrow": + case "RClosedArrow": + case "Slash": + this.lineEndings[i] = obj.name; + continue; + } + } + warn(`Ignoring invalid lineEnding: ${obj}`); + } + } + } + setRotation(mk, dict) { + this.rotation = 0; + let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0; + if (Number.isInteger(angle) && angle !== 0) { + angle %= 360; + if (angle < 0) { + angle += 360; + } + if (angle % 90 === 0) { + this.rotation = angle; + } + } + } + setBorderAndBackgroundColors(mk) { + if (mk instanceof Dict) { + this.borderColor = getRgbColor(mk.getArray("BC"), null); + this.backgroundColor = getRgbColor(mk.getArray("BG"), null); + } else { + this.borderColor = this.backgroundColor = null; + } + } + setBorderStyle(borderStyle) { + this.borderStyle = new AnnotationBorderStyle(); + if (!(borderStyle instanceof Dict)) { + return; + } + if (borderStyle.has("BS")) { + const dict = borderStyle.get("BS"); + if (dict instanceof Dict) { + const dictType = dict.get("Type"); + if (!dictType || isName(dictType, "Border")) { + this.borderStyle.setWidth(dict.get("W"), this.rectangle); + this.borderStyle.setStyle(dict.get("S")); + this.borderStyle.setDashArray(dict.getArray("D")); + } + } + } else if (borderStyle.has("Border")) { + const array = borderStyle.getArray("Border"); + if (Array.isArray(array) && array.length >= 3) { + this.borderStyle.setHorizontalCornerRadius(array[0]); + this.borderStyle.setVerticalCornerRadius(array[1]); + this.borderStyle.setWidth(array[2], this.rectangle); + if (array.length === 4) { + this.borderStyle.setDashArray(array[3], true); + } + } + } else { + this.borderStyle.setWidth(0); + } + } + setAppearance(dict) { + this.appearance = null; + const appearanceStates = dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return; + } + const normalAppearanceState = appearanceStates.get("N"); + if (normalAppearanceState instanceof BaseStream) { + this.appearance = normalAppearanceState; + return; + } + if (!(normalAppearanceState instanceof Dict)) { + return; + } + const as = dict.get("AS"); + if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) { + return; + } + const appearance = normalAppearanceState.get(as.name); + if (appearance instanceof BaseStream) { + this.appearance = appearance; + } + } + setOptionalContent(dict) { + this.oc = null; + const oc = dict.get("OC"); + if (oc instanceof Name) { + warn("setOptionalContent: Support for /Name-entry is not implemented."); + } else if (oc instanceof Dict) { + this.oc = oc; + } + } + loadResources(keys, appearance) { + return appearance.dict.getAsync("Resources").then(resources => { + if (!resources) { + return undefined; + } + const objectLoader = new ObjectLoader(resources, keys, resources.xref); + return objectLoader.load().then(function () { + return resources; + }); + }); + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + const { + hasOwnCanvas, + id, + rect + } = this.data; + let appearance = this.appearance; + const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); + if (isUsingOwnCanvas && (rect[0] === rect[2] || rect[1] === rect[3])) { + this.data.hasOwnCanvas = false; + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + if (!appearance) { + if (!isUsingOwnCanvas) { + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + appearance = new StringStream(""); + appearance.dict = new Dict(); + } + const appearanceDict = appearance.dict; + const resources = await this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], appearance); + const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, 1, 1]); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX); + const transform = getTransformMatrix(rect, bbox, matrix); + const opList = new OperatorList(); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [id, rect, transform, matrix, isUsingOwnCanvas]); + await evaluator.getOperatorList({ + stream: appearance, + task, + resources, + operatorList: opList, + fallbackFontDict: this._fallbackFontDict + }); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + this.reset(); + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + async save(evaluator, task, annotationStorage, changes) { + return null; + } + get hasTextContent() { + return false; + } + async extractTextContent(evaluator, task, viewBox) { + if (!this.appearance) { + return; + } + const resources = await this.loadResources(["ExtGState", "Font", "Properties", "XObject"], this.appearance); + const text = []; + const buffer = []; + let firstPosition = null; + const sink = { + desiredSize: Math.Infinity, + ready: true, + enqueue(chunk, size) { + for (const item of chunk.items) { + if (item.str === undefined) { + continue; + } + firstPosition ||= item.transform.slice(-2); + buffer.push(item.str); + if (item.hasEOL) { + text.push(buffer.join("").trimEnd()); + buffer.length = 0; + } + } + } + }; + await evaluator.getTextContent({ + stream: this.appearance, + task, + resources, + includeMarkedContent: true, + keepWhiteSpace: true, + sink, + viewBox + }); + this.reset(); + if (buffer.length) { + text.push(buffer.join("").trimEnd()); + } + if (text.length > 1 || text[0]) { + const appearanceDict = this.appearance.dict; + const bbox = lookupRect(appearanceDict.getArray("BBox"), null); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null); + this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix); + this.data.textContent = text; + } + } + _transformPoint(coords, bbox, matrix) { + const { + rect + } = this.data; + bbox ||= [0, 0, 1, 1]; + matrix ||= [1, 0, 0, 1, 0, 0]; + const transform = getTransformMatrix(rect, bbox, matrix); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + coords = Util.applyTransform(coords, transform); + return Util.applyTransform(coords, matrix); + } + getFieldObject() { + if (this.data.kidIds) { + return { + id: this.data.id, + actions: this.data.actions, + name: this.data.fieldName, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + type: "", + kidIds: this.data.kidIds, + page: this.data.pageIndex, + rotation: this.rotation + }; + } + return null; + } + reset() { + for (const stream of this._streams) { + stream.reset(); + } + } + _constructFieldName(dict) { + if (!dict.has("T") && !dict.has("Parent")) { + warn("Unknown field name, falling back to empty field name."); + return ""; + } + if (!dict.has("Parent")) { + return stringToPDFString(dict.get("T")); + } + const fieldName = []; + if (dict.has("T")) { + fieldName.unshift(stringToPDFString(dict.get("T"))); + } + let loopDict = dict; + const visited = new RefSet(); + if (dict.objId) { + visited.put(dict.objId); + } + while (loopDict.has("Parent")) { + loopDict = loopDict.get("Parent"); + if (!(loopDict instanceof Dict) || loopDict.objId && visited.has(loopDict.objId)) { + break; + } + if (loopDict.objId) { + visited.put(loopDict.objId); + } + if (loopDict.has("T")) { + fieldName.unshift(stringToPDFString(loopDict.get("T"))); + } + } + return fieldName.join("."); + } +} +class AnnotationBorderStyle { + constructor() { + this.width = 1; + this.rawWidth = 1; + this.style = AnnotationBorderStyleType.SOLID; + this.dashArray = [3]; + this.horizontalCornerRadius = 0; + this.verticalCornerRadius = 0; + } + setWidth(width, rect = [0, 0, 0, 0]) { + if (width instanceof Name) { + this.width = 0; + return; + } + if (typeof width === "number") { + if (width > 0) { + this.rawWidth = width; + const maxWidth = (rect[2] - rect[0]) / 2; + const maxHeight = (rect[3] - rect[1]) / 2; + if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { + warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`); + width = 1; + } + } + this.width = width; + } + } + setStyle(style) { + if (!(style instanceof Name)) { + return; + } + switch (style.name) { + case "S": + this.style = AnnotationBorderStyleType.SOLID; + break; + case "D": + this.style = AnnotationBorderStyleType.DASHED; + break; + case "B": + this.style = AnnotationBorderStyleType.BEVELED; + break; + case "I": + this.style = AnnotationBorderStyleType.INSET; + break; + case "U": + this.style = AnnotationBorderStyleType.UNDERLINE; + break; + default: + break; + } + } + setDashArray(dashArray, forceStyle = false) { + if (Array.isArray(dashArray)) { + let isValid = true; + let allZeros = true; + for (const element of dashArray) { + const validNumber = +element >= 0; + if (!validNumber) { + isValid = false; + break; + } else if (element > 0) { + allZeros = false; + } + } + if (dashArray.length === 0 || isValid && !allZeros) { + this.dashArray = dashArray; + if (forceStyle) { + this.setStyle(Name.get("D")); + } + } else { + this.width = 0; + } + } else if (dashArray) { + this.width = 0; + } + } + setHorizontalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.horizontalCornerRadius = radius; + } + } + setVerticalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.verticalCornerRadius = radius; + } + } +} +class MarkupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + if (dict.has("IRT")) { + const rawIRT = dict.getRaw("IRT"); + this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null; + const rt = dict.get("RT"); + this.data.replyType = rt instanceof Name ? rt.name : AnnotationReplyType.REPLY; + } + let popupRef = null; + if (this.data.replyType === AnnotationReplyType.GROUP) { + const parent = dict.get("IRT"); + this.setTitle(parent.get("T")); + this.data.titleObj = this._title; + this.setContents(parent.get("Contents")); + this.data.contentsObj = this._contents; + if (!parent.has("CreationDate")) { + this.data.creationDate = null; + } else { + this.setCreationDate(parent.get("CreationDate")); + this.data.creationDate = this.creationDate; + } + if (!parent.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parent.get("M")); + this.data.modificationDate = this.modificationDate; + } + popupRef = parent.getRaw("Popup"); + if (!parent.has("C")) { + this.data.color = null; + } else { + this.setColor(parent.getArray("C")); + this.data.color = this.color; + } + } else { + this.data.titleObj = this._title; + this.setCreationDate(dict.get("CreationDate")); + this.data.creationDate = this.creationDate; + popupRef = dict.getRaw("Popup"); + if (!dict.has("C")) { + this.data.color = null; + } + } + this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null; + if (dict.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC")); + } + } + setCreationDate(creationDate) { + this.creationDate = typeof creationDate === "string" ? creationDate : null; + } + _setDefaultAppearance({ + xref, + extra, + strokeColor, + fillColor, + blendMode, + strokeAlpha, + fillAlpha, + pointsCallback + }) { + let minX = Number.MAX_VALUE; + let minY = Number.MAX_VALUE; + let maxX = Number.MIN_VALUE; + let maxY = Number.MIN_VALUE; + const buffer = ["q"]; + if (extra) { + buffer.push(extra); + } + if (strokeColor) { + buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); + } + if (fillColor) { + buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); + } + const pointsArray = this.data.quadPoints || Float32Array.from([this.rectangle[0], this.rectangle[3], this.rectangle[2], this.rectangle[3], this.rectangle[0], this.rectangle[1], this.rectangle[2], this.rectangle[1]]); + for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { + const [mX, MX, mY, MY] = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); + minX = Math.min(minX, mX); + maxX = Math.max(maxX, MX); + minY = Math.min(minY, mY); + maxY = Math.max(maxY, MY); + } + buffer.push("Q"); + const formDict = new Dict(xref); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("Subtype", Name.get("Form")); + const appearanceStream = new StringStream(buffer.join(" ")); + appearanceStream.dict = appearanceStreamDict; + formDict.set("Fm0", appearanceStream); + const gsDict = new Dict(xref); + if (blendMode) { + gsDict.set("BM", Name.get(blendMode)); + } + if (typeof strokeAlpha === "number") { + gsDict.set("CA", strokeAlpha); + } + if (typeof fillAlpha === "number") { + gsDict.set("ca", fillAlpha); + } + const stateDict = new Dict(xref); + stateDict.set("GS0", gsDict); + const resources = new Dict(xref); + resources.set("ExtGState", stateDict); + resources.set("XObject", formDict); + const appearanceDict = new Dict(xref); + appearanceDict.set("Resources", resources); + const bbox = this.data.rect = [minX, minY, maxX, maxY]; + appearanceDict.set("BBox", bbox); + this.appearance = new StringStream("/GS0 gs /Fm0 Do"); + this.appearance.dict = appearanceDict; + this._streams.push(this.appearance, appearanceStream); + } + static async createNewAnnotation(xref, annotation, changes, params) { + const annotationRef = annotation.ref ||= xref.getNewTemporaryRef(); + const ap = await this.createNewAppearanceStream(annotation, xref, params); + let annotationDict; + if (ap) { + const apRef = xref.getNewTemporaryRef(); + annotationDict = this.createNewDict(annotation, xref, { + apRef + }); + changes.put(apRef, { + data: ap + }); + } else { + annotationDict = this.createNewDict(annotation, xref, {}); + } + if (Number.isInteger(annotation.parentTreeId)) { + annotationDict.set("StructParent", annotation.parentTreeId); + } + changes.put(annotationRef, { + data: annotationDict + }); + return { + ref: annotationRef + }; + } + static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) { + const ap = await this.createNewAppearanceStream(annotation, xref, params); + const annotationDict = this.createNewDict(annotation, xref, ap ? { + ap + } : {}); + const newAnnotation = new this.prototype.constructor({ + dict: annotationDict, + xref, + annotationGlobals, + evaluatorOptions: params.evaluatorOptions + }); + if (annotation.ref) { + newAnnotation.ref = newAnnotation.refToReplace = annotation.ref; + } + return newAnnotation; + } +} +class WidgetAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const data = this.data; + this._needAppearances = params.needAppearances; + data.annotationType = AnnotationType.WIDGET; + if (data.fieldName === undefined) { + data.fieldName = this._constructFieldName(dict); + } + if (data.actions === undefined) { + data.actions = collectActions(xref, dict, AnnotationActionEventType); + } + let fieldValue = getInheritableProperty({ + dict, + key: "V", + getArray: true + }); + data.fieldValue = this._decodeFormValue(fieldValue); + const defaultFieldValue = getInheritableProperty({ + dict, + key: "DV", + getArray: true + }); + data.defaultFieldValue = this._decodeFormValue(defaultFieldValue); + if (fieldValue === undefined && annotationGlobals.xfaDatasets) { + const path = this._title.str; + if (path) { + this._hasValueFromXFA = true; + data.fieldValue = fieldValue = annotationGlobals.xfaDatasets.getValue(path); + } + } + if (fieldValue === undefined && data.defaultFieldValue !== null) { + data.fieldValue = data.defaultFieldValue; + } + data.alternativeText = stringToPDFString(dict.get("TU") || ""); + this.setDefaultAppearance(params); + data.hasAppearance ||= this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null; + const fieldType = getInheritableProperty({ + dict, + key: "FT" + }); + data.fieldType = fieldType instanceof Name ? fieldType.name : null; + const localResources = getInheritableProperty({ + dict, + key: "DR" + }); + const acroFormResources = annotationGlobals.acroForm.get("DR"); + const appearanceResources = this.appearance?.dict.get("Resources"); + this._fieldResources = { + localResources, + acroFormResources, + appearanceResources, + mergedResources: Dict.merge({ + xref, + dictArray: [localResources, appearanceResources, acroFormResources], + mergeSubDicts: true + }) + }; + data.fieldFlags = getInheritableProperty({ + dict, + key: "Ff" + }); + if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { + data.fieldFlags = 0; + } + data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); + data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED); + data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW); + } + _decodeFormValue(formValue) { + if (Array.isArray(formValue)) { + return formValue.filter(item => typeof item === "string").map(item => stringToPDFString(item)); + } else if (formValue instanceof Name) { + return stringToPDFString(formValue.name); + } else if (typeof formValue === "string") { + return stringToPDFString(formValue); + } + return null; + } + hasFieldFlag(flag) { + return !!(this.data.fieldFlags & flag); + } + _isViewable(flags) { + return true; + } + mustBeViewed(annotationStorage, renderForms) { + if (renderForms) { + return this.viewable; + } + return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW); + } + getRotationMatrix(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (rotation === 0) { + return IDENTITY_MATRIX; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + return getRotationMatrix(rotation, width, height); + } + getBorderAndBackgroundAppearances(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (!this.backgroundColor && !this.borderColor) { + return ""; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const rect = rotation === 0 || rotation === 180 ? `0 0 ${width} ${height} re` : `0 0 ${height} ${width} re`; + let str = ""; + if (this.backgroundColor) { + str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `; + } + if (this.borderColor) { + const borderWidth = this.borderStyle.width || 1; + str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `; + } + return str; + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { + return { + opList: new OperatorList(), + separateForm: true, + separateCanvas: false + }; + } + if (!this._hasText) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const content = await this._getAppearance(evaluator, task, intent, annotationStorage); + if (this.appearance && content === null) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const opList = new OperatorList(); + if (!this._defaultAppearance || content === null) { + return { + opList, + separateForm: false, + separateCanvas: false + }; + } + const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); + const matrix = [1, 0, 0, 1, 0, 0]; + const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]; + const transform = getTransformMatrix(this.data.rect, bbox, matrix); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]); + const stream = new StringStream(content); + await evaluator.getOperatorList({ + stream, + task, + resources: this._fieldResources.mergedResources, + operatorList: opList + }); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + _getMKDict(rotation) { + const mk = new Dict(null); + if (rotation) { + mk.set("R", rotation); + } + if (this.borderColor) { + mk.set("BC", getPdfColorArray(this.borderColor)); + } + if (this.backgroundColor) { + mk.set("BG", getPdfColorArray(this.backgroundColor)); + } + return mk.size > 0 ? mk : null; + } + amendSavedDict(annotationStorage, dict) {} + setValue(dict, value, xref, changes) { + const { + dict: parentDict, + ref: parentRef + } = getParentToUpdate(dict, this.ref, xref); + if (!parentDict) { + dict.set("V", value); + } else if (!changes.has(parentRef)) { + const newParentDict = parentDict.clone(); + newParentDict.set("V", value); + changes.put(parentRef, { + data: newParentDict + }); + return newParentDict; + } + return null; + } + async save(evaluator, task, annotationStorage, changes) { + const storageEntry = annotationStorage?.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let value = storageEntry?.value, + rotation = storageEntry?.rotation; + if (value === this.data.fieldValue || value === undefined) { + if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) { + return; + } + value ||= this.data.fieldValue; + } + if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) { + return; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let appearance = null; + if (!this._needAppearances) { + appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage); + if (appearance === null && flags === undefined) { + return; + } + } else {} + let needAppearances = false; + if (appearance?.needAppearances) { + needAppearances = true; + appearance = null; + } + const { + xref + } = evaluator; + const originalDict = xref.fetchIfRef(this.ref); + if (!(originalDict instanceof Dict)) { + return; + } + const dict = new Dict(xref); + for (const key of originalDict.getKeys()) { + if (key !== "AP") { + dict.set(key, originalDict.getRaw(key)); + } + } + if (flags !== undefined) { + dict.set("F", flags); + if (appearance === null && !needAppearances) { + const ap = originalDict.getRaw("AP"); + if (ap) { + dict.set("AP", ap); + } + } + } + const xfa = { + path: this.data.fieldName, + value + }; + const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes); + this.amendSavedDict(annotationStorage, newParentDict || dict); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances + }); + if (appearance !== null) { + const newRef = xref.getNewTemporaryRef(); + const AP = new Dict(xref); + dict.set("AP", AP); + AP.set("N", newRef); + const resources = this._getSaveFieldResources(xref); + const appearanceStream = new StringStream(appearance); + const appearanceDict = appearanceStream.dict = new Dict(xref); + appearanceDict.set("Subtype", Name.get("Form")); + appearanceDict.set("Resources", resources); + appearanceDict.set("BBox", [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]); + const rotationMatrix = this.getRotationMatrix(annotationStorage); + if (rotationMatrix !== IDENTITY_MATRIX) { + appearanceDict.set("Matrix", rotationMatrix); + } + changes.put(newRef, { + data: appearanceStream, + xfa: null, + needAppearances: false + }); + } + dict.set("M", `D:${getModificationDate()}`); + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + const isPassword = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); + if (isPassword) { + return null; + } + const storageEntry = annotationStorage?.get(this.data.id); + let value, rotation; + if (storageEntry) { + value = storageEntry.formattedValue || storageEntry.value; + rotation = storageEntry.rotation; + } + if (rotation === undefined && value === undefined && !this._needAppearances) { + if (!this._hasValueFromXFA || this.appearance) { + return null; + } + } + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + if (value === undefined) { + value = this.data.fieldValue; + if (!value) { + return `/Tx BMC q ${colors}Q EMC`; + } + } + if (Array.isArray(value) && value.length === 1) { + value = value[0]; + } + assert(typeof value === "string", "Expected `value` to be a string."); + value = value.trimEnd(); + if (this.data.combo) { + const option = this.data.options.find(({ + exportValue + }) => value === exportValue); + value = option?.displayValue || value; + } + if (value === "") { + return `/Tx BMC q ${colors}Q EMC`; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let lineCount = -1; + let lines; + if (this.data.multiLine) { + lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC")); + lineCount = lines.length; + } else { + lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + let defaultAppearance, fontSize, lineHeight; + const encodedLines = []; + let encodingError = false; + for (const line of lines) { + const encodedString = font.encodeString(line); + if (encodedString.length > 1) { + encodingError = true; + } + encodedLines.push(encodedString.join("")); + } + if (encodingError && intent & RenderingIntentFlag.SAVE) { + return { + needAppearances: true + }; + } + if (encodingError && this._isOffscreenCanvasSupported) { + const fontFamily = this.data.comb ? "monospace" : "sans-serif"; + const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily); + const resources = fakeUnicodeFont.createFontResources(lines.join("")); + const newFont = resources.getRaw("Font"); + if (this._fieldResources.mergedResources.has("Font")) { + const oldFont = this._fieldResources.mergedResources.get("Font"); + for (const key of newFont.getKeys()) { + oldFont.set(key, newFont.getRaw(key)); + } + } else { + this._fieldResources.mergedResources.set("Font", newFont); + } + const fontName = fakeUnicodeFont.fontName.name; + font = await WidgetAnnotation._getFontData(evaluator, task, { + fontName, + fontSize: 0 + }, resources); + for (let i = 0, ii = encodedLines.length; i < ii; i++) { + encodedLines[i] = stringToUTF16String(lines[i]); + } + const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData); + this.data.defaultAppearanceData.fontSize = 0; + this.data.defaultAppearanceData.fontName = fontName; + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + this.data.defaultAppearanceData = savedDefaultAppearance; + } else { + if (!this._isOffscreenCanvasSupported) { + warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly."); + } + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + } + let descent = font.descent; + if (isNaN(descent)) { + descent = BASELINE_FACTOR * lineHeight; + } else { + descent = Math.max(BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize); + } + const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding); + const alignment = this.data.textAlignment; + if (this.data.multiLine) { + return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + } + if (this.data.comb) { + return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + } + const bottomPadding = defaultVPadding + descent; + if (alignment === 0 || alignment > 2) { + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + " ET Q EMC"; + } + const prevInfo = { + shift: 0 + }; + const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC"; + } + static async _getFontData(evaluator, task, appearanceData, resources) { + const operatorList = new OperatorList(); + const initialState = { + font: null, + clone() { + return this; + } + }; + const { + fontName, + fontSize + } = appearanceData; + await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null); + return initialState.font; + } + _getTextWidth(text, font) { + return font.charsToGlyphs(text).reduce((width, glyph) => width + glyph.width, 0) / 1000; + } + _computeFontSize(height, width, text, font, lineCount) { + let { + fontSize + } = this.data.defaultAppearanceData; + let lineHeight = (fontSize || 12) * LINE_FACTOR, + numberOfLines = Math.round(height / lineHeight); + if (!fontSize) { + const roundWithTwoDigits = x => Math.floor(x * 100) / 100; + if (lineCount === -1) { + const textWidth = this._getTextWidth(text, font); + fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth)); + numberOfLines = 1; + } else { + const lines = text.split(/\r\n?|\n/); + const cachedLines = []; + for (const line of lines) { + const encoded = font.encodeString(line).join(""); + const glyphs = font.charsToGlyphs(encoded); + const positions = font.getCharPositions(encoded); + cachedLines.push({ + line: encoded, + glyphs, + positions + }); + } + const isTooBig = fsize => { + let totalHeight = 0; + for (const cache of cachedLines) { + const chunks = this._splitLine(null, font, fsize, width, cache); + totalHeight += chunks.length * fsize; + if (totalHeight > height) { + return true; + } + } + return false; + }; + numberOfLines = Math.max(numberOfLines, lineCount); + while (true) { + lineHeight = height / numberOfLines; + fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR); + if (isTooBig(fontSize)) { + numberOfLines++; + continue; + } + break; + } + } + const { + fontName, + fontColor + } = this.data.defaultAppearanceData; + this._defaultAppearance = createDefaultAppearance({ + fontSize, + fontName, + fontColor + }); + } + return [this._defaultAppearance, fontSize, height / numberOfLines]; + } + _renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) { + let shift; + if (alignment === 1) { + const width = this._getTextWidth(text, font) * fontSize; + shift = (totalWidth - width) / 2; + } else if (alignment === 2) { + const width = this._getTextWidth(text, font) * fontSize; + shift = totalWidth - width - hPadding; + } else { + shift = hPadding; + } + const shiftStr = numberToString(shift - prevInfo.shift); + prevInfo.shift = shift; + vPadding = numberToString(vPadding); + return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`; + } + _getSaveFieldResources(xref) { + const { + localResources, + appearanceResources, + acroFormResources + } = this._fieldResources; + const fontName = this.data.defaultAppearanceData?.fontName; + if (!fontName) { + return localResources || Dict.empty; + } + for (const resources of [localResources, appearanceResources]) { + if (resources instanceof Dict) { + const localFont = resources.get("Font"); + if (localFont instanceof Dict && localFont.has(fontName)) { + return resources; + } + } + } + if (acroFormResources instanceof Dict) { + const acroFormFont = acroFormResources.get("Font"); + if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) { + const subFontDict = new Dict(xref); + subFontDict.set(fontName, acroFormFont.getRaw(fontName)); + const subResourcesDict = new Dict(xref); + subResourcesDict.set("Font", subFontDict); + return Dict.merge({ + xref, + dictArray: [subResourcesDict, localResources], + mergeSubDicts: true + }); + } + } + return localResources || Dict.empty; + } + getFieldObject() { + return null; + } +} +class TextWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + const { + dict + } = params; + if (dict.has("PMD")) { + this.flags |= AnnotationFlag.HIDDEN; + this.data.hidden = true; + warn("Barcodes are not supported"); + } + this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; + this._hasText = true; + if (typeof this.data.fieldValue !== "string") { + this.data.fieldValue = ""; + } + let alignment = getInheritableProperty({ + dict, + key: "Q" + }); + if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) { + alignment = null; + } + this.data.textAlignment = alignment; + let maximumLength = getInheritableProperty({ + dict, + key: "MaxLen" + }); + if (!Number.isInteger(maximumLength) || maximumLength < 0) { + maximumLength = 0; + } + this.data.maxLen = maximumLength; + this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); + this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; + this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); + } + get hasTextContent() { + return !!this.appearance && !this._needAppearances; + } + _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) { + const combWidth = width / this.data.maxLen; + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const buf = []; + const positions = font.getCharPositions(text); + for (const [start, end] of positions) { + buf.push(`(${escapeString(text.substring(start, end))}) Tj`); + } + const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC"; + } + _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) { + const buf = []; + const totalWidth = width - 2 * hPadding; + const prevInfo = { + shift: 0 + }; + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + const chunks = this._splitLine(line, font, fontSize, totalWidth); + for (let j = 0, jj = chunks.length; j < jj; j++) { + const chunk = chunks[j]; + const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight; + buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift)); + } + } + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const renderedText = buf.join("\n"); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + " ET Q EMC"; + } + _splitLine(line, font, fontSize, width, cache = {}) { + line = cache.line || line; + const glyphs = cache.glyphs || font.charsToGlyphs(line); + if (glyphs.length <= 1) { + return [line]; + } + const positions = cache.positions || font.getCharPositions(line); + const scale = fontSize / 1000; + const chunks = []; + let lastSpacePosInStringStart = -1, + lastSpacePosInStringEnd = -1, + lastSpacePos = -1, + startChunk = 0, + currentWidth = 0; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const [start, end] = positions[i]; + const glyph = glyphs[i]; + const glyphWidth = glyph.width * scale; + if (glyph.unicode === " ") { + if (currentWidth + glyphWidth > width) { + chunks.push(line.substring(startChunk, start)); + startChunk = start; + currentWidth = glyphWidth; + lastSpacePosInStringStart = -1; + lastSpacePos = -1; + } else { + currentWidth += glyphWidth; + lastSpacePosInStringStart = start; + lastSpacePosInStringEnd = end; + lastSpacePos = i; + } + } else if (currentWidth + glyphWidth > width) { + if (lastSpacePosInStringStart !== -1) { + chunks.push(line.substring(startChunk, lastSpacePosInStringEnd)); + startChunk = lastSpacePosInStringEnd; + i = lastSpacePos + 1; + lastSpacePosInStringStart = -1; + currentWidth = 0; + } else { + chunks.push(line.substring(startChunk, start)); + startChunk = start; + currentWidth = glyphWidth; + } + } else { + currentWidth += glyphWidth; + } + } + if (startChunk < line.length) { + chunks.push(line.substring(startChunk, line.length)); + } + return chunks; + } + async extractTextContent(evaluator, task, viewBox) { + await super.extractTextContent(evaluator, task, viewBox); + const text = this.data.textContent; + if (!text) { + return; + } + const allText = text.join("\n"); + if (allText === this.data.fieldValue) { + return; + } + const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+"); + if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) { + this.data.textContent = this.data.fieldValue.split("\n"); + } + } + getFieldObject() { + return { + id: this.data.id, + value: this.data.fieldValue, + defaultValue: this.data.defaultFieldValue || "", + multiline: this.data.multiLine, + password: this.hasFieldFlag(AnnotationFieldFlag.PASSWORD), + charLimit: this.data.maxLen, + comb: this.data.comb, + editable: !this.data.readOnly, + hidden: this.data.hidden, + name: this.data.fieldName, + rect: this.data.rect, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type: "text" + }; + } +} +class ButtonWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.checkedAppearance = null; + this.uncheckedAppearance = null; + this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.isTooltipOnly = false; + if (this.data.checkBox) { + this._processCheckBox(params); + } else if (this.data.radioButton) { + this._processRadioButton(params); + } else if (this.data.pushButton) { + this.data.hasOwnCanvas = true; + this.data.noHTML = false; + this._processPushButton(params); + } else { + warn("Invalid field flags for button widget annotation"); + } + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (this.data.pushButton) { + return super.getOperatorList(evaluator, task, intent, false, annotationStorage); + } + let value = null; + let rotation = null; + if (annotationStorage) { + const storageEntry = annotationStorage.get(this.data.id); + value = storageEntry ? storageEntry.value : null; + rotation = storageEntry ? storageEntry.rotation : null; + } + if (value === null && this.appearance) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + if (value === null || value === undefined) { + value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; + } + const appearance = value ? this.checkedAppearance : this.uncheckedAppearance; + if (appearance) { + const savedAppearance = this.appearance; + const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX); + if (rotation) { + appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); + } + this.appearance = appearance; + const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage); + this.appearance = savedAppearance; + appearance.dict.set("Matrix", savedMatrix); + return operatorList; + } + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + async save(evaluator, task, annotationStorage, changes) { + if (this.data.checkBox) { + this._saveCheckbox(evaluator, task, annotationStorage, changes); + return; + } + if (this.data.radioButton) { + this._saveRadioButton(evaluator, task, annotationStorage, changes); + } + } + async _saveCheckbox(evaluator, task, annotationStorage, changes) { + if (!annotationStorage) { + return; + } + const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let rotation = storageEntry?.rotation, + value = storageEntry?.value; + if (rotation === undefined && flags === undefined) { + if (value === undefined) { + return; + } + const defaultValue = this.data.fieldValue === this.data.exportValue; + if (defaultValue === value) { + return; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return; + } + dict = dict.clone(); + if (rotation === undefined) { + rotation = this.rotation; + } + if (value === undefined) { + value = this.data.fieldValue === this.data.exportValue; + } + const xfa = { + path: this.data.fieldName, + value: value ? this.data.exportValue : "" + }; + const name = Name.get(value ? this.data.exportValue : "Off"); + this.setValue(dict, name, evaluator.xref, changes); + dict.set("AS", name); + dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); + } + async _saveRadioButton(evaluator, task, annotationStorage, changes) { + if (!annotationStorage) { + return; + } + const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let rotation = storageEntry?.rotation, + value = storageEntry?.value; + if (rotation === undefined && flags === undefined) { + if (value === undefined) { + return; + } + const defaultValue = this.data.fieldValue === this.data.buttonValue; + if (defaultValue === value) { + return; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return; + } + dict = dict.clone(); + if (value === undefined) { + value = this.data.fieldValue === this.data.buttonValue; + } + if (rotation === undefined) { + rotation = this.rotation; + } + const xfa = { + path: this.data.fieldName, + value: value ? this.data.buttonValue : "" + }; + const name = Name.get(value ? this.data.buttonValue : "Off"); + if (value) { + this.setValue(dict, name, evaluator.xref, changes); + } + dict.set("AS", name); + dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); + } + _getDefaultCheckedAppearance(params, type) { + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const bbox = [0, 0, width, height]; + const FONT_RATIO = 0.8; + const fontSize = Math.min(width, height) * FONT_RATIO; + let metrics, char; + if (type === "check") { + metrics = { + width: 0.755 * fontSize, + height: 0.705 * fontSize + }; + char = "\x33"; + } else if (type === "disc") { + metrics = { + width: 0.791 * fontSize, + height: 0.705 * fontSize + }; + char = "\x6C"; + } else { + unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`); + } + const xShift = numberToString((width - metrics.width) / 2); + const yShift = numberToString((height - metrics.height) / 2); + const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; + const appearanceStreamDict = new Dict(params.xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", bbox); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(params.xref); + const font = new Dict(params.xref); + font.set("PdfJsZaDb", this.fallbackFontDict); + resources.set("Font", font); + appearanceStreamDict.set("Resources", resources); + this.checkedAppearance = new StringStream(appearance); + this.checkedAppearance.dict = appearanceStreamDict; + this._streams.push(this.checkedAppearance); + } + _processCheckBox(params) { + const customAppearance = params.dict.get("AP"); + if (!(customAppearance instanceof Dict)) { + return; + } + const normalAppearance = customAppearance.get("N"); + if (!(normalAppearance instanceof Dict)) { + return; + } + const asValue = this._decodeFormValue(params.dict.get("AS")); + if (typeof asValue === "string") { + this.data.fieldValue = asValue; + } + const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes"; + const exportValues = normalAppearance.getKeys(); + if (exportValues.length === 0) { + exportValues.push("Off", yes); + } else if (exportValues.length === 1) { + if (exportValues[0] === "Off") { + exportValues.push(yes); + } else { + exportValues.unshift("Off"); + } + } else if (exportValues.includes(yes)) { + exportValues.length = 0; + exportValues.push("Off", yes); + } else { + const otherYes = exportValues.find(v => v !== "Off"); + exportValues.length = 0; + exportValues.push("Off", otherYes); + } + if (!exportValues.includes(this.data.fieldValue)) { + this.data.fieldValue = "Off"; + } + this.data.exportValue = exportValues[1]; + const checkedAppearance = normalAppearance.get(this.data.exportValue); + this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; + const uncheckedAppearance = normalAppearance.get("Off"); + this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "check"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } + this._fallbackFontDict = this.fallbackFontDict; + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } + } + _processRadioButton(params) { + this.data.buttonValue = null; + const fieldParent = params.dict.get("Parent"); + if (fieldParent instanceof Dict) { + this.parent = params.dict.getRaw("Parent"); + const fieldParentValue = fieldParent.get("V"); + if (fieldParentValue instanceof Name) { + this.data.fieldValue = this._decodeFormValue(fieldParentValue); + } + } + const appearanceStates = params.dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return; + } + const normalAppearance = appearanceStates.get("N"); + if (!(normalAppearance instanceof Dict)) { + return; + } + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + this.data.buttonValue = this._decodeFormValue(key); + break; + } + } + const checkedAppearance = normalAppearance.get(this.data.buttonValue); + this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; + const uncheckedAppearance = normalAppearance.get("Off"); + this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "disc"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } + this._fallbackFontDict = this.fallbackFontDict; + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } + } + _processPushButton(params) { + const { + dict, + annotationGlobals + } = params; + if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) { + warn("Push buttons without action dictionaries are not supported"); + return; + } + this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA"); + Catalog.parseDestDictionary({ + destDict: dict, + resultObj: this.data, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments + }); + } + getFieldObject() { + let type = "button"; + let exportValues; + if (this.data.checkBox) { + type = "checkbox"; + exportValues = this.data.exportValue; + } else if (this.data.radioButton) { + type = "radiobutton"; + exportValues = this.data.buttonValue; + } + return { + id: this.data.id, + value: this.data.fieldValue || "Off", + defaultValue: this.data.defaultFieldValue, + exportValues, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + hidden: this.data.hidden, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + get fallbackFontDict() { + const dict = new Dict(); + dict.set("BaseFont", Name.get("ZapfDingbats")); + dict.set("Type", Name.get("FallbackType")); + dict.set("Subtype", Name.get("FallbackType")); + dict.set("Encoding", Name.get("ZapfDingbatsEncoding")); + return shadow(this, "fallbackFontDict", dict); + } +} +class ChoiceWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.indices = dict.getArray("I"); + this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0; + this.data.options = []; + const options = getInheritableProperty({ + dict, + key: "Opt" + }); + if (Array.isArray(options)) { + for (let i = 0, ii = options.length; i < ii; i++) { + const option = xref.fetchIfRef(options[i]); + const isOptionArray = Array.isArray(option); + this.data.options[i] = { + exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option), + displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option) + }; + } + } + if (!this.hasIndices) { + if (typeof this.data.fieldValue === "string") { + this.data.fieldValue = [this.data.fieldValue]; + } else if (!this.data.fieldValue) { + this.data.fieldValue = []; + } + } else { + this.data.fieldValue = []; + const ii = this.data.options.length; + for (const i of this.indices) { + if (Number.isInteger(i) && i >= 0 && i < ii) { + this.data.fieldValue.push(this.data.options[i].exportValue); + } + } + } + if (this.data.options.length === 0 && this.data.fieldValue.length > 0) { + this.data.options = this.data.fieldValue.map(value => ({ + exportValue: value, + displayValue: value + })); + } + this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); + this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); + this._hasText = true; + } + getFieldObject() { + const type = this.data.combo ? "combobox" : "listbox"; + const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; + return { + id: this.data.id, + value, + defaultValue: this.data.defaultFieldValue, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + numItems: this.data.fieldValue.length, + multipleSelection: this.data.multiSelect, + hidden: this.data.hidden, + actions: this.data.actions, + items: this.data.options, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + amendSavedDict(annotationStorage, dict) { + if (!this.hasIndices) { + return; + } + let values = annotationStorage?.get(this.data.id)?.value; + if (!Array.isArray(values)) { + values = [values]; + } + const indices = []; + const { + options + } = this.data; + for (let i = 0, j = 0, ii = options.length; i < ii; i++) { + if (options[i].exportValue === values[j]) { + indices.push(i); + j += 1; + } + } + dict.set("I", indices); + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + if (this.data.combo) { + return super._getAppearance(evaluator, task, intent, annotationStorage); + } + let exportedValue, rotation; + const storageEntry = annotationStorage?.get(this.data.id); + if (storageEntry) { + rotation = storageEntry.rotation; + exportedValue = storageEntry.value; + } + if (rotation === undefined && exportedValue === undefined && !this._needAppearances) { + return null; + } + if (exportedValue === undefined) { + exportedValue = this.data.fieldValue; + } else if (!Array.isArray(exportedValue)) { + exportedValue = [exportedValue]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + const lineCount = this.data.options.length; + const valueIndices = []; + for (let i = 0; i < lineCount; i++) { + const { + exportValue + } = this.data.options[i]; + if (exportedValue.includes(exportValue)) { + valueIndices.push(i); + } + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + let defaultAppearance; + let { + fontSize + } = this.data.defaultAppearanceData; + if (!fontSize) { + const lineHeight = (totalHeight - defaultPadding) / lineCount; + let lineWidth = -1; + let value; + for (const { + displayValue + } of this.data.options) { + const width = this._getTextWidth(displayValue, font); + if (width > lineWidth) { + lineWidth = width; + value = displayValue; + } + } + [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1); + } else { + defaultAppearance = this._defaultAppearance; + } + const lineHeight = fontSize * LINE_FACTOR; + const vPadding = (lineHeight - fontSize) / 2; + const numberOfVisibleLines = Math.floor(totalHeight / lineHeight); + let firstIndex = 0; + if (valueIndices.length > 0) { + const minIndex = Math.min(...valueIndices); + const maxIndex = Math.max(...valueIndices); + firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1); + if (firstIndex > minIndex) { + firstIndex = minIndex; + } + } + const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount); + const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`]; + if (valueIndices.length) { + buf.push("0.600006 0.756866 0.854904 rg"); + for (const index of valueIndices) { + if (firstIndex <= index && index < end) { + buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`); + } + } + } + buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`); + const prevInfo = { + shift: 0 + }; + for (let i = firstIndex; i < end; i++) { + const { + displayValue + } = this.data.options[i]; + const vpadding = i === firstIndex ? vPadding : 0; + buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding)); + } + buf.push("ET Q EMC"); + return buf.join("\n"); + } +} +class SignatureWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.data.fieldValue = null; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = !this.data.hasOwnCanvas; + } + getFieldObject() { + return { + id: this.data.id, + value: null, + page: this.data.pageIndex, + type: "signature" + }; + } +} +class TextAnnotation extends MarkupAnnotation { + constructor(params) { + const DEFAULT_ICON_SIZE = 22; + super(params); + this.data.noRotate = true; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const { + dict + } = params; + this.data.annotationType = AnnotationType.TEXT; + if (this.data.hasAppearance) { + this.data.name = "NoIcon"; + } else { + this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; + this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; + this.data.name = dict.has("Name") ? dict.get("Name").name : "Note"; + } + if (dict.has("State")) { + this.data.state = dict.get("State") || null; + this.data.stateModel = dict.get("StateModel") || null; + } else { + this.data.state = null; + this.data.stateModel = null; + } + } +} +class LinkAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict, + annotationGlobals + } = params; + this.data.annotationType = AnnotationType.LINK; + this.data.noHTML = false; + const quadPoints = getQuadPoints(dict, this.rectangle); + if (quadPoints) { + this.data.quadPoints = quadPoints; + } + this.data.borderColor ||= this.data.color; + Catalog.parseDestDictionary({ + destDict: dict, + resultObj: this.data, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments + }); + } +} +class PopupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + this.data.annotationType = AnnotationType.POPUP; + this.data.noHTML = false; + if (this.data.rect[0] === this.data.rect[2] || this.data.rect[1] === this.data.rect[3]) { + this.data.rect = null; + } + let parentItem = dict.get("Parent"); + if (!parentItem) { + warn("Popup annotation has a missing or invalid parent annotation."); + return; + } + this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null); + const rt = parentItem.get("RT"); + if (isName(rt, AnnotationReplyType.GROUP)) { + parentItem = parentItem.get("IRT"); + } + if (!parentItem.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parentItem.get("M")); + this.data.modificationDate = this.modificationDate; + } + if (!parentItem.has("C")) { + this.data.color = null; + } else { + this.setColor(parentItem.getArray("C")); + this.data.color = this.color; + } + if (!this.viewable) { + const parentFlags = parentItem.get("F"); + if (this._isViewable(parentFlags)) { + this.setFlags(parentFlags); + } + } + this.setTitle(parentItem.get("T")); + this.data.titleObj = this._title; + this.setContents(parentItem.get("Contents")); + this.data.contentsObj = this._contents; + if (parentItem.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC")); + } + this.data.open = !!dict.get("Open"); + } +} +class FreeTextAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + const { + evaluatorOptions, + xref + } = params; + this.data.annotationType = AnnotationType.FREETEXT; + this.setDefaultAppearance(params); + this._hasAppearance = !!this.appearance; + if (this._hasAppearance) { + const { + fontColor, + fontSize + } = parseAppearanceStream(this.appearance, evaluatorOptions, xref); + this.data.defaultAppearanceData.fontColor = fontColor; + this.data.defaultAppearanceData.fontSize = fontSize || 10; + } else { + this.data.defaultAppearanceData.fontSize ||= 10; + const { + fontColor, + fontSize + } = this.data.defaultAppearanceData; + if (this._contents.str) { + this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd()); + const { + coords, + bbox, + matrix + } = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize); + this.data.textPosition = this._transformPoint(coords, bbox, matrix); + } + if (this._isOffscreenCanvasSupported) { + const strokeAlpha = params.dict.get("CA"); + const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif"); + this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha); + this._streams.push(this.appearance); + } else { + warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly."); + } + } + } + get hasTextContent() { + return this._hasAppearance; + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + color, + fontSize, + oldAnnotation, + rect, + rotation, + user, + value + } = annotation; + const freetext = oldAnnotation || new Dict(xref); + freetext.set("Type", Name.get("Annot")); + freetext.set("Subtype", Name.get("FreeText")); + if (oldAnnotation) { + freetext.set("M", `D:${getModificationDate()}`); + freetext.delete("RC"); + } else { + freetext.set("CreationDate", `D:${getModificationDate()}`); + } + freetext.set("Rect", rect); + const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; + freetext.set("DA", da); + freetext.set("Contents", stringToAsciiOrUTF16BE(value)); + freetext.set("F", 4); + freetext.set("Border", [0, 0, 0]); + freetext.set("Rotate", rotation); + if (user) { + freetext.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + freetext.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return freetext; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + baseFontRef, + evaluator, + task + } = params; + const { + color, + fontSize, + rect, + rotation, + value + } = annotation; + const resources = new Dict(xref); + const font = new Dict(xref); + if (baseFontRef) { + font.set("Helv", baseFontRef); + } else { + const baseFont = new Dict(xref); + baseFont.set("BaseFont", Name.get("Helvetica")); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type1")); + baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + font.set("Helv", baseFont); + } + resources.set("Font", font); + const helv = await WidgetAnnotation._getFontData(evaluator, task, { + fontName: "Helv", + fontSize + }, resources); + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const lines = value.split("\n"); + const scale = fontSize / 1000; + let totalWidth = -Infinity; + const encodedLines = []; + for (let line of lines) { + const encoded = helv.encodeString(line); + if (encoded.length > 1) { + return null; + } + line = encoded.join(""); + encodedLines.push(line); + let lineWidth = 0; + const glyphs = helv.charsToGlyphs(line); + for (const glyph of glyphs) { + lineWidth += glyph.width * scale; + } + totalWidth = Math.max(totalWidth, lineWidth); + } + let hscale = 1; + if (totalWidth > w) { + hscale = w / totalWidth; + } + let vscale = 1; + const lineHeight = LINE_FACTOR * fontSize; + const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize; + const totalHeight = lineHeight * lines.length; + if (totalHeight > h) { + vscale = h / totalHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + let firstPoint, clipBox, matrix; + switch (rotation) { + case 0: + matrix = [1, 0, 0, 1]; + clipBox = [rect[0], rect[1], w, h]; + firstPoint = [rect[0], rect[3] - lineAscent]; + break; + case 90: + matrix = [0, 1, -1, 0]; + clipBox = [rect[1], -rect[2], w, h]; + firstPoint = [rect[1], -rect[0] - lineAscent]; + break; + case 180: + matrix = [-1, 0, 0, -1]; + clipBox = [-rect[2], -rect[3], w, h]; + firstPoint = [-rect[2], -rect[1] - lineAscent]; + break; + case 270: + matrix = [0, -1, 1, 0]; + clipBox = [-rect[3], rect[0], w, h]; + firstPoint = [-rect[3], rect[2] - lineAscent]; + break; + } + const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${numberToString(newFontSize)} Tf`]; + buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`); + const vShift = numberToString(lineHeight); + for (let i = 1, ii = encodedLines.length; i < ii; i++) { + const line = encodedLines[i]; + buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Resources", resources); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class LineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.LINE; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]); + this.data.lineCoordinates = Util.normalizeRect(lineCoordinates); + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust]; + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); + return [points[0] - borderWidth, points[2] + borderWidth, points[7] - borderWidth, points[3] + borderWidth]; + } + }); + } + } +} +class SquareAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.SQUARE; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x = points[4] + this.borderStyle.width / 2; + const y = points[5] + this.borderStyle.width / 2; + const width = points[6] - points[4] - this.borderStyle.width; + const height = points[3] - points[7] - this.borderStyle.width; + buffer.push(`${x} ${y} ${width} ${height} re`); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } +} +class CircleAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.CIRCLE; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4)); + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x0 = points[0] + this.borderStyle.width / 2; + const y0 = points[1] - this.borderStyle.width / 2; + const x1 = points[6] - this.borderStyle.width / 2; + const y1 = points[7] + this.borderStyle.width / 2; + const xMid = x0 + (x1 - x0) / 2; + const yMid = y0 + (y1 - y0) / 2; + const xOffset = (x1 - x0) / 2 * controlPointsDistance; + const yOffset = (y1 - y0) / 2 * controlPointsDistance; + buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h"); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } +} +class PolylineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.POLYLINE; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + this.data.vertices = null; + if (!(this instanceof PolygonAnnotation)) { + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + } + const rawVertices = dict.getArray("Vertices"); + if (!isNumberArray(rawVertices, null)) { + return; + } + const vertices = this.data.vertices = Float32Array.from(rawVertices); + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], vertices[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], vertices[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], vertices[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], vertices[i + 1] + borderAdjust); + } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`); + } + buffer.push("S"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } +} +class PolygonAnnotation extends PolylineAnnotation { + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.POLYGON; + } +} +class CaretAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.CARET; + } +} +class InkAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.INK; + this.data.inkLists = []; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const rawInkLists = dict.getArray("InkList"); + if (!Array.isArray(rawInkLists)) { + return; + } + for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { + if (!Array.isArray(rawInkLists[i])) { + continue; + } + const inkList = new Float32Array(rawInkLists[i].length); + this.data.inkLists.push(inkList); + for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { + const x = xref.fetchIfRef(rawInkLists[i][j]), + y = xref.fetchIfRef(rawInkLists[i][j + 1]); + if (typeof x === "number" && typeof y === "number") { + inkList[j] = x; + inkList[j + 1] = y; + } + } + } + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], inkList[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], inkList[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], inkList[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], inkList[i + 1] + borderAdjust); + } + } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`); + } + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + oldAnnotation, + color, + opacity, + paths, + outlines, + rect, + rotation, + thickness, + user + } = annotation; + const ink = oldAnnotation || new Dict(xref); + ink.set("Type", Name.get("Annot")); + ink.set("Subtype", Name.get("Ink")); + ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); + ink.set("Rect", rect); + ink.set("InkList", outlines?.points || paths.points); + ink.set("F", 4); + ink.set("Rotate", rotation); + if (user) { + ink.set("T", stringToAsciiOrUTF16BE(user)); + } + if (outlines) { + ink.set("IT", Name.get("InkHighlight")); + } + const bs = new Dict(xref); + ink.set("BS", bs); + bs.set("W", thickness); + ink.set("C", Array.from(color, c => c / 255)); + ink.set("CA", opacity); + const n = new Dict(xref); + ink.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + return ink; + } + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.outlines) { + return this.createNewAppearanceStreamForHighlight(annotation, xref, params); + } + const { + color, + rect, + paths, + thickness, + opacity + } = annotation; + const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`]; + if (opacity !== 1) { + appearanceBuffer.push("/R0 gs"); + } + for (const outline of paths.lines) { + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); + } else { + const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); + } + } + if (outline.length === 6) { + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`); + } + } + appearanceBuffer.push("S"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + if (opacity !== 1) { + const resources = new Dict(xref); + const extGState = new Dict(xref); + const r0 = new Dict(xref); + r0.set("CA", opacity); + r0.set("Type", Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } + static async createNewAppearanceStreamForHighlight(annotation, xref, params) { + const { + color, + rect, + outlines: { + outline + }, + opacity + } = annotation; + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); + } else { + const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); + } + } + appearanceBuffer.push("h f"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(xref); + const extGState = new Dict(xref); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + const r0 = new Dict(xref); + extGState.set("R0", r0); + r0.set("BM", Name.get("Multiply")); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.set("Type", Name.get("ExtGState")); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class HighlightAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.HIGHLIGHT; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + const resources = this.appearance?.dict.get("Resources"); + if (!this.appearance || !resources?.has("ExtGState")) { + if (this.appearance) { + warn("HighlightAnnotation - ignoring built-in appearance stream."); + } + const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0]; + const fillAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + fillColor, + blendMode: "Multiply", + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + color, + oldAnnotation, + opacity, + rect, + rotation, + user, + quadPoints + } = annotation; + const highlight = oldAnnotation || new Dict(xref); + highlight.set("Type", Name.get("Annot")); + highlight.set("Subtype", Name.get("Highlight")); + highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); + highlight.set("CreationDate", `D:${getModificationDate()}`); + highlight.set("Rect", rect); + highlight.set("F", 4); + highlight.set("Border", [0, 0, 0]); + highlight.set("Rotate", rotation); + highlight.set("QuadPoints", quadPoints); + highlight.set("C", Array.from(color, c => c / 255)); + highlight.set("CA", opacity); + if (user) { + highlight.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + highlight.set("AP", n); + n.set("N", apRef || ap); + } + return highlight; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + color, + rect, + outlines, + opacity + } = annotation; + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + const buffer = []; + for (const outline of outlines) { + buffer.length = 0; + buffer.push(`${numberToString(outline[0])} ${numberToString(outline[1])} m`); + for (let i = 2, ii = outline.length; i < ii; i += 2) { + buffer.push(`${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`); + } + buffer.push("h"); + appearanceBuffer.push(buffer.join("\n")); + } + appearanceBuffer.push("f*"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(xref); + const extGState = new Dict(xref); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + const r0 = new Dict(xref); + extGState.set("R0", r0); + r0.set("BM", Name.get("Multiply")); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.set("Type", Name.get("ExtGState")); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class UnderlineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.UNDERLINE; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 0.571 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } +} +class SquigglyAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.SQUIGGLY; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + const dy = (points[1] - points[5]) / 6; + let shift = dy; + let x = points[4]; + const y = points[5]; + const xEnd = points[6]; + buffer.push(`${x} ${y + shift} m`); + do { + x += 2; + shift = shift === 0 ? dy : 0; + buffer.push(`${x} ${y + shift} l`); + } while (x < xEnd); + buffer.push("S"); + return [points[4], xEnd, y - 2 * dy, y + 2 * dy]; + } + }); + } + } else { + this.data.popupRef = null; + } + } +} +class StrikeOutAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.STRIKEOUT; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } +} +class StampAnnotation extends MarkupAnnotation { + #savedHasOwnCanvas; + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.STAMP; + this.#savedHasOwnCanvas = this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + if (isEditing) { + if (!this.data.isEditable) { + return false; + } + this.#savedHasOwnCanvas = this.data.hasOwnCanvas; + this.data.hasOwnCanvas = true; + return true; + } + this.data.hasOwnCanvas = this.#savedHasOwnCanvas; + return !modifiedIds?.has(this.data.id); + } + static async createImage(bitmap, xref) { + const { + width, + height + } = bitmap; + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: true + }); + ctx.drawImage(bitmap, 0, 0); + const data = ctx.getImageData(0, 0, width, height).data; + const buf32 = new Uint32Array(data.buffer); + const hasAlpha = buf32.some(FeatureTest.isLittleEndian ? x => x >>> 24 !== 0xff : x => (x & 0xff) !== 0xff); + if (hasAlpha) { + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, width, height); + ctx.drawImage(bitmap, 0, 0); + } + const jpegBufferPromise = canvas.convertToBlob({ + type: "image/jpeg", + quality: 1 + }).then(blob => blob.arrayBuffer()); + const xobjectName = Name.get("XObject"); + const imageName = Name.get("Image"); + const image = new Dict(xref); + image.set("Type", xobjectName); + image.set("Subtype", imageName); + image.set("BitsPerComponent", 8); + image.set("ColorSpace", Name.get("DeviceRGB")); + image.set("Filter", Name.get("DCTDecode")); + image.set("BBox", [0, 0, width, height]); + image.set("Width", width); + image.set("Height", height); + let smaskStream = null; + if (hasAlpha) { + const alphaBuffer = new Uint8Array(buf32.length); + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] >>> 24; + } + } else { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] & 0xff; + } + } + const smask = new Dict(xref); + smask.set("Type", xobjectName); + smask.set("Subtype", imageName); + smask.set("BitsPerComponent", 8); + smask.set("ColorSpace", Name.get("DeviceGray")); + smask.set("Width", width); + smask.set("Height", height); + smaskStream = new Stream(alphaBuffer, 0, 0, smask); + } + const imageStream = new Stream(await jpegBufferPromise, 0, 0, image); + return { + imageStream, + smaskStream, + width, + height + }; + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + oldAnnotation, + rect, + rotation, + user + } = annotation; + const stamp = oldAnnotation || new Dict(xref); + stamp.set("Type", Name.get("Annot")); + stamp.set("Subtype", Name.get("Stamp")); + stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); + stamp.set("Rect", rect); + stamp.set("F", 4); + stamp.set("Border", [0, 0, 0]); + stamp.set("Rotate", rotation); + if (user) { + stamp.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + stamp.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return stamp; + } + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.oldAnnotation) { + return null; + } + const { + rotation + } = annotation; + const { + imageRef, + width, + height + } = params.image; + const resources = new Dict(xref); + const xobject = new Dict(xref); + resources.set("XObject", xobject); + xobject.set("Im0", imageRef); + const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`; + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, width, height]); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, width, height); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class FileAttachmentAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const file = new FileSpec(dict.get("FS"), xref); + this.data.annotationType = AnnotationType.FILEATTACHMENT; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + this.data.file = file.serializable; + const name = dict.get("Name"); + this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin"; + const fillAlpha = dict.get("ca"); + this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null; + } +} + +;// ./src/core/decrypt_stream.js + +const chunkSize = 512; +class DecryptStream extends DecodeStream { + constructor(str, maybeLength, decrypt) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.decrypt = decrypt; + this.nextChunk = null; + this.initialized = false; + } + readBlock() { + let chunk; + if (this.initialized) { + chunk = this.nextChunk; + } else { + chunk = this.str.getBytes(chunkSize); + this.initialized = true; + } + if (!chunk?.length) { + this.eof = true; + return; + } + this.nextChunk = this.str.getBytes(chunkSize); + const hasMoreData = this.nextChunk?.length > 0; + const decrypt = this.decrypt; + chunk = decrypt(chunk, !hasMoreData); + const bufferLength = this.bufferLength, + newLength = bufferLength + chunk.length, + buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } +} + +;// ./src/core/crypto.js + + + +class ARCFourCipher { + constructor(key) { + this.a = 0; + this.b = 0; + const s = new Uint8Array(256); + const keyLength = key.length; + for (let i = 0; i < 256; ++i) { + s[i] = i; + } + for (let i = 0, j = 0; i < 256; ++i) { + const tmp = s[i]; + j = j + tmp + key[i % keyLength] & 0xff; + s[i] = s[j]; + s[j] = tmp; + } + this.s = s; + } + encryptBlock(data) { + let a = this.a, + b = this.b; + const s = this.s; + const n = data.length; + const output = new Uint8Array(n); + for (let i = 0; i < n; ++i) { + a = a + 1 & 0xff; + const tmp = s[a]; + b = b + tmp & 0xff; + const tmp2 = s[b]; + s[a] = tmp2; + s[b] = tmp; + output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; + } + this.a = a; + this.b = b; + return output; + } + decryptBlock(data) { + return this.encryptBlock(data); + } + encrypt(data) { + return this.encryptBlock(data); + } +} +const calculateMD5 = function calculateMD5Closure() { + const r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); + const k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]); + function hash(data, offset, length) { + let h0 = 1732584193, + h1 = -271733879, + h2 = -1732584194, + h3 = 271733878; + const paddedLength = length + 72 & ~63; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = length << 3 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + const w = new Int32Array(16); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + let a = h0, + b = h1, + c = h2, + d = h3, + f, + g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + const tmp = d, + rotateArg = a + f + k[j] + w[g] | 0, + rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); + } + return hash; +}(); +class Word64 { + constructor(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; + } + and(word) { + this.high &= word.high; + this.low &= word.low; + } + xor(word) { + this.high ^= word.high; + this.low ^= word.low; + } + or(word) { + this.high |= word.high; + this.low |= word.low; + } + shiftRight(places) { + if (places >= 32) { + this.low = this.high >>> places - 32 | 0; + this.high = 0; + } else { + this.low = this.low >>> places | this.high << 32 - places; + this.high = this.high >>> places | 0; + } + } + shiftLeft(places) { + if (places >= 32) { + this.high = this.low << places - 32; + this.low = 0; + } else { + this.high = this.high << places | this.low >>> 32 - places; + this.low <<= places; + } + } + rotateRight(places) { + let low, high; + if (places & 32) { + high = this.low; + low = this.high; + } else { + low = this.low; + high = this.high; + } + places &= 31; + this.low = low >>> places | high << 32 - places; + this.high = high >>> places | low << 32 - places; + } + not() { + this.high = ~this.high; + this.low = ~this.low; + } + add(word) { + const lowAdd = (this.low >>> 0) + (word.low >>> 0); + let highAdd = (this.high >>> 0) + (word.high >>> 0); + if (lowAdd > 0xffffffff) { + highAdd += 1; + } + this.low = lowAdd | 0; + this.high = highAdd | 0; + } + copyTo(bytes, offset) { + bytes[offset] = this.high >>> 24 & 0xff; + bytes[offset + 1] = this.high >> 16 & 0xff; + bytes[offset + 2] = this.high >> 8 & 0xff; + bytes[offset + 3] = this.high & 0xff; + bytes[offset + 4] = this.low >>> 24 & 0xff; + bytes[offset + 5] = this.low >> 16 & 0xff; + bytes[offset + 6] = this.low >> 8 & 0xff; + bytes[offset + 7] = this.low & 0xff; + } + assign(word) { + this.high = word.high; + this.low = word.low; + } +} +const calculateSHA256 = function calculateSHA256Closure() { + function rotr(x, n) { + return x >>> n | x << 32 - n; + } + function ch(x, y, z) { + return x & y ^ ~x & z; + } + function maj(x, y, z) { + return x & y ^ x & z ^ y & z; + } + function sigma(x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); + } + function sigmaPrime(x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); + } + function littleSigma(x) { + return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; + } + function littleSigmaPrime(x) { + return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; + } + const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; + function hash(data, offset, length) { + let h0 = 0x6a09e667, + h1 = 0xbb67ae85, + h2 = 0x3c6ef372, + h3 = 0xa54ff53a, + h4 = 0x510e527f, + h5 = 0x9b05688c, + h6 = 0x1f83d9ab, + h7 = 0x5be0cd19; + const paddedLength = Math.ceil((length + 9) / 64) * 64; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Uint32Array(64); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + i += 4; + } + for (j = 16; j < 64; ++j) { + w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; + } + let a = h0, + b = h1, + c = h2, + d = h3, + e = h4, + f = h5, + g = h6, + h = h7, + t1, + t2; + for (j = 0; j < 64; ++j) { + t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; + t2 = sigma(a) + maj(a, b, c); + h = g; + g = f; + f = e; + e = d + t1 | 0; + d = c; + c = b; + b = a; + a = t1 + t2 | 0; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + h4 = h4 + e | 0; + h5 = h5 + f | 0; + h6 = h6 + g | 0; + h7 = h7 + h | 0; + } + return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]); + } + return hash; +}(); +const calculateSHA512 = function calculateSHA512Closure() { + function ch(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.not(); + tmp.and(z); + result.xor(tmp); + } + function maj(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.and(z); + result.xor(tmp); + tmp.assign(y); + tmp.and(z); + result.xor(tmp); + } + function sigma(result, x, tmp) { + result.assign(x); + result.rotateRight(28); + tmp.assign(x); + tmp.rotateRight(34); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(39); + result.xor(tmp); + } + function sigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(14); + tmp.assign(x); + tmp.rotateRight(18); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(41); + result.xor(tmp); + } + function littleSigma(result, x, tmp) { + result.assign(x); + result.rotateRight(1); + tmp.assign(x); + tmp.rotateRight(8); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(7); + result.xor(tmp); + } + function littleSigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(19); + tmp.assign(x); + tmp.rotateRight(61); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(6); + result.xor(tmp); + } + const k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; + function hash(data, offset, length, mode384 = false) { + let h0, h1, h2, h3, h4, h5, h6, h7; + if (!mode384) { + h0 = new Word64(0x6a09e667, 0xf3bcc908); + h1 = new Word64(0xbb67ae85, 0x84caa73b); + h2 = new Word64(0x3c6ef372, 0xfe94f82b); + h3 = new Word64(0xa54ff53a, 0x5f1d36f1); + h4 = new Word64(0x510e527f, 0xade682d1); + h5 = new Word64(0x9b05688c, 0x2b3e6c1f); + h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); + h7 = new Word64(0x5be0cd19, 0x137e2179); + } else { + h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); + h1 = new Word64(0x629a292a, 0x367cd507); + h2 = new Word64(0x9159015a, 0x3070dd17); + h3 = new Word64(0x152fecd8, 0xf70e5939); + h4 = new Word64(0x67332667, 0xffc00b31); + h5 = new Word64(0x8eb44a87, 0x68581511); + h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); + h7 = new Word64(0x47b5481d, 0xbefa4fa4); + } + const paddedLength = Math.ceil((length + 17) / 128) * 128; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 16; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Array(80); + for (i = 0; i < 80; i++) { + w[i] = new Word64(0, 0); + } + let a = new Word64(0, 0), + b = new Word64(0, 0), + c = new Word64(0, 0); + let d = new Word64(0, 0), + e = new Word64(0, 0), + f = new Word64(0, 0); + let g = new Word64(0, 0), + h = new Word64(0, 0); + const t1 = new Word64(0, 0), + t2 = new Word64(0, 0); + const tmp1 = new Word64(0, 0), + tmp2 = new Word64(0, 0); + let tmp3; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; + i += 8; + } + for (j = 16; j < 80; ++j) { + tmp3 = w[j]; + littleSigmaPrime(tmp3, w[j - 2], tmp2); + tmp3.add(w[j - 7]); + littleSigma(tmp1, w[j - 15], tmp2); + tmp3.add(tmp1); + tmp3.add(w[j - 16]); + } + a.assign(h0); + b.assign(h1); + c.assign(h2); + d.assign(h3); + e.assign(h4); + f.assign(h5); + g.assign(h6); + h.assign(h7); + for (j = 0; j < 80; ++j) { + t1.assign(h); + sigmaPrime(tmp1, e, tmp2); + t1.add(tmp1); + ch(tmp1, e, f, g, tmp2); + t1.add(tmp1); + t1.add(k[j]); + t1.add(w[j]); + sigma(t2, a, tmp2); + maj(tmp1, a, b, c, tmp2); + t2.add(tmp1); + tmp3 = h; + h = g; + g = f; + f = e; + d.add(t1); + e = d; + d = c; + c = b; + b = a; + tmp3.assign(t1); + tmp3.add(t2); + a = tmp3; + } + h0.add(a); + h1.add(b); + h2.add(c); + h3.add(d); + h4.add(e); + h5.add(f); + h6.add(g); + h7.add(h); + } + let result; + if (!mode384) { + result = new Uint8Array(64); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + h6.copyTo(result, 48); + h7.copyTo(result, 56); + } else { + result = new Uint8Array(48); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + } + return result; + } + return hash; +}(); +function calculateSHA384(data, offset, length) { + return calculateSHA512(data, offset, length, true); +} +class NullCipher { + decryptBlock(data) { + return data; + } + encrypt(data) { + return data; + } +} +class AESBaseCipher { + constructor() { + this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); + this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); + this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); + this._mixCol = new Uint8Array(256); + for (let i = 0; i < 256; i++) { + this._mixCol[i] = i < 128 ? i << 1 : i << 1 ^ 0x1b; + } + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + _expandKey(cipherKey) { + unreachable("Cannot call `_expandKey` on the base class"); + } + _decrypt(input, key) { + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let j = 0; j < 16; j += 4) { + const s0 = this._mix[state[j]]; + const s1 = this._mix[state[j + 1]]; + const s2 = this._mix[state[j + 2]]; + const s3 = this._mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xff; + state[j + 1] = t >> 16 & 0xff; + state[j + 2] = t >> 8 & 0xff; + state[j + 3] = t & 0xff; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + _encrypt(input, key) { + const s = this._s; + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (let i = 1; i < this._cyclesOfRepetition; i++) { + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0; j < 16; j += 4) { + const s0 = state[j + 0]; + const s1 = state[j + 1]; + const s2 = state[j + 2]; + const s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j + 0] ^= t ^ this._mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + _decryptBlock2(data, finalize) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + let iv = this.iv; + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + const plain = this._decrypt(buffer, this._key); + for (let j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + let outputLength = 16 * result.length; + if (finalize) { + const lastBlock = result.at(-1); + let psLen = lastBlock[15]; + if (psLen <= 16) { + for (let i = 15, ii = 16 - psLen; i >= ii; --i) { + if (lastBlock[i] !== psLen) { + psLen = 0; + break; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + decryptBlock(data, finalize, iv = null) { + const sourceLength = data.length; + const buffer = this.buffer; + let bufferLength = this.bufferPosition; + if (iv) { + this.iv = iv; + } else { + for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array(0); + } + this.iv = buffer; + data = data.subarray(16); + } + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = this._decryptBlock2; + return this.decryptBlock(data, finalize); + } + encrypt(data, iv) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + if (!iv) { + iv = new Uint8Array(16); + } + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (let j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + const cipher = this._encrypt(buffer, this._key); + iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + const outputLength = 16 * result.length; + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } +} +class AES128Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 10; + this._keySize = 160; + this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 176; + const s = this._s; + const rcon = this._rcon; + const result = new Uint8Array(b); + result.set(cipherKey); + for (let j = 16, i = 1; j < b; ++i) { + let t1 = result[j - 3]; + let t2 = result[j - 2]; + let t3 = result[j - 1]; + let t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= rcon[i]; + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 16]; + j++; + result[j] = t2 ^= result[j - 16]; + j++; + result[j] = t3 ^= result[j - 16]; + j++; + result[j] = t4 ^= result[j - 16]; + j++; + } + } + return result; + } +} +class AES256Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 14; + this._keySize = 224; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 240; + const s = this._s; + const result = new Uint8Array(b); + result.set(cipherKey); + let r = 1; + let t1, t2, t3, t4; + for (let j = 32, i = 1; j < b; ++i) { + if (j % 32 === 16) { + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + } else if (j % 32 === 0) { + t1 = result[j - 3]; + t2 = result[j - 2]; + t3 = result[j - 1]; + t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= r; + if ((r <<= 1) >= 256) { + r = (r ^ 0x1b) & 0xff; + } + } + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 32]; + j++; + result[j] = t2 ^= result[j - 32]; + j++; + result[j] = t3 ^= result[j - 32]; + j++; + result[j] = t4 ^= result[j - 32]; + j++; + } + } + return result; + } +} +class PDF17 { + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = calculateSHA256(hashData, 0, hashData.length); + return isArrayEqual(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = calculateSHA256(hashData, 0, hashData.length); + return isArrayEqual(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = calculateSHA256(hashData, 0, hashData.length); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = calculateSHA256(hashData, 0, hashData.length); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } +} +class PDF20 { + _hash(password, input, userBytes) { + let k = calculateSHA256(input, 0, input.length).subarray(0, 32); + let e = [0]; + let i = 0; + while (i < 64 || e.at(-1) > i - 32) { + const combinedLength = password.length + k.length + userBytes.length, + combinedArray = new Uint8Array(combinedLength); + let writeOffset = 0; + combinedArray.set(password, writeOffset); + writeOffset += password.length; + combinedArray.set(k, writeOffset); + writeOffset += k.length; + combinedArray.set(userBytes, writeOffset); + const k1 = new Uint8Array(combinedLength * 64); + for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { + k1.set(combinedArray, pos); + } + const cipher = new AES128Cipher(k.subarray(0, 16)); + e = cipher.encrypt(k1, k.subarray(16, 32)); + const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 3; + if (remainder === 0) { + k = calculateSHA256(e, 0, e.length); + } else if (remainder === 1) { + k = calculateSHA384(e, 0, e.length); + } else if (remainder === 2) { + k = calculateSHA512(e, 0, e.length); + } + i++; + } + return k.subarray(0, 32); + } + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = this._hash(password, hashData, userBytes); + return isArrayEqual(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = this._hash(password, hashData, []); + return isArrayEqual(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = this._hash(password, hashData, userBytes); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = this._hash(password, hashData, []); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } +} +class CipherTransform { + constructor(stringCipherConstructor, streamCipherConstructor) { + this.StringCipherConstructor = stringCipherConstructor; + this.StreamCipherConstructor = streamCipherConstructor; + } + createStream(stream, length) { + const cipher = new this.StreamCipherConstructor(); + return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }); + } + decryptString(s) { + const cipher = new this.StringCipherConstructor(); + let data = stringToBytes(s); + data = cipher.decryptBlock(data, true); + return bytesToString(data); + } + encryptString(s) { + const cipher = new this.StringCipherConstructor(); + if (cipher instanceof AESBaseCipher) { + const strLen = s.length; + const pad = 16 - strLen % 16; + s += String.fromCharCode(pad).repeat(pad); + const iv = new Uint8Array(16); + if (typeof crypto !== "undefined") { + crypto.getRandomValues(iv); + } else { + for (let i = 0; i < 16; i++) { + iv[i] = Math.floor(256 * Math.random()); + } + } + let data = stringToBytes(s); + data = cipher.encrypt(data, iv); + const buf = new Uint8Array(16 + data.length); + buf.set(iv); + buf.set(data, 16); + return bytesToString(buf); + } + let data = stringToBytes(s); + data = cipher.encrypt(data); + return bytesToString(data); + } +} +class CipherTransformFactory { + static #defaultPasswordBytes = new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]); + #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { + if (password) { + const passwordLength = Math.min(127, password.length); + password = password.subarray(0, passwordLength); + } else { + password = []; + } + const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17(); + if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { + return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); + } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { + return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); + } + return null; + } + #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { + const hashDataSize = 40 + ownerPassword.length + fileId.length; + const hashData = new Uint8Array(hashDataSize); + let i = 0, + j, + n; + if (password) { + n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + } + j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; + } + for (j = 0, n = ownerPassword.length; j < n; ++j) { + hashData[i++] = ownerPassword[j]; + } + hashData[i++] = flags & 0xff; + hashData[i++] = flags >> 8 & 0xff; + hashData[i++] = flags >> 16 & 0xff; + hashData[i++] = flags >>> 24 & 0xff; + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + if (revision >= 4 && !encryptMetadata) { + hashData[i++] = 0xff; + hashData[i++] = 0xff; + hashData[i++] = 0xff; + hashData[i++] = 0xff; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, keyLengthInBytes); + } + } + const encryptionKey = hash.subarray(0, keyLengthInBytes); + let cipher, checkData; + if (revision >= 3) { + for (i = 0; i < 32; ++i) { + hashData[i] = CipherTransformFactory.#defaultPasswordBytes[i]; + } + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); + n = encryptionKey.length; + const derivedKey = new Uint8Array(n); + for (j = 1; j <= 19; ++j) { + for (let k = 0; k < n; ++k) { + derivedKey[k] = encryptionKey[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + checkData = cipher.encryptBlock(checkData); + } + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } else { + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(CipherTransformFactory.#defaultPasswordBytes); + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } + return encryptionKey; + } + #decodeUserPassword(password, ownerPassword, revision, keyLength) { + const hashData = new Uint8Array(32); + let i = 0; + const n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + let j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, hash.length); + } + } + let cipher, userPassword; + if (revision >= 3) { + userPassword = ownerPassword; + const derivedKey = new Uint8Array(keyLengthInBytes); + for (j = 19; j >= 0; j--) { + for (let k = 0; k < keyLengthInBytes; ++k) { + derivedKey[k] = hash[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + userPassword = cipher.encryptBlock(userPassword); + } + } else { + cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); + userPassword = cipher.encryptBlock(ownerPassword); + } + return userPassword; + } + #buildObjectKey(num, gen, encryptionKey, isAes = false) { + const key = new Uint8Array(encryptionKey.length + 9); + const n = encryptionKey.length; + let i; + for (i = 0; i < n; ++i) { + key[i] = encryptionKey[i]; + } + key[i++] = num & 0xff; + key[i++] = num >> 8 & 0xff; + key[i++] = num >> 16 & 0xff; + key[i++] = gen & 0xff; + key[i++] = gen >> 8 & 0xff; + if (isAes) { + key[i++] = 0x73; + key[i++] = 0x41; + key[i++] = 0x6c; + key[i++] = 0x54; + } + const hash = calculateMD5(key, 0, i); + return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); + } + #buildCipherConstructor(cf, name, num, gen, key) { + if (!(name instanceof Name)) { + throw new FormatError("Invalid crypt filter name."); + } + const self = this; + const cryptFilter = cf.get(name.name); + const cfm = cryptFilter?.get("CFM"); + if (!cfm || cfm.name === "None") { + return function () { + return new NullCipher(); + }; + } + if (cfm.name === "V2") { + return function () { + return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false)); + }; + } + if (cfm.name === "AESV2") { + return function () { + return new AES128Cipher(self.#buildObjectKey(num, gen, key, true)); + }; + } + if (cfm.name === "AESV3") { + return function () { + return new AES256Cipher(key); + }; + } + throw new FormatError("Unknown crypto method"); + } + constructor(dict, fileId, password) { + const filter = dict.get("Filter"); + if (!isName(filter, "Standard")) { + throw new FormatError("unknown encryption method"); + } + this.filterName = filter.name; + this.dict = dict; + const algorithm = dict.get("V"); + if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { + throw new FormatError("unsupported encryption algorithm"); + } + this.algorithm = algorithm; + let keyLength = dict.get("Length"); + if (!keyLength) { + if (algorithm <= 3) { + keyLength = 40; + } else { + const cfDict = dict.get("CF"); + const streamCryptoName = dict.get("StmF"); + if (cfDict instanceof Dict && streamCryptoName instanceof Name) { + cfDict.suppressEncryption = true; + const handlerDict = cfDict.get(streamCryptoName.name); + keyLength = handlerDict?.get("Length") || 128; + if (keyLength < 40) { + keyLength <<= 3; + } + } + } + } + if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { + throw new FormatError("invalid key length"); + } + const ownerBytes = stringToBytes(dict.get("O")), + userBytes = stringToBytes(dict.get("U")); + const ownerPassword = ownerBytes.subarray(0, 32); + const userPassword = userBytes.subarray(0, 32); + const flags = dict.get("P"); + const revision = dict.get("R"); + const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; + this.encryptMetadata = encryptMetadata; + const fileIdBytes = stringToBytes(fileId); + let passwordBytes; + if (password) { + if (revision === 6) { + try { + password = utf8StringToString(password); + } catch { + warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); + } + } + passwordBytes = stringToBytes(password); + } + let encryptionKey; + if (algorithm !== 5) { + encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } else { + const ownerValidationSalt = ownerBytes.subarray(32, 40); + const ownerKeySalt = ownerBytes.subarray(40, 48); + const uBytes = userBytes.subarray(0, 48); + const userValidationSalt = userBytes.subarray(32, 40); + const userKeySalt = userBytes.subarray(40, 48); + const ownerEncryption = stringToBytes(dict.get("OE")); + const userEncryption = stringToBytes(dict.get("UE")); + const perms = stringToBytes(dict.get("Perms")); + encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + } + if (!encryptionKey && !password) { + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } else if (!encryptionKey && password) { + const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); + encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } + if (!encryptionKey) { + throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); + } + this.encryptionKey = encryptionKey; + if (algorithm >= 4) { + const cf = dict.get("CF"); + if (cf instanceof Dict) { + cf.suppressEncryption = true; + } + this.cf = cf; + this.stmf = dict.get("StmF") || Name.get("Identity"); + this.strf = dict.get("StrF") || Name.get("Identity"); + this.eff = dict.get("EFF") || this.stmf; + } + } + createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { + return new CipherTransform(this.#buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), this.#buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey)); + } + const key = this.#buildObjectKey(num, gen, this.encryptionKey, false); + const cipherConstructor = function () { + return new ARCFourCipher(key); + }; + return new CipherTransform(cipherConstructor, cipherConstructor); + } +} + +;// ./src/core/dataset_reader.js + + + +function decodeString(str) { + try { + return stringToUTF8String(str); + } catch (ex) { + warn(`UTF-8 decoding failed: "${ex}".`); + return str; + } +} +class DatasetXMLParser extends SimpleXMLParser { + constructor(options) { + super(options); + this.node = null; + } + onEndElement(name) { + const node = super.onEndElement(name); + if (node && name === "xfa:datasets") { + this.node = node; + throw new Error("Aborting DatasetXMLParser."); + } + } +} +class DatasetReader { + constructor(data) { + if (data.datasets) { + this.node = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(data.datasets).documentElement; + } else { + const parser = new DatasetXMLParser({ + hasAttributes: true + }); + try { + parser.parseFromString(data["xdp:xdp"]); + } catch {} + this.node = parser.node; + } + } + getValue(path) { + if (!this.node || !path) { + return ""; + } + const node = this.node.searchNode(parseXFAPath(path), 0); + if (!node) { + return ""; + } + const first = node.firstChild; + if (first?.nodeName === "value") { + return node.children.map(child => decodeString(child.textContent)); + } + return decodeString(node.textContent); + } +} + +;// ./src/core/xref.js + + + + + + +class XRef { + #firstXRefStmPos = null; + constructor(stream, pdfManager) { + this.stream = stream; + this.pdfManager = pdfManager; + this.entries = []; + this._xrefStms = new Set(); + this._cacheMap = new Map(); + this._pendingRefs = new RefSet(); + this._newPersistentRefNum = null; + this._newTemporaryRefNum = null; + this._persistentRefsCache = null; + } + getNewPersistentRef(obj) { + if (this._newPersistentRefNum === null) { + this._newPersistentRefNum = this.entries.length || 1; + } + const num = this._newPersistentRefNum++; + this._cacheMap.set(num, obj); + return Ref.get(num, 0); + } + getNewTemporaryRef() { + if (this._newTemporaryRefNum === null) { + this._newTemporaryRefNum = this.entries.length || 1; + if (this._newPersistentRefNum) { + this._persistentRefsCache = new Map(); + for (let i = this._newTemporaryRefNum; i < this._newPersistentRefNum; i++) { + this._persistentRefsCache.set(i, this._cacheMap.get(i)); + this._cacheMap.delete(i); + } + } + } + return Ref.get(this._newTemporaryRefNum++, 0); + } + resetNewTemporaryRef() { + this._newTemporaryRefNum = null; + if (this._persistentRefsCache) { + for (const [num, obj] of this._persistentRefsCache) { + this._cacheMap.set(num, obj); + } + } + this._persistentRefsCache = null; + } + setStartXRef(startXRef) { + this.startXRefQueue = [startXRef]; + } + parse(recoveryMode = false) { + let trailerDict; + if (!recoveryMode) { + trailerDict = this.readXRef(); + } else { + warn("Indexing all PDF objects"); + trailerDict = this.indexObjects(); + } + trailerDict.assignXref(this); + this.trailer = trailerDict; + let encrypt; + try { + encrypt = trailerDict.get("Encrypt"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); + } + if (encrypt instanceof Dict) { + const ids = trailerDict.get("ID"); + const fileId = ids?.length ? ids[0] : ""; + encrypt.suppressEncryption = true; + this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password); + } + let root; + try { + root = trailerDict.get("Root"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Root" reference: "${ex}".`); + } + if (root instanceof Dict) { + try { + const pages = root.get("Pages"); + if (pages instanceof Dict) { + this.root = root; + return; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`); + } + } + if (!recoveryMode) { + throw new XRefParseException(); + } + throw new InvalidPDFException("Invalid Root reference."); + } + processXRefTable(parser) { + if (!("tableState" in this)) { + this.tableState = { + entryNum: 0, + streamPos: parser.lexer.stream.pos, + parserBuf1: parser.buf1, + parserBuf2: parser.buf2 + }; + } + const obj = this.readXRefTable(parser); + if (!isCmd(obj, "trailer")) { + throw new FormatError("Invalid XRef table: could not find trailer dictionary"); + } + let dict = parser.getObj(); + if (!(dict instanceof Dict) && dict.dict) { + dict = dict.dict; + } + if (!(dict instanceof Dict)) { + throw new FormatError("Invalid XRef table: could not parse trailer dictionary"); + } + delete this.tableState; + return dict; + } + readXRefTable(parser) { + const stream = parser.lexer.stream; + const tableState = this.tableState; + stream.pos = tableState.streamPos; + parser.buf1 = tableState.parserBuf1; + parser.buf2 = tableState.parserBuf2; + let obj; + while (true) { + if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) { + if (isCmd(obj = parser.getObj(), "trailer")) { + break; + } + tableState.firstEntryNum = obj; + tableState.entryCount = parser.getObj(); + } + let first = tableState.firstEntryNum; + const count = tableState.entryCount; + if (!Number.isInteger(first) || !Number.isInteger(count)) { + throw new FormatError("Invalid XRef table: wrong types in subsection header"); + } + for (let i = tableState.entryNum; i < count; i++) { + tableState.streamPos = stream.pos; + tableState.entryNum = i; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + const entry = {}; + entry.offset = parser.getObj(); + entry.gen = parser.getObj(); + const type = parser.getObj(); + if (type instanceof Cmd) { + switch (type.cmd) { + case "f": + entry.free = true; + break; + case "n": + entry.uncompressed = true; + break; + } + } + if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { + throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`); + } + if (i === 0 && entry.free && first === 1) { + first = 0; + } + if (!this.entries[i + first]) { + this.entries[i + first] = entry; + } + } + tableState.entryNum = 0; + tableState.streamPos = stream.pos; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + delete tableState.firstEntryNum; + delete tableState.entryCount; + } + if (this.entries[0] && !this.entries[0].free) { + throw new FormatError("Invalid XRef table: unexpected first object"); + } + return obj; + } + processXRefStream(stream) { + if (!("streamState" in this)) { + const { + dict, + pos + } = stream; + const byteWidths = dict.get("W"); + const range = dict.get("Index") || [0, dict.get("Size")]; + this.streamState = { + entryRanges: range, + byteWidths, + entryNum: 0, + streamPos: pos + }; + } + this.readXRefStream(stream); + delete this.streamState; + return stream.dict; + } + readXRefStream(stream) { + const streamState = this.streamState; + stream.pos = streamState.streamPos; + const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths; + const entryRanges = streamState.entryRanges; + while (entryRanges.length > 0) { + const [first, n] = entryRanges; + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`); + } + if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) { + throw new FormatError(`Invalid XRef entry fields length: ${first}, ${n}`); + } + for (let i = streamState.entryNum; i < n; ++i) { + streamState.entryNum = i; + streamState.streamPos = stream.pos; + let type = 0, + offset = 0, + generation = 0; + for (let j = 0; j < typeFieldWidth; ++j) { + const typeByte = stream.getByte(); + if (typeByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'type'."); + } + type = type << 8 | typeByte; + } + if (typeFieldWidth === 0) { + type = 1; + } + for (let j = 0; j < offsetFieldWidth; ++j) { + const offsetByte = stream.getByte(); + if (offsetByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'offset'."); + } + offset = offset << 8 | offsetByte; + } + for (let j = 0; j < generationFieldWidth; ++j) { + const generationByte = stream.getByte(); + if (generationByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'generation'."); + } + generation = generation << 8 | generationByte; + } + const entry = {}; + entry.offset = offset; + entry.gen = generation; + switch (type) { + case 0: + entry.free = true; + break; + case 1: + entry.uncompressed = true; + break; + case 2: + break; + default: + throw new FormatError(`Invalid XRef entry type: ${type}`); + } + if (!this.entries[first + i]) { + this.entries[first + i] = entry; + } + } + streamState.entryNum = 0; + streamState.streamPos = stream.pos; + entryRanges.splice(0, 2); + } + } + indexObjects() { + const TAB = 0x9, + LF = 0xa, + CR = 0xd, + SPACE = 0x20; + const PERCENT = 0x25, + LT = 0x3c; + function readToken(data, offset) { + let token = "", + ch = data[offset]; + while (ch !== LF && ch !== CR && ch !== LT) { + if (++offset >= data.length) { + break; + } + token += String.fromCharCode(ch); + ch = data[offset]; + } + return token; + } + function skipUntil(data, offset, what) { + const length = what.length, + dataLength = data.length; + let skipped = 0; + while (offset < dataLength) { + let i = 0; + while (i < length && data[offset + i] === what[i]) { + ++i; + } + if (i >= length) { + break; + } + offset++; + skipped++; + } + return skipped; + } + const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g; + const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g; + const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; + const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); + const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]); + const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); + this.entries.length = 0; + this._cacheMap.clear(); + const stream = this.stream; + stream.pos = 0; + const buffer = stream.getBytes(), + bufferStr = bytesToString(buffer), + length = buffer.length; + let position = stream.start; + const trailers = [], + xrefStms = []; + while (position < length) { + let ch = buffer[position]; + if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { + ++position; + continue; + } + if (ch === PERCENT) { + do { + ++position; + if (position >= length) { + break; + } + ch = buffer[position]; + } while (ch !== LF && ch !== CR); + continue; + } + const token = readToken(buffer, position); + let m; + if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) { + position += skipUntil(buffer, position, trailerBytes); + trailers.push(position); + position += skipUntil(buffer, position, startxrefBytes); + } else if (m = objRegExp.exec(token)) { + const num = m[1] | 0, + gen = m[2] | 0; + const startPos = position + token.length; + let contentLength, + updateEntries = false; + if (!this.entries[num]) { + updateEntries = true; + } else if (this.entries[num].gen === gen) { + try { + const parser = new Parser({ + lexer: new Lexer(stream.makeSubStream(startPos)) + }); + parser.getObj(); + updateEntries = true; + } catch (ex) { + if (ex instanceof ParserEOFException) { + warn(`indexObjects -- checking object (${token}): "${ex}".`); + } else { + updateEntries = true; + } + } + } + if (updateEntries) { + this.entries[num] = { + offset: position - stream.start, + gen, + uncompressed: true + }; + } + gEndobjRegExp.lastIndex = startPos; + const match = gEndobjRegExp.exec(bufferStr); + if (match) { + const endPos = gEndobjRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "endobj") { + warn(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.'); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + const content = buffer.subarray(position, position + contentLength); + const xrefTagOffset = skipUntil(content, 0, xrefBytes); + if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { + xrefStms.push(position - stream.start); + this._xrefStms.add(position - stream.start); + } + position += contentLength; + } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) { + trailers.push(position); + const startPos = position + token.length; + let contentLength; + gStartxrefRegExp.lastIndex = startPos; + const match = gStartxrefRegExp.exec(bufferStr); + if (match) { + const endPos = gStartxrefRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "startxref") { + warn(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.'); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + position += contentLength; + } else { + position += token.length + 1; + } + } + for (const xrefStm of xrefStms) { + this.startXRefQueue.push(xrefStm); + this.readXRef(true); + } + const trailerDicts = []; + let isEncrypted = false; + for (const trailer of trailers) { + stream.pos = trailer; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true, + recoveryMode: true + }); + const obj = parser.getObj(); + if (!isCmd(obj, "trailer")) { + continue; + } + const dict = parser.getObj(); + if (!(dict instanceof Dict)) { + continue; + } + trailerDicts.push(dict); + if (dict.has("Encrypt")) { + isEncrypted = true; + } + } + let trailerDict, trailerError; + for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) { + if (dict === "genFallback") { + if (!trailerError) { + break; + } + this._generationFallback = true; + continue; + } + let validPagesDict = false; + try { + const rootDict = dict.get("Root"); + if (!(rootDict instanceof Dict)) { + continue; + } + const pagesDict = rootDict.get("Pages"); + if (!(pagesDict instanceof Dict)) { + continue; + } + const pagesCount = pagesDict.get("Count"); + if (Number.isInteger(pagesCount)) { + validPagesDict = true; + } + } catch (ex) { + trailerError = ex; + continue; + } + if (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) { + return dict; + } + trailerDict = dict; + } + if (trailerDict) { + return trailerDict; + } + if (this.topDict) { + return this.topDict; + } + if (!trailerDicts.length) { + for (const [num, entry] of this.entries.entries()) { + if (!entry) { + continue; + } + const ref = Ref.get(num, entry.gen); + let obj; + try { + obj = this.fetch(ref); + } catch { + continue; + } + if (obj instanceof BaseStream) { + obj = obj.dict; + } + if (obj instanceof Dict && obj.has("Root")) { + return obj; + } + } + } + throw new InvalidPDFException("Invalid PDF structure."); + } + readXRef(recoveryMode = false) { + const stream = this.stream; + const startXRefParsedCache = new Set(); + while (this.startXRefQueue.length) { + try { + const startXRef = this.startXRefQueue[0]; + if (startXRefParsedCache.has(startXRef)) { + warn("readXRef - skipping XRef table since it was already parsed."); + this.startXRefQueue.shift(); + continue; + } + startXRefParsedCache.add(startXRef); + stream.pos = startXRef + stream.start; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + let obj = parser.getObj(); + let dict; + if (isCmd(obj, "xref")) { + dict = this.processXRefTable(parser); + if (!this.topDict) { + this.topDict = dict; + } + obj = dict.get("XRefStm"); + if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { + this._xrefStms.add(obj); + this.startXRefQueue.push(obj); + this.#firstXRefStmPos ??= obj; + } + } else if (Number.isInteger(obj)) { + if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) { + throw new FormatError("Invalid XRef stream"); + } + dict = this.processXRefStream(obj); + if (!this.topDict) { + this.topDict = dict; + } + if (!dict) { + throw new FormatError("Failed to read XRef stream"); + } + } else { + throw new FormatError("Invalid XRef stream header"); + } + obj = dict.get("Prev"); + if (Number.isInteger(obj)) { + this.startXRefQueue.push(obj); + } else if (obj instanceof Ref) { + this.startXRefQueue.push(obj.num); + } + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + info("(while reading XRef): " + e); + } + this.startXRefQueue.shift(); + } + if (this.topDict) { + return this.topDict; + } + if (recoveryMode) { + return undefined; + } + throw new XRefParseException(); + } + get lastXRefStreamPos() { + return this.#firstXRefStmPos ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null); + } + getEntry(i) { + const xrefEntry = this.entries[i]; + if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { + return xrefEntry; + } + return null; + } + fetchIfRef(obj, suppressEncryption = false) { + if (obj instanceof Ref) { + return this.fetch(obj, suppressEncryption); + } + return obj; + } + fetch(ref, suppressEncryption = false) { + if (!(ref instanceof Ref)) { + throw new Error("ref object is not a reference"); + } + const num = ref.num; + const cacheEntry = this._cacheMap.get(num); + if (cacheEntry !== undefined) { + if (cacheEntry instanceof Dict && !cacheEntry.objId) { + cacheEntry.objId = ref.toString(); + } + return cacheEntry; + } + let xrefEntry = this.getEntry(num); + if (xrefEntry === null) { + this._cacheMap.set(num, xrefEntry); + return xrefEntry; + } + if (this._pendingRefs.has(ref)) { + this._pendingRefs.remove(ref); + warn(`Ignoring circular reference: ${ref}.`); + return CIRCULAR_REF; + } + this._pendingRefs.put(ref); + try { + xrefEntry = xrefEntry.uncompressed ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) : this.fetchCompressed(ref, xrefEntry, suppressEncryption); + this._pendingRefs.remove(ref); + } catch (ex) { + this._pendingRefs.remove(ref); + throw ex; + } + if (xrefEntry instanceof Dict) { + xrefEntry.objId = ref.toString(); + } else if (xrefEntry instanceof BaseStream) { + xrefEntry.dict.objId = ref.toString(); + } + return xrefEntry; + } + fetchUncompressed(ref, xrefEntry, suppressEncryption = false) { + const gen = ref.gen; + let num = ref.num; + if (xrefEntry.gen !== gen) { + const msg = `Inconsistent generation in XRef: ${ref}`; + if (this._generationFallback && xrefEntry.gen < gen) { + warn(msg); + return this.fetchUncompressed(Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption); + } + throw new XRefEntryException(msg); + } + const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) { + throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); + } + if (obj3.cmd !== "obj") { + if (obj3.cmd.startsWith("obj")) { + num = parseInt(obj3.cmd.substring(3), 10); + if (!Number.isNaN(num)) { + return num; + } + } + throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); + } + xrefEntry = this.encrypt && !suppressEncryption ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) : parser.getObj(); + if (!(xrefEntry instanceof BaseStream)) { + this._cacheMap.set(num, xrefEntry); + } + return xrefEntry; + } + fetchCompressed(ref, xrefEntry, suppressEncryption = false) { + const tableOffset = xrefEntry.offset; + const stream = this.fetch(Ref.get(tableOffset, 0)); + if (!(stream instanceof BaseStream)) { + throw new FormatError("bad ObjStm stream"); + } + const first = stream.dict.get("First"); + const n = stream.dict.get("N"); + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new FormatError("invalid first and n parameters for ObjStm stream"); + } + let parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + const nums = new Array(n); + const offsets = new Array(n); + for (let i = 0; i < n; ++i) { + const num = parser.getObj(); + if (!Number.isInteger(num)) { + throw new FormatError(`invalid object number in the ObjStm stream: ${num}`); + } + const offset = parser.getObj(); + if (!Number.isInteger(offset)) { + throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`); + } + nums[i] = num; + offsets[i] = offset; + } + const start = (stream.start || 0) + first; + const entries = new Array(n); + for (let i = 0; i < n; ++i) { + const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined; + if (length < 0) { + throw new FormatError("Invalid offset in the ObjStm stream."); + } + parser = new Parser({ + lexer: new Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)), + xref: this, + allowStreams: true + }); + const obj = parser.getObj(); + entries[i] = obj; + if (obj instanceof BaseStream) { + continue; + } + const num = nums[i], + entry = this.entries[num]; + if (entry && entry.offset === tableOffset && entry.gen === i) { + this._cacheMap.set(num, obj); + } + } + xrefEntry = entries[xrefEntry.gen]; + if (xrefEntry === undefined) { + throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); + } + return xrefEntry; + } + async fetchIfRefAsync(obj, suppressEncryption) { + if (obj instanceof Ref) { + return this.fetchAsync(obj, suppressEncryption); + } + return obj; + } + async fetchAsync(ref, suppressEncryption) { + try { + return this.fetch(ref, suppressEncryption); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.pdfManager.requestRange(ex.begin, ex.end); + return this.fetchAsync(ref, suppressEncryption); + } + } + getCatalogObj() { + return this.root; + } +} + +;// ./src/core/document.js + + + + + + + + + + + + + + + + + + + +const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; +class Page { + constructor({ + pdfManager, + xref, + pageIndex, + pageDict, + ref, + globalIdFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + systemFontCache, + nonBlendModesSet, + xfaFactory + }) { + this.pdfManager = pdfManager; + this.pageIndex = pageIndex; + this.pageDict = pageDict; + this.xref = xref; + this.ref = ref; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.nonBlendModesSet = nonBlendModesSet; + this.evaluatorOptions = pdfManager.evaluatorOptions; + this.resourcesPromise = null; + this.xfaFactory = xfaFactory; + const idCounters = { + obj: 0 + }; + this._localIdFactory = class extends globalIdFactory { + static createObjId() { + return `p${pageIndex}_${++idCounters.obj}`; + } + static getPageObjId() { + return `p${ref.toString()}`; + } + }; + } + _getInheritableProperty(key, getArray = false) { + const value = getInheritableProperty({ + dict: this.pageDict, + key, + getArray, + stopWhenFound: false + }); + if (!Array.isArray(value)) { + return value; + } + if (value.length === 1 || !(value[0] instanceof Dict)) { + return value[0]; + } + return Dict.merge({ + xref: this.xref, + dictArray: value + }); + } + get content() { + return this.pageDict.getArray("Contents"); + } + get resources() { + const resources = this._getInheritableProperty("Resources"); + return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty); + } + _getBoundingBox(name) { + if (this.xfaData) { + return this.xfaData.bbox; + } + const box = lookupNormalRect(this._getInheritableProperty(name, true), null); + if (box) { + if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return box; + } + warn(`Empty, or invalid, /${name} entry.`); + } + return null; + } + get mediaBox() { + return shadow(this, "mediaBox", this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); + } + get cropBox() { + return shadow(this, "cropBox", this._getBoundingBox("CropBox") || this.mediaBox); + } + get userUnit() { + const obj = this.pageDict.get("UserUnit"); + return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0); + } + get view() { + const { + cropBox, + mediaBox + } = this; + if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) { + const box = Util.intersect(cropBox, mediaBox); + if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return shadow(this, "view", box); + } + warn("Empty /CropBox and /MediaBox intersection."); + } + return shadow(this, "view", mediaBox); + } + get rotate() { + let rotate = this._getInheritableProperty("Rotate") || 0; + if (rotate % 90 !== 0) { + rotate = 0; + } else if (rotate >= 360) { + rotate %= 360; + } else if (rotate < 0) { + rotate = (rotate % 360 + 360) % 360; + } + return shadow(this, "rotate", rotate); + } + _onSubStreamError(reason, objId) { + if (this.evaluatorOptions.ignoreErrors) { + warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); + return; + } + throw reason; + } + getContentStream() { + return this.pdfManager.ensure(this, "content").then(content => { + if (content instanceof BaseStream) { + return content; + } + if (Array.isArray(content)) { + return new StreamsSequenceStream(content, this._onSubStreamError.bind(this)); + } + return new NullStream(); + }); + } + get xfaData() { + return shadow(this, "xfaData", this.xfaFactory ? { + bbox: this.xfaFactory.getBoundingBox(this.pageIndex) + } : null); + } + async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { + const promises = []; + for (const annotation of annotations) { + if (annotation.id) { + const ref = Ref.fromString(annotation.id); + if (!ref) { + warn(`A non-linked annotation cannot be modified: ${annotation.id}`); + continue; + } + if (annotation.deleted) { + deletedAnnotations.put(ref, ref); + if (annotation.popupRef) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef, popupRef); + } + } + continue; + } + existingAnnotations?.put(ref); + annotation.ref = ref; + promises.push(this.xref.fetchAsync(ref).then(obj => { + if (obj instanceof Dict) { + annotation.oldAnnotation = obj.clone(); + } + }, () => { + warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`); + })); + delete annotation.id; + } + } + await Promise.all(promises); + } + async saveNewAnnotations(handler, task, annotations, imagePromises, changes) { + if (this.xfaFactory) { + throw new Error("XFA: Cannot save new annotations."); + } + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + const deletedAnnotations = new RefSetCache(); + const existingAnnotations = new RefSet(); + await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations); + const pageDict = this.pageDict; + const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a))); + const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations, imagePromises, changes); + for (const { + ref + } of newData.annotations) { + if (ref instanceof Ref && !existingAnnotations.has(ref)) { + annotationsArray.push(ref); + } + } + const dict = pageDict.clone(); + dict.set("Annots", annotationsArray); + changes.put(this.ref, { + data: dict + }); + for (const deletedRef of deletedAnnotations) { + changes.put(deletedRef, { + data: null + }); + } + } + save(handler, task, annotationStorage, changes) { + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + return this._parsedAnnotations.then(function (annotations) { + const promises = []; + for (const annotation of annotations) { + promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) { + warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return null; + })); + } + return Promise.all(promises); + }); + } + loadResources(keys) { + this.resourcesPromise ||= this.pdfManager.ensure(this, "resources"); + return this.resourcesPromise.then(() => { + const objectLoader = new ObjectLoader(this.resources, keys, this.xref); + return objectLoader.load(); + }); + } + getOperatorList({ + handler, + sink, + task, + intent, + cacheKey, + annotationStorage = null, + modifiedIds = null + }) { + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; + const newAnnots = newAnnotsByPage?.get(this.pageIndex); + let newAnnotationsPromise = Promise.resolve(null); + let deletedAnnotations = null; + if (newAnnots) { + const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals"); + let imagePromises; + const missingBitmaps = new Set(); + for (const { + bitmapId, + bitmap + } of newAnnots) { + if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { + missingBitmaps.add(bitmapId); + } + } + const { + isOffscreenCanvasSupported + } = this.evaluatorOptions; + if (missingBitmaps.size > 0) { + const annotationWithBitmaps = newAnnots.slice(); + for (const [key, annotation] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { + annotationWithBitmaps.push(annotation); + } + } + imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported); + } else { + imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported); + } + deletedAnnotations = new RefSet(); + newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => { + if (!annotationGlobals) { + return null; + } + return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises); + }); + } + const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(([contentStream]) => { + const opList = new OperatorList(intent, sink); + handler.send("StartRenderPage", { + transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet), + pageIndex: this.pageIndex, + cacheKey + }); + return partialEvaluator.getOperatorList({ + stream: contentStream, + task, + resources: this.resources, + operatorList: opList + }).then(function () { + return opList; + }); + }); + return Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]).then(function ([pageOpList, annotations, newAnnotations]) { + if (newAnnotations) { + annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref))); + for (let i = 0, ii = newAnnotations.length; i < ii; i++) { + const newAnnotation = newAnnotations[i]; + if (newAnnotation.refToReplace) { + const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)); + if (j >= 0) { + annotations.splice(j, 1, newAnnotation); + newAnnotations.splice(i--, 1); + ii--; + } + } + } + annotations = annotations.concat(newAnnotations); + } + if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { + pageOpList.flush(true); + return { + length: pageOpList.totalLength + }; + } + const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), + isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), + intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + const opListPromises = []; + for (const annotation of annotations) { + if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) { + opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) { + warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return { + opList: null, + separateForm: false, + separateCanvas: false + }; + })); + } + } + return Promise.all(opListPromises).then(function (opLists) { + let form = false, + canvas = false; + for (const { + opList, + separateForm, + separateCanvas + } of opLists) { + pageOpList.addOpList(opList); + form ||= separateForm; + canvas ||= separateCanvas; + } + pageOpList.flush(true, { + form, + canvas + }); + return { + length: pageOpList.totalLength + }; + }); + }); + } + async extractTextContent({ + handler, + task, + includeMarkedContent, + disableNormalization, + sink + }) { + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]); + const langPromise = this.pdfManager.ensureCatalog("lang"); + const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]); + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + return partialEvaluator.getTextContent({ + stream: contentStream, + task, + resources: this.resources, + includeMarkedContent, + disableNormalization, + sink, + viewBox: this.view, + lang + }); + } + async getStructTree() { + const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot"); + if (!structTreeRoot) { + return null; + } + await this._parsedAnnotations; + const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); + return this.pdfManager.ensure(structTree, "serializable"); + } + _parseStructTree(structTreeRoot) { + const tree = new StructTreePage(structTreeRoot, this.pageDict); + tree.parse(this.ref); + return tree; + } + async getAnnotationsData(handler, task, intent) { + const annotations = await this._parsedAnnotations; + if (annotations.length === 0) { + return annotations; + } + const annotationsData = [], + textContentPromises = []; + let partialEvaluator; + const intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + for (const annotation of annotations) { + const isVisible = intentAny || intentDisplay && annotation.viewable; + if (isVisible || intentPrint && annotation.printable) { + annotationsData.push(annotation.data); + } + if (annotation.hasTextContent && isVisible) { + partialEvaluator ||= new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) { + warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); + })); + } + } + await Promise.all(textContentPromises); + return annotationsData; + } + get annotations() { + const annots = this._getInheritableProperty("Annots"); + return shadow(this, "annotations", Array.isArray(annots) ? annots : []); + } + get _parsedAnnotations() { + const promise = this.pdfManager.ensure(this, "annotations").then(async annots => { + if (annots.length === 0) { + return annots; + } + const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]); + if (!annotationGlobals) { + return []; + } + const orphanFields = fieldObjects?.orphanFields; + const annotationPromises = []; + for (const annotationRef of annots) { + annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, this.ref).catch(function (reason) { + warn(`_parsedAnnotations: "${reason}".`); + return null; + })); + } + const sortedAnnotations = []; + let popupAnnotations, widgetAnnotations; + for (const annotation of await Promise.all(annotationPromises)) { + if (!annotation) { + continue; + } + if (annotation instanceof WidgetAnnotation) { + (widgetAnnotations ||= []).push(annotation); + continue; + } + if (annotation instanceof PopupAnnotation) { + (popupAnnotations ||= []).push(annotation); + continue; + } + sortedAnnotations.push(annotation); + } + if (widgetAnnotations) { + sortedAnnotations.push(...widgetAnnotations); + } + if (popupAnnotations) { + sortedAnnotations.push(...popupAnnotations); + } + return sortedAnnotations; + }); + return shadow(this, "_parsedAnnotations", promise); + } + get jsActions() { + const actions = collectActions(this.xref, this.pageDict, PageActionEventType); + return shadow(this, "jsActions", actions); + } +} +const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); +const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]); +const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); +function find(stream, signature, limit = 1024, backwards = false) { + const signatureLength = signature.length; + const scanBytes = stream.peekBytes(limit); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + return false; + } + if (backwards) { + const signatureEnd = signatureLength - 1; + let pos = scanBytes.length - 1; + while (pos >= signatureEnd) { + let j = 0; + while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos - signatureEnd; + return true; + } + pos--; + } + } else { + let pos = 0; + while (pos <= scanLength) { + let j = 0; + while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos; + return true; + } + pos++; + } + } + return false; +} +class PDFDocument { + constructor(pdfManager, stream) { + if (stream.length <= 0) { + throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); + } + this.pdfManager = pdfManager; + this.stream = stream; + this.xref = new XRef(stream, pdfManager); + this._pagePromises = new Map(); + this._version = null; + const idCounters = { + font: 0 + }; + this._globalIdFactory = class { + static getDocId() { + return `g_${pdfManager.docId}`; + } + static createFontId() { + return `f${++idCounters.font}`; + } + static createObjId() { + unreachable("Abstract method `createObjId` called."); + } + static getPageObjId() { + unreachable("Abstract method `getPageObjId` called."); + } + }; + } + parse(recoveryMode) { + this.xref.parse(recoveryMode); + this.catalog = new Catalog(this.pdfManager, this.xref); + } + get linearization() { + let linearization = null; + try { + linearization = Linearization.create(this.stream); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info(err); + } + return shadow(this, "linearization", linearization); + } + get startXRef() { + const stream = this.stream; + let startXRef = 0; + if (this.linearization) { + stream.reset(); + if (find(stream, ENDOBJ_SIGNATURE)) { + stream.skip(6); + let ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.pos++; + ch = stream.peekByte(); + } + startXRef = stream.pos - stream.start; + } + } else { + const step = 1024; + const startXRefLength = STARTXREF_SIGNATURE.length; + let found = false, + pos = stream.end; + while (!found && pos > 0) { + pos -= step - startXRefLength; + if (pos < 0) { + pos = 0; + } + stream.pos = pos; + found = find(stream, STARTXREF_SIGNATURE, step, true); + } + if (found) { + stream.skip(9); + let ch; + do { + ch = stream.getByte(); + } while (isWhiteSpace(ch)); + let str = ""; + while (ch >= 0x20 && ch <= 0x39) { + str += String.fromCharCode(ch); + ch = stream.getByte(); + } + startXRef = parseInt(str, 10); + if (isNaN(startXRef)) { + startXRef = 0; + } + } + } + return shadow(this, "startXRef", startXRef); + } + checkHeader() { + const stream = this.stream; + stream.reset(); + if (!find(stream, PDF_HEADER_SIGNATURE)) { + return; + } + stream.moveStart(); + stream.skip(PDF_HEADER_SIGNATURE.length); + let version = "", + ch; + while ((ch = stream.getByte()) > 0x20 && version.length < 7) { + version += String.fromCharCode(ch); + } + if (PDF_VERSION_REGEXP.test(version)) { + this._version = version; + } else { + warn(`Invalid PDF header version: ${version}`); + } + } + parseStartXRef() { + this.xref.setStartXRef(this.startXRef); + } + get numPages() { + let num = 0; + if (this.catalog.hasActualNumPages) { + num = this.catalog.numPages; + } else if (this.xfaFactory) { + num = this.xfaFactory.getNumPages(); + } else if (this.linearization) { + num = this.linearization.numPages; + } else { + num = this.catalog.numPages; + } + return shadow(this, "numPages", num); + } + _hasOnlyDocumentSignatures(fields, recursionDepth = 0) { + const RECURSION_LIMIT = 10; + if (!Array.isArray(fields)) { + return false; + } + return fields.every(field => { + field = this.xref.fetchIfRef(field); + if (!(field instanceof Dict)) { + return false; + } + if (field.has("Kids")) { + if (++recursionDepth > RECURSION_LIMIT) { + warn("_hasOnlyDocumentSignatures: maximum recursion depth reached"); + return false; + } + return this._hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); + } + const isSignature = isName(field.get("FT"), "Sig"); + const rectangle = field.get("Rect"); + const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0); + return isSignature && isInvisible; + }); + } + get _xfaStreams() { + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return null; + } + const xfa = acroForm.get("XFA"); + const entries = { + "xdp:xdp": "", + template: "", + datasets: "", + config: "", + connectionSet: "", + localeSet: "", + stylesheet: "", + "/xdp:xdp": "" + }; + if (xfa instanceof BaseStream && !xfa.isEmpty) { + entries["xdp:xdp"] = xfa; + return entries; + } + if (!Array.isArray(xfa) || xfa.length === 0) { + return null; + } + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + let name; + if (i === 0) { + name = "xdp:xdp"; + } else if (i === ii - 2) { + name = "/xdp:xdp"; + } else { + name = xfa[i]; + } + if (!entries.hasOwnProperty(name)) { + continue; + } + const data = this.xref.fetchIfRef(xfa[i + 1]); + if (!(data instanceof BaseStream) || data.isEmpty) { + continue; + } + entries[name] = data; + } + return entries; + } + get xfaDatasets() { + const streams = this._xfaStreams; + if (!streams) { + return shadow(this, "xfaDatasets", null); + } + for (const key of ["datasets", "xdp:xdp"]) { + const stream = streams[key]; + if (!stream) { + continue; + } + try { + const str = stringToUTF8String(stream.getString()); + const data = { + [key]: str + }; + return shadow(this, "xfaDatasets", new DatasetReader(data)); + } catch { + warn("XFA - Invalid utf-8 string."); + break; + } + } + return shadow(this, "xfaDatasets", null); + } + get xfaData() { + const streams = this._xfaStreams; + if (!streams) { + return null; + } + const data = Object.create(null); + for (const [key, stream] of Object.entries(streams)) { + if (!stream) { + continue; + } + try { + data[key] = stringToUTF8String(stream.getString()); + } catch { + warn("XFA - Invalid utf-8 string."); + return null; + } + } + return data; + } + get xfaFactory() { + let data; + if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) { + data = this.xfaData; + } + return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null); + } + get isPureXfa() { + return this.xfaFactory ? this.xfaFactory.isValid() : false; + } + get htmlForXfa() { + return this.xfaFactory ? this.xfaFactory.getPages() : null; + } + async loadXfaImages() { + const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); + if (!xfaImagesDict) { + return; + } + const keys = xfaImagesDict.getKeys(); + const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref); + await objectLoader.load(); + const xfaImages = new Map(); + for (const key of keys) { + const stream = xfaImagesDict.get(key); + if (stream instanceof BaseStream) { + xfaImages.set(key, stream.getBytes()); + } + } + this.xfaFactory.setImages(xfaImages); + } + async loadXfaFonts(handler, task) { + const acroForm = await this.pdfManager.ensureCatalog("acroForm"); + if (!acroForm) { + return; + } + const resources = await acroForm.getAsync("DR"); + if (!(resources instanceof Dict)) { + return; + } + const objectLoader = new ObjectLoader(resources, ["Font"], this.xref); + await objectLoader.load(); + const fontRes = resources.get("Font"); + if (!(fontRes instanceof Dict)) { + return; + } + const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions); + options.useSystemFonts = false; + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: -1, + idFactory: this._globalIdFactory, + fontCache: this.catalog.fontCache, + builtInCMapCache: this.catalog.builtInCMapCache, + standardFontDataCache: this.catalog.standardFontDataCache, + options + }); + const operatorList = new OperatorList(); + const pdfFonts = []; + const initialState = { + get font() { + return pdfFonts.at(-1); + }, + set font(font) { + pdfFonts.push(font); + }, + clone() { + return this; + } + }; + const promises = []; + for (const [fontName, font] of fontRes) { + const descriptor = font.get("FontDescriptor"); + if (!(descriptor instanceof Dict)) { + continue; + } + let fontFamily = descriptor.get("FontFamily"); + fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); + const fontWeight = descriptor.get("FontWeight"); + const italicAngle = -descriptor.get("ItalicAngle"); + const cssFontInfo = { + fontFamily, + fontWeight, + italicAngle + }; + if (!validateCSSFont(cssFontInfo)) { + continue; + } + promises.push(partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, null, cssFontInfo).catch(function (reason) { + warn(`loadXfaFonts: "${reason}".`); + return null; + })); + } + await Promise.all(promises); + const missingFonts = this.xfaFactory.setFonts(pdfFonts); + if (!missingFonts) { + return; + } + options.ignoreErrors = true; + promises.length = 0; + pdfFonts.length = 0; + const reallyMissingFonts = new Set(); + for (const missing of missingFonts) { + if (!getXfaFontName(`${missing}-Regular`)) { + reallyMissingFonts.add(missing); + } + } + if (reallyMissingFonts.size) { + missingFonts.push("PdfJS-Fallback"); + } + for (const missing of missingFonts) { + if (reallyMissingFonts.has(missing)) { + continue; + } + for (const fontInfo of [{ + name: "Regular", + fontWeight: 400, + italicAngle: 0 + }, { + name: "Bold", + fontWeight: 700, + italicAngle: 0 + }, { + name: "Italic", + fontWeight: 400, + italicAngle: 12 + }, { + name: "BoldItalic", + fontWeight: 700, + italicAngle: 12 + }]) { + const name = `${missing}-${fontInfo.name}`; + const dict = getXfaFontDict(name); + promises.push(partialEvaluator.handleSetFont(resources, [Name.get(name), 1], null, operatorList, task, initialState, dict, { + fontFamily: missing, + fontWeight: fontInfo.fontWeight, + italicAngle: fontInfo.italicAngle + }).catch(function (reason) { + warn(`loadXfaFonts: "${reason}".`); + return null; + })); + } + } + await Promise.all(promises); + this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); + } + async serializeXfaData(annotationStorage) { + return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; + } + get version() { + return this.catalog.version || this._version; + } + get formInfo() { + const formInfo = { + hasFields: false, + hasAcroForm: false, + hasXfa: false, + hasSignatures: false + }; + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return shadow(this, "formInfo", formInfo); + } + try { + const fields = acroForm.get("Fields"); + const hasFields = Array.isArray(fields) && fields.length > 0; + formInfo.hasFields = hasFields; + const xfa = acroForm.get("XFA"); + formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty; + const sigFlags = acroForm.get("SigFlags"); + const hasSignatures = !!(sigFlags & 0x1); + const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields); + formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; + formInfo.hasSignatures = hasSignatures; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Cannot fetch form information: "${ex}".`); + } + return shadow(this, "formInfo", formInfo); + } + get documentInfo() { + const docInfo = { + PDFFormatVersion: this.version, + Language: this.catalog.lang, + EncryptFilterName: this.xref.encrypt ? this.xref.encrypt.filterName : null, + IsLinearized: !!this.linearization, + IsAcroFormPresent: this.formInfo.hasAcroForm, + IsXFAPresent: this.formInfo.hasXfa, + IsCollectionPresent: !!this.catalog.collection, + IsSignaturesPresent: this.formInfo.hasSignatures + }; + let infoDict; + try { + infoDict = this.xref.trailer.get("Info"); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info("The document information dictionary is invalid."); + } + if (!(infoDict instanceof Dict)) { + return shadow(this, "documentInfo", docInfo); + } + for (const key of infoDict.getKeys()) { + const value = infoDict.get(key); + switch (key) { + case "Title": + case "Author": + case "Subject": + case "Keywords": + case "Creator": + case "Producer": + case "CreationDate": + case "ModDate": + if (typeof value === "string") { + docInfo[key] = stringToPDFString(value); + continue; + } + break; + case "Trapped": + if (value instanceof Name) { + docInfo[key] = value; + continue; + } + break; + default: + let customValue; + switch (typeof value) { + case "string": + customValue = stringToPDFString(value); + break; + case "number": + case "boolean": + customValue = value; + break; + default: + if (value instanceof Name) { + customValue = value; + } + break; + } + if (customValue === undefined) { + warn(`Bad value, for custom key "${key}", in Info: ${value}.`); + continue; + } + if (!docInfo.Custom) { + docInfo.Custom = Object.create(null); + } + docInfo.Custom[key] = customValue; + continue; + } + warn(`Bad value, for key "${key}", in Info: ${value}.`); + } + return shadow(this, "documentInfo", docInfo); + } + get fingerprints() { + const FINGERPRINT_FIRST_BYTES = 1024; + const EMPTY_FINGERPRINT = "\x00".repeat(16); + function validate(data) { + return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT; + } + const id = this.xref.trailer.get("ID"); + let hashOriginal, hashModified; + if (Array.isArray(id) && validate(id[0])) { + hashOriginal = stringToBytes(id[0]); + if (id[1] !== id[0] && validate(id[1])) { + hashModified = stringToBytes(id[1]); + } + } else { + hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); + } + return shadow(this, "fingerprints", [toHexUtil(hashOriginal), hashModified ? toHexUtil(hashModified) : null]); + } + async _getLinearizationPage(pageIndex) { + const { + catalog, + linearization, + xref + } = this; + const ref = Ref.get(linearization.objectNumberFirst, 0); + try { + const obj = await xref.fetchAsync(ref); + if (obj instanceof Dict) { + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) { + if (!catalog.pageKidsCountCache.has(ref)) { + catalog.pageKidsCountCache.put(ref, 1); + } + if (!catalog.pageIndexCache.has(ref)) { + catalog.pageIndexCache.put(ref, 0); + } + return [obj, ref]; + } + } + throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary."); + } catch (reason) { + warn(`_getLinearizationPage: "${reason.message}".`); + return catalog.getPageDict(pageIndex); + } + } + getPage(pageIndex) { + const cachedPromise = this._pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const { + catalog, + linearization, + xfaFactory + } = this; + let promise; + if (xfaFactory) { + promise = Promise.resolve([Dict.empty, null]); + } else if (linearization?.pageFirst === pageIndex) { + promise = this._getLinearizationPage(pageIndex); + } else { + promise = catalog.getPageDict(pageIndex); + } + promise = promise.then(([pageDict, ref]) => { + return new Page({ + pdfManager: this.pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory + }); + }); + this._pagePromises.set(pageIndex, promise); + return promise; + } + async checkFirstPage(recoveryMode = false) { + if (recoveryMode) { + return; + } + try { + await this.getPage(0); + } catch (reason) { + if (reason instanceof XRefEntryException) { + this._pagePromises.delete(0); + await this.cleanup(); + throw new XRefParseException(); + } + } + } + async checkLastPage(recoveryMode = false) { + const { + catalog, + pdfManager + } = this; + catalog.setActualNumPages(); + let numPages; + try { + await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]); + if (this.xfaFactory) { + return; + } else if (this.linearization) { + numPages = this.linearization.numPages; + } else { + numPages = catalog.numPages; + } + if (!Number.isInteger(numPages)) { + throw new FormatError("Page count is not an integer."); + } else if (numPages <= 1) { + return; + } + await this.getPage(numPages - 1); + } catch (reason) { + this._pagePromises.delete(numPages - 1); + await this.cleanup(); + if (reason instanceof XRefEntryException && !recoveryMode) { + throw new XRefParseException(); + } + warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`); + let pagesTree; + try { + pagesTree = await catalog.getAllPageDicts(recoveryMode); + } catch (reasonAll) { + if (reasonAll instanceof XRefEntryException && !recoveryMode) { + throw new XRefParseException(); + } + catalog.setActualNumPages(1); + return; + } + for (const [pageIndex, [pageDict, ref]] of pagesTree) { + let promise; + if (pageDict instanceof Error) { + promise = Promise.reject(pageDict); + promise.catch(() => {}); + } else { + promise = Promise.resolve(new Page({ + pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory: null + })); + } + this._pagePromises.set(pageIndex, promise); + } + catalog.setActualNumPages(pagesTree.size); + } + } + fontFallback(id, handler) { + return this.catalog.fontFallback(id, handler); + } + async cleanup(manuallyTriggered = false) { + return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches(); + } + async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) { + const { + xref + } = this; + if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) { + return; + } + visitedRefs.put(fieldRef); + const field = await xref.fetchAsync(fieldRef); + if (!(field instanceof Dict)) { + return; + } + if (field.has("T")) { + const partName = stringToPDFString(await field.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; + } else { + let obj = field; + while (true) { + obj = obj.getRaw("Parent") || parentRef; + if (obj instanceof Ref) { + if (visitedRefs.has(obj)) { + break; + } + obj = await xref.fetchAsync(obj); + } + if (!(obj instanceof Dict)) { + break; + } + if (obj.has("T")) { + const partName = stringToPDFString(await obj.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; + break; + } + } + } + if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) { + orphanFields.put(fieldRef, parentRef); + } + if (!promises.has(name)) { + promises.set(name, []); + } + promises.get(name).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) { + warn(`#collectFieldObjects: "${reason}".`); + return null; + })); + if (!field.has("Kids")) { + return; + } + const kids = await field.getAsync("Kids"); + if (Array.isArray(kids)) { + for (const kid of kids) { + await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields); + } + } + } + get fieldObjects() { + const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { + if (!formInfo.hasFields) { + return null; + } + const [annotationGlobals, acroForm] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureCatalog("acroForm")]); + if (!annotationGlobals) { + return null; + } + const visitedRefs = new RefSet(); + const allFields = Object.create(null); + const fieldPromises = new Map(); + const orphanFields = new RefSetCache(); + for (const fieldRef of await acroForm.getAsync("Fields")) { + await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields); + } + const allPromises = []; + for (const [name, promises] of fieldPromises) { + allPromises.push(Promise.all(promises).then(fields => { + fields = fields.filter(field => !!field); + if (fields.length > 0) { + allFields[name] = fields; + } + })); + } + await Promise.all(allPromises); + return { + allFields, + orphanFields + }; + }); + return shadow(this, "fieldObjects", promise); + } + get hasJSActions() { + const promise = this.pdfManager.ensureDoc("_parseHasJSActions"); + return shadow(this, "hasJSActions", promise); + } + async _parseHasJSActions() { + const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]); + if (catalogJsActions) { + return true; + } + if (fieldObjects) { + return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null)); + } + return false; + } + get calculationOrderIds() { + const calculationOrder = this.catalog.acroForm?.get("CO"); + if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { + return shadow(this, "calculationOrderIds", null); + } + const ids = []; + for (const id of calculationOrder) { + if (id instanceof Ref) { + ids.push(id.toString()); + } + } + return shadow(this, "calculationOrderIds", ids.length ? ids : null); + } + get annotationGlobals() { + return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager)); + } +} + +;// ./src/core/pdf_manager.js + + + + + +function parseDocBaseUrl(url) { + if (url) { + const absoluteUrl = createValidAbsoluteUrl(url); + if (absoluteUrl) { + return absoluteUrl.href; + } + warn(`Invalid absolute docBaseUrl: "${url}".`); + } + return null; +} +class BasePdfManager { + constructor(args) { + this._docBaseUrl = parseDocBaseUrl(args.docBaseUrl); + this._docId = args.docId; + this._password = args.password; + this.enableXfa = args.enableXfa; + args.evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; + args.evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported; + this.evaluatorOptions = Object.freeze(args.evaluatorOptions); + } + get docId() { + return this._docId; + } + get password() { + return this._password; + } + get docBaseUrl() { + return this._docBaseUrl; + } + get catalog() { + return this.pdfDocument.catalog; + } + ensureDoc(prop, args) { + return this.ensure(this.pdfDocument, prop, args); + } + ensureXRef(prop, args) { + return this.ensure(this.pdfDocument.xref, prop, args); + } + ensureCatalog(prop, args) { + return this.ensure(this.pdfDocument.catalog, prop, args); + } + getPage(pageIndex) { + return this.pdfDocument.getPage(pageIndex); + } + fontFallback(id, handler) { + return this.pdfDocument.fontFallback(id, handler); + } + loadXfaFonts(handler, task) { + return this.pdfDocument.loadXfaFonts(handler, task); + } + loadXfaImages() { + return this.pdfDocument.loadXfaImages(); + } + serializeXfaData(annotationStorage) { + return this.pdfDocument.serializeXfaData(annotationStorage); + } + cleanup(manuallyTriggered = false) { + return this.pdfDocument.cleanup(manuallyTriggered); + } + async ensure(obj, prop, args) { + unreachable("Abstract method `ensure` called"); + } + requestRange(begin, end) { + unreachable("Abstract method `requestRange` called"); + } + requestLoadedStream(noFetch = false) { + unreachable("Abstract method `requestLoadedStream` called"); + } + sendProgressiveData(chunk) { + unreachable("Abstract method `sendProgressiveData` called"); + } + updatePassword(password) { + this._password = password; + } + terminate(reason) { + unreachable("Abstract method `terminate` called"); + } +} +class LocalPdfManager extends BasePdfManager { + constructor(args) { + super(args); + const stream = new Stream(args.source); + this.pdfDocument = new PDFDocument(this, stream); + this._loadedStreamPromise = Promise.resolve(stream); + } + async ensure(obj, prop, args) { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } + requestRange(begin, end) { + return Promise.resolve(); + } + requestLoadedStream(noFetch = false) { + return this._loadedStreamPromise; + } + terminate(reason) {} +} +class NetworkPdfManager extends BasePdfManager { + constructor(args) { + super(args); + this.streamManager = new ChunkedStreamManager(args.source, { + msgHandler: args.handler, + length: args.length, + disableAutoFetch: args.disableAutoFetch, + rangeChunkSize: args.rangeChunkSize + }); + this.pdfDocument = new PDFDocument(this, this.streamManager.getStream()); + } + async ensure(obj, prop, args) { + try { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.requestRange(ex.begin, ex.end); + return this.ensure(obj, prop, args); + } + } + requestRange(begin, end) { + return this.streamManager.requestRange(begin, end); + } + requestLoadedStream(noFetch = false) { + return this.streamManager.requestAllChunks(noFetch); + } + sendProgressiveData(chunk) { + this.streamManager.onReceiveData({ + chunk + }); + } + terminate(reason) { + this.streamManager.abort(reason); + } +} + +;// ./src/shared/message_handler.js + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof MissingPDFException || ex instanceof PasswordException || ex instanceof UnexpectedResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "MissingPDFException": + return new MissingPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "UnexpectedResponseException": + return new UnexpectedResponseException(ex.message, ex.status); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/core/writer.js + + + + + + + +async function writeObject(ref, obj, buffer, { + encrypt = null +}) { + const transform = encrypt?.createCipherTransform(ref.num, ref.gen); + buffer.push(`${ref.num} ${ref.gen} obj\n`); + if (obj instanceof Dict) { + await writeDict(obj, buffer, transform); + } else if (obj instanceof BaseStream) { + await writeStream(obj, buffer, transform); + } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { + await writeArray(obj, buffer, transform); + } + buffer.push("\nendobj\n"); +} +async function writeDict(dict, buffer, transform) { + buffer.push("<<"); + for (const key of dict.getKeys()) { + buffer.push(` /${escapePDFName(key)} `); + await writeValue(dict.getRaw(key), buffer, transform); + } + buffer.push(">>"); +} +async function writeStream(stream, buffer, transform) { + let bytes = stream.getBytes(); + const { + dict + } = stream; + const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]); + const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter; + const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); + const MIN_LENGTH_FOR_COMPRESSING = 256; + if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) { + try { + const cs = new CompressionStream("deflate"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + const buf = await new Response(cs.readable).arrayBuffer(); + bytes = new Uint8Array(buf); + let newFilter, newParams; + if (!filter) { + newFilter = Name.get("FlateDecode"); + } else if (!isFilterZeroFlateDecode) { + newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter]; + if (params) { + newParams = Array.isArray(params) ? [null, ...params] : [null, params]; + } + } + if (newFilter) { + dict.set("Filter", newFilter); + } + if (newParams) { + dict.set("DecodeParms", newParams); + } + } catch (ex) { + info(`writeStream - cannot compress data: "${ex}".`); + } + } + let string = bytesToString(bytes); + if (transform) { + string = transform.encryptString(string); + } + dict.set("Length", string.length); + await writeDict(dict, buffer, transform); + buffer.push(" stream\n", string, "\nendstream"); +} +async function writeArray(array, buffer, transform) { + buffer.push("["); + let first = true; + for (const val of array) { + if (!first) { + buffer.push(" "); + } else { + first = false; + } + await writeValue(val, buffer, transform); + } + buffer.push("]"); +} +async function writeValue(value, buffer, transform) { + if (value instanceof Name) { + buffer.push(`/${escapePDFName(value.name)}`); + } else if (value instanceof Ref) { + buffer.push(`${value.num} ${value.gen} R`); + } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { + await writeArray(value, buffer, transform); + } else if (typeof value === "string") { + if (transform) { + value = transform.encryptString(value); + } + buffer.push(`(${escapeString(value)})`); + } else if (typeof value === "number") { + buffer.push(numberToString(value)); + } else if (typeof value === "boolean") { + buffer.push(value.toString()); + } else if (value instanceof Dict) { + await writeDict(value, buffer, transform); + } else if (value instanceof BaseStream) { + await writeStream(value, buffer, transform); + } else if (value === null) { + buffer.push("null"); + } else { + warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); + } +} +function writeInt(number, size, offset, buffer) { + for (let i = size + offset - 1; i > offset - 1; i--) { + buffer[i] = number & 0xff; + number >>= 8; + } + return offset + size; +} +function writeString(string, offset, buffer) { + for (let i = 0, len = string.length; i < len; i++) { + buffer[offset + i] = string.charCodeAt(i) & 0xff; + } +} +function computeMD5(filesize, xrefInfo) { + const time = Math.floor(Date.now() / 1000); + const filename = xrefInfo.filename || ""; + const md5Buffer = [time.toString(), filename, filesize.toString()]; + let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0); + for (const value of Object.values(xrefInfo.info)) { + md5Buffer.push(value); + md5BufferLen += value.length; + } + const array = new Uint8Array(md5BufferLen); + let offset = 0; + for (const str of md5Buffer) { + writeString(str, offset, array); + offset += str.length; + } + return bytesToString(calculateMD5(array)); +} +function writeXFADataForAcroform(str, changes) { + const xml = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(str); + for (const { + xfa + } of changes) { + if (!xfa) { + continue; + } + const { + path, + value + } = xfa; + if (!path) { + continue; + } + const nodePath = parseXFAPath(path); + let node = xml.documentElement.searchNode(nodePath, 0); + if (!node && nodePath.length > 1) { + node = xml.documentElement.searchNode([nodePath.at(-1)], 0); + } + if (node) { + node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)]; + } else { + warn(`Node not found for path: ${path}`); + } + } + const buffer = []; + xml.documentElement.dump(buffer); + return buffer.join(""); +} +async function updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes +}) { + if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { + warn("XFA - Cannot save it"); + } + if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { + return; + } + const dict = acroForm.clone(); + if (hasXfa && !hasXfaDatasetsEntry) { + const newXfa = acroForm.get("XFA").slice(); + newXfa.splice(2, 0, "datasets"); + newXfa.splice(3, 0, xfaDatasetsRef); + dict.set("XFA", newXfa); + } + if (needAppearances) { + dict.set("NeedAppearances", true); + } + changes.put(acroFormRef, { + data: dict + }); +} +function updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref +}) { + if (xfaData === null) { + const datasets = xref.fetchIfRef(xfaDatasetsRef); + xfaData = writeXFADataForAcroform(datasets.getString(), changes); + } + const xfaDataStream = new StringStream(xfaData); + xfaDataStream.dict = new Dict(xref); + xfaDataStream.dict.set("Type", Name.get("EmbeddedFile")); + changes.put(xfaDatasetsRef, { + data: xfaDataStream + }); +} +async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + buffer.push("xref\n"); + const indexes = getIndexes(newRefs); + let indexesPosition = 0; + for (const { + ref, + data + } of newRefs) { + if (ref.num === indexes[indexesPosition]) { + buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`); + indexesPosition += 2; + } + if (data !== null) { + buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`); + baseOffset += data.length; + } else { + buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`); + } + } + computeIDs(baseOffset, xrefInfo, newXref); + buffer.push("trailer\n"); + await writeDict(newXref, buffer); + buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function getIndexes(newRefs) { + const indexes = []; + for (const { + ref + } of newRefs) { + if (ref.num === indexes.at(-2) + indexes.at(-1)) { + indexes[indexes.length - 1] += 1; + } else { + indexes.push(ref.num, 1); + } + } + return indexes; +} +async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + const xrefTableData = []; + let maxOffset = 0; + let maxGen = 0; + for (const { + ref, + data + } of newRefs) { + let gen; + maxOffset = Math.max(maxOffset, baseOffset); + if (data !== null) { + gen = Math.min(ref.gen, 0xffff); + xrefTableData.push([1, baseOffset, gen]); + baseOffset += data.length; + } else { + gen = Math.min(ref.gen + 1, 0xffff); + xrefTableData.push([0, 0, gen]); + } + maxGen = Math.max(maxGen, gen); + } + newXref.set("Index", getIndexes(newRefs)); + const offsetSize = getSizeInBytes(maxOffset); + const maxGenSize = getSizeInBytes(maxGen); + const sizes = [1, offsetSize, maxGenSize]; + newXref.set("W", sizes); + computeIDs(baseOffset, xrefInfo, newXref); + const structSize = sizes.reduce((a, x) => a + x, 0); + const data = new Uint8Array(structSize * xrefTableData.length); + const stream = new Stream(data); + stream.dict = newXref; + let offset = 0; + for (const [type, objOffset, gen] of xrefTableData) { + offset = writeInt(type, sizes[0], offset, data); + offset = writeInt(objOffset, sizes[1], offset, data); + offset = writeInt(gen, sizes[2], offset, data); + } + await writeObject(xrefInfo.newRef, stream, buffer, {}); + buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function computeIDs(baseOffset, xrefInfo, newXref) { + if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { + const md5 = computeMD5(baseOffset, xrefInfo); + newXref.set("ID", [xrefInfo.fileIds[0], md5]); + } +} +function getTrailerDict(xrefInfo, changes, useXrefStream) { + const newXref = new Dict(null); + newXref.set("Prev", xrefInfo.startXRef); + const refForXrefTable = xrefInfo.newRef; + if (useXrefStream) { + changes.put(refForXrefTable, { + data: "" + }); + newXref.set("Size", refForXrefTable.num + 1); + newXref.set("Type", Name.get("XRef")); + } else { + newXref.set("Size", refForXrefTable.num); + } + if (xrefInfo.rootRef !== null) { + newXref.set("Root", xrefInfo.rootRef); + } + if (xrefInfo.infoRef !== null) { + newXref.set("Info", xrefInfo.infoRef); + } + if (xrefInfo.encryptRef !== null) { + newXref.set("Encrypt", xrefInfo.encryptRef); + } + return newXref; +} +async function writeChanges(changes, xref, buffer = []) { + const newRefs = []; + for (const [ref, { + data + }] of changes.items()) { + if (data === null || typeof data === "string") { + newRefs.push({ + ref, + data + }); + continue; + } + await writeObject(ref, data, buffer, xref); + newRefs.push({ + ref, + data: buffer.join("") + }); + buffer.length = 0; + } + return newRefs.sort((a, b) => a.ref.num - b.ref.num); +} +async function incrementalUpdate({ + originalData, + xrefInfo, + changes, + xref = null, + hasXfa = false, + xfaDatasetsRef = null, + hasXfaDatasetsEntry = false, + needAppearances, + acroFormRef = null, + acroForm = null, + xfaData = null, + useXrefStream = false +}) { + await updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes + }); + if (hasXfa) { + updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref + }); + } + const newXref = getTrailerDict(xrefInfo, changes, useXrefStream); + const buffer = []; + const newRefs = await writeChanges(changes, xref, buffer); + let baseOffset = originalData.length; + const lastByte = originalData.at(-1); + if (lastByte !== 0x0a && lastByte !== 0x0d) { + buffer.push("\n"); + baseOffset += 1; + } + for (const { + data + } of newRefs) { + if (data !== null) { + buffer.push(data); + } + } + await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); + const totalLength = buffer.reduce((a, str) => a + str.length, originalData.length); + const array = new Uint8Array(totalLength); + array.set(originalData); + let offset = originalData.length; + for (const str of buffer) { + writeString(str, offset, array); + offset += str.length; + } + return array; +} + +;// ./src/core/worker_stream.js + +class PDFWorkerStream { + constructor(msgHandler) { + this._msgHandler = msgHandler; + this._contentLength = null; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFWorkerStreamReader { + constructor(msgHandler) { + this._msgHandler = msgHandler; + this.onProgress = null; + this._contentLength = null; + this._isRangeSupported = false; + this._isStreamingSupported = false; + const readableStream = this._msgHandler.sendWithStream("GetReader"); + this._reader = readableStream.getReader(); + this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; + this._contentLength = data.contentLength; + }); + } + get headersReady() { + return this._headersReady; + } + get contentLength() { + return this._contentLength; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get isRangeSupported() { + return this._isRangeSupported; + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} +class PDFWorkerStreamRangeReader { + constructor(begin, end, msgHandler) { + this._msgHandler = msgHandler; + this.onProgress = null; + const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { + begin, + end + }); + this._reader = readableStream.getReader(); + } + get isStreamingSupported() { + return false; + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} + +;// ./src/core/worker.js + + + + + + + + + + +class WorkerTask { + constructor(name) { + this.name = name; + this.terminated = false; + this._capability = Promise.withResolvers(); + } + get finished() { + return this._capability.promise; + } + finish() { + this._capability.resolve(); + } + terminate() { + this.terminated = true; + } + ensureNotTerminated() { + if (this.terminated) { + throw new Error("Worker task was terminated"); + } + } +} +class WorkerMessageHandler { + static { + if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) { + this.initializeFromPort(self); + } + } + static setup(handler, port) { + let testMessageProcessed = false; + handler.on("test", data => { + if (testMessageProcessed) { + return; + } + testMessageProcessed = true; + handler.send("test", data instanceof Uint8Array); + }); + handler.on("configure", data => { + setVerbosityLevel(data.verbosity); + }); + handler.on("GetDocRequest", data => this.createDocumentHandler(data, port)); + } + static createDocumentHandler(docParams, port) { + let pdfManager; + let terminated = false; + let cancelXHRs = null; + const WorkerTasks = new Set(); + const verbosity = getVerbosityLevel(); + const { + docId, + apiVersion + } = docParams; + const workerVersion = "4.10.38"; + if (apiVersion !== workerVersion) { + throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); + } + const enumerableProperties = []; + for (const property in []) { + enumerableProperties.push(property); + } + if (enumerableProperties.length) { + throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s."); + } + const workerHandlerName = docId + "_worker"; + let handler = new MessageHandler(workerHandlerName, docId, port); + function ensureNotTerminated() { + if (terminated) { + throw new Error("Worker was terminated"); + } + } + function startWorkerTask(task) { + WorkerTasks.add(task); + } + function finishWorkerTask(task) { + task.finish(); + WorkerTasks.delete(task); + } + async function loadDocument(recoveryMode) { + await pdfManager.ensureDoc("checkHeader"); + await pdfManager.ensureDoc("parseStartXRef"); + await pdfManager.ensureDoc("parse", [recoveryMode]); + await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); + await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); + const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); + if (isPureXfa) { + const task = new WorkerTask("loadXfaFonts"); + startWorkerTask(task); + await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => finishWorkerTask(task)), pdfManager.loadXfaImages()]); + } + const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); + const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; + return { + numPages, + fingerprints, + htmlForXfa + }; + } + async function getPdfManager({ + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions + }) { + const pdfManagerArgs = { + source: null, + disableAutoFetch, + docBaseUrl, + docId, + enableXfa, + evaluatorOptions, + handler, + length, + password, + rangeChunkSize + }; + if (data) { + pdfManagerArgs.source = data; + return new LocalPdfManager(pdfManagerArgs); + } + const pdfStream = new PDFWorkerStream(handler), + fullRequest = pdfStream.getFullReader(); + const pdfManagerCapability = Promise.withResolvers(); + let newPdfManager, + cachedChunks = [], + loaded = 0; + fullRequest.headersReady.then(function () { + if (!fullRequest.isRangeSupported) { + return; + } + pdfManagerArgs.source = pdfStream; + pdfManagerArgs.length = fullRequest.contentLength; + pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; + newPdfManager = new NetworkPdfManager(pdfManagerArgs); + for (const chunk of cachedChunks) { + newPdfManager.sendProgressiveData(chunk); + } + cachedChunks = []; + pdfManagerCapability.resolve(newPdfManager); + cancelXHRs = null; + }).catch(function (reason) { + pdfManagerCapability.reject(reason); + cancelXHRs = null; + }); + new Promise(function (resolve, reject) { + const readChunk = function ({ + value, + done + }) { + try { + ensureNotTerminated(); + if (done) { + if (!newPdfManager) { + const pdfFile = arrayBuffersToBytes(cachedChunks); + cachedChunks = []; + if (length && pdfFile.length !== length) { + warn("reported HTTP length is different from actual"); + } + pdfManagerArgs.source = pdfFile; + newPdfManager = new LocalPdfManager(pdfManagerArgs); + pdfManagerCapability.resolve(newPdfManager); + } + cancelXHRs = null; + return; + } + loaded += value.byteLength; + if (!fullRequest.isStreamingSupported) { + handler.send("DocProgress", { + loaded, + total: Math.max(loaded, fullRequest.contentLength || 0) + }); + } + if (newPdfManager) { + newPdfManager.sendProgressiveData(value); + } else { + cachedChunks.push(value); + } + fullRequest.read().then(readChunk, reject); + } catch (e) { + reject(e); + } + }; + fullRequest.read().then(readChunk, reject); + }).catch(function (e) { + pdfManagerCapability.reject(e); + cancelXHRs = null; + }); + cancelXHRs = reason => { + pdfStream.cancelAllRequests(reason); + }; + return pdfManagerCapability.promise; + } + function setupDoc(data) { + function onSuccess(doc) { + ensureNotTerminated(); + handler.send("GetDoc", { + pdfInfo: doc + }); + } + function onFailure(ex) { + ensureNotTerminated(); + if (ex instanceof PasswordException) { + const task = new WorkerTask(`PasswordException: response ${ex.code}`); + startWorkerTask(task); + handler.sendWithPromise("PasswordRequest", ex).then(function ({ + password + }) { + finishWorkerTask(task); + pdfManager.updatePassword(password); + pdfManagerReady(); + }).catch(function () { + finishWorkerTask(task); + handler.send("DocException", ex); + }); + } else { + handler.send("DocException", wrapReason(ex)); + } + } + function pdfManagerReady() { + ensureNotTerminated(); + loadDocument(false).then(onSuccess, function (reason) { + ensureNotTerminated(); + if (!(reason instanceof XRefParseException)) { + onFailure(reason); + return; + } + pdfManager.requestLoadedStream().then(function () { + ensureNotTerminated(); + loadDocument(true).then(onSuccess, onFailure); + }); + }); + } + ensureNotTerminated(); + getPdfManager(data).then(function (newPdfManager) { + if (terminated) { + newPdfManager.terminate(new AbortException("Worker was terminated.")); + throw new Error("Worker was terminated"); + } + pdfManager = newPdfManager; + pdfManager.requestLoadedStream(true).then(stream => { + handler.send("DataLoaded", { + length: stream.bytes.byteLength + }); + }); + }).then(pdfManagerReady, onFailure); + } + handler.on("GetPage", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]).then(function ([rotate, ref, userUnit, view]) { + return { + rotate, + ref, + refStr: ref?.toString() ?? null, + userUnit, + view + }; + }); + }); + }); + handler.on("GetPageIndex", function (data) { + const pageRef = Ref.get(data.num, data.gen); + return pdfManager.ensureCatalog("getPageIndex", [pageRef]); + }); + handler.on("GetDestinations", function (data) { + return pdfManager.ensureCatalog("destinations"); + }); + handler.on("GetDestination", function (data) { + return pdfManager.ensureCatalog("getDestination", [data.id]); + }); + handler.on("GetPageLabels", function (data) { + return pdfManager.ensureCatalog("pageLabels"); + }); + handler.on("GetPageLayout", function (data) { + return pdfManager.ensureCatalog("pageLayout"); + }); + handler.on("GetPageMode", function (data) { + return pdfManager.ensureCatalog("pageMode"); + }); + handler.on("GetViewerPreferences", function (data) { + return pdfManager.ensureCatalog("viewerPreferences"); + }); + handler.on("GetOpenAction", function (data) { + return pdfManager.ensureCatalog("openAction"); + }); + handler.on("GetAttachments", function (data) { + return pdfManager.ensureCatalog("attachments"); + }); + handler.on("GetDocJSActions", function (data) { + return pdfManager.ensureCatalog("jsActions"); + }); + handler.on("GetPageJSActions", function ({ + pageIndex + }) { + return pdfManager.getPage(pageIndex).then(function (page) { + return pdfManager.ensure(page, "jsActions"); + }); + }); + handler.on("GetOutline", function (data) { + return pdfManager.ensureCatalog("documentOutline"); + }); + handler.on("GetOptionalContentConfig", function (data) { + return pdfManager.ensureCatalog("optionalContentConfig"); + }); + handler.on("GetPermissions", function (data) { + return pdfManager.ensureCatalog("permissions"); + }); + handler.on("GetMetadata", function (data) { + return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]); + }); + handler.on("GetMarkInfo", function (data) { + return pdfManager.ensureCatalog("markInfo"); + }); + handler.on("GetData", function (data) { + return pdfManager.requestLoadedStream().then(function (stream) { + return stream.bytes; + }); + }); + handler.on("GetAnnotations", function ({ + pageIndex, + intent + }) { + return pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); + startWorkerTask(task); + return page.getAnnotationsData(handler, task, intent).then(data => { + finishWorkerTask(task); + return data; + }, reason => { + finishWorkerTask(task); + throw reason; + }); + }); + }); + handler.on("GetFieldObjects", function (data) { + return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null); + }); + handler.on("HasJSActions", function (data) { + return pdfManager.ensureDoc("hasJSActions"); + }); + handler.on("GetCalculationOrderIds", function (data) { + return pdfManager.ensureDoc("calculationOrderIds"); + }); + handler.on("SaveDocument", async function ({ + isPureXfa, + numPages, + annotationStorage, + filename + }) { + const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot")]; + const changes = new RefSetCache(); + const promises = []; + const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null; + const [stream, acroForm, acroFormRef, startXRef, xref, linearization, _structTreeRoot] = await Promise.all(globalPromises); + const catalogRef = xref.trailer.getRaw("Root") || null; + let structTreeRoot; + if (newAnnotationsByPage) { + if (!_structTreeRoot) { + if (await StructTreeRoot.canCreateStructureTree({ + catalogRef, + pdfManager, + newAnnotationsByPage + })) { + structTreeRoot = null; + } + } else if (await _structTreeRoot.canUpdateStructTree({ + pdfManager, + xref, + newAnnotationsByPage + })) { + structTreeRoot = _structTreeRoot; + } + const imagePromises = AnnotationFactory.generateImages(annotationStorage.values(), xref, pdfManager.evaluatorOptions.isOffscreenCanvasSupported); + const newAnnotationPromises = structTreeRoot === undefined ? promises : []; + for (const [pageIndex, annotations] of newAnnotationsByPage) { + newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => { + const task = new WorkerTask(`Save (editor): page ${pageIndex}`); + startWorkerTask(task); + return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(function () { + finishWorkerTask(task); + }); + })); + } + if (structTreeRoot === null) { + promises.push(Promise.all(newAnnotationPromises).then(async () => { + await StructTreeRoot.createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + changes + }); + })); + } else if (structTreeRoot) { + promises.push(Promise.all(newAnnotationPromises).then(async () => { + await structTreeRoot.updateStructureTree({ + newAnnotationsByPage, + pdfManager, + changes + }); + })); + } + } + if (isPureXfa) { + promises.push(pdfManager.serializeXfaData(annotationStorage)); + } else { + for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { + promises.push(pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`Save: page ${pageIndex}`); + startWorkerTask(task); + return page.save(handler, task, annotationStorage, changes).finally(function () { + finishWorkerTask(task); + }); + })); + } + } + const refs = await Promise.all(promises); + let xfaData = null; + if (isPureXfa) { + xfaData = refs[0]; + if (!xfaData) { + return stream.bytes; + } + } else if (changes.size === 0) { + return stream.bytes; + } + const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances); + const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null; + let xfaDatasetsRef = null; + let hasXfaDatasetsEntry = false; + if (Array.isArray(xfa)) { + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + if (xfa[i] === "datasets") { + xfaDatasetsRef = xfa[i + 1]; + hasXfaDatasetsEntry = true; + } + } + if (xfaDatasetsRef === null) { + xfaDatasetsRef = xref.getNewTemporaryRef(); + } + } else if (xfa) { + warn("Unsupported XFA type."); + } + let newXrefInfo = Object.create(null); + if (xref.trailer) { + const infoObj = Object.create(null); + const xrefInfo = xref.trailer.get("Info") || null; + if (xrefInfo instanceof Dict) { + for (const [key, value] of xrefInfo) { + if (typeof value === "string") { + infoObj[key] = stringToPDFString(value); + } + } + } + newXrefInfo = { + rootRef: catalogRef, + encryptRef: xref.trailer.getRaw("Encrypt") || null, + newRef: xref.getNewTemporaryRef(), + infoRef: xref.trailer.getRaw("Info") || null, + info: infoObj, + fileIds: xref.trailer.get("ID") || null, + startXRef: linearization ? startXRef : xref.lastXRefStreamPos ?? startXRef, + filename + }; + } + return incrementalUpdate({ + originalData: stream.bytes, + xrefInfo: newXrefInfo, + changes, + xref, + hasXfa: !!xfa, + xfaDatasetsRef, + hasXfaDatasetsEntry, + needAppearances, + acroFormRef, + acroForm, + xfaData, + useXrefStream: isDict(xref.topDict, "XRef") + }).finally(() => { + xref.resetNewTemporaryRef(); + }); + }); + handler.on("GetOperatorList", function (data, sink) { + const pageIndex = data.pageIndex; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); + startWorkerTask(task); + const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; + page.getOperatorList({ + handler, + sink, + task, + intent: data.intent, + cacheKey: data.cacheKey, + annotationStorage: data.annotationStorage, + modifiedIds: data.modifiedIds + }).then(function (operatorListInfo) { + finishWorkerTask(task); + if (start) { + info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`); + } + sink.close(); + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }); + }); + }); + handler.on("GetTextContent", function (data, sink) { + const { + pageIndex, + includeMarkedContent, + disableNormalization + } = data; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask("GetTextContent: page " + pageIndex); + startWorkerTask(task); + const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; + page.extractTextContent({ + handler, + task, + sink, + includeMarkedContent, + disableNormalization + }).then(function () { + finishWorkerTask(task); + if (start) { + info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`); + } + sink.close(); + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }); + }); + }); + handler.on("GetStructTree", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return pdfManager.ensure(page, "getStructTree"); + }); + }); + handler.on("FontFallback", function (data) { + return pdfManager.fontFallback(data.id, handler); + }); + handler.on("Cleanup", function (data) { + return pdfManager.cleanup(true); + }); + handler.on("Terminate", function (data) { + terminated = true; + const waitOn = []; + if (pdfManager) { + pdfManager.terminate(new AbortException("Worker was terminated.")); + const cleanupPromise = pdfManager.cleanup(); + waitOn.push(cleanupPromise); + pdfManager = null; + } else { + clearGlobalCaches(); + } + cancelXHRs?.(new AbortException("Worker was terminated.")); + for (const task of WorkerTasks) { + waitOn.push(task.finished); + task.terminate(); + } + return Promise.all(waitOn).then(function () { + handler.destroy(); + handler = null; + }); + }); + handler.on("Ready", function (data) { + setupDoc(docParams); + docParams = null; + }); + return workerHandlerName; + } + static initializeFromPort(port) { + const handler = new MessageHandler("worker", "main", port); + this.setup(handler, port); + handler.send("ready", null); + } +} + +;// ./src/pdf.worker.js + +const pdfjsVersion = "4.10.38"; +const pdfjsBuild = "f9bea397f"; + +var __webpack_exports__WorkerMessageHandler = __webpack_exports__.WorkerMessageHandler; +export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler }; + +//# sourceMappingURL=pdf.worker.mjs.map \ No newline at end of file diff --git a/public/pdfjs/web/debugger.css b/public/pdfjs/web/debugger.css new file mode 100644 index 0000000..b9d9f81 --- /dev/null +++ b/public/pdfjs/web/debugger.css @@ -0,0 +1,111 @@ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --panel-width: 300px; +} + +#PDFBug, +#PDFBug :is(input, button, select) { + font: message-box; +} +#PDFBug { + background-color: rgb(255 255 255); + border: 1px solid rgb(102 102 102); + position: fixed; + top: 32px; + right: 0; + bottom: 0; + font-size: 10px; + padding: 0; + width: var(--panel-width); +} +#PDFBug .controls { + background: rgb(238 238 238); + border-bottom: 1px solid rgb(102 102 102); + padding: 3px; +} +#PDFBug .panels { + inset: 27px 0 0; + overflow: auto; + position: absolute; +} +#PDFBug .panels > div { + padding: 5px; +} +#PDFBug button.active { + font-weight: bold; +} +.debuggerShowText, +.debuggerHideText:hover { + background-color: rgb(255 255 0 / 0.25); +} +#PDFBug .stats { + font-family: courier; + font-size: 10px; + white-space: pre; +} +#PDFBug .stats .title { + font-weight: bold; +} +#PDFBug table { + font-size: 10px; + white-space: pre; +} +#PDFBug table.showText { + border-collapse: collapse; + text-align: center; +} +#PDFBug table.showText, +#PDFBug table.showText :is(tr, td) { + border: 1px solid black; + padding: 1px; +} +#PDFBug table.showText td.advance { + color: grey; +} + +#viewer.textLayer-visible .textLayer { + opacity: 1; +} + +#viewer.textLayer-visible .canvasWrapper { + background-color: rgb(128 255 128); +} + +#viewer.textLayer-visible .canvasWrapper canvas { + mix-blend-mode: screen; +} + +#viewer.textLayer-visible .textLayer span { + background-color: rgb(255 255 0 / 0.1); + color: rgb(0 0 0); + border: solid 1px rgb(255 0 0 / 0.5); + box-sizing: border-box; +} + +#viewer.textLayer-visible .textLayer span[aria-owns] { + background-color: rgb(255 0 0 / 0.3); +} + +#viewer.textLayer-hover .textLayer span:hover { + background-color: rgb(255 255 255); + color: rgb(0 0 0); +} + +#viewer.textLayer-shadow .textLayer span { + background-color: rgb(255 255 255 / 0.6); + color: rgb(0 0 0); +} diff --git a/public/pdfjs/web/debugger.mjs b/public/pdfjs/web/debugger.mjs new file mode 100644 index 0000000..59c1871 --- /dev/null +++ b/public/pdfjs/web/debugger.mjs @@ -0,0 +1,623 @@ +/* Copyright 2012 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { OPS } = globalThis.pdfjsLib || (await import("pdfjs-lib")); + +const opMap = Object.create(null); +for (const key in OPS) { + opMap[OPS[key]] = key; +} + +const FontInspector = (function FontInspectorClosure() { + let fonts; + let active = false; + const fontAttribute = "data-font-name"; + function removeSelection() { + const divs = document.querySelectorAll(`span[${fontAttribute}]`); + for (const div of divs) { + div.className = ""; + } + } + function resetSelection() { + const divs = document.querySelectorAll(`span[${fontAttribute}]`); + for (const div of divs) { + div.className = "debuggerHideText"; + } + } + function selectFont(fontName, show) { + const divs = document.querySelectorAll( + `span[${fontAttribute}=${fontName}]` + ); + for (const div of divs) { + div.className = show ? "debuggerShowText" : "debuggerHideText"; + } + } + function textLayerClick(e) { + if ( + !e.target.dataset.fontName || + e.target.tagName.toUpperCase() !== "SPAN" + ) { + return; + } + const fontName = e.target.dataset.fontName; + const selects = document.getElementsByTagName("input"); + for (const select of selects) { + if (select.dataset.fontName !== fontName) { + continue; + } + select.checked = !select.checked; + selectFont(fontName, select.checked); + select.scrollIntoView(); + } + } + return { + // Properties/functions needed by PDFBug. + id: "FontInspector", + name: "Font Inspector", + panel: null, + manager: null, + init() { + const panel = this.panel; + const tmp = document.createElement("button"); + tmp.addEventListener("click", resetSelection); + tmp.textContent = "Refresh"; + panel.append(tmp); + + fonts = document.createElement("div"); + panel.append(fonts); + }, + cleanup() { + fonts.textContent = ""; + }, + enabled: false, + get active() { + return active; + }, + set active(value) { + active = value; + if (active) { + document.body.addEventListener("click", textLayerClick, true); + resetSelection(); + } else { + document.body.removeEventListener("click", textLayerClick, true); + removeSelection(); + } + }, + // FontInspector specific functions. + fontAdded(fontObj, url) { + function properties(obj, list) { + const moreInfo = document.createElement("table"); + for (const entry of list) { + const tr = document.createElement("tr"); + const td1 = document.createElement("td"); + td1.textContent = entry; + tr.append(td1); + const td2 = document.createElement("td"); + td2.textContent = obj[entry].toString(); + tr.append(td2); + moreInfo.append(tr); + } + return moreInfo; + } + + const moreInfo = fontObj.css + ? properties(fontObj, ["baseFontName"]) + : properties(fontObj, ["name", "type"]); + + const fontName = fontObj.loadedName; + const font = document.createElement("div"); + const name = document.createElement("span"); + name.textContent = fontName; + let download; + if (!fontObj.css) { + download = document.createElement("a"); + if (url) { + url = /url\(['"]?([^)"']+)/.exec(url); + download.href = url[1]; + } else if (fontObj.data) { + download.href = URL.createObjectURL( + new Blob([fontObj.data], { type: fontObj.mimetype }) + ); + } + download.textContent = "Download"; + } + + const logIt = document.createElement("a"); + logIt.href = ""; + logIt.textContent = "Log"; + logIt.addEventListener("click", function (event) { + event.preventDefault(); + console.log(fontObj); + }); + const select = document.createElement("input"); + select.setAttribute("type", "checkbox"); + select.dataset.fontName = fontName; + select.addEventListener("click", function () { + selectFont(fontName, select.checked); + }); + if (download) { + font.append(select, name, " ", download, " ", logIt, moreInfo); + } else { + font.append(select, name, " ", logIt, moreInfo); + } + fonts.append(font); + // Somewhat of a hack, should probably add a hook for when the text layer + // is done rendering. + setTimeout(() => { + if (this.active) { + resetSelection(); + } + }, 2000); + }, + }; +})(); + +// Manages all the page steppers. +const StepperManager = (function StepperManagerClosure() { + let steppers = []; + let stepperDiv = null; + let stepperControls = null; + let stepperChooser = null; + let breakPoints = Object.create(null); + return { + // Properties/functions needed by PDFBug. + id: "Stepper", + name: "Stepper", + panel: null, + manager: null, + init() { + const self = this; + stepperControls = document.createElement("div"); + stepperChooser = document.createElement("select"); + stepperChooser.addEventListener("change", function (event) { + self.selectStepper(this.value); + }); + stepperControls.append(stepperChooser); + stepperDiv = document.createElement("div"); + this.panel.append(stepperControls, stepperDiv); + if (sessionStorage.getItem("pdfjsBreakPoints")) { + breakPoints = JSON.parse(sessionStorage.getItem("pdfjsBreakPoints")); + } + }, + cleanup() { + stepperChooser.textContent = ""; + stepperDiv.textContent = ""; + steppers = []; + }, + enabled: false, + active: false, + // Stepper specific functions. + create(pageIndex) { + const debug = document.createElement("div"); + debug.id = "stepper" + pageIndex; + debug.hidden = true; + debug.className = "stepper"; + stepperDiv.append(debug); + const b = document.createElement("option"); + b.textContent = "Page " + (pageIndex + 1); + b.value = pageIndex; + stepperChooser.append(b); + const initBreakPoints = breakPoints[pageIndex] || []; + const stepper = new Stepper(debug, pageIndex, initBreakPoints); + steppers.push(stepper); + if (steppers.length === 1) { + this.selectStepper(pageIndex, false); + } + return stepper; + }, + selectStepper(pageIndex, selectPanel) { + pageIndex |= 0; + if (selectPanel) { + this.manager.selectPanel(this); + } + for (const stepper of steppers) { + stepper.panel.hidden = stepper.pageIndex !== pageIndex; + } + for (const option of stepperChooser.options) { + option.selected = (option.value | 0) === pageIndex; + } + }, + saveBreakPoints(pageIndex, bps) { + breakPoints[pageIndex] = bps; + sessionStorage.setItem("pdfjsBreakPoints", JSON.stringify(breakPoints)); + }, + }; +})(); + +// The stepper for each page's operatorList. +class Stepper { + // Shorter way to create element and optionally set textContent. + #c(tag, textContent) { + const d = document.createElement(tag); + if (textContent) { + d.textContent = textContent; + } + return d; + } + + #simplifyArgs(args) { + if (typeof args === "string") { + const MAX_STRING_LENGTH = 75; + return args.length <= MAX_STRING_LENGTH + ? args + : args.substring(0, MAX_STRING_LENGTH) + "..."; + } + if (typeof args !== "object" || args === null) { + return args; + } + if ("length" in args) { + // array + const MAX_ITEMS = 10, + simpleArgs = []; + let i, ii; + for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) { + simpleArgs.push(this.#simplifyArgs(args[i])); + } + if (i < args.length) { + simpleArgs.push("..."); + } + return simpleArgs; + } + const simpleObj = {}; + for (const key in args) { + simpleObj[key] = this.#simplifyArgs(args[key]); + } + return simpleObj; + } + + constructor(panel, pageIndex, initialBreakPoints) { + this.panel = panel; + this.breakPoint = 0; + this.nextBreakPoint = null; + this.pageIndex = pageIndex; + this.breakPoints = initialBreakPoints; + this.currentIdx = -1; + this.operatorListIdx = 0; + this.indentLevel = 0; + } + + init(operatorList) { + const panel = this.panel; + const content = this.#c("div", "c=continue, s=step"); + const table = this.#c("table"); + content.append(table); + table.cellSpacing = 0; + const headerRow = this.#c("tr"); + table.append(headerRow); + headerRow.append( + this.#c("th", "Break"), + this.#c("th", "Idx"), + this.#c("th", "fn"), + this.#c("th", "args") + ); + panel.append(content); + this.table = table; + this.updateOperatorList(operatorList); + } + + updateOperatorList(operatorList) { + const self = this; + + function cboxOnClick() { + const x = +this.dataset.idx; + if (this.checked) { + self.breakPoints.push(x); + } else { + self.breakPoints.splice(self.breakPoints.indexOf(x), 1); + } + StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints); + } + + const MAX_OPERATORS_COUNT = 15000; + if (this.operatorListIdx > MAX_OPERATORS_COUNT) { + return; + } + + const chunk = document.createDocumentFragment(); + const operatorsToDisplay = Math.min( + MAX_OPERATORS_COUNT, + operatorList.fnArray.length + ); + for (let i = this.operatorListIdx; i < operatorsToDisplay; i++) { + const line = this.#c("tr"); + line.className = "line"; + line.dataset.idx = i; + chunk.append(line); + const checked = this.breakPoints.includes(i); + const args = operatorList.argsArray[i] || []; + + const breakCell = this.#c("td"); + const cbox = this.#c("input"); + cbox.type = "checkbox"; + cbox.className = "points"; + cbox.checked = checked; + cbox.dataset.idx = i; + cbox.onclick = cboxOnClick; + + breakCell.append(cbox); + line.append(breakCell, this.#c("td", i.toString())); + const fn = opMap[operatorList.fnArray[i]]; + let decArgs = args; + if (fn === "showText") { + const glyphs = args[0]; + const charCodeRow = this.#c("tr"); + const fontCharRow = this.#c("tr"); + const unicodeRow = this.#c("tr"); + for (const glyph of glyphs) { + if (typeof glyph === "object" && glyph !== null) { + charCodeRow.append(this.#c("td", glyph.originalCharCode)); + fontCharRow.append(this.#c("td", glyph.fontChar)); + unicodeRow.append(this.#c("td", glyph.unicode)); + } else { + // null or number + const advanceEl = this.#c("td", glyph); + advanceEl.classList.add("advance"); + charCodeRow.append(advanceEl); + fontCharRow.append(this.#c("td")); + unicodeRow.append(this.#c("td")); + } + } + decArgs = this.#c("td"); + const table = this.#c("table"); + table.classList.add("showText"); + decArgs.append(table); + table.append(charCodeRow, fontCharRow, unicodeRow); + } else if (fn === "restore" && this.indentLevel > 0) { + this.indentLevel--; + } + line.append(this.#c("td", " ".repeat(this.indentLevel * 2) + fn)); + if (fn === "save") { + this.indentLevel++; + } + + if (decArgs instanceof HTMLElement) { + line.append(decArgs); + } else { + line.append(this.#c("td", JSON.stringify(this.#simplifyArgs(decArgs)))); + } + } + if (operatorsToDisplay < operatorList.fnArray.length) { + const lastCell = this.#c("td", "..."); + lastCell.colspan = 4; + chunk.append(lastCell); + } + this.operatorListIdx = operatorList.fnArray.length; + this.table.append(chunk); + } + + getNextBreakPoint() { + this.breakPoints.sort(function (a, b) { + return a - b; + }); + for (const breakPoint of this.breakPoints) { + if (breakPoint > this.currentIdx) { + return breakPoint; + } + } + return null; + } + + breakIt(idx, callback) { + StepperManager.selectStepper(this.pageIndex, true); + this.currentIdx = idx; + + const listener = evt => { + switch (evt.keyCode) { + case 83: // step + document.removeEventListener("keydown", listener); + this.nextBreakPoint = this.currentIdx + 1; + this.goTo(-1); + callback(); + break; + case 67: // continue + document.removeEventListener("keydown", listener); + this.nextBreakPoint = this.getNextBreakPoint(); + this.goTo(-1); + callback(); + break; + } + }; + document.addEventListener("keydown", listener); + this.goTo(idx); + } + + goTo(idx) { + const allRows = this.panel.getElementsByClassName("line"); + for (const row of allRows) { + if ((row.dataset.idx | 0) === idx) { + row.style.backgroundColor = "rgb(251,250,207)"; + row.scrollIntoView(); + } else { + row.style.backgroundColor = null; + } + } + } +} + +const Stats = (function Stats() { + let stats = []; + function clear(node) { + node.textContent = ""; // Remove any `node` contents from the DOM. + } + function getStatIndex(pageNumber) { + for (const [i, stat] of stats.entries()) { + if (stat.pageNumber === pageNumber) { + return i; + } + } + return false; + } + return { + // Properties/functions needed by PDFBug. + id: "Stats", + name: "Stats", + panel: null, + manager: null, + init() {}, + enabled: false, + active: false, + // Stats specific functions. + add(pageNumber, stat) { + if (!stat) { + return; + } + const statsIndex = getStatIndex(pageNumber); + if (statsIndex !== false) { + stats[statsIndex].div.remove(); + stats.splice(statsIndex, 1); + } + const wrapper = document.createElement("div"); + wrapper.className = "stats"; + const title = document.createElement("div"); + title.className = "title"; + title.textContent = "Page: " + pageNumber; + const statsDiv = document.createElement("div"); + statsDiv.textContent = stat.toString(); + wrapper.append(title, statsDiv); + stats.push({ pageNumber, div: wrapper }); + stats.sort(function (a, b) { + return a.pageNumber - b.pageNumber; + }); + clear(this.panel); + for (const entry of stats) { + this.panel.append(entry.div); + } + }, + cleanup() { + stats = []; + clear(this.panel); + }, + }; +})(); + +// Manages all the debugging tools. +class PDFBug { + static #buttons = []; + + static #activePanel = null; + + static tools = [FontInspector, StepperManager, Stats]; + + static enable(ids) { + const all = ids.length === 1 && ids[0] === "all"; + const tools = this.tools; + for (const tool of tools) { + if (all || ids.includes(tool.id)) { + tool.enabled = true; + } + } + if (!all) { + // Sort the tools by the order they are enabled. + tools.sort(function (a, b) { + let indexA = ids.indexOf(a.id); + indexA = indexA < 0 ? tools.length : indexA; + let indexB = ids.indexOf(b.id); + indexB = indexB < 0 ? tools.length : indexB; + return indexA - indexB; + }); + } + } + + static init(container, ids) { + this.loadCSS(); + this.enable(ids); + /* + * Basic Layout: + * PDFBug + * Controls + * Panels + * Panel + * Panel + * ... + */ + const ui = document.createElement("div"); + ui.id = "PDFBug"; + + const controls = document.createElement("div"); + controls.setAttribute("class", "controls"); + ui.append(controls); + + const panels = document.createElement("div"); + panels.setAttribute("class", "panels"); + ui.append(panels); + + container.append(ui); + container.style.right = "var(--panel-width)"; + + // Initialize all the debugging tools. + for (const tool of this.tools) { + const panel = document.createElement("div"); + const panelButton = document.createElement("button"); + panelButton.textContent = tool.name; + panelButton.addEventListener("click", event => { + event.preventDefault(); + this.selectPanel(tool); + }); + controls.append(panelButton); + panels.append(panel); + tool.panel = panel; + tool.manager = this; + if (tool.enabled) { + tool.init(); + } else { + panel.textContent = + `${tool.name} is disabled. To enable add "${tool.id}" to ` + + "the pdfBug parameter and refresh (separate multiple by commas)."; + } + this.#buttons.push(panelButton); + } + this.selectPanel(0); + } + + static loadCSS() { + const { url } = import.meta; + + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = url.replace(/\.mjs$/, ".css"); + + document.head.append(link); + } + + static cleanup() { + for (const tool of this.tools) { + if (tool.enabled) { + tool.cleanup(); + } + } + } + + static selectPanel(index) { + if (typeof index !== "number") { + index = this.tools.indexOf(index); + } + if (index === this.#activePanel) { + return; + } + this.#activePanel = index; + for (const [j, tool] of this.tools.entries()) { + const isActive = j === index; + this.#buttons[j].classList.toggle("active", isActive); + tool.active = isActive; + tool.panel.hidden = !isActive; + } + } +} + +globalThis.FontInspector = FontInspector; +globalThis.StepperManager = StepperManager; +globalThis.Stats = Stats; + +export { PDFBug }; diff --git a/public/pdfjs/web/images/altText_add.svg b/public/pdfjs/web/images/altText_add.svg new file mode 100644 index 0000000..3451b53 --- /dev/null +++ b/public/pdfjs/web/images/altText_add.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/altText_disclaimer.svg b/public/pdfjs/web/images/altText_disclaimer.svg new file mode 100644 index 0000000..6fe79e7 --- /dev/null +++ b/public/pdfjs/web/images/altText_disclaimer.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/altText_done.svg b/public/pdfjs/web/images/altText_done.svg new file mode 100644 index 0000000..f54924e --- /dev/null +++ b/public/pdfjs/web/images/altText_done.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/altText_spinner.svg b/public/pdfjs/web/images/altText_spinner.svg new file mode 100644 index 0000000..fedb472 --- /dev/null +++ b/public/pdfjs/web/images/altText_spinner.svg @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/public/pdfjs/web/images/altText_warning.svg b/public/pdfjs/web/images/altText_warning.svg new file mode 100644 index 0000000..03014ce --- /dev/null +++ b/public/pdfjs/web/images/altText_warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/annotation-check.svg b/public/pdfjs/web/images/annotation-check.svg new file mode 100644 index 0000000..71cd16d --- /dev/null +++ b/public/pdfjs/web/images/annotation-check.svg @@ -0,0 +1,11 @@ + + + + diff --git a/public/pdfjs/web/images/annotation-comment.svg b/public/pdfjs/web/images/annotation-comment.svg new file mode 100644 index 0000000..86f1f17 --- /dev/null +++ b/public/pdfjs/web/images/annotation-comment.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/public/pdfjs/web/images/annotation-help.svg b/public/pdfjs/web/images/annotation-help.svg new file mode 100644 index 0000000..00938fe --- /dev/null +++ b/public/pdfjs/web/images/annotation-help.svg @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/public/pdfjs/web/images/annotation-insert.svg b/public/pdfjs/web/images/annotation-insert.svg new file mode 100644 index 0000000..519ef68 --- /dev/null +++ b/public/pdfjs/web/images/annotation-insert.svg @@ -0,0 +1,10 @@ + + + + diff --git a/public/pdfjs/web/images/annotation-key.svg b/public/pdfjs/web/images/annotation-key.svg new file mode 100644 index 0000000..8d09d53 --- /dev/null +++ b/public/pdfjs/web/images/annotation-key.svg @@ -0,0 +1,11 @@ + + + + diff --git a/public/pdfjs/web/images/annotation-newparagraph.svg b/public/pdfjs/web/images/annotation-newparagraph.svg new file mode 100644 index 0000000..38d2497 --- /dev/null +++ b/public/pdfjs/web/images/annotation-newparagraph.svg @@ -0,0 +1,11 @@ + + + + diff --git a/public/pdfjs/web/images/annotation-noicon.svg b/public/pdfjs/web/images/annotation-noicon.svg new file mode 100644 index 0000000..c07d108 --- /dev/null +++ b/public/pdfjs/web/images/annotation-noicon.svg @@ -0,0 +1,7 @@ + + + diff --git a/public/pdfjs/web/images/annotation-note.svg b/public/pdfjs/web/images/annotation-note.svg new file mode 100644 index 0000000..7017365 --- /dev/null +++ b/public/pdfjs/web/images/annotation-note.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/public/pdfjs/web/images/annotation-paperclip.svg b/public/pdfjs/web/images/annotation-paperclip.svg new file mode 100644 index 0000000..2bed225 --- /dev/null +++ b/public/pdfjs/web/images/annotation-paperclip.svg @@ -0,0 +1,6 @@ + + + + diff --git a/public/pdfjs/web/images/annotation-paragraph.svg b/public/pdfjs/web/images/annotation-paragraph.svg new file mode 100644 index 0000000..6ae5212 --- /dev/null +++ b/public/pdfjs/web/images/annotation-paragraph.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/public/pdfjs/web/images/annotation-pushpin.svg b/public/pdfjs/web/images/annotation-pushpin.svg new file mode 100644 index 0000000..6e0896c --- /dev/null +++ b/public/pdfjs/web/images/annotation-pushpin.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/public/pdfjs/web/images/cursor-editorFreeHighlight.svg b/public/pdfjs/web/images/cursor-editorFreeHighlight.svg new file mode 100644 index 0000000..513f6bd --- /dev/null +++ b/public/pdfjs/web/images/cursor-editorFreeHighlight.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/pdfjs/web/images/cursor-editorFreeText.svg b/public/pdfjs/web/images/cursor-editorFreeText.svg new file mode 100644 index 0000000..de2838e --- /dev/null +++ b/public/pdfjs/web/images/cursor-editorFreeText.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/cursor-editorInk.svg b/public/pdfjs/web/images/cursor-editorInk.svg new file mode 100644 index 0000000..1dadb5c --- /dev/null +++ b/public/pdfjs/web/images/cursor-editorInk.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/pdfjs/web/images/cursor-editorTextHighlight.svg b/public/pdfjs/web/images/cursor-editorTextHighlight.svg new file mode 100644 index 0000000..800340c --- /dev/null +++ b/public/pdfjs/web/images/cursor-editorTextHighlight.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/pdfjs/web/images/editor-toolbar-delete.svg b/public/pdfjs/web/images/editor-toolbar-delete.svg new file mode 100644 index 0000000..f84520d --- /dev/null +++ b/public/pdfjs/web/images/editor-toolbar-delete.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/public/pdfjs/web/images/findbarButton-next.svg b/public/pdfjs/web/images/findbarButton-next.svg new file mode 100644 index 0000000..8cb39be --- /dev/null +++ b/public/pdfjs/web/images/findbarButton-next.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/findbarButton-previous.svg b/public/pdfjs/web/images/findbarButton-previous.svg new file mode 100644 index 0000000..b610879 --- /dev/null +++ b/public/pdfjs/web/images/findbarButton-previous.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/gv-toolbarButton-download.svg b/public/pdfjs/web/images/gv-toolbarButton-download.svg new file mode 100644 index 0000000..d56cf3c --- /dev/null +++ b/public/pdfjs/web/images/gv-toolbarButton-download.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/loading-icon.gif b/public/pdfjs/web/images/loading-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c72ebb554be018511ae972c3f2361dff02dce02 GIT binary patch literal 2545 zcma*pX;2es8VB%~zPr=ibVMCx-JQ^BhLDAsK)^**h(ZDp9YGuzZ%~j!}+w%FI;|aC7){7CdVvG)P{bng1y9Te*f}~*`1kQl$jwb z$tlW~rRS!X?#xfm_&6tTdp_`cjgYwbRFLNdoJCN$S-yhg`ZnC-yvedRSmOh%;Y`Gl6bY$Z-}#C=#F4%9!I1b zWQ~f+9P?;vhCxWwlwl=lrWG|7IYo;{jjmzJ5R9?f>n%-d@>kLINUc z4wM5dAO;kq<$}Dk{2-u0$I6@2N}&cUx9nmV1dYc8jfC}%=F9WCg^OQK9C6poh#2!A z3^EU*UFZvS^)?bu3T?J;@Ahb~%I?+@4!l5!*TjC}GIslNan-RCrrd~PdHYnNLJk+m&`$Y+NV(e>CCu%R#_8GqY4cv#j`#uRWdsg9DxWy(?oOvgCU}&@jy%c!H&-Q zqXJxajAtmQRoRa9V-RFXXh-bK*;Fum{BjpkYQGX~i@OZ^Dx0n&H}kvGKqQ?w(6iGXu_g08T|_hp#ZvFzIwKF*a=oMJ~3UGAjZ?g}GOxm44td zXoyYrU*I=y*vHv89hkYH(v5R#wc)BC3dZJKb3K)f>zaM3%JP(mpecViP0eKKYf3zy z->jx_mc?mCtPEvCQ?uppk?eLJt}_IR7giW%Jr)RyI!+E-voIs*lXI*z`GQc_&D#X( z{6G};HPYj6O|$lXxBJeDaweqa{4L=tOZCjTI^&UOxXg})LRG_cr^B9Rqt(i5ORbQX zq`_xCRsH>xEYY%&*Nyi#{S_JZNlTm#K56`RI%7^amom;*h90Si&g1CfaFV3D|a!`3Y-GKKbL*KSbl z>I96`TR@CqPJl(>QqB~RvK~-U)`e`l4LIqj+IU^~yyIe*|BRVB>4Bup%j{tLdKz4j zY^<8P8m~GRGz*yv0&-RJE+-keJ+%m3wNeopzsltWd->eWmBVwUr)pX` zK~CD<;~Z*Uy3W`3+MrEYxm5qYQ!z%YI;y7DTG`UVH0;@{M{!B&id_}3DBQ?zsotuR zEGLdRx25nLm%-wjlnEi;-aN_1S7???rO~WgA67jjr&(vRa3y$u#kqJbeKnw z{!T!1li9>M+sJ6AUe+*9d}2uGjhzd z|L1Rtp8uTGYyZoQ*`DS^m2dw-X{a)l+3m?ncvn^+O>)hdd3(hMtlhkRGns{<8c0I! zDDjpmwtj?@!6kA|iu3q+Ai;@JR+ zfk+ln&YFC{4bhK6IxVgLs4W%^8Lk`qzWU*L>yq0A3;l}{!wKZ!ue)C)SKI)9dl1hl zhIRLV@8E}rwvE{gX(}$f6x*k)_`*Ijt1=EU-Ls6-(phomeQBgtUs z5Xz~Cd*nE)Ac!0i4ep}Z1AugMB(&F?)#CU{Qc{Sp^vKsdL}vRB30H+Bbzrn`M##H3 z{W8dc_mDroEE+p8_}mnJtzZ4!RNe)zhB)Ds;S57nYSJxtek>^~&(7B+N5MPf2+2xx z5Dl&4X|c@f{Kd|z1r+N|$DmsoVp*3yOdxT^J^-VAk)Z@$4^XrPrFP-Co+MXZ+KJ(W z{JNYvraLLWA;&tRhIKOvhW|HC|L-dLvAUF(MG0(Nl?4tB{RzN7I(}Cb%hwN{crFC8 zji#aJElKvDFV+&VI1V?oUMA>*kto0^;3W8FQBSZ|{ z$v~TqE=(8DZa^i$^oht&h};P1N&wMXorKh*Z68gPV&ouy>%f36Oqkwemyeas$Qbz# zV?7Jy%o7KY6^I=P@eCji%W`o5sf(5hySYo9$l4e2`(hIV_?=H-#R6}0$WVA|*(K@3 z=5?@RlcLh(meW%A4)hGzcvEpm(_w?>zhL*i&s9$2>r zAtk{8Cia|+Y+V!uX9BtpXoF%lswuRKsM!pSs!?yhlCy!269K0|b M?FSZn2B>%I-}ej|s{jB1 literal 0 HcmV?d00001 diff --git a/public/pdfjs/web/images/loading.svg b/public/pdfjs/web/images/loading.svg new file mode 100644 index 0000000..0a15ff6 --- /dev/null +++ b/public/pdfjs/web/images/loading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/pdfjs/web/images/messageBar_closingButton.svg b/public/pdfjs/web/images/messageBar_closingButton.svg new file mode 100644 index 0000000..8a40715 --- /dev/null +++ b/public/pdfjs/web/images/messageBar_closingButton.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/messageBar_warning.svg b/public/pdfjs/web/images/messageBar_warning.svg new file mode 100644 index 0000000..011cfcf --- /dev/null +++ b/public/pdfjs/web/images/messageBar_warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg b/public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg new file mode 100644 index 0000000..dd3917b --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg b/public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg new file mode 100644 index 0000000..f5c917f --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-handTool.svg b/public/pdfjs/web/images/secondaryToolbarButton-handTool.svg new file mode 100644 index 0000000..b7073b5 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-handTool.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg b/public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg new file mode 100644 index 0000000..c04f650 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg b/public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg new file mode 100644 index 0000000..da73a1b --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg b/public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg new file mode 100644 index 0000000..c41ce73 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg new file mode 100644 index 0000000..fb440b9 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg new file mode 100644 index 0000000..64a9f50 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg new file mode 100644 index 0000000..dc7e805 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg new file mode 100644 index 0000000..75fe26b --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg b/public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg new file mode 100644 index 0000000..94d5141 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg b/public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg new file mode 100644 index 0000000..ce201e3 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg b/public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg new file mode 100644 index 0000000..e8d487f --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg b/public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg new file mode 100644 index 0000000..9211a42 --- /dev/null +++ b/public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-bookmark.svg b/public/pdfjs/web/images/toolbarButton-bookmark.svg new file mode 100644 index 0000000..c4c37c9 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-bookmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg b/public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg new file mode 100644 index 0000000..01e6762 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-download.svg b/public/pdfjs/web/images/toolbarButton-download.svg new file mode 100644 index 0000000..e2e850a --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/pdfjs/web/images/toolbarButton-editorFreeText.svg b/public/pdfjs/web/images/toolbarButton-editorFreeText.svg new file mode 100644 index 0000000..13a67bd --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-editorFreeText.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/pdfjs/web/images/toolbarButton-editorHighlight.svg b/public/pdfjs/web/images/toolbarButton-editorHighlight.svg new file mode 100644 index 0000000..b3cd7fd --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-editorHighlight.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/pdfjs/web/images/toolbarButton-editorInk.svg b/public/pdfjs/web/images/toolbarButton-editorInk.svg new file mode 100644 index 0000000..b579eec --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-editorInk.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/pdfjs/web/images/toolbarButton-editorStamp.svg b/public/pdfjs/web/images/toolbarButton-editorStamp.svg new file mode 100644 index 0000000..a1fef49 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-editorStamp.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/public/pdfjs/web/images/toolbarButton-menuArrow.svg b/public/pdfjs/web/images/toolbarButton-menuArrow.svg new file mode 100644 index 0000000..82ffeaa --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-menuArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-openFile.svg b/public/pdfjs/web/images/toolbarButton-openFile.svg new file mode 100644 index 0000000..e773781 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-openFile.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-pageDown.svg b/public/pdfjs/web/images/toolbarButton-pageDown.svg new file mode 100644 index 0000000..1fc12e7 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-pageDown.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-pageUp.svg b/public/pdfjs/web/images/toolbarButton-pageUp.svg new file mode 100644 index 0000000..0936b9a --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-pageUp.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-presentationMode.svg b/public/pdfjs/web/images/toolbarButton-presentationMode.svg new file mode 100644 index 0000000..901d567 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-presentationMode.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-print.svg b/public/pdfjs/web/images/toolbarButton-print.svg new file mode 100644 index 0000000..97a3904 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-print.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-search.svg b/public/pdfjs/web/images/toolbarButton-search.svg new file mode 100644 index 0000000..0cc7ae2 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-search.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg b/public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg new file mode 100644 index 0000000..cace863 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-sidebarToggle.svg b/public/pdfjs/web/images/toolbarButton-sidebarToggle.svg new file mode 100644 index 0000000..1d8d0e4 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-sidebarToggle.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-viewAttachments.svg b/public/pdfjs/web/images/toolbarButton-viewAttachments.svg new file mode 100644 index 0000000..ab73f6e --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-viewAttachments.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-viewLayers.svg b/public/pdfjs/web/images/toolbarButton-viewLayers.svg new file mode 100644 index 0000000..1d72668 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-viewLayers.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-viewOutline.svg b/public/pdfjs/web/images/toolbarButton-viewOutline.svg new file mode 100644 index 0000000..7ed1bd9 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-viewOutline.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-viewThumbnail.svg b/public/pdfjs/web/images/toolbarButton-viewThumbnail.svg new file mode 100644 index 0000000..040d123 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-viewThumbnail.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-zoomIn.svg b/public/pdfjs/web/images/toolbarButton-zoomIn.svg new file mode 100644 index 0000000..30ec51a --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-zoomIn.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/toolbarButton-zoomOut.svg b/public/pdfjs/web/images/toolbarButton-zoomOut.svg new file mode 100644 index 0000000..f273b59 --- /dev/null +++ b/public/pdfjs/web/images/toolbarButton-zoomOut.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/pdfjs/web/images/treeitem-collapsed.svg b/public/pdfjs/web/images/treeitem-collapsed.svg new file mode 100644 index 0000000..831cddf --- /dev/null +++ b/public/pdfjs/web/images/treeitem-collapsed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/pdfjs/web/images/treeitem-expanded.svg b/public/pdfjs/web/images/treeitem-expanded.svg new file mode 100644 index 0000000..2d45f0c --- /dev/null +++ b/public/pdfjs/web/images/treeitem-expanded.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/pdfjs/web/locale/ach/viewer.ftl b/public/pdfjs/web/locale/ach/viewer.ftl new file mode 100644 index 0000000..36769b7 --- /dev/null +++ b/public/pdfjs/web/locale/ach/viewer.ftl @@ -0,0 +1,225 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pot buk mukato +pdfjs-previous-button-label = Mukato +pdfjs-next-button = + .title = Pot buk malubo +pdfjs-next-button-label = Malubo +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pot buk +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = pi { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } me { $pagesCount }) +pdfjs-zoom-out-button = + .title = Jwik Matidi +pdfjs-zoom-out-button-label = Jwik Matidi +pdfjs-zoom-in-button = + .title = Kwot Madit +pdfjs-zoom-in-button-label = Kwot Madit +pdfjs-zoom-select = + .title = Kwoti +pdfjs-presentation-mode-button = + .title = Lokke i kit me tyer +pdfjs-presentation-mode-button-label = Kit me tyer +pdfjs-open-file-button = + .title = Yab Pwail +pdfjs-open-file-button-label = Yab +pdfjs-print-button = + .title = Go +pdfjs-print-button-label = Go + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Gintic +pdfjs-tools-button-label = Gintic +pdfjs-first-page-button = + .title = Cit i pot buk mukwongo +pdfjs-first-page-button-label = Cit i pot buk mukwongo +pdfjs-last-page-button = + .title = Cit i pot buk magiko +pdfjs-last-page-button-label = Cit i pot buk magiko +pdfjs-page-rotate-cw-button = + .title = Wire i tung lacuc +pdfjs-page-rotate-cw-button-label = Wire i tung lacuc +pdfjs-page-rotate-ccw-button = + .title = Wire i tung lacam +pdfjs-page-rotate-ccw-button-label = Wire i tung lacam +pdfjs-cursor-text-select-tool-button = + .title = Cak gitic me yero coc +pdfjs-cursor-text-select-tool-button-label = Gitic me yero coc +pdfjs-cursor-hand-tool-button = + .title = Cak gitic me cing +pdfjs-cursor-hand-tool-button-label = Gitic cing + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Jami me gin acoya… +pdfjs-document-properties-button-label = Jami me gin acoya… +pdfjs-document-properties-file-name = Nying pwail: +pdfjs-document-properties-file-size = Dit pa pwail: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Wiye: +pdfjs-document-properties-author = Ngat mucoyo: +pdfjs-document-properties-subject = Subjek: +pdfjs-document-properties-keywords = Lok mapire tek: +pdfjs-document-properties-creation-date = Nino dwe me cwec: +pdfjs-document-properties-modification-date = Nino dwe me yub: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Lacwec: +pdfjs-document-properties-producer = Layub PDF: +pdfjs-document-properties-version = Kit PDF: +pdfjs-document-properties-page-count = Kwan me pot buk: +pdfjs-document-properties-page-size = Dit pa potbuk: +pdfjs-document-properties-page-size-unit-inches = i +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = atir +pdfjs-document-properties-page-size-orientation-landscape = arii +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Waraga +pdfjs-document-properties-page-size-name-legal = Cik + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = Eyo +pdfjs-document-properties-linearized-no = Pe +pdfjs-document-properties-close-button = Lor + +## Print + +pdfjs-print-progress-message = Yubo coc me agoya… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Juki +pdfjs-printing-not-supported = Ciko: Layeny ma pe teno goyo liweng. +pdfjs-printing-not-ready = Ciko: PDF pe ocane weng me agoya. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Lok gintic ma inget +pdfjs-toggle-sidebar-button-label = Lok gintic ma inget +pdfjs-document-outline-button = + .title = Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng) +pdfjs-document-outline-button-label = Pek pa gin acoya +pdfjs-attachments-button = + .title = Nyut twec +pdfjs-attachments-button-label = Twec +pdfjs-thumbs-button = + .title = Nyut cal +pdfjs-thumbs-button-label = Cal +pdfjs-findbar-button = + .title = Nong iye gin acoya +pdfjs-findbar-button-label = Nong + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pot buk { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Cal me pot buk { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Nong + .placeholder = Nong i dokumen… +pdfjs-find-previous-button = + .title = Nong timme pa lok mukato +pdfjs-find-previous-button-label = Mukato +pdfjs-find-next-button = + .title = Nong timme pa lok malubo +pdfjs-find-next-button-label = Malubo +pdfjs-find-highlight-checkbox = Ket Lanyut I Weng +pdfjs-find-match-case-checkbox-label = Lok marwate +pdfjs-find-reached-top = Oo iwi gin acoya, omede ki i tere +pdfjs-find-reached-bottom = Oo i agiki me gin acoya, omede ki iwiye +pdfjs-find-not-found = Lok pe ononge + +## Predefined zoom values + +pdfjs-page-scale-width = Lac me iye pot buk +pdfjs-page-scale-fit = Porre me pot buk +pdfjs-page-scale-auto = Kwot pire kene +pdfjs-page-scale-actual = Dite kikome +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Bal otime kun cano PDF. +pdfjs-invalid-file-error = Pwail me PDF ma pe atir onyo obale woko. +pdfjs-missing-file-error = Pwail me PDF tye ka rem. +pdfjs-unexpected-response-error = Lagam mape kigeno pa lapok tic. +pdfjs-rendering-error = Bal otime i kare me nyuto pot buk. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Lok angea manok] + +## Password + +pdfjs-password-label = Ket mung me donyo me yabo pwail me PDF man. +pdfjs-password-invalid = Mung me donyo pe atir. Tim ber i tem doki. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Juki +pdfjs-web-fonts-disabled = Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/af/viewer.ftl b/public/pdfjs/web/locale/af/viewer.ftl new file mode 100644 index 0000000..7c4346f --- /dev/null +++ b/public/pdfjs/web/locale/af/viewer.ftl @@ -0,0 +1,212 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Vorige bladsy +pdfjs-previous-button-label = Vorige +pdfjs-next-button = + .title = Volgende bladsy +pdfjs-next-button-label = Volgende +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Bladsy +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = van { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } van { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoem uit +pdfjs-zoom-out-button-label = Zoem uit +pdfjs-zoom-in-button = + .title = Zoem in +pdfjs-zoom-in-button-label = Zoem in +pdfjs-zoom-select = + .title = Zoem +pdfjs-presentation-mode-button = + .title = Wissel na voorleggingsmodus +pdfjs-presentation-mode-button-label = Voorleggingsmodus +pdfjs-open-file-button = + .title = Open lêer +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Druk +pdfjs-print-button-label = Druk + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Nutsgoed +pdfjs-tools-button-label = Nutsgoed +pdfjs-first-page-button = + .title = Gaan na eerste bladsy +pdfjs-first-page-button-label = Gaan na eerste bladsy +pdfjs-last-page-button = + .title = Gaan na laaste bladsy +pdfjs-last-page-button-label = Gaan na laaste bladsy +pdfjs-page-rotate-cw-button = + .title = Roteer kloksgewys +pdfjs-page-rotate-cw-button-label = Roteer kloksgewys +pdfjs-page-rotate-ccw-button = + .title = Roteer anti-kloksgewys +pdfjs-page-rotate-ccw-button-label = Roteer anti-kloksgewys +pdfjs-cursor-text-select-tool-button = + .title = Aktiveer gereedskap om teks te merk +pdfjs-cursor-text-select-tool-button-label = Teksmerkgereedskap +pdfjs-cursor-hand-tool-button = + .title = Aktiveer handjie +pdfjs-cursor-hand-tool-button-label = Handjie + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumenteienskappe… +pdfjs-document-properties-button-label = Dokumenteienskappe… +pdfjs-document-properties-file-name = Lêernaam: +pdfjs-document-properties-file-size = Lêergrootte: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kG ({ $size_b } grepe) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MG ({ $size_b } grepe) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Outeur: +pdfjs-document-properties-subject = Onderwerp: +pdfjs-document-properties-keywords = Sleutelwoorde: +pdfjs-document-properties-creation-date = Skeppingsdatum: +pdfjs-document-properties-modification-date = Wysigingsdatum: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Skepper: +pdfjs-document-properties-producer = PDF-vervaardiger: +pdfjs-document-properties-version = PDF-weergawe: +pdfjs-document-properties-page-count = Aantal bladsye: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = Sluit + +## Print + +pdfjs-print-progress-message = Berei tans dokument voor om te druk… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Kanselleer +pdfjs-printing-not-supported = Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie. +pdfjs-printing-not-ready = Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Sypaneel aan/af +pdfjs-toggle-sidebar-button-label = Sypaneel aan/af +pdfjs-document-outline-button = + .title = Wys dokumentskema (dubbelklik om alle items oop/toe te vou) +pdfjs-document-outline-button-label = Dokumentoorsig +pdfjs-attachments-button = + .title = Wys aanhegsels +pdfjs-attachments-button-label = Aanhegsels +pdfjs-thumbs-button = + .title = Wys duimnaels +pdfjs-thumbs-button-label = Duimnaels +pdfjs-findbar-button = + .title = Soek in dokument +pdfjs-findbar-button-label = Vind + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Bladsy { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Duimnael van bladsy { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Vind + .placeholder = Soek in dokument… +pdfjs-find-previous-button = + .title = Vind die vorige voorkoms van die frase +pdfjs-find-previous-button-label = Vorige +pdfjs-find-next-button = + .title = Vind die volgende voorkoms van die frase +pdfjs-find-next-button-label = Volgende +pdfjs-find-highlight-checkbox = Verlig almal +pdfjs-find-match-case-checkbox-label = Kassensitief +pdfjs-find-reached-top = Bokant van dokument is bereik; gaan voort van onder af +pdfjs-find-reached-bottom = Einde van dokument is bereik; gaan voort van bo af +pdfjs-find-not-found = Frase nie gevind nie + +## Predefined zoom values + +pdfjs-page-scale-width = Bladsywydte +pdfjs-page-scale-fit = Pas bladsy +pdfjs-page-scale-auto = Outomatiese zoem +pdfjs-page-scale-actual = Werklike grootte +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = 'n Fout het voorgekom met die laai van die PDF. +pdfjs-invalid-file-error = Ongeldige of korrupte PDF-lêer. +pdfjs-missing-file-error = PDF-lêer is weg. +pdfjs-unexpected-response-error = Onverwagse antwoord van bediener. +pdfjs-rendering-error = 'n Fout het voorgekom toe die bladsy weergegee is. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }-annotasie] + +## Password + +pdfjs-password-label = Gee die wagwoord om dié PDF-lêer mee te open. +pdfjs-password-invalid = Ongeldige wagwoord. Probeer gerus weer. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Kanselleer +pdfjs-web-fonts-disabled = Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/an/viewer.ftl b/public/pdfjs/web/locale/an/viewer.ftl new file mode 100644 index 0000000..6733147 --- /dev/null +++ b/public/pdfjs/web/locale/an/viewer.ftl @@ -0,0 +1,257 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pachina anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Pachina siguient +pdfjs-next-button-label = Siguient +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pachina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Achiquir +pdfjs-zoom-out-button-label = Achiquir +pdfjs-zoom-in-button = + .title = Agrandir +pdfjs-zoom-in-button-label = Agrandir +pdfjs-zoom-select = + .title = Grandaria +pdfjs-presentation-mode-button = + .title = Cambear t'o modo de presentación +pdfjs-presentation-mode-button-label = Modo de presentación +pdfjs-open-file-button = + .title = Ubrir o fichero +pdfjs-open-file-button-label = Ubrir +pdfjs-print-button = + .title = Imprentar +pdfjs-print-button-label = Imprentar + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ferramientas +pdfjs-tools-button-label = Ferramientas +pdfjs-first-page-button = + .title = Ir ta la primer pachina +pdfjs-first-page-button-label = Ir ta la primer pachina +pdfjs-last-page-button = + .title = Ir ta la zaguer pachina +pdfjs-last-page-button-label = Ir ta la zaguer pachina +pdfjs-page-rotate-cw-button = + .title = Chirar enta la dreita +pdfjs-page-rotate-cw-button-label = Chira enta la dreita +pdfjs-page-rotate-ccw-button = + .title = Chirar enta la zurda +pdfjs-page-rotate-ccw-button-label = Chirar enta la zurda +pdfjs-cursor-text-select-tool-button = + .title = Activar la ferramienta de selección de texto +pdfjs-cursor-text-select-tool-button-label = Ferramienta de selección de texto +pdfjs-cursor-hand-tool-button = + .title = Activar la ferramienta man +pdfjs-cursor-hand-tool-button-label = Ferramienta man +pdfjs-scroll-vertical-button = + .title = Usar lo desplazamiento vertical +pdfjs-scroll-vertical-button-label = Desplazamiento vertical +pdfjs-scroll-horizontal-button = + .title = Usar lo desplazamiento horizontal +pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal +pdfjs-scroll-wrapped-button = + .title = Activaar lo desplazamiento contino +pdfjs-scroll-wrapped-button-label = Desplazamiento contino +pdfjs-spread-none-button = + .title = No unir vistas de pachinas +pdfjs-spread-none-button-label = Una pachina nomás +pdfjs-spread-odd-button = + .title = Mostrar vista de pachinas, con as impars a la zurda +pdfjs-spread-odd-button-label = Doble pachina, impar a la zurda +pdfjs-spread-even-button = + .title = Amostrar vista de pachinas, con as pars a la zurda +pdfjs-spread-even-button-label = Doble pachina, para a la zurda + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedatz d'o documento... +pdfjs-document-properties-button-label = Propiedatz d'o documento... +pdfjs-document-properties-file-name = Nombre de fichero: +pdfjs-document-properties-file-size = Grandaria d'o fichero: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titol: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Afer: +pdfjs-document-properties-keywords = Parolas clau: +pdfjs-document-properties-creation-date = Calendata de creyación: +pdfjs-document-properties-modification-date = Calendata de modificación: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creyador: +pdfjs-document-properties-producer = Creyador de PDF: +pdfjs-document-properties-version = Versión de PDF: +pdfjs-document-properties-page-count = Numero de pachinas: +pdfjs-document-properties-page-size = Mida de pachina: +pdfjs-document-properties-page-size-unit-inches = pulgadas +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } x { $height } { $unit } { $orientation } +pdfjs-document-properties-page-size-dimension-name-string = { $width } x { $height } { $unit } { $name }, { $orientation } + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista web rapida: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Zarrar + +## Print + +pdfjs-print-progress-message = Se ye preparando la documentación pa imprentar… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Pare cuenta: Iste navegador no maneya totalment as impresions. +pdfjs-printing-not-ready = Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Amostrar u amagar a barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas) +pdfjs-toggle-sidebar-button-label = Amostrar a barra lateral +pdfjs-document-outline-button = + .title = Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items) +pdfjs-document-outline-button-label = Esquema d'o documento +pdfjs-attachments-button = + .title = Amostrar os adchuntos +pdfjs-attachments-button-label = Adchuntos +pdfjs-layers-button = + .title = Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto) +pdfjs-layers-button-label = Capas +pdfjs-thumbs-button = + .title = Amostrar as miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-findbar-button = + .title = Trobar en o documento +pdfjs-findbar-button-label = Trobar +pdfjs-additional-layers = Capas adicionals + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pachina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura d'a pachina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Trobar + .placeholder = Trobar en o documento… +pdfjs-find-previous-button = + .title = Trobar l'anterior coincidencia d'a frase +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Trobar a siguient coincidencia d'a frase +pdfjs-find-next-button-label = Siguient +pdfjs-find-highlight-checkbox = Resaltar-lo tot +pdfjs-find-match-case-checkbox-label = Coincidencia de mayusclas/minusclas +pdfjs-find-entire-word-checkbox-label = Parolas completas +pdfjs-find-reached-top = S'ha plegau a l'inicio d'o documento, se contina dende baixo +pdfjs-find-reached-bottom = S'ha plegau a la fin d'o documento, se contina dende alto +pdfjs-find-not-found = No s'ha trobau a frase + +## Predefined zoom values + +pdfjs-page-scale-width = Amplaria d'a pachina +pdfjs-page-scale-fit = Achuste d'a pachina +pdfjs-page-scale-auto = Grandaria automatica +pdfjs-page-scale-actual = Grandaria actual +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = S'ha produciu una error en cargar o PDF. +pdfjs-invalid-file-error = O PDF no ye valido u ye estorbau. +pdfjs-missing-file-error = No i ha fichero PDF. +pdfjs-unexpected-response-error = Respuesta a lo servicio inasperada. +pdfjs-rendering-error = Ha ocurriu una error en renderizar a pachina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotación { $type }] + +## Password + +pdfjs-password-label = Introduzca a clau ta ubrir iste fichero PDF. +pdfjs-password-invalid = Clau invalida. Torna a intentar-lo. +pdfjs-password-ok-button = Acceptar +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = As fuents web son desactivadas: no se puet incrustar fichers PDF. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ar/viewer.ftl b/public/pdfjs/web/locale/ar/viewer.ftl new file mode 100644 index 0000000..8d14767 --- /dev/null +++ b/public/pdfjs/web/locale/ar/viewer.ftl @@ -0,0 +1,425 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = الصفحة السابقة +pdfjs-previous-button-label = السابقة +pdfjs-next-button = + .title = الصفحة التالية +pdfjs-next-button-label = التالية +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = صفحة +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = من { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } من { $pagesCount }) +pdfjs-zoom-out-button = + .title = بعّد +pdfjs-zoom-out-button-label = بعّد +pdfjs-zoom-in-button = + .title = قرّب +pdfjs-zoom-in-button-label = قرّب +pdfjs-zoom-select = + .title = التقريب +pdfjs-presentation-mode-button = + .title = انتقل لوضع العرض التقديمي +pdfjs-presentation-mode-button-label = وضع العرض التقديمي +pdfjs-open-file-button = + .title = افتح ملفًا +pdfjs-open-file-button-label = افتح +pdfjs-print-button = + .title = اطبع +pdfjs-print-button-label = اطبع +pdfjs-save-button = + .title = احفظ +pdfjs-save-button-label = احفظ +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = نزّل +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = نزّل +pdfjs-bookmark-button = + .title = الصفحة الحالية (عرض URL من الصفحة الحالية) +pdfjs-bookmark-button-label = الصفحة الحالية + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = الأدوات +pdfjs-tools-button-label = الأدوات +pdfjs-first-page-button = + .title = انتقل إلى الصفحة الأولى +pdfjs-first-page-button-label = انتقل إلى الصفحة الأولى +pdfjs-last-page-button = + .title = انتقل إلى الصفحة الأخيرة +pdfjs-last-page-button-label = انتقل إلى الصفحة الأخيرة +pdfjs-page-rotate-cw-button = + .title = أدر باتجاه عقارب الساعة +pdfjs-page-rotate-cw-button-label = أدر باتجاه عقارب الساعة +pdfjs-page-rotate-ccw-button = + .title = أدر بعكس اتجاه عقارب الساعة +pdfjs-page-rotate-ccw-button-label = أدر بعكس اتجاه عقارب الساعة +pdfjs-cursor-text-select-tool-button = + .title = فعّل أداة اختيار النص +pdfjs-cursor-text-select-tool-button-label = أداة اختيار النص +pdfjs-cursor-hand-tool-button = + .title = فعّل أداة اليد +pdfjs-cursor-hand-tool-button-label = أداة اليد +pdfjs-scroll-page-button = + .title = استخدم تمرير الصفحة +pdfjs-scroll-page-button-label = تمرير الصفحة +pdfjs-scroll-vertical-button = + .title = استخدم التمرير الرأسي +pdfjs-scroll-vertical-button-label = التمرير الرأسي +pdfjs-scroll-horizontal-button = + .title = استخدم التمرير الأفقي +pdfjs-scroll-horizontal-button-label = التمرير الأفقي +pdfjs-scroll-wrapped-button = + .title = استخدم التمرير الملتف +pdfjs-scroll-wrapped-button-label = التمرير الملتف +pdfjs-spread-none-button = + .title = لا تدمج هوامش الصفحات مع بعضها البعض +pdfjs-spread-none-button-label = بلا هوامش +pdfjs-spread-odd-button = + .title = ادمج هوامش الصفحات الفردية +pdfjs-spread-odd-button-label = هوامش الصفحات الفردية +pdfjs-spread-even-button = + .title = ادمج هوامش الصفحات الزوجية +pdfjs-spread-even-button-label = هوامش الصفحات الزوجية + +## Document properties dialog + +pdfjs-document-properties-button = + .title = خصائص المستند… +pdfjs-document-properties-button-label = خصائص المستند… +pdfjs-document-properties-file-name = اسم الملف: +pdfjs-document-properties-file-size = حجم الملف: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } ك.بايت ({ $size_b } بايت) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } م.بايت ({ $size_b } بايت) +pdfjs-document-properties-title = العنوان: +pdfjs-document-properties-author = المؤلف: +pdfjs-document-properties-subject = الموضوع: +pdfjs-document-properties-keywords = الكلمات الأساسية: +pdfjs-document-properties-creation-date = تاريخ الإنشاء: +pdfjs-document-properties-modification-date = تاريخ التعديل: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }، { $time } +pdfjs-document-properties-creator = المنشئ: +pdfjs-document-properties-producer = منتج PDF: +pdfjs-document-properties-version = إصدارة PDF: +pdfjs-document-properties-page-count = عدد الصفحات: +pdfjs-document-properties-page-size = مقاس الورقة: +pdfjs-document-properties-page-size-unit-inches = بوصة +pdfjs-document-properties-page-size-unit-millimeters = ملم +pdfjs-document-properties-page-size-orientation-portrait = طوليّ +pdfjs-document-properties-page-size-orientation-landscape = عرضيّ +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = خطاب +pdfjs-document-properties-page-size-name-legal = قانونيّ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = ‏{ $width } × ‏{ $height } ‏{ $unit } (‏{ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = ‏{ $width } × ‏{ $height } ‏{ $unit } (‏{ $name }، { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = العرض السريع عبر الوِب: +pdfjs-document-properties-linearized-yes = نعم +pdfjs-document-properties-linearized-no = لا +pdfjs-document-properties-close-button = أغلق + +## Print + +pdfjs-print-progress-message = يُحضّر المستند للطباعة… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }٪ +pdfjs-print-progress-close-button = ألغِ +pdfjs-printing-not-supported = تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل. +pdfjs-printing-not-ready = تحذير: ملف PDF لم يُحمّل كاملًا للطباعة. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = بدّل ظهور الشريط الجانبي +pdfjs-toggle-sidebar-notification-button = + .title = بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات أو طبقات) +pdfjs-toggle-sidebar-button-label = بدّل ظهور الشريط الجانبي +pdfjs-document-outline-button = + .title = اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر) +pdfjs-document-outline-button-label = مخطط المستند +pdfjs-attachments-button = + .title = اعرض المرفقات +pdfjs-attachments-button-label = المُرفقات +pdfjs-layers-button = + .title = اعرض الطبقات (انقر مرتين لتصفير كل الطبقات إلى الحالة المبدئية) +pdfjs-layers-button-label = ‏‏الطبقات +pdfjs-thumbs-button = + .title = اعرض مُصغرات +pdfjs-thumbs-button-label = مُصغّرات +pdfjs-current-outline-item-button = + .title = ابحث عن عنصر المخطّط التفصيلي الحالي +pdfjs-current-outline-item-button-label = عنصر المخطّط التفصيلي الحالي +pdfjs-findbar-button = + .title = ابحث في المستند +pdfjs-findbar-button-label = ابحث +pdfjs-additional-layers = الطبقات الإضافية + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = صفحة { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = مصغّرة صفحة { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ابحث + .placeholder = ابحث في المستند… +pdfjs-find-previous-button = + .title = ابحث عن التّواجد السّابق للعبارة +pdfjs-find-previous-button-label = السابق +pdfjs-find-next-button = + .title = ابحث عن التّواجد التّالي للعبارة +pdfjs-find-next-button-label = التالي +pdfjs-find-highlight-checkbox = أبرِز الكل +pdfjs-find-match-case-checkbox-label = طابق حالة الأحرف +pdfjs-find-match-diacritics-checkbox-label = طابِق الحركات +pdfjs-find-entire-word-checkbox-label = كلمات كاملة +pdfjs-find-reached-top = تابعت من الأسفل بعدما وصلت إلى بداية المستند +pdfjs-find-reached-bottom = تابعت من الأعلى بعدما وصلت إلى نهاية المستند +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [zero] لا مطابقة + [one] { $current } من أصل { $total } مطابقة + [two] { $current } من أصل { $total } مطابقة + [few] { $current } من أصل { $total } مطابقة + [many] { $current } من أصل { $total } مطابقة + *[other] { $current } من أصل { $total } مطابقة + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [zero] { $limit } مطابقة + [one] أكثر من { $limit } مطابقة + [two] أكثر من { $limit } مطابقة + [few] أكثر من { $limit } مطابقة + [many] أكثر من { $limit } مطابقة + *[other] أكثر من { $limit } مطابقات + } +pdfjs-find-not-found = لا وجود للعبارة + +## Predefined zoom values + +pdfjs-page-scale-width = عرض الصفحة +pdfjs-page-scale-fit = ملائمة الصفحة +pdfjs-page-scale-auto = تقريب تلقائي +pdfjs-page-scale-actual = الحجم الفعلي +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }٪ + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = صفحة { $page } + +## Loading indicator messages + +pdfjs-loading-error = حدث عطل أثناء تحميل ملف PDF. +pdfjs-invalid-file-error = ملف PDF تالف أو غير صحيح. +pdfjs-missing-file-error = ملف PDF غير موجود. +pdfjs-unexpected-response-error = استجابة خادوم غير متوقعة. +pdfjs-rendering-error = حدث خطأ أثناء عرض الصفحة. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }، { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [تعليق { $type }] + +## Password + +pdfjs-password-label = أدخل لكلمة السر لفتح هذا الملف. +pdfjs-password-invalid = كلمة سر خطأ. من فضلك أعد المحاولة. +pdfjs-password-ok-button = حسنا +pdfjs-password-cancel-button = ألغِ +pdfjs-web-fonts-disabled = خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة. + +## Editing + +pdfjs-editor-free-text-button = + .title = نص +pdfjs-editor-free-text-button-label = نص +pdfjs-editor-ink-button = + .title = ارسم +pdfjs-editor-ink-button-label = ارسم +pdfjs-editor-stamp-button = + .title = أضِف أو حرّر الصور +pdfjs-editor-stamp-button-label = أضِف أو حرّر الصور +pdfjs-editor-highlight-button = + .title = أبرِز +pdfjs-editor-highlight-button-label = أبرِز +pdfjs-highlight-floating-button1 = + .title = أبرِز + .aria-label = أبرِز +pdfjs-highlight-floating-button-label = أبرِز + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = أزِل الرسم +pdfjs-editor-remove-freetext-button = + .title = أزِل النص +pdfjs-editor-remove-stamp-button = + .title = أزِل الصورة +pdfjs-editor-remove-highlight-button = + .title = أزِل الإبراز + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = اللون +pdfjs-editor-free-text-size-input = الحجم +pdfjs-editor-ink-color-input = اللون +pdfjs-editor-ink-thickness-input = السماكة +pdfjs-editor-ink-opacity-input = العتامة +pdfjs-editor-stamp-add-image-button = + .title = أضِف صورة +pdfjs-editor-stamp-add-image-button-label = أضِف صورة +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = السماكة +pdfjs-editor-free-highlight-thickness-title = + .title = غيّر السُمك عند إبراز عناصر أُخرى غير النص +pdfjs-free-text = + .aria-label = محرِّر النص +pdfjs-free-text-default-content = ابدأ الكتابة… +pdfjs-ink = + .aria-label = محرِّر الرسم +pdfjs-ink-canvas = + .aria-label = صورة أنشأها المستخدم + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button-label = نص بديل +pdfjs-editor-alt-text-edit-button-label = تحرير النص البديل +pdfjs-editor-alt-text-dialog-label = اختر خيار +pdfjs-editor-alt-text-dialog-description = يساعد النص البديل عندما لا يتمكن الأشخاص من رؤية الصورة أو عندما لا يتم تحميلها. +pdfjs-editor-alt-text-add-description-label = أضِف وصف +pdfjs-editor-alt-text-add-description-description = استهدف جملتين تصفان الموضوع أو الإعداد أو الإجراءات. +pdfjs-editor-alt-text-mark-decorative-label = علّمها على أنها زخرفية +pdfjs-editor-alt-text-mark-decorative-description = يُستخدم هذا في الصور المزخرفة، مثل الحدود أو العلامات المائية. +pdfjs-editor-alt-text-cancel-button = ألغِ +pdfjs-editor-alt-text-save-button = احفظ +pdfjs-editor-alt-text-decorative-tooltip = عُلّمت على أنها زخرفية +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = على سبيل المثال، "يجلس شاب على الطاولة لتناول وجبة" + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = الزاوية اليُسرى العُليا — غيّر الحجم +pdfjs-editor-resizer-label-top-middle = أعلى الوسط - غيّر الحجم +pdfjs-editor-resizer-label-top-right = الزاوية اليُمنى العُليا - غيّر الحجم +pdfjs-editor-resizer-label-middle-right = اليمين الأوسط - غيّر الحجم +pdfjs-editor-resizer-label-bottom-right = الزاوية اليُمنى السُفلى - غيّر الحجم +pdfjs-editor-resizer-label-bottom-middle = أسفل الوسط - غيّر الحجم +pdfjs-editor-resizer-label-bottom-left = الزاوية اليُسرى السُفلية - غيّر الحجم +pdfjs-editor-resizer-label-middle-left = مُنتصف اليسار - غيّر الحجم +pdfjs-editor-resizer-top-left = + .aria-label = الزاوية اليُسرى العُليا — غيّر الحجم +pdfjs-editor-resizer-top-middle = + .aria-label = أعلى الوسط - غيّر الحجم +pdfjs-editor-resizer-top-right = + .aria-label = الزاوية اليُمنى العُليا - غيّر الحجم +pdfjs-editor-resizer-middle-right = + .aria-label = اليمين الأوسط - غيّر الحجم +pdfjs-editor-resizer-bottom-right = + .aria-label = الزاوية اليُمنى السُفلى - غيّر الحجم +pdfjs-editor-resizer-bottom-middle = + .aria-label = أسفل الوسط - غيّر الحجم +pdfjs-editor-resizer-bottom-left = + .aria-label = الزاوية اليُسرى السُفلية - غيّر الحجم +pdfjs-editor-resizer-middle-left = + .aria-label = مُنتصف اليسار - غيّر الحجم + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = أبرِز اللون +pdfjs-editor-colorpicker-button = + .title = غيّر اللون +pdfjs-editor-colorpicker-dropdown = + .aria-label = اختيارات الألوان +pdfjs-editor-colorpicker-yellow = + .title = أصفر +pdfjs-editor-colorpicker-green = + .title = أخضر +pdfjs-editor-colorpicker-blue = + .title = أزرق +pdfjs-editor-colorpicker-pink = + .title = وردي +pdfjs-editor-colorpicker-red = + .title = أحمر + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = أظهِر الكل +pdfjs-editor-highlight-show-all-button = + .title = أظهِر الكل + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/ast/viewer.ftl b/public/pdfjs/web/locale/ast/viewer.ftl new file mode 100644 index 0000000..2503caf --- /dev/null +++ b/public/pdfjs/web/locale/ast/viewer.ftl @@ -0,0 +1,201 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Páxina anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Páxina siguiente +pdfjs-next-button-label = Siguiente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Páxina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Alloñar +pdfjs-zoom-out-button-label = Alloña +pdfjs-zoom-in-button = + .title = Averar +pdfjs-zoom-in-button-label = Avera +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Cambiar al mou de presentación +pdfjs-presentation-mode-button-label = Mou de presentación +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprentar +pdfjs-print-button-label = Imprentar + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ferramientes +pdfjs-tools-button-label = Ferramientes +pdfjs-first-page-button-label = Dir a la primer páxina +pdfjs-last-page-button-label = Dir a la última páxina +pdfjs-page-rotate-cw-button = + .title = Voltia a la derecha +pdfjs-page-rotate-cw-button-label = Voltiar a la derecha +pdfjs-page-rotate-ccw-button = + .title = Voltia a la esquierda +pdfjs-page-rotate-ccw-button-label = Voltiar a la esquierda +pdfjs-cursor-text-select-tool-button = + .title = Activa la ferramienta d'esbilla de testu +pdfjs-cursor-text-select-tool-button-label = Ferramienta d'esbilla de testu +pdfjs-cursor-hand-tool-button = + .title = Activa la ferramienta de mano +pdfjs-cursor-hand-tool-button-label = Ferramienta de mano +pdfjs-scroll-vertical-button = + .title = Usa'l desplazamientu vertical +pdfjs-scroll-vertical-button-label = Desplazamientu vertical +pdfjs-scroll-horizontal-button = + .title = Usa'l desplazamientu horizontal +pdfjs-scroll-horizontal-button-label = Desplazamientu horizontal +pdfjs-scroll-wrapped-button = + .title = Usa'l desplazamientu continuu +pdfjs-scroll-wrapped-button-label = Desplazamientu continuu +pdfjs-spread-none-button-label = Fueyes individuales +pdfjs-spread-odd-button-label = Fueyes pares +pdfjs-spread-even-button-label = Fueyes impares + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedaes del documentu… +pdfjs-document-properties-button-label = Propiedaes del documentu… +pdfjs-document-properties-file-name = Nome del ficheru: +pdfjs-document-properties-file-size = Tamañu del ficheru: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Títulu: +pdfjs-document-properties-keywords = Pallabres clave: +pdfjs-document-properties-creation-date = Data de creación: +pdfjs-document-properties-modification-date = Data de modificación: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-producer = Productor del PDF: +pdfjs-document-properties-version = Versión del PDF: +pdfjs-document-properties-page-count = Númberu de páxines: +pdfjs-document-properties-page-size = Tamañu de páxina: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista web rápida: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = Non +pdfjs-document-properties-close-button = Zarrar + +## Print + +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Encaboxar + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Alternar la barra llateral +pdfjs-attachments-button = + .title = Amosar los axuntos +pdfjs-attachments-button-label = Axuntos +pdfjs-layers-button-label = Capes +pdfjs-thumbs-button = + .title = Amosar les miniatures +pdfjs-thumbs-button-label = Miniatures +pdfjs-findbar-button-label = Atopar +pdfjs-additional-layers = Capes adicionales + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Páxina { $page } + +## Find panel button title and messages + +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button-label = Siguiente +pdfjs-find-entire-word-checkbox-label = Pallabres completes +pdfjs-find-reached-top = Algamóse'l comienzu de la páxina, síguese dende abaxo +pdfjs-find-reached-bottom = Algamóse la fin del documentu, síguese dende arriba + +## Predefined zoom values + +pdfjs-page-scale-auto = Zoom automáticu +pdfjs-page-scale-actual = Tamañu real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Páxina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Asocedió un fallu mentanto se cargaba'l PDF. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } + +## Password + +pdfjs-password-ok-button = Aceptar +pdfjs-password-cancel-button = Encaboxar + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/az/viewer.ftl b/public/pdfjs/web/locale/az/viewer.ftl new file mode 100644 index 0000000..773aae4 --- /dev/null +++ b/public/pdfjs/web/locale/az/viewer.ftl @@ -0,0 +1,257 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Əvvəlki səhifə +pdfjs-previous-button-label = Əvvəlkini tap +pdfjs-next-button = + .title = Növbəti səhifə +pdfjs-next-button-label = İrəli +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Səhifə +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = Uzaqlaş +pdfjs-zoom-out-button-label = Uzaqlaş +pdfjs-zoom-in-button = + .title = Yaxınlaş +pdfjs-zoom-in-button-label = Yaxınlaş +pdfjs-zoom-select = + .title = Yaxınlaşdırma +pdfjs-presentation-mode-button = + .title = Təqdimat Rejiminə Keç +pdfjs-presentation-mode-button-label = Təqdimat Rejimi +pdfjs-open-file-button = + .title = Fayl Aç +pdfjs-open-file-button-label = Aç +pdfjs-print-button = + .title = Yazdır +pdfjs-print-button-label = Yazdır + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Alətlər +pdfjs-tools-button-label = Alətlər +pdfjs-first-page-button = + .title = İlk Səhifəyə get +pdfjs-first-page-button-label = İlk Səhifəyə get +pdfjs-last-page-button = + .title = Son Səhifəyə get +pdfjs-last-page-button-label = Son Səhifəyə get +pdfjs-page-rotate-cw-button = + .title = Saat İstiqamətində Fırlat +pdfjs-page-rotate-cw-button-label = Saat İstiqamətində Fırlat +pdfjs-page-rotate-ccw-button = + .title = Saat İstiqamətinin Əksinə Fırlat +pdfjs-page-rotate-ccw-button-label = Saat İstiqamətinin Əksinə Fırlat +pdfjs-cursor-text-select-tool-button = + .title = Yazı seçmə alətini aktivləşdir +pdfjs-cursor-text-select-tool-button-label = Yazı seçmə aləti +pdfjs-cursor-hand-tool-button = + .title = Əl alətini aktivləşdir +pdfjs-cursor-hand-tool-button-label = Əl aləti +pdfjs-scroll-vertical-button = + .title = Şaquli sürüşdürmə işlət +pdfjs-scroll-vertical-button-label = Şaquli sürüşdürmə +pdfjs-scroll-horizontal-button = + .title = Üfüqi sürüşdürmə işlət +pdfjs-scroll-horizontal-button-label = Üfüqi sürüşdürmə +pdfjs-scroll-wrapped-button = + .title = Bükülü sürüşdürmə işlət +pdfjs-scroll-wrapped-button-label = Bükülü sürüşdürmə +pdfjs-spread-none-button = + .title = Yan-yana birləşdirilmiş səhifələri işlətmə +pdfjs-spread-none-button-label = Birləşdirmə +pdfjs-spread-odd-button = + .title = Yan-yana birləşdirilmiş səhifələri tək nömrəli səhifələrdən başlat +pdfjs-spread-odd-button-label = Tək nömrəli +pdfjs-spread-even-button = + .title = Yan-yana birləşdirilmiş səhifələri cüt nömrəli səhifələrdən başlat +pdfjs-spread-even-button-label = Cüt nömrəli + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Sənəd xüsusiyyətləri… +pdfjs-document-properties-button-label = Sənəd xüsusiyyətləri… +pdfjs-document-properties-file-name = Fayl adı: +pdfjs-document-properties-file-size = Fayl ölçüsü: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bayt) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bayt) +pdfjs-document-properties-title = Başlık: +pdfjs-document-properties-author = Müəllif: +pdfjs-document-properties-subject = Mövzu: +pdfjs-document-properties-keywords = Açar sözlər: +pdfjs-document-properties-creation-date = Yaradılış Tarixi : +pdfjs-document-properties-modification-date = Dəyişdirilmə Tarixi : +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Yaradan: +pdfjs-document-properties-producer = PDF yaradıcısı: +pdfjs-document-properties-version = PDF versiyası: +pdfjs-document-properties-page-count = Səhifə sayı: +pdfjs-document-properties-page-size = Səhifə Ölçüsü: +pdfjs-document-properties-page-size-unit-inches = inç +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portret +pdfjs-document-properties-page-size-orientation-landscape = albom +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Məktub +pdfjs-document-properties-page-size-name-legal = Hüquqi + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Bəli +pdfjs-document-properties-linearized-no = Xeyr +pdfjs-document-properties-close-button = Qapat + +## Print + +pdfjs-print-progress-message = Sənəd çap üçün hazırlanır… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Ləğv et +pdfjs-printing-not-supported = Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir. +pdfjs-printing-not-ready = Xəbərdarlıq: PDF çap üçün tam yüklənməyib. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Yan Paneli Aç/Bağla +pdfjs-toggle-sidebar-notification-button = + .title = Yan paneli çevir (sənəddə icmal/bağlamalar/laylar mövcuddur) +pdfjs-toggle-sidebar-button-label = Yan Paneli Aç/Bağla +pdfjs-document-outline-button = + .title = Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin) +pdfjs-document-outline-button-label = Sənəd strukturu +pdfjs-attachments-button = + .title = Bağlamaları göstər +pdfjs-attachments-button-label = Bağlamalar +pdfjs-layers-button = + .title = Layları göstər (bütün layları ilkin halına sıfırlamaq üçün iki dəfə klikləyin) +pdfjs-layers-button-label = Laylar +pdfjs-thumbs-button = + .title = Kiçik şəkilləri göstər +pdfjs-thumbs-button-label = Kiçik şəkillər +pdfjs-findbar-button = + .title = Sənəddə Tap +pdfjs-findbar-button-label = Tap +pdfjs-additional-layers = Əlavə laylar + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Səhifə{ $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } səhifəsinin kiçik vəziyyəti + +## Find panel button title and messages + +pdfjs-find-input = + .title = Tap + .placeholder = Sənəddə tap… +pdfjs-find-previous-button = + .title = Bir öncəki uyğun gələn sözü tapır +pdfjs-find-previous-button-label = Geri +pdfjs-find-next-button = + .title = Bir sonrakı uyğun gələn sözü tapır +pdfjs-find-next-button-label = İrəli +pdfjs-find-highlight-checkbox = İşarələ +pdfjs-find-match-case-checkbox-label = Böyük/kiçik hərfə həssaslıq +pdfjs-find-entire-word-checkbox-label = Tam sözlər +pdfjs-find-reached-top = Sənədin yuxarısına çatdı, aşağıdan davam edir +pdfjs-find-reached-bottom = Sənədin sonuna çatdı, yuxarıdan davam edir +pdfjs-find-not-found = Uyğunlaşma tapılmadı + +## Predefined zoom values + +pdfjs-page-scale-width = Səhifə genişliyi +pdfjs-page-scale-fit = Səhifəni sığdır +pdfjs-page-scale-auto = Avtomatik yaxınlaşdır +pdfjs-page-scale-actual = Hazırkı Həcm +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF yüklenərkən bir səhv yarandı. +pdfjs-invalid-file-error = Səhv və ya zədələnmiş olmuş PDF fayl. +pdfjs-missing-file-error = PDF fayl yoxdur. +pdfjs-unexpected-response-error = Gözlənilməz server cavabı. +pdfjs-rendering-error = Səhifə göstərilərkən səhv yarandı. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotasiyası] + +## Password + +pdfjs-password-label = Bu PDF faylı açmaq üçün parolu daxil edin. +pdfjs-password-invalid = Parol səhvdir. Bir daha yoxlayın. +pdfjs-password-ok-button = Tamam +pdfjs-password-cancel-button = Ləğv et +pdfjs-web-fonts-disabled = Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/be/viewer.ftl b/public/pdfjs/web/locale/be/viewer.ftl new file mode 100644 index 0000000..3f029d9 --- /dev/null +++ b/public/pdfjs/web/locale/be/viewer.ftl @@ -0,0 +1,518 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Папярэдняя старонка +pdfjs-previous-button-label = Папярэдняя +pdfjs-next-button = + .title = Наступная старонка +pdfjs-next-button-label = Наступная +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Старонка +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = з { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } з { $pagesCount }) +pdfjs-zoom-out-button = + .title = Паменшыць +pdfjs-zoom-out-button-label = Паменшыць +pdfjs-zoom-in-button = + .title = Павялічыць +pdfjs-zoom-in-button-label = Павялічыць +pdfjs-zoom-select = + .title = Павялічэнне тэксту +pdfjs-presentation-mode-button = + .title = Пераключыцца ў рэжым паказу +pdfjs-presentation-mode-button-label = Рэжым паказу +pdfjs-open-file-button = + .title = Адкрыць файл +pdfjs-open-file-button-label = Адкрыць +pdfjs-print-button = + .title = Друкаваць +pdfjs-print-button-label = Друкаваць +pdfjs-save-button = + .title = Захаваць +pdfjs-save-button-label = Захаваць +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Сцягнуць +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Сцягнуць +pdfjs-bookmark-button = + .title = Дзейная старонка (паглядзець URL-адрас з дзейнай старонкі) +pdfjs-bookmark-button-label = Цяперашняя старонка + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Прылады +pdfjs-tools-button-label = Прылады +pdfjs-first-page-button = + .title = Перайсці на першую старонку +pdfjs-first-page-button-label = Перайсці на першую старонку +pdfjs-last-page-button = + .title = Перайсці на апошнюю старонку +pdfjs-last-page-button-label = Перайсці на апошнюю старонку +pdfjs-page-rotate-cw-button = + .title = Павярнуць па сонцу +pdfjs-page-rotate-cw-button-label = Павярнуць па сонцу +pdfjs-page-rotate-ccw-button = + .title = Павярнуць супраць сонца +pdfjs-page-rotate-ccw-button-label = Павярнуць супраць сонца +pdfjs-cursor-text-select-tool-button = + .title = Уключыць прыладу выбару тэксту +pdfjs-cursor-text-select-tool-button-label = Прылада выбару тэксту +pdfjs-cursor-hand-tool-button = + .title = Уключыць ручную прыладу +pdfjs-cursor-hand-tool-button-label = Ручная прылада +pdfjs-scroll-page-button = + .title = Выкарыстоўваць пракрутку старонкi +pdfjs-scroll-page-button-label = Пракрутка старонкi +pdfjs-scroll-vertical-button = + .title = Ужываць вертыкальную пракрутку +pdfjs-scroll-vertical-button-label = Вертыкальная пракрутка +pdfjs-scroll-horizontal-button = + .title = Ужываць гарызантальную пракрутку +pdfjs-scroll-horizontal-button-label = Гарызантальная пракрутка +pdfjs-scroll-wrapped-button = + .title = Ужываць маштабавальную пракрутку +pdfjs-scroll-wrapped-button-label = Маштабавальная пракрутка +pdfjs-spread-none-button = + .title = Не выкарыстоўваць разгорнутыя старонкі +pdfjs-spread-none-button-label = Без разгорнутых старонак +pdfjs-spread-odd-button = + .title = Разгорнутыя старонкі пачынаючы з няцотных нумароў +pdfjs-spread-odd-button-label = Няцотныя старонкі злева +pdfjs-spread-even-button = + .title = Разгорнутыя старонкі пачынаючы з цотных нумароў +pdfjs-spread-even-button-label = Цотныя старонкі злева + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Уласцівасці дакумента… +pdfjs-document-properties-button-label = Уласцівасці дакумента… +pdfjs-document-properties-file-name = Назва файла: +pdfjs-document-properties-file-size = Памер файла: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байтаў) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байтаў) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +pdfjs-document-properties-title = Загаловак: +pdfjs-document-properties-author = Аўтар: +pdfjs-document-properties-subject = Тэма: +pdfjs-document-properties-keywords = Ключавыя словы: +pdfjs-document-properties-creation-date = Дата стварэння: +pdfjs-document-properties-modification-date = Дата змянення: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Стваральнік: +pdfjs-document-properties-producer = Вырабнік PDF: +pdfjs-document-properties-version = Версія PDF: +pdfjs-document-properties-page-count = Колькасць старонак: +pdfjs-document-properties-page-size = Памер старонкі: +pdfjs-document-properties-page-size-unit-inches = цаляў +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = кніжная +pdfjs-document-properties-page-size-orientation-landscape = альбомная +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Хуткі прагляд у Інтэрнэце: +pdfjs-document-properties-linearized-yes = Так +pdfjs-document-properties-linearized-no = Не +pdfjs-document-properties-close-button = Закрыць + +## Print + +pdfjs-print-progress-message = Падрыхтоўка дакумента да друку… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Скасаваць +pdfjs-printing-not-supported = Папярэджанне: друк не падтрымліваецца цалкам гэтым браўзерам. +pdfjs-printing-not-ready = Увага: PDF не сцягнуты цалкам для друкавання. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Паказаць/схаваць бакавую панэль +pdfjs-toggle-sidebar-notification-button = + .title = Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні/пласты) +pdfjs-toggle-sidebar-button-label = Паказаць/схаваць бакавую панэль +pdfjs-document-outline-button = + .title = Паказаць структуру дакумента (двайная пстрычка, каб разгарнуць /згарнуць усе элементы) +pdfjs-document-outline-button-label = Структура дакумента +pdfjs-attachments-button = + .title = Паказаць далучэнні +pdfjs-attachments-button-label = Далучэнні +pdfjs-layers-button = + .title = Паказаць пласты (націсніце двойчы, каб скінуць усе пласты да прадвызначанага стану) +pdfjs-layers-button-label = Пласты +pdfjs-thumbs-button = + .title = Паказ мініяцюр +pdfjs-thumbs-button-label = Мініяцюры +pdfjs-current-outline-item-button = + .title = Знайсці бягучы элемент структуры +pdfjs-current-outline-item-button-label = Бягучы элемент структуры +pdfjs-findbar-button = + .title = Пошук у дакуменце +pdfjs-findbar-button-label = Знайсці +pdfjs-additional-layers = Дадатковыя пласты + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Старонка { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Мініяцюра старонкі { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Шукаць + .placeholder = Шукаць у дакуменце… +pdfjs-find-previous-button = + .title = Знайсці папярэдні выпадак выразу +pdfjs-find-previous-button-label = Папярэдні +pdfjs-find-next-button = + .title = Знайсці наступны выпадак выразу +pdfjs-find-next-button-label = Наступны +pdfjs-find-highlight-checkbox = Падфарбаваць усе +pdfjs-find-match-case-checkbox-label = Адрозніваць вялікія/малыя літары +pdfjs-find-match-diacritics-checkbox-label = З улікам дыякрытык +pdfjs-find-entire-word-checkbox-label = Словы цалкам +pdfjs-find-reached-top = Дасягнуты пачатак дакумента, працяг з канца +pdfjs-find-reached-bottom = Дасягнуты канец дакумента, працяг з пачатку +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } з { $total } супадзенняў + [few] { $current } з { $total } супадзенняў + *[many] { $current } з { $total } супадзенняў + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Больш за { $limit } супадзенне + [few] Больш за { $limit } супадзенні + *[many] Больш за { $limit } супадзенняў + } +pdfjs-find-not-found = Выраз не знойдзены + +## Predefined zoom values + +pdfjs-page-scale-width = Шырыня старонкі +pdfjs-page-scale-fit = Уцісненне старонкі +pdfjs-page-scale-auto = Аўтаматычнае павелічэнне +pdfjs-page-scale-actual = Сапраўдны памер +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Старонка { $page } + +## Loading indicator messages + +pdfjs-loading-error = Здарылася памылка ў часе загрузкі PDF. +pdfjs-invalid-file-error = Няспраўны або пашкоджаны файл PDF. +pdfjs-missing-file-error = Адсутны файл PDF. +pdfjs-unexpected-response-error = Нечаканы адказ сервера. +pdfjs-rendering-error = Здарылася памылка падчас адлюстравання старонкі. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Увядзіце пароль, каб адкрыць гэты файл PDF. +pdfjs-password-invalid = Нядзейсны пароль. Паспрабуйце зноў. +pdfjs-password-ok-button = Добра +pdfjs-password-cancel-button = Скасаваць +pdfjs-web-fonts-disabled = Шрыфты Сеціва забаронены: немагчыма ўжываць укладзеныя шрыфты PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Тэкст +pdfjs-editor-free-text-button-label = Тэкст +pdfjs-editor-ink-button = + .title = Маляваць +pdfjs-editor-ink-button-label = Маляваць +pdfjs-editor-stamp-button = + .title = Дадаць або змяніць выявы +pdfjs-editor-stamp-button-label = Дадаць або змяніць выявы +pdfjs-editor-highlight-button = + .title = Вылучэнне +pdfjs-editor-highlight-button-label = Вылучэнне +pdfjs-highlight-floating-button1 = + .title = Падфарбаваць + .aria-label = Падфарбаваць +pdfjs-highlight-floating-button-label = Падфарбаваць + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Выдаліць малюнак +pdfjs-editor-remove-freetext-button = + .title = Выдаліць тэкст +pdfjs-editor-remove-stamp-button = + .title = Выдаліць выяву +pdfjs-editor-remove-highlight-button = + .title = Выдаліць падфарбоўку + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Колер +pdfjs-editor-free-text-size-input = Памер +pdfjs-editor-ink-color-input = Колер +pdfjs-editor-ink-thickness-input = Таўшчыня +pdfjs-editor-ink-opacity-input = Непразрыстасць +pdfjs-editor-stamp-add-image-button = + .title = Дадаць выяву +pdfjs-editor-stamp-add-image-button-label = Дадаць выяву +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Таўшчыня +pdfjs-editor-free-highlight-thickness-title = + .title = Змяняць таўшчыню пры вылучэнні іншых элементаў, акрамя тэксту +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Тэкставы рэдактар + .default-content = Пачніце ўводзіць… +pdfjs-free-text = + .aria-label = Тэкставы рэдактар +pdfjs-free-text-default-content = Пачніце набор тэксту… +pdfjs-ink = + .aria-label = Графічны рэдактар +pdfjs-ink-canvas = + .aria-label = Выява, створаная карыстальнікам + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Альтэрнатыўны тэкст +pdfjs-editor-alt-text-edit-button = + .aria-label = Змяніць альтэрнатыўны тэкст +pdfjs-editor-alt-text-edit-button-label = Змяніць альтэрнатыўны тэкст +pdfjs-editor-alt-text-dialog-label = Выберыце варыянт +pdfjs-editor-alt-text-dialog-description = Альтэрнатыўны тэкст дапамагае, калі людзі не бачаць выяву або калі яна не загружаецца. +pdfjs-editor-alt-text-add-description-label = Дадаць апісанне +pdfjs-editor-alt-text-add-description-description = Старайцеся скласці 1-2 сказы, якія апісваюць прадмет, абстаноўку або дзеянні. +pdfjs-editor-alt-text-mark-decorative-label = Пазначыць як дэкаратыўны +pdfjs-editor-alt-text-mark-decorative-description = Выкарыстоўваецца для дэкаратыўных выяваў, такіх як рамкі або вадзяныя знакі. +pdfjs-editor-alt-text-cancel-button = Скасаваць +pdfjs-editor-alt-text-save-button = Захаваць +pdfjs-editor-alt-text-decorative-tooltip = Пазначаны як дэкаратыўны +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Напрыклад, «Малады чалавек садзіцца за стол есці» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Альтэрнатыўны тэкст + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Верхні левы кут — змяніць памер +pdfjs-editor-resizer-label-top-middle = Уверсе пасярэдзіне — змяніць памер +pdfjs-editor-resizer-label-top-right = Верхні правы кут — змяніць памер +pdfjs-editor-resizer-label-middle-right = Пасярэдзіне справа — змяніць памер +pdfjs-editor-resizer-label-bottom-right = Правы ніжні кут — змяніць памер +pdfjs-editor-resizer-label-bottom-middle = Пасярэдзіне ўнізе — змяніць памер +pdfjs-editor-resizer-label-bottom-left = Левы ніжні кут — змяніць памер +pdfjs-editor-resizer-label-middle-left = Пасярэдзіне злева — змяніць памер +pdfjs-editor-resizer-top-left = + .aria-label = Верхні левы кут — змяніць памер +pdfjs-editor-resizer-top-middle = + .aria-label = Уверсе пасярэдзіне — змяніць памер +pdfjs-editor-resizer-top-right = + .aria-label = Верхні правы кут — змяніць памер +pdfjs-editor-resizer-middle-right = + .aria-label = Пасярэдзіне справа — змяніць памер +pdfjs-editor-resizer-bottom-right = + .aria-label = Правы ніжні кут — змяніць памер +pdfjs-editor-resizer-bottom-middle = + .aria-label = Пасярэдзіне ўнізе — змяніць памер +pdfjs-editor-resizer-bottom-left = + .aria-label = Левы ніжні кут — змяніць памер +pdfjs-editor-resizer-middle-left = + .aria-label = Пасярэдзіне злева — змяніць памер + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Колер падфарбоўкі +pdfjs-editor-colorpicker-button = + .title = Змяніць колер +pdfjs-editor-colorpicker-dropdown = + .aria-label = Выбар колеру +pdfjs-editor-colorpicker-yellow = + .title = Жоўты +pdfjs-editor-colorpicker-green = + .title = Зялёны +pdfjs-editor-colorpicker-blue = + .title = Блакітны +pdfjs-editor-colorpicker-pink = + .title = Ружовы +pdfjs-editor-colorpicker-red = + .title = Чырвоны + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Паказаць усе +pdfjs-editor-highlight-show-all-button = + .title = Паказаць усе + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Рэдагаваць тэкст для атрыбута alt (апісанне выявы) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Дадаць тэкст для атрыбута alt (апісанне выявы) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напішыце сваё апісанне тут… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Кароткае апісанне для людзей, якія не бачаць выяву, ці калі выява не загружаецца. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Гэты тэкст для атрыбута alt быў створаны аўтаматычна і можа быць недакладным +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Даведацца больш +pdfjs-editor-new-alt-text-create-automatically-button-label = Ствараць тэкст для атрыбута alt аўтаматычна +pdfjs-editor-new-alt-text-not-now-button = Не зараз +pdfjs-editor-new-alt-text-error-title = Не ўдалося аўтаматычна стварыць тэкст для атрыбута alt +pdfjs-editor-new-alt-text-error-description = Калі ласка, напішыце ўласны тэкст для атрыбута alt або паўтарыце спробу пазней. +pdfjs-editor-new-alt-text-error-close-button = Закрыць +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Сцягванне мадэлі ШІ для тэксту для атрыбута alt ({ $downloadedSize } з { $totalSize } МБ) + .aria-valuetext = Сцягванне мадэлі ШІ для тэксту для атрыбута alt ({ $downloadedSize } з { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Тэкст для атрыбута alt дададзены +pdfjs-editor-new-alt-text-added-button-label = Тэкст для атрыбута alt дададзены +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Адсутнічае тэкст для атрыбута alt +pdfjs-editor-new-alt-text-missing-button-label = Адсутнічае тэкст для атрыбута alt +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Водгук на тэкст для атрыбута alt +pdfjs-editor-new-alt-text-to-review-button-label = Водгук на тэкст для атрыбута alt +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Створаны аўтаматычна: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Налады альтэрнатыўнага тэксту для выявы +pdfjs-image-alt-text-settings-button-label = Налады альтэрнатыўнага тэксту для выявы +pdfjs-editor-alt-text-settings-dialog-label = Налады альтэрнатыўнага тэксту для выявы +pdfjs-editor-alt-text-settings-automatic-title = Аўтаматычны тэкст для атрыбута alt +pdfjs-editor-alt-text-settings-create-model-button-label = Ствараць тэкст для атрыбута alt аўтаматычна +pdfjs-editor-alt-text-settings-create-model-description = Прапануе апісанні, каб дапамагчы людзям, якія не бачаць выяву, ці калі выява не загружаецца. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Мадэль ШІ для тэксту для атрыбута alt ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Працуе лакальна на вашай прыладзе, таму вашы звесткі застаюцца прыватнымі. Патрабуецца для аўтаматычнага альтэрнатыўнага тэксту. +pdfjs-editor-alt-text-settings-delete-model-button = Выдаліць +pdfjs-editor-alt-text-settings-download-model-button = Сцягнуць +pdfjs-editor-alt-text-settings-downloading-model-button = Сцягванне… +pdfjs-editor-alt-text-settings-editor-title = Рэдактар тэксту для атрыбута alt +pdfjs-editor-alt-text-settings-show-dialog-button-label = Адразу паказваць рэдактар тэксту для атрыбута alt пры даданні выявы +pdfjs-editor-alt-text-settings-show-dialog-description = Дапамагае пераканацца, што ўсе вашы выявы маюць альтэрнатыўны тэкст. +pdfjs-editor-alt-text-settings-close-button = Закрыць + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Падсвятленне выдалена +pdfjs-editor-undo-bar-message-freetext = Тэкст выдалены +pdfjs-editor-undo-bar-message-ink = Малюнак выдалены +pdfjs-editor-undo-bar-message-stamp = Відарыс выдалены +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } анатацыя выдалена + [few] { $count } анатацыі выдалена + *[many] { $count } анатацый выдалена + } +pdfjs-editor-undo-bar-undo-button = + .title = Адмяніць +pdfjs-editor-undo-bar-undo-button-label = Адмяніць +pdfjs-editor-undo-bar-close-button = + .title = Закрыць +pdfjs-editor-undo-bar-close-button-label = Закрыць diff --git a/public/pdfjs/web/locale/bg/viewer.ftl b/public/pdfjs/web/locale/bg/viewer.ftl new file mode 100644 index 0000000..8b1124e --- /dev/null +++ b/public/pdfjs/web/locale/bg/viewer.ftl @@ -0,0 +1,418 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Предишна страница +pdfjs-previous-button-label = Предишна +pdfjs-next-button = + .title = Следваща страница +pdfjs-next-button-label = Следваща +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Страница +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = от { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } от { $pagesCount }) +pdfjs-zoom-out-button = + .title = Намаляване +pdfjs-zoom-out-button-label = Намаляване +pdfjs-zoom-in-button = + .title = Увеличаване +pdfjs-zoom-in-button-label = Увеличаване +pdfjs-zoom-select = + .title = Мащабиране +pdfjs-presentation-mode-button = + .title = Превключване към режим на представяне +pdfjs-presentation-mode-button-label = Режим на представяне +pdfjs-open-file-button = + .title = Отваряне на файл +pdfjs-open-file-button-label = Отваряне +pdfjs-print-button = + .title = Отпечатване +pdfjs-print-button-label = Отпечатване +pdfjs-save-button = + .title = Запазване +pdfjs-save-button-label = Запазване +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Изтегляне +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Изтегляне +pdfjs-bookmark-button = + .title = Текуща страница (преглед на адреса на страницата) +pdfjs-bookmark-button-label = Текуща страница + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Инструменти +pdfjs-tools-button-label = Инструменти +pdfjs-first-page-button = + .title = Към първата страница +pdfjs-first-page-button-label = Към първата страница +pdfjs-last-page-button = + .title = Към последната страница +pdfjs-last-page-button-label = Към последната страница +pdfjs-page-rotate-cw-button = + .title = Завъртане по час. стрелка +pdfjs-page-rotate-cw-button-label = Завъртане по часовниковата стрелка +pdfjs-page-rotate-ccw-button = + .title = Завъртане обратно на час. стрелка +pdfjs-page-rotate-ccw-button-label = Завъртане обратно на часовниковата стрелка +pdfjs-cursor-text-select-tool-button = + .title = Включване на инструмента за избор на текст +pdfjs-cursor-text-select-tool-button-label = Инструмент за избор на текст +pdfjs-cursor-hand-tool-button = + .title = Включване на инструмента ръка +pdfjs-cursor-hand-tool-button-label = Инструмент ръка +pdfjs-scroll-page-button = + .title = Използване на плъзгане на страници +pdfjs-scroll-page-button-label = Плъзгане на страници +pdfjs-scroll-vertical-button = + .title = Използване на вертикално плъзгане +pdfjs-scroll-vertical-button-label = Вертикално плъзгане +pdfjs-scroll-horizontal-button = + .title = Използване на хоризонтално +pdfjs-scroll-horizontal-button-label = Хоризонтално плъзгане +pdfjs-scroll-wrapped-button = + .title = Използване на мащабируемо плъзгане +pdfjs-scroll-wrapped-button-label = Мащабируемо плъзгане +pdfjs-spread-none-button = + .title = Режимът на сдвояване е изключен +pdfjs-spread-none-button-label = Без сдвояване +pdfjs-spread-odd-button = + .title = Сдвояване, започвайки от нечетните страници +pdfjs-spread-odd-button-label = Нечетните отляво +pdfjs-spread-even-button = + .title = Сдвояване, започвайки от четните страници +pdfjs-spread-even-button-label = Четните отляво + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Свойства на документа… +pdfjs-document-properties-button-label = Свойства на документа… +pdfjs-document-properties-file-name = Име на файл: +pdfjs-document-properties-file-size = Големина на файл: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байта) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байта) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байта) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байта) +pdfjs-document-properties-title = Заглавие: +pdfjs-document-properties-author = Автор: +pdfjs-document-properties-subject = Тема: +pdfjs-document-properties-keywords = Ключови думи: +pdfjs-document-properties-creation-date = Дата на създаване: +pdfjs-document-properties-modification-date = Дата на промяна: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Създател: +pdfjs-document-properties-producer = PDF произведен от: +pdfjs-document-properties-version = Издание на PDF: +pdfjs-document-properties-page-count = Брой страници: +pdfjs-document-properties-page-size = Размер на страницата: +pdfjs-document-properties-page-size-unit-inches = инч +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = портрет +pdfjs-document-properties-page-size-orientation-landscape = пейзаж +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Правни въпроси + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Бърз преглед: +pdfjs-document-properties-linearized-yes = Да +pdfjs-document-properties-linearized-no = Не +pdfjs-document-properties-close-button = Затваряне + +## Print + +pdfjs-print-progress-message = Подготвяне на документа за отпечатване… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Отказ +pdfjs-printing-not-supported = Внимание: Този четец няма пълна поддръжка на отпечатване. +pdfjs-printing-not-ready = Внимание: Този PDF файл не е напълно зареден за печат. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Превключване на страничната лента +pdfjs-toggle-sidebar-notification-button = + .title = Превключване на страничната лента (документът има структура/прикачени файлове/слоеве) +pdfjs-toggle-sidebar-button-label = Превключване на страничната лента +pdfjs-document-outline-button = + .title = Показване на структурата на документа (двукратно щракване за свиване/разгъване на всичко) +pdfjs-document-outline-button-label = Структура на документа +pdfjs-attachments-button = + .title = Показване на притурките +pdfjs-attachments-button-label = Притурки +pdfjs-layers-button = + .title = Показване на слоевете (двукратно щракване за възстановяване на всички слоеве към състоянието по подразбиране) +pdfjs-layers-button-label = Слоеве +pdfjs-thumbs-button = + .title = Показване на миниатюрите +pdfjs-thumbs-button-label = Миниатюри +pdfjs-current-outline-item-button = + .title = Намиране на текущия елемент от структурата +pdfjs-current-outline-item-button-label = Текущ елемент от структурата +pdfjs-findbar-button = + .title = Намиране в документа +pdfjs-findbar-button-label = Търсене +pdfjs-additional-layers = Допълнителни слоеве + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Страница { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Миниатюра на страница { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Търсене + .placeholder = Търсене в документа… +pdfjs-find-previous-button = + .title = Намиране на предишно съвпадение на фразата +pdfjs-find-previous-button-label = Предишна +pdfjs-find-next-button = + .title = Намиране на следващо съвпадение на фразата +pdfjs-find-next-button-label = Следваща +pdfjs-find-highlight-checkbox = Открояване на всички +pdfjs-find-match-case-checkbox-label = Съвпадение на регистъра +pdfjs-find-match-diacritics-checkbox-label = Без производни букви +pdfjs-find-entire-word-checkbox-label = Цели думи +pdfjs-find-reached-top = Достигнато е началото на документа, продължаване от края +pdfjs-find-reached-bottom = Достигнат е краят на документа, продължаване от началото +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } от { $total } съвпадение + *[other] { $current } от { $total } съвпадения + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Повече от { $limit } съвпадение + *[other] Повече от { $limit } съвпадения + } +pdfjs-find-not-found = Фразата не е намерена + +## Predefined zoom values + +pdfjs-page-scale-width = Ширина на страницата +pdfjs-page-scale-fit = Вместване в страницата +pdfjs-page-scale-auto = Автоматично мащабиране +pdfjs-page-scale-actual = Действителен размер +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Страница { $page } + +## Loading indicator messages + +pdfjs-loading-error = Получи се грешка при зареждане на PDF-а. +pdfjs-invalid-file-error = Невалиден или повреден PDF файл. +pdfjs-missing-file-error = Липсващ PDF файл. +pdfjs-unexpected-response-error = Неочакван отговор от сървъра. +pdfjs-rendering-error = Грешка при изчертаване на страницата. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Анотация { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Въведете парола за отваряне на този PDF файл. +pdfjs-password-invalid = Невалидна парола. Моля, опитайте отново. +pdfjs-password-ok-button = Добре +pdfjs-password-cancel-button = Отказ +pdfjs-web-fonts-disabled = Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове. + +## Editing + +pdfjs-editor-free-text-button = + .title = Текст +pdfjs-editor-free-text-button-label = Текст +pdfjs-editor-ink-button = + .title = Рисуване +pdfjs-editor-ink-button-label = Рисуване +pdfjs-editor-stamp-button = + .title = Добавяне или променяне на изображения +pdfjs-editor-stamp-button-label = Добавяне или променяне на изображения + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Премахване на рисунката +pdfjs-editor-remove-freetext-button = + .title = Премахване на текста +pdfjs-editor-remove-stamp-button = + .title = Пермахване на изображението +pdfjs-editor-remove-highlight-button = + .title = Премахване на открояването + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Цвят +pdfjs-editor-free-text-size-input = Размер +pdfjs-editor-ink-color-input = Цвят +pdfjs-editor-ink-thickness-input = Дебелина +pdfjs-editor-ink-opacity-input = Прозрачност +pdfjs-editor-stamp-add-image-button = + .title = Добавяне на изображение +pdfjs-editor-stamp-add-image-button-label = Добавяне на изображение +pdfjs-free-text = + .aria-label = Текстов редактор +pdfjs-free-text-default-content = Започнете да пишете… +pdfjs-ink = + .aria-label = Промяна на рисунка +pdfjs-ink-canvas = + .aria-label = Изображение, създадено от потребител + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button-label = Алтернативен текст +pdfjs-editor-alt-text-edit-button-label = Промяна на алтернативния текст +pdfjs-editor-alt-text-dialog-label = Изберете от възможностите +pdfjs-editor-alt-text-dialog-description = Алтернативният текст помага на потребителите, когато не могат да видят изображението или то не се зарежда. +pdfjs-editor-alt-text-add-description-label = Добавяне на описание +pdfjs-editor-alt-text-add-description-description = Стремете се към 1-2 изречения, описващи предмета, настройката или действията. +pdfjs-editor-alt-text-mark-decorative-label = Отбелязване като декоративно +pdfjs-editor-alt-text-mark-decorative-description = Използва се за орнаменти или декоративни изображения, като контури и водни знаци. +pdfjs-editor-alt-text-cancel-button = Отказ +pdfjs-editor-alt-text-save-button = Запазване +pdfjs-editor-alt-text-decorative-tooltip = Отбелязване като декоративно +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Например, „Млад мъж седи на маса и се храни“ + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Горен ляв ъгъл — преоразмеряване +pdfjs-editor-resizer-label-top-middle = Горе в средата — преоразмеряване +pdfjs-editor-resizer-label-top-right = Горен десен ъгъл — преоразмеряване +pdfjs-editor-resizer-label-middle-right = Дясно в средата — преоразмеряване +pdfjs-editor-resizer-label-bottom-right = Долен десен ъгъл — преоразмеряване +pdfjs-editor-resizer-label-bottom-middle = Долу в средата — преоразмеряване +pdfjs-editor-resizer-label-bottom-left = Долен ляв ъгъл — преоразмеряване +pdfjs-editor-resizer-label-middle-left = Ляво в средата — преоразмеряване +pdfjs-editor-resizer-top-left = + .aria-label = Горен ляв ъгъл — преоразмеряване +pdfjs-editor-resizer-top-middle = + .aria-label = Горе в средата — преоразмеряване +pdfjs-editor-resizer-top-right = + .aria-label = Горен десен ъгъл — преоразмеряване +pdfjs-editor-resizer-middle-right = + .aria-label = Дясно в средата — преоразмеряване +pdfjs-editor-resizer-bottom-right = + .aria-label = Долен десен ъгъл — преоразмеряване +pdfjs-editor-resizer-bottom-middle = + .aria-label = Долу в средата — преоразмеряване +pdfjs-editor-resizer-bottom-left = + .aria-label = Долен ляв ъгъл — преоразмеряване +pdfjs-editor-resizer-middle-left = + .aria-label = Ляво в средата — преоразмеряване + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Цвят на открояване +pdfjs-editor-colorpicker-button = + .title = Промяна на цвят +pdfjs-editor-colorpicker-dropdown = + .aria-label = Избор на цвят +pdfjs-editor-colorpicker-yellow = + .title = Жълто +pdfjs-editor-colorpicker-green = + .title = Зелено +pdfjs-editor-colorpicker-blue = + .title = Синьо +pdfjs-editor-colorpicker-pink = + .title = Розово +pdfjs-editor-colorpicker-red = + .title = Червено + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-not-now-button = Не сега + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/bn/viewer.ftl b/public/pdfjs/web/locale/bn/viewer.ftl new file mode 100644 index 0000000..1e20ecb --- /dev/null +++ b/public/pdfjs/web/locale/bn/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = পূর্ববর্তী পাতা +pdfjs-previous-button-label = পূর্ববর্তী +pdfjs-next-button = + .title = পরবর্তী পাতা +pdfjs-next-button-label = পরবর্তী +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = পাতা +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } এর +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } এর { $pageNumber }) +pdfjs-zoom-out-button = + .title = ছোট আকারে প্রদর্শন +pdfjs-zoom-out-button-label = ছোট আকারে প্রদর্শন +pdfjs-zoom-in-button = + .title = বড় আকারে প্রদর্শন +pdfjs-zoom-in-button-label = বড় আকারে প্রদর্শন +pdfjs-zoom-select = + .title = বড় আকারে প্রদর্শন +pdfjs-presentation-mode-button = + .title = উপস্থাপনা মোডে স্যুইচ করুন +pdfjs-presentation-mode-button-label = উপস্থাপনা মোড +pdfjs-open-file-button = + .title = ফাইল খুলুন +pdfjs-open-file-button-label = খুলুন +pdfjs-print-button = + .title = মুদ্রণ +pdfjs-print-button-label = মুদ্রণ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = টুল +pdfjs-tools-button-label = টুল +pdfjs-first-page-button = + .title = প্রথম পাতায় যাও +pdfjs-first-page-button-label = প্রথম পাতায় যাও +pdfjs-last-page-button = + .title = শেষ পাতায় যাও +pdfjs-last-page-button-label = শেষ পাতায় যাও +pdfjs-page-rotate-cw-button = + .title = ঘড়ির কাঁটার দিকে ঘোরাও +pdfjs-page-rotate-cw-button-label = ঘড়ির কাঁটার দিকে ঘোরাও +pdfjs-page-rotate-ccw-button = + .title = ঘড়ির কাঁটার বিপরীতে ঘোরাও +pdfjs-page-rotate-ccw-button-label = ঘড়ির কাঁটার বিপরীতে ঘোরাও +pdfjs-cursor-text-select-tool-button = + .title = লেখা নির্বাচক টুল সক্রিয় করুন +pdfjs-cursor-text-select-tool-button-label = লেখা নির্বাচক টুল +pdfjs-cursor-hand-tool-button = + .title = হ্যান্ড টুল সক্রিয় করুন +pdfjs-cursor-hand-tool-button-label = হ্যান্ড টুল +pdfjs-scroll-vertical-button = + .title = উলম্ব স্ক্রলিং ব্যবহার করুন +pdfjs-scroll-vertical-button-label = উলম্ব স্ক্রলিং +pdfjs-scroll-horizontal-button = + .title = অনুভূমিক স্ক্রলিং ব্যবহার করুন +pdfjs-scroll-horizontal-button-label = অনুভূমিক স্ক্রলিং +pdfjs-scroll-wrapped-button = + .title = Wrapped স্ক্রোলিং ব্যবহার করুন +pdfjs-scroll-wrapped-button-label = Wrapped স্ক্রোলিং +pdfjs-spread-none-button = + .title = পেজ স্প্রেডগুলোতে যোগদান করবেন না +pdfjs-spread-none-button-label = Spreads নেই +pdfjs-spread-odd-button-label = বিজোড় Spreads +pdfjs-spread-even-button-label = জোড় Spreads + +## Document properties dialog + +pdfjs-document-properties-button = + .title = নথি বৈশিষ্ট্য… +pdfjs-document-properties-button-label = নথি বৈশিষ্ট্য… +pdfjs-document-properties-file-name = ফাইলের নাম: +pdfjs-document-properties-file-size = ফাইলের আকার: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } কেবি ({ $size_b } বাইট) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } এমবি ({ $size_b } বাইট) +pdfjs-document-properties-title = শিরোনাম: +pdfjs-document-properties-author = লেখক: +pdfjs-document-properties-subject = বিষয়: +pdfjs-document-properties-keywords = কীওয়ার্ড: +pdfjs-document-properties-creation-date = তৈরির তারিখ: +pdfjs-document-properties-modification-date = পরিবর্তনের তারিখ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = প্রস্তুতকারক: +pdfjs-document-properties-producer = পিডিএফ প্রস্তুতকারক: +pdfjs-document-properties-version = পিডিএফ সংষ্করণ: +pdfjs-document-properties-page-count = মোট পাতা: +pdfjs-document-properties-page-size = পাতার সাইজ: +pdfjs-document-properties-page-size-unit-inches = এর মধ্যে +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = উলম্ব +pdfjs-document-properties-page-size-orientation-landscape = অনুভূমিক +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = লেটার +pdfjs-document-properties-page-size-name-legal = লীগাল + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = হ্যাঁ +pdfjs-document-properties-linearized-no = না +pdfjs-document-properties-close-button = বন্ধ + +## Print + +pdfjs-print-progress-message = মুদ্রণের জন্য নথি প্রস্তুত করা হচ্ছে… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = বাতিল +pdfjs-printing-not-supported = সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়। +pdfjs-printing-not-ready = সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি। + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = সাইডবার টগল করুন +pdfjs-toggle-sidebar-button-label = সাইডবার টগল করুন +pdfjs-document-outline-button = + .title = নথির আউটলাইন দেখাও (সব আইটেম প্রসারিত/সঙ্কুচিত করতে ডবল ক্লিক করুন) +pdfjs-document-outline-button-label = নথির রূপরেখা +pdfjs-attachments-button = + .title = সংযুক্তি দেখাও +pdfjs-attachments-button-label = সংযুক্তি +pdfjs-thumbs-button = + .title = থাম্বনেইল সমূহ প্রদর্শন করুন +pdfjs-thumbs-button-label = থাম্বনেইল সমূহ +pdfjs-findbar-button = + .title = নথির মধ্যে খুঁজুন +pdfjs-findbar-button-label = খুঁজুন + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = পাতা { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } পাতার থাম্বনেইল + +## Find panel button title and messages + +pdfjs-find-input = + .title = খুঁজুন + .placeholder = নথির মধ্যে খুঁজুন… +pdfjs-find-previous-button = + .title = বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান +pdfjs-find-previous-button-label = পূর্ববর্তী +pdfjs-find-next-button = + .title = বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান +pdfjs-find-next-button-label = পরবর্তী +pdfjs-find-highlight-checkbox = সব হাইলাইট করুন +pdfjs-find-match-case-checkbox-label = অক্ষরের ছাঁদ মেলানো +pdfjs-find-entire-word-checkbox-label = সম্পূর্ণ শব্দ +pdfjs-find-reached-top = পাতার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে +pdfjs-find-reached-bottom = পাতার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে +pdfjs-find-not-found = বাক্যাংশ পাওয়া যায়নি + +## Predefined zoom values + +pdfjs-page-scale-width = পাতার প্রস্থ +pdfjs-page-scale-fit = পাতা ফিট করুন +pdfjs-page-scale-auto = স্বয়ংক্রিয় জুম +pdfjs-page-scale-actual = প্রকৃত আকার +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে। +pdfjs-invalid-file-error = অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল। +pdfjs-missing-file-error = নিখোঁজ PDF ফাইল। +pdfjs-unexpected-response-error = অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া। +pdfjs-rendering-error = পাতা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে। + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } টীকা] + +## Password + +pdfjs-password-label = পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন। +pdfjs-password-invalid = ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন। +pdfjs-password-ok-button = ঠিক আছে +pdfjs-password-cancel-button = বাতিল +pdfjs-web-fonts-disabled = ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না। + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/bo/viewer.ftl b/public/pdfjs/web/locale/bo/viewer.ftl new file mode 100644 index 0000000..824eab4 --- /dev/null +++ b/public/pdfjs/web/locale/bo/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = དྲ་ངོས་སྔོན་མ +pdfjs-previous-button-label = སྔོན་མ +pdfjs-next-button = + .title = དྲ་ངོས་རྗེས་མ +pdfjs-next-button-label = རྗེས་མ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ཤོག་ངོས +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = of { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom Out +pdfjs-zoom-out-button-label = Zoom Out +pdfjs-zoom-in-button = + .title = Zoom In +pdfjs-zoom-in-button-label = Zoom In +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Switch to Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Open File +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Print +pdfjs-print-button-label = Print + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tools +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Go to First Page +pdfjs-first-page-button-label = Go to First Page +pdfjs-last-page-button = + .title = Go to Last Page +pdfjs-last-page-button-label = Go to Last Page +pdfjs-page-rotate-cw-button = + .title = Rotate Clockwise +pdfjs-page-rotate-cw-button-label = Rotate Clockwise +pdfjs-page-rotate-ccw-button = + .title = Rotate Counterclockwise +pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise +pdfjs-cursor-text-select-tool-button = + .title = Enable Text Selection Tool +pdfjs-cursor-text-select-tool-button-label = Text Selection Tool +pdfjs-cursor-hand-tool-button = + .title = Enable Hand Tool +pdfjs-cursor-hand-tool-button-label = Hand Tool +pdfjs-scroll-vertical-button = + .title = Use Vertical Scrolling +pdfjs-scroll-vertical-button-label = Vertical Scrolling +pdfjs-scroll-horizontal-button = + .title = Use Horizontal Scrolling +pdfjs-scroll-horizontal-button-label = Horizontal Scrolling +pdfjs-scroll-wrapped-button = + .title = Use Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = Do not join page spreads +pdfjs-spread-none-button-label = No Spreads +pdfjs-spread-odd-button = + .title = Join page spreads starting with odd-numbered pages +pdfjs-spread-odd-button-label = Odd Spreads +pdfjs-spread-even-button = + .title = Join page spreads starting with even-numbered pages +pdfjs-spread-even-button-label = Even Spreads + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Document Properties… +pdfjs-document-properties-button-label = Document Properties… +pdfjs-document-properties-file-name = File name: +pdfjs-document-properties-file-size = File size: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Title: +pdfjs-document-properties-author = Author: +pdfjs-document-properties-subject = Subject: +pdfjs-document-properties-keywords = Keywords: +pdfjs-document-properties-creation-date = Creation Date: +pdfjs-document-properties-modification-date = Modification Date: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creator: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Page Count: +pdfjs-document-properties-page-size = Page Size: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = landscape +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Yes +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Close + +## Print + +pdfjs-print-progress-message = Preparing document for printing… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancel +pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser. +pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toggle Sidebar +pdfjs-toggle-sidebar-button-label = Toggle Sidebar +pdfjs-document-outline-button = + .title = Show Document Outline (double-click to expand/collapse all items) +pdfjs-document-outline-button-label = Document Outline +pdfjs-attachments-button = + .title = Show Attachments +pdfjs-attachments-button-label = Attachments +pdfjs-thumbs-button = + .title = Show Thumbnails +pdfjs-thumbs-button-label = Thumbnails +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = Find + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail of Page { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Find + .placeholder = Find in document… +pdfjs-find-previous-button = + .title = Find the previous occurrence of the phrase +pdfjs-find-previous-button-label = Previous +pdfjs-find-next-button = + .title = Find the next occurrence of the phrase +pdfjs-find-next-button-label = Next +pdfjs-find-highlight-checkbox = Highlight all +pdfjs-find-match-case-checkbox-label = Match case +pdfjs-find-entire-word-checkbox-label = Whole words +pdfjs-find-reached-top = Reached top of document, continued from bottom +pdfjs-find-reached-bottom = Reached end of document, continued from top +pdfjs-find-not-found = Phrase not found + +## Predefined zoom values + +pdfjs-page-scale-width = Page Width +pdfjs-page-scale-fit = Page Fit +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Actual Size +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = An error occurred while loading the PDF. +pdfjs-invalid-file-error = Invalid or corrupted PDF file. +pdfjs-missing-file-error = Missing PDF file. +pdfjs-unexpected-response-error = Unexpected server response. +pdfjs-rendering-error = An error occurred while rendering the page. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = Enter the password to open this PDF file. +pdfjs-password-invalid = Invalid password. Please try again. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancel +pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/br/viewer.ftl b/public/pdfjs/web/locale/br/viewer.ftl new file mode 100644 index 0000000..60a3df0 --- /dev/null +++ b/public/pdfjs/web/locale/br/viewer.ftl @@ -0,0 +1,340 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pajenn a-raok +pdfjs-previous-button-label = A-raok +pdfjs-next-button = + .title = Pajenn war-lerc'h +pdfjs-next-button-label = War-lerc'h +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pajenn +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = eus { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } war { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoum bihanaat +pdfjs-zoom-out-button-label = Zoum bihanaat +pdfjs-zoom-in-button = + .title = Zoum brasaat +pdfjs-zoom-in-button-label = Zoum brasaat +pdfjs-zoom-select = + .title = Zoum +pdfjs-presentation-mode-button = + .title = Trec'haoliñ etrezek ar mod kinnigadenn +pdfjs-presentation-mode-button-label = Mod kinnigadenn +pdfjs-open-file-button = + .title = Digeriñ ur restr +pdfjs-open-file-button-label = Digeriñ ur restr +pdfjs-print-button = + .title = Moullañ +pdfjs-print-button-label = Moullañ +pdfjs-save-button = + .title = Enrollañ +pdfjs-save-button-label = Enrollañ +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Pellgargañ +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Pellgargañ +pdfjs-bookmark-button-label = Pajenn a-vremañ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ostilhoù +pdfjs-tools-button-label = Ostilhoù +pdfjs-first-page-button = + .title = Mont d'ar bajenn gentañ +pdfjs-first-page-button-label = Mont d'ar bajenn gentañ +pdfjs-last-page-button = + .title = Mont d'ar bajenn diwezhañ +pdfjs-last-page-button-label = Mont d'ar bajenn diwezhañ +pdfjs-page-rotate-cw-button = + .title = C'hwelañ gant roud ar bizied +pdfjs-page-rotate-cw-button-label = C'hwelañ gant roud ar bizied +pdfjs-page-rotate-ccw-button = + .title = C'hwelañ gant roud gin ar bizied +pdfjs-page-rotate-ccw-button-label = C'hwelañ gant roud gin ar bizied +pdfjs-cursor-text-select-tool-button = + .title = Gweredekaat an ostilh diuzañ testenn +pdfjs-cursor-text-select-tool-button-label = Ostilh diuzañ testenn +pdfjs-cursor-hand-tool-button = + .title = Gweredekaat an ostilh dorn +pdfjs-cursor-hand-tool-button-label = Ostilh dorn +pdfjs-scroll-vertical-button = + .title = Arverañ an dibunañ a-blom +pdfjs-scroll-vertical-button-label = Dibunañ a-serzh +pdfjs-scroll-horizontal-button = + .title = Arverañ an dibunañ a-blaen +pdfjs-scroll-horizontal-button-label = Dibunañ a-blaen +pdfjs-scroll-wrapped-button = + .title = Arverañ an dibunañ paket +pdfjs-scroll-wrapped-button-label = Dibunañ paket +pdfjs-spread-none-button = + .title = Chom hep stagañ ar skignadurioù +pdfjs-spread-none-button-label = Skignadenn ebet +pdfjs-spread-odd-button = + .title = Lakaat ar pajennadoù en ur gregiñ gant ar pajennoù ampar +pdfjs-spread-odd-button-label = Pajennoù ampar +pdfjs-spread-even-button = + .title = Lakaat ar pajennadoù en ur gregiñ gant ar pajennoù par +pdfjs-spread-even-button-label = Pajennoù par + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Perzhioù an teul… +pdfjs-document-properties-button-label = Perzhioù an teul… +pdfjs-document-properties-file-name = Anv restr: +pdfjs-document-properties-file-size = Ment ar restr: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } Ke ({ $size_b } eizhbit) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } Me ({ $size_b } eizhbit) +pdfjs-document-properties-title = Titl: +pdfjs-document-properties-author = Aozer: +pdfjs-document-properties-subject = Danvez: +pdfjs-document-properties-keywords = Gerioù-alc'hwez: +pdfjs-document-properties-creation-date = Deiziad krouiñ: +pdfjs-document-properties-modification-date = Deiziad kemmañ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Krouer: +pdfjs-document-properties-producer = Kenderc'her PDF: +pdfjs-document-properties-version = Handelv PDF: +pdfjs-document-properties-page-count = Niver a bajennoù: +pdfjs-document-properties-page-size = Ment ar bajenn: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = poltred +pdfjs-document-properties-page-size-orientation-landscape = gweledva +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Lizher +pdfjs-document-properties-page-size-name-legal = Lezennel + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Gwel Web Herrek: +pdfjs-document-properties-linearized-yes = Ya +pdfjs-document-properties-linearized-no = Ket +pdfjs-document-properties-close-button = Serriñ + +## Print + +pdfjs-print-progress-message = O prientiñ an teul evit moullañ... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Nullañ +pdfjs-printing-not-supported = Kemenn: N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ. +pdfjs-printing-not-ready = Kemenn: N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Diskouez/kuzhat ar varrenn gostez +pdfjs-toggle-sidebar-notification-button = + .title = Trec'haoliñ ar varrenn-gostez (ur steuñv pe stagadennoù a zo en teul) +pdfjs-toggle-sidebar-button-label = Diskouez/kuzhat ar varrenn gostez +pdfjs-document-outline-button = + .title = Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù) +pdfjs-document-outline-button-label = Sinedoù an teuliad +pdfjs-attachments-button = + .title = Diskouez ar c'henstagadurioù +pdfjs-attachments-button-label = Kenstagadurioù +pdfjs-layers-button = + .title = Diskouez ar gwiskadoù (daou-glikañ evit adderaouekaat an holl gwiskadoù d'o stad dre ziouer) +pdfjs-layers-button-label = Gwiskadoù +pdfjs-thumbs-button = + .title = Diskouez ar melvennoù +pdfjs-thumbs-button-label = Melvennoù +pdfjs-findbar-button = + .title = Klask e-barzh an teuliad +pdfjs-findbar-button-label = Klask +pdfjs-additional-layers = Gwiskadoù ouzhpenn + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pajenn { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Melvenn ar bajenn { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Klask + .placeholder = Klask e-barzh an teuliad +pdfjs-find-previous-button = + .title = Kavout an tamm frazenn kent o klotañ ganti +pdfjs-find-previous-button-label = Kent +pdfjs-find-next-button = + .title = Kavout an tamm frazenn war-lerc'h o klotañ ganti +pdfjs-find-next-button-label = War-lerc'h +pdfjs-find-highlight-checkbox = Usskediñ pep tra +pdfjs-find-match-case-checkbox-label = Teurel evezh ouzh ar pennlizherennoù +pdfjs-find-match-diacritics-checkbox-label = Doujañ d’an tiredoù +pdfjs-find-entire-word-checkbox-label = Gerioù a-bezh +pdfjs-find-reached-top = Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz +pdfjs-find-reached-bottom = Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h +pdfjs-find-not-found = N'haller ket kavout ar frazenn + +## Predefined zoom values + +pdfjs-page-scale-width = Led ar bajenn +pdfjs-page-scale-fit = Pajenn a-bezh +pdfjs-page-scale-auto = Zoum emgefreek +pdfjs-page-scale-actual = Ment wir +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pajenn { $page } + +## Loading indicator messages + +pdfjs-loading-error = Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF. +pdfjs-invalid-file-error = Restr PDF didalvoudek pe kontronet. +pdfjs-missing-file-error = Restr PDF o vankout. +pdfjs-unexpected-response-error = Respont dic'hortoz a-berzh an dafariad +pdfjs-rendering-error = Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Notennañ] + +## Password + +pdfjs-password-label = Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ. +pdfjs-password-invalid = Ger-tremen didalvoudek. Klaskit en-dro mar plij. +pdfjs-password-ok-button = Mat eo +pdfjs-password-cancel-button = Nullañ +pdfjs-web-fonts-disabled = Diweredekaet eo an nodrezhoù web: n'haller ket arverañ an nodrezhoù PDF enframmet. + +## Editing + +pdfjs-editor-free-text-button = + .title = Testenn +pdfjs-editor-free-text-button-label = Testenn +pdfjs-editor-ink-button = + .title = Tresañ +pdfjs-editor-ink-button-label = Tresañ +pdfjs-editor-stamp-button = + .title = Ouzhpennañ pe aozañ skeudennoù +pdfjs-editor-stamp-button-label = Ouzhpennañ pe aozañ skeudennoù + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Liv +pdfjs-editor-free-text-size-input = Ment +pdfjs-editor-ink-color-input = Liv +pdfjs-editor-ink-thickness-input = Tevder +pdfjs-editor-ink-opacity-input = Boullder +pdfjs-editor-stamp-add-image-button = + .title = Ouzhpennañ ur skeudenn +pdfjs-editor-stamp-add-image-button-label = Ouzhpennañ ur skeudenn +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tevded +pdfjs-free-text = + .aria-label = Aozer testennoù +pdfjs-ink = + .aria-label = Aozer tresoù +pdfjs-ink-canvas = + .aria-label = Skeudenn bet krouet gant an implijer·ez + +## Alt-text dialog + +pdfjs-editor-alt-text-add-description-label = Ouzhpennañ un deskrivadur +pdfjs-editor-alt-text-cancel-button = Nullañ +pdfjs-editor-alt-text-save-button = Enrollañ + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + +pdfjs-editor-colorpicker-button = + .title = Cheñch liv +pdfjs-editor-colorpicker-yellow = + .title = Melen +pdfjs-editor-colorpicker-blue = + .title = Glas +pdfjs-editor-colorpicker-pink = + .title = Roz +pdfjs-editor-colorpicker-red = + .title = Ruz + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Diskouez pep tra +pdfjs-editor-highlight-show-all-button = + .title = Diskouez pep tra + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Gouzout hiroc’h +pdfjs-editor-new-alt-text-error-close-button = Serriñ + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = Dilemel +pdfjs-editor-alt-text-settings-download-model-button = Pellgargañ +pdfjs-editor-alt-text-settings-downloading-model-button = O pellgargañ… +pdfjs-editor-alt-text-settings-close-button = Serriñ diff --git a/public/pdfjs/web/locale/brx/viewer.ftl b/public/pdfjs/web/locale/brx/viewer.ftl new file mode 100644 index 0000000..53ff72c --- /dev/null +++ b/public/pdfjs/web/locale/brx/viewer.ftl @@ -0,0 +1,218 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = आगोलनि बिलाइ +pdfjs-previous-button-label = आगोलनि +pdfjs-next-button = + .title = उननि बिलाइ +pdfjs-next-button-label = उननि +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = बिलाइ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } नि +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } नि { $pageNumber }) +pdfjs-zoom-out-button = + .title = फिसायै जुम खालाम +pdfjs-zoom-out-button-label = फिसायै जुम खालाम +pdfjs-zoom-in-button = + .title = गेदेरै जुम खालाम +pdfjs-zoom-in-button-label = गेदेरै जुम खालाम +pdfjs-zoom-select = + .title = जुम खालाम +pdfjs-presentation-mode-button = + .title = दिन्थिफुंनाय म'डआव थां +pdfjs-presentation-mode-button-label = दिन्थिफुंनाय म'ड +pdfjs-open-file-button = + .title = फाइलखौ खेव +pdfjs-open-file-button-label = खेव +pdfjs-print-button = + .title = साफाय +pdfjs-print-button-label = साफाय + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = टुल +pdfjs-tools-button-label = टुल +pdfjs-first-page-button = + .title = गिबि बिलाइआव थां +pdfjs-first-page-button-label = गिबि बिलाइआव थां +pdfjs-last-page-button = + .title = जोबथा बिलाइआव थां +pdfjs-last-page-button-label = जोबथा बिलाइआव थां +pdfjs-page-rotate-cw-button = + .title = घरि गिदिंनाय फार्से फिदिं +pdfjs-page-rotate-cw-button-label = घरि गिदिंनाय फार्से फिदिं +pdfjs-page-rotate-ccw-button = + .title = घरि गिदिंनाय उल्था फार्से फिदिं +pdfjs-page-rotate-ccw-button-label = घरि गिदिंनाय उल्था फार्से फिदिं + +## Document properties dialog + +pdfjs-document-properties-button = + .title = फोरमान बिलाइनि आखुथाय... +pdfjs-document-properties-button-label = फोरमान बिलाइनि आखुथाय... +pdfjs-document-properties-file-name = फाइलनि मुं: +pdfjs-document-properties-file-size = फाइलनि महर: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } बाइट) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } बाइट) +pdfjs-document-properties-title = बिमुं: +pdfjs-document-properties-author = लिरगिरि: +pdfjs-document-properties-subject = आयदा: +pdfjs-document-properties-keywords = गाहाय सोदोब: +pdfjs-document-properties-creation-date = सोरजिनाय अक्ट': +pdfjs-document-properties-modification-date = सुद्रायनाय अक्ट': +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = सोरजिग्रा: +pdfjs-document-properties-producer = PDF दिहुनग्रा: +pdfjs-document-properties-version = PDF बिसान: +pdfjs-document-properties-page-count = बिलाइनि हिसाब: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = प'र्ट्रेट +pdfjs-document-properties-page-size-orientation-landscape = लेण्डस्केप +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = लायजाम + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = नंगौ +pdfjs-document-properties-linearized-no = नङा +pdfjs-document-properties-close-button = बन्द खालाम + +## Print + +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = नेवसि +pdfjs-printing-not-supported = सांग्रांथि: साफायनाया बे ब्राउजारजों आबुङै हेफाजाब होजाया। +pdfjs-printing-not-ready = सांग्रांथि: PDF खौ साफायनायनि थाखाय फुरायै ल'ड खालामाखै। + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = टग्गल साइडबार +pdfjs-toggle-sidebar-button-label = टग्गल साइडबार +pdfjs-document-outline-button-label = फोरमान बिलाइ सिमा हांखो +pdfjs-attachments-button = + .title = नांजाब होनायखौ दिन्थि +pdfjs-attachments-button-label = नांजाब होनाय +pdfjs-thumbs-button = + .title = थामनेइलखौ दिन्थि +pdfjs-thumbs-button-label = थामनेइल +pdfjs-findbar-button = + .title = फोरमान बिलाइआव नागिरना दिहुन +pdfjs-findbar-button-label = नायगिरना दिहुन + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = बिलाइ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = बिलाइ { $page } नि थामनेइल + +## Find panel button title and messages + +pdfjs-find-input = + .title = नायगिरना दिहुन + .placeholder = फोरमान बिलाइआव नागिरना दिहुन... +pdfjs-find-previous-button = + .title = बाथ्रा खोन्दोबनि सिगांनि नुजाथिनायखौ नागिर +pdfjs-find-previous-button-label = आगोलनि +pdfjs-find-next-button = + .title = बाथ्रा खोन्दोबनि उननि नुजाथिनायखौ नागिर +pdfjs-find-next-button-label = उननि +pdfjs-find-highlight-checkbox = गासैखौबो हाइलाइट खालाम +pdfjs-find-match-case-checkbox-label = गोरोबनाय केस +pdfjs-find-reached-top = थालो निफ्राय जागायनानै फोरमान बिलाइनि बिजौआव सौहैबाय +pdfjs-find-reached-bottom = बिजौ निफ्राय जागायनानै फोरमान बिलाइनि बिजौआव सौहैबाय +pdfjs-find-not-found = बाथ्रा खोन्दोब मोनाखै + +## Predefined zoom values + +pdfjs-page-scale-width = बिलाइनि गुवार +pdfjs-page-scale-fit = बिलाइ गोरोबनाय +pdfjs-page-scale-auto = गावनोगाव जुम +pdfjs-page-scale-actual = थार महर +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF ल'ड खालामनाय समाव मोनसे गोरोन्थि जाबाय। +pdfjs-invalid-file-error = बाहायजायै एबा गाज्रि जानाय PDF फाइल +pdfjs-missing-file-error = गोमानाय PDF फाइल +pdfjs-unexpected-response-error = मिजिंथियै सार्भार फिननाय। +pdfjs-rendering-error = बिलाइखौ राव सोलायनाय समाव मोनसे गोरोन्थि जादों। + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } सोदोब बेखेवनाय] + +## Password + +pdfjs-password-label = बे PDF फाइलखौ खेवनो पासवार्ड हाबहो। +pdfjs-password-invalid = बाहायजायै पासवार्ड। अननानै फिन नाजा। +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = नेवसि +pdfjs-web-fonts-disabled = वेब फन्टखौ लोरबां खालामबाय: अरजाबहोनाय PDF फन्टखौ बाहायनो हायाखै। + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/bs/viewer.ftl b/public/pdfjs/web/locale/bs/viewer.ftl new file mode 100644 index 0000000..3944042 --- /dev/null +++ b/public/pdfjs/web/locale/bs/viewer.ftl @@ -0,0 +1,223 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Prethodna strana +pdfjs-previous-button-label = Prethodna +pdfjs-next-button = + .title = Sljedeća strna +pdfjs-next-button-label = Sljedeća +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Strana +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = od { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } od { $pagesCount }) +pdfjs-zoom-out-button = + .title = Umanji +pdfjs-zoom-out-button-label = Umanji +pdfjs-zoom-in-button = + .title = Uvećaj +pdfjs-zoom-in-button-label = Uvećaj +pdfjs-zoom-select = + .title = Uvećanje +pdfjs-presentation-mode-button = + .title = Prebaci se u prezentacijski režim +pdfjs-presentation-mode-button-label = Prezentacijski režim +pdfjs-open-file-button = + .title = Otvori fajl +pdfjs-open-file-button-label = Otvori +pdfjs-print-button = + .title = Štampaj +pdfjs-print-button-label = Štampaj + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Alati +pdfjs-tools-button-label = Alati +pdfjs-first-page-button = + .title = Idi na prvu stranu +pdfjs-first-page-button-label = Idi na prvu stranu +pdfjs-last-page-button = + .title = Idi na zadnju stranu +pdfjs-last-page-button-label = Idi na zadnju stranu +pdfjs-page-rotate-cw-button = + .title = Rotiraj u smjeru kazaljke na satu +pdfjs-page-rotate-cw-button-label = Rotiraj u smjeru kazaljke na satu +pdfjs-page-rotate-ccw-button = + .title = Rotiraj suprotno smjeru kazaljke na satu +pdfjs-page-rotate-ccw-button-label = Rotiraj suprotno smjeru kazaljke na satu +pdfjs-cursor-text-select-tool-button = + .title = Omogući alat za označavanje teksta +pdfjs-cursor-text-select-tool-button-label = Alat za označavanje teksta +pdfjs-cursor-hand-tool-button = + .title = Omogući ručni alat +pdfjs-cursor-hand-tool-button-label = Ručni alat + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Svojstva dokumenta... +pdfjs-document-properties-button-label = Svojstva dokumenta... +pdfjs-document-properties-file-name = Naziv fajla: +pdfjs-document-properties-file-size = Veličina fajla: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajta) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajta) +pdfjs-document-properties-title = Naslov: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Predmet: +pdfjs-document-properties-keywords = Ključne riječi: +pdfjs-document-properties-creation-date = Datum kreiranja: +pdfjs-document-properties-modification-date = Datum promjene: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Kreator: +pdfjs-document-properties-producer = PDF stvaratelj: +pdfjs-document-properties-version = PDF verzija: +pdfjs-document-properties-page-count = Broj stranica: +pdfjs-document-properties-page-size = Veličina stranice: +pdfjs-document-properties-page-size-unit-inches = u +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = uspravno +pdfjs-document-properties-page-size-orientation-landscape = vodoravno +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Pismo +pdfjs-document-properties-page-size-name-legal = Pravni + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-close-button = Zatvori + +## Print + +pdfjs-print-progress-message = Pripremam dokument za štampu… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Otkaži +pdfjs-printing-not-supported = Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru. +pdfjs-printing-not-ready = Upozorenje: PDF nije u potpunosti učitan za štampanje. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Uključi/isključi bočnu traku +pdfjs-toggle-sidebar-button-label = Uključi/isključi bočnu traku +pdfjs-document-outline-button = + .title = Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki) +pdfjs-document-outline-button-label = Konture dokumenta +pdfjs-attachments-button = + .title = Prikaži priloge +pdfjs-attachments-button-label = Prilozi +pdfjs-thumbs-button = + .title = Prikaži thumbnailove +pdfjs-thumbs-button-label = Thumbnailovi +pdfjs-findbar-button = + .title = Pronađi u dokumentu +pdfjs-findbar-button-label = Pronađi + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Strana { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail strane { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Pronađi + .placeholder = Pronađi u dokumentu… +pdfjs-find-previous-button = + .title = Pronađi prethodno pojavljivanje fraze +pdfjs-find-previous-button-label = Prethodno +pdfjs-find-next-button = + .title = Pronađi sljedeće pojavljivanje fraze +pdfjs-find-next-button-label = Sljedeće +pdfjs-find-highlight-checkbox = Označi sve +pdfjs-find-match-case-checkbox-label = Osjetljivost na karaktere +pdfjs-find-reached-top = Dostigao sam vrh dokumenta, nastavljam sa dna +pdfjs-find-reached-bottom = Dostigao sam kraj dokumenta, nastavljam sa vrha +pdfjs-find-not-found = Fraza nije pronađena + +## Predefined zoom values + +pdfjs-page-scale-width = Širina strane +pdfjs-page-scale-fit = Uklopi stranu +pdfjs-page-scale-auto = Automatsko uvećanje +pdfjs-page-scale-actual = Stvarna veličina +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Došlo je do greške prilikom učitavanja PDF-a. +pdfjs-invalid-file-error = Neispravan ili oštećen PDF fajl. +pdfjs-missing-file-error = Nedostaje PDF fajl. +pdfjs-unexpected-response-error = Neočekivani odgovor servera. +pdfjs-rendering-error = Došlo je do greške prilikom renderiranja strane. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } pribilješka] + +## Password + +pdfjs-password-label = Upišite lozinku da biste otvorili ovaj PDF fajl. +pdfjs-password-invalid = Pogrešna lozinka. Pokušajte ponovo. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Otkaži +pdfjs-web-fonts-disabled = Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ca/viewer.ftl b/public/pdfjs/web/locale/ca/viewer.ftl new file mode 100644 index 0000000..7417741 --- /dev/null +++ b/public/pdfjs/web/locale/ca/viewer.ftl @@ -0,0 +1,313 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pàgina anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Pàgina següent +pdfjs-next-button-label = Següent +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pàgina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Redueix +pdfjs-zoom-out-button-label = Redueix +pdfjs-zoom-in-button = + .title = Amplia +pdfjs-zoom-in-button-label = Amplia +pdfjs-zoom-select = + .title = Escala +pdfjs-presentation-mode-button = + .title = Canvia al mode de presentació +pdfjs-presentation-mode-button-label = Mode de presentació +pdfjs-open-file-button = + .title = Obre el fitxer +pdfjs-open-file-button-label = Obre +pdfjs-print-button = + .title = Imprimeix +pdfjs-print-button-label = Imprimeix +pdfjs-save-button = + .title = Desa +pdfjs-save-button-label = Desa +pdfjs-bookmark-button = + .title = Pàgina actual (mostra l'URL de la pàgina actual) +pdfjs-bookmark-button-label = Pàgina actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Eines +pdfjs-tools-button-label = Eines +pdfjs-first-page-button = + .title = Vés a la primera pàgina +pdfjs-first-page-button-label = Vés a la primera pàgina +pdfjs-last-page-button = + .title = Vés a l'última pàgina +pdfjs-last-page-button-label = Vés a l'última pàgina +pdfjs-page-rotate-cw-button = + .title = Gira cap a la dreta +pdfjs-page-rotate-cw-button-label = Gira cap a la dreta +pdfjs-page-rotate-ccw-button = + .title = Gira cap a l'esquerra +pdfjs-page-rotate-ccw-button-label = Gira cap a l'esquerra +pdfjs-cursor-text-select-tool-button = + .title = Habilita l'eina de selecció de text +pdfjs-cursor-text-select-tool-button-label = Eina de selecció de text +pdfjs-cursor-hand-tool-button = + .title = Habilita l'eina de mà +pdfjs-cursor-hand-tool-button-label = Eina de mà +pdfjs-scroll-page-button = + .title = Usa el desplaçament de pàgina +pdfjs-scroll-page-button-label = Desplaçament de pàgina +pdfjs-scroll-vertical-button = + .title = Utilitza el desplaçament vertical +pdfjs-scroll-vertical-button-label = Desplaçament vertical +pdfjs-scroll-horizontal-button = + .title = Utilitza el desplaçament horitzontal +pdfjs-scroll-horizontal-button-label = Desplaçament horitzontal +pdfjs-scroll-wrapped-button = + .title = Activa el desplaçament continu +pdfjs-scroll-wrapped-button-label = Desplaçament continu +pdfjs-spread-none-button = + .title = No agrupis les pàgines de dues en dues +pdfjs-spread-none-button-label = Una sola pàgina +pdfjs-spread-odd-button = + .title = Mostra dues pàgines començant per les pàgines de numeració senar +pdfjs-spread-odd-button-label = Doble pàgina (senar) +pdfjs-spread-even-button = + .title = Mostra dues pàgines començant per les pàgines de numeració parell +pdfjs-spread-even-button-label = Doble pàgina (parell) + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propietats del document… +pdfjs-document-properties-button-label = Propietats del document… +pdfjs-document-properties-file-name = Nom del fitxer: +pdfjs-document-properties-file-size = Mida del fitxer: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Títol: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Assumpte: +pdfjs-document-properties-keywords = Paraules clau: +pdfjs-document-properties-creation-date = Data de creació: +pdfjs-document-properties-modification-date = Data de modificació: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creador: +pdfjs-document-properties-producer = Generador de PDF: +pdfjs-document-properties-version = Versió de PDF: +pdfjs-document-properties-page-count = Nombre de pàgines: +pdfjs-document-properties-page-size = Mida de la pàgina: +pdfjs-document-properties-page-size-unit-inches = polzades +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = apaïsat +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista web ràpida: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Tanca + +## Print + +pdfjs-print-progress-message = S'està preparant la impressió del document… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancel·la +pdfjs-printing-not-supported = Avís: la impressió no és plenament funcional en aquest navegador. +pdfjs-printing-not-ready = Atenció: el PDF no s'ha acabat de carregar per imprimir-lo. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Mostra/amaga la barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Mostra/amaga la barra lateral (el document conté un esquema, adjuncions o capes) +pdfjs-toggle-sidebar-button-label = Mostra/amaga la barra lateral +pdfjs-document-outline-button = + .title = Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements) +pdfjs-document-outline-button-label = Esquema del document +pdfjs-attachments-button = + .title = Mostra les adjuncions +pdfjs-attachments-button-label = Adjuncions +pdfjs-layers-button = + .title = Mostra les capes (doble clic per restablir totes les capes al seu estat per defecte) +pdfjs-layers-button-label = Capes +pdfjs-thumbs-button = + .title = Mostra les miniatures +pdfjs-thumbs-button-label = Miniatures +pdfjs-current-outline-item-button = + .title = Cerca l'element d'esquema actual +pdfjs-current-outline-item-button-label = Element d'esquema actual +pdfjs-findbar-button = + .title = Cerca al document +pdfjs-findbar-button-label = Cerca +pdfjs-additional-layers = Capes addicionals + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pàgina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura de la pàgina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Cerca + .placeholder = Cerca al document… +pdfjs-find-previous-button = + .title = Cerca l'anterior coincidència de l'expressió +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Cerca la següent coincidència de l'expressió +pdfjs-find-next-button-label = Següent +pdfjs-find-highlight-checkbox = Ressalta-ho tot +pdfjs-find-match-case-checkbox-label = Distingeix entre majúscules i minúscules +pdfjs-find-match-diacritics-checkbox-label = Respecta els diacrítics +pdfjs-find-entire-word-checkbox-label = Paraules senceres +pdfjs-find-reached-top = S'ha arribat al principi del document, es continua pel final +pdfjs-find-reached-bottom = S'ha arribat al final del document, es continua pel principi +pdfjs-find-not-found = No s'ha trobat l'expressió + +## Predefined zoom values + +pdfjs-page-scale-width = Amplada de la pàgina +pdfjs-page-scale-fit = Ajusta la pàgina +pdfjs-page-scale-auto = Zoom automàtic +pdfjs-page-scale-actual = Mida real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pàgina { $page } + +## Loading indicator messages + +pdfjs-loading-error = S'ha produït un error en carregar el PDF. +pdfjs-invalid-file-error = El fitxer PDF no és vàlid o està malmès. +pdfjs-missing-file-error = Falta el fitxer PDF. +pdfjs-unexpected-response-error = Resposta inesperada del servidor. +pdfjs-rendering-error = S'ha produït un error mentre es renderitzava la pàgina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotació { $type }] + +## Password + +pdfjs-password-label = Introduïu la contrasenya per obrir aquest fitxer PDF. +pdfjs-password-invalid = La contrasenya no és vàlida. Torneu-ho a provar. +pdfjs-password-ok-button = D'acord +pdfjs-password-cancel-button = Cancel·la +pdfjs-web-fonts-disabled = Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Dibuixa +pdfjs-editor-ink-button-label = Dibuixa + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Mida +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Gruix +pdfjs-editor-ink-opacity-input = Opacitat +pdfjs-free-text = + .aria-label = Editor de text +pdfjs-free-text-default-content = Escriviu… +pdfjs-ink = + .aria-label = Editor de dibuix +pdfjs-ink-canvas = + .aria-label = Imatge creada per l'usuari + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/cak/viewer.ftl b/public/pdfjs/web/locale/cak/viewer.ftl new file mode 100644 index 0000000..f40c1e9 --- /dev/null +++ b/public/pdfjs/web/locale/cak/viewer.ftl @@ -0,0 +1,291 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Jun kan ruxaq +pdfjs-previous-button-label = Jun kan +pdfjs-next-button = + .title = Jun chik ruxaq +pdfjs-next-button-label = Jun chik +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Ruxaq +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = richin { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } richin { $pagesCount }) +pdfjs-zoom-out-button = + .title = Tich'utinirisäx +pdfjs-zoom-out-button-label = Tich'utinirisäx +pdfjs-zoom-in-button = + .title = Tinimirisäx +pdfjs-zoom-in-button-label = Tinimirisäx +pdfjs-zoom-select = + .title = Sum +pdfjs-presentation-mode-button = + .title = Tijal ri rub'anikil niwachin +pdfjs-presentation-mode-button-label = Pa rub'eyal niwachin +pdfjs-open-file-button = + .title = Tijaq Yakb'äl +pdfjs-open-file-button-label = Tijaq +pdfjs-print-button = + .title = Titz'ajb'äx +pdfjs-print-button-label = Titz'ajb'äx +pdfjs-save-button = + .title = Tiyak +pdfjs-save-button-label = Tiyak +pdfjs-bookmark-button-label = Ruxaq k'o wakami + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Samajib'äl +pdfjs-tools-button-label = Samajib'äl +pdfjs-first-page-button = + .title = Tib'e pa nab'ey ruxaq +pdfjs-first-page-button-label = Tib'e pa nab'ey ruxaq +pdfjs-last-page-button = + .title = Tib'e pa ruk'isib'äl ruxaq +pdfjs-last-page-button-label = Tib'e pa ruk'isib'äl ruxaq +pdfjs-page-rotate-cw-button = + .title = Tisutïx pan ajkiq'a' +pdfjs-page-rotate-cw-button-label = Tisutïx pan ajkiq'a' +pdfjs-page-rotate-ccw-button = + .title = Tisutïx pan ajxokon +pdfjs-page-rotate-ccw-button-label = Tisutïx pan ajxokon +pdfjs-cursor-text-select-tool-button = + .title = Titzij ri rusamajib'al Rucha'ik Rucholajem Tzij +pdfjs-cursor-text-select-tool-button-label = Rusamajib'al Rucha'ik Rucholajem Tzij +pdfjs-cursor-hand-tool-button = + .title = Titzij ri q'ab'aj samajib'äl +pdfjs-cursor-hand-tool-button-label = Q'ab'aj Samajib'äl +pdfjs-scroll-page-button = + .title = Tokisäx Ruxaq Q'axanem +pdfjs-scroll-page-button-label = Ruxaq Q'axanem +pdfjs-scroll-vertical-button = + .title = Tokisäx Pa'äl Q'axanem +pdfjs-scroll-vertical-button-label = Pa'äl Q'axanem +pdfjs-scroll-horizontal-button = + .title = Tokisäx Kotz'öl Q'axanem +pdfjs-scroll-horizontal-button-label = Kotz'öl Q'axanem +pdfjs-scroll-wrapped-button = + .title = Tokisäx Tzub'aj Q'axanem +pdfjs-scroll-wrapped-button-label = Tzub'aj Q'axanem +pdfjs-spread-none-button = + .title = Man ketun taq ruxaq pa rub'eyal wuj +pdfjs-spread-none-button-label = Majun Rub'eyal +pdfjs-spread-odd-button = + .title = Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun man k'ulaj ta rajilab'al +pdfjs-spread-odd-button-label = Man K'ulaj Ta Rub'eyal +pdfjs-spread-even-button = + .title = Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun k'ulaj rajilab'al +pdfjs-spread-even-button-label = K'ulaj Rub'eyal + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Taq richinil wuj… +pdfjs-document-properties-button-label = Taq richinil wuj… +pdfjs-document-properties-file-name = Rub'i' yakb'äl: +pdfjs-document-properties-file-size = Runimilem yakb'äl: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = B'i'aj: +pdfjs-document-properties-author = B'anel: +pdfjs-document-properties-subject = Taqikil: +pdfjs-document-properties-keywords = Kixe'el taq tzij: +pdfjs-document-properties-creation-date = Ruq'ijul xtz'uk: +pdfjs-document-properties-modification-date = Ruq'ijul xjalwachïx: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Q'inonel: +pdfjs-document-properties-producer = PDF b'anöy: +pdfjs-document-properties-version = PDF ruwäch: +pdfjs-document-properties-page-count = Jarupe' ruxaq: +pdfjs-document-properties-page-size = Runimilem ri Ruxaq: +pdfjs-document-properties-page-size-unit-inches = pa +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = rupalem +pdfjs-document-properties-page-size-orientation-landscape = rukotz'olem +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Loman wuj +pdfjs-document-properties-page-size-name-legal = Taqanel tzijol + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Anin Rutz'etik Ajk'amaya'l: +pdfjs-document-properties-linearized-yes = Ja' +pdfjs-document-properties-linearized-no = Mani +pdfjs-document-properties-close-button = Titz'apïx + +## Print + +pdfjs-print-progress-message = Ruchojmirisaxik wuj richin nitz'ajb'äx… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Tiq'at +pdfjs-printing-not-supported = Rutzijol k'ayewal: Ri rutz'ajb'axik man koch'el ta ronojel pa re okik'amaya'l re'. +pdfjs-printing-not-ready = Rutzijol k'ayewal: Ri PDF man xusamajij ta ronojel richin nitz'ajb'äx. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Tijal ri ajxikin kajtz'ik +pdfjs-toggle-sidebar-notification-button = + .title = Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqo/kuchuj) +pdfjs-toggle-sidebar-button-label = Tijal ri ajxikin kajtz'ik +pdfjs-document-outline-button = + .title = Tik'ut pe ruch'akulal wuj (kamul-pitz'oj richin nirik'/nich'utinirisäx ronojel ruch'akulal) +pdfjs-document-outline-button-label = Ruch'akulal wuj +pdfjs-attachments-button = + .title = Kek'ut pe ri taq taqoj +pdfjs-attachments-button-label = Taq taqoj +pdfjs-layers-button = + .title = Kek'ut taq Kuchuj (ka'i'-pitz' richin yetzolïx ronojel ri taq kuchuj e k'o wi) +pdfjs-layers-button-label = Taq kuchuj +pdfjs-thumbs-button = + .title = Kek'ut pe taq ch'utiq +pdfjs-thumbs-button-label = Koköj +pdfjs-current-outline-item-button = + .title = Kekanöx Taq Ch'akulal Kik'wan Chib'äl +pdfjs-current-outline-item-button-label = Taq Ch'akulal Kik'wan Chib'äl +pdfjs-findbar-button = + .title = Tikanöx chupam ri wuj +pdfjs-findbar-button-label = Tikanöx +pdfjs-additional-layers = Tz'aqat ta Kuchuj + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Ruxaq { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Ruch'utinirisaxik ruxaq { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Tikanöx + .placeholder = Tikanöx pa wuj… +pdfjs-find-previous-button = + .title = Tib'an b'enam pa ri jun kan q'aptzij xilitäj +pdfjs-find-previous-button-label = Jun kan +pdfjs-find-next-button = + .title = Tib'e pa ri jun chik pajtzij xilitäj +pdfjs-find-next-button-label = Jun chik +pdfjs-find-highlight-checkbox = Tiya' retal ronojel +pdfjs-find-match-case-checkbox-label = Tuk'äm ri' kik'in taq nimatz'ib' chuqa' taq ch'utitz'ib' +pdfjs-find-match-diacritics-checkbox-label = Tiya' Kikojol Tz'aqat taq Tz'ib' +pdfjs-find-entire-word-checkbox-label = Tz'aqät taq tzij +pdfjs-find-reached-top = Xb'eq'i' ri rutikirib'al wuj, xtikanöx k'a pa ruk'isib'äl +pdfjs-find-reached-bottom = Xb'eq'i' ri ruk'isib'äl wuj, xtikanöx pa rutikirib'al +pdfjs-find-not-found = Man xilitäj ta ri pajtzij + +## Predefined zoom values + +pdfjs-page-scale-width = Ruwa ruxaq +pdfjs-page-scale-fit = Tinuk' ruxaq +pdfjs-page-scale-auto = Yonil chi nimilem +pdfjs-page-scale-actual = Runimilem Wakami +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Ruxaq { $page } + +## Loading indicator messages + +pdfjs-loading-error = Xk'ulwachitäj jun sach'oj toq xnuk'ux ri PDF . +pdfjs-invalid-file-error = Man oke ta o yujtajinäq ri PDF yakb'äl. +pdfjs-missing-file-error = Man xilitäj ta ri PDF yakb'äl. +pdfjs-unexpected-response-error = Man oyob'en ta tz'olin rutzij ruk'u'x samaj. +pdfjs-rendering-error = Xk'ulwachitäj jun sachoj toq ninuk'wachij ri ruxaq. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Tz'ib'anïk] + +## Password + +pdfjs-password-label = Tatz'ib'aj ri ewan tzij richin najäq re yakb'äl re' pa PDF. +pdfjs-password-invalid = Man okel ta ri ewan tzij: Tatojtob'ej chik. +pdfjs-password-ok-button = Ütz +pdfjs-password-cancel-button = Tiq'at +pdfjs-web-fonts-disabled = E chupül ri taq ajk'amaya'l tz'ib': man tikirel ta nokisäx ri taq tz'ib' PDF pa ch'ikenïk + +## Editing + +pdfjs-editor-free-text-button = + .title = Rucholajem tz'ib' +pdfjs-editor-free-text-button-label = Rucholajem tz'ib' +pdfjs-editor-ink-button = + .title = Tiwachib'ëx +pdfjs-editor-ink-button-label = Tiwachib'ëx +# Editor Parameters +pdfjs-editor-free-text-color-input = B'onil +pdfjs-editor-free-text-size-input = Nimilem +pdfjs-editor-ink-color-input = B'onil +pdfjs-editor-ink-thickness-input = Rupimil +pdfjs-editor-ink-opacity-input = Q'equmal +pdfjs-free-text = + .aria-label = Nuk'unel tz'ib'atzij +pdfjs-free-text-default-content = Titikitisäx rutz'ib'axik… +pdfjs-ink = + .aria-label = Nuk'unel wachib'äl +pdfjs-ink-canvas = + .aria-label = Wachib'äl nuk'un ruma okisaxel + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ckb/viewer.ftl b/public/pdfjs/web/locale/ckb/viewer.ftl new file mode 100644 index 0000000..ae87335 --- /dev/null +++ b/public/pdfjs/web/locale/ckb/viewer.ftl @@ -0,0 +1,242 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = پەڕەی پێشوو +pdfjs-previous-button-label = پێشوو +pdfjs-next-button = + .title = پەڕەی دوواتر +pdfjs-next-button-label = دوواتر +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = پەرە +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = لە { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } لە { $pagesCount }) +pdfjs-zoom-out-button = + .title = ڕۆچوونی +pdfjs-zoom-out-button-label = ڕۆچوونی +pdfjs-zoom-in-button = + .title = هێنانەپێش +pdfjs-zoom-in-button-label = هێنانەپێش +pdfjs-zoom-select = + .title = زووم +pdfjs-presentation-mode-button = + .title = گۆڕین بۆ دۆخی پێشکەشکردن +pdfjs-presentation-mode-button-label = دۆخی پێشکەشکردن +pdfjs-open-file-button = + .title = پەڕگە بکەرەوە +pdfjs-open-file-button-label = کردنەوە +pdfjs-print-button = + .title = چاپکردن +pdfjs-print-button-label = چاپکردن + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ئامرازەکان +pdfjs-tools-button-label = ئامرازەکان +pdfjs-first-page-button = + .title = برۆ بۆ یەکەم پەڕە +pdfjs-first-page-button-label = بڕۆ بۆ یەکەم پەڕە +pdfjs-last-page-button = + .title = بڕۆ بۆ کۆتا پەڕە +pdfjs-last-page-button-label = بڕۆ بۆ کۆتا پەڕە +pdfjs-page-rotate-cw-button = + .title = ئاڕاستەی میلی کاتژمێر +pdfjs-page-rotate-cw-button-label = ئاڕاستەی میلی کاتژمێر +pdfjs-page-rotate-ccw-button = + .title = پێچەوانەی میلی کاتژمێر +pdfjs-page-rotate-ccw-button-label = پێچەوانەی میلی کاتژمێر +pdfjs-cursor-text-select-tool-button = + .title = توڵامرازی نیشانکەری دەق چالاک بکە +pdfjs-cursor-text-select-tool-button-label = توڵامرازی نیشانکەری دەق +pdfjs-cursor-hand-tool-button = + .title = توڵامرازی دەستی چالاک بکە +pdfjs-cursor-hand-tool-button-label = توڵامرازی دەستی +pdfjs-scroll-vertical-button = + .title = ناردنی ئەستوونی بەکاربێنە +pdfjs-scroll-vertical-button-label = ناردنی ئەستوونی +pdfjs-scroll-horizontal-button = + .title = ناردنی ئاسۆیی بەکاربێنە +pdfjs-scroll-horizontal-button-label = ناردنی ئاسۆیی +pdfjs-scroll-wrapped-button = + .title = ناردنی لوولکراو بەکاربێنە +pdfjs-scroll-wrapped-button-label = ناردنی لوولکراو + +## Document properties dialog + +pdfjs-document-properties-button = + .title = تایبەتمەندییەکانی بەڵگەنامە... +pdfjs-document-properties-button-label = تایبەتمەندییەکانی بەڵگەنامە... +pdfjs-document-properties-file-name = ناوی پەڕگە: +pdfjs-document-properties-file-size = قەبارەی پەڕگە: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } کب ({ $size_b } بایت) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } مب ({ $size_b } بایت) +pdfjs-document-properties-title = سەردێڕ: +pdfjs-document-properties-author = نووسەر +pdfjs-document-properties-subject = بابەت: +pdfjs-document-properties-keywords = کلیلەوشە: +pdfjs-document-properties-creation-date = بەرواری درووستکردن: +pdfjs-document-properties-modification-date = بەرواری دەستکاریکردن: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = درووستکەر: +pdfjs-document-properties-producer = بەرهەمهێنەری PDF: +pdfjs-document-properties-version = وەشانی PDF: +pdfjs-document-properties-page-count = ژمارەی پەرەکان: +pdfjs-document-properties-page-size = قەبارەی پەڕە: +pdfjs-document-properties-page-size-unit-inches = ئینچ +pdfjs-document-properties-page-size-unit-millimeters = ملم +pdfjs-document-properties-page-size-orientation-portrait = پۆرترەیت(درێژ) +pdfjs-document-properties-page-size-orientation-landscape = پانیی +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = نامە +pdfjs-document-properties-page-size-name-legal = یاسایی + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = پیشاندانی وێبی خێرا: +pdfjs-document-properties-linearized-yes = بەڵێ +pdfjs-document-properties-linearized-no = نەخێر +pdfjs-document-properties-close-button = داخستن + +## Print + +pdfjs-print-progress-message = بەڵگەنامە ئامادەدەکرێت بۆ چاپکردن... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = پاشگەزبوونەوە +pdfjs-printing-not-supported = ئاگاداربە: چاپکردن بە تەواوی پشتگیر ناکرێت لەم وێبگەڕە. +pdfjs-printing-not-ready = ئاگاداربە: PDF بە تەواوی بارنەبووە بۆ چاپکردن. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = لاتەنیشت پیشاندان/شاردنەوە +pdfjs-toggle-sidebar-button-label = لاتەنیشت پیشاندان/شاردنەوە +pdfjs-document-outline-button-label = سنووری چوارچێوە +pdfjs-attachments-button = + .title = پاشکۆکان پیشان بدە +pdfjs-attachments-button-label = پاشکۆکان +pdfjs-layers-button-label = چینەکان +pdfjs-thumbs-button = + .title = وێنۆچکە پیشان بدە +pdfjs-thumbs-button-label = وێنۆچکە +pdfjs-findbar-button = + .title = لە بەڵگەنامە بگەرێ +pdfjs-findbar-button-label = دۆزینەوە +pdfjs-additional-layers = چینی زیاتر + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = پەڕەی { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = وێنۆچکەی پەڕەی { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = دۆزینەوە + .placeholder = لە بەڵگەنامە بگەرێ... +pdfjs-find-previous-button = + .title = هەبوونی پێشوو بدۆزرەوە لە ڕستەکەدا +pdfjs-find-previous-button-label = پێشوو +pdfjs-find-next-button = + .title = هەبوونی داهاتوو بدۆزەرەوە لە ڕستەکەدا +pdfjs-find-next-button-label = دوواتر +pdfjs-find-highlight-checkbox = هەمووی نیشانە بکە +pdfjs-find-match-case-checkbox-label = دۆخی لەیەکچوون +pdfjs-find-entire-word-checkbox-label = هەموو وشەکان +pdfjs-find-reached-top = گەشتیتە سەرەوەی بەڵگەنامە، لە خوارەوە دەستت پێکرد +pdfjs-find-reached-bottom = گەشتیتە کۆتایی بەڵگەنامە. لەسەرەوە دەستت پێکرد +pdfjs-find-not-found = نووسین نەدۆزرایەوە + +## Predefined zoom values + +pdfjs-page-scale-width = پانی پەڕە +pdfjs-page-scale-fit = پڕبوونی پەڕە +pdfjs-page-scale-auto = زوومی خۆکار +pdfjs-page-scale-actual = قەبارەی ڕاستی +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = هەڵەیەک ڕوویدا لە کاتی بارکردنی PDF. +pdfjs-invalid-file-error = پەڕگەی pdf تێکچووە یان نەگونجاوە. +pdfjs-missing-file-error = پەڕگەی pdf بوونی نیە. +pdfjs-unexpected-response-error = وەڵامی ڕاژەخوازی نەخوازراو. +pdfjs-rendering-error = هەڵەیەک ڕوویدا لە کاتی پوختەکردنی (ڕێندەر) پەڕە. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } سەرنج] + +## Password + +pdfjs-password-label = وشەی تێپەڕ بنووسە بۆ کردنەوەی پەڕگەی pdf. +pdfjs-password-invalid = وشەی تێپەڕ هەڵەیە. تکایە دووبارە هەوڵ بدەرەوە. +pdfjs-password-ok-button = باشە +pdfjs-password-cancel-button = پاشگەزبوونەوە +pdfjs-web-fonts-disabled = جۆرەپیتی وێب ناچالاکە: نەتوانی جۆرەپیتی تێخراوی ناو pdfـەکە بەکاربێت. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/cs/viewer.ftl b/public/pdfjs/web/locale/cs/viewer.ftl new file mode 100644 index 0000000..696fe30 --- /dev/null +++ b/public/pdfjs/web/locale/cs/viewer.ftl @@ -0,0 +1,521 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Přejde na předchozí stránku +pdfjs-previous-button-label = Předchozí +pdfjs-next-button = + .title = Přejde na následující stránku +pdfjs-next-button-label = Další +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Stránka +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = z { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zmenší velikost +pdfjs-zoom-out-button-label = Zmenšit +pdfjs-zoom-in-button = + .title = Zvětší velikost +pdfjs-zoom-in-button-label = Zvětšit +pdfjs-zoom-select = + .title = Nastaví velikost +pdfjs-presentation-mode-button = + .title = Přepne do režimu prezentace +pdfjs-presentation-mode-button-label = Režim prezentace +pdfjs-open-file-button = + .title = Otevře soubor +pdfjs-open-file-button-label = Otevřít +pdfjs-print-button = + .title = Vytiskne dokument +pdfjs-print-button-label = Vytisknout +pdfjs-save-button = + .title = Uložit +pdfjs-save-button-label = Uložit +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Stáhnout +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Stáhnout +pdfjs-bookmark-button = + .title = Aktuální stránka (zobrazit URL od aktuální stránky) +pdfjs-bookmark-button-label = Aktuální stránka + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Nástroje +pdfjs-tools-button-label = Nástroje +pdfjs-first-page-button = + .title = Přejde na první stránku +pdfjs-first-page-button-label = Přejít na první stránku +pdfjs-last-page-button = + .title = Přejde na poslední stránku +pdfjs-last-page-button-label = Přejít na poslední stránku +pdfjs-page-rotate-cw-button = + .title = Otočí po směru hodin +pdfjs-page-rotate-cw-button-label = Otočit po směru hodin +pdfjs-page-rotate-ccw-button = + .title = Otočí proti směru hodin +pdfjs-page-rotate-ccw-button-label = Otočit proti směru hodin +pdfjs-cursor-text-select-tool-button = + .title = Povolí výběr textu +pdfjs-cursor-text-select-tool-button-label = Výběr textu +pdfjs-cursor-hand-tool-button = + .title = Povolí nástroj ručička +pdfjs-cursor-hand-tool-button-label = Nástroj ručička +pdfjs-scroll-page-button = + .title = Posouvat po stránkách +pdfjs-scroll-page-button-label = Posouvání po stránkách +pdfjs-scroll-vertical-button = + .title = Použít svislé posouvání +pdfjs-scroll-vertical-button-label = Svislé posouvání +pdfjs-scroll-horizontal-button = + .title = Použít vodorovné posouvání +pdfjs-scroll-horizontal-button-label = Vodorovné posouvání +pdfjs-scroll-wrapped-button = + .title = Použít postupné posouvání +pdfjs-scroll-wrapped-button-label = Postupné posouvání +pdfjs-spread-none-button = + .title = Nesdružovat stránky +pdfjs-spread-none-button-label = Žádné sdružení +pdfjs-spread-odd-button = + .title = Sdruží stránky s umístěním lichých vlevo +pdfjs-spread-odd-button-label = Sdružení stránek (liché vlevo) +pdfjs-spread-even-button = + .title = Sdruží stránky s umístěním sudých vlevo +pdfjs-spread-even-button-label = Sdružení stránek (sudé vlevo) + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Vlastnosti dokumentu… +pdfjs-document-properties-button-label = Vlastnosti dokumentu… +pdfjs-document-properties-file-name = Název souboru: +pdfjs-document-properties-file-size = Velikost souboru: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bajtů) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtů) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtů) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtů) +pdfjs-document-properties-title = Název stránky: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Předmět: +pdfjs-document-properties-keywords = Klíčová slova: +pdfjs-document-properties-creation-date = Datum vytvoření: +pdfjs-document-properties-modification-date = Datum úpravy: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Vytvořil: +pdfjs-document-properties-producer = Tvůrce PDF: +pdfjs-document-properties-version = Verze PDF: +pdfjs-document-properties-page-count = Počet stránek: +pdfjs-document-properties-page-size = Velikost stránky: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = na výšku +pdfjs-document-properties-page-size-orientation-landscape = na šířku +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Dopis +pdfjs-document-properties-page-size-name-legal = Právní dokument + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Rychlé zobrazování z webu: +pdfjs-document-properties-linearized-yes = Ano +pdfjs-document-properties-linearized-no = Ne +pdfjs-document-properties-close-button = Zavřít + +## Print + +pdfjs-print-progress-message = Příprava dokumentu pro tisk… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Zrušit +pdfjs-printing-not-supported = Upozornění: Tisk není v tomto prohlížeči plně podporován. +pdfjs-printing-not-ready = Upozornění: Dokument PDF není kompletně načten. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Postranní lišta +pdfjs-toggle-sidebar-notification-button = + .title = Přepnout postranní lištu (dokument obsahuje osnovu/přílohy/vrstvy) +pdfjs-toggle-sidebar-button-label = Postranní lišta +pdfjs-document-outline-button = + .title = Zobrazí osnovu dokumentu (poklepání přepne zobrazení všech položek) +pdfjs-document-outline-button-label = Osnova dokumentu +pdfjs-attachments-button = + .title = Zobrazí přílohy +pdfjs-attachments-button-label = Přílohy +pdfjs-layers-button = + .title = Zobrazit vrstvy (poklepáním obnovíte všechny vrstvy do výchozího stavu) +pdfjs-layers-button-label = Vrstvy +pdfjs-thumbs-button = + .title = Zobrazí náhledy +pdfjs-thumbs-button-label = Náhledy +pdfjs-current-outline-item-button = + .title = Najít aktuální položku v osnově +pdfjs-current-outline-item-button-label = Aktuální položka v osnově +pdfjs-findbar-button = + .title = Najde v dokumentu +pdfjs-findbar-button-label = Najít +pdfjs-additional-layers = Další vrstvy + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Strana { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Náhled strany { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Najít + .placeholder = Najít v dokumentu… +pdfjs-find-previous-button = + .title = Najde předchozí výskyt hledaného textu +pdfjs-find-previous-button-label = Předchozí +pdfjs-find-next-button = + .title = Najde další výskyt hledaného textu +pdfjs-find-next-button-label = Další +pdfjs-find-highlight-checkbox = Zvýraznit +pdfjs-find-match-case-checkbox-label = Rozlišovat velikost +pdfjs-find-match-diacritics-checkbox-label = Rozlišovat diakritiku +pdfjs-find-entire-word-checkbox-label = Celá slova +pdfjs-find-reached-top = Dosažen začátek dokumentu, pokračuje se od konce +pdfjs-find-reached-bottom = Dosažen konec dokumentu, pokračuje se od začátku +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current }. z { $total } výskytu + [few] { $current }. z { $total } výskytů + [many] { $current }. z { $total } výskytů + *[other] { $current }. z { $total } výskytů + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Více než { $limit } výskyt + [few] Více než { $limit } výskyty + [many] Více než { $limit } výskytů + *[other] Více než { $limit } výskytů + } +pdfjs-find-not-found = Hledaný text nenalezen + +## Predefined zoom values + +pdfjs-page-scale-width = Podle šířky +pdfjs-page-scale-fit = Podle výšky +pdfjs-page-scale-auto = Automatická velikost +pdfjs-page-scale-actual = Skutečná velikost +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Strana { $page } + +## Loading indicator messages + +pdfjs-loading-error = Při nahrávání PDF nastala chyba. +pdfjs-invalid-file-error = Neplatný nebo chybný soubor PDF. +pdfjs-missing-file-error = Chybí soubor PDF. +pdfjs-unexpected-response-error = Neočekávaná odpověď serveru. +pdfjs-rendering-error = Při vykreslování stránky nastala chyba. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotace typu { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Pro otevření PDF souboru vložte heslo. +pdfjs-password-invalid = Neplatné heslo. Zkuste to znovu. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Zrušit +pdfjs-web-fonts-disabled = Webová písma jsou zakázána, proto není možné použít vložená písma PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Kreslení +pdfjs-editor-ink-button-label = Kreslení +pdfjs-editor-stamp-button = + .title = Přidání či úprava obrázků +pdfjs-editor-stamp-button-label = Přidání či úprava obrázků +pdfjs-editor-highlight-button = + .title = Zvýraznění +pdfjs-editor-highlight-button-label = Zvýraznění +pdfjs-highlight-floating-button1 = + .title = Zvýraznit + .aria-label = Zvýraznit +pdfjs-highlight-floating-button-label = Zvýraznit + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Odebrat kresbu +pdfjs-editor-remove-freetext-button = + .title = Odebrat text +pdfjs-editor-remove-stamp-button = + .title = Odebrat obrázek +pdfjs-editor-remove-highlight-button = + .title = Odebrat zvýraznění + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Barva +pdfjs-editor-free-text-size-input = Velikost +pdfjs-editor-ink-color-input = Barva +pdfjs-editor-ink-thickness-input = Tloušťka +pdfjs-editor-ink-opacity-input = Průhlednost +pdfjs-editor-stamp-add-image-button = + .title = Přidat obrázek +pdfjs-editor-stamp-add-image-button-label = Přidat obrázek +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tloušťka +pdfjs-editor-free-highlight-thickness-title = + .title = Změna tloušťky při zvýrazňování jiných položek než textu +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Textový editor + .default-content = Začněte psát... +pdfjs-free-text = + .aria-label = Textový editor +pdfjs-free-text-default-content = Začněte psát… +pdfjs-ink = + .aria-label = Editor kreslení +pdfjs-ink-canvas = + .aria-label = Uživatelem vytvořený obrázek + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Náhradní popis +pdfjs-editor-alt-text-edit-button = + .aria-label = Upravit alternativní text +pdfjs-editor-alt-text-edit-button-label = Upravit náhradní popis +pdfjs-editor-alt-text-dialog-label = Vyberte možnost +pdfjs-editor-alt-text-dialog-description = Náhradní popis pomáhá, když lidé obrázek nevidí nebo když se nenačítá. +pdfjs-editor-alt-text-add-description-label = Přidat popis +pdfjs-editor-alt-text-add-description-description = Snažte se o 1-2 věty, které popisují předmět, prostředí nebo činnosti. +pdfjs-editor-alt-text-mark-decorative-label = Označit jako dekorativní +pdfjs-editor-alt-text-mark-decorative-description = Používá se pro okrasné obrázky, jako jsou rámečky nebo vodoznaky. +pdfjs-editor-alt-text-cancel-button = Zrušit +pdfjs-editor-alt-text-save-button = Uložit +pdfjs-editor-alt-text-decorative-tooltip = Označen jako dekorativní +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Například: “Mladý muž si sedá ke stolu, aby se najedl.” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativní text + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Levý horní roh — změna velikosti +pdfjs-editor-resizer-label-top-middle = Horní střed — změna velikosti +pdfjs-editor-resizer-label-top-right = Pravý horní roh — změna velikosti +pdfjs-editor-resizer-label-middle-right = Vpravo uprostřed — změna velikosti +pdfjs-editor-resizer-label-bottom-right = Pravý dolní roh — změna velikosti +pdfjs-editor-resizer-label-bottom-middle = Střed dole — změna velikosti +pdfjs-editor-resizer-label-bottom-left = Levý dolní roh — změna velikosti +pdfjs-editor-resizer-label-middle-left = Vlevo uprostřed — změna velikosti +pdfjs-editor-resizer-top-left = + .aria-label = Levý horní roh — změna velikosti +pdfjs-editor-resizer-top-middle = + .aria-label = Horní střed — změna velikosti +pdfjs-editor-resizer-top-right = + .aria-label = Pravý horní roh — změna velikosti +pdfjs-editor-resizer-middle-right = + .aria-label = Vpravo uprostřed — změna velikosti +pdfjs-editor-resizer-bottom-right = + .aria-label = Pravý dolní roh — změna velikosti +pdfjs-editor-resizer-bottom-middle = + .aria-label = Střed dole — změna velikosti +pdfjs-editor-resizer-bottom-left = + .aria-label = Levý dolní roh — změna velikosti +pdfjs-editor-resizer-middle-left = + .aria-label = Vlevo uprostřed — změna velikosti + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Barva zvýraznění +pdfjs-editor-colorpicker-button = + .title = Změna barvy +pdfjs-editor-colorpicker-dropdown = + .aria-label = Výběr barev +pdfjs-editor-colorpicker-yellow = + .title = Žlutá +pdfjs-editor-colorpicker-green = + .title = Zelená +pdfjs-editor-colorpicker-blue = + .title = Modrá +pdfjs-editor-colorpicker-pink = + .title = Růžová +pdfjs-editor-colorpicker-red = + .title = Červená + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Zobrazit vše +pdfjs-editor-highlight-show-all-button = + .title = Zobrazit vše + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Upravit alternativní text (popis obrázku) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Přidat alternativní text (popis obrázku) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Sem napište svůj popis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krátký popis pro lidi, kteří neuvidí obrázek nebo když se obrázek nenačítá. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tento alternativní text byl vytvořen automaticky a může být nepřesný. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Více informací +pdfjs-editor-new-alt-text-create-automatically-button-label = Vytvořit alternativní text automaticky +pdfjs-editor-new-alt-text-not-now-button = Teď ne +pdfjs-editor-new-alt-text-error-title = Nepodařilo se automaticky vytvořit alternativní text +pdfjs-editor-new-alt-text-error-description = Napište prosím vlastní alternativní text nebo to zkuste znovu později. +pdfjs-editor-new-alt-text-error-close-button = Zavřít +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Stahuje se model AI pro alternativní texty ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Stahuje se model AI pro alternativní texty ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativní text byl přidán +pdfjs-editor-new-alt-text-added-button-label = Alternativní text byl přidán +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Chybí alternativní text +pdfjs-editor-new-alt-text-missing-button-label = Chybí alternativní text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Zkontrolovat alternativní text +pdfjs-editor-new-alt-text-to-review-button-label = Zkontrolovat alternativní text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Vytvořeno automaticky: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastavení alternativního textu obrázku +pdfjs-image-alt-text-settings-button-label = Nastavení alternativního textu obrázku +pdfjs-editor-alt-text-settings-dialog-label = Nastavení alternativního textu obrázku +pdfjs-editor-alt-text-settings-automatic-title = Automatický alternativní text +pdfjs-editor-alt-text-settings-create-model-button-label = Vytvořit alternativní text automaticky +pdfjs-editor-alt-text-settings-create-model-description = Navrhuje popisy, které pomohou lidem, kteří nevidí obrázek nebo když se obrázek nenačte. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI pro alternativní text ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Běží lokálně na vašem zařízení, takže vaše data zůstávají v bezpečí. Vyžadováno pro automatický alternativní text. +pdfjs-editor-alt-text-settings-delete-model-button = Smazat +pdfjs-editor-alt-text-settings-download-model-button = Stáhnout +pdfjs-editor-alt-text-settings-downloading-model-button = Probíhá stahování... +pdfjs-editor-alt-text-settings-editor-title = Editor alternativního textu +pdfjs-editor-alt-text-settings-show-dialog-button-label = Při přidávání obrázku hned zobrazit editor alternativního textu +pdfjs-editor-alt-text-settings-show-dialog-description = Pomůže vám zajistit, aby všechny vaše obrázky obsahovaly alternativní text. +pdfjs-editor-alt-text-settings-close-button = Zavřít + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Zvýraznění odebráno +pdfjs-editor-undo-bar-message-freetext = Text odstraněn +pdfjs-editor-undo-bar-message-ink = Kresba odstraněna +pdfjs-editor-undo-bar-message-stamp = Obrázek odebrán +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotace odebrána + [few] { $count } anotace odebrány + [many] { $count } anotací odebráno + *[other] { $count } anotací odebráno + } +pdfjs-editor-undo-bar-undo-button = + .title = Zpět +pdfjs-editor-undo-bar-undo-button-label = Zpět +pdfjs-editor-undo-bar-close-button = + .title = Zavřít +pdfjs-editor-undo-bar-close-button-label = Zavřít diff --git a/public/pdfjs/web/locale/cy/viewer.ftl b/public/pdfjs/web/locale/cy/viewer.ftl new file mode 100644 index 0000000..8363835 --- /dev/null +++ b/public/pdfjs/web/locale/cy/viewer.ftl @@ -0,0 +1,527 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Tudalen Flaenorol +pdfjs-previous-button-label = Blaenorol +pdfjs-next-button = + .title = Tudalen Nesaf +pdfjs-next-button-label = Nesaf +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Tudalen +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = o { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } o { $pagesCount }) +pdfjs-zoom-out-button = + .title = Lleihau +pdfjs-zoom-out-button-label = Lleihau +pdfjs-zoom-in-button = + .title = Cynyddu +pdfjs-zoom-in-button-label = Cynyddu +pdfjs-zoom-select = + .title = Chwyddo +pdfjs-presentation-mode-button = + .title = Newid i'r Modd Cyflwyno +pdfjs-presentation-mode-button-label = Modd Cyflwyno +pdfjs-open-file-button = + .title = Agor Ffeil +pdfjs-open-file-button-label = Agor +pdfjs-print-button = + .title = Argraffu +pdfjs-print-button-label = Argraffu +pdfjs-save-button = + .title = Cadw +pdfjs-save-button-label = Cadw +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Llwytho i lawr +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Llwytho i lawr +pdfjs-bookmark-button = + .title = Tudalen Gyfredol (Gweld URL o'r Dudalen Gyfredol) +pdfjs-bookmark-button-label = Tudalen Gyfredol + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Offer +pdfjs-tools-button-label = Offer +pdfjs-first-page-button = + .title = Mynd i'r Dudalen Gyntaf +pdfjs-first-page-button-label = Mynd i'r Dudalen Gyntaf +pdfjs-last-page-button = + .title = Mynd i'r Dudalen Olaf +pdfjs-last-page-button-label = Mynd i'r Dudalen Olaf +pdfjs-page-rotate-cw-button = + .title = Cylchdroi Clocwedd +pdfjs-page-rotate-cw-button-label = Cylchdroi Clocwedd +pdfjs-page-rotate-ccw-button = + .title = Cylchdroi Gwrthglocwedd +pdfjs-page-rotate-ccw-button-label = Cylchdroi Gwrthglocwedd +pdfjs-cursor-text-select-tool-button = + .title = Galluogi Dewis Offeryn Testun +pdfjs-cursor-text-select-tool-button-label = Offeryn Dewis Testun +pdfjs-cursor-hand-tool-button = + .title = Galluogi Offeryn Llaw +pdfjs-cursor-hand-tool-button-label = Offeryn Llaw +pdfjs-scroll-page-button = + .title = Defnyddio Sgrolio Tudalen +pdfjs-scroll-page-button-label = Sgrolio Tudalen +pdfjs-scroll-vertical-button = + .title = Defnyddio Sgrolio Fertigol +pdfjs-scroll-vertical-button-label = Sgrolio Fertigol +pdfjs-scroll-horizontal-button = + .title = Defnyddio Sgrolio Llorweddol +pdfjs-scroll-horizontal-button-label = Sgrolio Llorweddol +pdfjs-scroll-wrapped-button = + .title = Defnyddio Sgrolio Amlapio +pdfjs-scroll-wrapped-button-label = Sgrolio Amlapio +pdfjs-spread-none-button = + .title = Peidio uno trawsdaleniadau +pdfjs-spread-none-button-label = Dim Trawsdaleniadau +pdfjs-spread-odd-button = + .title = Uno trawsdaleniadau gan gychwyn gyda thudalennau odrif +pdfjs-spread-odd-button-label = Trawsdaleniadau Odrif +pdfjs-spread-even-button = + .title = Uno trawsdaleniadau gan gychwyn gyda thudalennau eilrif +pdfjs-spread-even-button-label = Trawsdaleniadau Eilrif + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Priodweddau Dogfen… +pdfjs-document-properties-button-label = Priodweddau Dogfen… +pdfjs-document-properties-file-name = Enw ffeil: +pdfjs-document-properties-file-size = Maint ffeil: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } beit) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } beit) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } beit) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } beit) +pdfjs-document-properties-title = Teitl: +pdfjs-document-properties-author = Awdur: +pdfjs-document-properties-subject = Pwnc: +pdfjs-document-properties-keywords = Allweddair: +pdfjs-document-properties-creation-date = Dyddiad Creu: +pdfjs-document-properties-modification-date = Dyddiad Addasu: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Crewr: +pdfjs-document-properties-producer = Cynhyrchydd PDF: +pdfjs-document-properties-version = Fersiwn PDF: +pdfjs-document-properties-page-count = Cyfrif Tudalen: +pdfjs-document-properties-page-size = Maint Tudalen: +pdfjs-document-properties-page-size-unit-inches = o fewn +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portread +pdfjs-document-properties-page-size-orientation-landscape = tirlun +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Llythyr +pdfjs-document-properties-page-size-name-legal = Cyfreithiol + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Golwg Gwe Cyflym: +pdfjs-document-properties-linearized-yes = Iawn +pdfjs-document-properties-linearized-no = Na +pdfjs-document-properties-close-button = Cau + +## Print + +pdfjs-print-progress-message = Paratoi dogfen ar gyfer ei hargraffu… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Diddymu +pdfjs-printing-not-supported = Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr. +pdfjs-printing-not-ready = Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toglo'r Bar Ochr +pdfjs-toggle-sidebar-notification-button = + .title = Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys amlinelliadau/atodiadau/haenau) +pdfjs-toggle-sidebar-button-label = Toglo'r Bar Ochr +pdfjs-document-outline-button = + .title = Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem) +pdfjs-document-outline-button-label = Amlinelliad Dogfen +pdfjs-attachments-button = + .title = Dangos Atodiadau +pdfjs-attachments-button-label = Atodiadau +pdfjs-layers-button = + .title = Dangos Haenau (cliciwch ddwywaith i ailosod yr holl haenau i'r cyflwr rhagosodedig) +pdfjs-layers-button-label = Haenau +pdfjs-thumbs-button = + .title = Dangos Lluniau Bach +pdfjs-thumbs-button-label = Lluniau Bach +pdfjs-current-outline-item-button = + .title = Canfod yr Eitem Amlinellol Gyfredol +pdfjs-current-outline-item-button-label = Yr Eitem Amlinellol Gyfredol +pdfjs-findbar-button = + .title = Canfod yn y Ddogfen +pdfjs-findbar-button-label = Canfod +pdfjs-additional-layers = Haenau Ychwanegol + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Tudalen { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Llun Bach Tudalen { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Canfod + .placeholder = Canfod yn y ddogfen… +pdfjs-find-previous-button = + .title = Canfod enghraifft flaenorol o'r ymadrodd +pdfjs-find-previous-button-label = Blaenorol +pdfjs-find-next-button = + .title = Canfod enghraifft nesaf yr ymadrodd +pdfjs-find-next-button-label = Nesaf +pdfjs-find-highlight-checkbox = Amlygu Popeth +pdfjs-find-match-case-checkbox-label = Cydweddu Maint +pdfjs-find-match-diacritics-checkbox-label = Diacritigau Cyfatebol +pdfjs-find-entire-word-checkbox-label = Geiriau Cyfan +pdfjs-find-reached-top = Wedi cyrraedd brig y dudalen, parhau o'r gwaelod +pdfjs-find-reached-bottom = Wedi cyrraedd diwedd y dudalen, parhau o'r brig +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [zero] { $current } o { $total } cydweddiadau + [one] { $current } o { $total } cydweddiad + [two] { $current } o { $total } gydweddiad + [few] { $current } o { $total } cydweddiad + [many] { $current } o { $total } chydweddiad + *[other] { $current } o { $total } cydweddiad + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [zero] Mwy nag { $limit } cydweddiadau + [one] Mwy nag { $limit } cydweddiad + [two] Mwy nag { $limit } gydweddiad + [few] Mwy nag { $limit } cydweddiad + [many] Mwy nag { $limit } chydweddiad + *[other] Mwy nag { $limit } cydweddiad + } +pdfjs-find-not-found = Heb ganfod ymadrodd + +## Predefined zoom values + +pdfjs-page-scale-width = Lled Tudalen +pdfjs-page-scale-fit = Ffit Tudalen +pdfjs-page-scale-auto = Chwyddo Awtomatig +pdfjs-page-scale-actual = Maint Gwirioneddol +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Tudalen { $page } + +## Loading indicator messages + +pdfjs-loading-error = Digwyddodd gwall wrth lwytho'r PDF. +pdfjs-invalid-file-error = Ffeil PDF annilys neu llwgr. +pdfjs-missing-file-error = Ffeil PDF coll. +pdfjs-unexpected-response-error = Ymateb annisgwyl gan y gweinydd. +pdfjs-rendering-error = Digwyddodd gwall wrth adeiladu'r dudalen. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anodiad { $type } ] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Rhowch gyfrinair i agor y PDF. +pdfjs-password-invalid = Cyfrinair annilys. Ceisiwch eto. +pdfjs-password-ok-button = Iawn +pdfjs-password-cancel-button = Diddymu +pdfjs-web-fonts-disabled = Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig. + +## Editing + +pdfjs-editor-free-text-button = + .title = Testun +pdfjs-editor-free-text-button-label = Testun +pdfjs-editor-ink-button = + .title = Lluniadu +pdfjs-editor-ink-button-label = Lluniadu +pdfjs-editor-stamp-button = + .title = Ychwanegu neu olygu delweddau +pdfjs-editor-stamp-button-label = Ychwanegu neu olygu delweddau +pdfjs-editor-highlight-button = + .title = Amlygu +pdfjs-editor-highlight-button-label = Amlygu +pdfjs-highlight-floating-button1 = + .title = Amlygu + .aria-label = Amlygu +pdfjs-highlight-floating-button-label = Amlygu + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Dileu lluniad +pdfjs-editor-remove-freetext-button = + .title = Dileu testun +pdfjs-editor-remove-stamp-button = + .title = Dileu delwedd +pdfjs-editor-remove-highlight-button = + .title = Tynnu amlygiad + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Lliw +pdfjs-editor-free-text-size-input = Maint +pdfjs-editor-ink-color-input = Lliw +pdfjs-editor-ink-thickness-input = Trwch +pdfjs-editor-ink-opacity-input = Didreiddedd +pdfjs-editor-stamp-add-image-button = + .title = Ychwanegu delwedd +pdfjs-editor-stamp-add-image-button-label = Ychwanegu delwedd +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Trwch +pdfjs-editor-free-highlight-thickness-title = + .title = Newid trwch wrth amlygu eitemau heblaw testun +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Golygydd Testun + .default-content = Cychwyn teipio… +pdfjs-free-text = + .aria-label = Golygydd Testun +pdfjs-free-text-default-content = Cychwyn teipio… +pdfjs-ink = + .aria-label = Golygydd Lluniadu +pdfjs-ink-canvas = + .aria-label = Delwedd wedi'i chreu gan ddefnyddwyr + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Testun amgen (alt) +pdfjs-editor-alt-text-edit-button = + .aria-label = Golygu testun amgen +pdfjs-editor-alt-text-edit-button-label = Golygu testun amgen +pdfjs-editor-alt-text-dialog-label = Dewisiadau +pdfjs-editor-alt-text-dialog-description = Mae testun amgen (testun alt) yn helpu pan na all pobl weld y ddelwedd neu pan nad yw'n llwytho. +pdfjs-editor-alt-text-add-description-label = Ychwanegu disgrifiad +pdfjs-editor-alt-text-add-description-description = Anelwch at 1-2 frawddeg sy'n disgrifio'r pwnc, y cefndir neu'r gweithredoedd. +pdfjs-editor-alt-text-mark-decorative-label = Marcio fel addurniadol +pdfjs-editor-alt-text-mark-decorative-description = Mae'n cael ei ddefnyddio ar gyfer delweddau addurniadol, fel borderi neu farciau dŵr. +pdfjs-editor-alt-text-cancel-button = Diddymu +pdfjs-editor-alt-text-save-button = Cadw +pdfjs-editor-alt-text-decorative-tooltip = Marcio fel addurniadol +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Er enghraifft, “Mae dyn ifanc yn eistedd wrth fwrdd i fwyta pryd bwyd” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Testun amgen (alt) + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Y gornel chwith uchaf — newid maint +pdfjs-editor-resizer-label-top-middle = Canol uchaf - newid maint +pdfjs-editor-resizer-label-top-right = Y gornel dde uchaf - newid maint +pdfjs-editor-resizer-label-middle-right = De canol - newid maint +pdfjs-editor-resizer-label-bottom-right = Y gornel dde isaf — newid maint +pdfjs-editor-resizer-label-bottom-middle = Canol gwaelod — newid maint +pdfjs-editor-resizer-label-bottom-left = Y gornel chwith isaf — newid maint +pdfjs-editor-resizer-label-middle-left = Chwith canol — newid maint +pdfjs-editor-resizer-top-left = + .aria-label = Y gornel chwith uchaf — newid maint +pdfjs-editor-resizer-top-middle = + .aria-label = Canol uchaf - newid maint +pdfjs-editor-resizer-top-right = + .aria-label = Y gornel dde uchaf - newid maint +pdfjs-editor-resizer-middle-right = + .aria-label = De canol - newid maint +pdfjs-editor-resizer-bottom-right = + .aria-label = Y gornel dde isaf — newid maint +pdfjs-editor-resizer-bottom-middle = + .aria-label = Canol gwaelod — newid maint +pdfjs-editor-resizer-bottom-left = + .aria-label = Y gornel chwith isaf — newid maint +pdfjs-editor-resizer-middle-left = + .aria-label = Chwith canol — newid maint + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Lliw amlygu +pdfjs-editor-colorpicker-button = + .title = Newid lliw +pdfjs-editor-colorpicker-dropdown = + .aria-label = Dewisiadau lliw +pdfjs-editor-colorpicker-yellow = + .title = Melyn +pdfjs-editor-colorpicker-green = + .title = Gwyrdd +pdfjs-editor-colorpicker-blue = + .title = Glas +pdfjs-editor-colorpicker-pink = + .title = Pinc +pdfjs-editor-colorpicker-red = + .title = Coch + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Dangos y cyfan +pdfjs-editor-highlight-show-all-button = + .title = Dangos y cyfan + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Golygu testun amgen (disgrifiad o ddelwedd) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Ychwanegwch destun amgen (disgrifiad delwedd) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Ysgrifennwch eich disgrifiad yma… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Disgrifiad byr ar gyfer pobl sydd ddim yn gallu gweld y ddelwedd neu pan nad yw'r ddelwedd yn llwytho. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Cafodd y testun amgen hwn ei greu'n awtomatig a gall fod yn anghywir. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Rhagor +pdfjs-editor-new-alt-text-create-automatically-button-label = Creu testun amgen yn awtomatig +pdfjs-editor-new-alt-text-not-now-button = Nid nawr +pdfjs-editor-new-alt-text-error-title = Methu â chreu testun amgen yn awtomatig +pdfjs-editor-new-alt-text-error-description = Ysgrifennwch eich testun amgen eich hun neu ceisiwch eto yn nes ymlaen. +pdfjs-editor-new-alt-text-error-close-button = Cau +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Wrthi'n llwytho i lawr model AI testun amgen ( { $downloadedSize } o { $totalSize } MB) + .aria-valuetext = Wrthi'n llwytho i lawr model AI testun amgen ( { $downloadedSize } o { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Ychwanegwyd testun amgen +pdfjs-editor-new-alt-text-added-button-label = Ychwanegwyd testun amgen +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Testun amgen coll +pdfjs-editor-new-alt-text-missing-button-label = Testun amgen coll +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Adolygu'r testun amgen +pdfjs-editor-new-alt-text-to-review-button-label = Adolygu'r testun amgen +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Crëwyd yn awtomatig: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Gosodiadau testun amgen delwedd +pdfjs-image-alt-text-settings-button-label = Gosodiadau testun amgen delwedd +pdfjs-editor-alt-text-settings-dialog-label = Gosodiadau testun amgen delwedd +pdfjs-editor-alt-text-settings-automatic-title = Testun amgen awtomatig +pdfjs-editor-alt-text-settings-create-model-button-label = Creu testun amgen yn awtomatig +pdfjs-editor-alt-text-settings-create-model-description = Yn awgrymu disgrifiadau i helpu pobl sydd ddim yn gallu gweld y ddelwedd neu pan nad yw'r ddelwedd yn llwytho. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI testun amgen ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Yn rhedeg yn lleol ar eich dyfais fel bod eich data'n aros yn breifat. Yn ofynnol ar gyfer testun amgen awtomatig. +pdfjs-editor-alt-text-settings-delete-model-button = Dileu +pdfjs-editor-alt-text-settings-download-model-button = Llwytho i Lawr +pdfjs-editor-alt-text-settings-downloading-model-button = Wrthi'n llwytho i lawr… +pdfjs-editor-alt-text-settings-editor-title = Golygydd testun amgen +pdfjs-editor-alt-text-settings-show-dialog-button-label = Dangoswch y golygydd testun amgen yn syth wrth ychwanegu delwedd +pdfjs-editor-alt-text-settings-show-dialog-description = Yn eich helpu i wneud yn siŵr bod gan eich holl ddelweddau destun amgen. +pdfjs-editor-alt-text-settings-close-button = Cau + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Tynnwyd yr amlygu +pdfjs-editor-undo-bar-message-freetext = Tynnwyd y testun +pdfjs-editor-undo-bar-message-ink = Tynnwyd y lluniad +pdfjs-editor-undo-bar-message-stamp = Tynnwyd y ddelwedd +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [zero] { $count } anodiad wedi'u tynnu + [one] { $count } anodiad wedi'i dynnu + [two] { $count } anodiad wedi'u tynnu + [few] { $count } anodiad wedi'u tynnu + [many] { $count } anodiad wedi'u tynnu + *[other] { $count } anodiad wedi'u tynnu + } +pdfjs-editor-undo-bar-undo-button = + .title = Dadwneud +pdfjs-editor-undo-bar-undo-button-label = Dadwneud +pdfjs-editor-undo-bar-close-button = + .title = Cau +pdfjs-editor-undo-bar-close-button-label = Cau diff --git a/public/pdfjs/web/locale/da/viewer.ftl b/public/pdfjs/web/locale/da/viewer.ftl new file mode 100644 index 0000000..224eac1 --- /dev/null +++ b/public/pdfjs/web/locale/da/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Forrige side +pdfjs-previous-button-label = Forrige +pdfjs-next-button = + .title = Næste side +pdfjs-next-button-label = Næste +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Side +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = af { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } af { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom ud +pdfjs-zoom-out-button-label = Zoom ud +pdfjs-zoom-in-button = + .title = Zoom ind +pdfjs-zoom-in-button-label = Zoom ind +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Skift til fuldskærmsvisning +pdfjs-presentation-mode-button-label = Fuldskærmsvisning +pdfjs-open-file-button = + .title = Åbn fil +pdfjs-open-file-button-label = Åbn +pdfjs-print-button = + .title = Udskriv +pdfjs-print-button-label = Udskriv +pdfjs-save-button = + .title = Gem +pdfjs-save-button-label = Gem +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Hent +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Hent +pdfjs-bookmark-button = + .title = Aktuel side (vis URL fra den aktuelle side) +pdfjs-bookmark-button-label = Aktuel side + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Funktioner +pdfjs-tools-button-label = Funktioner +pdfjs-first-page-button = + .title = Gå til første side +pdfjs-first-page-button-label = Gå til første side +pdfjs-last-page-button = + .title = Gå til sidste side +pdfjs-last-page-button-label = Gå til sidste side +pdfjs-page-rotate-cw-button = + .title = Roter med uret +pdfjs-page-rotate-cw-button-label = Roter med uret +pdfjs-page-rotate-ccw-button = + .title = Roter mod uret +pdfjs-page-rotate-ccw-button-label = Roter mod uret +pdfjs-cursor-text-select-tool-button = + .title = Aktiver markeringsværktøj +pdfjs-cursor-text-select-tool-button-label = Markeringsværktøj +pdfjs-cursor-hand-tool-button = + .title = Aktiver håndværktøj +pdfjs-cursor-hand-tool-button-label = Håndværktøj +pdfjs-scroll-page-button = + .title = Brug sidescrolling +pdfjs-scroll-page-button-label = Sidescrolling +pdfjs-scroll-vertical-button = + .title = Brug vertikal scrolling +pdfjs-scroll-vertical-button-label = Vertikal scrolling +pdfjs-scroll-horizontal-button = + .title = Brug horisontal scrolling +pdfjs-scroll-horizontal-button-label = Horisontal scrolling +pdfjs-scroll-wrapped-button = + .title = Brug ombrudt scrolling +pdfjs-scroll-wrapped-button-label = Ombrudt scrolling +pdfjs-spread-none-button = + .title = Vis enkeltsider +pdfjs-spread-none-button-label = Enkeltsider +pdfjs-spread-odd-button = + .title = Vis opslag med ulige sidenumre til venstre +pdfjs-spread-odd-button-label = Opslag med forside +pdfjs-spread-even-button = + .title = Vis opslag med lige sidenumre til venstre +pdfjs-spread-even-button-label = Opslag uden forside + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentegenskaber… +pdfjs-document-properties-button-label = Dokumentegenskaber… +pdfjs-document-properties-file-name = Filnavn: +pdfjs-document-properties-file-size = Filstørrelse: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Forfatter: +pdfjs-document-properties-subject = Emne: +pdfjs-document-properties-keywords = Nøgleord: +pdfjs-document-properties-creation-date = Oprettet: +pdfjs-document-properties-modification-date = Redigeret: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Program: +pdfjs-document-properties-producer = PDF-producent: +pdfjs-document-properties-version = PDF-version: +pdfjs-document-properties-page-count = Antal sider: +pdfjs-document-properties-page-size = Sidestørrelse: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = stående +pdfjs-document-properties-page-size-orientation-landscape = liggende +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Hurtig web-visning: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nej +pdfjs-document-properties-close-button = Luk + +## Print + +pdfjs-print-progress-message = Forbereder dokument til udskrivning… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Annuller +pdfjs-printing-not-supported = Advarsel: Udskrivning er ikke fuldt understøttet af browseren. +pdfjs-printing-not-ready = Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Slå sidepanel til eller fra +pdfjs-toggle-sidebar-notification-button = + .title = Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer/lag) +pdfjs-toggle-sidebar-button-label = Slå sidepanel til eller fra +pdfjs-document-outline-button = + .title = Vis dokumentets disposition (dobbeltklik for at udvide/sammenfolde alle elementer) +pdfjs-document-outline-button-label = Dokument-disposition +pdfjs-attachments-button = + .title = Vis vedhæftede filer +pdfjs-attachments-button-label = Vedhæftede filer +pdfjs-layers-button = + .title = Vis lag (dobbeltklik for at nulstille alle lag til standard-tilstanden) +pdfjs-layers-button-label = Lag +pdfjs-thumbs-button = + .title = Vis miniaturer +pdfjs-thumbs-button-label = Miniaturer +pdfjs-current-outline-item-button = + .title = Find det aktuelle dispositions-element +pdfjs-current-outline-item-button-label = Aktuelt dispositions-element +pdfjs-findbar-button = + .title = Find i dokument +pdfjs-findbar-button-label = Find +pdfjs-additional-layers = Yderligere lag + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniature af side { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Find + .placeholder = Find i dokument… +pdfjs-find-previous-button = + .title = Find den forrige forekomst +pdfjs-find-previous-button-label = Forrige +pdfjs-find-next-button = + .title = Find den næste forekomst +pdfjs-find-next-button-label = Næste +pdfjs-find-highlight-checkbox = Fremhæv alle +pdfjs-find-match-case-checkbox-label = Forskel på store og små bogstaver +pdfjs-find-match-diacritics-checkbox-label = Diakritiske tegn +pdfjs-find-entire-word-checkbox-label = Hele ord +pdfjs-find-reached-top = Toppen af siden blev nået, fortsatte fra bunden +pdfjs-find-reached-bottom = Bunden af siden blev nået, fortsatte fra toppen +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } af { $total } forekomst + *[other] { $current } af { $total } forekomster + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mere end { $limit } forekomst + *[other] Mere end { $limit } forekomster + } +pdfjs-find-not-found = Der blev ikke fundet noget + +## Predefined zoom values + +pdfjs-page-scale-width = Sidebredde +pdfjs-page-scale-fit = Tilpas til side +pdfjs-page-scale-auto = Automatisk zoom +pdfjs-page-scale-actual = Faktisk størrelse +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Side { $page } + +## Loading indicator messages + +pdfjs-loading-error = Der opstod en fejl ved indlæsning af PDF-filen. +pdfjs-invalid-file-error = PDF-filen er ugyldig eller ødelagt. +pdfjs-missing-file-error = Manglende PDF-fil. +pdfjs-unexpected-response-error = Uventet svar fra serveren. +pdfjs-rendering-error = Der opstod en fejl ved generering af siden. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }kommentar] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Angiv adgangskode til at åbne denne PDF-fil. +pdfjs-password-invalid = Ugyldig adgangskode. Prøv igen. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Fortryd +pdfjs-web-fonts-disabled = Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Tegn +pdfjs-editor-ink-button-label = Tegn +pdfjs-editor-stamp-button = + .title = Tilføj eller rediger billeder +pdfjs-editor-stamp-button-label = Tilføj eller rediger billeder +pdfjs-editor-highlight-button = + .title = Fremhæv +pdfjs-editor-highlight-button-label = Fremhæv +pdfjs-highlight-floating-button1 = + .title = Fremhæv + .aria-label = Fremhæv +pdfjs-highlight-floating-button-label = Fremhæv + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Fjern tegning +pdfjs-editor-remove-freetext-button = + .title = Fjern tekst +pdfjs-editor-remove-stamp-button = + .title = Fjern billede +pdfjs-editor-remove-highlight-button = + .title = Fjern fremhævning + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Farve +pdfjs-editor-free-text-size-input = Størrelse +pdfjs-editor-ink-color-input = Farve +pdfjs-editor-ink-thickness-input = Tykkelse +pdfjs-editor-ink-opacity-input = Uigennemsigtighed +pdfjs-editor-stamp-add-image-button = + .title = Tilføj billede +pdfjs-editor-stamp-add-image-button-label = Tilføj billede +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tykkelse +pdfjs-editor-free-highlight-thickness-title = + .title = Ændr tykkelse, når andre elementer end tekst fremhæves +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Teksteditor + .default-content = Begynd at skrive… +pdfjs-free-text = + .aria-label = Teksteditor +pdfjs-free-text-default-content = Begynd at skrive… +pdfjs-ink = + .aria-label = Tegnings-editor +pdfjs-ink-canvas = + .aria-label = Brugeroprettet billede + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternativ tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger alternativ tekst +pdfjs-editor-alt-text-edit-button-label = Rediger alternativ tekst +pdfjs-editor-alt-text-dialog-label = Vælg en indstilling +pdfjs-editor-alt-text-dialog-description = Alternativ tekst hjælper folk, som ikke kan se billedet eller når det ikke indlæses. +pdfjs-editor-alt-text-add-description-label = Tilføj en beskrivelse +pdfjs-editor-alt-text-add-description-description = Sigt efter en eller to sætninger, der beskriver emnet, omgivelserne eller handlinger. +pdfjs-editor-alt-text-mark-decorative-label = Marker som dekorativ +pdfjs-editor-alt-text-mark-decorative-description = Dette bruges for dekorative billeder som rammer eller vandmærker. +pdfjs-editor-alt-text-cancel-button = Annuller +pdfjs-editor-alt-text-save-button = Gem +pdfjs-editor-alt-text-decorative-tooltip = Markeret som dekorativ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = For eksempel: "En ung mand sætter sig ved et bord for at spise et måltid mad" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Øverste venstre hjørne — tilpas størrelse +pdfjs-editor-resizer-label-top-middle = Øverste i midten — tilpas størrelse +pdfjs-editor-resizer-label-top-right = Øverste højre hjørne — tilpas størrelse +pdfjs-editor-resizer-label-middle-right = Midten til højre — tilpas størrelse +pdfjs-editor-resizer-label-bottom-right = Nederste højre hjørne - tilpas størrelse +pdfjs-editor-resizer-label-bottom-middle = Nederst i midten - tilpas størrelse +pdfjs-editor-resizer-label-bottom-left = Nederste venstre hjørne - tilpas størrelse +pdfjs-editor-resizer-label-middle-left = Midten til venstre — tilpas størrelse +pdfjs-editor-resizer-top-left = + .aria-label = Øverste venstre hjørne — tilpas størrelse +pdfjs-editor-resizer-top-middle = + .aria-label = Øverste i midten — tilpas størrelse +pdfjs-editor-resizer-top-right = + .aria-label = Øverste højre hjørne — tilpas størrelse +pdfjs-editor-resizer-middle-right = + .aria-label = Midten til højre — tilpas størrelse +pdfjs-editor-resizer-bottom-right = + .aria-label = Nederste højre hjørne - tilpas størrelse +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nederst i midten - tilpas størrelse +pdfjs-editor-resizer-bottom-left = + .aria-label = Nederste venstre hjørne - tilpas størrelse +pdfjs-editor-resizer-middle-left = + .aria-label = Midten til venstre — tilpas størrelse + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Fremhævningsfarve +pdfjs-editor-colorpicker-button = + .title = Skift farve +pdfjs-editor-colorpicker-dropdown = + .aria-label = Farvevalg +pdfjs-editor-colorpicker-yellow = + .title = Gul +pdfjs-editor-colorpicker-green = + .title = Grøn +pdfjs-editor-colorpicker-blue = + .title = Blå +pdfjs-editor-colorpicker-pink = + .title = Lyserød +pdfjs-editor-colorpicker-red = + .title = Rød + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (billedbeskrivelse) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Tilføj alternativ tekst (billedbeskrivelse) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv din beskrivelse her... +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort beskrivelse til personer, der ikke kan se billedet, eller når billedet ikke indlæses. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative tekst blev oprettet automatisk og kan være upræcis. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Læs mere +pdfjs-editor-new-alt-text-create-automatically-button-label = Opret alternativ tekst automatisk +pdfjs-editor-new-alt-text-not-now-button = Ikke nu +pdfjs-editor-new-alt-text-error-title = Kunne ikke oprette alternativ tekst automatisk +pdfjs-editor-new-alt-text-error-description = Skriv din egen alternative tekst, eller prøv igen senere. +pdfjs-editor-new-alt-text-error-close-button = Luk +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Henter alternativ tekst AI-model ({ $downloadedSize } af { $totalSize } MB) + .aria-valuetext = Henter alternativ tekst AI-model ({ $downloadedSize } af { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ tekst tilføjet +pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst tilføjet +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mangler alternativ tekst +pdfjs-editor-new-alt-text-missing-button-label = Mangler alternativ tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Gennemgå alternativ tekst +pdfjs-editor-new-alt-text-to-review-button-label = Gennemgå alternativ tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Oprettet automatisk: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Indstillinger for alternativ tekst til billeder +pdfjs-image-alt-text-settings-button-label = Indstillinger for alternativ tekst til billeder +pdfjs-editor-alt-text-settings-dialog-label = Indstillinger for alternativ tekst til billeder +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Opret alternativ tekst automatisk +pdfjs-editor-alt-text-settings-create-model-description = Foreslår beskrivelser for at hjælpe folk, der ikke kan se billedet, eller når billedet ikke indlæses. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-model til at oprette alternative tekster ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Kører lokalt på din enhed, så dine data forbliver private. Påkrævet for at anvende automatisk alternativ tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Slet +pdfjs-editor-alt-text-settings-download-model-button = Hent +pdfjs-editor-alt-text-settings-downloading-model-button = Henter… +pdfjs-editor-alt-text-settings-editor-title = Redigering af alternativ tekst +pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis redigering af alternativ tekst med det samme, når et billede tilføjes +pdfjs-editor-alt-text-settings-show-dialog-description = Hjælper dig med at sikre, at alle dine billeder har alternativ tekst. +pdfjs-editor-alt-text-settings-close-button = Luk + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Fremhævning fjernet +pdfjs-editor-undo-bar-message-freetext = Tekst fjernet +pdfjs-editor-undo-bar-message-ink = Tegning fjernet +pdfjs-editor-undo-bar-message-stamp = Billede fjernet +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } kommentar fjernet + *[other] { $count } kommentarer fjernet + } +pdfjs-editor-undo-bar-undo-button = + .title = Fortryd +pdfjs-editor-undo-bar-undo-button-label = Fortryd +pdfjs-editor-undo-bar-close-button = + .title = Luk +pdfjs-editor-undo-bar-close-button-label = Luk diff --git a/public/pdfjs/web/locale/de/viewer.ftl b/public/pdfjs/web/locale/de/viewer.ftl new file mode 100644 index 0000000..ee26455 --- /dev/null +++ b/public/pdfjs/web/locale/de/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Eine Seite zurück +pdfjs-previous-button-label = Zurück +pdfjs-next-button = + .title = Eine Seite vor +pdfjs-next-button-label = Vor +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Seite +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = von { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } von { $pagesCount }) +pdfjs-zoom-out-button = + .title = Verkleinern +pdfjs-zoom-out-button-label = Verkleinern +pdfjs-zoom-in-button = + .title = Vergrößern +pdfjs-zoom-in-button-label = Vergrößern +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = In Präsentationsmodus wechseln +pdfjs-presentation-mode-button-label = Präsentationsmodus +pdfjs-open-file-button = + .title = Datei öffnen +pdfjs-open-file-button-label = Öffnen +pdfjs-print-button = + .title = Drucken +pdfjs-print-button-label = Drucken +pdfjs-save-button = + .title = Speichern +pdfjs-save-button-label = Speichern +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Herunterladen +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Herunterladen +pdfjs-bookmark-button = + .title = Aktuelle Seite (URL von aktueller Seite anzeigen) +pdfjs-bookmark-button-label = Aktuelle Seite + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Werkzeuge +pdfjs-tools-button-label = Werkzeuge +pdfjs-first-page-button = + .title = Erste Seite anzeigen +pdfjs-first-page-button-label = Erste Seite anzeigen +pdfjs-last-page-button = + .title = Letzte Seite anzeigen +pdfjs-last-page-button-label = Letzte Seite anzeigen +pdfjs-page-rotate-cw-button = + .title = Im Uhrzeigersinn drehen +pdfjs-page-rotate-cw-button-label = Im Uhrzeigersinn drehen +pdfjs-page-rotate-ccw-button = + .title = Gegen Uhrzeigersinn drehen +pdfjs-page-rotate-ccw-button-label = Gegen Uhrzeigersinn drehen +pdfjs-cursor-text-select-tool-button = + .title = Textauswahl-Werkzeug aktivieren +pdfjs-cursor-text-select-tool-button-label = Textauswahl-Werkzeug +pdfjs-cursor-hand-tool-button = + .title = Hand-Werkzeug aktivieren +pdfjs-cursor-hand-tool-button-label = Hand-Werkzeug +pdfjs-scroll-page-button = + .title = Seiten einzeln anordnen +pdfjs-scroll-page-button-label = Einzelseitenanordnung +pdfjs-scroll-vertical-button = + .title = Seiten übereinander anordnen +pdfjs-scroll-vertical-button-label = Vertikale Seitenanordnung +pdfjs-scroll-horizontal-button = + .title = Seiten nebeneinander anordnen +pdfjs-scroll-horizontal-button-label = Horizontale Seitenanordnung +pdfjs-scroll-wrapped-button = + .title = Seiten neben- und übereinander anordnen, abhängig vom Platz +pdfjs-scroll-wrapped-button-label = Kombinierte Seitenanordnung +pdfjs-spread-none-button = + .title = Seiten nicht nebeneinander anzeigen +pdfjs-spread-none-button-label = Einzelne Seiten +pdfjs-spread-odd-button = + .title = Jeweils eine ungerade und eine gerade Seite nebeneinander anzeigen +pdfjs-spread-odd-button-label = Ungerade + gerade Seite +pdfjs-spread-even-button = + .title = Jeweils eine gerade und eine ungerade Seite nebeneinander anzeigen +pdfjs-spread-even-button-label = Gerade + ungerade Seite + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumenteigenschaften +pdfjs-document-properties-button-label = Dokumenteigenschaften… +pdfjs-document-properties-file-name = Dateiname: +pdfjs-document-properties-file-size = Dateigröße: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } Bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } Bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } Bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } Bytes) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Thema: +pdfjs-document-properties-keywords = Stichwörter: +pdfjs-document-properties-creation-date = Erstelldatum: +pdfjs-document-properties-modification-date = Bearbeitungsdatum: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date } { $time } +pdfjs-document-properties-creator = Anwendung: +pdfjs-document-properties-producer = PDF erstellt mit: +pdfjs-document-properties-version = PDF-Version: +pdfjs-document-properties-page-count = Seitenzahl: +pdfjs-document-properties-page-size = Seitengröße: +pdfjs-document-properties-page-size-unit-inches = Zoll +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = Hochformat +pdfjs-document-properties-page-size-orientation-landscape = Querformat +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Schnelle Webanzeige: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nein +pdfjs-document-properties-close-button = Schließen + +## Print + +pdfjs-print-progress-message = Dokument wird für Drucken vorbereitet… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Abbrechen +pdfjs-printing-not-supported = Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt. +pdfjs-printing-not-ready = Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Sidebar umschalten +pdfjs-toggle-sidebar-notification-button = + .title = Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge/Ebenen) +pdfjs-toggle-sidebar-button-label = Sidebar umschalten +pdfjs-document-outline-button = + .title = Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen) +pdfjs-document-outline-button-label = Dokumentstruktur +pdfjs-attachments-button = + .title = Anhänge anzeigen +pdfjs-attachments-button-label = Anhänge +pdfjs-layers-button = + .title = Ebenen anzeigen (Doppelklicken, um alle Ebenen auf den Standardzustand zurückzusetzen) +pdfjs-layers-button-label = Ebenen +pdfjs-thumbs-button = + .title = Miniaturansichten anzeigen +pdfjs-thumbs-button-label = Miniaturansichten +pdfjs-current-outline-item-button = + .title = Aktuelles Struktur-Element finden +pdfjs-current-outline-item-button-label = Aktuelles Struktur-Element +pdfjs-findbar-button = + .title = Dokument durchsuchen +pdfjs-findbar-button-label = Suchen +pdfjs-additional-layers = Zusätzliche Ebenen + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Seite { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniaturansicht von Seite { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Suchen + .placeholder = Dokument durchsuchen… +pdfjs-find-previous-button = + .title = Vorheriges Vorkommen des Suchbegriffs finden +pdfjs-find-previous-button-label = Zurück +pdfjs-find-next-button = + .title = Nächstes Vorkommen des Suchbegriffs finden +pdfjs-find-next-button-label = Weiter +pdfjs-find-highlight-checkbox = Alle hervorheben +pdfjs-find-match-case-checkbox-label = Groß-/Kleinschreibung beachten +pdfjs-find-match-diacritics-checkbox-label = Akzente +pdfjs-find-entire-word-checkbox-label = Ganze Wörter +pdfjs-find-reached-top = Anfang des Dokuments erreicht, fahre am Ende fort +pdfjs-find-reached-bottom = Ende des Dokuments erreicht, fahre am Anfang fort +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } von { $total } Übereinstimmung + *[other] { $current } von { $total } Übereinstimmungen + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mehr als { $limit } Übereinstimmung + *[other] Mehr als { $limit } Übereinstimmungen + } +pdfjs-find-not-found = Suchbegriff nicht gefunden + +## Predefined zoom values + +pdfjs-page-scale-width = Seitenbreite +pdfjs-page-scale-fit = Seitengröße +pdfjs-page-scale-auto = Automatischer Zoom +pdfjs-page-scale-actual = Originalgröße +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Seite { $page } + +## Loading indicator messages + +pdfjs-loading-error = Beim Laden der PDF-Datei trat ein Fehler auf. +pdfjs-invalid-file-error = Ungültige oder beschädigte PDF-Datei +pdfjs-missing-file-error = Fehlende PDF-Datei +pdfjs-unexpected-response-error = Unerwartete Antwort des Servers +pdfjs-rendering-error = Beim Darstellen der Seite trat ein Fehler auf. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anlage: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Geben Sie zum Öffnen der PDF-Datei deren Passwort ein. +pdfjs-password-invalid = Falsches Passwort. Bitte versuchen Sie es erneut. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Abbrechen +pdfjs-web-fonts-disabled = Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Zeichnen +pdfjs-editor-ink-button-label = Zeichnen +pdfjs-editor-stamp-button = + .title = Grafiken hinzufügen oder bearbeiten +pdfjs-editor-stamp-button-label = Grafiken hinzufügen oder bearbeiten +pdfjs-editor-highlight-button = + .title = Hervorheben +pdfjs-editor-highlight-button-label = Hervorheben +pdfjs-highlight-floating-button1 = + .title = Hervorheben + .aria-label = Hervorheben +pdfjs-highlight-floating-button-label = Hervorheben + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Zeichnung entfernen +pdfjs-editor-remove-freetext-button = + .title = Text entfernen +pdfjs-editor-remove-stamp-button = + .title = Grafik entfernen +pdfjs-editor-remove-highlight-button = + .title = Hervorhebung entfernen + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Farbe +pdfjs-editor-free-text-size-input = Größe +pdfjs-editor-ink-color-input = Farbe +pdfjs-editor-ink-thickness-input = Linienstärke +pdfjs-editor-ink-opacity-input = Deckkraft +pdfjs-editor-stamp-add-image-button = + .title = Grafik hinzufügen +pdfjs-editor-stamp-add-image-button-label = Grafik hinzufügen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Linienstärke +pdfjs-editor-free-highlight-thickness-title = + .title = Linienstärke beim Hervorheben anderer Elemente als Text ändern +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Texteditor + .default-content = Schreiben beginnen… +pdfjs-free-text = + .aria-label = Texteditor +pdfjs-free-text-default-content = Schreiben beginnen… +pdfjs-ink = + .aria-label = Zeichnungseditor +pdfjs-ink-canvas = + .aria-label = Vom Benutzer erstelltes Bild + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternativ-Text +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternativ-Text bearbeiten +pdfjs-editor-alt-text-edit-button-label = Alternativ-Text bearbeiten +pdfjs-editor-alt-text-dialog-label = Option wählen +pdfjs-editor-alt-text-dialog-description = Alt-Text (Alternativtext) hilft, wenn Personen die Grafik nicht sehen können oder wenn sie nicht geladen wird. +pdfjs-editor-alt-text-add-description-label = Beschreibung hinzufügen +pdfjs-editor-alt-text-add-description-description = Ziel sind 1-2 Sätze, die das Thema, das Szenario oder Aktionen beschreiben. +pdfjs-editor-alt-text-mark-decorative-label = Als dekorativ markieren +pdfjs-editor-alt-text-mark-decorative-description = Dies wird für Ziergrafiken wie Ränder oder Wasserzeichen verwendet. +pdfjs-editor-alt-text-cancel-button = Abbrechen +pdfjs-editor-alt-text-save-button = Speichern +pdfjs-editor-alt-text-decorative-tooltip = Als dekorativ markiert +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Zum Beispiel: "Ein junger Mann setzt sich an einen Tisch, um zu essen." +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ-Text + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Linke obere Ecke - Größe ändern +pdfjs-editor-resizer-label-top-middle = Oben mittig - Größe ändern +pdfjs-editor-resizer-label-top-right = Rechts oben - Größe ändern +pdfjs-editor-resizer-label-middle-right = Mitte rechts - Größe ändern +pdfjs-editor-resizer-label-bottom-right = Rechte untere Ecke - Größe ändern +pdfjs-editor-resizer-label-bottom-middle = Unten mittig - Größe ändern +pdfjs-editor-resizer-label-bottom-left = Linke untere Ecke - Größe ändern +pdfjs-editor-resizer-label-middle-left = Mitte links - Größe ändern +pdfjs-editor-resizer-top-left = + .aria-label = Linke obere Ecke - Größe ändern +pdfjs-editor-resizer-top-middle = + .aria-label = Oben mittig - Größe ändern +pdfjs-editor-resizer-top-right = + .aria-label = Rechts oben - Größe ändern +pdfjs-editor-resizer-middle-right = + .aria-label = Mitte rechts - Größe ändern +pdfjs-editor-resizer-bottom-right = + .aria-label = Rechte untere Ecke - Größe ändern +pdfjs-editor-resizer-bottom-middle = + .aria-label = Unten mittig - Größe ändern +pdfjs-editor-resizer-bottom-left = + .aria-label = Linke untere Ecke - Größe ändern +pdfjs-editor-resizer-middle-left = + .aria-label = Mitte links - Größe ändern + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Hervorhebungsfarbe +pdfjs-editor-colorpicker-button = + .title = Farbe ändern +pdfjs-editor-colorpicker-dropdown = + .aria-label = Farbauswahl +pdfjs-editor-colorpicker-yellow = + .title = Gelb +pdfjs-editor-colorpicker-green = + .title = Grün +pdfjs-editor-colorpicker-blue = + .title = Blau +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Rot + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Alle anzeigen +pdfjs-editor-highlight-show-all-button = + .title = Alle anzeigen + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternativ-Text (Grafikbeschreibung) bearbeiten +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternativ-Text (Grafikbeschreibung) hinzufügen +pdfjs-editor-new-alt-text-textarea = + .placeholder = Schreiben Sie Ihre Beschreibung hier… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kurze Beschreibung für Personen, die die Grafik nicht sehen können, oder wenn die Grafik nicht geladen wird. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Dieser Alternativ-Text wurde automatisch erstellt und könnte ungenau sein. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Weitere Informationen +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternativ-Text automatisch erstellen +pdfjs-editor-new-alt-text-not-now-button = Nicht jetzt +pdfjs-editor-new-alt-text-error-title = Alternativ-Text konnte nicht automatisch erstellt werden +pdfjs-editor-new-alt-text-error-description = Bitte schreiben Sie Ihren eigenen Alternativ-Text oder versuchen Sie es später erneut. +pdfjs-editor-new-alt-text-error-close-button = Schließen +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alternativ-Text-KI-Modell wird heruntergeladen ({ $downloadedSize } von { $totalSize } MB) + .aria-valuetext = Alternativ-Text-KI-Modell wird heruntergeladen ({ $downloadedSize } von { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ-Text hinzugefügt +pdfjs-editor-new-alt-text-added-button-label = Alternativ-Text hinzugefügt +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Fehlender Alternativ-Text +pdfjs-editor-new-alt-text-missing-button-label = Fehlender Alternativ-Text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternativ-Text überprüfen +pdfjs-editor-new-alt-text-to-review-button-label = Alternativ-Text überprüfen +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatisch erstellt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Alternativ-Text-Einstellungen für Grafiken +pdfjs-image-alt-text-settings-button-label = Alternativ-Text-Einstellungen für Grafiken +pdfjs-editor-alt-text-settings-dialog-label = Alternativ-Text-Einstellungen für Grafiken +pdfjs-editor-alt-text-settings-automatic-title = Automatischer Alternativ-Text +pdfjs-editor-alt-text-settings-create-model-button-label = Alternativ-Text automatisch erstellen +pdfjs-editor-alt-text-settings-create-model-description = Schlägt Beschreibungen vor, um Personen zu helfen, die die Grafik nicht sehen können, oder wenn die Grafik nicht geladen wird. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativ-Text-KI-Modell ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Wird lokal auf Ihrem Gerät ausgeführt, sodass Ihre Daten privat bleiben. Erforderlich für automatischen Alternativ-Text. +pdfjs-editor-alt-text-settings-delete-model-button = Löschen +pdfjs-editor-alt-text-settings-download-model-button = Herunterladen +pdfjs-editor-alt-text-settings-downloading-model-button = Wird heruntergeladen… +pdfjs-editor-alt-text-settings-editor-title = Alternativ-Texteditor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternativ-Texteditor beim Hinzufügen einer Grafik anzeigen +pdfjs-editor-alt-text-settings-show-dialog-description = Hilft Ihnen, sicherzustellen, dass alle Ihre Grafiken Alternativ-Text haben. +pdfjs-editor-alt-text-settings-close-button = Schließen + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Hervorhebung entfernt +pdfjs-editor-undo-bar-message-freetext = Text entfernt +pdfjs-editor-undo-bar-message-ink = Zeichnung entfernt +pdfjs-editor-undo-bar-message-stamp = Grafik entfernt +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } Anmerkung entfernt + *[other] { $count } Anmerkungen entfernt + } +pdfjs-editor-undo-bar-undo-button = + .title = Rückgängig +pdfjs-editor-undo-bar-undo-button-label = Rückgängig +pdfjs-editor-undo-bar-close-button = + .title = Schließen +pdfjs-editor-undo-bar-close-button-label = Schließen diff --git a/public/pdfjs/web/locale/dsb/viewer.ftl b/public/pdfjs/web/locale/dsb/viewer.ftl new file mode 100644 index 0000000..24ac94f --- /dev/null +++ b/public/pdfjs/web/locale/dsb/viewer.ftl @@ -0,0 +1,521 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pjerwjejšny bok +pdfjs-previous-button-label = Slědk +pdfjs-next-button = + .title = Pśiducy bok +pdfjs-next-button-label = Dalej +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Bok +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = z { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount }) +pdfjs-zoom-out-button = + .title = Pómjeńšyś +pdfjs-zoom-out-button-label = Pómjeńšyś +pdfjs-zoom-in-button = + .title = Pówětšyś +pdfjs-zoom-in-button-label = Pówětšyś +pdfjs-zoom-select = + .title = Skalěrowanje +pdfjs-presentation-mode-button = + .title = Do prezentaciskego modusa pśejś +pdfjs-presentation-mode-button-label = Prezentaciski modus +pdfjs-open-file-button = + .title = Dataju wócyniś +pdfjs-open-file-button-label = Wócyniś +pdfjs-print-button = + .title = Śišćaś +pdfjs-print-button-label = Śišćaś +pdfjs-save-button = + .title = Składowaś +pdfjs-save-button-label = Składowaś +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Ześěgnuś +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Ześěgnuś +pdfjs-bookmark-button = + .title = Aktualny bok (URL z aktualnego boka pokazaś) +pdfjs-bookmark-button-label = Aktualny bok + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Rědy +pdfjs-tools-button-label = Rědy +pdfjs-first-page-button = + .title = K prědnemu bokoju +pdfjs-first-page-button-label = K prědnemu bokoju +pdfjs-last-page-button = + .title = K slědnemu bokoju +pdfjs-last-page-button-label = K slědnemu bokoju +pdfjs-page-rotate-cw-button = + .title = Wobwjertnuś ako špěra źo +pdfjs-page-rotate-cw-button-label = Wobwjertnuś ako špěra źo +pdfjs-page-rotate-ccw-button = + .title = Wobwjertnuś nawopaki ako špěra źo +pdfjs-page-rotate-ccw-button-label = Wobwjertnuś nawopaki ako špěra źo +pdfjs-cursor-text-select-tool-button = + .title = Rěd za wuběranje teksta zmóžniś +pdfjs-cursor-text-select-tool-button-label = Rěd za wuběranje teksta +pdfjs-cursor-hand-tool-button = + .title = Rucny rěd zmóžniś +pdfjs-cursor-hand-tool-button-label = Rucny rěd +pdfjs-scroll-page-button = + .title = Kulanje boka wužywaś +pdfjs-scroll-page-button-label = Kulanje boka +pdfjs-scroll-vertical-button = + .title = Wertikalne suwanje wužywaś +pdfjs-scroll-vertical-button-label = Wertikalne suwanje +pdfjs-scroll-horizontal-button = + .title = Horicontalne suwanje wužywaś +pdfjs-scroll-horizontal-button-label = Horicontalne suwanje +pdfjs-scroll-wrapped-button = + .title = Pózlažke suwanje wužywaś +pdfjs-scroll-wrapped-button-label = Pózlažke suwanje +pdfjs-spread-none-button = + .title = Boki njezwězaś +pdfjs-spread-none-button-label = Žeden dwójny bok +pdfjs-spread-odd-button = + .title = Boki zachopinajucy z njerownymi bokami zwězaś +pdfjs-spread-odd-button-label = Njerowne boki +pdfjs-spread-even-button = + .title = Boki zachopinajucy z rownymi bokami zwězaś +pdfjs-spread-even-button-label = Rowne boki + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentowe kakosći… +pdfjs-document-properties-button-label = Dokumentowe kakosći… +pdfjs-document-properties-file-name = Mě dataje: +pdfjs-document-properties-file-size = Wjelikosć dataje: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtow) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtow) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtow) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Awtor: +pdfjs-document-properties-subject = Tema: +pdfjs-document-properties-keywords = Klucowe słowa: +pdfjs-document-properties-creation-date = Datum napóranja: +pdfjs-document-properties-modification-date = Datum změny: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Awtor: +pdfjs-document-properties-producer = PDF-gótowaŕ: +pdfjs-document-properties-version = PDF-wersija: +pdfjs-document-properties-page-count = Licba bokow: +pdfjs-document-properties-page-size = Wjelikosć boka: +pdfjs-document-properties-page-size-unit-inches = col +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = wusoki format +pdfjs-document-properties-page-size-orientation-landscape = prěcny format +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Jo +pdfjs-document-properties-linearized-no = Ně +pdfjs-document-properties-close-button = Zacyniś + +## Print + +pdfjs-print-progress-message = Dokument pśigótujo se za śišćanje… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Pśetergnuś +pdfjs-printing-not-supported = Warnowanje: Śišćanje njepódpěra se połnje pśez toś ten wobglědowak. +pdfjs-printing-not-ready = Warnowanje: PDF njejo se za śišćanje dopołnje zacytał. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Bócnicu pokazaś/schowaś +pdfjs-toggle-sidebar-notification-button = + .title = Bocnicu pśešaltowaś (dokument rozrědowanje/pśipiski/warstwy wopśimujo) +pdfjs-toggle-sidebar-button-label = Bócnicu pokazaś/schowaś +pdfjs-document-outline-button = + .title = Dokumentowe naraźenje pokazaś (dwójne kliknjenje, aby se wšykne zapiski pokazali/schowali) +pdfjs-document-outline-button-label = Dokumentowa struktura +pdfjs-attachments-button = + .title = Pśidanki pokazaś +pdfjs-attachments-button-label = Pśidanki +pdfjs-layers-button = + .title = Warstwy pokazaś (klikniśo dwójcy, aby wšykne warstwy na standardny staw slědk stajił) +pdfjs-layers-button-label = Warstwy +pdfjs-thumbs-button = + .title = Miniatury pokazaś +pdfjs-thumbs-button-label = Miniatury +pdfjs-current-outline-item-button = + .title = Aktualny rozrědowański zapisk pytaś +pdfjs-current-outline-item-button-label = Aktualny rozrědowański zapisk +pdfjs-findbar-button = + .title = W dokumenśe pytaś +pdfjs-findbar-button-label = Pytaś +pdfjs-additional-layers = Dalšne warstwy + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Bok { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura boka { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Pytaś + .placeholder = W dokumenśe pytaś… +pdfjs-find-previous-button = + .title = Pjerwjejšne wustupowanje pytańskego wuraza pytaś +pdfjs-find-previous-button-label = Slědk +pdfjs-find-next-button = + .title = Pśidujuce wustupowanje pytańskego wuraza pytaś +pdfjs-find-next-button-label = Dalej +pdfjs-find-highlight-checkbox = Wšykne wuzwignuś +pdfjs-find-match-case-checkbox-label = Na wjelikopisanje źiwaś +pdfjs-find-match-diacritics-checkbox-label = Diakritiske znamuška wužywaś +pdfjs-find-entire-word-checkbox-label = Cełe słowa +pdfjs-find-reached-top = Zachopjeńk dokumenta dostany, pókšacujo se z kóńcom +pdfjs-find-reached-bottom = Kóńc dokumenta dostany, pókšacujo se ze zachopjeńkom +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } z { $total } wótpowědnika + [two] { $current } z { $total } wótpowědnikowu + [few] { $current } z { $total } wótpowědnikow + *[other] { $current } z { $total } wótpowědnikow + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Wušej { $limit } wótpowědnik + [two] Wušej { $limit } wótpowědnika + [few] Wušej { $limit } wótpowědniki + *[other] Wušej { $limit } wótpowědniki + } +pdfjs-find-not-found = Pytański wuraz njejo se namakał + +## Predefined zoom values + +pdfjs-page-scale-width = Šyrokosć boka +pdfjs-page-scale-fit = Wjelikosć boka +pdfjs-page-scale-auto = Awtomatiske skalěrowanje +pdfjs-page-scale-actual = Aktualna wjelikosć +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Bok { $page } + +## Loading indicator messages + +pdfjs-loading-error = Pśi zacytowanju PDF jo zmólka nastała. +pdfjs-invalid-file-error = Njepłaśiwa abo wobškóźona PDF-dataja. +pdfjs-missing-file-error = Felujuca PDF-dataja. +pdfjs-unexpected-response-error = Njewócakane serwerowe wótegrono. +pdfjs-rendering-error = Pśi zwobraznjanju boka jo zmólka nastała. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Typ pśipiskow: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Zapódajśo gronidło, aby PDF-dataju wócynił. +pdfjs-password-invalid = Njepłaśiwe gronidło. Pšosym wopytajśo hyšći raz. +pdfjs-password-ok-button = W pórěźe +pdfjs-password-cancel-button = Pśetergnuś +pdfjs-web-fonts-disabled = Webpisma su znjemóžnjone: njejo móžno, zasajźone PDF-pisma wužywaś. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Kresliś +pdfjs-editor-ink-button-label = Kresliś +pdfjs-editor-stamp-button = + .title = Wobraze pśidaś abo wobźěłaś +pdfjs-editor-stamp-button-label = Wobraze pśidaś abo wobźěłaś +pdfjs-editor-highlight-button = + .title = Wuzwignuś +pdfjs-editor-highlight-button-label = Wuzwignuś +pdfjs-highlight-floating-button1 = + .title = Wuzwignuś + .aria-label = Wuzwignuś +pdfjs-highlight-floating-button-label = Wuzwignuś + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Kreslanku wótwónoźeś +pdfjs-editor-remove-freetext-button = + .title = Tekst wótwónoźeś +pdfjs-editor-remove-stamp-button = + .title = Wobraz wótwónoźeś +pdfjs-editor-remove-highlight-button = + .title = Wuzwignjenje wótpóraś + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Barwa +pdfjs-editor-free-text-size-input = Wjelikosć +pdfjs-editor-ink-color-input = Barwa +pdfjs-editor-ink-thickness-input = Tłustosć +pdfjs-editor-ink-opacity-input = Opacita +pdfjs-editor-stamp-add-image-button = + .title = Wobraz pśidaś +pdfjs-editor-stamp-add-image-button-label = Wobraz pśidaś +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tłustosć +pdfjs-editor-free-highlight-thickness-title = + .title = Tłustosć změniś, gaž se zapiski wuzwiguju, kótarež tekst njejsu +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstowy editor + .default-content = Zachopśo pisaś … +pdfjs-free-text = + .aria-label = Tekstowy editor +pdfjs-free-text-default-content = Zachopśo pisaś… +pdfjs-ink = + .aria-label = Kresleński editor +pdfjs-ink-canvas = + .aria-label = Wobraz napórany wót wužywarja + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternatiwny tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatiwny tekst wobźěłaś +pdfjs-editor-alt-text-edit-button-label = Alternatiwny tekst wobźěłaś +pdfjs-editor-alt-text-dialog-label = Nastajenje wubraś +pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomaga, gaž luźe njamógu wobraz wiźeś abo gaž se wobraz njezacytajo. +pdfjs-editor-alt-text-add-description-label = Wopisanje pśidaś +pdfjs-editor-alt-text-add-description-description = Pišćo 1 sadu abo 2 saźe, kótarejž temu, nastajenje abo akcije wopisujotej. +pdfjs-editor-alt-text-mark-decorative-label = Ako dekoratiwny markěrowaś +pdfjs-editor-alt-text-mark-decorative-description = To se za pyšnjece wobraze wužywa, na pśikład ramiki abo wódowe znamjenja. +pdfjs-editor-alt-text-cancel-button = Pśetergnuś +pdfjs-editor-alt-text-save-button = Składowaś +pdfjs-editor-alt-text-decorative-tooltip = Ako dekoratiwny markěrowany +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na pśikład, „Młody muski za blidom sejźi, aby jěź jědł“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatiwny tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Górjejce nalěwo – wjelikosć změniś +pdfjs-editor-resizer-label-top-middle = Górjejce wesrjejź – wjelikosć změniś +pdfjs-editor-resizer-label-top-right = Górjejce napšawo – wjelikosć změniś +pdfjs-editor-resizer-label-middle-right = Wesrjejź napšawo – wjelikosć změniś +pdfjs-editor-resizer-label-bottom-right = Dołojce napšawo – wjelikosć změniś +pdfjs-editor-resizer-label-bottom-middle = Dołojce wesrjejź – wjelikosć změniś +pdfjs-editor-resizer-label-bottom-left = Dołojce nalěwo – wjelikosć změniś +pdfjs-editor-resizer-label-middle-left = Wesrjejź nalěwo – wjelikosć změniś +pdfjs-editor-resizer-top-left = + .aria-label = Górjejce nalěwo – wjelikosć změniś +pdfjs-editor-resizer-top-middle = + .aria-label = Górjejce wesrjejź – wjelikosć změniś +pdfjs-editor-resizer-top-right = + .aria-label = Górjejce napšawo – wjelikosć změniś +pdfjs-editor-resizer-middle-right = + .aria-label = Wesrjejź napšawo – wjelikosć změniś +pdfjs-editor-resizer-bottom-right = + .aria-label = Dołojce napšawo – wjelikosć změniś +pdfjs-editor-resizer-bottom-middle = + .aria-label = Dołojce wesrjejź – wjelikosć změniś +pdfjs-editor-resizer-bottom-left = + .aria-label = Dołojce nalěwo – wjelikosć změniś +pdfjs-editor-resizer-middle-left = + .aria-label = Wesrjejź nalěwo – wjelikosć změniś + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Barwa wuzwignjenja +pdfjs-editor-colorpicker-button = + .title = Barwu změniś +pdfjs-editor-colorpicker-dropdown = + .aria-label = Wuběrk barwow +pdfjs-editor-colorpicker-yellow = + .title = Žołty +pdfjs-editor-colorpicker-green = + .title = Zeleny +pdfjs-editor-colorpicker-blue = + .title = Módry +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Cerwjeny + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Wšykne pokazaś +pdfjs-editor-highlight-show-all-button = + .title = Wšykne pokazaś + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatiwny tekst wobźěłaś (wobrazowe wopisanje) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatiwny tekst pśidaś (wobrazowe wopisanje) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Pišćo how swójo wopisanje… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krotke wopisanje za luźe, kótarež njamóžośo wobraz wiźeś abo gaž se wobraz njezacytajo. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Toś ten alternatiwny tekst jo se awtomatiski napórał a jo snaź njedokradny. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Dalšne informacije +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatiwny tekst awtomatiski napóraś +pdfjs-editor-new-alt-text-not-now-button = Nic něnto +pdfjs-editor-new-alt-text-error-title = Alternatiwny tekst njedajo se awtomatiski napóraś +pdfjs-editor-new-alt-text-error-description = Pšosym pišćo swój alternatiwny tekst abo wopytajśo pózdźej hyšći raz. +pdfjs-editor-new-alt-text-error-close-button = Zacyniś +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Model KI za alternatiwny tekst se ześěgujo ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Model KI za alternatiwny tekst se ześěgujo ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatiwny tekst jo se pśidał +pdfjs-editor-new-alt-text-added-button-label = Alternatiwny tekst jo se pśidał +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatiwny tekst felujo +pdfjs-editor-new-alt-text-missing-button-label = Alternatiwny tekst felujo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatiwny tekst pśeglědowaś +pdfjs-editor-new-alt-text-to-review-button-label = Alternatiwny tekst pśeglědowaś +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Awtomatiski napórany: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastajenja alternatiwnego wobrazowego teksta +pdfjs-image-alt-text-settings-button-label = Nastajenja alternatiwnego wobrazowego teksta +pdfjs-editor-alt-text-settings-dialog-label = Nastajenja alternatiwnego wobrazowego teksta +pdfjs-editor-alt-text-settings-automatic-title = Awtomatiski alternatiwny tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatiwny tekst awtomatiski napóraś +pdfjs-editor-alt-text-settings-create-model-description = Naraźujo wopisanja, aby pomagał ludam, kótarež njamóžośo wobraz wiźeś abo gaž se wobraz njezacytajo. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model KI alternatiwnego teksta ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Běžy lokalnje na wašom rěźe, aby waše daty priwatne wóstali. Za awtomatiski alternatiwny tekst trjebny. +pdfjs-editor-alt-text-settings-delete-model-button = Lašowaś +pdfjs-editor-alt-text-settings-download-model-button = Ześěgnuś +pdfjs-editor-alt-text-settings-downloading-model-button = Ześěgujo se… +pdfjs-editor-alt-text-settings-editor-title = Editor za alternatiwny tekst +pdfjs-editor-alt-text-settings-show-dialog-button-label = Editor alternatiwnego teksta ned pokazaś, gaž se wobraz pśidawa +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga, wam wšym swójim wobrazam alternatiwny tekst pśidaś. +pdfjs-editor-alt-text-settings-close-button = Zacyniś + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Wótwónoźone wuzwignuś +pdfjs-editor-undo-bar-message-freetext = Tekst jo se wótwónoźeł +pdfjs-editor-undo-bar-message-ink = Kreslanka jo se wótwónoźeła +pdfjs-editor-undo-bar-message-stamp = Wobraz jo se wótwónoźeł +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } pśipisk jo se wótwónoźeł + [two] { $count } pśipiska stej se wótwónoźełej + [few] { $count } pśipiski su se wótwónoźeli + *[other] { $count } pśipiskow jo se wótwónoźeło + } +pdfjs-editor-undo-bar-undo-button = + .title = Anulěrowaś +pdfjs-editor-undo-bar-undo-button-label = Anulěrowaś +pdfjs-editor-undo-bar-close-button = + .title = Zacyniś +pdfjs-editor-undo-bar-close-button-label = Zacyniś diff --git a/public/pdfjs/web/locale/el/viewer.ftl b/public/pdfjs/web/locale/el/viewer.ftl new file mode 100644 index 0000000..5a04bd8 --- /dev/null +++ b/public/pdfjs/web/locale/el/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Προηγούμενη σελίδα +pdfjs-previous-button-label = Προηγούμενη +pdfjs-next-button = + .title = Επόμενη σελίδα +pdfjs-next-button-label = Επόμενη +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Σελίδα +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = από { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } από { $pagesCount }) +pdfjs-zoom-out-button = + .title = Σμίκρυνση +pdfjs-zoom-out-button-label = Σμίκρυνση +pdfjs-zoom-in-button = + .title = Μεγέθυνση +pdfjs-zoom-in-button-label = Μεγέθυνση +pdfjs-zoom-select = + .title = Ζουμ +pdfjs-presentation-mode-button = + .title = Εναλλαγή σε λειτουργία παρουσίασης +pdfjs-presentation-mode-button-label = Λειτουργία παρουσίασης +pdfjs-open-file-button = + .title = Άνοιγμα αρχείου +pdfjs-open-file-button-label = Άνοιγμα +pdfjs-print-button = + .title = Εκτύπωση +pdfjs-print-button-label = Εκτύπωση +pdfjs-save-button = + .title = Αποθήκευση +pdfjs-save-button-label = Αποθήκευση +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Λήψη +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Λήψη +pdfjs-bookmark-button = + .title = Τρέχουσα σελίδα (Προβολή URL από τρέχουσα σελίδα) +pdfjs-bookmark-button-label = Τρέχουσα σελίδα + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Εργαλεία +pdfjs-tools-button-label = Εργαλεία +pdfjs-first-page-button = + .title = Μετάβαση στην πρώτη σελίδα +pdfjs-first-page-button-label = Μετάβαση στην πρώτη σελίδα +pdfjs-last-page-button = + .title = Μετάβαση στην τελευταία σελίδα +pdfjs-last-page-button-label = Μετάβαση στην τελευταία σελίδα +pdfjs-page-rotate-cw-button = + .title = Δεξιόστροφη περιστροφή +pdfjs-page-rotate-cw-button-label = Δεξιόστροφη περιστροφή +pdfjs-page-rotate-ccw-button = + .title = Αριστερόστροφη περιστροφή +pdfjs-page-rotate-ccw-button-label = Αριστερόστροφη περιστροφή +pdfjs-cursor-text-select-tool-button = + .title = Ενεργοποίηση εργαλείου επιλογής κειμένου +pdfjs-cursor-text-select-tool-button-label = Εργαλείο επιλογής κειμένου +pdfjs-cursor-hand-tool-button = + .title = Ενεργοποίηση εργαλείου χεριού +pdfjs-cursor-hand-tool-button-label = Εργαλείο χεριού +pdfjs-scroll-page-button = + .title = Χρήση κύλισης σελίδας +pdfjs-scroll-page-button-label = Κύλιση σελίδας +pdfjs-scroll-vertical-button = + .title = Χρήση κάθετης κύλισης +pdfjs-scroll-vertical-button-label = Κάθετη κύλιση +pdfjs-scroll-horizontal-button = + .title = Χρήση οριζόντιας κύλισης +pdfjs-scroll-horizontal-button-label = Οριζόντια κύλιση +pdfjs-scroll-wrapped-button = + .title = Χρήση κυκλικής κύλισης +pdfjs-scroll-wrapped-button-label = Κυκλική κύλιση +pdfjs-spread-none-button = + .title = Να μη γίνει σύνδεση επεκτάσεων σελίδων +pdfjs-spread-none-button-label = Χωρίς επεκτάσεις +pdfjs-spread-odd-button = + .title = Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις μονές σελίδες +pdfjs-spread-odd-button-label = Μονές επεκτάσεις +pdfjs-spread-even-button = + .title = Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις ζυγές σελίδες +pdfjs-spread-even-button-label = Ζυγές επεκτάσεις + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Ιδιότητες εγγράφου… +pdfjs-document-properties-button-label = Ιδιότητες εγγράφου… +pdfjs-document-properties-file-name = Όνομα αρχείου: +pdfjs-document-properties-file-size = Μέγεθος αρχείου: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Τίτλος: +pdfjs-document-properties-author = Συγγραφέας: +pdfjs-document-properties-subject = Θέμα: +pdfjs-document-properties-keywords = Λέξεις-κλειδιά: +pdfjs-document-properties-creation-date = Ημερομηνία δημιουργίας: +pdfjs-document-properties-modification-date = Ημερομηνία τροποποίησης: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Δημιουργός: +pdfjs-document-properties-producer = Παραγωγός PDF: +pdfjs-document-properties-version = Έκδοση PDF: +pdfjs-document-properties-page-count = Αριθμός σελίδων: +pdfjs-document-properties-page-size = Μέγεθος σελίδας: +pdfjs-document-properties-page-size-unit-inches = ίντσες +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = κατακόρυφα +pdfjs-document-properties-page-size-orientation-landscape = οριζόντια +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Επιστολή +pdfjs-document-properties-page-size-name-legal = Τύπου Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Ταχεία προβολή ιστού: +pdfjs-document-properties-linearized-yes = Ναι +pdfjs-document-properties-linearized-no = Όχι +pdfjs-document-properties-close-button = Κλείσιμο + +## Print + +pdfjs-print-progress-message = Προετοιμασία του εγγράφου για εκτύπωση… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Ακύρωση +pdfjs-printing-not-supported = Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από το πρόγραμμα περιήγησης. +pdfjs-printing-not-ready = Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = (Απ)ενεργοποίηση πλαϊνής γραμμής +pdfjs-toggle-sidebar-notification-button = + .title = (Απ)ενεργοποίηση πλαϊνής γραμμής (το έγγραφο περιέχει περίγραμμα/συνημμένα/επίπεδα) +pdfjs-toggle-sidebar-button-label = (Απ)ενεργοποίηση πλαϊνής γραμμής +pdfjs-document-outline-button = + .title = Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων) +pdfjs-document-outline-button-label = Διάρθρωση εγγράφου +pdfjs-attachments-button = + .title = Εμφάνιση συνημμένων +pdfjs-attachments-button-label = Συνημμένα +pdfjs-layers-button = + .title = Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση) +pdfjs-layers-button-label = Επίπεδα +pdfjs-thumbs-button = + .title = Εμφάνιση μικρογραφιών +pdfjs-thumbs-button-label = Μικρογραφίες +pdfjs-current-outline-item-button = + .title = Εύρεση τρέχοντος στοιχείου διάρθρωσης +pdfjs-current-outline-item-button-label = Τρέχον στοιχείο διάρθρωσης +pdfjs-findbar-button = + .title = Εύρεση στο έγγραφο +pdfjs-findbar-button-label = Εύρεση +pdfjs-additional-layers = Επιπρόσθετα επίπεδα + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Σελίδα { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Μικρογραφία σελίδας { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Εύρεση + .placeholder = Εύρεση στο έγγραφο… +pdfjs-find-previous-button = + .title = Εύρεση της προηγούμενης εμφάνισης της φράσης +pdfjs-find-previous-button-label = Προηγούμενο +pdfjs-find-next-button = + .title = Εύρεση της επόμενης εμφάνισης της φράσης +pdfjs-find-next-button-label = Επόμενο +pdfjs-find-highlight-checkbox = Επισήμανση όλων +pdfjs-find-match-case-checkbox-label = Συμφωνία πεζών/κεφαλαίων +pdfjs-find-match-diacritics-checkbox-label = Αντιστοίχιση διακριτικών +pdfjs-find-entire-word-checkbox-label = Ολόκληρες λέξεις +pdfjs-find-reached-top = Φτάσατε στην αρχή του εγγράφου, συνέχεια από το τέλος +pdfjs-find-reached-bottom = Φτάσατε στο τέλος του εγγράφου, συνέχεια από την αρχή +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } από { $total } αντιστοιχία + *[other] { $current } από { $total } αντιστοιχίες + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Περισσότερες από { $limit } αντιστοιχία + *[other] Περισσότερες από { $limit } αντιστοιχίες + } +pdfjs-find-not-found = Η φράση δεν βρέθηκε + +## Predefined zoom values + +pdfjs-page-scale-width = Πλάτος σελίδας +pdfjs-page-scale-fit = Μέγεθος σελίδας +pdfjs-page-scale-auto = Αυτόματο ζουμ +pdfjs-page-scale-actual = Πραγματικό μέγεθος +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Σελίδα { $page } + +## Loading indicator messages + +pdfjs-loading-error = Προέκυψε σφάλμα κατά τη φόρτωση του PDF. +pdfjs-invalid-file-error = Μη έγκυρο ή κατεστραμμένο αρχείο PDF. +pdfjs-missing-file-error = Λείπει αρχείο PDF. +pdfjs-unexpected-response-error = Μη αναμενόμενη απόκριση από το διακομιστή. +pdfjs-rendering-error = Προέκυψε σφάλμα κατά την εμφάνιση της σελίδας. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Σχόλιο «{ $type }»] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Εισαγάγετε τον κωδικό πρόσβασης για να ανοίξετε αυτό το αρχείο PDF. +pdfjs-password-invalid = Μη έγκυρος κωδικός πρόσβασης. Παρακαλώ δοκιμάστε ξανά. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Ακύρωση +pdfjs-web-fonts-disabled = Οι γραμματοσειρές ιστού είναι ανενεργές: δεν είναι δυνατή η χρήση των ενσωματωμένων γραμματοσειρών PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Κείμενο +pdfjs-editor-free-text-button-label = Κείμενο +pdfjs-editor-ink-button = + .title = Σχέδιο +pdfjs-editor-ink-button-label = Σχέδιο +pdfjs-editor-stamp-button = + .title = Προσθήκη ή επεξεργασία εικόνων +pdfjs-editor-stamp-button-label = Προσθήκη ή επεξεργασία εικόνων +pdfjs-editor-highlight-button = + .title = Επισήμανση +pdfjs-editor-highlight-button-label = Επισήμανση +pdfjs-highlight-floating-button1 = + .title = Επισήμανση + .aria-label = Επισήμανση +pdfjs-highlight-floating-button-label = Επισήμανση + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Αφαίρεση σχεδίου +pdfjs-editor-remove-freetext-button = + .title = Αφαίρεση κειμένου +pdfjs-editor-remove-stamp-button = + .title = Αφαίρεση εικόνας +pdfjs-editor-remove-highlight-button = + .title = Αφαίρεση επισήμανσης + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Χρώμα +pdfjs-editor-free-text-size-input = Μέγεθος +pdfjs-editor-ink-color-input = Χρώμα +pdfjs-editor-ink-thickness-input = Πάχος +pdfjs-editor-ink-opacity-input = Αδιαφάνεια +pdfjs-editor-stamp-add-image-button = + .title = Προσθήκη εικόνας +pdfjs-editor-stamp-add-image-button-label = Προσθήκη εικόνας +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Πάχος +pdfjs-editor-free-highlight-thickness-title = + .title = Αλλαγή πάχους κατά την επισήμανση στοιχείων εκτός κειμένου +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Επεξεργασία κειμένου + .default-content = Ξεκινήστε να πληκτρολογείτε… +pdfjs-free-text = + .aria-label = Επεξεργασία κειμένου +pdfjs-free-text-default-content = Ξεκινήστε να πληκτρολογείτε… +pdfjs-ink = + .aria-label = Επεξεργασία σχεδίων +pdfjs-ink-canvas = + .aria-label = Εικόνα από τον χρήστη + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Εναλλακτικό κείμενο +pdfjs-editor-alt-text-edit-button = + .aria-label = Επεξεργασία εναλλακτικού κειμένου +pdfjs-editor-alt-text-edit-button-label = Επεξεργασία εναλλακτικού κειμένου +pdfjs-editor-alt-text-dialog-label = Διαλέξτε μια επιλογή +pdfjs-editor-alt-text-dialog-description = Το εναλλακτικό κείμενο είναι χρήσιμο όταν οι άνθρωποι δεν μπορούν να δουν την εικόνα ή όταν αυτή δεν φορτώνεται. +pdfjs-editor-alt-text-add-description-label = Προσθήκη περιγραφής +pdfjs-editor-alt-text-add-description-description = Στοχεύστε σε μία ή δύο προτάσεις που περιγράφουν το θέμα, τη ρύθμιση ή τις ενέργειες. +pdfjs-editor-alt-text-mark-decorative-label = Επισήμανση ως διακοσμητικό +pdfjs-editor-alt-text-mark-decorative-description = Χρησιμοποιείται για διακοσμητικές εικόνες, όπως περιγράμματα ή υδατογραφήματα. +pdfjs-editor-alt-text-cancel-button = Ακύρωση +pdfjs-editor-alt-text-save-button = Αποθήκευση +pdfjs-editor-alt-text-decorative-tooltip = Επισημασμένο ως διακοσμητικό +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Για παράδειγμα, «Ένας νεαρός άνδρας κάθεται σε ένα τραπέζι για να φάει ένα γεύμα» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Εναλλακτικό κείμενο + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Επάνω αριστερή γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-label-top-middle = Μέσο επάνω πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-label-top-right = Επάνω δεξιά γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-label-middle-right = Μέσο δεξιάς πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-label-bottom-right = Κάτω δεξιά γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-label-bottom-middle = Μέσο κάτω πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-label-bottom-left = Κάτω αριστερή γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-label-middle-left = Μέσο αριστερής πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-top-left = + .aria-label = Επάνω αριστερή γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-top-middle = + .aria-label = Μέσο επάνω πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-top-right = + .aria-label = Επάνω δεξιά γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-middle-right = + .aria-label = Μέσο δεξιάς πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-bottom-right = + .aria-label = Κάτω δεξιά γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-bottom-middle = + .aria-label = Μέσο κάτω πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-bottom-left = + .aria-label = Κάτω αριστερή γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-middle-left = + .aria-label = Μέσο αριστερής πλευράς — αλλαγή μεγέθους + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Χρώμα επισήμανσης +pdfjs-editor-colorpicker-button = + .title = Αλλαγή χρώματος +pdfjs-editor-colorpicker-dropdown = + .aria-label = Επιλογές χρωμάτων +pdfjs-editor-colorpicker-yellow = + .title = Κίτρινο +pdfjs-editor-colorpicker-green = + .title = Πράσινο +pdfjs-editor-colorpicker-blue = + .title = Μπλε +pdfjs-editor-colorpicker-pink = + .title = Ροζ +pdfjs-editor-colorpicker-red = + .title = Κόκκινο + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Εμφάνιση όλων +pdfjs-editor-highlight-show-all-button = + .title = Εμφάνιση όλων + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Επεξεργασία εναλλακτικού κειμένου (περιγραφή εικόνας) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Προσθήκη εναλλακτικού κειμένου (περιγραφή εικόνας) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Γράψτε την περιγραφή σας εδώ… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Σύντομη περιγραφή για άτομα που δεν μπορούν να δουν την εικόνα ή όταν η εικόνα δεν φορτώνεται. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Αυτό το εναλλακτικό κείμενο δημιουργήθηκε αυτόματα και ενδέχεται να είναι ανακριβές. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Μάθετε περισσότερα +pdfjs-editor-new-alt-text-create-automatically-button-label = Αυτόματη δημιουργία εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-not-now-button = Όχι τώρα +pdfjs-editor-new-alt-text-error-title = Δεν ήταν δυνατή η αυτόματη δημιουργία εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-error-description = Γράψτε το δικό σας εναλλακτικό κείμενο ή δοκιμάστε ξανά αργότερα. +pdfjs-editor-new-alt-text-error-close-button = Κλείσιμο +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Λήψη μοντέλου AI εναλλακτικού κειμένου ({ $downloadedSize } από { $totalSize } MB) + .aria-valuetext = Λήψη μοντέλου AI εναλλακτικού κειμένου ({ $downloadedSize } από { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Προστέθηκε εναλλακτικό κείμενο +pdfjs-editor-new-alt-text-added-button-label = Προστέθηκε εναλλακτικό κείμενο +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Απουσία εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-missing-button-label = Απουσία εναλλακτικού κειμένου +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Έλεγχος εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-to-review-button-label = Έλεγχος εναλλακτικού κειμένου +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Αυτόματη δημιουργία: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ρυθμίσεις εναλλακτικού κειμένου εικόνας +pdfjs-image-alt-text-settings-button-label = Ρυθμίσεις εναλλακτικού κειμένου εικόνας +pdfjs-editor-alt-text-settings-dialog-label = Ρυθμίσεις εναλλακτικού κειμένου εικόνας +pdfjs-editor-alt-text-settings-automatic-title = Αυτόματο εναλλακτικό κείμενο +pdfjs-editor-alt-text-settings-create-model-button-label = Αυτόματη δημιουργία εναλλακτικού κειμένου +pdfjs-editor-alt-text-settings-create-model-description = Προτείνει περιγραφές για άτομα που δεν μπορούν να δουν την εικόνα ή όταν η εικόνα δεν φορτώνεται. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Μοντέλο AI εναλλακτικού κειμένου ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Εκτελείται τοπικά στη συσκευή σας, ώστε τα δεδομένα σας να παραμένουν ιδιωτικά. Απαιτείται για τη δημιουργία του αυτόματου εναλλακτικού κειμένου. +pdfjs-editor-alt-text-settings-delete-model-button = Διαγραφή +pdfjs-editor-alt-text-settings-download-model-button = Λήψη +pdfjs-editor-alt-text-settings-downloading-model-button = Λήψη… +pdfjs-editor-alt-text-settings-editor-title = Επεξεργασία εναλλακτικού κειμένου +pdfjs-editor-alt-text-settings-show-dialog-button-label = Άμεση εμφάνιση της επεξεργασίας εναλλακτικού κειμένου κατά την προσθήκη εικόνας +pdfjs-editor-alt-text-settings-show-dialog-description = Σας βοηθά να βεβαιωθείτε ότι όλες οι εικόνες σας έχουν εναλλακτικό κείμενο. +pdfjs-editor-alt-text-settings-close-button = Κλείσιμο + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Η επισήμανση αφαιρέθηκε +pdfjs-editor-undo-bar-message-freetext = Το κείμενο αφαιρέθηκε +pdfjs-editor-undo-bar-message-ink = Το σχέδιο αφαιρέθηκε +pdfjs-editor-undo-bar-message-stamp = Η εικόνα αφαιρέθηκε +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Αφαιρέθηκε { $count } σχολιασμός + *[other] Αφαιρέθηκαν { $count } σχολιασμοί + } +pdfjs-editor-undo-bar-undo-button = + .title = Αναίρεση +pdfjs-editor-undo-bar-undo-button-label = Αναίρεση +pdfjs-editor-undo-bar-close-button = + .title = Κλείσιμο +pdfjs-editor-undo-bar-close-button-label = Κλείσιμο diff --git a/public/pdfjs/web/locale/en-CA/viewer.ftl b/public/pdfjs/web/locale/en-CA/viewer.ftl new file mode 100644 index 0000000..346e6e8 --- /dev/null +++ b/public/pdfjs/web/locale/en-CA/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Previous Page +pdfjs-previous-button-label = Previous +pdfjs-next-button = + .title = Next Page +pdfjs-next-button-label = Next +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Page +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = of { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom Out +pdfjs-zoom-out-button-label = Zoom Out +pdfjs-zoom-in-button = + .title = Zoom In +pdfjs-zoom-in-button-label = Zoom In +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Switch to Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Open File +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Print +pdfjs-print-button-label = Print +pdfjs-save-button = + .title = Save +pdfjs-save-button-label = Save +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Download +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Download +pdfjs-bookmark-button = + .title = Current Page (View URL from Current Page) +pdfjs-bookmark-button-label = Current Page + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tools +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Go to First Page +pdfjs-first-page-button-label = Go to First Page +pdfjs-last-page-button = + .title = Go to Last Page +pdfjs-last-page-button-label = Go to Last Page +pdfjs-page-rotate-cw-button = + .title = Rotate Clockwise +pdfjs-page-rotate-cw-button-label = Rotate Clockwise +pdfjs-page-rotate-ccw-button = + .title = Rotate Counterclockwise +pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise +pdfjs-cursor-text-select-tool-button = + .title = Enable Text Selection Tool +pdfjs-cursor-text-select-tool-button-label = Text Selection Tool +pdfjs-cursor-hand-tool-button = + .title = Enable Hand Tool +pdfjs-cursor-hand-tool-button-label = Hand Tool +pdfjs-scroll-page-button = + .title = Use Page Scrolling +pdfjs-scroll-page-button-label = Page Scrolling +pdfjs-scroll-vertical-button = + .title = Use Vertical Scrolling +pdfjs-scroll-vertical-button-label = Vertical Scrolling +pdfjs-scroll-horizontal-button = + .title = Use Horizontal Scrolling +pdfjs-scroll-horizontal-button-label = Horizontal Scrolling +pdfjs-scroll-wrapped-button = + .title = Use Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = Do not join page spreads +pdfjs-spread-none-button-label = No Spreads +pdfjs-spread-odd-button = + .title = Join page spreads starting with odd-numbered pages +pdfjs-spread-odd-button-label = Odd Spreads +pdfjs-spread-even-button = + .title = Join page spreads starting with even-numbered pages +pdfjs-spread-even-button-label = Even Spreads + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Document Properties… +pdfjs-document-properties-button-label = Document Properties… +pdfjs-document-properties-file-name = File name: +pdfjs-document-properties-file-size = File size: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Title: +pdfjs-document-properties-author = Author: +pdfjs-document-properties-subject = Subject: +pdfjs-document-properties-keywords = Keywords: +pdfjs-document-properties-creation-date = Creation Date: +pdfjs-document-properties-modification-date = Modification Date: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creator: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Page Count: +pdfjs-document-properties-page-size = Page Size: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = landscape +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Yes +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Close + +## Print + +pdfjs-print-progress-message = Preparing document for printing… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancel +pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser. +pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toggle Sidebar +pdfjs-toggle-sidebar-notification-button = + .title = Toggle Sidebar (document contains outline/attachments/layers) +pdfjs-toggle-sidebar-button-label = Toggle Sidebar +pdfjs-document-outline-button = + .title = Show Document Outline (double-click to expand/collapse all items) +pdfjs-document-outline-button-label = Document Outline +pdfjs-attachments-button = + .title = Show Attachments +pdfjs-attachments-button-label = Attachments +pdfjs-layers-button = + .title = Show Layers (double-click to reset all layers to the default state) +pdfjs-layers-button-label = Layers +pdfjs-thumbs-button = + .title = Show Thumbnails +pdfjs-thumbs-button-label = Thumbnails +pdfjs-current-outline-item-button = + .title = Find Current Outline Item +pdfjs-current-outline-item-button-label = Current Outline Item +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = Find +pdfjs-additional-layers = Additional Layers + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail of Page { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Find + .placeholder = Find in document… +pdfjs-find-previous-button = + .title = Find the previous occurrence of the phrase +pdfjs-find-previous-button-label = Previous +pdfjs-find-next-button = + .title = Find the next occurrence of the phrase +pdfjs-find-next-button-label = Next +pdfjs-find-highlight-checkbox = Highlight All +pdfjs-find-match-case-checkbox-label = Match Case +pdfjs-find-match-diacritics-checkbox-label = Match Diacritics +pdfjs-find-entire-word-checkbox-label = Whole Words +pdfjs-find-reached-top = Reached top of document, continued from bottom +pdfjs-find-reached-bottom = Reached end of document, continued from top +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } of { $total } match + *[other] { $current } of { $total } matches + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] More than { $limit } match + *[other] More than { $limit } matches + } +pdfjs-find-not-found = Phrase not found + +## Predefined zoom values + +pdfjs-page-scale-width = Page Width +pdfjs-page-scale-fit = Page Fit +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Actual Size +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Page { $page } + +## Loading indicator messages + +pdfjs-loading-error = An error occurred while loading the PDF. +pdfjs-invalid-file-error = Invalid or corrupted PDF file. +pdfjs-missing-file-error = Missing PDF file. +pdfjs-unexpected-response-error = Unexpected server response. +pdfjs-rendering-error = An error occurred while rendering the page. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Enter the password to open this PDF file. +pdfjs-password-invalid = Invalid password. Please try again. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancel +pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Draw +pdfjs-editor-ink-button-label = Draw +pdfjs-editor-stamp-button = + .title = Add or edit images +pdfjs-editor-stamp-button-label = Add or edit images +pdfjs-editor-highlight-button = + .title = Highlight +pdfjs-editor-highlight-button-label = Highlight +pdfjs-highlight-floating-button1 = + .title = Highlight + .aria-label = Highlight +pdfjs-highlight-floating-button-label = Highlight + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Remove drawing +pdfjs-editor-remove-freetext-button = + .title = Remove text +pdfjs-editor-remove-stamp-button = + .title = Remove image +pdfjs-editor-remove-highlight-button = + .title = Remove highlight + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Colour +pdfjs-editor-free-text-size-input = Size +pdfjs-editor-ink-color-input = Colour +pdfjs-editor-ink-thickness-input = Thickness +pdfjs-editor-ink-opacity-input = Opacity +pdfjs-editor-stamp-add-image-button = + .title = Add image +pdfjs-editor-stamp-add-image-button-label = Add image +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Thickness +pdfjs-editor-free-highlight-thickness-title = + .title = Change thickness when highlighting items other than text +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Text Editor + .default-content = Start typing… +pdfjs-free-text = + .aria-label = Text Editor +pdfjs-free-text-default-content = Start typing… +pdfjs-ink = + .aria-label = Draw Editor +pdfjs-ink-canvas = + .aria-label = User-created image + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alt text +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text +pdfjs-editor-alt-text-edit-button-label = Edit alt text +pdfjs-editor-alt-text-dialog-label = Choose an option +pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. +pdfjs-editor-alt-text-add-description-label = Add a description +pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions. +pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative +pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks. +pdfjs-editor-alt-text-cancel-button = Cancel +pdfjs-editor-alt-text-save-button = Save +pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = For example, “A young man sits down at a table to eat a meal” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt text + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Top left corner — resize +pdfjs-editor-resizer-label-top-middle = Top middle — resize +pdfjs-editor-resizer-label-top-right = Top right corner — resize +pdfjs-editor-resizer-label-middle-right = Middle right — resize +pdfjs-editor-resizer-label-bottom-right = Bottom right corner — resize +pdfjs-editor-resizer-label-bottom-middle = Bottom middle — resize +pdfjs-editor-resizer-label-bottom-left = Bottom left corner — resize +pdfjs-editor-resizer-label-middle-left = Middle left — resize +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Highlight colour +pdfjs-editor-colorpicker-button = + .title = Change colour +pdfjs-editor-colorpicker-dropdown = + .aria-label = Colour choices +pdfjs-editor-colorpicker-yellow = + .title = Yellow +pdfjs-editor-colorpicker-green = + .title = Green +pdfjs-editor-colorpicker-blue = + .title = Blue +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Red + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Show all +pdfjs-editor-highlight-show-all-button = + .title = Show all + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text. +pdfjs-editor-alt-text-settings-delete-model-button = Delete +pdfjs-editor-alt-text-settings-download-model-button = Download +pdfjs-editor-alt-text-settings-downloading-model-button = Downloading… +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close diff --git a/public/pdfjs/web/locale/en-GB/viewer.ftl b/public/pdfjs/web/locale/en-GB/viewer.ftl new file mode 100644 index 0000000..4222f6f --- /dev/null +++ b/public/pdfjs/web/locale/en-GB/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Previous Page +pdfjs-previous-button-label = Previous +pdfjs-next-button = + .title = Next Page +pdfjs-next-button-label = Next +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Page +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = of { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom Out +pdfjs-zoom-out-button-label = Zoom Out +pdfjs-zoom-in-button = + .title = Zoom In +pdfjs-zoom-in-button-label = Zoom In +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Switch to Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Open File +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Print +pdfjs-print-button-label = Print +pdfjs-save-button = + .title = Save +pdfjs-save-button-label = Save +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Download +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Download +pdfjs-bookmark-button = + .title = Current Page (View URL from Current Page) +pdfjs-bookmark-button-label = Current Page + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tools +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Go to First Page +pdfjs-first-page-button-label = Go to First Page +pdfjs-last-page-button = + .title = Go to Last Page +pdfjs-last-page-button-label = Go to Last Page +pdfjs-page-rotate-cw-button = + .title = Rotate Clockwise +pdfjs-page-rotate-cw-button-label = Rotate Clockwise +pdfjs-page-rotate-ccw-button = + .title = Rotate Anti-Clockwise +pdfjs-page-rotate-ccw-button-label = Rotate Anti-Clockwise +pdfjs-cursor-text-select-tool-button = + .title = Enable Text Selection Tool +pdfjs-cursor-text-select-tool-button-label = Text Selection Tool +pdfjs-cursor-hand-tool-button = + .title = Enable Hand Tool +pdfjs-cursor-hand-tool-button-label = Hand Tool +pdfjs-scroll-page-button = + .title = Use Page Scrolling +pdfjs-scroll-page-button-label = Page Scrolling +pdfjs-scroll-vertical-button = + .title = Use Vertical Scrolling +pdfjs-scroll-vertical-button-label = Vertical Scrolling +pdfjs-scroll-horizontal-button = + .title = Use Horizontal Scrolling +pdfjs-scroll-horizontal-button-label = Horizontal Scrolling +pdfjs-scroll-wrapped-button = + .title = Use Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = Do not join page spreads +pdfjs-spread-none-button-label = No Spreads +pdfjs-spread-odd-button = + .title = Join page spreads starting with odd-numbered pages +pdfjs-spread-odd-button-label = Odd Spreads +pdfjs-spread-even-button = + .title = Join page spreads starting with even-numbered pages +pdfjs-spread-even-button-label = Even Spreads + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Document Properties… +pdfjs-document-properties-button-label = Document Properties… +pdfjs-document-properties-file-name = File name: +pdfjs-document-properties-file-size = File size: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Title: +pdfjs-document-properties-author = Author: +pdfjs-document-properties-subject = Subject: +pdfjs-document-properties-keywords = Keywords: +pdfjs-document-properties-creation-date = Creation Date: +pdfjs-document-properties-modification-date = Modification Date: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creator: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Page Count: +pdfjs-document-properties-page-size = Page Size: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = landscape +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Yes +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Close + +## Print + +pdfjs-print-progress-message = Preparing document for printing… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancel +pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser. +pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toggle Sidebar +pdfjs-toggle-sidebar-notification-button = + .title = Toggle Sidebar (document contains outline/attachments/layers) +pdfjs-toggle-sidebar-button-label = Toggle Sidebar +pdfjs-document-outline-button = + .title = Show Document Outline (double-click to expand/collapse all items) +pdfjs-document-outline-button-label = Document Outline +pdfjs-attachments-button = + .title = Show Attachments +pdfjs-attachments-button-label = Attachments +pdfjs-layers-button = + .title = Show Layers (double-click to reset all layers to the default state) +pdfjs-layers-button-label = Layers +pdfjs-thumbs-button = + .title = Show Thumbnails +pdfjs-thumbs-button-label = Thumbnails +pdfjs-current-outline-item-button = + .title = Find Current Outline Item +pdfjs-current-outline-item-button-label = Current Outline Item +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = Find +pdfjs-additional-layers = Additional Layers + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail of Page { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Find + .placeholder = Find in document… +pdfjs-find-previous-button = + .title = Find the previous occurrence of the phrase +pdfjs-find-previous-button-label = Previous +pdfjs-find-next-button = + .title = Find the next occurrence of the phrase +pdfjs-find-next-button-label = Next +pdfjs-find-highlight-checkbox = Highlight All +pdfjs-find-match-case-checkbox-label = Match Case +pdfjs-find-match-diacritics-checkbox-label = Match Diacritics +pdfjs-find-entire-word-checkbox-label = Whole Words +pdfjs-find-reached-top = Reached top of document, continued from bottom +pdfjs-find-reached-bottom = Reached end of document, continued from top +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } of { $total } match + *[other] { $current } of { $total } matches + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] More than { $limit } match + *[other] More than { $limit } matches + } +pdfjs-find-not-found = Phrase not found + +## Predefined zoom values + +pdfjs-page-scale-width = Page Width +pdfjs-page-scale-fit = Page Fit +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Actual Size +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Page { $page } + +## Loading indicator messages + +pdfjs-loading-error = An error occurred while loading the PDF. +pdfjs-invalid-file-error = Invalid or corrupted PDF file. +pdfjs-missing-file-error = Missing PDF file. +pdfjs-unexpected-response-error = Unexpected server response. +pdfjs-rendering-error = An error occurred while rendering the page. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Enter the password to open this PDF file. +pdfjs-password-invalid = Invalid password. Please try again. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancel +pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Draw +pdfjs-editor-ink-button-label = Draw +pdfjs-editor-stamp-button = + .title = Add or edit images +pdfjs-editor-stamp-button-label = Add or edit images +pdfjs-editor-highlight-button = + .title = Highlight +pdfjs-editor-highlight-button-label = Highlight +pdfjs-highlight-floating-button1 = + .title = Highlight + .aria-label = Highlight +pdfjs-highlight-floating-button-label = Highlight + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Remove drawing +pdfjs-editor-remove-freetext-button = + .title = Remove text +pdfjs-editor-remove-stamp-button = + .title = Remove image +pdfjs-editor-remove-highlight-button = + .title = Remove highlight + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Colour +pdfjs-editor-free-text-size-input = Size +pdfjs-editor-ink-color-input = Colour +pdfjs-editor-ink-thickness-input = Thickness +pdfjs-editor-ink-opacity-input = Opacity +pdfjs-editor-stamp-add-image-button = + .title = Add image +pdfjs-editor-stamp-add-image-button-label = Add image +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Thickness +pdfjs-editor-free-highlight-thickness-title = + .title = Change thickness when highlighting items other than text +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Text Editor + .default-content = Start typing… +pdfjs-free-text = + .aria-label = Text Editor +pdfjs-free-text-default-content = Start typing… +pdfjs-ink = + .aria-label = Draw Editor +pdfjs-ink-canvas = + .aria-label = User-created image + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alt text +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text +pdfjs-editor-alt-text-edit-button-label = Edit alt text +pdfjs-editor-alt-text-dialog-label = Choose an option +pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. +pdfjs-editor-alt-text-add-description-label = Add a description +pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions. +pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative +pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks. +pdfjs-editor-alt-text-cancel-button = Cancel +pdfjs-editor-alt-text-save-button = Save +pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = For example, “A young man sits down at a table to eat a meal” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt text + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Top left corner — resize +pdfjs-editor-resizer-label-top-middle = Top middle — resize +pdfjs-editor-resizer-label-top-right = Top right corner — resize +pdfjs-editor-resizer-label-middle-right = Middle right — resize +pdfjs-editor-resizer-label-bottom-right = Bottom right corner — resize +pdfjs-editor-resizer-label-bottom-middle = Bottom middle — resize +pdfjs-editor-resizer-label-bottom-left = Bottom left corner — resize +pdfjs-editor-resizer-label-middle-left = Middle left — resize +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Highlight colour +pdfjs-editor-colorpicker-button = + .title = Change colour +pdfjs-editor-colorpicker-dropdown = + .aria-label = Colour choices +pdfjs-editor-colorpicker-yellow = + .title = Yellow +pdfjs-editor-colorpicker-green = + .title = Green +pdfjs-editor-colorpicker-blue = + .title = Blue +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Red + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Show all +pdfjs-editor-highlight-show-all-button = + .title = Show all + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text. +pdfjs-editor-alt-text-settings-delete-model-button = Delete +pdfjs-editor-alt-text-settings-download-model-button = Download +pdfjs-editor-alt-text-settings-downloading-model-button = Downloading… +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close diff --git a/public/pdfjs/web/locale/en-US/viewer.ftl b/public/pdfjs/web/locale/en-US/viewer.ftl new file mode 100644 index 0000000..3e4a351 --- /dev/null +++ b/public/pdfjs/web/locale/en-US/viewer.ftl @@ -0,0 +1,526 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Previous Page +pdfjs-previous-button-label = Previous +pdfjs-next-button = + .title = Next Page +pdfjs-next-button-label = Next + +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Page + +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = of { $pagesCount } + +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) + +pdfjs-zoom-out-button = + .title = Zoom Out +pdfjs-zoom-out-button-label = Zoom Out +pdfjs-zoom-in-button = + .title = Zoom In +pdfjs-zoom-in-button-label = Zoom In +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Switch to Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Open File +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Print +pdfjs-print-button-label = Print +pdfjs-save-button = + .title = Save +pdfjs-save-button-label = Save + +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Download + +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Download + +pdfjs-bookmark-button = + .title = Current Page (View URL from Current Page) +pdfjs-bookmark-button-label = Current Page + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tools + +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Go to First Page +pdfjs-first-page-button-label = Go to First Page +pdfjs-last-page-button = + .title = Go to Last Page +pdfjs-last-page-button-label = Go to Last Page +pdfjs-page-rotate-cw-button = + .title = Rotate Clockwise +pdfjs-page-rotate-cw-button-label = Rotate Clockwise +pdfjs-page-rotate-ccw-button = + .title = Rotate Counterclockwise +pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise +pdfjs-cursor-text-select-tool-button = + .title = Enable Text Selection Tool +pdfjs-cursor-text-select-tool-button-label = Text Selection Tool +pdfjs-cursor-hand-tool-button = + .title = Enable Hand Tool +pdfjs-cursor-hand-tool-button-label = Hand Tool +pdfjs-scroll-page-button = + .title = Use Page Scrolling +pdfjs-scroll-page-button-label = Page Scrolling +pdfjs-scroll-vertical-button = + .title = Use Vertical Scrolling +pdfjs-scroll-vertical-button-label = Vertical Scrolling +pdfjs-scroll-horizontal-button = + .title = Use Horizontal Scrolling +pdfjs-scroll-horizontal-button-label = Horizontal Scrolling +pdfjs-scroll-wrapped-button = + .title = Use Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = Do not join page spreads +pdfjs-spread-none-button-label = No Spreads +pdfjs-spread-odd-button = + .title = Join page spreads starting with odd-numbered pages +pdfjs-spread-odd-button-label = Odd Spreads +pdfjs-spread-even-button = + .title = Join page spreads starting with even-numbered pages +pdfjs-spread-even-button-label = Even Spreads + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Document Properties… +pdfjs-document-properties-button-label = Document Properties… +pdfjs-document-properties-file-name = File name: +pdfjs-document-properties-file-size = File size: + +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) + +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) + +pdfjs-document-properties-title = Title: +pdfjs-document-properties-author = Author: +pdfjs-document-properties-subject = Subject: +pdfjs-document-properties-keywords = Keywords: +pdfjs-document-properties-creation-date = Creation Date: +pdfjs-document-properties-modification-date = Modification Date: + +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +pdfjs-document-properties-creator = Creator: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Page Count: +pdfjs-document-properties-page-size = Page Size: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = landscape +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Yes +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Close + +## Print + +pdfjs-print-progress-message = Preparing document for printing… + +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% + +pdfjs-print-progress-close-button = Cancel +pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser. +pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toggle Sidebar +pdfjs-toggle-sidebar-notification-button = + .title = Toggle Sidebar (document contains outline/attachments/layers) +pdfjs-toggle-sidebar-button-label = Toggle Sidebar +pdfjs-document-outline-button = + .title = Show Document Outline (double-click to expand/collapse all items) +pdfjs-document-outline-button-label = Document Outline +pdfjs-attachments-button = + .title = Show Attachments +pdfjs-attachments-button-label = Attachments +pdfjs-layers-button = + .title = Show Layers (double-click to reset all layers to the default state) +pdfjs-layers-button-label = Layers +pdfjs-thumbs-button = + .title = Show Thumbnails +pdfjs-thumbs-button-label = Thumbnails +pdfjs-current-outline-item-button = + .title = Find Current Outline Item +pdfjs-current-outline-item-button-label = Current Outline Item +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = Find +pdfjs-additional-layers = Additional Layers + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Page { $page } + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail of Page { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Find + .placeholder = Find in document… +pdfjs-find-previous-button = + .title = Find the previous occurrence of the phrase +pdfjs-find-previous-button-label = Previous +pdfjs-find-next-button = + .title = Find the next occurrence of the phrase +pdfjs-find-next-button-label = Next +pdfjs-find-highlight-checkbox = Highlight All +pdfjs-find-match-case-checkbox-label = Match Case +pdfjs-find-match-diacritics-checkbox-label = Match Diacritics +pdfjs-find-entire-word-checkbox-label = Whole Words +pdfjs-find-reached-top = Reached top of document, continued from bottom +pdfjs-find-reached-bottom = Reached end of document, continued from top + +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } of { $total } match + *[other] { $current } of { $total } matches + } + +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] More than { $limit } match + *[other] More than { $limit } matches + } + +pdfjs-find-not-found = Phrase not found + +## Predefined zoom values + +pdfjs-page-scale-width = Page Width +pdfjs-page-scale-fit = Page Fit +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Actual Size + +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Page { $page } + +## Loading indicator messages + +pdfjs-loading-error = An error occurred while loading the PDF. +pdfjs-invalid-file-error = Invalid or corrupted PDF file. +pdfjs-missing-file-error = Missing PDF file. +pdfjs-unexpected-response-error = Unexpected server response. +pdfjs-rendering-error = An error occurred while rendering the page. + +## Annotations + +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = Enter the password to open this PDF file. +pdfjs-password-invalid = Invalid password. Please try again. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancel +pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Draw +pdfjs-editor-ink-button-label = Draw +pdfjs-editor-stamp-button = + .title = Add or edit images +pdfjs-editor-stamp-button-label = Add or edit images +pdfjs-editor-highlight-button = + .title = Highlight +pdfjs-editor-highlight-button-label = Highlight +pdfjs-highlight-floating-button1 = + .title = Highlight + .aria-label = Highlight +pdfjs-highlight-floating-button-label = Highlight + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Remove drawing +pdfjs-editor-remove-freetext-button = + .title = Remove text +pdfjs-editor-remove-stamp-button = + .title = Remove image +pdfjs-editor-remove-highlight-button = + .title = Remove highlight + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Size +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Thickness +pdfjs-editor-ink-opacity-input = Opacity +pdfjs-editor-stamp-add-image-button = + .title = Add image +pdfjs-editor-stamp-add-image-button-label = Add image +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Thickness +pdfjs-editor-free-highlight-thickness-title = + .title = Change thickness when highlighting items other than text + +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Text Editor + .default-content = Start typing… +pdfjs-ink = + .aria-label = Draw Editor +pdfjs-ink-canvas = + .aria-label = User-created image + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt text +pdfjs-editor-alt-text-button-label = Alt text + +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text +pdfjs-editor-alt-text-dialog-label = Choose an option +pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. +pdfjs-editor-alt-text-add-description-label = Add a description +pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions. +pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative +pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks. +pdfjs-editor-alt-text-cancel-button = Cancel +pdfjs-editor-alt-text-save-button = Save +pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative + +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = For example, “A young man sits down at a table to eat a meal” + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Highlight color + +pdfjs-editor-colorpicker-button = + .title = Change color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Color choices +pdfjs-editor-colorpicker-yellow = + .title = Yellow +pdfjs-editor-colorpicker-green = + .title = Green +pdfjs-editor-colorpicker-blue = + .title = Blue +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Red + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Show all +pdfjs-editor-highlight-show-all-button = + .title = Show all + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) + +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) + +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… + +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. + +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more + +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close + +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added + +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text + +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text + +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings + +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. + +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB) + +pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text. +pdfjs-editor-alt-text-settings-delete-model-button = Delete +pdfjs-editor-alt-text-settings-download-model-button = Download +pdfjs-editor-alt-text-settings-downloading-model-button = Downloading… + +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } + +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close diff --git a/public/pdfjs/web/locale/eo/viewer.ftl b/public/pdfjs/web/locale/eo/viewer.ftl new file mode 100644 index 0000000..ce45ebf --- /dev/null +++ b/public/pdfjs/web/locale/eo/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Antaŭa paĝo +pdfjs-previous-button-label = Malantaŭen +pdfjs-next-button = + .title = Venonta paĝo +pdfjs-next-button-label = Antaŭen +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Paĝo +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = el { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } el { $pagesCount }) +pdfjs-zoom-out-button = + .title = Malpligrandigi +pdfjs-zoom-out-button-label = Malpligrandigi +pdfjs-zoom-in-button = + .title = Pligrandigi +pdfjs-zoom-in-button-label = Pligrandigi +pdfjs-zoom-select = + .title = Pligrandigilo +pdfjs-presentation-mode-button = + .title = Iri al prezenta reĝimo +pdfjs-presentation-mode-button-label = Prezenta reĝimo +pdfjs-open-file-button = + .title = Malfermi dosieron +pdfjs-open-file-button-label = Malfermi +pdfjs-print-button = + .title = Presi +pdfjs-print-button-label = Presi +pdfjs-save-button = + .title = Konservi +pdfjs-save-button-label = Konservi +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Elŝuti +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Elŝuti +pdfjs-bookmark-button = + .title = Nuna paĝo (Montri adreson de la nuna paĝo) +pdfjs-bookmark-button-label = Nuna paĝo + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Iloj +pdfjs-tools-button-label = Iloj +pdfjs-first-page-button = + .title = Iri al la unua paĝo +pdfjs-first-page-button-label = Iri al la unua paĝo +pdfjs-last-page-button = + .title = Iri al la lasta paĝo +pdfjs-last-page-button-label = Iri al la lasta paĝo +pdfjs-page-rotate-cw-button = + .title = Rotaciigi dekstrume +pdfjs-page-rotate-cw-button-label = Rotaciigi dekstrume +pdfjs-page-rotate-ccw-button = + .title = Rotaciigi maldekstrume +pdfjs-page-rotate-ccw-button-label = Rotaciigi maldekstrume +pdfjs-cursor-text-select-tool-button = + .title = Aktivigi tekstan elektilon +pdfjs-cursor-text-select-tool-button-label = Teksta elektilo +pdfjs-cursor-hand-tool-button = + .title = Aktivigi ilon de mano +pdfjs-cursor-hand-tool-button-label = Ilo de mano +pdfjs-scroll-page-button = + .title = Uzi rulumon de paĝo +pdfjs-scroll-page-button-label = Rulumo de paĝo +pdfjs-scroll-vertical-button = + .title = Uzi vertikalan rulumon +pdfjs-scroll-vertical-button-label = Vertikala rulumo +pdfjs-scroll-horizontal-button = + .title = Uzi horizontalan rulumon +pdfjs-scroll-horizontal-button-label = Horizontala rulumo +pdfjs-scroll-wrapped-button = + .title = Uzi ambaŭdirektan rulumon +pdfjs-scroll-wrapped-button-label = Ambaŭdirekta rulumo +pdfjs-spread-none-button = + .title = Ne montri paĝojn po du +pdfjs-spread-none-button-label = Unupaĝa vido +pdfjs-spread-odd-button = + .title = Kunigi paĝojn komencante per nepara paĝo +pdfjs-spread-odd-button-label = Po du paĝoj, neparaj maldekstre +pdfjs-spread-even-button = + .title = Kunigi paĝojn komencante per para paĝo +pdfjs-spread-even-button-label = Po du paĝoj, paraj maldekstre + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Atributoj de dokumento… +pdfjs-document-properties-button-label = Atributoj de dokumento… +pdfjs-document-properties-file-name = Nomo de dosiero: +pdfjs-document-properties-file-size = Grando de dosiero: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KO ({ $b } oktetoj) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } oktetoj) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KO ({ $size_b } oktetoj) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MO ({ $size_b } oktetoj) +pdfjs-document-properties-title = Titolo: +pdfjs-document-properties-author = Aŭtoro: +pdfjs-document-properties-subject = Temo: +pdfjs-document-properties-keywords = Ŝlosilvorto: +pdfjs-document-properties-creation-date = Dato de kreado: +pdfjs-document-properties-modification-date = Dato de modifo: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Kreinto: +pdfjs-document-properties-producer = Produktinto de PDF: +pdfjs-document-properties-version = Versio de PDF: +pdfjs-document-properties-page-count = Nombro de paĝoj: +pdfjs-document-properties-page-size = Grando de paĝo: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertikala +pdfjs-document-properties-page-size-orientation-landscape = horizontala +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letera +pdfjs-document-properties-page-size-name-legal = Jura + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Rapida tekstaĵa vido: +pdfjs-document-properties-linearized-yes = Jes +pdfjs-document-properties-linearized-no = Ne +pdfjs-document-properties-close-button = Fermi + +## Print + +pdfjs-print-progress-message = Preparo de dokumento por presi ĝin … +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Nuligi +pdfjs-printing-not-supported = Averto: tiu ĉi retumilo ne plene subtenas presadon. +pdfjs-printing-not-ready = Averto: la PDF dosiero ne estas plene ŝargita por presado. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Montri/kaŝi flankan strion +pdfjs-toggle-sidebar-notification-button = + .title = Montri/kaŝi flankan strion (la dokumento enhavas konturon/kunsendaĵojn/tavolojn) +pdfjs-toggle-sidebar-button-label = Montri/kaŝi flankan strion +pdfjs-document-outline-button = + .title = Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn) +pdfjs-document-outline-button-label = Konturo de dokumento +pdfjs-attachments-button = + .title = Montri kunsendaĵojn +pdfjs-attachments-button-label = Kunsendaĵojn +pdfjs-layers-button = + .title = Montri tavolojn (duoble alklaku por remeti ĉiujn tavolojn en la norman staton) +pdfjs-layers-button-label = Tavoloj +pdfjs-thumbs-button = + .title = Montri miniaturojn +pdfjs-thumbs-button-label = Miniaturoj +pdfjs-current-outline-item-button = + .title = Trovi nunan konturan elementon +pdfjs-current-outline-item-button-label = Nuna kontura elemento +pdfjs-findbar-button = + .title = Serĉi en dokumento +pdfjs-findbar-button-label = Serĉi +pdfjs-additional-layers = Aldonaj tavoloj + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Paĝo { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniaturo de paĝo { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Serĉi + .placeholder = Serĉi en dokumento… +pdfjs-find-previous-button = + .title = Serĉi la antaŭan aperon de la frazo +pdfjs-find-previous-button-label = Malantaŭen +pdfjs-find-next-button = + .title = Serĉi la venontan aperon de la frazo +pdfjs-find-next-button-label = Antaŭen +pdfjs-find-highlight-checkbox = Elstarigi ĉiujn +pdfjs-find-match-case-checkbox-label = Distingi inter majuskloj kaj minuskloj +pdfjs-find-match-diacritics-checkbox-label = Respekti supersignojn +pdfjs-find-entire-word-checkbox-label = Tutaj vortoj +pdfjs-find-reached-top = Komenco de la dokumento atingita, daŭrigado ekde la fino +pdfjs-find-reached-bottom = Fino de la dokumento atingita, daŭrigado ekde la komenco +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } el { $total } kongruo + *[other] { $current } el { $total } kongruoj + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Pli ol { $limit } kongruo + *[other] Pli ol { $limit } kongruoj + } +pdfjs-find-not-found = Frazo ne trovita + +## Predefined zoom values + +pdfjs-page-scale-width = Larĝo de paĝo +pdfjs-page-scale-fit = Adapti paĝon +pdfjs-page-scale-auto = Aŭtomata skalo +pdfjs-page-scale-actual = Reala grando +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Paĝo { $page } + +## Loading indicator messages + +pdfjs-loading-error = Okazis eraro dum la ŝargado de la PDF dosiero. +pdfjs-invalid-file-error = Nevalida aŭ difektita PDF dosiero. +pdfjs-missing-file-error = Mankas dosiero PDF. +pdfjs-unexpected-response-error = Neatendita respondo de servilo. +pdfjs-rendering-error = Okazis eraro dum la montro de la paĝo. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Prinoto: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Tajpu pasvorton por malfermi tiun ĉi dosieron PDF. +pdfjs-password-invalid = Nevalida pasvorto. Bonvolu provi denove. +pdfjs-password-ok-button = Akcepti +pdfjs-password-cancel-button = Nuligi +pdfjs-web-fonts-disabled = Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Teksto +pdfjs-editor-free-text-button-label = Teksto +pdfjs-editor-ink-button = + .title = Desegni +pdfjs-editor-ink-button-label = Desegni +pdfjs-editor-stamp-button = + .title = Aldoni aŭ modifi bildojn +pdfjs-editor-stamp-button-label = Aldoni aŭ modifi bildojn +pdfjs-editor-highlight-button = + .title = Elstarigi +pdfjs-editor-highlight-button-label = Elstarigi +pdfjs-highlight-floating-button1 = + .title = Elstarigi + .aria-label = Elstarigi +pdfjs-highlight-floating-button-label = Elstarigi + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Forigi desegnon +pdfjs-editor-remove-freetext-button = + .title = Forigi tekston +pdfjs-editor-remove-stamp-button = + .title = Forigi bildon +pdfjs-editor-remove-highlight-button = + .title = Forigi elstaraĵon + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Koloro +pdfjs-editor-free-text-size-input = Grando +pdfjs-editor-ink-color-input = Koloro +pdfjs-editor-ink-thickness-input = Dikeco +pdfjs-editor-ink-opacity-input = Maldiafaneco +pdfjs-editor-stamp-add-image-button = + .title = Aldoni bildon +pdfjs-editor-stamp-add-image-button-label = Aldoni bildon +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Dikeco +pdfjs-editor-free-highlight-thickness-title = + .title = Ŝanĝi dikecon dum elstarigo de netekstaj elementoj +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Teksta redaktilo + .default-content = Komencu tajpi… +pdfjs-free-text = + .aria-label = Teksta redaktilo +pdfjs-free-text-default-content = Ektajpi… +pdfjs-ink = + .aria-label = Desegnan redaktilon +pdfjs-ink-canvas = + .aria-label = Bildo kreita de uzanto + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternativa teksto +pdfjs-editor-alt-text-edit-button = + .aria-label = Redakti alternativan tekston +pdfjs-editor-alt-text-edit-button-label = Redakti alternativan tekston +pdfjs-editor-alt-text-dialog-label = Elektu eblon +pdfjs-editor-alt-text-dialog-description = Alternativa teksto helpas personojn, en la okazoj kiam ili ne povas vidi aŭ ŝargi la bildon. +pdfjs-editor-alt-text-add-description-label = Aldoni priskribon +pdfjs-editor-alt-text-add-description-description = La celo estas unu aŭ du frazoj, kiuj priskribas la temon, etoson aŭ agojn. +pdfjs-editor-alt-text-mark-decorative-label = Marki kiel ornaman +pdfjs-editor-alt-text-mark-decorative-description = Tio ĉi estas uzita por ornamaj bildoj, kiel randoj aŭ fonaj bildoj. +pdfjs-editor-alt-text-cancel-button = Nuligi +pdfjs-editor-alt-text-save-button = Konservi +pdfjs-editor-alt-text-decorative-tooltip = Markita kiel ornama +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Ekzemple: “Juna persono sidiĝas ĉetable por ekmanĝi” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativa teksto + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Supra maldekstra angulo — ŝangi grandon +pdfjs-editor-resizer-label-top-middle = Supra mezo — ŝanĝi grandon +pdfjs-editor-resizer-label-top-right = Supran dekstran angulon — ŝanĝi grandon +pdfjs-editor-resizer-label-middle-right = Dekstra mezo — ŝanĝi grandon +pdfjs-editor-resizer-label-bottom-right = Malsupra deksta angulo — ŝanĝi grandon +pdfjs-editor-resizer-label-bottom-middle = Malsupra mezo — ŝanĝi grandon +pdfjs-editor-resizer-label-bottom-left = Malsupra maldekstra angulo — ŝanĝi grandon +pdfjs-editor-resizer-label-middle-left = Maldekstra mezo — ŝanĝi grandon +pdfjs-editor-resizer-top-left = + .aria-label = Supra maldekstra angulo — ŝangi grandon +pdfjs-editor-resizer-top-middle = + .aria-label = Supra mezo — ŝanĝi grandon +pdfjs-editor-resizer-top-right = + .aria-label = Supran dekstran angulon — ŝanĝi grandon +pdfjs-editor-resizer-middle-right = + .aria-label = Dekstra mezo — ŝanĝi grandon +pdfjs-editor-resizer-bottom-right = + .aria-label = Malsupra deksta angulo — ŝanĝi grandon +pdfjs-editor-resizer-bottom-middle = + .aria-label = Malsupra mezo — ŝanĝi grandon +pdfjs-editor-resizer-bottom-left = + .aria-label = Malsupra maldekstra angulo — ŝanĝi grandon +pdfjs-editor-resizer-middle-left = + .aria-label = Maldekstra mezo — ŝanĝi grandon + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Elstarigi koloron +pdfjs-editor-colorpicker-button = + .title = Ŝanĝi koloron +pdfjs-editor-colorpicker-dropdown = + .aria-label = Elekto de koloroj +pdfjs-editor-colorpicker-yellow = + .title = Flava +pdfjs-editor-colorpicker-green = + .title = Verda +pdfjs-editor-colorpicker-blue = + .title = Blua +pdfjs-editor-colorpicker-pink = + .title = Roza +pdfjs-editor-colorpicker-red = + .title = Ruĝa + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Montri ĉiujn +pdfjs-editor-highlight-show-all-button = + .title = Montri ĉiujn + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifi alternativan tekston (priskribo de bildo) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Aldoni alternativan tekston (priskribo de bildo) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skribu vian priskribon ĉi tie… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Mallonga priskribo por personoj kiuj ne povas vidi la bildon kaj por montri kiam la bildo ne ŝargeblas. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tiu ĉi alternativa teksto estis aŭtomate kreita kaj povus esti malĝusta. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pli da informo +pdfjs-editor-new-alt-text-create-automatically-button-label = Aŭtomate krei alternativan tekston +pdfjs-editor-new-alt-text-not-now-button = Ne nun +pdfjs-editor-new-alt-text-error-title = Ne eblis aŭtomate krei alternativan tekston +pdfjs-editor-new-alt-text-error-description = Bonvolu skribi vian propran alternativan tekston aŭ provi denove poste. +pdfjs-editor-new-alt-text-error-close-button = Fermi +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Elŝuto de modelo de artefarita intelekto por alternativa teksto ({ $downloadedSize } el { $totalSize } MO) + .aria-valuetext = Elŝuto de modelo de artefarita intelekto por alternativa teksto ({ $downloadedSize } el { $totalSize } MO) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativa teksto aldonita +pdfjs-editor-new-alt-text-added-button-label = Alternativa teksto aldonita +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mankas alternativa teksto +pdfjs-editor-new-alt-text-missing-button-label = Mankas alternativa teksto +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Kontroli alternativan tekston +pdfjs-editor-new-alt-text-to-review-button-label = Kontroli alternativan tekston +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Aŭtomate kreita: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Agordoj por alternativa teksto de bildoj +pdfjs-image-alt-text-settings-button-label = Agordoj por alternativa teksto de bildoj +pdfjs-editor-alt-text-settings-dialog-label = Agordoj por alternativa teksto de bildoj +pdfjs-editor-alt-text-settings-automatic-title = Aŭtomata alternativa teksto +pdfjs-editor-alt-text-settings-create-model-button-label = Aŭtomate krei alternativan tekston +pdfjs-editor-alt-text-settings-create-model-description = Tio ĉi sugestas priskribojn por helpi personojn kiuj ne povas vidi aŭ ŝargi la bildon. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de artefarita intelekto por alternativa teksto ({ $totalSize } MO) +pdfjs-editor-alt-text-settings-ai-model-description = Ĝi funkcias en via aparato, do viaj datumoj restas privataj. Ĝi estas postulata por aŭtomata kreado de alternativa teksto. +pdfjs-editor-alt-text-settings-delete-model-button = Forigi +pdfjs-editor-alt-text-settings-download-model-button = Elŝuti +pdfjs-editor-alt-text-settings-downloading-model-button = Elŝuto… +pdfjs-editor-alt-text-settings-editor-title = Redaktilo de alternativa teksto +pdfjs-editor-alt-text-settings-show-dialog-button-label = Montri redaktilon de alternativa teksto tuj post aldono de bildo +pdfjs-editor-alt-text-settings-show-dialog-description = Tio ĉi helpas vin kontroli ĉu ĉiuj bildoj havas alternativan tekston. +pdfjs-editor-alt-text-settings-close-button = Fermi + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Elstaraĵo forigita +pdfjs-editor-undo-bar-message-freetext = Teksto forigita +pdfjs-editor-undo-bar-message-ink = Desegno forigita +pdfjs-editor-undo-bar-message-stamp = Bildo forigita +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] unu prinoto forigita + *[other] { $count } prinotoj forigitaj + } +pdfjs-editor-undo-bar-undo-button = + .title = Malfari +pdfjs-editor-undo-bar-undo-button-label = Malfari +pdfjs-editor-undo-bar-close-button = + .title = Fermi +pdfjs-editor-undo-bar-close-button-label = Fermi diff --git a/public/pdfjs/web/locale/es-AR/viewer.ftl b/public/pdfjs/web/locale/es-AR/viewer.ftl new file mode 100644 index 0000000..ca73dc7 --- /dev/null +++ b/public/pdfjs/web/locale/es-AR/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Página siguiente +pdfjs-next-button-label = Siguiente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Página +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ( { $pageNumber } de { $pagesCount } ) +pdfjs-zoom-out-button = + .title = Alejar +pdfjs-zoom-out-button-label = Alejar +pdfjs-zoom-in-button = + .title = Acercar +pdfjs-zoom-in-button-label = Acercar +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Cambiar a modo presentación +pdfjs-presentation-mode-button-label = Modo presentación +pdfjs-open-file-button = + .title = Abrir archivo +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Guardar +pdfjs-save-button-label = Guardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descargar +pdfjs-bookmark-button = + .title = Página actual (Ver URL de la página actual) +pdfjs-bookmark-button-label = Página actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Herramientas +pdfjs-tools-button-label = Herramientas +pdfjs-first-page-button = + .title = Ir a primera página +pdfjs-first-page-button-label = Ir a primera página +pdfjs-last-page-button = + .title = Ir a última página +pdfjs-last-page-button-label = Ir a última página +pdfjs-page-rotate-cw-button = + .title = Rotar horario +pdfjs-page-rotate-cw-button-label = Rotar horario +pdfjs-page-rotate-ccw-button = + .title = Rotar antihorario +pdfjs-page-rotate-ccw-button-label = Rotar antihorario +pdfjs-cursor-text-select-tool-button = + .title = Habilitar herramienta de selección de texto +pdfjs-cursor-text-select-tool-button-label = Herramienta de selección de texto +pdfjs-cursor-hand-tool-button = + .title = Habilitar herramienta mano +pdfjs-cursor-hand-tool-button-label = Herramienta mano +pdfjs-scroll-page-button = + .title = Usar desplazamiento de página +pdfjs-scroll-page-button-label = Desplazamiento de página +pdfjs-scroll-vertical-button = + .title = Usar desplazamiento vertical +pdfjs-scroll-vertical-button-label = Desplazamiento vertical +pdfjs-scroll-horizontal-button = + .title = Usar desplazamiento vertical +pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar desplazamiento encapsulado +pdfjs-scroll-wrapped-button-label = Desplazamiento encapsulado +pdfjs-spread-none-button = + .title = No unir páginas dobles +pdfjs-spread-none-button-label = Sin dobles +pdfjs-spread-odd-button = + .title = Unir páginas dobles comenzando con las impares +pdfjs-spread-odd-button-label = Dobles impares +pdfjs-spread-even-button = + .title = Unir páginas dobles comenzando con las pares +pdfjs-spread-even-button-label = Dobles pares + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedades del documento… +pdfjs-document-properties-button-label = Propiedades del documento… +pdfjs-document-properties-file-name = Nombre de archivo: +pdfjs-document-properties-file-size = Tamaño de archovo: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Asunto: +pdfjs-document-properties-keywords = Palabras clave: +pdfjs-document-properties-creation-date = Fecha de creación: +pdfjs-document-properties-modification-date = Fecha de modificación: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creador: +pdfjs-document-properties-producer = PDF Productor: +pdfjs-document-properties-version = Versión de PDF: +pdfjs-document-properties-page-count = Cantidad de páginas: +pdfjs-document-properties-page-size = Tamaño de página: +pdfjs-document-properties-page-size-unit-inches = en +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = normal +pdfjs-document-properties-page-size-orientation-landscape = apaisado +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista rápida de la Web: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Cerrar + +## Print + +pdfjs-print-progress-message = Preparando documento para imprimir… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Advertencia: La impresión no está totalmente soportada por este navegador. +pdfjs-printing-not-ready = Advertencia: El PDF no está completamente cargado para impresión. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Alternar barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Alternar barra lateral (el documento contiene esquemas/adjuntos/capas) +pdfjs-toggle-sidebar-button-label = Alternar barra lateral +pdfjs-document-outline-button = + .title = Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems) +pdfjs-document-outline-button-label = Esquema del documento +pdfjs-attachments-button = + .title = Mostrar adjuntos +pdfjs-attachments-button-label = Adjuntos +pdfjs-layers-button = + .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +pdfjs-layers-button-label = Capas +pdfjs-thumbs-button = + .title = Mostrar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Buscar elemento de esquema actual +pdfjs-current-outline-item-button-label = Elemento de esquema actual +pdfjs-findbar-button = + .title = Buscar en documento +pdfjs-findbar-button-label = Buscar +pdfjs-additional-layers = Capas adicionales + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura de página { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Buscar + .placeholder = Buscar en documento… +pdfjs-find-previous-button = + .title = Buscar la aparición anterior de la frase +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Buscar la siguiente aparición de la frase +pdfjs-find-next-button-label = Siguiente +pdfjs-find-highlight-checkbox = Resaltar todo +pdfjs-find-match-case-checkbox-label = Coincidir mayúsculas +pdfjs-find-match-diacritics-checkbox-label = Coincidir diacríticos +pdfjs-find-entire-word-checkbox-label = Palabras completas +pdfjs-find-reached-top = Inicio de documento alcanzado, continuando desde abajo +pdfjs-find-reached-bottom = Fin de documento alcanzando, continuando desde arriba +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } coincidencia + *[other] { $current } de { $total } coincidencias + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Más de { $limit } coincidencia + *[other] Más de { $limit } coincidencias + } +pdfjs-find-not-found = Frase no encontrada + +## Predefined zoom values + +pdfjs-page-scale-width = Ancho de página +pdfjs-page-scale-fit = Ajustar página +pdfjs-page-scale-auto = Zoom automático +pdfjs-page-scale-actual = Tamaño real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Página { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ocurrió un error al cargar el PDF. +pdfjs-invalid-file-error = Archivo PDF no válido o cocrrupto. +pdfjs-missing-file-error = Archivo PDF faltante. +pdfjs-unexpected-response-error = Respuesta del servidor inesperada. +pdfjs-rendering-error = Ocurrió un error al dibujar la página. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Anotación] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Ingrese la contraseña para abrir este archivo PDF +pdfjs-password-invalid = Contraseña inválida. Intente nuevamente. +pdfjs-password-ok-button = Aceptar +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Dibujar +pdfjs-editor-ink-button-label = Dibujar +pdfjs-editor-stamp-button = + .title = Agregar o editar imágenes +pdfjs-editor-stamp-button-label = Agregar o editar imágenes +pdfjs-editor-highlight-button = + .title = Resaltar +pdfjs-editor-highlight-button-label = Resaltar +pdfjs-highlight-floating-button1 = + .title = Resaltar + .aria-label = Resaltar +pdfjs-highlight-floating-button-label = Resaltar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Eliminar dibujo +pdfjs-editor-remove-freetext-button = + .title = Eliminar texto +pdfjs-editor-remove-stamp-button = + .title = Eliminar imagen +pdfjs-editor-remove-highlight-button = + .title = Eliminar resaltado + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Tamaño +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Espesor +pdfjs-editor-ink-opacity-input = Opacidad +pdfjs-editor-stamp-add-image-button = + .title = Agregar una imagen +pdfjs-editor-stamp-add-image-button-label = Agregar una imagen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grosor +pdfjs-editor-free-highlight-thickness-title = + .title = Cambiar el grosor al resaltar elementos que no sean texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Comenzar a tipear… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Empezar a tipear… +pdfjs-ink = + .aria-label = Editor de dibujos +pdfjs-ink-canvas = + .aria-label = Imagen creada por el usuario + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar el texto alternativo +pdfjs-editor-alt-text-dialog-label = Eligir una opción +pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. +pdfjs-editor-alt-text-add-description-label = Agregar una descripción +pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 oraciones que describan el tema, el entorno o las acciones. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo +pdfjs-editor-alt-text-mark-decorative-description = Esto se usa para imágenes ornamentales, como bordes o marcas de agua. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Guardar +pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — cambiar el tamaño +pdfjs-editor-resizer-label-top-middle = Arriba en el medio — cambiar el tamaño +pdfjs-editor-resizer-label-top-right = Esquina superior derecha — cambiar el tamaño +pdfjs-editor-resizer-label-middle-right = Al centro a la derecha — cambiar el tamaño +pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — cambiar el tamaño +pdfjs-editor-resizer-label-bottom-middle = Abajo en el medio — cambiar el tamaño +pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — cambiar el tamaño +pdfjs-editor-resizer-label-middle-left = Al centro a la izquierda — cambiar el tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — cambiar el tamaño +pdfjs-editor-resizer-top-middle = + .aria-label = Arriba en el medio — cambiar el tamaño +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — cambiar el tamaño +pdfjs-editor-resizer-middle-right = + .aria-label = Al centro a la derecha — cambiar el tamaño +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — cambiar el tamaño +pdfjs-editor-resizer-bottom-middle = + .aria-label = Abajo en el medio — cambiar el tamaño +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — cambiar el tamaño +pdfjs-editor-resizer-middle-left = + .aria-label = Al centro a la izquierda — cambiar el tamaño + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color de resaltado +pdfjs-editor-colorpicker-button = + .title = Cambiar el color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opciones de color +pdfjs-editor-colorpicker-yellow = + .title = Amarillo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosado +pdfjs-editor-colorpicker-red = + .title = Rojo + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar todo +pdfjs-editor-highlight-show-all-button = + .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Agregar texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribir la descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Descripción corta para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser incorrecto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Conocer más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = No ahora +pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escriba su propio texto alternativo o pruebe nuevamente más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo agregado +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo agregado +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Calificar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Configuración de texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Configuración de texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Configuración de texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Borrar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al agregar una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarse de que todas las imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminado +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar diff --git a/public/pdfjs/web/locale/es-CL/viewer.ftl b/public/pdfjs/web/locale/es-CL/viewer.ftl new file mode 100644 index 0000000..74389e4 --- /dev/null +++ b/public/pdfjs/web/locale/es-CL/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Página siguiente +pdfjs-next-button-label = Siguiente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Página +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Alejar +pdfjs-zoom-out-button-label = Alejar +pdfjs-zoom-in-button = + .title = Acercar +pdfjs-zoom-in-button-label = Acercar +pdfjs-zoom-select = + .title = Ampliación +pdfjs-presentation-mode-button = + .title = Cambiar al modo de presentación +pdfjs-presentation-mode-button-label = Modo de presentación +pdfjs-open-file-button = + .title = Abrir archivo +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Guardar +pdfjs-save-button-label = Guardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descargar +pdfjs-bookmark-button = + .title = Página actual (Ver URL de la página actual) +pdfjs-bookmark-button-label = Página actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Herramientas +pdfjs-tools-button-label = Herramientas +pdfjs-first-page-button = + .title = Ir a la primera página +pdfjs-first-page-button-label = Ir a la primera página +pdfjs-last-page-button = + .title = Ir a la última página +pdfjs-last-page-button-label = Ir a la última página +pdfjs-page-rotate-cw-button = + .title = Girar a la derecha +pdfjs-page-rotate-cw-button-label = Girar a la derecha +pdfjs-page-rotate-ccw-button = + .title = Girar a la izquierda +pdfjs-page-rotate-ccw-button-label = Girar a la izquierda +pdfjs-cursor-text-select-tool-button = + .title = Activar la herramienta de selección de texto +pdfjs-cursor-text-select-tool-button-label = Herramienta de selección de texto +pdfjs-cursor-hand-tool-button = + .title = Activar la herramienta de mano +pdfjs-cursor-hand-tool-button-label = Herramienta de mano +pdfjs-scroll-page-button = + .title = Usar desplazamiento de página +pdfjs-scroll-page-button-label = Desplazamiento de página +pdfjs-scroll-vertical-button = + .title = Usar desplazamiento vertical +pdfjs-scroll-vertical-button-label = Desplazamiento vertical +pdfjs-scroll-horizontal-button = + .title = Usar desplazamiento horizontal +pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar desplazamiento en bloque +pdfjs-scroll-wrapped-button-label = Desplazamiento en bloque +pdfjs-spread-none-button = + .title = No juntar páginas a modo de libro +pdfjs-spread-none-button-label = Vista de una página +pdfjs-spread-odd-button = + .title = Junta las páginas partiendo con una de número impar +pdfjs-spread-odd-button-label = Vista de libro impar +pdfjs-spread-even-button = + .title = Junta las páginas partiendo con una de número par +pdfjs-spread-even-button-label = Vista de libro par + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedades del documento… +pdfjs-document-properties-button-label = Propiedades del documento… +pdfjs-document-properties-file-name = Nombre de archivo: +pdfjs-document-properties-file-size = Tamaño del archivo: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Asunto: +pdfjs-document-properties-keywords = Palabras clave: +pdfjs-document-properties-creation-date = Fecha de creación: +pdfjs-document-properties-modification-date = Fecha de modificación: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creador: +pdfjs-document-properties-producer = Productor del PDF: +pdfjs-document-properties-version = Versión de PDF: +pdfjs-document-properties-page-count = Cantidad de páginas: +pdfjs-document-properties-page-size = Tamaño de la página: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Oficio + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista rápida en Web: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Cerrar + +## Print + +pdfjs-print-progress-message = Preparando documento para impresión… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Advertencia: Imprimir no está soportado completamente por este navegador. +pdfjs-printing-not-ready = Advertencia: El PDF no está completamente cargado para ser impreso. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Cambiar barra lateral (índice de contenidos del documento/adjuntos/capas) +pdfjs-toggle-sidebar-button-label = Mostrar u ocultar la barra lateral +pdfjs-document-outline-button = + .title = Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos) +pdfjs-document-outline-button-label = Esquema del documento +pdfjs-attachments-button = + .title = Mostrar adjuntos +pdfjs-attachments-button-label = Adjuntos +pdfjs-layers-button = + .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +pdfjs-layers-button-label = Capas +pdfjs-thumbs-button = + .title = Mostrar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Buscar elemento de esquema actual +pdfjs-current-outline-item-button-label = Elemento de esquema actual +pdfjs-findbar-button = + .title = Buscar en el documento +pdfjs-findbar-button-label = Buscar +pdfjs-additional-layers = Capas adicionales + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura de la página { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Encontrar + .placeholder = Encontrar en el documento… +pdfjs-find-previous-button = + .title = Buscar la aparición anterior de la frase +pdfjs-find-previous-button-label = Previo +pdfjs-find-next-button = + .title = Buscar la siguiente aparición de la frase +pdfjs-find-next-button-label = Siguiente +pdfjs-find-highlight-checkbox = Destacar todos +pdfjs-find-match-case-checkbox-label = Coincidir mayús./minús. +pdfjs-find-match-diacritics-checkbox-label = Coincidir diacríticos +pdfjs-find-entire-word-checkbox-label = Palabras completas +pdfjs-find-reached-top = Se alcanzó el inicio del documento, continuando desde el final +pdfjs-find-reached-bottom = Se alcanzó el final del documento, continuando desde el inicio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Coincidencia { $current } de { $total } + *[other] Coincidencia { $current } de { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Más de { $limit } coincidencia + *[other] Más de { $limit } coincidencias + } +pdfjs-find-not-found = Frase no encontrada + +## Predefined zoom values + +pdfjs-page-scale-width = Ancho de página +pdfjs-page-scale-fit = Ajuste de página +pdfjs-page-scale-auto = Aumento automático +pdfjs-page-scale-actual = Tamaño actual +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Página { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ocurrió un error al cargar el PDF. +pdfjs-invalid-file-error = Archivo PDF inválido o corrupto. +pdfjs-missing-file-error = Falta el archivo PDF. +pdfjs-unexpected-response-error = Respuesta del servidor inesperada. +pdfjs-rendering-error = Ocurrió un error al renderizar la página. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Anotación] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Ingresa la contraseña para abrir este archivo PDF. +pdfjs-password-invalid = Contraseña inválida. Por favor, vuelve a intentarlo. +pdfjs-password-ok-button = Aceptar +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = Las tipografías web están desactivadas: imposible usar las fuentes PDF embebidas. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Dibujar +pdfjs-editor-ink-button-label = Dibujar +pdfjs-editor-stamp-button = + .title = Añadir o editar imágenes +pdfjs-editor-stamp-button-label = Añadir o editar imágenes +pdfjs-editor-highlight-button = + .title = Destacar +pdfjs-editor-highlight-button-label = Destacar +pdfjs-highlight-floating-button1 = + .title = Destacar + .aria-label = Destacar +pdfjs-highlight-floating-button-label = Destacar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Eliminar dibujo +pdfjs-editor-remove-freetext-button = + .title = Eliminar texto +pdfjs-editor-remove-stamp-button = + .title = Eliminar imagen +pdfjs-editor-remove-highlight-button = + .title = Quitar resaltado + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Tamaño +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Grosor +pdfjs-editor-ink-opacity-input = Opacidad +pdfjs-editor-stamp-add-image-button = + .title = Añadir imagen +pdfjs-editor-stamp-add-image-button-label = Añadir imagen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grosor +pdfjs-editor-free-highlight-thickness-title = + .title = Cambia el grosor al resaltar elementos que no sean texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Empieza a escribir… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Empieza a escribir… +pdfjs-ink = + .aria-label = Editor de dibujos +pdfjs-ink-canvas = + .aria-label = Imagen creada por el usuario + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-dialog-label = Elige una opción +pdfjs-editor-alt-text-dialog-description = El texto alternativo (alt text) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. +pdfjs-editor-alt-text-add-description-label = Añade una descripción +pdfjs-editor-alt-text-add-description-description = Intenta escribir 1 o 2 oraciones que describan el tema, el ambiente o las acciones. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa +pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para imágenes ornamentales, como bordes o marcas de agua. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Guardar +pdfjs-editor-alt-text-decorative-tooltip = Marcada como decorativa +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — cambiar el tamaño +pdfjs-editor-resizer-label-top-middle = Borde superior en el medio — cambiar el tamaño +pdfjs-editor-resizer-label-top-right = Esquina superior derecha — cambiar el tamaño +pdfjs-editor-resizer-label-middle-right = Borde derecho en el medio — cambiar el tamaño +pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — cambiar el tamaño +pdfjs-editor-resizer-label-bottom-middle = Borde inferior en el medio — cambiar el tamaño +pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — cambiar el tamaño +pdfjs-editor-resizer-label-middle-left = Borde izquierdo en el medio — cambiar el tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — cambiar el tamaño +pdfjs-editor-resizer-top-middle = + .aria-label = Borde superior en el medio — cambiar el tamaño +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — cambiar el tamaño +pdfjs-editor-resizer-middle-right = + .aria-label = Borde derecho en el medio — cambiar el tamaño +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — cambiar el tamaño +pdfjs-editor-resizer-bottom-middle = + .aria-label = Borde inferior en el medio — cambiar el tamaño +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — cambiar el tamaño +pdfjs-editor-resizer-middle-left = + .aria-label = Borde izquierdo en el medio — cambiar el tamaño + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color de resaltado +pdfjs-editor-colorpicker-button = + .title = Cambiar color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opciones de color +pdfjs-editor-colorpicker-yellow = + .title = Amarillo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Rojo + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar todo +pdfjs-editor-highlight-show-all-button = + .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Añadir texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribe tu descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descripción para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser incorrecto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Aprender más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = Ahora no +pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escribe tu propio texto alternativo o vuelve a intentarlo más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Se añadió el texto alternativo +pdfjs-editor-new-alt-text-added-button-label = Se añadió el texto alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ajustes del texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en tu dispositivo para que tus datos permanezcan privados. Necesario para el texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Bajando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al añadir una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminada +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar diff --git a/public/pdfjs/web/locale/es-ES/viewer.ftl b/public/pdfjs/web/locale/es-ES/viewer.ftl new file mode 100644 index 0000000..f610a17 --- /dev/null +++ b/public/pdfjs/web/locale/es-ES/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Página siguiente +pdfjs-next-button-label = Siguiente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Página +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Reducir +pdfjs-zoom-out-button-label = Reducir +pdfjs-zoom-in-button = + .title = Aumentar +pdfjs-zoom-in-button-label = Aumentar +pdfjs-zoom-select = + .title = Tamaño +pdfjs-presentation-mode-button = + .title = Cambiar al modo presentación +pdfjs-presentation-mode-button-label = Modo presentación +pdfjs-open-file-button = + .title = Abrir archivo +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Guardar +pdfjs-save-button-label = Guardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descargar +pdfjs-bookmark-button = + .title = Página actual (Ver URL de la página actual) +pdfjs-bookmark-button-label = Página actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Herramientas +pdfjs-tools-button-label = Herramientas +pdfjs-first-page-button = + .title = Ir a la primera página +pdfjs-first-page-button-label = Ir a la primera página +pdfjs-last-page-button = + .title = Ir a la última página +pdfjs-last-page-button-label = Ir a la última página +pdfjs-page-rotate-cw-button = + .title = Rotar en sentido horario +pdfjs-page-rotate-cw-button-label = Rotar en sentido horario +pdfjs-page-rotate-ccw-button = + .title = Rotar en sentido antihorario +pdfjs-page-rotate-ccw-button-label = Rotar en sentido antihorario +pdfjs-cursor-text-select-tool-button = + .title = Activar herramienta de selección de texto +pdfjs-cursor-text-select-tool-button-label = Herramienta de selección de texto +pdfjs-cursor-hand-tool-button = + .title = Activar herramienta de mano +pdfjs-cursor-hand-tool-button-label = Herramienta de mano +pdfjs-scroll-page-button = + .title = Usar desplazamiento de página +pdfjs-scroll-page-button-label = Desplazamiento de página +pdfjs-scroll-vertical-button = + .title = Usar desplazamiento vertical +pdfjs-scroll-vertical-button-label = Desplazamiento vertical +pdfjs-scroll-horizontal-button = + .title = Usar desplazamiento horizontal +pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar desplazamiento en bloque +pdfjs-scroll-wrapped-button-label = Desplazamiento en bloque +pdfjs-spread-none-button = + .title = No juntar páginas en vista de libro +pdfjs-spread-none-button-label = Vista de libro +pdfjs-spread-odd-button = + .title = Juntar las páginas partiendo de una con número impar +pdfjs-spread-odd-button-label = Vista de libro impar +pdfjs-spread-even-button = + .title = Juntar las páginas partiendo de una con número par +pdfjs-spread-even-button-label = Vista de libro par + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedades del documento… +pdfjs-document-properties-button-label = Propiedades del documento… +pdfjs-document-properties-file-name = Nombre de archivo: +pdfjs-document-properties-file-size = Tamaño de archivo: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Asunto: +pdfjs-document-properties-keywords = Palabras clave: +pdfjs-document-properties-creation-date = Fecha de creación: +pdfjs-document-properties-modification-date = Fecha de modificación: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creador: +pdfjs-document-properties-producer = Productor PDF: +pdfjs-document-properties-version = Versión PDF: +pdfjs-document-properties-page-count = Número de páginas: +pdfjs-document-properties-page-size = Tamaño de la página: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista rápida de la web: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Cerrar + +## Print + +pdfjs-print-progress-message = Preparando documento para impresión… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Advertencia: Imprimir no está totalmente soportado por este navegador. +pdfjs-printing-not-ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Cambiar barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Alternar barra lateral (el documento contiene esquemas/adjuntos/capas) +pdfjs-toggle-sidebar-button-label = Cambiar barra lateral +pdfjs-document-outline-button = + .title = Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos) +pdfjs-document-outline-button-label = Resumen de documento +pdfjs-attachments-button = + .title = Mostrar adjuntos +pdfjs-attachments-button-label = Adjuntos +pdfjs-layers-button = + .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +pdfjs-layers-button-label = Capas +pdfjs-thumbs-button = + .title = Mostrar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Encontrar elemento de esquema actual +pdfjs-current-outline-item-button-label = Elemento de esquema actual +pdfjs-findbar-button = + .title = Buscar en el documento +pdfjs-findbar-button-label = Buscar +pdfjs-additional-layers = Capas adicionales + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura de la página { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Buscar + .placeholder = Buscar en el documento… +pdfjs-find-previous-button = + .title = Encontrar la anterior aparición de la frase +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Encontrar la siguiente aparición de esta frase +pdfjs-find-next-button-label = Siguiente +pdfjs-find-highlight-checkbox = Resaltar todos +pdfjs-find-match-case-checkbox-label = Coincidencia de mayús./minús. +pdfjs-find-match-diacritics-checkbox-label = Coincidir diacríticos +pdfjs-find-entire-word-checkbox-label = Palabras completas +pdfjs-find-reached-top = Se alcanzó el inicio del documento, se continúa desde el final +pdfjs-find-reached-bottom = Se alcanzó el final del documento, se continúa desde el inicio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } coincidencia + *[other] { $current } de { $total } coincidencias + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Más de { $limit } coincidencia + *[other] Más de { $limit } coincidencias + } +pdfjs-find-not-found = Frase no encontrada + +## Predefined zoom values + +pdfjs-page-scale-width = Anchura de la página +pdfjs-page-scale-fit = Ajuste de la página +pdfjs-page-scale-auto = Tamaño automático +pdfjs-page-scale-actual = Tamaño real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Página { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ocurrió un error al cargar el PDF. +pdfjs-invalid-file-error = Fichero PDF no válido o corrupto. +pdfjs-missing-file-error = No hay fichero PDF. +pdfjs-unexpected-response-error = Respuesta inesperada del servidor. +pdfjs-rendering-error = Ocurrió un error al renderizar la página. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotación { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Introduzca la contraseña para abrir este archivo PDF. +pdfjs-password-invalid = Contraseña no válida. Vuelva a intentarlo. +pdfjs-password-ok-button = Aceptar +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Dibujar +pdfjs-editor-ink-button-label = Dibujar +pdfjs-editor-stamp-button = + .title = Añadir o editar imágenes +pdfjs-editor-stamp-button-label = Añadir o editar imágenes +pdfjs-editor-highlight-button = + .title = Resaltar +pdfjs-editor-highlight-button-label = Resaltar +pdfjs-highlight-floating-button1 = + .title = Resaltar + .aria-label = Resaltar +pdfjs-highlight-floating-button-label = Resaltar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Eliminar dibujo +pdfjs-editor-remove-freetext-button = + .title = Eliminar texto +pdfjs-editor-remove-stamp-button = + .title = Eliminar imagen +pdfjs-editor-remove-highlight-button = + .title = Quitar resaltado + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Tamaño +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Grosor +pdfjs-editor-ink-opacity-input = Opacidad +pdfjs-editor-stamp-add-image-button = + .title = Añadir imagen +pdfjs-editor-stamp-add-image-button-label = Añadir imagen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grosor +pdfjs-editor-free-highlight-thickness-title = + .title = Cambiar el grosor al resaltar elementos que no sean texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Empiece a escribir… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Empezar a escribir… +pdfjs-ink = + .aria-label = Editor de dibujos +pdfjs-ink-canvas = + .aria-label = Imagen creada por el usuario + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar el texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar el texto alternativo +pdfjs-editor-alt-text-dialog-label = Eligir una opción +pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. +pdfjs-editor-alt-text-add-description-label = Añadir una descripción +pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 frases que describan el tema, el entorno o las acciones. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa +pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para imágenes ornamentales, como bordes o marcas de agua. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Guardar +pdfjs-editor-alt-text-decorative-tooltip = Marcada como decorativa +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — redimensionar +pdfjs-editor-resizer-label-top-middle = Borde superior en el medio — redimensionar +pdfjs-editor-resizer-label-top-right = Esquina superior derecha — redimensionar +pdfjs-editor-resizer-label-middle-right = Borde derecho en el medio — redimensionar +pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — redimensionar +pdfjs-editor-resizer-label-bottom-middle = Borde inferior en el medio — redimensionar +pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — redimensionar +pdfjs-editor-resizer-label-middle-left = Borde izquierdo en el medio — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Borde superior en el medio — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Borde derecho en el medio — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Borde inferior en el medio — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Borde izquierdo en el medio — redimensionar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color de resaltado +pdfjs-editor-colorpicker-button = + .title = Cambiar color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opciones de color +pdfjs-editor-colorpicker-yellow = + .title = Amarillo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Rojo + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar todo +pdfjs-editor-highlight-show-all-button = + .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Añadir texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribir la descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descripción para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser inexacto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = Ahora no +pdfjs-editor-new-alt-text-error-title = No se ha podido crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escriba su propio texto alternativo o inténtelo de nuevo más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Se añadió el texto alternativo +pdfjs-editor-new-alt-text-added-button-label = Se añadió el texto alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ajustes del texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al añadir una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Le ayuda a asegurarse de que todas sus imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminada +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar diff --git a/public/pdfjs/web/locale/es-MX/viewer.ftl b/public/pdfjs/web/locale/es-MX/viewer.ftl new file mode 100644 index 0000000..03afe7c --- /dev/null +++ b/public/pdfjs/web/locale/es-MX/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Página siguiente +pdfjs-next-button-label = Siguiente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Página +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Reducir +pdfjs-zoom-out-button-label = Reducir +pdfjs-zoom-in-button = + .title = Aumentar +pdfjs-zoom-in-button-label = Aumentar +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Cambiar al modo presentación +pdfjs-presentation-mode-button-label = Modo presentación +pdfjs-open-file-button = + .title = Abrir archivo +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Guardar +pdfjs-save-button-label = Guardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descargar +pdfjs-bookmark-button = + .title = Página actual (Ver URL de la página actual) +pdfjs-bookmark-button-label = Página actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Herramientas +pdfjs-tools-button-label = Herramientas +pdfjs-first-page-button = + .title = Ir a la primera página +pdfjs-first-page-button-label = Ir a la primera página +pdfjs-last-page-button = + .title = Ir a la última página +pdfjs-last-page-button-label = Ir a la última página +pdfjs-page-rotate-cw-button = + .title = Girar a la derecha +pdfjs-page-rotate-cw-button-label = Girar a la derecha +pdfjs-page-rotate-ccw-button = + .title = Girar a la izquierda +pdfjs-page-rotate-ccw-button-label = Girar a la izquierda +pdfjs-cursor-text-select-tool-button = + .title = Activar la herramienta de selección de texto +pdfjs-cursor-text-select-tool-button-label = Herramienta de selección de texto +pdfjs-cursor-hand-tool-button = + .title = Activar la herramienta de mano +pdfjs-cursor-hand-tool-button-label = Herramienta de mano +pdfjs-scroll-page-button = + .title = Usar desplazamiento de página +pdfjs-scroll-page-button-label = Desplazamiento de página +pdfjs-scroll-vertical-button = + .title = Usar desplazamiento vertical +pdfjs-scroll-vertical-button-label = Desplazamiento vertical +pdfjs-scroll-horizontal-button = + .title = Usar desplazamiento horizontal +pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar desplazamiento encapsulado +pdfjs-scroll-wrapped-button-label = Desplazamiento encapsulado +pdfjs-spread-none-button = + .title = No unir páginas separadas +pdfjs-spread-none-button-label = Vista de una página +pdfjs-spread-odd-button = + .title = Unir las páginas partiendo con una de número impar +pdfjs-spread-odd-button-label = Vista de libro impar +pdfjs-spread-even-button = + .title = Juntar las páginas partiendo con una de número par +pdfjs-spread-even-button-label = Vista de libro par + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedades del documento… +pdfjs-document-properties-button-label = Propiedades del documento… +pdfjs-document-properties-file-name = Nombre del archivo: +pdfjs-document-properties-file-size = Tamaño del archivo: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Asunto: +pdfjs-document-properties-keywords = Palabras claves: +pdfjs-document-properties-creation-date = Fecha de creación: +pdfjs-document-properties-modification-date = Fecha de modificación: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creador: +pdfjs-document-properties-producer = Productor PDF: +pdfjs-document-properties-version = Versión PDF: +pdfjs-document-properties-page-count = Número de páginas: +pdfjs-document-properties-page-size = Tamaño de la página: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Oficio + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista rápida de la web: +pdfjs-document-properties-linearized-yes = Sí +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Cerrar + +## Print + +pdfjs-print-progress-message = Preparando documento para impresión… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Advertencia: La impresión no esta completamente soportada por este navegador. +pdfjs-printing-not-ready = Advertencia: El PDF no cargo completamente para impresión. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Cambiar barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Alternar barra lateral (el documento contiene esquemas/adjuntos/capas) +pdfjs-toggle-sidebar-button-label = Cambiar barra lateral +pdfjs-document-outline-button = + .title = Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos) +pdfjs-document-outline-button-label = Esquema del documento +pdfjs-attachments-button = + .title = Mostrar adjuntos +pdfjs-attachments-button-label = Adjuntos +pdfjs-layers-button = + .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +pdfjs-layers-button-label = Capas +pdfjs-thumbs-button = + .title = Mostrar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Buscar elemento de esquema actual +pdfjs-current-outline-item-button-label = Elemento de esquema actual +pdfjs-findbar-button = + .title = Buscar en el documento +pdfjs-findbar-button-label = Buscar +pdfjs-additional-layers = Capas adicionales + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura de la página { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Buscar + .placeholder = Buscar en el documento… +pdfjs-find-previous-button = + .title = Ir a la anterior frase encontrada +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Ir a la siguiente frase encontrada +pdfjs-find-next-button-label = Siguiente +pdfjs-find-highlight-checkbox = Resaltar todo +pdfjs-find-match-case-checkbox-label = Coincidir con mayúsculas y minúsculas +pdfjs-find-match-diacritics-checkbox-label = Coincidir diacríticos +pdfjs-find-entire-word-checkbox-label = Palabras completas +pdfjs-find-reached-top = Se alcanzó el inicio del documento, se buscará al final +pdfjs-find-reached-bottom = Se alcanzó el final del documento, se buscará al inicio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } coincidencia + *[other] { $current } de { $total } coincidencias + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Más de { $limit } coincidencia + *[other] Más de { $limit } coincidencias + } +pdfjs-find-not-found = No se encontró la frase + +## Predefined zoom values + +pdfjs-page-scale-width = Ancho de página +pdfjs-page-scale-fit = Ajustar página +pdfjs-page-scale-auto = Zoom automático +pdfjs-page-scale-actual = Tamaño real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Página { $page } + +## Loading indicator messages + +pdfjs-loading-error = Un error ocurrió al cargar el PDF. +pdfjs-invalid-file-error = Archivo PDF invalido o dañado. +pdfjs-missing-file-error = Archivo PDF no encontrado. +pdfjs-unexpected-response-error = Respuesta inesperada del servidor. +pdfjs-rendering-error = Un error ocurrió al renderizar la página. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } anotación] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Ingresa la contraseña para abrir este archivo PDF. +pdfjs-password-invalid = Contraseña inválida. Por favor intenta de nuevo. +pdfjs-password-ok-button = Aceptar +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Dibujar +pdfjs-editor-ink-button-label = Dibujar +pdfjs-editor-stamp-button = + .title = Agregar o editar imágenes +pdfjs-editor-stamp-button-label = Agregar o editar imágenes +pdfjs-editor-highlight-button = + .title = Destacar +pdfjs-editor-highlight-button-label = Destacar +pdfjs-highlight-floating-button1 = + .title = Destacados + .aria-label = Destacados +pdfjs-highlight-floating-button-label = Destacados + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Eliminar dibujo +pdfjs-editor-remove-freetext-button = + .title = Eliminar texto +pdfjs-editor-remove-stamp-button = + .title = Eliminar imagen +pdfjs-editor-remove-highlight-button = + .title = Eliminar destacado + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Tamaño +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Grossor +pdfjs-editor-ink-opacity-input = Opacidad +pdfjs-editor-stamp-add-image-button = + .title = Agregar imagen +pdfjs-editor-stamp-add-image-button-label = Agregar imagen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Espesor +pdfjs-editor-free-highlight-thickness-title = + .title = Cambiar el grosor al resaltar elementos que no sean texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Comenzar a escribir… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Empieza a escribir… +pdfjs-ink = + .aria-label = Editor de dibujo +pdfjs-ink-canvas = + .aria-label = Imagen creada por el usuario + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-dialog-label = Elige una opción +pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. +pdfjs-editor-alt-text-add-description-label = Añadir una descripción +pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 oraciones que describan el tema, el entorno o las acciones. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo +pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para imágenes ornamentales, como bordes o marcas de agua. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Guardar +pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Esquina superior izquierda: cambiar el tamaño +pdfjs-editor-resizer-label-top-middle = Arriba en el medio: cambiar el tamaño +pdfjs-editor-resizer-label-top-right = Esquina superior derecha: cambiar el tamaño +pdfjs-editor-resizer-label-middle-right = Centro derecha: cambiar el tamaño +pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha: cambiar el tamaño +pdfjs-editor-resizer-label-bottom-middle = Abajo en el medio: cambiar el tamaño +pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda: cambiar el tamaño +pdfjs-editor-resizer-label-middle-left = Centro izquierda: cambiar el tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Borde superior en el medio — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Borde derecho en el medio — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Borde inferior en el medio — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Borde izquierdo en el medio — redimensionar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color de resaltado +pdfjs-editor-colorpicker-button = + .title = Cambiar color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opciones de color +pdfjs-editor-colorpicker-yellow = + .title = Amarillo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Rojo + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar todo +pdfjs-editor-highlight-show-all-button = + .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Agregar texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribe tu descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descripción para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser inexacto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = Ahora no +pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escribe tu propio texto alternativo o inténtalo de nuevo más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Se agregó el texto alternativo +pdfjs-editor-new-alt-text-added-button-label = Se agregó el texto alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ajustes del texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al añadir una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminada +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar diff --git a/public/pdfjs/web/locale/et/viewer.ftl b/public/pdfjs/web/locale/et/viewer.ftl new file mode 100644 index 0000000..b28c6d5 --- /dev/null +++ b/public/pdfjs/web/locale/et/viewer.ftl @@ -0,0 +1,268 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Eelmine lehekülg +pdfjs-previous-button-label = Eelmine +pdfjs-next-button = + .title = Järgmine lehekülg +pdfjs-next-button-label = Järgmine +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Leht +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber }/{ $pagesCount }) +pdfjs-zoom-out-button = + .title = Vähenda +pdfjs-zoom-out-button-label = Vähenda +pdfjs-zoom-in-button = + .title = Suurenda +pdfjs-zoom-in-button-label = Suurenda +pdfjs-zoom-select = + .title = Suurendamine +pdfjs-presentation-mode-button = + .title = Lülitu esitlusrežiimi +pdfjs-presentation-mode-button-label = Esitlusrežiim +pdfjs-open-file-button = + .title = Ava fail +pdfjs-open-file-button-label = Ava +pdfjs-print-button = + .title = Prindi +pdfjs-print-button-label = Prindi + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tööriistad +pdfjs-tools-button-label = Tööriistad +pdfjs-first-page-button = + .title = Mine esimesele leheküljele +pdfjs-first-page-button-label = Mine esimesele leheküljele +pdfjs-last-page-button = + .title = Mine viimasele leheküljele +pdfjs-last-page-button-label = Mine viimasele leheküljele +pdfjs-page-rotate-cw-button = + .title = Pööra päripäeva +pdfjs-page-rotate-cw-button-label = Pööra päripäeva +pdfjs-page-rotate-ccw-button = + .title = Pööra vastupäeva +pdfjs-page-rotate-ccw-button-label = Pööra vastupäeva +pdfjs-cursor-text-select-tool-button = + .title = Luba teksti valimise tööriist +pdfjs-cursor-text-select-tool-button-label = Teksti valimise tööriist +pdfjs-cursor-hand-tool-button = + .title = Luba sirvimistööriist +pdfjs-cursor-hand-tool-button-label = Sirvimistööriist +pdfjs-scroll-page-button = + .title = Kasutatakse lehe kaupa kerimist +pdfjs-scroll-page-button-label = Lehe kaupa kerimine +pdfjs-scroll-vertical-button = + .title = Kasuta vertikaalset kerimist +pdfjs-scroll-vertical-button-label = Vertikaalne kerimine +pdfjs-scroll-horizontal-button = + .title = Kasuta horisontaalset kerimist +pdfjs-scroll-horizontal-button-label = Horisontaalne kerimine +pdfjs-scroll-wrapped-button = + .title = Kasuta rohkem mahutavat kerimist +pdfjs-scroll-wrapped-button-label = Rohkem mahutav kerimine +pdfjs-spread-none-button = + .title = Ära kõrvuta lehekülgi +pdfjs-spread-none-button-label = Lehtede kõrvutamine puudub +pdfjs-spread-odd-button = + .title = Kõrvuta leheküljed, alustades paaritute numbritega lehekülgedega +pdfjs-spread-odd-button-label = Kõrvutamine paaritute numbritega alustades +pdfjs-spread-even-button = + .title = Kõrvuta leheküljed, alustades paarisnumbritega lehekülgedega +pdfjs-spread-even-button-label = Kõrvutamine paarisnumbritega alustades + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumendi omadused… +pdfjs-document-properties-button-label = Dokumendi omadused… +pdfjs-document-properties-file-name = Faili nimi: +pdfjs-document-properties-file-size = Faili suurus: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KiB ({ $size_b } baiti) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MiB ({ $size_b } baiti) +pdfjs-document-properties-title = Pealkiri: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Teema: +pdfjs-document-properties-keywords = Märksõnad: +pdfjs-document-properties-creation-date = Loodud: +pdfjs-document-properties-modification-date = Muudetud: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date } { $time } +pdfjs-document-properties-creator = Looja: +pdfjs-document-properties-producer = Generaator: +pdfjs-document-properties-version = Generaatori versioon: +pdfjs-document-properties-page-count = Lehekülgi: +pdfjs-document-properties-page-size = Lehe suurus: +pdfjs-document-properties-page-size-unit-inches = tolli +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertikaalpaigutus +pdfjs-document-properties-page-size-orientation-landscape = rõhtpaigutus +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = "Fast Web View" tugi: +pdfjs-document-properties-linearized-yes = Jah +pdfjs-document-properties-linearized-no = Ei +pdfjs-document-properties-close-button = Sulge + +## Print + +pdfjs-print-progress-message = Dokumendi ettevalmistamine printimiseks… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Loobu +pdfjs-printing-not-supported = Hoiatus: printimine pole selle brauseri poolt täielikult toetatud. +pdfjs-printing-not-ready = Hoiatus: PDF pole printimiseks täielikult laaditud. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Näita külgriba +pdfjs-toggle-sidebar-notification-button = + .title = Näita külgriba (dokument sisaldab sisukorda/manuseid/kihte) +pdfjs-toggle-sidebar-button-label = Näita külgriba +pdfjs-document-outline-button = + .title = Näita sisukorda (kõigi punktide laiendamiseks/ahendamiseks topeltklõpsa) +pdfjs-document-outline-button-label = Näita sisukorda +pdfjs-attachments-button = + .title = Näita manuseid +pdfjs-attachments-button-label = Manused +pdfjs-layers-button = + .title = Näita kihte (kõikide kihtide vaikeolekusse lähtestamiseks topeltklõpsa) +pdfjs-layers-button-label = Kihid +pdfjs-thumbs-button = + .title = Näita pisipilte +pdfjs-thumbs-button-label = Pisipildid +pdfjs-current-outline-item-button = + .title = Otsi üles praegune kontuuriüksus +pdfjs-current-outline-item-button-label = Praegune kontuuriüksus +pdfjs-findbar-button = + .title = Otsi dokumendist +pdfjs-findbar-button-label = Otsi +pdfjs-additional-layers = Täiendavad kihid + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page }. lehekülg +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page }. lehekülje pisipilt + +## Find panel button title and messages + +pdfjs-find-input = + .title = Otsi + .placeholder = Otsi dokumendist… +pdfjs-find-previous-button = + .title = Otsi fraasi eelmine esinemiskoht +pdfjs-find-previous-button-label = Eelmine +pdfjs-find-next-button = + .title = Otsi fraasi järgmine esinemiskoht +pdfjs-find-next-button-label = Järgmine +pdfjs-find-highlight-checkbox = Too kõik esile +pdfjs-find-match-case-checkbox-label = Tõstutundlik +pdfjs-find-match-diacritics-checkbox-label = Otsitakse diakriitiliselt +pdfjs-find-entire-word-checkbox-label = Täissõnad +pdfjs-find-reached-top = Jõuti dokumendi algusesse, jätkati lõpust +pdfjs-find-reached-bottom = Jõuti dokumendi lõppu, jätkati algusest +pdfjs-find-not-found = Fraasi ei leitud + +## Predefined zoom values + +pdfjs-page-scale-width = Mahuta laiusele +pdfjs-page-scale-fit = Mahuta leheküljele +pdfjs-page-scale-auto = Automaatne suurendamine +pdfjs-page-scale-actual = Tegelik suurus +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Lehekülg { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDFi laadimisel esines viga. +pdfjs-invalid-file-error = Vigane või rikutud PDF-fail. +pdfjs-missing-file-error = PDF-fail puudub. +pdfjs-unexpected-response-error = Ootamatu vastus serverilt. +pdfjs-rendering-error = Lehe renderdamisel esines viga. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = PDF-faili avamiseks sisesta parool. +pdfjs-password-invalid = Vigane parool. Palun proovi uuesti. +pdfjs-password-ok-button = Sobib +pdfjs-password-cancel-button = Loobu +pdfjs-web-fonts-disabled = Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/eu/viewer.ftl b/public/pdfjs/web/locale/eu/viewer.ftl new file mode 100644 index 0000000..2b2660b --- /dev/null +++ b/public/pdfjs/web/locale/eu/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Aurreko orria +pdfjs-previous-button-label = Aurrekoa +pdfjs-next-button = + .title = Hurrengo orria +pdfjs-next-button-label = Hurrengoa +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Orria +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = { $pagesCount }/{ $pageNumber } +pdfjs-zoom-out-button = + .title = Urrundu zooma +pdfjs-zoom-out-button-label = Urrundu zooma +pdfjs-zoom-in-button = + .title = Gerturatu zooma +pdfjs-zoom-in-button-label = Gerturatu zooma +pdfjs-zoom-select = + .title = Zooma +pdfjs-presentation-mode-button = + .title = Aldatu aurkezpen modura +pdfjs-presentation-mode-button-label = Arkezpen modua +pdfjs-open-file-button = + .title = Ireki fitxategia +pdfjs-open-file-button-label = Ireki +pdfjs-print-button = + .title = Inprimatu +pdfjs-print-button-label = Inprimatu +pdfjs-save-button = + .title = Gorde +pdfjs-save-button-label = Gorde +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Deskargatu +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Deskargatu +pdfjs-bookmark-button = + .title = Uneko orria (ikusi uneko orriaren URLa) +pdfjs-bookmark-button-label = Uneko orria + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tresnak +pdfjs-tools-button-label = Tresnak +pdfjs-first-page-button = + .title = Joan lehen orrira +pdfjs-first-page-button-label = Joan lehen orrira +pdfjs-last-page-button = + .title = Joan azken orrira +pdfjs-last-page-button-label = Joan azken orrira +pdfjs-page-rotate-cw-button = + .title = Biratu erlojuaren norantzan +pdfjs-page-rotate-cw-button-label = Biratu erlojuaren norantzan +pdfjs-page-rotate-ccw-button = + .title = Biratu erlojuaren aurkako norantzan +pdfjs-page-rotate-ccw-button-label = Biratu erlojuaren aurkako norantzan +pdfjs-cursor-text-select-tool-button = + .title = Gaitu testuaren hautapen tresna +pdfjs-cursor-text-select-tool-button-label = Testuaren hautapen tresna +pdfjs-cursor-hand-tool-button = + .title = Gaitu eskuaren tresna +pdfjs-cursor-hand-tool-button-label = Eskuaren tresna +pdfjs-scroll-page-button = + .title = Erabili orriaren korritzea +pdfjs-scroll-page-button-label = Orriaren korritzea +pdfjs-scroll-vertical-button = + .title = Erabili korritze bertikala +pdfjs-scroll-vertical-button-label = Korritze bertikala +pdfjs-scroll-horizontal-button = + .title = Erabili korritze horizontala +pdfjs-scroll-horizontal-button-label = Korritze horizontala +pdfjs-scroll-wrapped-button = + .title = Erabili korritze egokitua +pdfjs-scroll-wrapped-button-label = Korritze egokitua +pdfjs-spread-none-button = + .title = Ez elkartu barreiatutako orriak +pdfjs-spread-none-button-label = Barreiatzerik ez +pdfjs-spread-odd-button = + .title = Elkartu barreiatutako orriak bakoiti zenbakidunekin hasita +pdfjs-spread-odd-button-label = Barreiatze bakoitia +pdfjs-spread-even-button = + .title = Elkartu barreiatutako orriak bikoiti zenbakidunekin hasita +pdfjs-spread-even-button-label = Barreiatze bikoitia + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentuaren propietateak… +pdfjs-document-properties-button-label = Dokumentuaren propietateak… +pdfjs-document-properties-file-name = Fitxategi-izena: +pdfjs-document-properties-file-size = Fitxategiaren tamaina: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +pdfjs-document-properties-title = Izenburua: +pdfjs-document-properties-author = Egilea: +pdfjs-document-properties-subject = Gaia: +pdfjs-document-properties-keywords = Gako-hitzak: +pdfjs-document-properties-creation-date = Sortze-data: +pdfjs-document-properties-modification-date = Aldatze-data: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Sortzailea: +pdfjs-document-properties-producer = PDFaren ekoizlea: +pdfjs-document-properties-version = PDF bertsioa: +pdfjs-document-properties-page-count = Orrialde kopurua: +pdfjs-document-properties-page-size = Orriaren tamaina: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = bertikala +pdfjs-document-properties-page-size-orientation-landscape = horizontala +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Gutuna +pdfjs-document-properties-page-size-name-legal = Legala + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Webeko ikuspegi bizkorra: +pdfjs-document-properties-linearized-yes = Bai +pdfjs-document-properties-linearized-no = Ez +pdfjs-document-properties-close-button = Itxi + +## Print + +pdfjs-print-progress-message = Dokumentua inprimatzeko prestatzen… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = %{ $progress } +pdfjs-print-progress-close-button = Utzi +pdfjs-printing-not-supported = Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan. +pdfjs-printing-not-ready = Abisua: PDFa ez dago erabat kargatuta inprimatzeko. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Txandakatu alboko barra +pdfjs-toggle-sidebar-notification-button = + .title = Txandakatu alboko barra (dokumentuak eskema/eranskinak/geruzak ditu) +pdfjs-toggle-sidebar-button-label = Txandakatu alboko barra +pdfjs-document-outline-button = + .title = Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko) +pdfjs-document-outline-button-label = Dokumentuaren eskema +pdfjs-attachments-button = + .title = Erakutsi eranskinak +pdfjs-attachments-button-label = Eranskinak +pdfjs-layers-button = + .title = Erakutsi geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko) +pdfjs-layers-button-label = Geruzak +pdfjs-thumbs-button = + .title = Erakutsi koadro txikiak +pdfjs-thumbs-button-label = Koadro txikiak +pdfjs-current-outline-item-button = + .title = Bilatu uneko eskemaren elementua +pdfjs-current-outline-item-button-label = Uneko eskemaren elementua +pdfjs-findbar-button = + .title = Bilatu dokumentuan +pdfjs-findbar-button-label = Bilatu +pdfjs-additional-layers = Geruza gehigarriak + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page }. orria +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page }. orriaren koadro txikia + +## Find panel button title and messages + +pdfjs-find-input = + .title = Bilatu + .placeholder = Bilatu dokumentuan… +pdfjs-find-previous-button = + .title = Bilatu esaldiaren aurreko parekatzea +pdfjs-find-previous-button-label = Aurrekoa +pdfjs-find-next-button = + .title = Bilatu esaldiaren hurrengo parekatzea +pdfjs-find-next-button-label = Hurrengoa +pdfjs-find-highlight-checkbox = Nabarmendu guztia +pdfjs-find-match-case-checkbox-label = Bat etorri maiuskulekin/minuskulekin +pdfjs-find-match-diacritics-checkbox-label = Bereizi diakritikoak +pdfjs-find-entire-word-checkbox-label = Hitz osoak +pdfjs-find-reached-top = Dokumentuaren hasierara heldu da, bukaeratik jarraitzen +pdfjs-find-reached-bottom = Dokumentuaren bukaerara heldu da, hasieratik jarraitzen +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $total }/{ $current }. bat-etortzea + *[other] { $total }/{ $current }. bat-etortzea + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Bat datorren { $limit } baino gehiago + *[other] Bat datozen { $limit } baino gehiago + } +pdfjs-find-not-found = Esaldia ez da aurkitu + +## Predefined zoom values + +pdfjs-page-scale-width = Orriaren zabalera +pdfjs-page-scale-fit = Doitu orrira +pdfjs-page-scale-auto = Zoom automatikoa +pdfjs-page-scale-actual = Benetako tamaina +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = %{ $scale } + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page }. orria + +## Loading indicator messages + +pdfjs-loading-error = Errorea gertatu da PDFa kargatzean. +pdfjs-invalid-file-error = PDF fitxategi baliogabe edo hondatua. +pdfjs-missing-file-error = PDF fitxategia falta da. +pdfjs-unexpected-response-error = Espero gabeko zerbitzariaren erantzuna. +pdfjs-rendering-error = Errorea gertatu da orria errendatzean. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } ohartarazpena] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Idatzi PDF fitxategi hau irekitzeko pasahitza. +pdfjs-password-invalid = Pasahitz baliogabea. Saiatu berriro mesedez. +pdfjs-password-ok-button = Ados +pdfjs-password-cancel-button = Utzi +pdfjs-web-fonts-disabled = Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili. + +## Editing + +pdfjs-editor-free-text-button = + .title = Testua +pdfjs-editor-free-text-button-label = Testua +pdfjs-editor-ink-button = + .title = Marrazkia +pdfjs-editor-ink-button-label = Marrazkia +pdfjs-editor-stamp-button = + .title = Gehitu edo editatu irudiak +pdfjs-editor-stamp-button-label = Gehitu edo editatu irudiak +pdfjs-editor-highlight-button = + .title = Nabarmendu +pdfjs-editor-highlight-button-label = Nabarmendu +pdfjs-highlight-floating-button1 = + .title = Nabarmendu + .aria-label = Nabarmendu +pdfjs-highlight-floating-button-label = Nabarmendu + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Kendu marrazkia +pdfjs-editor-remove-freetext-button = + .title = Kendu testua +pdfjs-editor-remove-stamp-button = + .title = Kendu irudia +pdfjs-editor-remove-highlight-button = + .title = Kendu nabarmentzea + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Kolorea +pdfjs-editor-free-text-size-input = Tamaina +pdfjs-editor-ink-color-input = Kolorea +pdfjs-editor-ink-thickness-input = Loditasuna +pdfjs-editor-ink-opacity-input = Opakutasuna +pdfjs-editor-stamp-add-image-button = + .title = Gehitu irudia +pdfjs-editor-stamp-add-image-button-label = Gehitu irudia +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Loditasuna +pdfjs-editor-free-highlight-thickness-title = + .title = Aldatu loditasuna testua ez beste elementuak nabarmentzean +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Testu-editorea + .default-content = Hasi idazten… +pdfjs-free-text = + .aria-label = Testu-editorea +pdfjs-free-text-default-content = Hasi idazten… +pdfjs-ink = + .aria-label = Marrazki-editorea +pdfjs-ink-canvas = + .aria-label = Erabiltzaileak sortutako irudia + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Testu alternatiboa +pdfjs-editor-alt-text-edit-button = + .aria-label = Editatu testu alternatiboa +pdfjs-editor-alt-text-edit-button-label = Editatu testu alternatiboa +pdfjs-editor-alt-text-dialog-label = Aukeratu aukera +pdfjs-editor-alt-text-dialog-description = Testu alternatiboak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen. +pdfjs-editor-alt-text-add-description-label = Gehitu azalpena +pdfjs-editor-alt-text-add-description-description = Saiatu idazten gaia, ezarpena edo ekintzak deskribatzen dituen esaldi 1 edo 2. +pdfjs-editor-alt-text-mark-decorative-label = Markatu apaingarri gisa +pdfjs-editor-alt-text-mark-decorative-description = Irudiak apaingarrientzat erabiltzen da, adibidez ertz edo ur-marketarako. +pdfjs-editor-alt-text-cancel-button = Utzi +pdfjs-editor-alt-text-save-button = Gorde +pdfjs-editor-alt-text-decorative-tooltip = Apaingarri gisa markatuta +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Adibidez, "gizon gaztea mahaian eserita dago bazkaltzeko" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Testu alternatiboa + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Goiko ezkerreko izkina — aldatu tamaina +pdfjs-editor-resizer-label-top-middle = Goian erdian — aldatu tamaina +pdfjs-editor-resizer-label-top-right = Goiko eskuineko izkina — aldatu tamaina +pdfjs-editor-resizer-label-middle-right = Erdian eskuinean — aldatu tamaina +pdfjs-editor-resizer-label-bottom-right = Beheko eskuineko izkina — aldatu tamaina +pdfjs-editor-resizer-label-bottom-middle = Behean erdian — aldatu tamaina +pdfjs-editor-resizer-label-bottom-left = Beheko ezkerreko izkina — aldatu tamaina +pdfjs-editor-resizer-label-middle-left = Erdian ezkerrean — aldatu tamaina +pdfjs-editor-resizer-top-left = + .aria-label = Goiko ezkerreko izkina — aldatu tamaina +pdfjs-editor-resizer-top-middle = + .aria-label = Goian erdian — aldatu tamaina +pdfjs-editor-resizer-top-right = + .aria-label = Goiko eskuineko izkina — aldatu tamaina +pdfjs-editor-resizer-middle-right = + .aria-label = Erdian eskuinean — aldatu tamaina +pdfjs-editor-resizer-bottom-right = + .aria-label = Beheko eskuineko izkina — aldatu tamaina +pdfjs-editor-resizer-bottom-middle = + .aria-label = Behean erdian — aldatu tamaina +pdfjs-editor-resizer-bottom-left = + .aria-label = Beheko ezkerreko izkina — aldatu tamaina +pdfjs-editor-resizer-middle-left = + .aria-label = Erdian ezkerrean — aldatu tamaina + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Nabarmentze kolorea +pdfjs-editor-colorpicker-button = + .title = Aldatu kolorea +pdfjs-editor-colorpicker-dropdown = + .aria-label = Kolore-aukerak +pdfjs-editor-colorpicker-yellow = + .title = Horia +pdfjs-editor-colorpicker-green = + .title = Berdea +pdfjs-editor-colorpicker-blue = + .title = Urdina +pdfjs-editor-colorpicker-pink = + .title = Arrosa +pdfjs-editor-colorpicker-red = + .title = Gorria + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Erakutsi denak +pdfjs-editor-highlight-show-all-button = + .title = Erakutsi denak + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editatu testu alternatiboa (irudiaren azalpena) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Gehitu testu alternatiboa (irudiaren azalpena) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Idatzi zure azalpena hemen… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Azalpen laburra irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Testu alternatibo hau automatikoki sortu da eta okerra izan liteke. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Argibide gehiago +pdfjs-editor-new-alt-text-create-automatically-button-label = Sortu testu alternatiboa automatikoki +pdfjs-editor-new-alt-text-not-now-button = Une honetan ez +pdfjs-editor-new-alt-text-error-title = Ezin da testu alternatiboa automatikoki sortu +pdfjs-editor-new-alt-text-error-description = Idatzi zure testu alternatibo propioa edo saiatu berriro geroago. +pdfjs-editor-new-alt-text-error-close-button = Itxi +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Testu alternatiboaren AA modeloa deskargatzen ({ $totalSize }/{ $downloadedSize } MB) + .aria-valuetext = Testu alternatiboaren AA modeloa deskargatzen ({ $totalSize }/{ $downloadedSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Testu alternatiboa gehituta +pdfjs-editor-new-alt-text-added-button-label = Testu alternatiboa gehituta +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Testu alternatiboa falta da +pdfjs-editor-new-alt-text-missing-button-label = Testu alternatiboa falta da +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Berrikusi testu alternatiboa +pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi testu alternatiboa +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikoki sortua: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Irudiaren testu alternatiboaren ezarpenak +pdfjs-image-alt-text-settings-button-label = Irudiaren testu alternatiboaren ezarpenak +pdfjs-editor-alt-text-settings-dialog-label = Irudiaren testu alternatiboaren ezarpenak +pdfjs-editor-alt-text-settings-automatic-title = Testu alternatibo automatikoa +pdfjs-editor-alt-text-settings-create-model-button-label = Sortu testu alternatiboa automatikoki +pdfjs-editor-alt-text-settings-create-model-description = Azalpenak iradokitzen ditu irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Testu alternatiboaren AA modeloa ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Zure gailuan modu lokalean exekutatzen da eta zure datuak pribatu mantentzen dira. Testu alternatibo automatikorako beharrezkoa. +pdfjs-editor-alt-text-settings-delete-model-button = Ezabatu +pdfjs-editor-alt-text-settings-download-model-button = Deskargatu +pdfjs-editor-alt-text-settings-downloading-model-button = Deskargatzen… +pdfjs-editor-alt-text-settings-editor-title = Testu alternatiboaren editorea +pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi testu alternatiboa irudi bat gehitzean berehala +pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu. +pdfjs-editor-alt-text-settings-close-button = Itxi + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Nabarmentzea kenduta +pdfjs-editor-undo-bar-message-freetext = Testua kenduta +pdfjs-editor-undo-bar-message-ink = Marrazkia kenduta +pdfjs-editor-undo-bar-message-stamp = Irudia kenduta +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Esku-ohar bat kenduta + *[other] { $count } esku-ohar kenduta + } +pdfjs-editor-undo-bar-undo-button = + .title = Desegin +pdfjs-editor-undo-bar-undo-button-label = Desegin +pdfjs-editor-undo-bar-close-button = + .title = Itxi +pdfjs-editor-undo-bar-close-button-label = Itxi diff --git a/public/pdfjs/web/locale/fa/viewer.ftl b/public/pdfjs/web/locale/fa/viewer.ftl new file mode 100644 index 0000000..4969209 --- /dev/null +++ b/public/pdfjs/web/locale/fa/viewer.ftl @@ -0,0 +1,348 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = صفحهٔ قبلی +pdfjs-previous-button-label = قبلی +pdfjs-next-button = + .title = صفحهٔ بعدی +pdfjs-next-button-label = بعدی +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = صفحه +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = از { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber }از { $pagesCount }) +pdfjs-zoom-out-button = + .title = کوچک‌نمایی +pdfjs-zoom-out-button-label = کوچک‌نمایی +pdfjs-zoom-in-button = + .title = بزرگ‌نمایی +pdfjs-zoom-in-button-label = بزرگ‌نمایی +pdfjs-zoom-select = + .title = زوم +pdfjs-presentation-mode-button = + .title = تغییر به حالت ارائه +pdfjs-presentation-mode-button-label = حالت ارائه +pdfjs-open-file-button = + .title = باز کردن پرونده +pdfjs-open-file-button-label = باز کردن +pdfjs-print-button = + .title = چاپ +pdfjs-print-button-label = چاپ +pdfjs-save-button = + .title = ذخیره +pdfjs-save-button-label = ذخیره +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = دریافت +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = دریافت +pdfjs-bookmark-button = + .title = صفحه فعلی (مشاهده نشانی اینترنتی از صفحه فعلی) +pdfjs-bookmark-button-label = صفحه فعلی + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ابزارها +pdfjs-tools-button-label = ابزارها +pdfjs-first-page-button = + .title = برو به اولین صفحه +pdfjs-first-page-button-label = برو به اولین صفحه +pdfjs-last-page-button = + .title = برو به آخرین صفحه +pdfjs-last-page-button-label = برو به آخرین صفحه +pdfjs-page-rotate-cw-button = + .title = چرخش ساعتگرد +pdfjs-page-rotate-cw-button-label = چرخش ساعتگرد +pdfjs-page-rotate-ccw-button = + .title = چرخش پاد ساعتگرد +pdfjs-page-rotate-ccw-button-label = چرخش پاد ساعتگرد +pdfjs-cursor-text-select-tool-button = + .title = فعال کردن ابزارِ انتخابِ متن +pdfjs-cursor-text-select-tool-button-label = ابزارِ انتخابِ متن +pdfjs-cursor-hand-tool-button = + .title = فعال کردن ابزارِ دست +pdfjs-cursor-hand-tool-button-label = ابزار دست +pdfjs-scroll-page-button = + .title = استفاده از پیمایش صفحه +pdfjs-scroll-page-button-label = پیمایش صفحه +pdfjs-scroll-vertical-button = + .title = استفاده از پیمایش عمودی +pdfjs-scroll-vertical-button-label = پیمایش عمودی +pdfjs-scroll-horizontal-button = + .title = استفاده از پیمایش افقی +pdfjs-scroll-horizontal-button-label = پیمایش افقی +pdfjs-spread-none-button = + .title = صفحات پیوسته را یکی نکنید +pdfjs-spread-none-button-label = بدون صفحات پیوسته + +## Document properties dialog + +pdfjs-document-properties-button = + .title = خصوصیات سند... +pdfjs-document-properties-button-label = خصوصیات سند... +pdfjs-document-properties-file-name = نام پرونده: +pdfjs-document-properties-file-size = حجم پرونده: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } کیلوبایت ({ $b } بایت) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } مگابایت ({ $b } بایت) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } کیلوبایت ({ $size_b } بایت) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } مگابایت ({ $size_b } بایت) +pdfjs-document-properties-title = عنوان: +pdfjs-document-properties-author = نویسنده: +pdfjs-document-properties-subject = موضوع: +pdfjs-document-properties-keywords = کلیدواژه‌ها: +pdfjs-document-properties-creation-date = تاریخ ایجاد: +pdfjs-document-properties-modification-date = تاریخ ویرایش: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }، { $time } +pdfjs-document-properties-creator = ایجاد کننده: +pdfjs-document-properties-producer = ایجاد کننده PDF: +pdfjs-document-properties-version = نسخه PDF: +pdfjs-document-properties-page-count = تعداد صفحات: +pdfjs-document-properties-page-size = اندازه صفحه: +pdfjs-document-properties-page-size-unit-inches = اینچ +pdfjs-document-properties-page-size-unit-millimeters = میلی‌متر +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = نامه +pdfjs-document-properties-page-size-name-legal = حقوقی + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = بله +pdfjs-document-properties-linearized-no = خیر +pdfjs-document-properties-close-button = بستن + +## Print + +pdfjs-print-progress-message = آماده سازی مدارک برای چاپ کردن… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = لغو +pdfjs-printing-not-supported = هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود. +pdfjs-printing-not-ready = اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = باز و بسته کردن نوار کناری +pdfjs-toggle-sidebar-button-label = تغییرحالت نوارکناری +pdfjs-document-outline-button = + .title = نمایش رئوس مطالب مدارک(برای بازشدن/جمع شدن همه موارد دوبار کلیک کنید) +pdfjs-document-outline-button-label = طرح نوشتار +pdfjs-attachments-button = + .title = نمایش پیوست‌ها +pdfjs-attachments-button-label = پیوست‌ها +pdfjs-layers-button-label = لایه‌ها +pdfjs-thumbs-button = + .title = نمایش تصاویر بندانگشتی +pdfjs-thumbs-button-label = تصاویر بندانگشتی +pdfjs-findbar-button = + .title = جستجو در سند +pdfjs-findbar-button-label = پیدا کردن + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = صفحه { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = تصویر بند‌ انگشتی صفحه { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = پیدا کردن + .placeholder = پیدا کردن در سند… +pdfjs-find-previous-button = + .title = پیدا کردن رخداد قبلی عبارت +pdfjs-find-previous-button-label = قبلی +pdfjs-find-next-button = + .title = پیدا کردن رخداد بعدی عبارت +pdfjs-find-next-button-label = بعدی +pdfjs-find-highlight-checkbox = برجسته و هایلایت کردن همه موارد +pdfjs-find-match-case-checkbox-label = تطبیق کوچکی و بزرگی حروف +pdfjs-find-entire-word-checkbox-label = تمام کلمه‌ها +pdfjs-find-reached-top = به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم +pdfjs-find-reached-bottom = به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم +pdfjs-find-not-found = عبارت پیدا نشد + +## Predefined zoom values + +pdfjs-page-scale-width = عرض صفحه +pdfjs-page-scale-fit = اندازه کردن صفحه +pdfjs-page-scale-auto = بزرگنمایی خودکار +pdfjs-page-scale-actual = اندازه واقعی‌ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = صفحهٔ { $page } + +## Loading indicator messages + +pdfjs-loading-error = هنگام بارگیری پرونده PDF خطایی رخ داد. +pdfjs-invalid-file-error = پرونده PDF نامعتبر یامعیوب می‌باشد. +pdfjs-missing-file-error = پرونده PDF یافت نشد. +pdfjs-unexpected-response-error = پاسخ پیش بینی نشده سرور +pdfjs-rendering-error = هنگام بارگیری صفحه خطایی رخ داد. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }، { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = جهت باز کردن پرونده PDF گذرواژه را وارد نمائید. +pdfjs-password-invalid = گذرواژه نامعتبر. لطفا مجددا تلاش کنید. +pdfjs-password-ok-button = تأیید +pdfjs-password-cancel-button = لغو +pdfjs-web-fonts-disabled = فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد. + +## Editing + +pdfjs-editor-free-text-button = + .title = متن +pdfjs-editor-free-text-button-label = متن +pdfjs-editor-ink-button = + .title = کشیدن +pdfjs-editor-ink-button-label = کشیدن +pdfjs-editor-stamp-button = + .title = افزودن یا ویرایش تصاویر +pdfjs-editor-stamp-button-label = افزودن یا ویرایش تصاویر +pdfjs-editor-highlight-button = + .title = برجسته کردن +pdfjs-editor-highlight-button-label = برجسته کردن +pdfjs-highlight-floating-button1 = + .title = برجسته کردن + .aria-label = برجسته کردن +pdfjs-highlight-floating-button-label = برجسته کردن + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = رنگ +pdfjs-editor-free-text-size-input = اندازه +pdfjs-editor-ink-color-input = رنگ +pdfjs-editor-stamp-add-image-button = + .title = افزودن تصویر +pdfjs-editor-stamp-add-image-button-label = افزودن تصویر +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = ویرایشگر متن + .default-content = شروع به نوشتن کنید… +pdfjs-free-text = + .aria-label = ویرایشگر متن +pdfjs-free-text-default-content = شروع به نوشتن کنید… + +## Alt-text dialog + +pdfjs-editor-alt-text-add-description-label = افزودن توضیحات +pdfjs-editor-alt-text-cancel-button = انصراف +pdfjs-editor-alt-text-save-button = ذخیره + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + +pdfjs-editor-colorpicker-button = + .title = تغییر رنگ +pdfjs-editor-colorpicker-dropdown = + .aria-label = انتخاب رنگ +pdfjs-editor-colorpicker-yellow = + .title = زرد +pdfjs-editor-colorpicker-green = + .title = سبز +pdfjs-editor-colorpicker-blue = + .title = آبی +pdfjs-editor-colorpicker-pink = + .title = صورتی +pdfjs-editor-colorpicker-red = + .title = قرمز + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = نمایش همه +pdfjs-editor-highlight-show-all-button = + .title = نمایش همه + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = بیشتر بدانید +pdfjs-editor-new-alt-text-not-now-button = اکنون نه +pdfjs-editor-new-alt-text-error-close-button = بستن + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = حذف +pdfjs-editor-alt-text-settings-download-model-button = دریافت +pdfjs-editor-alt-text-settings-downloading-model-button = در حال دریافت… +pdfjs-editor-alt-text-settings-close-button = بستن diff --git a/public/pdfjs/web/locale/ff/viewer.ftl b/public/pdfjs/web/locale/ff/viewer.ftl new file mode 100644 index 0000000..d1419f5 --- /dev/null +++ b/public/pdfjs/web/locale/ff/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Hello Ɓennungo +pdfjs-previous-button-label = Ɓennuɗo +pdfjs-next-button = + .title = Hello faango +pdfjs-next-button-label = Yeeso +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Hello +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = e nder { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Lonngo Woɗɗa +pdfjs-zoom-out-button-label = Lonngo Woɗɗa +pdfjs-zoom-in-button = + .title = Lonngo Ara +pdfjs-zoom-in-button-label = Lonngo Ara +pdfjs-zoom-select = + .title = Lonngo +pdfjs-presentation-mode-button = + .title = Faytu to Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Uddit Fiilde +pdfjs-open-file-button-label = Uddit +pdfjs-print-button = + .title = Winndito +pdfjs-print-button-label = Winndito + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Kuutorɗe +pdfjs-tools-button-label = Kuutorɗe +pdfjs-first-page-button = + .title = Yah to hello adanngo +pdfjs-first-page-button-label = Yah to hello adanngo +pdfjs-last-page-button = + .title = Yah to hello wattindiingo +pdfjs-last-page-button-label = Yah to hello wattindiingo +pdfjs-page-rotate-cw-button = + .title = Yiiltu Faya Ñaamo +pdfjs-page-rotate-cw-button-label = Yiiltu Faya Ñaamo +pdfjs-page-rotate-ccw-button = + .title = Yiiltu Faya Nano +pdfjs-page-rotate-ccw-button-label = Yiiltu Faya Nano +pdfjs-cursor-text-select-tool-button = + .title = Gollin kaɓirgel cuɓirgel binndi +pdfjs-cursor-text-select-tool-button-label = Kaɓirgel cuɓirgel binndi +pdfjs-cursor-hand-tool-button = + .title = Hurmin kuutorgal junngo +pdfjs-cursor-hand-tool-button-label = Kaɓirgel junngo +pdfjs-scroll-vertical-button = + .title = Huutoro gorwitol daringol +pdfjs-scroll-vertical-button-label = Gorwitol daringol +pdfjs-scroll-horizontal-button = + .title = Huutoro gorwitol lelingol +pdfjs-scroll-horizontal-button-label = Gorwitol daringol +pdfjs-scroll-wrapped-button = + .title = Huutoro gorwitol coomingol +pdfjs-scroll-wrapped-button-label = Gorwitol coomingol +pdfjs-spread-none-button = + .title = Hoto tawtu kelle kelle +pdfjs-spread-none-button-label = Alaa Spreads +pdfjs-spread-odd-button = + .title = Tawtu kelle puɗɗortooɗe kelle teelɗe +pdfjs-spread-odd-button-label = Kelle teelɗe +pdfjs-spread-even-button = + .title = Tawtu ɗereeji kelle puɗɗoriiɗi kelle teeltuɗe +pdfjs-spread-even-button-label = Kelle teeltuɗe + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Keeroraaɗi Winndannde… +pdfjs-document-properties-button-label = Keeroraaɗi Winndannde… +pdfjs-document-properties-file-name = Innde fiilde: +pdfjs-document-properties-file-size = Ɓetol fiilde: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bite) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bite) +pdfjs-document-properties-title = Tiitoonde: +pdfjs-document-properties-author = Binnduɗo: +pdfjs-document-properties-subject = Toɓɓere: +pdfjs-document-properties-keywords = Kelmekele jiytirɗe: +pdfjs-document-properties-creation-date = Ñalnde Sosaa: +pdfjs-document-properties-modification-date = Ñalnde Waylaa: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Cosɗo: +pdfjs-document-properties-producer = Paggiiɗo PDF: +pdfjs-document-properties-version = Yamre PDF: +pdfjs-document-properties-page-count = Limoore Kelle: +pdfjs-document-properties-page-size = Ɓeto Hello: +pdfjs-document-properties-page-size-unit-inches = nder +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = dariingo +pdfjs-document-properties-page-size-orientation-landscape = wertiingo +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Ɓataake +pdfjs-document-properties-page-size-name-legal = Laawol + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Ɗisngo geese yaawngo: +pdfjs-document-properties-linearized-yes = Eey +pdfjs-document-properties-linearized-no = Alaa +pdfjs-document-properties-close-button = Uddu + +## Print + +pdfjs-print-progress-message = Nana heboo winnditaade fiilannde… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Haaytu +pdfjs-printing-not-supported = Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde. +pdfjs-printing-not-ready = Reentino: PDF oo loowaaki haa timmi ngam winnditagol. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toggilo Palal Sawndo +pdfjs-toggle-sidebar-button-label = Toggilo Palal Sawndo +pdfjs-document-outline-button = + .title = Hollu Ƴiyal Fiilannde (dobdobo ngam wertude/taggude teme fof) +pdfjs-document-outline-button-label = Toɓɓe Fiilannde +pdfjs-attachments-button = + .title = Hollu Ɗisanɗe +pdfjs-attachments-button-label = Ɗisanɗe +pdfjs-thumbs-button = + .title = Hollu Dooɓe +pdfjs-thumbs-button-label = Dooɓe +pdfjs-findbar-button = + .title = Yiylo e fiilannde +pdfjs-findbar-button-label = Yiytu + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Hello { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Dooɓre Hello { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Yiytu + .placeholder = Yiylo nder dokimaa +pdfjs-find-previous-button = + .title = Yiylo cilol ɓennugol konngol ngol +pdfjs-find-previous-button-label = Ɓennuɗo +pdfjs-find-next-button = + .title = Yiylo cilol garowol konngol ngol +pdfjs-find-next-button-label = Yeeso +pdfjs-find-highlight-checkbox = Jalbin fof +pdfjs-find-match-case-checkbox-label = Jaaɓnu darnde +pdfjs-find-entire-word-checkbox-label = Kelme timmuɗe tan +pdfjs-find-reached-top = Heɓii fuɗɗorde fiilannde, jokku faya les +pdfjs-find-reached-bottom = Heɓii hoore fiilannde, jokku faya les +pdfjs-find-not-found = Konngi njiyataa + +## Predefined zoom values + +pdfjs-page-scale-width = Njaajeendi Hello +pdfjs-page-scale-fit = Keƴeendi Hello +pdfjs-page-scale-auto = Loongorde Jaajol +pdfjs-page-scale-actual = Ɓetol Jaati +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Juumre waɗii tuma nde loowata PDF oo. +pdfjs-invalid-file-error = Fiilde PDF moƴƴaani walla jiibii. +pdfjs-missing-file-error = Fiilde PDF ena ŋakki. +pdfjs-unexpected-response-error = Jaabtol sarworde tijjinooka. +pdfjs-rendering-error = Juumre waɗii tuma nde yoŋkittoo hello. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Siiftannde] + +## Password + +pdfjs-password-label = Naatu finnde ngam uddite ndee fiilde PDF. +pdfjs-password-invalid = Finnde moƴƴaani. Tiiɗno eto kadi. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Haaytu +pdfjs-web-fonts-disabled = Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/fi/viewer.ftl b/public/pdfjs/web/locale/fi/viewer.ftl new file mode 100644 index 0000000..0819d0e --- /dev/null +++ b/public/pdfjs/web/locale/fi/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Edellinen sivu +pdfjs-previous-button-label = Edellinen +pdfjs-next-button = + .title = Seuraava sivu +pdfjs-next-button-label = Seuraava +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Sivu +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = Loitonna +pdfjs-zoom-out-button-label = Loitonna +pdfjs-zoom-in-button = + .title = Lähennä +pdfjs-zoom-in-button-label = Lähennä +pdfjs-zoom-select = + .title = Suurennus +pdfjs-presentation-mode-button = + .title = Siirry esitystilaan +pdfjs-presentation-mode-button-label = Esitystila +pdfjs-open-file-button = + .title = Avaa tiedosto +pdfjs-open-file-button-label = Avaa +pdfjs-print-button = + .title = Tulosta +pdfjs-print-button-label = Tulosta +pdfjs-save-button = + .title = Tallenna +pdfjs-save-button-label = Tallenna +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Lataa +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Lataa +pdfjs-bookmark-button = + .title = Nykyinen sivu (Näytä URL-osoite nykyiseltä sivulta) +pdfjs-bookmark-button-label = Nykyinen sivu + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tools +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Siirry ensimmäiselle sivulle +pdfjs-first-page-button-label = Siirry ensimmäiselle sivulle +pdfjs-last-page-button = + .title = Siirry viimeiselle sivulle +pdfjs-last-page-button-label = Siirry viimeiselle sivulle +pdfjs-page-rotate-cw-button = + .title = Kierrä oikealle +pdfjs-page-rotate-cw-button-label = Kierrä oikealle +pdfjs-page-rotate-ccw-button = + .title = Kierrä vasemmalle +pdfjs-page-rotate-ccw-button-label = Kierrä vasemmalle +pdfjs-cursor-text-select-tool-button = + .title = Käytä tekstinvalintatyökalua +pdfjs-cursor-text-select-tool-button-label = Tekstinvalintatyökalu +pdfjs-cursor-hand-tool-button = + .title = Käytä käsityökalua +pdfjs-cursor-hand-tool-button-label = Käsityökalu +pdfjs-scroll-page-button = + .title = Käytä sivun vieritystä +pdfjs-scroll-page-button-label = Sivun vieritys +pdfjs-scroll-vertical-button = + .title = Käytä pystysuuntaista vieritystä +pdfjs-scroll-vertical-button-label = Pystysuuntainen vieritys +pdfjs-scroll-horizontal-button = + .title = Käytä vaakasuuntaista vieritystä +pdfjs-scroll-horizontal-button-label = Vaakasuuntainen vieritys +pdfjs-scroll-wrapped-button = + .title = Käytä rivittyvää vieritystä +pdfjs-scroll-wrapped-button-label = Rivittyvä vieritys +pdfjs-spread-none-button = + .title = Älä yhdistä sivuja aukeamiksi +pdfjs-spread-none-button-label = Ei aukeamia +pdfjs-spread-odd-button = + .title = Yhdistä sivut aukeamiksi alkaen parittomalta sivulta +pdfjs-spread-odd-button-label = Parittomalta alkavat aukeamat +pdfjs-spread-even-button = + .title = Yhdistä sivut aukeamiksi alkaen parilliselta sivulta +pdfjs-spread-even-button-label = Parilliselta alkavat aukeamat + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentin ominaisuudet… +pdfjs-document-properties-button-label = Dokumentin ominaisuudet… +pdfjs-document-properties-file-name = Tiedoston nimi: +pdfjs-document-properties-file-size = Tiedoston koko: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kt ({ $b } tavua) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mt ({ $b } tavua) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kt ({ $size_b } tavua) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } Mt ({ $size_b } tavua) +pdfjs-document-properties-title = Otsikko: +pdfjs-document-properties-author = Tekijä: +pdfjs-document-properties-subject = Aihe: +pdfjs-document-properties-keywords = Avainsanat: +pdfjs-document-properties-creation-date = Luomispäivämäärä: +pdfjs-document-properties-modification-date = Muokkauspäivämäärä: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Luoja: +pdfjs-document-properties-producer = PDF-tuottaja: +pdfjs-document-properties-version = PDF-versio: +pdfjs-document-properties-page-count = Sivujen määrä: +pdfjs-document-properties-page-size = Sivun koko: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = pysty +pdfjs-document-properties-page-size-orientation-landscape = vaaka +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Nopea web-katselu: +pdfjs-document-properties-linearized-yes = Kyllä +pdfjs-document-properties-linearized-no = Ei +pdfjs-document-properties-close-button = Sulje + +## Print + +pdfjs-print-progress-message = Valmistellaan dokumenttia tulostamista varten… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Peruuta +pdfjs-printing-not-supported = Varoitus: Selain ei tue kaikkia tulostustapoja. +pdfjs-printing-not-ready = Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Näytä/piilota sivupaneeli +pdfjs-toggle-sidebar-notification-button = + .title = Näytä/piilota sivupaneeli (dokumentissa on sisällys/liitteitä/tasoja) +pdfjs-toggle-sidebar-button-label = Näytä/piilota sivupaneeli +pdfjs-document-outline-button = + .title = Näytä dokumentin sisällys (laajenna tai kutista kohdat kaksoisnapsauttamalla) +pdfjs-document-outline-button-label = Dokumentin sisällys +pdfjs-attachments-button = + .title = Näytä liitteet +pdfjs-attachments-button-label = Liitteet +pdfjs-layers-button = + .title = Näytä tasot (kaksoisnapsauta palauttaaksesi kaikki tasot oletustilaan) +pdfjs-layers-button-label = Tasot +pdfjs-thumbs-button = + .title = Näytä pienoiskuvat +pdfjs-thumbs-button-label = Pienoiskuvat +pdfjs-current-outline-item-button = + .title = Etsi nykyinen sisällyksen kohta +pdfjs-current-outline-item-button-label = Nykyinen sisällyksen kohta +pdfjs-findbar-button = + .title = Etsi dokumentista +pdfjs-findbar-button-label = Etsi +pdfjs-additional-layers = Lisätasot + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Sivu { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Pienoiskuva sivusta { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Etsi + .placeholder = Etsi dokumentista… +pdfjs-find-previous-button = + .title = Etsi hakusanan edellinen osuma +pdfjs-find-previous-button-label = Edellinen +pdfjs-find-next-button = + .title = Etsi hakusanan seuraava osuma +pdfjs-find-next-button-label = Seuraava +pdfjs-find-highlight-checkbox = Korosta kaikki +pdfjs-find-match-case-checkbox-label = Huomioi kirjainkoko +pdfjs-find-match-diacritics-checkbox-label = Erota tarkkeet +pdfjs-find-entire-word-checkbox-label = Kokonaiset sanat +pdfjs-find-reached-top = Päästiin dokumentin alkuun, jatketaan lopusta +pdfjs-find-reached-bottom = Päästiin dokumentin loppuun, jatketaan alusta +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } / { $total } osuma + *[other] { $current } / { $total } osumaa + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Yli { $limit } osuma + *[other] Yli { $limit } osumaa + } +pdfjs-find-not-found = Hakusanaa ei löytynyt + +## Predefined zoom values + +pdfjs-page-scale-width = Sivun leveys +pdfjs-page-scale-fit = Koko sivu +pdfjs-page-scale-auto = Automaattinen suurennus +pdfjs-page-scale-actual = Todellinen koko +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Sivu { $page } + +## Loading indicator messages + +pdfjs-loading-error = Tapahtui virhe ladattaessa PDF-tiedostoa. +pdfjs-invalid-file-error = Virheellinen tai vioittunut PDF-tiedosto. +pdfjs-missing-file-error = Puuttuva PDF-tiedosto. +pdfjs-unexpected-response-error = Odottamaton vastaus palvelimelta. +pdfjs-rendering-error = Tapahtui virhe piirrettäessä sivua. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }-merkintä] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Kirjoita PDF-tiedoston salasana. +pdfjs-password-invalid = Virheellinen salasana. Yritä uudestaan. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Peruuta +pdfjs-web-fonts-disabled = Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja. + +## Editing + +pdfjs-editor-free-text-button = + .title = Teksti +pdfjs-editor-free-text-button-label = Teksti +pdfjs-editor-ink-button = + .title = Piirros +pdfjs-editor-ink-button-label = Piirros +pdfjs-editor-stamp-button = + .title = Lisää tai muokkaa kuvia +pdfjs-editor-stamp-button-label = Lisää tai muokkaa kuvia +pdfjs-editor-highlight-button = + .title = Korostus +pdfjs-editor-highlight-button-label = Korostus +pdfjs-highlight-floating-button1 = + .title = Korostus + .aria-label = Korostus +pdfjs-highlight-floating-button-label = Korostus + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Poista piirros +pdfjs-editor-remove-freetext-button = + .title = Poista teksti +pdfjs-editor-remove-stamp-button = + .title = Poista kuva +pdfjs-editor-remove-highlight-button = + .title = Poista korostus + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Väri +pdfjs-editor-free-text-size-input = Koko +pdfjs-editor-ink-color-input = Väri +pdfjs-editor-ink-thickness-input = Paksuus +pdfjs-editor-ink-opacity-input = Peittävyys +pdfjs-editor-stamp-add-image-button = + .title = Lisää kuva +pdfjs-editor-stamp-add-image-button-label = Lisää kuva +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Paksuus +pdfjs-editor-free-highlight-thickness-title = + .title = Muuta paksuutta korostaessasi muita kohteita kuin tekstiä +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstimuokkain + .default-content = Aloita kirjoittaminen… +pdfjs-free-text = + .aria-label = Tekstimuokkain +pdfjs-free-text-default-content = Aloita kirjoittaminen… +pdfjs-ink = + .aria-label = Piirrustusmuokkain +pdfjs-ink-canvas = + .aria-label = Käyttäjän luoma kuva + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Vaihtoehtoinen teksti +pdfjs-editor-alt-text-edit-button = + .aria-label = Muokkaa vaihtoehtoista tekstiä +pdfjs-editor-alt-text-edit-button-label = Muokkaa vaihtoehtoista tekstiä +pdfjs-editor-alt-text-dialog-label = Valitse vaihtoehto +pdfjs-editor-alt-text-dialog-description = Vaihtoehtoinen teksti ("alt-teksti") auttaa ihmisiä, jotka eivät näe kuvaa tai kun kuva ei lataudu. +pdfjs-editor-alt-text-add-description-label = Lisää kuvaus +pdfjs-editor-alt-text-add-description-description = Pyri 1-2 lauseeseen, jotka kuvaavat aihetta, ympäristöä tai toimintaa. +pdfjs-editor-alt-text-mark-decorative-label = Merkitse koristeelliseksi +pdfjs-editor-alt-text-mark-decorative-description = Tätä käytetään koristekuville, kuten reunuksille tai vesileimoille. +pdfjs-editor-alt-text-cancel-button = Peruuta +pdfjs-editor-alt-text-save-button = Tallenna +pdfjs-editor-alt-text-decorative-tooltip = Merkitty koristeelliseksi +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Esimerkiksi "Nuori mies istuu pöytään syömään aterian" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Vaihtoehtoinen teksti + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Vasen yläkulma - muuta kokoa +pdfjs-editor-resizer-label-top-middle = Ylhäällä keskellä - muuta kokoa +pdfjs-editor-resizer-label-top-right = Oikea yläkulma - muuta kokoa +pdfjs-editor-resizer-label-middle-right = Keskellä oikealla - muuta kokoa +pdfjs-editor-resizer-label-bottom-right = Oikea alakulma - muuta kokoa +pdfjs-editor-resizer-label-bottom-middle = Alhaalla keskellä - muuta kokoa +pdfjs-editor-resizer-label-bottom-left = Vasen alakulma - muuta kokoa +pdfjs-editor-resizer-label-middle-left = Keskellä vasemmalla - muuta kokoa +pdfjs-editor-resizer-top-left = + .aria-label = Vasen yläkulma - muuta kokoa +pdfjs-editor-resizer-top-middle = + .aria-label = Ylhäällä keskellä - muuta kokoa +pdfjs-editor-resizer-top-right = + .aria-label = Oikea yläkulma - muuta kokoa +pdfjs-editor-resizer-middle-right = + .aria-label = Keskellä oikealla - muuta kokoa +pdfjs-editor-resizer-bottom-right = + .aria-label = Oikea alakulma - muuta kokoa +pdfjs-editor-resizer-bottom-middle = + .aria-label = Alhaalla keskellä - muuta kokoa +pdfjs-editor-resizer-bottom-left = + .aria-label = Vasen alakulma - muuta kokoa +pdfjs-editor-resizer-middle-left = + .aria-label = Keskellä vasemmalla - muuta kokoa + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Korostusväri +pdfjs-editor-colorpicker-button = + .title = Vaihda väri +pdfjs-editor-colorpicker-dropdown = + .aria-label = Värivalinnat +pdfjs-editor-colorpicker-yellow = + .title = Keltainen +pdfjs-editor-colorpicker-green = + .title = Vihreä +pdfjs-editor-colorpicker-blue = + .title = Sininen +pdfjs-editor-colorpicker-pink = + .title = Pinkki +pdfjs-editor-colorpicker-red = + .title = Punainen + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Näytä kaikki +pdfjs-editor-highlight-show-all-button = + .title = Näytä kaikki + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Muokkaa vaihtoehtoista tekstiä (kuvan kuvaus) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Lisää vaihtoehtoinen teksti (kuvan kuvaus) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Kirjoita kuvaus tähän… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Lyhyt kuvaus ihmisille, jotka eivät näe kuvaa tai kun kuva ei lataudu. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tämä vaihtoehtoinen teksti luotiin automaattisesti, ja se voi olla epätarkka. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Lue lisää +pdfjs-editor-new-alt-text-create-automatically-button-label = Luo vaihtoehtoinen teksti automaattisesti +pdfjs-editor-new-alt-text-not-now-button = Ei nyt +pdfjs-editor-new-alt-text-error-title = Vaihtoehtotekstiä ei voitu luoda automaattisesti +pdfjs-editor-new-alt-text-error-description = Kirjoita oma vaihtoehtoinen teksti tai yritä myöhemmin uudelleen. +pdfjs-editor-new-alt-text-error-close-button = Sulje +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Ladataan vaihtoehtoisen tekstin tekoälymallia ({ $downloadedSize } / { $totalSize } Mt) + .aria-valuetext = Ladataan vaihtoehtoisen tekstin tekoälymallia ({ $downloadedSize } / { $totalSize } Mt) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Vaihtoehtoinen teksti lisätty +pdfjs-editor-new-alt-text-added-button-label = Vaihtoehtoinen teksti lisätty +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Vaihtoehtoinen teksti puuttuu +pdfjs-editor-new-alt-text-missing-button-label = Vaihtoehtoinen teksti puuttuu +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Tarkista vaihtoehtoinen teksti +pdfjs-editor-new-alt-text-to-review-button-label = Tarkista vaihtoehtoinen teksti +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Luotu automaattisesti: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Kuvan vaihtoehtoisen tekstin asetukset +pdfjs-image-alt-text-settings-button-label = Kuvan vaihtoehtoisen tekstin asetukset +pdfjs-editor-alt-text-settings-dialog-label = Kuvan vaihtoehtoisen tekstin asetukset +pdfjs-editor-alt-text-settings-automatic-title = Automaattinen vaihtoehtoinen teksti +pdfjs-editor-alt-text-settings-create-model-button-label = Luo vaihtoehtoinen teksti automaattisesti +pdfjs-editor-alt-text-settings-create-model-description = Ehdottaa kuvauksia, jotka auttavat ihmisiä, jotka eivät näe kuvaa tai kun kuva ei lataudu. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Vaihtoehtoisen tekstin tekoälymalli ({ $totalSize } Mt) +pdfjs-editor-alt-text-settings-ai-model-description = Toimii paikallisesti laitteellasi, joten tietosi pysyvät yksityisinä. Vaadittu automaattiselle vaihtoehtoiselle tekstille. +pdfjs-editor-alt-text-settings-delete-model-button = Poista +pdfjs-editor-alt-text-settings-download-model-button = Lataa +pdfjs-editor-alt-text-settings-downloading-model-button = Ladataan… +pdfjs-editor-alt-text-settings-editor-title = Vaihtoehtoisen tekstin muokkain +pdfjs-editor-alt-text-settings-show-dialog-button-label = Näytä vaihtoehtoisen tekstin muokkain heti, kun lisäät kuvan +pdfjs-editor-alt-text-settings-show-dialog-description = Auttaa varmistamaan, että kaikissa kuvissasi on vaihtoehtoinen teksti. +pdfjs-editor-alt-text-settings-close-button = Sulje + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Korostus poistettu +pdfjs-editor-undo-bar-message-freetext = Teksti poistettu +pdfjs-editor-undo-bar-message-ink = Piirustus poistettu +pdfjs-editor-undo-bar-message-stamp = Kuva poistettu +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } merkintä poistettu + *[other] { $count } merkintää poistettu + } +pdfjs-editor-undo-bar-undo-button = + .title = Kumoa +pdfjs-editor-undo-bar-undo-button-label = Kumoa +pdfjs-editor-undo-bar-close-button = + .title = Sulje +pdfjs-editor-undo-bar-close-button-label = Sulje diff --git a/public/pdfjs/web/locale/fr/viewer.ftl b/public/pdfjs/web/locale/fr/viewer.ftl new file mode 100644 index 0000000..d0a778f --- /dev/null +++ b/public/pdfjs/web/locale/fr/viewer.ftl @@ -0,0 +1,511 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Page précédente +pdfjs-previous-button-label = Précédent +pdfjs-next-button = + .title = Page suivante +pdfjs-next-button-label = Suivant +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Page +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = sur { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } sur { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom arrière +pdfjs-zoom-out-button-label = Zoom arrière +pdfjs-zoom-in-button = + .title = Zoom avant +pdfjs-zoom-in-button-label = Zoom avant +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Basculer en mode présentation +pdfjs-presentation-mode-button-label = Mode présentation +pdfjs-open-file-button = + .title = Ouvrir le fichier +pdfjs-open-file-button-label = Ouvrir le fichier +pdfjs-print-button = + .title = Imprimer +pdfjs-print-button-label = Imprimer +pdfjs-save-button = + .title = Enregistrer +pdfjs-save-button-label = Enregistrer +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Télécharger +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Télécharger +pdfjs-bookmark-button = + .title = Page courante (montrer l’adresse de la page courante) +pdfjs-bookmark-button-label = Page courante + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Outils +pdfjs-tools-button-label = Outils +pdfjs-first-page-button = + .title = Aller à la première page +pdfjs-first-page-button-label = Aller à la première page +pdfjs-last-page-button = + .title = Aller à la dernière page +pdfjs-last-page-button-label = Aller à la dernière page +pdfjs-page-rotate-cw-button = + .title = Rotation horaire +pdfjs-page-rotate-cw-button-label = Rotation horaire +pdfjs-page-rotate-ccw-button = + .title = Rotation antihoraire +pdfjs-page-rotate-ccw-button-label = Rotation antihoraire +pdfjs-cursor-text-select-tool-button = + .title = Activer l’outil de sélection de texte +pdfjs-cursor-text-select-tool-button-label = Outil de sélection de texte +pdfjs-cursor-hand-tool-button = + .title = Activer l’outil main +pdfjs-cursor-hand-tool-button-label = Outil main +pdfjs-scroll-page-button = + .title = Utiliser le défilement par page +pdfjs-scroll-page-button-label = Défilement par page +pdfjs-scroll-vertical-button = + .title = Utiliser le défilement vertical +pdfjs-scroll-vertical-button-label = Défilement vertical +pdfjs-scroll-horizontal-button = + .title = Utiliser le défilement horizontal +pdfjs-scroll-horizontal-button-label = Défilement horizontal +pdfjs-scroll-wrapped-button = + .title = Utiliser le défilement par bloc +pdfjs-scroll-wrapped-button-label = Défilement par bloc +pdfjs-spread-none-button = + .title = Ne pas afficher les pages deux à deux +pdfjs-spread-none-button-label = Pas de double affichage +pdfjs-spread-odd-button = + .title = Afficher les pages par deux, impaires à gauche +pdfjs-spread-odd-button-label = Doubles pages, impaires à gauche +pdfjs-spread-even-button = + .title = Afficher les pages par deux, paires à gauche +pdfjs-spread-even-button-label = Doubles pages, paires à gauche + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propriétés du document… +pdfjs-document-properties-button-label = Propriétés du document… +pdfjs-document-properties-file-name = Nom du fichier : +pdfjs-document-properties-file-size = Taille du fichier : +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } Ko ({ $b } octets) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } octets) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } Ko ({ $size_b } octets) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } Mo ({ $size_b } octets) +pdfjs-document-properties-title = Titre : +pdfjs-document-properties-author = Auteur : +pdfjs-document-properties-subject = Sujet : +pdfjs-document-properties-keywords = Mots-clés : +pdfjs-document-properties-creation-date = Date de création : +pdfjs-document-properties-modification-date = Modifié le : +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date } à { $time } +pdfjs-document-properties-creator = Créé par : +pdfjs-document-properties-producer = Outil de conversion PDF : +pdfjs-document-properties-version = Version PDF : +pdfjs-document-properties-page-count = Nombre de pages : +pdfjs-document-properties-page-size = Taille de la page : +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = paysage +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = lettre +pdfjs-document-properties-page-size-name-legal = document juridique + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Affichage rapide des pages web : +pdfjs-document-properties-linearized-yes = Oui +pdfjs-document-properties-linearized-no = Non +pdfjs-document-properties-close-button = Fermer + +## Print + +pdfjs-print-progress-message = Préparation du document pour l’impression… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Annuler +pdfjs-printing-not-supported = Attention : l’impression n’est pas totalement prise en charge par ce navigateur. +pdfjs-printing-not-ready = Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Afficher/Masquer le panneau latéral +pdfjs-toggle-sidebar-notification-button = + .title = Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes/calques) +pdfjs-toggle-sidebar-button-label = Afficher/Masquer le panneau latéral +pdfjs-document-outline-button = + .title = Afficher les signets du document (double-cliquer pour développer/réduire tous les éléments) +pdfjs-document-outline-button-label = Signets du document +pdfjs-attachments-button = + .title = Afficher les pièces jointes +pdfjs-attachments-button-label = Pièces jointes +pdfjs-layers-button = + .title = Afficher les calques (double-cliquer pour réinitialiser tous les calques à l’état par défaut) +pdfjs-layers-button-label = Calques +pdfjs-thumbs-button = + .title = Afficher les vignettes +pdfjs-thumbs-button-label = Vignettes +pdfjs-current-outline-item-button = + .title = Trouver l’élément de plan actuel +pdfjs-current-outline-item-button-label = Élément de plan actuel +pdfjs-findbar-button = + .title = Rechercher dans le document +pdfjs-findbar-button-label = Rechercher +pdfjs-additional-layers = Calques additionnels + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Vignette de la page { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Rechercher + .placeholder = Rechercher dans le document… +pdfjs-find-previous-button = + .title = Trouver l’occurrence précédente de l’expression +pdfjs-find-previous-button-label = Précédent +pdfjs-find-next-button = + .title = Trouver la prochaine occurrence de l’expression +pdfjs-find-next-button-label = Suivant +pdfjs-find-highlight-checkbox = Tout surligner +pdfjs-find-match-case-checkbox-label = Respecter la casse +pdfjs-find-match-diacritics-checkbox-label = Respecter les accents et diacritiques +pdfjs-find-entire-word-checkbox-label = Mots entiers +pdfjs-find-reached-top = Haut de la page atteint, poursuite depuis la fin +pdfjs-find-reached-bottom = Bas de la page atteint, poursuite au début +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = Occurrence { $current } sur { $total } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Plus d’{ $limit } occurrence + *[other] Plus de { $limit } occurrences + } +pdfjs-find-not-found = Expression non trouvée + +## Predefined zoom values + +pdfjs-page-scale-width = Pleine largeur +pdfjs-page-scale-fit = Page entière +pdfjs-page-scale-auto = Zoom automatique +pdfjs-page-scale-actual = Taille réelle +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Page { $page } + +## Loading indicator messages + +pdfjs-loading-error = Une erreur s’est produite lors du chargement du fichier PDF. +pdfjs-invalid-file-error = Fichier PDF invalide ou corrompu. +pdfjs-missing-file-error = Fichier PDF manquant. +pdfjs-unexpected-response-error = Réponse inattendue du serveur. +pdfjs-rendering-error = Une erreur s’est produite lors de l’affichage de la page. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } à { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Annotation { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Veuillez saisir le mot de passe pour ouvrir ce fichier PDF. +pdfjs-password-invalid = Mot de passe incorrect. Veuillez réessayer. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Annuler +pdfjs-web-fonts-disabled = Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texte +pdfjs-editor-free-text-button-label = Texte +pdfjs-editor-ink-button = + .title = Dessiner +pdfjs-editor-ink-button-label = Dessiner +pdfjs-editor-stamp-button = + .title = Ajouter ou modifier des images +pdfjs-editor-stamp-button-label = Ajouter ou modifier des images +pdfjs-editor-highlight-button = + .title = Surligner +pdfjs-editor-highlight-button-label = Surligner +pdfjs-highlight-floating-button1 = + .title = Surligner + .aria-label = Surligner +pdfjs-highlight-floating-button-label = Surligner + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Supprimer le dessin +pdfjs-editor-remove-freetext-button = + .title = Supprimer le texte +pdfjs-editor-remove-stamp-button = + .title = Supprimer l’image +pdfjs-editor-remove-highlight-button = + .title = Supprimer le surlignage + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Couleur +pdfjs-editor-free-text-size-input = Taille +pdfjs-editor-ink-color-input = Couleur +pdfjs-editor-ink-thickness-input = Épaisseur +pdfjs-editor-ink-opacity-input = Opacité +pdfjs-editor-stamp-add-image-button = + .title = Ajouter une image +pdfjs-editor-stamp-add-image-button-label = Ajouter une image +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Épaisseur +pdfjs-editor-free-highlight-thickness-title = + .title = Modifier l’épaisseur pour le surlignage d’éléments non textuels +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Éditeur de texte + .default-content = Commencez à écrire… +pdfjs-free-text = + .aria-label = Éditeur de texte +pdfjs-free-text-default-content = Commencer à écrire… +pdfjs-ink = + .aria-label = Éditeur de dessin +pdfjs-ink-canvas = + .aria-label = Image créée par l’utilisateur·trice + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texte alternatif +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifier le texte alternatif +pdfjs-editor-alt-text-edit-button-label = Modifier le texte alternatif +pdfjs-editor-alt-text-dialog-label = Sélectionnez une option +pdfjs-editor-alt-text-dialog-description = Le texte alternatif est utile lorsque des personnes ne peuvent pas voir l’image ou que l’image ne se charge pas. +pdfjs-editor-alt-text-add-description-label = Ajouter une description +pdfjs-editor-alt-text-add-description-description = Il est conseillé de rédiger une ou deux phrases décrivant le sujet, le cadre ou les actions. +pdfjs-editor-alt-text-mark-decorative-label = Marquer comme décorative +pdfjs-editor-alt-text-mark-decorative-description = Cette option est utilisée pour les images décoratives, comme les bordures ou les filigranes. +pdfjs-editor-alt-text-cancel-button = Annuler +pdfjs-editor-alt-text-save-button = Enregistrer +pdfjs-editor-alt-text-decorative-tooltip = Marquée comme décorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Par exemple, « Un jeune homme est assis à une table pour prendre un repas » +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texte alternatif + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Coin supérieur gauche — redimensionner +pdfjs-editor-resizer-label-top-middle = Milieu haut — redimensionner +pdfjs-editor-resizer-label-top-right = Coin supérieur droit — redimensionner +pdfjs-editor-resizer-label-middle-right = Milieu droit — redimensionner +pdfjs-editor-resizer-label-bottom-right = Coin inférieur droit — redimensionner +pdfjs-editor-resizer-label-bottom-middle = Centre bas — redimensionner +pdfjs-editor-resizer-label-bottom-left = Coin inférieur gauche — redimensionner +pdfjs-editor-resizer-label-middle-left = Milieu gauche — redimensionner +pdfjs-editor-resizer-top-left = + .aria-label = Coin supérieur gauche — redimensionner +pdfjs-editor-resizer-top-middle = + .aria-label = Milieu haut — redimensionner +pdfjs-editor-resizer-top-right = + .aria-label = Coin supérieur droit — redimensionner +pdfjs-editor-resizer-middle-right = + .aria-label = Milieu droit — redimensionner +pdfjs-editor-resizer-bottom-right = + .aria-label = Coin inférieur droit — redimensionner +pdfjs-editor-resizer-bottom-middle = + .aria-label = Centre bas — redimensionner +pdfjs-editor-resizer-bottom-left = + .aria-label = Coin inférieur gauche — redimensionner +pdfjs-editor-resizer-middle-left = + .aria-label = Milieu gauche — redimensionner + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Couleur de surlignage +pdfjs-editor-colorpicker-button = + .title = Changer de couleur +pdfjs-editor-colorpicker-dropdown = + .aria-label = Choix de couleurs +pdfjs-editor-colorpicker-yellow = + .title = Jaune +pdfjs-editor-colorpicker-green = + .title = Vert +pdfjs-editor-colorpicker-blue = + .title = Bleu +pdfjs-editor-colorpicker-pink = + .title = Rose +pdfjs-editor-colorpicker-red = + .title = Rouge + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Tout afficher +pdfjs-editor-highlight-show-all-button = + .title = Tout afficher + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifier le texte alternatif (description de l’image) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Ajouter du texte alternatif (description de l’image) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Rédigez votre description ici… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Courte description pour les personnes qui ne peuvent pas voir l’image ou lorsque l’image ne se charge pas. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ce texte alternatif a été créé automatiquement et peut être inexact. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = En savoir plus +pdfjs-editor-new-alt-text-create-automatically-button-label = Créer automatiquement le texte alternatif +pdfjs-editor-new-alt-text-not-now-button = Pas maintenant +pdfjs-editor-new-alt-text-error-title = Impossible de créer automatiquement le texte alternatif +pdfjs-editor-new-alt-text-error-description = Veuillez rédiger votre propre texte alternatif ou réessayer plus tard. +pdfjs-editor-new-alt-text-error-close-button = Fermer +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Téléchargement du modèle d’IA de texte alternatif ({ $downloadedSize } sur { $totalSize } Mo) + .aria-valuetext = Téléchargement du modèle d’IA de texte alternatif ({ $downloadedSize } sur { $totalSize } Mo) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texte alternatif ajouté +pdfjs-editor-new-alt-text-added-button-label = Texte alternatif ajouté +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Texte alternatif manquant +pdfjs-editor-new-alt-text-missing-button-label = Texte alternatif manquant +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Réviser le texte alternatif +pdfjs-editor-new-alt-text-to-review-button-label = Réviser le texte alternatif +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Créé automatiquement : { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Paramètres du texte alternatif des images +pdfjs-image-alt-text-settings-button-label = Paramètres du texte alternatif des images +pdfjs-editor-alt-text-settings-dialog-label = Paramètres du texte alternatif des images +pdfjs-editor-alt-text-settings-automatic-title = Texte alternatif automatique +pdfjs-editor-alt-text-settings-create-model-button-label = Créer automatiquement le texte alternatif +pdfjs-editor-alt-text-settings-create-model-description = Suggère des descriptions pour aider les personnes qui ne peuvent pas voir l’image ou lorsque l’image ne se charge pas. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modèle d’IA de texte alternatif ({ $totalSize } Mo) +pdfjs-editor-alt-text-settings-ai-model-description = Fonctionne localement sur votre appareil, vos données restent privées. Obligatoire pour la génération automatique de texte alternatif. +pdfjs-editor-alt-text-settings-delete-model-button = Supprimer +pdfjs-editor-alt-text-settings-download-model-button = Télécharger +pdfjs-editor-alt-text-settings-downloading-model-button = Téléchargement… +pdfjs-editor-alt-text-settings-editor-title = Éditeur de texte alternatif +pdfjs-editor-alt-text-settings-show-dialog-button-label = Afficher l’éditeur de texte alternatif immédiatement lors de l’ajout d’une image +pdfjs-editor-alt-text-settings-show-dialog-description = Vous aide à vous assurer que toutes vos images ont du texte alternatif. +pdfjs-editor-alt-text-settings-close-button = Fermer + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Surlignage supprimé +pdfjs-editor-undo-bar-message-freetext = Texte supprimé +pdfjs-editor-undo-bar-message-ink = Dessin supprimé +pdfjs-editor-undo-bar-message-stamp = Image supprimée +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation supprimée + *[other] { $count } annotations supprimées + } +pdfjs-editor-undo-bar-undo-button = + .title = Annuler +pdfjs-editor-undo-bar-undo-button-label = Annuler +pdfjs-editor-undo-bar-close-button = + .title = Fermer +pdfjs-editor-undo-bar-close-button-label = Fermer diff --git a/public/pdfjs/web/locale/fur/viewer.ftl b/public/pdfjs/web/locale/fur/viewer.ftl new file mode 100644 index 0000000..370af3f --- /dev/null +++ b/public/pdfjs/web/locale/fur/viewer.ftl @@ -0,0 +1,485 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagjine precedente +pdfjs-previous-button-label = Indaûr +pdfjs-next-button = + .title = Prossime pagjine +pdfjs-next-button-label = Indevant +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagjine +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = di { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } di { $pagesCount }) +pdfjs-zoom-out-button = + .title = Impiçulìs +pdfjs-zoom-out-button-label = Impiçulìs +pdfjs-zoom-in-button = + .title = Ingrandìs +pdfjs-zoom-in-button-label = Ingrandìs +pdfjs-zoom-select = + .title = Ingrandiment +pdfjs-presentation-mode-button = + .title = Passe ae modalitât presentazion +pdfjs-presentation-mode-button-label = Modalitât presentazion +pdfjs-open-file-button = + .title = Vierç un file +pdfjs-open-file-button-label = Vierç +pdfjs-print-button = + .title = Stampe +pdfjs-print-button-label = Stampe +pdfjs-save-button = + .title = Salve +pdfjs-save-button-label = Salve +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Discjame +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Discjame +pdfjs-bookmark-button = + .title = Pagjine corinte (mostre URL de pagjine atuâl) +pdfjs-bookmark-button-label = Pagjine corinte + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Struments +pdfjs-tools-button-label = Struments +pdfjs-first-page-button = + .title = Va ae prime pagjine +pdfjs-first-page-button-label = Va ae prime pagjine +pdfjs-last-page-button = + .title = Va ae ultime pagjine +pdfjs-last-page-button-label = Va ae ultime pagjine +pdfjs-page-rotate-cw-button = + .title = Zire in sens orari +pdfjs-page-rotate-cw-button-label = Zire in sens orari +pdfjs-page-rotate-ccw-button = + .title = Zire in sens antiorari +pdfjs-page-rotate-ccw-button-label = Zire in sens antiorari +pdfjs-cursor-text-select-tool-button = + .title = Ative il strument di selezion dal test +pdfjs-cursor-text-select-tool-button-label = Strument di selezion dal test +pdfjs-cursor-hand-tool-button = + .title = Ative il strument manute +pdfjs-cursor-hand-tool-button-label = Strument manute +pdfjs-scroll-page-button = + .title = Dopre il scoriment des pagjinis +pdfjs-scroll-page-button-label = Scoriment pagjinis +pdfjs-scroll-vertical-button = + .title = Dopre scoriment verticâl +pdfjs-scroll-vertical-button-label = Scoriment verticâl +pdfjs-scroll-horizontal-button = + .title = Dopre scoriment orizontâl +pdfjs-scroll-horizontal-button-label = Scoriment orizontâl +pdfjs-scroll-wrapped-button = + .title = Dopre scoriment par blocs +pdfjs-scroll-wrapped-button-label = Scoriment par blocs +pdfjs-spread-none-button = + .title = No sta meti dongje pagjinis in cubie +pdfjs-spread-none-button-label = No cubiis di pagjinis +pdfjs-spread-odd-button = + .title = Met dongje cubiis di pagjinis scomençant des pagjinis dispar +pdfjs-spread-odd-button-label = Cubiis di pagjinis, dispar a çampe +pdfjs-spread-even-button = + .title = Met dongje cubiis di pagjinis scomençant des pagjinis pâr +pdfjs-spread-even-button-label = Cubiis di pagjinis, pâr a çampe + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Proprietâts dal document… +pdfjs-document-properties-button-label = Proprietâts dal document… +pdfjs-document-properties-file-name = Non dal file: +pdfjs-document-properties-file-size = Dimension dal file: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titul: +pdfjs-document-properties-author = Autôr: +pdfjs-document-properties-subject = Ogjet: +pdfjs-document-properties-keywords = Peraulis clâf: +pdfjs-document-properties-creation-date = Date di creazion: +pdfjs-document-properties-modification-date = Date di modifiche: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creatôr +pdfjs-document-properties-producer = Gjeneradôr PDF: +pdfjs-document-properties-version = Version PDF: +pdfjs-document-properties-page-count = Numar di pagjinis: +pdfjs-document-properties-page-size = Dimension de pagjine: +pdfjs-document-properties-page-size-unit-inches = oncis +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = verticâl +pdfjs-document-properties-page-size-orientation-landscape = orizontâl +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letare +pdfjs-document-properties-page-size-name-legal = Legâl + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Visualizazion web svelte: +pdfjs-document-properties-linearized-yes = Sì +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Siere + +## Print + +pdfjs-print-progress-message = Daûr a prontâ il document pe stampe… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Anule +pdfjs-printing-not-supported = Atenzion: la stampe no je supuartade ad implen di chest navigadôr. +pdfjs-printing-not-ready = Atenzion: il PDF nol è stât cjamât dal dut pe stampe. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Ative/Disative sbare laterâl +pdfjs-toggle-sidebar-notification-button = + .title = Ative/Disative sbare laterâl (il document al conten struture/zontis/strâts) +pdfjs-toggle-sidebar-button-label = Ative/Disative sbare laterâl +pdfjs-document-outline-button = + .title = Mostre la struture dal document (dopli clic par slargjâ/strenzi ducj i elements) +pdfjs-document-outline-button-label = Struture dal document +pdfjs-attachments-button = + .title = Mostre lis zontis +pdfjs-attachments-button-label = Zontis +pdfjs-layers-button = + .title = Mostre i strâts (dopli clic par ristabilî ducj i strâts al stât predefinît) +pdfjs-layers-button-label = Strâts +pdfjs-thumbs-button = + .title = Mostre miniaturis +pdfjs-thumbs-button-label = Miniaturis +pdfjs-current-outline-item-button = + .title = Cjate l'element de struture atuâl +pdfjs-current-outline-item-button-label = Element de struture atuâl +pdfjs-findbar-button = + .title = Cjate tal document +pdfjs-findbar-button-label = Cjate +pdfjs-additional-layers = Strâts adizionâi + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagjine { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniature de pagjine { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Cjate + .placeholder = Cjate tal document… +pdfjs-find-previous-button = + .title = Cjate il câs precedent dal test +pdfjs-find-previous-button-label = Precedent +pdfjs-find-next-button = + .title = Cjate il câs sucessîf dal test +pdfjs-find-next-button-label = Sucessîf +pdfjs-find-highlight-checkbox = Evidenzie dut +pdfjs-find-match-case-checkbox-label = Fâs distinzion tra maiusculis e minusculis +pdfjs-find-match-diacritics-checkbox-label = Corispondence diacritiche +pdfjs-find-entire-word-checkbox-label = Peraulis interiis +pdfjs-find-reached-top = Si è rivâts al inizi dal document e si à continuât de fin +pdfjs-find-reached-bottom = Si è rivât ae fin dal document e si à continuât dal inizi +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } di { $total } corispondence + *[other] { $current } di { $total } corispondencis + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Plui di { $limit } corispondence + *[other] Plui di { $limit } corispondencis + } +pdfjs-find-not-found = Test no cjatât + +## Predefined zoom values + +pdfjs-page-scale-width = Largjece de pagjine +pdfjs-page-scale-fit = Pagjine interie +pdfjs-page-scale-auto = Ingrandiment automatic +pdfjs-page-scale-actual = Dimension reâl +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagjine { $page } + +## Loading indicator messages + +pdfjs-loading-error = Al è vignût fûr un erôr intant che si cjariave il PDF. +pdfjs-invalid-file-error = File PDF no valit o ruvinât. +pdfjs-missing-file-error = Al mancje il file PDF. +pdfjs-unexpected-response-error = Rispueste dal servidôr inspietade. +pdfjs-rendering-error = Al è vignût fûr un erôr tal realizâ la visualizazion de pagjine. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotazion { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Inserìs la password par vierzi chest file PDF. +pdfjs-password-invalid = Password no valide. Par plasê torne prove. +pdfjs-password-ok-button = Va ben +pdfjs-password-cancel-button = Anule +pdfjs-web-fonts-disabled = I caratars dal Web a son disativâts: Impussibil doprâ i caratars PDF incorporâts. + +## Editing + +pdfjs-editor-free-text-button = + .title = Test +pdfjs-editor-free-text-button-label = Test +pdfjs-editor-ink-button = + .title = Dissen +pdfjs-editor-ink-button-label = Dissen +pdfjs-editor-stamp-button = + .title = Zonte o modifiche imagjins +pdfjs-editor-stamp-button-label = Zonte o modifiche imagjins +pdfjs-editor-highlight-button = + .title = Evidenzie +pdfjs-editor-highlight-button-label = Evidenzie +pdfjs-highlight-floating-button1 = + .title = Evidenzie + .aria-label = Evidenzie +pdfjs-highlight-floating-button-label = Evidenzie + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Gjave dissen +pdfjs-editor-remove-freetext-button = + .title = Gjave test +pdfjs-editor-remove-stamp-button = + .title = Gjave imagjin +pdfjs-editor-remove-highlight-button = + .title = Gjave evidenziazion + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Colôr +pdfjs-editor-free-text-size-input = Dimension +pdfjs-editor-ink-color-input = Colôr +pdfjs-editor-ink-thickness-input = Spessôr +pdfjs-editor-ink-opacity-input = Opacitât +pdfjs-editor-stamp-add-image-button = + .title = Zonte imagjin +pdfjs-editor-stamp-add-image-button-label = Zonte imagjin +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Spessôr +pdfjs-editor-free-highlight-thickness-title = + .title = Modifiche il spessôr de selezion pai elements che no son testuâi +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editôr di test + .default-content = Scomence a scrivi… +pdfjs-free-text = + .aria-label = Editôr di test +pdfjs-free-text-default-content = Scomence a scrivi… +pdfjs-ink = + .aria-label = Editôr dissens +pdfjs-ink-canvas = + .aria-label = Imagjin creade dal utent + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button-label = Test alternatîf +pdfjs-editor-alt-text-edit-button-label = Modifiche test alternatîf +pdfjs-editor-alt-text-dialog-label = Sielç une opzion +pdfjs-editor-alt-text-dialog-description = Il test alternatîf (“alt text”) al jude cuant che lis personis no puedin viodi la imagjin o cuant che la imagjine no ven cjariade. +pdfjs-editor-alt-text-add-description-label = Zonte une descrizion +pdfjs-editor-alt-text-add-description-description = Ponte a une o dôs frasis che a descrivin l’argoment, la ambientazion o lis azions. +pdfjs-editor-alt-text-mark-decorative-label = Segne come decorative +pdfjs-editor-alt-text-mark-decorative-description = Chest al ven doprât pes imagjins ornamentâls, come i ôrs o lis filigranis. +pdfjs-editor-alt-text-cancel-button = Anule +pdfjs-editor-alt-text-save-button = Salve +pdfjs-editor-alt-text-decorative-tooltip = Segnade come decorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Par esempli, “Un zovin si sente a taule par mangjâ” + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Cjanton in alt a çampe — ridimensione +pdfjs-editor-resizer-label-top-middle = Bande superiôr tal mieç — ridimensione +pdfjs-editor-resizer-label-top-right = Cjanton in alt a diestre — ridimensione +pdfjs-editor-resizer-label-middle-right = Bande diestre tal mieç — ridimensione +pdfjs-editor-resizer-label-bottom-right = Cjanton in bas a diestre — ridimensione +pdfjs-editor-resizer-label-bottom-middle = Bande inferiôr tal mieç — ridimensione +pdfjs-editor-resizer-label-bottom-left = Cjanton in bas a çampe — ridimensione +pdfjs-editor-resizer-label-middle-left = Bande di çampe tal mieç — ridimensione +pdfjs-editor-resizer-top-left = + .aria-label = Cjanton in alt a çampe — ridimensione +pdfjs-editor-resizer-top-middle = + .aria-label = Bande superiôr tal mieç — ridimensione +pdfjs-editor-resizer-top-right = + .aria-label = Cjanton in alt a diestre — ridimensione +pdfjs-editor-resizer-middle-right = + .aria-label = Bande diestre tal mieç — ridimensione +pdfjs-editor-resizer-bottom-right = + .aria-label = Cjanton in bas a diestre — ridimensione +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bande inferiôr tal mieç — ridimensione +pdfjs-editor-resizer-bottom-left = + .aria-label = Cjanton in bas a çampe — ridimensione +pdfjs-editor-resizer-middle-left = + .aria-label = Bande di çampe tal mieç — ridimensione + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Colôr par evidenziâ +pdfjs-editor-colorpicker-button = + .title = Cambie colôr +pdfjs-editor-colorpicker-dropdown = + .aria-label = Sieltis di colôr +pdfjs-editor-colorpicker-yellow = + .title = Zâl +pdfjs-editor-colorpicker-green = + .title = Vert +pdfjs-editor-colorpicker-blue = + .title = Blu +pdfjs-editor-colorpicker-pink = + .title = Rose +pdfjs-editor-colorpicker-red = + .title = Ros + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostre dut +pdfjs-editor-highlight-show-all-button = + .title = Mostre dut + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifiche test alternatîf (descrizion de imagjin) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Zonte test alternatîf (descrizion de imagjin) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scrîf achì la tô descrizion… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Curte descrizion par personis che no rivin a viodi la imagjin, o che e ven mostrade cuant che no si rive a cjariâle. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Chest test alternatîf al è stât creât in automatic e al è pussibil che nol sedi cret. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Plui informazions +pdfjs-editor-new-alt-text-create-automatically-button-label = Cree test alternatîf in automatic +pdfjs-editor-new-alt-text-not-now-button = No cumò +pdfjs-editor-new-alt-text-error-title = Impussibil creâ test alternatîf in automatic +pdfjs-editor-new-alt-text-error-description = Scrîf il to test alternatîf o prove plui tart. +pdfjs-editor-new-alt-text-error-close-button = Siere +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Daûr a discjariâil model IA pal test alternatîf ({ $downloadedSize } di { $totalSize } MB) + .aria-valuetext = Daûr a discjariâ il model IA pal test alternatîf ({ $downloadedSize } di { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button-label = Test alternatîf zontât +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button-label = Al mancje il test alternatîf +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button-label = Verifiche test alternatîf +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creât in automatic: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Impostazions test alternatîf pes imagjins +pdfjs-image-alt-text-settings-button-label = Impostazions test alternatîf pes imagjins +pdfjs-editor-alt-text-settings-dialog-label = Impostazions test alternatîf pes imagjins +pdfjs-editor-alt-text-settings-automatic-title = Test alternatîf automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Cree test alternatîf in automatic +pdfjs-editor-alt-text-settings-create-model-description = Al sugjerìs descrizions par judâ lis personis che no rivin a viodi la imagjin o cuant che la imagjin no ven cjariade. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model IA pal test alternatîf ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Al ven eseguît in locâl sul to dispositîf, cussì che i tiei dâts a restin riservâts. Al è necessari pe gjenerazion automatiche dal test alternatîf. +pdfjs-editor-alt-text-settings-delete-model-button = Elimine +pdfjs-editor-alt-text-settings-download-model-button = Discjame +pdfjs-editor-alt-text-settings-downloading-model-button = Daûr a discjariâ… +pdfjs-editor-alt-text-settings-editor-title = Modifiche test alternatîf +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostre l'editôr dal test alternatîf a pene che e ven zontade une imagjin +pdfjs-editor-alt-text-settings-show-dialog-description = Ti jude a sigurâti che dutis lis tôs imagjins a vedin il test alternatîf. +pdfjs-editor-alt-text-settings-close-button = Siere diff --git a/public/pdfjs/web/locale/fy-NL/viewer.ftl b/public/pdfjs/web/locale/fy-NL/viewer.ftl new file mode 100644 index 0000000..15850b4 --- /dev/null +++ b/public/pdfjs/web/locale/fy-NL/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Foarige side +pdfjs-previous-button-label = Foarige +pdfjs-next-button = + .title = Folgjende side +pdfjs-next-button-label = Folgjende +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Side +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = fan { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } fan { $pagesCount }) +pdfjs-zoom-out-button = + .title = Utzoome +pdfjs-zoom-out-button-label = Utzoome +pdfjs-zoom-in-button = + .title = Ynzoome +pdfjs-zoom-in-button-label = Ynzoome +pdfjs-zoom-select = + .title = Zoome +pdfjs-presentation-mode-button = + .title = Wikselje nei presintaasjemodus +pdfjs-presentation-mode-button-label = Presintaasjemodus +pdfjs-open-file-button = + .title = Bestân iepenje +pdfjs-open-file-button-label = Iepenje +pdfjs-print-button = + .title = Ofdrukke +pdfjs-print-button-label = Ofdrukke +pdfjs-save-button = + .title = Bewarje +pdfjs-save-button-label = Bewarje +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Downloade +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Downloade +pdfjs-bookmark-button = + .title = Aktuele side (URL fan aktuele side besjen) +pdfjs-bookmark-button-label = Aktuele side + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ark +pdfjs-tools-button-label = Ark +pdfjs-first-page-button = + .title = Gean nei earste side +pdfjs-first-page-button-label = Gean nei earste side +pdfjs-last-page-button = + .title = Gean nei lêste side +pdfjs-last-page-button-label = Gean nei lêste side +pdfjs-page-rotate-cw-button = + .title = Rjochtsom draaie +pdfjs-page-rotate-cw-button-label = Rjochtsom draaie +pdfjs-page-rotate-ccw-button = + .title = Linksom draaie +pdfjs-page-rotate-ccw-button-label = Linksom draaie +pdfjs-cursor-text-select-tool-button = + .title = Tekstseleksjehelpmiddel ynskeakelje +pdfjs-cursor-text-select-tool-button-label = Tekstseleksjehelpmiddel +pdfjs-cursor-hand-tool-button = + .title = Hânhelpmiddel ynskeakelje +pdfjs-cursor-hand-tool-button-label = Hânhelpmiddel +pdfjs-scroll-page-button = + .title = Sideskowen brûke +pdfjs-scroll-page-button-label = Sideskowen +pdfjs-scroll-vertical-button = + .title = Fertikaal skowe brûke +pdfjs-scroll-vertical-button-label = Fertikaal skowe +pdfjs-scroll-horizontal-button = + .title = Horizontaal skowe brûke +pdfjs-scroll-horizontal-button-label = Horizontaal skowe +pdfjs-scroll-wrapped-button = + .title = Skowe mei oersjoch brûke +pdfjs-scroll-wrapped-button-label = Skowe mei oersjoch +pdfjs-spread-none-button = + .title = Sidesprieding net gearfetsje +pdfjs-spread-none-button-label = Gjin sprieding +pdfjs-spread-odd-button = + .title = Sidesprieding gearfetsje te starten mei ûneven nûmers +pdfjs-spread-odd-button-label = Uneven sprieding +pdfjs-spread-even-button = + .title = Sidesprieding gearfetsje te starten mei even nûmers +pdfjs-spread-even-button-label = Even sprieding + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokuminteigenskippen… +pdfjs-document-properties-button-label = Dokuminteigenskippen… +pdfjs-document-properties-file-name = Bestânsnamme: +pdfjs-document-properties-file-size = Bestânsgrutte: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Auteur: +pdfjs-document-properties-subject = Underwerp: +pdfjs-document-properties-keywords = Kaaiwurden: +pdfjs-document-properties-creation-date = Oanmaakdatum: +pdfjs-document-properties-modification-date = Bewurkingsdatum: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Makker: +pdfjs-document-properties-producer = PDF-makker: +pdfjs-document-properties-version = PDF-ferzje: +pdfjs-document-properties-page-count = Siden: +pdfjs-document-properties-page-size = Sideformaat: +pdfjs-document-properties-page-size-unit-inches = yn +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = steand +pdfjs-document-properties-page-size-orientation-landscape = lizzend +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Juridysk + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Flugge webwerjefte: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nee +pdfjs-document-properties-close-button = Slute + +## Print + +pdfjs-print-progress-message = Dokumint tariede oar ôfdrukken… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Annulearje +pdfjs-printing-not-supported = Warning: Printen is net folslein stipe troch dizze browser. +pdfjs-printing-not-ready = Warning: PDF is net folslein laden om ôf te drukken. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Sidebalke yn-/útskeakelje +pdfjs-toggle-sidebar-notification-button = + .title = Sidebalke yn-/útskeakelje (dokumint befettet oersjoch/bylagen/lagen) +pdfjs-toggle-sidebar-button-label = Sidebalke yn-/útskeakelje +pdfjs-document-outline-button = + .title = Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen) +pdfjs-document-outline-button-label = Dokumintoersjoch +pdfjs-attachments-button = + .title = Bylagen toane +pdfjs-attachments-button-label = Bylagen +pdfjs-layers-button = + .title = Lagen toane (dûbelklik om alle lagen nei de standertsteat werom te setten) +pdfjs-layers-button-label = Lagen +pdfjs-thumbs-button = + .title = Foarbylden toane +pdfjs-thumbs-button-label = Foarbylden +pdfjs-current-outline-item-button = + .title = Aktueel item yn ynhâldsopjefte sykje +pdfjs-current-outline-item-button-label = Aktueel item yn ynhâldsopjefte +pdfjs-findbar-button = + .title = Sykje yn dokumint +pdfjs-findbar-button-label = Sykje +pdfjs-additional-layers = Oanfoljende lagen + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Foarbyld fan side { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Sykje + .placeholder = Sykje yn dokumint… +pdfjs-find-previous-button = + .title = It foarige foarkommen fan de tekst sykje +pdfjs-find-previous-button-label = Foarige +pdfjs-find-next-button = + .title = It folgjende foarkommen fan de tekst sykje +pdfjs-find-next-button-label = Folgjende +pdfjs-find-highlight-checkbox = Alles markearje +pdfjs-find-match-case-checkbox-label = Haadlettergefoelich +pdfjs-find-match-diacritics-checkbox-label = Diakrityske tekens brûke +pdfjs-find-entire-word-checkbox-label = Hiele wurden +pdfjs-find-reached-top = Boppekant fan dokumint berikt, trochgien fan ûnder ôf +pdfjs-find-reached-bottom = Ein fan dokumint berikt, trochgien fan boppe ôf +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } fan { $total } oerienkomst + *[other] { $current } fan { $total } oerienkomsten + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mear as { $limit } oerienkomst + *[other] Mear as { $limit } oerienkomsten + } +pdfjs-find-not-found = Tekst net fûn + +## Predefined zoom values + +pdfjs-page-scale-width = Sidebreedte +pdfjs-page-scale-fit = Hiele side +pdfjs-page-scale-auto = Automatysk zoome +pdfjs-page-scale-actual = Werklike grutte +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Side { $page } + +## Loading indicator messages + +pdfjs-loading-error = Der is in flater bard by it laden fan de PDF. +pdfjs-invalid-file-error = Ynfalide of korruptearre PDF-bestân. +pdfjs-missing-file-error = PDF-bestân ûntbrekt. +pdfjs-unexpected-response-error = Unferwacht serverantwurd. +pdfjs-rendering-error = Der is in flater bard by it renderjen fan de side. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }-annotaasje] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Jou it wachtwurd om dit PDF-bestân te iepenjen. +pdfjs-password-invalid = Ferkeard wachtwurd. Probearje opnij. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Annulearje +pdfjs-web-fonts-disabled = Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Tekenje +pdfjs-editor-ink-button-label = Tekenje +pdfjs-editor-stamp-button = + .title = Ofbyldingen tafoegje of bewurkje +pdfjs-editor-stamp-button-label = Ofbyldingen tafoegje of bewurkje +pdfjs-editor-highlight-button = + .title = Markearje +pdfjs-editor-highlight-button-label = Markearje +pdfjs-highlight-floating-button1 = + .title = Markearje + .aria-label = Markearje +pdfjs-highlight-floating-button-label = Markearje + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Tekening fuortsmite +pdfjs-editor-remove-freetext-button = + .title = Tekst fuortsmite +pdfjs-editor-remove-stamp-button = + .title = Ofbylding fuortsmite +pdfjs-editor-remove-highlight-button = + .title = Markearring fuortsmite + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Kleur +pdfjs-editor-free-text-size-input = Grutte +pdfjs-editor-ink-color-input = Kleur +pdfjs-editor-ink-thickness-input = Tsjokte +pdfjs-editor-ink-opacity-input = Transparânsje +pdfjs-editor-stamp-add-image-button = + .title = Ofbylding tafoegje +pdfjs-editor-stamp-add-image-button-label = Ofbylding tafoegje +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tsjokte +pdfjs-editor-free-highlight-thickness-title = + .title = Tsjokte wizigje by aksintuearring fan oare items as tekst +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstbewurker + .default-content = Start mei typen… +pdfjs-free-text = + .aria-label = Tekstbewurker +pdfjs-free-text-default-content = Begjin mei typen… +pdfjs-ink = + .aria-label = Tekeningbewurker +pdfjs-ink-canvas = + .aria-label = Troch brûker makke ôfbylding + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternative tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternative tekst bewurkje +pdfjs-editor-alt-text-edit-button-label = Alternative tekst bewurkje +pdfjs-editor-alt-text-dialog-label = Kies in opsje +pdfjs-editor-alt-text-dialog-description = Alternative tekst helpt wannear’t minsken de ôfbylding net sjen kinne of wannear’t dizze net laden wurdt. +pdfjs-editor-alt-text-add-description-label = Foegje in beskriuwing ta +pdfjs-editor-alt-text-add-description-description = Stribje nei 1-2 sinnen dy’t it ûnderwerp, de omjouwing of de aksjes beskriuwe. +pdfjs-editor-alt-text-mark-decorative-label = As dekoratyf markearje +pdfjs-editor-alt-text-mark-decorative-description = Dit wurdt brûkt foar sierlike ôfbyldingen, lykas rânen of wettermerken. +pdfjs-editor-alt-text-cancel-button = Annulearje +pdfjs-editor-alt-text-save-button = Bewarje +pdfjs-editor-alt-text-decorative-tooltip = As dekoratyf markearre +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Bygelyks, ‘In jonge man sit oan in tafel om te iten’ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternative tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Linkerboppehoek – formaat wizigje +pdfjs-editor-resizer-label-top-middle = Midden boppe – formaat wizigje +pdfjs-editor-resizer-label-top-right = Rjochterboppehoek – formaat wizigje +pdfjs-editor-resizer-label-middle-right = Midden rjochts – formaat wizigje +pdfjs-editor-resizer-label-bottom-right = Rjochterûnderhoek – formaat wizigje +pdfjs-editor-resizer-label-bottom-middle = Midden ûnder – formaat wizigje +pdfjs-editor-resizer-label-bottom-left = Linkerûnderhoek – formaat wizigje +pdfjs-editor-resizer-label-middle-left = Links midden – formaat wizigje +pdfjs-editor-resizer-top-left = + .aria-label = Linkerboppehoek – formaat wizigje +pdfjs-editor-resizer-top-middle = + .aria-label = Midden boppe – formaat wizigje +pdfjs-editor-resizer-top-right = + .aria-label = Rjochterboppehoek – formaat wizigje +pdfjs-editor-resizer-middle-right = + .aria-label = Midden rjochts – formaat wizigje +pdfjs-editor-resizer-bottom-right = + .aria-label = Rjochterûnderhoek – formaat wizigje +pdfjs-editor-resizer-bottom-middle = + .aria-label = Midden ûnder – formaat wizigje +pdfjs-editor-resizer-bottom-left = + .aria-label = Linkerûnderhoek – formaat wizigje +pdfjs-editor-resizer-middle-left = + .aria-label = Links midden – formaat wizigje + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Markearringskleur +pdfjs-editor-colorpicker-button = + .title = Kleur wizigje +pdfjs-editor-colorpicker-dropdown = + .aria-label = Kleurkarren +pdfjs-editor-colorpicker-yellow = + .title = Giel +pdfjs-editor-colorpicker-green = + .title = Grien +pdfjs-editor-colorpicker-blue = + .title = Blau +pdfjs-editor-colorpicker-pink = + .title = Roze +pdfjs-editor-colorpicker-red = + .title = Read + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Alles toane +pdfjs-editor-highlight-show-all-button = + .title = Alles toane + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternative tekst (ôfbyldingsbeskriuwing) bewurkje +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternative tekst (ôfbyldingsbeskriuwing) tafoegje +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriuw hjir jo beskriuwing… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Koarte beskriuwing foar minsken dy’t de ôfbylding net sjen kinne of wannear’t de ôfbylding net laden wurdt. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Dizze alternative tekst is automatysk makke en is mooglik net korrekt. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Mear ynfo +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternative tekst automatysk oanmeitsje +pdfjs-editor-new-alt-text-not-now-button = No net +pdfjs-editor-new-alt-text-error-title = Kin alternative tekst net automatysk oanmeitsje +pdfjs-editor-new-alt-text-error-description = Skriuw jo eigen alternative tekst of probearje it letter nochris. +pdfjs-editor-new-alt-text-error-close-button = Slute +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = AI-model foar alternative tekst downloade ({ $downloadedSize } fan { $totalSize } MB) + .aria-valuetext = AI-model foar alternative tekst downloade ({ $downloadedSize } fan { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternative tekst tafoege +pdfjs-editor-new-alt-text-added-button-label = Alternative tekst tafoege +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternative tekst ûntbrekt +pdfjs-editor-new-alt-text-missing-button-label = Alternative tekst ûntbrekt +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternative tekst beoardiele +pdfjs-editor-new-alt-text-to-review-button-label = Alternative tekst beoardiele +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatysk oanmakke: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ynstellingen foar alternative tekst fan ôfbyldingen +pdfjs-image-alt-text-settings-button-label = Ynstellingen foar alternative tekst fan ôfbyldingen +pdfjs-editor-alt-text-settings-dialog-label = Ynstellingen foar alternative tekst fan ôfbyldingen +pdfjs-editor-alt-text-settings-automatic-title = Automatyske alternative tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternative tekst automatysk oanmeitsje +pdfjs-editor-alt-text-settings-create-model-description = Stelt beskriuwingen foar om minsken te helpen dy’t de ôfbylding net sjen kinne of foar wa’t de ôfbylding net laden wurdt. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-model foar alternative tekst ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Wurdt lokaal op jo apparaat útfierd, sadat jo gegevens privee bliuwe. Fereaske foar automatyske alternative tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Fuortsmite +pdfjs-editor-alt-text-settings-download-model-button = Downloade +pdfjs-editor-alt-text-settings-downloading-model-button = Downloade… +pdfjs-editor-alt-text-settings-editor-title = Alternative-tekstbewurker +pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternative-tekstbewurker daliks toane by tafoegjen fan in ôfbylding +pdfjs-editor-alt-text-settings-show-dialog-description = Helpt jo derfoar te soargjen dat al jo ôfbyldingen alternative tekst hawwe. +pdfjs-editor-alt-text-settings-close-button = Slute + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markearring fuortsmiten +pdfjs-editor-undo-bar-message-freetext = Tekst fuortsmiten +pdfjs-editor-undo-bar-message-ink = Tekening fuortsmiten +pdfjs-editor-undo-bar-message-stamp = Ofbylding fuortsmiten +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotaasje fuortsmiten + *[other] { $count } annotaasjes fuortsmiten + } +pdfjs-editor-undo-bar-undo-button = + .title = Ungedien meitsje +pdfjs-editor-undo-bar-undo-button-label = Ungedien meitsje +pdfjs-editor-undo-bar-close-button = + .title = Slute +pdfjs-editor-undo-bar-close-button-label = Slute diff --git a/public/pdfjs/web/locale/ga-IE/viewer.ftl b/public/pdfjs/web/locale/ga-IE/viewer.ftl new file mode 100644 index 0000000..cb59308 --- /dev/null +++ b/public/pdfjs/web/locale/ga-IE/viewer.ftl @@ -0,0 +1,213 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = An Leathanach Roimhe Seo +pdfjs-previous-button-label = Roimhe Seo +pdfjs-next-button = + .title = An Chéad Leathanach Eile +pdfjs-next-button-label = Ar Aghaidh +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Leathanach +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = as { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } as { $pagesCount }) +pdfjs-zoom-out-button = + .title = Súmáil Amach +pdfjs-zoom-out-button-label = Súmáil Amach +pdfjs-zoom-in-button = + .title = Súmáil Isteach +pdfjs-zoom-in-button-label = Súmáil Isteach +pdfjs-zoom-select = + .title = Súmáil +pdfjs-presentation-mode-button = + .title = Úsáid an Mód Láithreoireachta +pdfjs-presentation-mode-button-label = Mód Láithreoireachta +pdfjs-open-file-button = + .title = Oscail Comhad +pdfjs-open-file-button-label = Oscail +pdfjs-print-button = + .title = Priontáil +pdfjs-print-button-label = Priontáil + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Uirlisí +pdfjs-tools-button-label = Uirlisí +pdfjs-first-page-button = + .title = Go dtí an chéad leathanach +pdfjs-first-page-button-label = Go dtí an chéad leathanach +pdfjs-last-page-button = + .title = Go dtí an leathanach deiridh +pdfjs-last-page-button-label = Go dtí an leathanach deiridh +pdfjs-page-rotate-cw-button = + .title = Rothlaigh ar deiseal +pdfjs-page-rotate-cw-button-label = Rothlaigh ar deiseal +pdfjs-page-rotate-ccw-button = + .title = Rothlaigh ar tuathal +pdfjs-page-rotate-ccw-button-label = Rothlaigh ar tuathal +pdfjs-cursor-text-select-tool-button = + .title = Cumasaigh an Uirlis Roghnaithe Téacs +pdfjs-cursor-text-select-tool-button-label = Uirlis Roghnaithe Téacs +pdfjs-cursor-hand-tool-button = + .title = Cumasaigh an Uirlis Láimhe +pdfjs-cursor-hand-tool-button-label = Uirlis Láimhe + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Airíonna na Cáipéise… +pdfjs-document-properties-button-label = Airíonna na Cáipéise… +pdfjs-document-properties-file-name = Ainm an chomhaid: +pdfjs-document-properties-file-size = Méid an chomhaid: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } beart) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } beart) +pdfjs-document-properties-title = Teideal: +pdfjs-document-properties-author = Údar: +pdfjs-document-properties-subject = Ábhar: +pdfjs-document-properties-keywords = Eochairfhocail: +pdfjs-document-properties-creation-date = Dáta Cruthaithe: +pdfjs-document-properties-modification-date = Dáta Athraithe: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Cruthaitheoir: +pdfjs-document-properties-producer = Cruthaitheoir an PDF: +pdfjs-document-properties-version = Leagan PDF: +pdfjs-document-properties-page-count = Líon Leathanach: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = Dún + +## Print + +pdfjs-print-progress-message = Cáipéis á hullmhú le priontáil… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cealaigh +pdfjs-printing-not-supported = Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán. +pdfjs-printing-not-ready = Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán lódáilte. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Scoránaigh an Barra Taoibh +pdfjs-toggle-sidebar-button-label = Scoránaigh an Barra Taoibh +pdfjs-document-outline-button = + .title = Taispeáin Imlíne na Cáipéise (déchliceáil chun chuile rud a leathnú nó a laghdú) +pdfjs-document-outline-button-label = Creatlach na Cáipéise +pdfjs-attachments-button = + .title = Taispeáin Iatáin +pdfjs-attachments-button-label = Iatáin +pdfjs-thumbs-button = + .title = Taispeáin Mionsamhlacha +pdfjs-thumbs-button-label = Mionsamhlacha +pdfjs-findbar-button = + .title = Aimsigh sa Cháipéis +pdfjs-findbar-button-label = Aimsigh + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Leathanach { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Mionsamhail Leathanaigh { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Aimsigh + .placeholder = Aimsigh sa cháipéis… +pdfjs-find-previous-button = + .title = Aimsigh an sampla roimhe seo den nath seo +pdfjs-find-previous-button-label = Roimhe seo +pdfjs-find-next-button = + .title = Aimsigh an chéad sampla eile den nath sin +pdfjs-find-next-button-label = Ar aghaidh +pdfjs-find-highlight-checkbox = Aibhsigh uile +pdfjs-find-match-case-checkbox-label = Cásíogair +pdfjs-find-entire-word-checkbox-label = Focail iomlána +pdfjs-find-reached-top = Ag barr na cáipéise, ag leanúint ón mbun +pdfjs-find-reached-bottom = Ag bun na cáipéise, ag leanúint ón mbarr +pdfjs-find-not-found = Frása gan aimsiú + +## Predefined zoom values + +pdfjs-page-scale-width = Leithead Leathanaigh +pdfjs-page-scale-fit = Laghdaigh go dtí an Leathanach +pdfjs-page-scale-auto = Súmáil Uathoibríoch +pdfjs-page-scale-actual = Fíormhéid +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Tharla earráid agus an cháipéis PDF á lódáil. +pdfjs-invalid-file-error = Comhad neamhbhailí nó truaillithe PDF. +pdfjs-missing-file-error = Comhad PDF ar iarraidh. +pdfjs-unexpected-response-error = Freagra ón bhfreastalaí nach rabhthas ag súil leis. +pdfjs-rendering-error = Tharla earráid agus an leathanach á leagan amach. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anótáil { $type }] + +## Password + +pdfjs-password-label = Cuir an focal faire isteach chun an comhad PDF seo a oscailt. +pdfjs-password-invalid = Focal faire mícheart. Déan iarracht eile. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cealaigh +pdfjs-web-fonts-disabled = Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/gd/viewer.ftl b/public/pdfjs/web/locale/gd/viewer.ftl new file mode 100644 index 0000000..a3d62a0 --- /dev/null +++ b/public/pdfjs/web/locale/gd/viewer.ftl @@ -0,0 +1,313 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = An duilleag roimhe +pdfjs-previous-button-label = Air ais +pdfjs-next-button = + .title = An ath-dhuilleag +pdfjs-next-button-label = Air adhart +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Duilleag +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = à { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } à { $pagesCount }) +pdfjs-zoom-out-button = + .title = Sùm a-mach +pdfjs-zoom-out-button-label = Sùm a-mach +pdfjs-zoom-in-button = + .title = Sùm a-steach +pdfjs-zoom-in-button-label = Sùm a-steach +pdfjs-zoom-select = + .title = Sùm +pdfjs-presentation-mode-button = + .title = Gearr leum dhan mhodh taisbeanaidh +pdfjs-presentation-mode-button-label = Am modh taisbeanaidh +pdfjs-open-file-button = + .title = Fosgail faidhle +pdfjs-open-file-button-label = Fosgail +pdfjs-print-button = + .title = Clò-bhuail +pdfjs-print-button-label = Clò-bhuail +pdfjs-save-button = + .title = Sàbhail +pdfjs-save-button-label = Sàbhail +pdfjs-bookmark-button = + .title = An duilleag làithreach (Seall an URL on duilleag làithreach) +pdfjs-bookmark-button-label = An duilleag làithreach + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Innealan +pdfjs-tools-button-label = Innealan +pdfjs-first-page-button = + .title = Rach gun chiad duilleag +pdfjs-first-page-button-label = Rach gun chiad duilleag +pdfjs-last-page-button = + .title = Rach gun duilleag mu dheireadh +pdfjs-last-page-button-label = Rach gun duilleag mu dheireadh +pdfjs-page-rotate-cw-button = + .title = Cuairtich gu deiseil +pdfjs-page-rotate-cw-button-label = Cuairtich gu deiseil +pdfjs-page-rotate-ccw-button = + .title = Cuairtich gu tuathail +pdfjs-page-rotate-ccw-button-label = Cuairtich gu tuathail +pdfjs-cursor-text-select-tool-button = + .title = Cuir an comas inneal taghadh an teacsa +pdfjs-cursor-text-select-tool-button-label = Inneal taghadh an teacsa +pdfjs-cursor-hand-tool-button = + .title = Cuir inneal na làimhe an comas +pdfjs-cursor-hand-tool-button-label = Inneal na làimhe +pdfjs-scroll-page-button = + .title = Cleachd sgroladh duilleige +pdfjs-scroll-page-button-label = Sgroladh duilleige +pdfjs-scroll-vertical-button = + .title = Cleachd sgroladh inghearach +pdfjs-scroll-vertical-button-label = Sgroladh inghearach +pdfjs-scroll-horizontal-button = + .title = Cleachd sgroladh còmhnard +pdfjs-scroll-horizontal-button-label = Sgroladh còmhnard +pdfjs-scroll-wrapped-button = + .title = Cleachd sgroladh paisgte +pdfjs-scroll-wrapped-button-label = Sgroladh paisgte +pdfjs-spread-none-button = + .title = Na cuir còmhla sgoileadh dhuilleagan +pdfjs-spread-none-button-label = Gun sgaoileadh dhuilleagan +pdfjs-spread-odd-button = + .title = Cuir còmhla duilleagan sgaoilte a thòisicheas le duilleagan aig a bheil àireamh chorr +pdfjs-spread-odd-button-label = Sgaoileadh dhuilleagan corra +pdfjs-spread-even-button = + .title = Cuir còmhla duilleagan sgaoilte a thòisicheas le duilleagan aig a bheil àireamh chothrom +pdfjs-spread-even-button-label = Sgaoileadh dhuilleagan cothrom + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Roghainnean na sgrìobhainne… +pdfjs-document-properties-button-label = Roghainnean na sgrìobhainne… +pdfjs-document-properties-file-name = Ainm an fhaidhle: +pdfjs-document-properties-file-size = Meud an fhaidhle: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Tiotal: +pdfjs-document-properties-author = Ùghdar: +pdfjs-document-properties-subject = Cuspair: +pdfjs-document-properties-keywords = Faclan-luirg: +pdfjs-document-properties-creation-date = Latha a chruthachaidh: +pdfjs-document-properties-modification-date = Latha atharrachaidh: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Cruthadair: +pdfjs-document-properties-producer = Saothraiche a' PDF: +pdfjs-document-properties-version = Tionndadh a' PDF: +pdfjs-document-properties-page-count = Àireamh de dhuilleagan: +pdfjs-document-properties-page-size = Meud na duilleige: +pdfjs-document-properties-page-size-unit-inches = ann an +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portraid +pdfjs-document-properties-page-size-orientation-landscape = dreach-tìre +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Litir +pdfjs-document-properties-page-size-name-legal = Laghail + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Grad shealladh-lìn: +pdfjs-document-properties-linearized-yes = Tha +pdfjs-document-properties-linearized-no = Chan eil +pdfjs-document-properties-close-button = Dùin + +## Print + +pdfjs-print-progress-message = Ag ullachadh na sgrìobhainn airson clò-bhualadh… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Sguir dheth +pdfjs-printing-not-supported = Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh. +pdfjs-printing-not-ready = Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toglaich am bàr-taoibh +pdfjs-toggle-sidebar-notification-button = + .title = Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain/breathan aig an sgrìobhainn) +pdfjs-toggle-sidebar-button-label = Toglaich am bàr-taoibh +pdfjs-document-outline-button = + .title = Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a leudachadh/a cho-theannadh) +pdfjs-document-outline-button-label = Oir-loidhne na sgrìobhainne +pdfjs-attachments-button = + .title = Seall na ceanglachain +pdfjs-attachments-button-label = Ceanglachain +pdfjs-layers-button = + .title = Seall na breathan (dèan briogadh dùbailte airson a h-uile breath ath-shuidheachadh dhan staid bhunaiteach) +pdfjs-layers-button-label = Breathan +pdfjs-thumbs-button = + .title = Seall na dealbhagan +pdfjs-thumbs-button-label = Dealbhagan +pdfjs-current-outline-item-button = + .title = Lorg nì làithreach na h-oir-loidhne +pdfjs-current-outline-item-button-label = Nì làithreach na h-oir-loidhne +pdfjs-findbar-button = + .title = Lorg san sgrìobhainn +pdfjs-findbar-button-label = Lorg +pdfjs-additional-layers = Barrachd breathan + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Duilleag a { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Dealbhag duilleag a { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Lorg + .placeholder = Lorg san sgrìobhainn... +pdfjs-find-previous-button = + .title = Lorg làthair roimhe na h-abairt seo +pdfjs-find-previous-button-label = Air ais +pdfjs-find-next-button = + .title = Lorg ath-làthair na h-abairt seo +pdfjs-find-next-button-label = Air adhart +pdfjs-find-highlight-checkbox = Soillsich a h-uile +pdfjs-find-match-case-checkbox-label = Aire do litrichean mòra is beaga +pdfjs-find-match-diacritics-checkbox-label = Aire do stràcan +pdfjs-find-entire-word-checkbox-label = Faclan-slàna +pdfjs-find-reached-top = Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige +pdfjs-find-reached-bottom = Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige +pdfjs-find-not-found = Cha deach an abairt a lorg + +## Predefined zoom values + +pdfjs-page-scale-width = Leud na duilleige +pdfjs-page-scale-fit = Freagair ri meud na duilleige +pdfjs-page-scale-auto = Sùm fèin-obrachail +pdfjs-page-scale-actual = Am fìor-mheud +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Duilleag { $page } + +## Loading indicator messages + +pdfjs-loading-error = Thachair mearachd rè luchdadh a' PDF. +pdfjs-invalid-file-error = Faidhle PDF a tha mì-dhligheach no coirbte. +pdfjs-missing-file-error = Faidhle PDF a tha a dhìth. +pdfjs-unexpected-response-error = Freagairt on fhrithealaiche ris nach robh dùil. +pdfjs-rendering-error = Thachair mearachd rè reandaradh na duilleige. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Nòtachadh { $type }] + +## Password + +pdfjs-password-label = Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh. +pdfjs-password-invalid = Tha am facal-faire cearr. Nach fheuch thu ris a-rithist? +pdfjs-password-ok-button = Ceart ma-thà +pdfjs-password-cancel-button = Sguir dheth +pdfjs-web-fonts-disabled = Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh. + +## Editing + +pdfjs-editor-free-text-button = + .title = Teacsa +pdfjs-editor-free-text-button-label = Teacsa +pdfjs-editor-ink-button = + .title = Tarraing +pdfjs-editor-ink-button-label = Tarraing + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Dath +pdfjs-editor-free-text-size-input = Meud +pdfjs-editor-ink-color-input = Dath +pdfjs-editor-ink-thickness-input = Tighead +pdfjs-editor-ink-opacity-input = Trìd-dhoilleireachd +pdfjs-free-text = + .aria-label = An deasaiche teacsa +pdfjs-free-text-default-content = Tòisich air sgrìobhadh… +pdfjs-ink = + .aria-label = An deasaiche tharraingean +pdfjs-ink-canvas = + .aria-label = Dealbh a chruthaich cleachdaiche + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/gl/viewer.ftl b/public/pdfjs/web/locale/gl/viewer.ftl new file mode 100644 index 0000000..641a607 --- /dev/null +++ b/public/pdfjs/web/locale/gl/viewer.ftl @@ -0,0 +1,385 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Páxina anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Seguinte páxina +pdfjs-next-button-label = Seguinte +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Páxina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Reducir +pdfjs-zoom-out-button-label = Reducir +pdfjs-zoom-in-button = + .title = Ampliar +pdfjs-zoom-in-button-label = Ampliar +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Cambiar ao modo presentación +pdfjs-presentation-mode-button-label = Modo presentación +pdfjs-open-file-button = + .title = Abrir ficheiro +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Gardar +pdfjs-save-button-label = Gardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descargar +pdfjs-bookmark-button = + .title = Páxina actual (ver o URL da páxina actual) +pdfjs-bookmark-button-label = Páxina actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ferramentas +pdfjs-tools-button-label = Ferramentas +pdfjs-first-page-button = + .title = Ir á primeira páxina +pdfjs-first-page-button-label = Ir á primeira páxina +pdfjs-last-page-button = + .title = Ir á última páxina +pdfjs-last-page-button-label = Ir á última páxina +pdfjs-page-rotate-cw-button = + .title = Rotar no sentido das agullas do reloxo +pdfjs-page-rotate-cw-button-label = Rotar no sentido das agullas do reloxo +pdfjs-page-rotate-ccw-button = + .title = Rotar no sentido contrario ás agullas do reloxo +pdfjs-page-rotate-ccw-button-label = Rotar no sentido contrario ás agullas do reloxo +pdfjs-cursor-text-select-tool-button = + .title = Activar a ferramenta de selección de texto +pdfjs-cursor-text-select-tool-button-label = Ferramenta de selección de texto +pdfjs-cursor-hand-tool-button = + .title = Activar a ferramenta de man +pdfjs-cursor-hand-tool-button-label = Ferramenta de man +pdfjs-scroll-page-button = + .title = Usar o desprazamento da páxina +pdfjs-scroll-page-button-label = Desprazamento da páxina +pdfjs-scroll-vertical-button = + .title = Usar o desprazamento vertical +pdfjs-scroll-vertical-button-label = Desprazamento vertical +pdfjs-scroll-horizontal-button = + .title = Usar o desprazamento horizontal +pdfjs-scroll-horizontal-button-label = Desprazamento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar o desprazamento en bloque +pdfjs-scroll-wrapped-button-label = Desprazamento por bloque +pdfjs-spread-none-button = + .title = Non agrupar páxinas +pdfjs-spread-none-button-label = Ningún agrupamento +pdfjs-spread-odd-button = + .title = Crea grupo de páxinas que comezan con números de páxina impares +pdfjs-spread-odd-button-label = Agrupamento impar +pdfjs-spread-even-button = + .title = Crea grupo de páxinas que comezan con números de páxina pares +pdfjs-spread-even-button-label = Agrupamento par + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedades do documento… +pdfjs-document-properties-button-label = Propiedades do documento… +pdfjs-document-properties-file-name = Nome do ficheiro: +pdfjs-document-properties-file-size = Tamaño do ficheiro: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Asunto: +pdfjs-document-properties-keywords = Palabras clave: +pdfjs-document-properties-creation-date = Data de creación: +pdfjs-document-properties-modification-date = Data de modificación: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creado por: +pdfjs-document-properties-producer = Xenerador do PDF: +pdfjs-document-properties-version = Versión de PDF: +pdfjs-document-properties-page-count = Número de páxinas: +pdfjs-document-properties-page-size = Tamaño da páxina: +pdfjs-document-properties-page-size-unit-inches = pol +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Visualización rápida das páxinas web: +pdfjs-document-properties-linearized-yes = Si +pdfjs-document-properties-linearized-no = Non +pdfjs-document-properties-close-button = Pechar + +## Print + +pdfjs-print-progress-message = Preparando o documento para imprimir… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Aviso: A impresión non é compatíbel de todo con este navegador. +pdfjs-printing-not-ready = Aviso: O PDF non se cargou completamente para imprimirse. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Amosar/agochar a barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Alternar barra lateral (o documento contén esquema/anexos/capas) +pdfjs-toggle-sidebar-button-label = Amosar/agochar a barra lateral +pdfjs-document-outline-button = + .title = Amosar a estrutura do documento (dobre clic para expandir/contraer todos os elementos) +pdfjs-document-outline-button-label = Estrutura do documento +pdfjs-attachments-button = + .title = Amosar anexos +pdfjs-attachments-button-label = Anexos +pdfjs-layers-button = + .title = Mostrar capas (prema dúas veces para restaurar todas as capas o estado predeterminado) +pdfjs-layers-button-label = Capas +pdfjs-thumbs-button = + .title = Amosar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Atopar o elemento delimitado actualmente +pdfjs-current-outline-item-button-label = Elemento delimitado actualmente +pdfjs-findbar-button = + .title = Atopar no documento +pdfjs-findbar-button-label = Atopar +pdfjs-additional-layers = Capas adicionais + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Páxina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura da páxina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Atopar + .placeholder = Atopar no documento… +pdfjs-find-previous-button = + .title = Atopar a anterior aparición da frase +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Atopar a seguinte aparición da frase +pdfjs-find-next-button-label = Seguinte +pdfjs-find-highlight-checkbox = Realzar todo +pdfjs-find-match-case-checkbox-label = Diferenciar maiúsculas de minúsculas +pdfjs-find-match-diacritics-checkbox-label = Distinguir os diacríticos +pdfjs-find-entire-word-checkbox-label = Palabras completas +pdfjs-find-reached-top = Chegouse ao inicio do documento, continuar desde o final +pdfjs-find-reached-bottom = Chegouse ao final do documento, continuar desde o inicio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Coincidencia { $current } de { $total } + *[other] Coincidencia { $current } de { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Máis de { $limit } coincidencia + *[other] Máis de { $limit } coincidencias + } +pdfjs-find-not-found = Non se atopou a frase + +## Predefined zoom values + +pdfjs-page-scale-width = Largura da páxina +pdfjs-page-scale-fit = Axuste de páxina +pdfjs-page-scale-auto = Zoom automático +pdfjs-page-scale-actual = Tamaño actual +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Páxina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Produciuse un erro ao cargar o PDF. +pdfjs-invalid-file-error = Ficheiro PDF danado ou non válido. +pdfjs-missing-file-error = Falta o ficheiro PDF. +pdfjs-unexpected-response-error = Resposta inesperada do servidor. +pdfjs-rendering-error = Produciuse un erro ao representar a páxina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotación { $type }] + +## Password + +pdfjs-password-label = Escriba o contrasinal para abrir este ficheiro PDF. +pdfjs-password-invalid = Contrasinal incorrecto. Tente de novo. +pdfjs-password-ok-button = Aceptar +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = Desactiváronse as fontes web: foi imposíbel usar as fontes incrustadas no PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Debuxo +pdfjs-editor-ink-button-label = Debuxo +pdfjs-editor-stamp-button = + .title = Engadir ou editar imaxes +pdfjs-editor-stamp-button-label = Engadir ou editar imaxes + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-freetext-button = + .title = Eliminar o texto +pdfjs-editor-remove-stamp-button = + .title = Eliminar a imaxe +pdfjs-editor-remove-highlight-button = + .title = Eliminar o resaltado + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Cor +pdfjs-editor-free-text-size-input = Tamaño +pdfjs-editor-ink-color-input = Cor +pdfjs-editor-ink-thickness-input = Grosor +pdfjs-editor-ink-opacity-input = Opacidade +pdfjs-editor-stamp-add-image-button = + .title = Engadir imaxe +pdfjs-editor-stamp-add-image-button-label = Engadir imaxe +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grosor +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Comezar a teclear… +pdfjs-ink = + .aria-label = Editor de debuxos +pdfjs-ink-canvas = + .aria-label = Imaxe creada por unha usuaria + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar o texto alternativo +pdfjs-editor-alt-text-dialog-label = Escoller unha opción +pdfjs-editor-alt-text-add-description-label = Engadir unha descrición +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo +pdfjs-editor-alt-text-mark-decorative-description = Utilízase para imaxes ornamentais, como bordos ou marcas de auga. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Gardar +pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por exemplo, «Un mozo séntase á mesa para comer» + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Esquina superior esquerda: cambia o tamaño +pdfjs-editor-resizer-label-top-middle = Medio superior: cambia o tamaño +pdfjs-editor-resizer-label-top-right = Esquina superior dereita: cambia o tamaño +pdfjs-editor-resizer-label-middle-right = Medio dereito: cambia o tamaño +pdfjs-editor-resizer-label-bottom-right = Esquina inferior dereita: cambia o tamaño +pdfjs-editor-resizer-label-bottom-middle = Abaixo medio: cambia o tamaño +pdfjs-editor-resizer-label-bottom-left = Esquina inferior esquerda: cambia o tamaño +pdfjs-editor-resizer-label-middle-left = Medio esquerdo: cambia o tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior esquerda: cambia o tamaño +pdfjs-editor-resizer-top-middle = + .aria-label = Medio superior: cambia o tamaño +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior dereita: cambia o tamaño +pdfjs-editor-resizer-middle-right = + .aria-label = Medio dereito: cambia o tamaño +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior dereita: cambia o tamaño +pdfjs-editor-resizer-bottom-middle = + .aria-label = Abaixo medio: cambia o tamaño +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior esquerda: cambia o tamaño +pdfjs-editor-resizer-middle-left = + .aria-label = Medio esquerdo: cambia o tamaño + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/gn/viewer.ftl b/public/pdfjs/web/locale/gn/viewer.ftl new file mode 100644 index 0000000..6402c6f --- /dev/null +++ b/public/pdfjs/web/locale/gn/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Kuatiarogue mboyvegua +pdfjs-previous-button-label = Mboyvegua +pdfjs-next-button = + .title = Kuatiarogue upeigua +pdfjs-next-button-label = Upeigua +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Kuatiarogue +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } gui +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Momichĩ +pdfjs-zoom-out-button-label = Momichĩ +pdfjs-zoom-in-button = + .title = Mbotuicha +pdfjs-zoom-in-button-label = Mbotuicha +pdfjs-zoom-select = + .title = Tuichakue +pdfjs-presentation-mode-button = + .title = Jehechauka reko moambue +pdfjs-presentation-mode-button-label = Jehechauka reko +pdfjs-open-file-button = + .title = Marandurendápe jeike +pdfjs-open-file-button-label = Jeike +pdfjs-print-button = + .title = Monguatia +pdfjs-print-button-label = Monguatia +pdfjs-save-button = + .title = Ñongatu +pdfjs-save-button-label = Ñongatu +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Mboguejy +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Mboguejy +pdfjs-bookmark-button = + .title = Kuatiarogue ag̃agua (Ehecha URL kuatiarogue ag̃agua) +pdfjs-bookmark-button-label = Kuatiarogue Ag̃agua + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tembiporu +pdfjs-tools-button-label = Tembiporu +pdfjs-first-page-button = + .title = Kuatiarogue ñepyrũme jeho +pdfjs-first-page-button-label = Kuatiarogue ñepyrũme jeho +pdfjs-last-page-button = + .title = Kuatiarogue pahápe jeho +pdfjs-last-page-button-label = Kuatiarogue pahápe jeho +pdfjs-page-rotate-cw-button = + .title = Aravóicha mbojere +pdfjs-page-rotate-cw-button-label = Aravóicha mbojere +pdfjs-page-rotate-ccw-button = + .title = Aravo rapykue gotyo mbojere +pdfjs-page-rotate-ccw-button-label = Aravo rapykue gotyo mbojere +pdfjs-cursor-text-select-tool-button = + .title = Emyandy moñe’ẽrã jeporavo rembiporu +pdfjs-cursor-text-select-tool-button-label = Moñe’ẽrã jeporavo rembiporu +pdfjs-cursor-hand-tool-button = + .title = Tembiporu po pegua myandy +pdfjs-cursor-hand-tool-button-label = Tembiporu po pegua +pdfjs-scroll-page-button = + .title = Eiporu kuatiarogue jeku’e +pdfjs-scroll-page-button-label = Kuatiarogue jeku’e +pdfjs-scroll-vertical-button = + .title = Eiporu jeku’e ykeguáva +pdfjs-scroll-vertical-button-label = Jeku’e ykeguáva +pdfjs-scroll-horizontal-button = + .title = Eiporu jeku’e yvate gotyo +pdfjs-scroll-horizontal-button-label = Jeku’e yvate gotyo +pdfjs-scroll-wrapped-button = + .title = Eiporu jeku’e mbohyrupyre +pdfjs-scroll-wrapped-button-label = Jeku’e mbohyrupyre +pdfjs-spread-none-button = + .title = Ani ejuaju spreads kuatiarogue ndive +pdfjs-spread-none-button-label = Spreads ỹre +pdfjs-spread-odd-button = + .title = Embojuaju kuatiarogue jepysokue eñepyrũvo kuatiarogue impar-vagui +pdfjs-spread-odd-button-label = Spreads impar +pdfjs-spread-even-button = + .title = Embojuaju kuatiarogue jepysokue eñepyrũvo kuatiarogue par-vagui +pdfjs-spread-even-button-label = Ipukuve uvei + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Kuatia mba’etee… +pdfjs-document-properties-button-label = Kuatia mba’etee… +pdfjs-document-properties-file-name = Marandurenda réra: +pdfjs-document-properties-file-size = Marandurenda tuichakue: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Teratee: +pdfjs-document-properties-author = Apohára: +pdfjs-document-properties-subject = Mba’egua: +pdfjs-document-properties-keywords = Jehero: +pdfjs-document-properties-creation-date = Teñoihague arange: +pdfjs-document-properties-modification-date = Iñambue hague arange: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Apo’ypyha: +pdfjs-document-properties-producer = PDF mbosako’iha: +pdfjs-document-properties-version = PDF mbojuehegua: +pdfjs-document-properties-page-count = Kuatiarogue papapy: +pdfjs-document-properties-page-size = Kuatiarogue tuichakue: +pdfjs-document-properties-page-size-unit-inches = Amo +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = Oĩháicha +pdfjs-document-properties-page-size-orientation-landscape = apaisado +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Kuatiañe’ẽ +pdfjs-document-properties-page-size-name-legal = Tee + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Ñanduti jahecha pya’e: +pdfjs-document-properties-linearized-yes = Añete +pdfjs-document-properties-linearized-no = Ahániri +pdfjs-document-properties-close-button = Mboty + +## Print + +pdfjs-print-progress-message = Embosako’i kuatia emonguatia hag̃ua… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Heja +pdfjs-printing-not-supported = Kyhyjerã: Ñembokuatia ndojokupytypái ko kundahára ndive. +pdfjs-printing-not-ready = Kyhyjerã: Ko PDF nahenyhẽmbái oñembokuatia hag̃uáicha. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Tenda yke moambue +pdfjs-toggle-sidebar-notification-button = + .title = Embojopyru tenda ykegua (kuatia oguereko kuaakaha/moirũha/ñuãha) +pdfjs-toggle-sidebar-button-label = Tenda yke moambue +pdfjs-document-outline-button = + .title = Ehechauka kuatia rape (eikutu mokõi jey embotuicha/emomichĩ hag̃ua opavavete mba’eporu) +pdfjs-document-outline-button-label = Kuatia apopyre +pdfjs-attachments-button = + .title = Moirũha jehechauka +pdfjs-attachments-button-label = Moirũha +pdfjs-layers-button = + .title = Ehechauka ñuãha (eikutu jo’a emomba’apo hag̃ua opaite ñuãha tekoypýpe) +pdfjs-layers-button-label = Ñuãha +pdfjs-thumbs-button = + .title = Mba’emirĩ jehechauka +pdfjs-thumbs-button-label = Mba’emirĩ +pdfjs-current-outline-item-button = + .title = Eheka mba’eporu ag̃aguaitéva +pdfjs-current-outline-item-button-label = Mba’eporu ag̃aguaitéva +pdfjs-findbar-button = + .title = Kuatiápe jeheka +pdfjs-findbar-button-label = Juhu +pdfjs-additional-layers = Ñuãha moirũguáva + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Kuatiarogue { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Kuatiarogue mba’emirĩ { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Juhu + .placeholder = Kuatiápe jejuhu… +pdfjs-find-previous-button = + .title = Ejuhu ñe’ẽrysýi osẽ’ypy hague +pdfjs-find-previous-button-label = Mboyvegua +pdfjs-find-next-button = + .title = Eho ñe’ẽ juhupyre upeiguávape +pdfjs-find-next-button-label = Upeigua +pdfjs-find-highlight-checkbox = Embojekuaavepa +pdfjs-find-match-case-checkbox-label = Ejesareko taiguasu/taimichĩre +pdfjs-find-match-diacritics-checkbox-label = Diacrítico moñondive +pdfjs-find-entire-word-checkbox-label = Ñe’ẽ oĩmbáva +pdfjs-find-reached-top = Ojehupyty kuatia ñepyrũ, oku’ejeýta kuatia paha guive +pdfjs-find-reached-bottom = Ojehupyty kuatia paha, oku’ejeýta kuatia ñepyrũ guive +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } ha { $total } ojueheguáva + *[other] { $current } ha { $total } ojueheguáva + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Hetave { $limit } ojueheguáva + *[other] Hetave { $limit } ojueheguáva + } +pdfjs-find-not-found = Ñe’ẽrysýi ojejuhu’ỹva + +## Predefined zoom values + +pdfjs-page-scale-width = Kuatiarogue pekue +pdfjs-page-scale-fit = Kuatiarogue ñemoĩporã +pdfjs-page-scale-auto = Tuichakue ijeheguíva +pdfjs-page-scale-actual = Tuichakue ag̃agua +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Kuatiarogue { $page } + +## Loading indicator messages + +pdfjs-loading-error = Oiko jejavy PDF oñemyeñyhẽnguévo. +pdfjs-invalid-file-error = PDF marandurenda ndoikóiva térã ivaipyréva. +pdfjs-missing-file-error = Ndaipóri PDF marandurenda +pdfjs-unexpected-response-error = Mohendahavusu mbohovái eha’ãrõ’ỹva. +pdfjs-rendering-error = Oiko jejavy ehechaukasévo kuatiarogue. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Jehaipy { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Emoinge ñe’ẽñemi eipe’a hag̃ua ko marandurenda PDF. +pdfjs-password-invalid = Ñe’ẽñemi ndoikóiva. Eha’ã jey. +pdfjs-password-ok-button = MONEĨ +pdfjs-password-cancel-button = Heja +pdfjs-web-fonts-disabled = Ñanduti taity oñemongéma: ndaikatumo’ãi eiporu PDF jehai’íva taity. + +## Editing + +pdfjs-editor-free-text-button = + .title = Moñe’ẽrã +pdfjs-editor-free-text-button-label = Moñe’ẽrã +pdfjs-editor-ink-button = + .title = Moha’ãnga +pdfjs-editor-ink-button-label = Moha’ãnga +pdfjs-editor-stamp-button = + .title = Embojuaju térã embosako’i ta’ãnga +pdfjs-editor-stamp-button-label = Embojuaju térã embosako’i ta’ãnga +pdfjs-editor-highlight-button = + .title = Mbosa’y +pdfjs-editor-highlight-button-label = Mbosa’y +pdfjs-highlight-floating-button1 = + .title = Mbosa’y + .aria-label = Mbosa’y +pdfjs-highlight-floating-button-label = Mbosa’y + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Emboguete ta’ãnga +pdfjs-editor-remove-freetext-button = + .title = Emboguete moñe’ẽrã +pdfjs-editor-remove-stamp-button = + .title = Emboguete ta’ãnga +pdfjs-editor-remove-highlight-button = + .title = Eipe’a jehechaveha + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Sa’y +pdfjs-editor-free-text-size-input = Tuichakue +pdfjs-editor-ink-color-input = Sa’y +pdfjs-editor-ink-thickness-input = Anambusu +pdfjs-editor-ink-opacity-input = Pytũngy +pdfjs-editor-stamp-add-image-button = + .title = Embojuaju ta’ãnga +pdfjs-editor-stamp-add-image-button-label = Embojuaju ta’ãnga +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Anambusu +pdfjs-editor-free-highlight-thickness-title = + .title = Emoambue anambusukue embosa’ývo mba’eporu ha’e’ỹva moñe’ẽrã +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Moñe’ẽrã moheñoiha + .default-content = Eñepyrũ ehai… +pdfjs-free-text = + .aria-label = Moñe’ẽrã moheñoiha +pdfjs-free-text-default-content = Ehai ñepyrũ… +pdfjs-ink = + .aria-label = Ta’ãnga moheñoiha +pdfjs-ink-canvas = + .aria-label = Ta’ãnga omoheñóiva poruhára + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Moñe’ẽrã mokõiháva +pdfjs-editor-alt-text-edit-button = + .aria-label = Embojuruja moñe’ẽrã mokõiháva +pdfjs-editor-alt-text-edit-button-label = Embojuruja moñe’ẽrã mokõiháva +pdfjs-editor-alt-text-dialog-label = Eiporavo poravorã +pdfjs-editor-alt-text-dialog-description = Moñe’ẽrã ykepegua (moñe’ẽrã ykepegua) nepytyvõ nderehecháiramo ta’ãnga térã nahenyhẽiramo. +pdfjs-editor-alt-text-add-description-label = Embojuaju ñemoha’ãnga +pdfjs-editor-alt-text-add-description-description = Ehaimi 1 térã 2 ñe’ẽjuaju oñe’ẽva pe téma rehe, ijere térã mba’eapóre. +pdfjs-editor-alt-text-mark-decorative-label = Emongurusu jeguakárõ +pdfjs-editor-alt-text-mark-decorative-description = Ojeporu ta’ãnga jeguakarã, tembe’y térã ta’ãnga ruguarãramo. +pdfjs-editor-alt-text-cancel-button = Heja +pdfjs-editor-alt-text-save-button = Ñongatu +pdfjs-editor-alt-text-decorative-tooltip = Jeguakárõ mongurusupyre +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Techapyrã: “Peteĩ mitãrusu oguapy mesápe okaru hag̃ua” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Moñe’ẽrã mokõiháva + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Yvate asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-label-top-middle = Yvate mbytépe — emoambue tuichakue +pdfjs-editor-resizer-label-top-right = Yvate akatúape — emoambue tuichakue +pdfjs-editor-resizer-label-middle-right = Mbyte akatúape — emoambue tuichakue +pdfjs-editor-resizer-label-bottom-right = Yvy gotyo akatúape — emoambue tuichakue +pdfjs-editor-resizer-label-bottom-middle = Yvy gotyo mbytépe — emoambue tuichakue +pdfjs-editor-resizer-label-bottom-left = Iguýpe asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-label-middle-left = Mbyte asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-top-left = + .aria-label = Yvate asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-top-middle = + .aria-label = Yvate mbytépe — emoambue tuichakue +pdfjs-editor-resizer-top-right = + .aria-label = Yvate akatúape — emoambue tuichakue +pdfjs-editor-resizer-middle-right = + .aria-label = Mbyte akatúape — emoambue tuichakue +pdfjs-editor-resizer-bottom-right = + .aria-label = Yvy gotyo akatúape — emoambue tuichakue +pdfjs-editor-resizer-bottom-middle = + .aria-label = Yvy gotyo mbytépe — emoambue tuichakue +pdfjs-editor-resizer-bottom-left = + .aria-label = Iguýpe asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-middle-left = + .aria-label = Mbyte asu gotyo — emoambue tuichakue + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Jehechaveha sa’y +pdfjs-editor-colorpicker-button = + .title = Emoambue sa’y +pdfjs-editor-colorpicker-dropdown = + .aria-label = Sa’y poravopyrã +pdfjs-editor-colorpicker-yellow = + .title = Sa’yju +pdfjs-editor-colorpicker-green = + .title = Hovyũ +pdfjs-editor-colorpicker-blue = + .title = Hovy +pdfjs-editor-colorpicker-pink = + .title = Pytãngy +pdfjs-editor-colorpicker-red = + .title = Pyha + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Techaukapa +pdfjs-editor-highlight-show-all-button = + .title = Techaukapa + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Embosako’i moñe’ẽrã mokõiha (ta’ãngáre ñeñe’ẽ) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Embojuaju moñe’ẽrã mokõiha (ta’ãngáre ñeñe’ẽ) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Edescribi ko’ápe… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Ñemyesakã mbykymi opavave ohecha’ỹva upe ta’ãnga térã pe ta’ãnga nahenyhẽiramo. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ko moñe’ẽrã mokõiha oñemoheñói ijehegui ha ikatu ndoikoporãi. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Eikuaave +pdfjs-editor-new-alt-text-create-automatically-button-label = Emoheñói moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-new-alt-text-not-now-button = Ani ko’ág̃a +pdfjs-editor-new-alt-text-error-title = Noñemoheñói moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-new-alt-text-error-description = Ehai ne moñe’ẽrã mokõiha térã eha’ã jey ag̃amieve. +pdfjs-editor-new-alt-text-error-close-button = Mboty +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Emboguejyhína IA moñe’ẽrã mokõiháva ({ $downloadedSize } { $totalSize } MB) mba’e + .aria-valuetext = Emboguejyhína IA moñe’ẽrã mokõiháva ({ $downloadedSize } { $totalSize } MB) mba’e +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Moñe’ẽrã mokõiha mbojuajupyre +pdfjs-editor-new-alt-text-added-button-label = Oñembojuaju moñe’ẽrã mokõiha +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Ndaipóri moñe’ẽrã mokõiha +pdfjs-editor-new-alt-text-missing-button-label = Ndaipóri moñe’ẽrã mokõiha +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Ehechajey moñe’ẽrã mokõiha +pdfjs-editor-new-alt-text-to-review-button-label = Ehechajey moñe’ẽrã mokõiha +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Heñóiva ijeheguiete: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ta’ãnga moñe’ẽrã mokõiha ñemboheko +pdfjs-image-alt-text-settings-button-label = Ta’ãnga moñe’ẽrã mokõiha ñemboheko +pdfjs-editor-alt-text-settings-dialog-label = Ta’ãnga moñe’ẽrã mokõiha ñemboheko +pdfjs-editor-alt-text-settings-automatic-title = Moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-alt-text-settings-create-model-button-label = Emoheñói moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-alt-text-settings-create-model-description = Ñemyesakã mbykymi opavave tapicha ohecha’ỹva upe ta’ãnga térã pe ta’ãnga nahenyhẽiramo. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Peteĩva IA moñe’ẽrã mokõiha ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Oku’e mba’e’okaitépe umi mba’ekuaarã hekoñemi hag̃ua. Tekotevẽva moñe’ẽrã ykegua ijeheguívape. +pdfjs-editor-alt-text-settings-delete-model-button = Mboguete +pdfjs-editor-alt-text-settings-download-model-button = Mboguejy +pdfjs-editor-alt-text-settings-downloading-model-button = Emboguejyhína… +pdfjs-editor-alt-text-settings-editor-title = Moñe’ẽrã mokõiha mbosako’iha +pdfjs-editor-alt-text-settings-show-dialog-button-label = Ehechauka moñe’ẽrã mokõiha mbosako’iha embojuajúvo ta’ãnga +pdfjs-editor-alt-text-settings-show-dialog-description = Nepytyvõta ta’ãngakuéra orekotaha moñe’ẽrã mokõiha. +pdfjs-editor-alt-text-settings-close-button = Mboty + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Mbosa’ýva mboguete +pdfjs-editor-undo-bar-message-freetext = Moñe’ẽrã mboguepyre +pdfjs-editor-undo-bar-message-ink = Ta’ãnga mboguepyre +pdfjs-editor-undo-bar-message-stamp = Ta’ãnga mboguepyre +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } jehaikue mboguepyre + *[other] { $count } jehaikue mboguepyre + } +pdfjs-editor-undo-bar-undo-button = + .title = Mboguevi +pdfjs-editor-undo-bar-undo-button-label = Mboguevi +pdfjs-editor-undo-bar-close-button = + .title = Mboty +pdfjs-editor-undo-bar-close-button-label = Mboty diff --git a/public/pdfjs/web/locale/gu-IN/viewer.ftl b/public/pdfjs/web/locale/gu-IN/viewer.ftl new file mode 100644 index 0000000..5d8bb54 --- /dev/null +++ b/public/pdfjs/web/locale/gu-IN/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = પહેલાનુ પાનું +pdfjs-previous-button-label = પહેલાનુ +pdfjs-next-button = + .title = આગળનુ પાનું +pdfjs-next-button-label = આગળનું +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = પાનું +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = નો { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } નો { $pagesCount }) +pdfjs-zoom-out-button = + .title = મોટુ કરો +pdfjs-zoom-out-button-label = મોટુ કરો +pdfjs-zoom-in-button = + .title = નાનું કરો +pdfjs-zoom-in-button-label = નાનું કરો +pdfjs-zoom-select = + .title = નાનું મોટુ કરો +pdfjs-presentation-mode-button = + .title = રજૂઆત સ્થિતિમાં જાવ +pdfjs-presentation-mode-button-label = રજૂઆત સ્થિતિ +pdfjs-open-file-button = + .title = ફાઇલ ખોલો +pdfjs-open-file-button-label = ખોલો +pdfjs-print-button = + .title = છાપો +pdfjs-print-button-label = છારો + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = સાધનો +pdfjs-tools-button-label = સાધનો +pdfjs-first-page-button = + .title = પહેલાં પાનામાં જાવ +pdfjs-first-page-button-label = પ્રથમ પાનાં પર જાવ +pdfjs-last-page-button = + .title = છેલ્લા પાનાં પર જાવ +pdfjs-last-page-button-label = છેલ્લા પાનાં પર જાવ +pdfjs-page-rotate-cw-button = + .title = ઘડિયાળનાં કાંટા તરફ ફેરવો +pdfjs-page-rotate-cw-button-label = ઘડિયાળનાં કાંટા તરફ ફેરવો +pdfjs-page-rotate-ccw-button = + .title = ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો +pdfjs-page-rotate-ccw-button-label = ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો +pdfjs-cursor-text-select-tool-button = + .title = ટેક્સ્ટ પસંદગી ટૂલ સક્ષમ કરો +pdfjs-cursor-text-select-tool-button-label = ટેક્સ્ટ પસંદગી ટૂલ +pdfjs-cursor-hand-tool-button = + .title = હાથનાં સાધનને સક્રિય કરો +pdfjs-cursor-hand-tool-button-label = હેન્ડ ટૂલ +pdfjs-scroll-vertical-button = + .title = ઊભી સ્ક્રોલિંગનો ઉપયોગ કરો +pdfjs-scroll-vertical-button-label = ઊભી સ્ક્રોલિંગ +pdfjs-scroll-horizontal-button = + .title = આડી સ્ક્રોલિંગનો ઉપયોગ કરો +pdfjs-scroll-horizontal-button-label = આડી સ્ક્રોલિંગ +pdfjs-scroll-wrapped-button = + .title = આવરિત સ્ક્રોલિંગનો ઉપયોગ કરો +pdfjs-scroll-wrapped-button-label = આવરિત સ્ક્રોલિંગ +pdfjs-spread-none-button = + .title = પૃષ્ઠ સ્પ્રેડમાં જોડાવશો નહીં +pdfjs-spread-none-button-label = કોઈ સ્પ્રેડ નથી +pdfjs-spread-odd-button = + .title = એકી-ક્રમાંકિત પૃષ્ઠો સાથે પ્રારંભ થતાં પૃષ્ઠ સ્પ્રેડમાં જોડાઓ +pdfjs-spread-odd-button-label = એકી સ્પ્રેડ્સ +pdfjs-spread-even-button = + .title = નંબર-ક્રમાંકિત પૃષ્ઠોથી શરૂ થતાં પૃષ્ઠ સ્પ્રેડમાં જોડાઓ +pdfjs-spread-even-button-label = સરખું ફેલાવવું + +## Document properties dialog + +pdfjs-document-properties-button = + .title = દસ્તાવેજ ગુણધર્મો… +pdfjs-document-properties-button-label = દસ્તાવેજ ગુણધર્મો… +pdfjs-document-properties-file-name = ફાઇલ નામ: +pdfjs-document-properties-file-size = ફાઇલ માપ: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } બાઇટ) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } બાઇટ) +pdfjs-document-properties-title = શીર્ષક: +pdfjs-document-properties-author = લેખક: +pdfjs-document-properties-subject = વિષય: +pdfjs-document-properties-keywords = કિવર્ડ: +pdfjs-document-properties-creation-date = નિર્માણ તારીખ: +pdfjs-document-properties-modification-date = ફેરફાર તારીખ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = નિર્માતા: +pdfjs-document-properties-producer = PDF નિર્માતા: +pdfjs-document-properties-version = PDF આવૃત્તિ: +pdfjs-document-properties-page-count = પાનાં ગણતરી: +pdfjs-document-properties-page-size = પૃષ્ઠનું કદ: +pdfjs-document-properties-page-size-unit-inches = ઇંચ +pdfjs-document-properties-page-size-unit-millimeters = મીમી +pdfjs-document-properties-page-size-orientation-portrait = ઉભું +pdfjs-document-properties-page-size-orientation-landscape = આડુ +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = પત્ર +pdfjs-document-properties-page-size-name-legal = કાયદાકીય + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = ઝડપી વૅબ દૃશ્ય: +pdfjs-document-properties-linearized-yes = હા +pdfjs-document-properties-linearized-no = ના +pdfjs-document-properties-close-button = બંધ કરો + +## Print + +pdfjs-print-progress-message = છાપકામ માટે દસ્તાવેજ તૈયાર કરી રહ્યા છે… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = રદ કરો +pdfjs-printing-not-supported = ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી. +pdfjs-printing-not-ready = Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = ટૉગલ બાજુપટ્ટી +pdfjs-toggle-sidebar-button-label = ટૉગલ બાજુપટ્ટી +pdfjs-document-outline-button = + .title = દસ્તાવેજની રૂપરેખા બતાવો(બધી આઇટમ્સને વિસ્તૃત/સંકુચિત કરવા માટે ડબલ-ક્લિક કરો) +pdfjs-document-outline-button-label = દસ્તાવેજ રૂપરેખા +pdfjs-attachments-button = + .title = જોડાણોને બતાવો +pdfjs-attachments-button-label = જોડાણો +pdfjs-thumbs-button = + .title = થંબનેલ્સ બતાવો +pdfjs-thumbs-button-label = થંબનેલ્સ +pdfjs-findbar-button = + .title = દસ્તાવેજમાં શોધો +pdfjs-findbar-button-label = શોધો + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = પાનું { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = પાનાં { $page } નું થંબનેલ્સ + +## Find panel button title and messages + +pdfjs-find-input = + .title = શોધો + .placeholder = દસ્તાવેજમાં શોધો… +pdfjs-find-previous-button = + .title = શબ્દસમૂહની પાછલી ઘટનાને શોધો +pdfjs-find-previous-button-label = પહેલાંનુ +pdfjs-find-next-button = + .title = શબ્દસમૂહની આગળની ઘટનાને શોધો +pdfjs-find-next-button-label = આગળનું +pdfjs-find-highlight-checkbox = બધુ પ્રકાશિત કરો +pdfjs-find-match-case-checkbox-label = કેસ બંધબેસાડો +pdfjs-find-entire-word-checkbox-label = સંપૂર્ણ શબ્દો +pdfjs-find-reached-top = દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ +pdfjs-find-reached-bottom = દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ +pdfjs-find-not-found = શબ્દસમૂહ મળ્યુ નથી + +## Predefined zoom values + +pdfjs-page-scale-width = પાનાની પહોળાઇ +pdfjs-page-scale-fit = પાનું બંધબેસતુ +pdfjs-page-scale-auto = આપમેળે નાનુંમોટુ કરો +pdfjs-page-scale-actual = ચોક્કસ માપ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય. +pdfjs-invalid-file-error = અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ. +pdfjs-missing-file-error = ગુમ થયેલ PDF ફાઇલ. +pdfjs-unexpected-response-error = અનપેક્ષિત સર્વર પ્રતિસાદ. +pdfjs-rendering-error = ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો. +pdfjs-password-invalid = અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો. +pdfjs-password-ok-button = બરાબર +pdfjs-password-cancel-button = રદ કરો +pdfjs-web-fonts-disabled = વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/he/viewer.ftl b/public/pdfjs/web/locale/he/viewer.ftl new file mode 100644 index 0000000..08308c0 --- /dev/null +++ b/public/pdfjs/web/locale/he/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = דף קודם +pdfjs-previous-button-label = קודם +pdfjs-next-button = + .title = דף הבא +pdfjs-next-button-label = הבא +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = דף +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = מתוך { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } מתוך { $pagesCount }) +pdfjs-zoom-out-button = + .title = התרחקות +pdfjs-zoom-out-button-label = התרחקות +pdfjs-zoom-in-button = + .title = התקרבות +pdfjs-zoom-in-button-label = התקרבות +pdfjs-zoom-select = + .title = מרחק מתצוגה +pdfjs-presentation-mode-button = + .title = מעבר למצב מצגת +pdfjs-presentation-mode-button-label = מצב מצגת +pdfjs-open-file-button = + .title = פתיחת קובץ +pdfjs-open-file-button-label = פתיחה +pdfjs-print-button = + .title = הדפסה +pdfjs-print-button-label = הדפסה +pdfjs-save-button = + .title = שמירה +pdfjs-save-button-label = שמירה +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = הורדה +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = הורדה +pdfjs-bookmark-button = + .title = עמוד נוכחי (הצגת כתובת האתר מהעמוד הנוכחי) +pdfjs-bookmark-button-label = עמוד נוכחי + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = כלים +pdfjs-tools-button-label = כלים +pdfjs-first-page-button = + .title = מעבר לעמוד הראשון +pdfjs-first-page-button-label = מעבר לעמוד הראשון +pdfjs-last-page-button = + .title = מעבר לעמוד האחרון +pdfjs-last-page-button-label = מעבר לעמוד האחרון +pdfjs-page-rotate-cw-button = + .title = הטיה עם כיוון השעון +pdfjs-page-rotate-cw-button-label = הטיה עם כיוון השעון +pdfjs-page-rotate-ccw-button = + .title = הטיה כנגד כיוון השעון +pdfjs-page-rotate-ccw-button-label = הטיה כנגד כיוון השעון +pdfjs-cursor-text-select-tool-button = + .title = הפעלת כלי בחירת טקסט +pdfjs-cursor-text-select-tool-button-label = כלי בחירת טקסט +pdfjs-cursor-hand-tool-button = + .title = הפעלת כלי היד +pdfjs-cursor-hand-tool-button-label = כלי יד +pdfjs-scroll-page-button = + .title = שימוש בגלילת עמוד +pdfjs-scroll-page-button-label = גלילת עמוד +pdfjs-scroll-vertical-button = + .title = שימוש בגלילה אנכית +pdfjs-scroll-vertical-button-label = גלילה אנכית +pdfjs-scroll-horizontal-button = + .title = שימוש בגלילה אופקית +pdfjs-scroll-horizontal-button-label = גלילה אופקית +pdfjs-scroll-wrapped-button = + .title = שימוש בגלילה רציפה +pdfjs-scroll-wrapped-button-label = גלילה רציפה +pdfjs-spread-none-button = + .title = לא לצרף מפתחי עמודים +pdfjs-spread-none-button-label = ללא מפתחים +pdfjs-spread-odd-button = + .title = צירוף מפתחי עמודים שמתחילים בדפים עם מספרים אי־זוגיים +pdfjs-spread-odd-button-label = מפתחים אי־זוגיים +pdfjs-spread-even-button = + .title = צירוף מפתחי עמודים שמתחילים בדפים עם מספרים זוגיים +pdfjs-spread-even-button-label = מפתחים זוגיים + +## Document properties dialog + +pdfjs-document-properties-button = + .title = מאפייני מסמך… +pdfjs-document-properties-button-label = מאפייני מסמך… +pdfjs-document-properties-file-name = שם קובץ: +pdfjs-document-properties-file-size = גודל הקובץ: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } ק״ב ({ $b } בתים) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } מ״ב ({ $b } בתים) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } ק״ב ({ $size_b } בתים) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } מ״ב ({ $size_b } בתים) +pdfjs-document-properties-title = כותרת: +pdfjs-document-properties-author = מחבר: +pdfjs-document-properties-subject = נושא: +pdfjs-document-properties-keywords = מילות מפתח: +pdfjs-document-properties-creation-date = תאריך יצירה: +pdfjs-document-properties-modification-date = תאריך שינוי: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = יוצר: +pdfjs-document-properties-producer = יצרן PDF: +pdfjs-document-properties-version = גרסת PDF: +pdfjs-document-properties-page-count = מספר דפים: +pdfjs-document-properties-page-size = גודל העמוד: +pdfjs-document-properties-page-size-unit-inches = אינ׳ +pdfjs-document-properties-page-size-unit-millimeters = מ״מ +pdfjs-document-properties-page-size-orientation-portrait = לאורך +pdfjs-document-properties-page-size-orientation-landscape = לרוחב +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = מכתב +pdfjs-document-properties-page-size-name-legal = דף משפטי + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = תצוגת דף מהירה: +pdfjs-document-properties-linearized-yes = כן +pdfjs-document-properties-linearized-no = לא +pdfjs-document-properties-close-button = סגירה + +## Print + +pdfjs-print-progress-message = מסמך בהכנה להדפסה… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ביטול +pdfjs-printing-not-supported = אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה. +pdfjs-printing-not-ready = אזהרה: מסמך ה־PDF לא נטען לחלוטין עד מצב שמאפשר הדפסה. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = הצגה/הסתרה של סרגל הצד +pdfjs-toggle-sidebar-notification-button = + .title = החלפת תצוגת סרגל צד (מסמך שמכיל תוכן עניינים/קבצים מצורפים/שכבות) +pdfjs-toggle-sidebar-button-label = הצגה/הסתרה של סרגל הצד +pdfjs-document-outline-button = + .title = הצגת תוכן העניינים של המסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים) +pdfjs-document-outline-button-label = תוכן העניינים של המסמך +pdfjs-attachments-button = + .title = הצגת צרופות +pdfjs-attachments-button-label = צרופות +pdfjs-layers-button = + .title = הצגת שכבות (יש ללחוץ לחיצה כפולה כדי לאפס את כל השכבות למצב ברירת המחדל) +pdfjs-layers-button-label = שכבות +pdfjs-thumbs-button = + .title = הצגת תצוגה מקדימה +pdfjs-thumbs-button-label = תצוגה מקדימה +pdfjs-current-outline-item-button = + .title = מציאת פריט תוכן העניינים הנוכחי +pdfjs-current-outline-item-button-label = פריט תוכן העניינים הנוכחי +pdfjs-findbar-button = + .title = חיפוש במסמך +pdfjs-findbar-button-label = חיפוש +pdfjs-additional-layers = שכבות נוספות + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = עמוד { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = תצוגה מקדימה של עמוד { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = חיפוש + .placeholder = חיפוש במסמך… +pdfjs-find-previous-button = + .title = מציאת המופע הקודם של הביטוי +pdfjs-find-previous-button-label = קודם +pdfjs-find-next-button = + .title = מציאת המופע הבא של הביטוי +pdfjs-find-next-button-label = הבא +pdfjs-find-highlight-checkbox = הדגשת הכול +pdfjs-find-match-case-checkbox-label = התאמת אותיות +pdfjs-find-match-diacritics-checkbox-label = התאמה דיאקריטית +pdfjs-find-entire-word-checkbox-label = מילים שלמות +pdfjs-find-reached-top = הגיע לראש הדף, ממשיך מלמטה +pdfjs-find-reached-bottom = הגיע לסוף הדף, ממשיך מלמעלה +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } מתוך { $total } תוצאות + *[other] { $current } מתוך { $total } תוצאות + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] יותר מתוצאה אחת + *[other] יותר מ־{ $limit } תוצאות + } +pdfjs-find-not-found = הביטוי לא נמצא + +## Predefined zoom values + +pdfjs-page-scale-width = רוחב העמוד +pdfjs-page-scale-fit = התאמה לעמוד +pdfjs-page-scale-auto = מרחק מתצוגה אוטומטי +pdfjs-page-scale-actual = גודל אמיתי +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = עמוד { $page } + +## Loading indicator messages + +pdfjs-loading-error = אירעה שגיאה בעת טעינת ה־PDF. +pdfjs-invalid-file-error = קובץ PDF פגום או לא תקין. +pdfjs-missing-file-error = קובץ PDF חסר. +pdfjs-unexpected-response-error = תגובת שרת לא צפויה. +pdfjs-rendering-error = אירעה שגיאה בעת עיבוד הדף. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [הערת { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = נא להכניס את הססמה לפתיחת קובץ PDF זה. +pdfjs-password-invalid = ססמה שגויה. נא לנסות שנית. +pdfjs-password-ok-button = אישור +pdfjs-password-cancel-button = ביטול +pdfjs-web-fonts-disabled = גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים. + +## Editing + +pdfjs-editor-free-text-button = + .title = טקסט +pdfjs-editor-free-text-button-label = טקסט +pdfjs-editor-ink-button = + .title = ציור +pdfjs-editor-ink-button-label = ציור +pdfjs-editor-stamp-button = + .title = הוספה או עריכת תמונות +pdfjs-editor-stamp-button-label = הוספה או עריכת תמונות +pdfjs-editor-highlight-button = + .title = סימון +pdfjs-editor-highlight-button-label = סימון +pdfjs-highlight-floating-button1 = + .title = סימון + .aria-label = סימון +pdfjs-highlight-floating-button-label = סימון + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = הסרת ציור +pdfjs-editor-remove-freetext-button = + .title = הסרת טקסט +pdfjs-editor-remove-stamp-button = + .title = הסרת תמונה +pdfjs-editor-remove-highlight-button = + .title = הסרת סימון + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = צבע +pdfjs-editor-free-text-size-input = גודל +pdfjs-editor-ink-color-input = צבע +pdfjs-editor-ink-thickness-input = עובי +pdfjs-editor-ink-opacity-input = אטימות +pdfjs-editor-stamp-add-image-button = + .title = הוספת תמונה +pdfjs-editor-stamp-add-image-button-label = הוספת תמונה +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = עובי +pdfjs-editor-free-highlight-thickness-title = + .title = שינוי עובי בעת סימון פריטים שאינם טקסט +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = עורך טקסט + .default-content = נא להתחיל להקליד… +pdfjs-free-text = + .aria-label = עורך טקסט +pdfjs-free-text-default-content = להתחיל להקליד… +pdfjs-ink = + .aria-label = עורך ציור +pdfjs-ink-canvas = + .aria-label = תמונה שנוצרה על־ידי משתמש + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = טקסט חלופי +pdfjs-editor-alt-text-edit-button = + .aria-label = עריכת טקסט חלופי +pdfjs-editor-alt-text-edit-button-label = עריכת טקסט חלופי +pdfjs-editor-alt-text-dialog-label = בחירת אפשרות +pdfjs-editor-alt-text-dialog-description = טקסט חלופי עוזר כשאנשים לא יכולים לראות את התמונה או כשהיא לא נטענת. +pdfjs-editor-alt-text-add-description-label = הוספת תיאור +pdfjs-editor-alt-text-add-description-description = כדאי לתאר במשפט אחד או שניים את הנושא, התפאורה או הפעולות. +pdfjs-editor-alt-text-mark-decorative-label = סימון כדקורטיבי +pdfjs-editor-alt-text-mark-decorative-description = זה משמש לתמונות נוי, כמו גבולות או סימני מים. +pdfjs-editor-alt-text-cancel-button = ביטול +pdfjs-editor-alt-text-save-button = שמירה +pdfjs-editor-alt-text-decorative-tooltip = מסומן כדקורטיבי +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = לדוגמה, ״גבר צעיר מתיישב ליד שולחן לאכול ארוחה״ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = טקסט חלופי + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = פינה שמאלית עליונה - שינוי גודל +pdfjs-editor-resizer-label-top-middle = למעלה באמצע - שינוי גודל +pdfjs-editor-resizer-label-top-right = פינה ימנית עליונה - שינוי גודל +pdfjs-editor-resizer-label-middle-right = ימינה באמצע - שינוי גודל +pdfjs-editor-resizer-label-bottom-right = פינה ימנית תחתונה - שינוי גודל +pdfjs-editor-resizer-label-bottom-middle = למטה באמצע - שינוי גודל +pdfjs-editor-resizer-label-bottom-left = פינה שמאלית תחתונה - שינוי גודל +pdfjs-editor-resizer-label-middle-left = שמאלה באמצע - שינוי גודל +pdfjs-editor-resizer-top-left = + .aria-label = פינה שמאלית עליונה - שינוי גודל +pdfjs-editor-resizer-top-middle = + .aria-label = למעלה באמצע - שינוי גודל +pdfjs-editor-resizer-top-right = + .aria-label = פינה ימנית עליונה - שינוי גודל +pdfjs-editor-resizer-middle-right = + .aria-label = ימינה באמצע - שינוי גודל +pdfjs-editor-resizer-bottom-right = + .aria-label = פינה ימנית תחתונה - שינוי גודל +pdfjs-editor-resizer-bottom-middle = + .aria-label = למטה באמצע - שינוי גודל +pdfjs-editor-resizer-bottom-left = + .aria-label = פינה שמאלית תחתונה - שינוי גודל +pdfjs-editor-resizer-middle-left = + .aria-label = שמאלה באמצע - שינוי גודל + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = צבע סימון +pdfjs-editor-colorpicker-button = + .title = שינוי צבע +pdfjs-editor-colorpicker-dropdown = + .aria-label = בחירת צבע +pdfjs-editor-colorpicker-yellow = + .title = צהוב +pdfjs-editor-colorpicker-green = + .title = ירוק +pdfjs-editor-colorpicker-blue = + .title = כחול +pdfjs-editor-colorpicker-pink = + .title = ורוד +pdfjs-editor-colorpicker-red = + .title = אדום + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = הצגת הכול +pdfjs-editor-highlight-show-all-button = + .title = הצגת הכול + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = עריכת טקסט חלופי (תיאור תמונה) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = הוספת טקסט חלופי (תיאור תמונה) +pdfjs-editor-new-alt-text-textarea = + .placeholder = נא לכתוב את התיאור שלך כאן… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = תיאור קצר לאנשים שאינם יכולים לראות את התמונה או כאשר התמונה אינה נטענת. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = טקסט חלופי זה נוצר באופן אוטומטי ועשוי להיות לא מדויק. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = מידע נוסף +pdfjs-editor-new-alt-text-create-automatically-button-label = יצירת טקסט חלופי באופן אוטומטי +pdfjs-editor-new-alt-text-not-now-button = לא כעת +pdfjs-editor-new-alt-text-error-title = לא ניתן היה ליצור טקסט חלופי באופן אוטומטי +pdfjs-editor-new-alt-text-error-description = נא לכתוב טקסט חלופי משלך או לנסות שוב מאוחר יותר. +pdfjs-editor-new-alt-text-error-close-button = סגירה +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = בתהליך הורדת מודל AI של טקסט חלופי ({ $downloadedSize } מתוך { $totalSize } מ״ב) + .aria-valuetext = בתהליך הורדת מודל AI של טקסט חלופי ({ $downloadedSize } מתוך { $totalSize } מ״ב) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = נוסף טקסט חלופי +pdfjs-editor-new-alt-text-added-button-label = נוסף טקסט חלופי +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = חסר טקסט חלופי +pdfjs-editor-new-alt-text-missing-button-label = חסר טקסט חלופי +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = סקירת טקסט חלופי +pdfjs-editor-new-alt-text-to-review-button-label = סקירת טקסט חלופי +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = נוצר באופן אוטומטי: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = הגדרות טקסט חלופי של תמונה +pdfjs-image-alt-text-settings-button-label = הגדרות טקסט חלופי של תמונה +pdfjs-editor-alt-text-settings-dialog-label = הגדרות טקסט חלופי של תמונה +pdfjs-editor-alt-text-settings-automatic-title = טקסט חלופי אוטומטי +pdfjs-editor-alt-text-settings-create-model-button-label = יצירת טקסט חלופי באופן אוטומטי +pdfjs-editor-alt-text-settings-create-model-description = הצעת תיאורים כדי לסייע לאנשים שאינם יכולים לראות את התמונה או כאשר התמונה אינה נטענת. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = מודל AI לטקסט חלופי ({ $totalSize } מ״ב) +pdfjs-editor-alt-text-settings-ai-model-description = פועל באופן מקומי במכשיר שלך כך שהנתונים שלך נשארים פרטיים. נדרש עבור טקסט חלופי אוטומטי. +pdfjs-editor-alt-text-settings-delete-model-button = מחיקה +pdfjs-editor-alt-text-settings-download-model-button = הורדה +pdfjs-editor-alt-text-settings-downloading-model-button = בהורדה… +pdfjs-editor-alt-text-settings-editor-title = עורך טקסט חלופי +pdfjs-editor-alt-text-settings-show-dialog-button-label = הצגת עורך טקסט חלופי מיד בעת הוספת תמונה +pdfjs-editor-alt-text-settings-show-dialog-description = מסייע לך לוודא שלכל התמונות שלך יש טקסט חלופי. +pdfjs-editor-alt-text-settings-close-button = סגירה + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = הסימון הוסר +pdfjs-editor-undo-bar-message-freetext = הטקסט הוסר +pdfjs-editor-undo-bar-message-ink = הציור הוסר +pdfjs-editor-undo-bar-message-stamp = התמונה הוסרה +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] הערה אחת הוסרה + *[other] { $count } הערות הוסרו + } +pdfjs-editor-undo-bar-undo-button = + .title = ביטול פעולה +pdfjs-editor-undo-bar-undo-button-label = ביטול פעלה +pdfjs-editor-undo-bar-close-button = + .title = סגירה +pdfjs-editor-undo-bar-close-button-label = סגירה diff --git a/public/pdfjs/web/locale/hi-IN/viewer.ftl b/public/pdfjs/web/locale/hi-IN/viewer.ftl new file mode 100644 index 0000000..b6f378f --- /dev/null +++ b/public/pdfjs/web/locale/hi-IN/viewer.ftl @@ -0,0 +1,267 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = पिछला पृष्ठ +pdfjs-previous-button-label = पिछला +pdfjs-next-button = + .title = अगला पृष्ठ +pdfjs-next-button-label = आगे +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = पृष्ठ: +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } का +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = छोटा करें +pdfjs-zoom-out-button-label = छोटा करें +pdfjs-zoom-in-button = + .title = बड़ा करें +pdfjs-zoom-in-button-label = बड़ा करें +pdfjs-zoom-select = + .title = बड़ा-छोटा करें +pdfjs-presentation-mode-button = + .title = प्रस्तुति अवस्था में जाएँ +pdfjs-presentation-mode-button-label = प्रस्तुति अवस्था +pdfjs-open-file-button = + .title = फ़ाइल खोलें +pdfjs-open-file-button-label = खोलें +pdfjs-print-button = + .title = छापें +pdfjs-print-button-label = छापें + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = औज़ार +pdfjs-tools-button-label = औज़ार +pdfjs-first-page-button = + .title = प्रथम पृष्ठ पर जाएँ +pdfjs-first-page-button-label = प्रथम पृष्ठ पर जाएँ +pdfjs-last-page-button = + .title = अंतिम पृष्ठ पर जाएँ +pdfjs-last-page-button-label = अंतिम पृष्ठ पर जाएँ +pdfjs-page-rotate-cw-button = + .title = घड़ी की दिशा में घुमाएँ +pdfjs-page-rotate-cw-button-label = घड़ी की दिशा में घुमाएँ +pdfjs-page-rotate-ccw-button = + .title = घड़ी की दिशा से उल्टा घुमाएँ +pdfjs-page-rotate-ccw-button-label = घड़ी की दिशा से उल्टा घुमाएँ +pdfjs-cursor-text-select-tool-button = + .title = पाठ चयन उपकरण सक्षम करें +pdfjs-cursor-text-select-tool-button-label = पाठ चयन उपकरण +pdfjs-cursor-hand-tool-button = + .title = हस्त उपकरण सक्षम करें +pdfjs-cursor-hand-tool-button-label = हस्त उपकरण +pdfjs-scroll-vertical-button = + .title = लंबवत स्क्रॉलिंग का उपयोग करें +pdfjs-scroll-vertical-button-label = लंबवत स्क्रॉलिंग +pdfjs-scroll-horizontal-button = + .title = क्षितिजिय स्क्रॉलिंग का उपयोग करें +pdfjs-scroll-horizontal-button-label = क्षितिजिय स्क्रॉलिंग +pdfjs-scroll-wrapped-button = + .title = व्राप्पेड स्क्रॉलिंग का उपयोग करें +pdfjs-spread-none-button-label = कोई स्प्रेड उपलब्ध नहीं +pdfjs-spread-odd-button = + .title = विषम-क्रमांकित पृष्ठों से प्रारंभ होने वाले पृष्ठ स्प्रेड में शामिल हों +pdfjs-spread-odd-button-label = विषम फैलाव + +## Document properties dialog + +pdfjs-document-properties-button = + .title = दस्तावेज़ विशेषता... +pdfjs-document-properties-button-label = दस्तावेज़ विशेषता... +pdfjs-document-properties-file-name = फ़ाइल नाम: +pdfjs-document-properties-file-size = फाइल आकारः +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = शीर्षक: +pdfjs-document-properties-author = लेखकः +pdfjs-document-properties-subject = विषय: +pdfjs-document-properties-keywords = कुंजी-शब्द: +pdfjs-document-properties-creation-date = निर्माण दिनांक: +pdfjs-document-properties-modification-date = संशोधन दिनांक: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = निर्माता: +pdfjs-document-properties-producer = PDF उत्पादक: +pdfjs-document-properties-version = PDF संस्करण: +pdfjs-document-properties-page-count = पृष्ठ गिनती: +pdfjs-document-properties-page-size = पृष्ठ आकार: +pdfjs-document-properties-page-size-unit-inches = इंच +pdfjs-document-properties-page-size-unit-millimeters = मिमी +pdfjs-document-properties-page-size-orientation-portrait = पोर्ट्रेट +pdfjs-document-properties-page-size-orientation-landscape = लैंडस्केप +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = पत्र +pdfjs-document-properties-page-size-name-legal = क़ानूनी + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = तीव्र वेब व्यू: +pdfjs-document-properties-linearized-yes = हाँ +pdfjs-document-properties-linearized-no = नहीं +pdfjs-document-properties-close-button = बंद करें + +## Print + +pdfjs-print-progress-message = छपाई के लिए दस्तावेज़ को तैयार किया जा रहा है... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = रद्द करें +pdfjs-printing-not-supported = चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है. +pdfjs-printing-not-ready = चेतावनी: PDF छपाई के लिए पूरी तरह से लोड नहीं है. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = स्लाइडर टॉगल करें +pdfjs-toggle-sidebar-button-label = स्लाइडर टॉगल करें +pdfjs-document-outline-button = + .title = दस्तावेज़ की रूपरेखा दिखाइए (सारी वस्तुओं को फलने अथवा समेटने के लिए दो बार क्लिक करें) +pdfjs-document-outline-button-label = दस्तावेज़ आउटलाइन +pdfjs-attachments-button = + .title = संलग्नक दिखायें +pdfjs-attachments-button-label = संलग्नक +pdfjs-thumbs-button = + .title = लघुछवियाँ दिखाएँ +pdfjs-thumbs-button-label = लघु छवि +pdfjs-findbar-button = + .title = दस्तावेज़ में ढूँढ़ें +pdfjs-findbar-button-label = ढूँढें + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = पृष्ठ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = पृष्ठ { $page } की लघु-छवि + +## Find panel button title and messages + +pdfjs-find-input = + .title = ढूँढें + .placeholder = दस्तावेज़ में खोजें... +pdfjs-find-previous-button = + .title = वाक्यांश की पिछली उपस्थिति ढूँढ़ें +pdfjs-find-previous-button-label = पिछला +pdfjs-find-next-button = + .title = वाक्यांश की अगली उपस्थिति ढूँढ़ें +pdfjs-find-next-button-label = अगला +pdfjs-find-highlight-checkbox = सभी आलोकित करें +pdfjs-find-match-case-checkbox-label = मिलान स्थिति +pdfjs-find-entire-word-checkbox-label = संपूर्ण शब्द +pdfjs-find-reached-top = पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें +pdfjs-find-reached-bottom = पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी +pdfjs-find-not-found = वाक्यांश नहीं मिला + +## Predefined zoom values + +pdfjs-page-scale-width = पृष्ठ चौड़ाई +pdfjs-page-scale-fit = पृष्ठ फिट +pdfjs-page-scale-auto = स्वचालित जूम +pdfjs-page-scale-actual = वास्तविक आकार +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF लोड करते समय एक त्रुटि हुई. +pdfjs-invalid-file-error = अमान्य या भ्रष्ट PDF फ़ाइल. +pdfjs-missing-file-error = अनुपस्थित PDF फ़ाइल. +pdfjs-unexpected-response-error = अप्रत्याशित सर्वर प्रतिक्रिया. +pdfjs-rendering-error = पृष्ठ रेंडरिंग के दौरान त्रुटि आई. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = इस PDF फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें. +pdfjs-password-invalid = अवैध कूटशब्द, कृपया फिर कोशिश करें. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = रद्द करें +pdfjs-web-fonts-disabled = वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ. + +## Editing + + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = रंग + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/hr/viewer.ftl b/public/pdfjs/web/locale/hr/viewer.ftl new file mode 100644 index 0000000..c081c6f --- /dev/null +++ b/public/pdfjs/web/locale/hr/viewer.ftl @@ -0,0 +1,473 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Prethodna stranica +pdfjs-previous-button-label = Prethodna +pdfjs-next-button = + .title = Sljedeća stranica +pdfjs-next-button-label = Sljedeća +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Stranica +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = od { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } od { $pagesCount }) +pdfjs-zoom-out-button = + .title = Umanji +pdfjs-zoom-out-button-label = Umanji +pdfjs-zoom-in-button = + .title = Uvećaj +pdfjs-zoom-in-button-label = Uvećaj +pdfjs-zoom-select = + .title = Zumiranje +pdfjs-presentation-mode-button = + .title = Prebaci u modus prezentacija +pdfjs-presentation-mode-button-label = Modus prezentacija +pdfjs-open-file-button = + .title = Otvori datoteku +pdfjs-open-file-button-label = Otvori +pdfjs-print-button = + .title = Ispiši +pdfjs-print-button-label = Ispiši +pdfjs-save-button = + .title = Spremi +pdfjs-save-button-label = Spremi +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Preuzimanja +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Preuzimanja +pdfjs-bookmark-button = + .title = Trenutna stranica (pogledajte URL s trenutne stranice) +pdfjs-bookmark-button-label = Trenutna stranica + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Alati +pdfjs-tools-button-label = Alati +pdfjs-first-page-button = + .title = Idi na prvu stranicu +pdfjs-first-page-button-label = Idi na prvu stranicu +pdfjs-last-page-button = + .title = Idi na posljednju stranicu +pdfjs-last-page-button-label = Idi na posljednju stranicu +pdfjs-page-rotate-cw-button = + .title = Rotiraj u smjeru kazaljke na satu +pdfjs-page-rotate-cw-button-label = Rotiraj u smjeru kazaljke na satu +pdfjs-page-rotate-ccw-button = + .title = Rotiraj obrnutno od smjera kazaljke na satu +pdfjs-page-rotate-ccw-button-label = Rotiraj obrnutno od smjera kazaljke na satu +pdfjs-cursor-text-select-tool-button = + .title = Aktiviraj alat za biranje teksta +pdfjs-cursor-text-select-tool-button-label = Alat za označavanje teksta +pdfjs-cursor-hand-tool-button = + .title = Aktiviraj ručni alat +pdfjs-cursor-hand-tool-button-label = Ručni alat +pdfjs-scroll-page-button = + .title = Koristi klizanje stranice +pdfjs-scroll-page-button-label = Klizanje stranice +pdfjs-scroll-vertical-button = + .title = Koristi okomito pomicanje +pdfjs-scroll-vertical-button-label = Okomito pomicanje +pdfjs-scroll-horizontal-button = + .title = Koristi vodoravno pomicanje +pdfjs-scroll-horizontal-button-label = Vodoravno pomicanje +pdfjs-scroll-wrapped-button = + .title = Koristi kontinuirani raspored stranica +pdfjs-scroll-wrapped-button-label = Kontinuirani raspored stranica +pdfjs-spread-none-button = + .title = Ne izrađuj duplerice +pdfjs-spread-none-button-label = Pojedinačne stranice +pdfjs-spread-odd-button = + .title = Izradi duplerice koje počinju s neparnim stranicama +pdfjs-spread-odd-button-label = Neparne duplerice +pdfjs-spread-even-button = + .title = Izradi duplerice koje počinju s parnim stranicama +pdfjs-spread-even-button-label = Parne duplerice + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Svojstva dokumenta … +pdfjs-document-properties-button-label = Svojstva dokumenta … +pdfjs-document-properties-file-name = Ime datoteke: +pdfjs-document-properties-file-size = Veličina datoteke: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtova) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtova) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtova) +pdfjs-document-properties-title = Naslov: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Predmet: +pdfjs-document-properties-keywords = Ključne riječi: +pdfjs-document-properties-creation-date = Datum stvaranja: +pdfjs-document-properties-modification-date = Datum promjene: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Stvaratelj: +pdfjs-document-properties-producer = PDF stvaratelj: +pdfjs-document-properties-version = PDF verzija: +pdfjs-document-properties-page-count = Broj stranica: +pdfjs-document-properties-page-size = Dimenzije stranice: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = uspravno +pdfjs-document-properties-page-size-orientation-landscape = položeno +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Brzi web pregled: +pdfjs-document-properties-linearized-yes = Da +pdfjs-document-properties-linearized-no = Ne +pdfjs-document-properties-close-button = Zatvori + +## Print + +pdfjs-print-progress-message = Pripremanje dokumenta za ispis… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Odustani +pdfjs-printing-not-supported = Upozorenje: Ovaj preglednik ne podržava u potpunosti ispisivanje. +pdfjs-printing-not-ready = Upozorenje: PDF nije u potpunosti učitan za ispis. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Prikaži/sakrij bočnu traku +pdfjs-toggle-sidebar-notification-button = + .title = Prikazivanje i sklanjanje bočne trake (dokument sadrži strukturu/privitke/slojeve) +pdfjs-toggle-sidebar-button-label = Prikaži/sakrij bočnu traku +pdfjs-document-outline-button = + .title = Prikaži strukturu dokumenta (dvostruki klik za rasklapanje/sklapanje svih stavki) +pdfjs-document-outline-button-label = Struktura dokumenta +pdfjs-attachments-button = + .title = Prikaži privitke +pdfjs-attachments-button-label = Privitci +pdfjs-layers-button = + .title = Prikaži slojeve (dvoklik za vraćanje svih slojeva u standardno stanje) +pdfjs-layers-button-label = Slojevi +pdfjs-thumbs-button = + .title = Prikaži minijature +pdfjs-thumbs-button-label = Minijature +pdfjs-current-outline-item-button = + .title = Pronađi trenutačni element strukture +pdfjs-current-outline-item-button-label = Trenutačni element strukture +pdfjs-findbar-button = + .title = Pronađi u dokumentu +pdfjs-findbar-button-label = Pronađi +pdfjs-additional-layers = Dodatni slojevi + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Stranica { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Minijatura stranice { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Pronađi + .placeholder = Pronađi u dokumentu … +pdfjs-find-previous-button = + .title = Pronađi prethodno pojavljivanje ovog izraza +pdfjs-find-previous-button-label = Prethodno +pdfjs-find-next-button = + .title = Pronađi sljedeće pojavljivanje ovog izraza +pdfjs-find-next-button-label = Dalje +pdfjs-find-highlight-checkbox = Istankni sve +pdfjs-find-match-case-checkbox-label = Razlikovanje velikih i malih slova +pdfjs-find-match-diacritics-checkbox-label = Razlikuj dijakritičke znakove +pdfjs-find-entire-word-checkbox-label = Cijele riječi +pdfjs-find-reached-top = Dosegnut početak dokumenta, nastavak s kraja +pdfjs-find-reached-bottom = Dosegnut kraj dokumenta, nastavak s početka +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } od { $total } rezultata + [few] { $current } od { $total } rezultata + *[other] { $current } od { $total } rezultata + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Više od { $limit } rezultat + [few] Više od { $limit } rezultata + *[other] Više od { $limit } rezultata + } +pdfjs-find-not-found = Izraz nije pronađen + +## Predefined zoom values + +pdfjs-page-scale-width = Prilagodi širini prozora +pdfjs-page-scale-fit = Prilagodi veličini prozora +pdfjs-page-scale-auto = Automatsko zumiranje +pdfjs-page-scale-actual = Stvarna veličina +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Stranica { $page } + +## Loading indicator messages + +pdfjs-loading-error = Došlo je do greške pri učitavanju PDF-a. +pdfjs-invalid-file-error = Neispravna ili oštećena PDF datoteka. +pdfjs-missing-file-error = Nedostaje PDF datoteka. +pdfjs-unexpected-response-error = Neočekivani odgovor servera. +pdfjs-rendering-error = Došlo je do greške prilikom iscrtavanja stranice. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Bilješka] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Za otvoranje ove PDF datoteku upiši lozinku. +pdfjs-password-invalid = Neispravna lozinka. Pokušaj ponovo. +pdfjs-password-ok-button = U redu +pdfjs-password-cancel-button = Odustani +pdfjs-web-fonts-disabled = Web fontovi su deaktivirani: nije moguće koristiti ugrađene PDF fontove. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Crtanje +pdfjs-editor-ink-button-label = Crtanje +pdfjs-editor-stamp-button = + .title = Dodajte ili uredite slike +pdfjs-editor-stamp-button-label = Dodajte ili uredite slike +pdfjs-editor-highlight-button = + .title = Istakni +pdfjs-editor-highlight-button-label = Istakni +pdfjs-highlight-floating-button1 = + .title = Istakni + .aria-label = Istakni +pdfjs-highlight-floating-button-label = Istakni + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Ukloni crtež +pdfjs-editor-remove-freetext-button = + .title = Ukloni tekst +pdfjs-editor-remove-stamp-button = + .title = Ukloni sliku +pdfjs-editor-remove-highlight-button = + .title = Ukloni isticanje + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Boja +pdfjs-editor-free-text-size-input = Veličina +pdfjs-editor-ink-color-input = Boja +pdfjs-editor-ink-thickness-input = Debljina +pdfjs-editor-ink-opacity-input = Neprozirnost +pdfjs-editor-stamp-add-image-button = + .title = Dodaj sliku +pdfjs-editor-stamp-add-image-button-label = Dodaj sliku +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Debljina +pdfjs-editor-free-highlight-thickness-title = + .title = Promjeni debljinu pri isticanju drugih stavki osim teksta +pdfjs-free-text = + .aria-label = Uređivač teksta +pdfjs-free-text-default-content = Počni tipkati … +pdfjs-ink = + .aria-label = Uređivač crteža +pdfjs-ink-canvas = + .aria-label = Slika koju je izradio korisnik + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternativni tekst +pdfjs-editor-alt-text-edit-button-label = Uredi alternativni tekst +pdfjs-editor-alt-text-dialog-label = Odaberi jednu opciju +pdfjs-editor-alt-text-dialog-description = Alternativni tekst pomaže slijepim osobama ili kada se slika ne učita. +pdfjs-editor-alt-text-add-description-label = Dodaj opis +pdfjs-editor-alt-text-add-description-description = Sažmi sadržaj predmeta, okruženje ili radnje u jednoj ili dvije rečenice. +pdfjs-editor-alt-text-mark-decorative-label = Označi kao ukrasno +pdfjs-editor-alt-text-mark-decorative-description = Ovo se koristi za ukrasne slike, poput rubova ili vodenih žigova. +pdfjs-editor-alt-text-cancel-button = Odustani +pdfjs-editor-alt-text-save-button = Spremi +pdfjs-editor-alt-text-decorative-tooltip = Označeno kao ukrasno +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na primjer, „Mladić sjeda za stol kako bi jeo” + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Gornji lijevi kut – promijeni veličinu +pdfjs-editor-resizer-label-top-middle = Sredina gore – promijeni veličinu +pdfjs-editor-resizer-label-top-right = Gornji desni kut – promijeni veličinu +pdfjs-editor-resizer-label-middle-right = Sredina desno – promijeni veličinu +pdfjs-editor-resizer-label-bottom-right = Donji desni kut – promijeni veličinu +pdfjs-editor-resizer-label-bottom-middle = Sredina dolje – promjeni veličinu +pdfjs-editor-resizer-label-bottom-left = Donji lijevi kut – promijeni veličinu +pdfjs-editor-resizer-label-middle-left = Sredina lijevo – promijeni veličinu +pdfjs-editor-resizer-top-left = + .aria-label = Gornji lijevi kut – promijeni veličinu +pdfjs-editor-resizer-top-middle = + .aria-label = Sredina gore – promijeni veličinu +pdfjs-editor-resizer-top-right = + .aria-label = Gornji desni kut – promijeni veličinu +pdfjs-editor-resizer-middle-right = + .aria-label = Sredina desno – promijeni veličinu +pdfjs-editor-resizer-bottom-right = + .aria-label = Donji desni kut – promijeni veličinu +pdfjs-editor-resizer-bottom-middle = + .aria-label = Sredina dolje – promjeni veličinu +pdfjs-editor-resizer-bottom-left = + .aria-label = Donji lijevi kut – promijeni veličinu +pdfjs-editor-resizer-middle-left = + .aria-label = Sredina lijevo – promijeni veličinu + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Boja isticanja +pdfjs-editor-colorpicker-button = + .title = Promjeni boju +pdfjs-editor-colorpicker-dropdown = + .aria-label = Izbor boja +pdfjs-editor-colorpicker-yellow = + .title = Žuta +pdfjs-editor-colorpicker-green = + .title = Zelena +pdfjs-editor-colorpicker-blue = + .title = Plava +pdfjs-editor-colorpicker-pink = + .title = Ružičasta +pdfjs-editor-colorpicker-red = + .title = Crvena + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Prikaži sve +pdfjs-editor-highlight-show-all-button = + .title = Prikaži sve + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-textarea = + .placeholder = Ovdje upiši tvoj opis … +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ovaj je alternativni tekst stvoren automatski i može biti netočan. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saznaj više +pdfjs-editor-new-alt-text-create-automatically-button-label = Automatski stvori alternativni tekst +pdfjs-editor-new-alt-text-error-title = Nije bilo moguće automatski izraditi alternativni tekst +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Preuzimanje alternativnog teksta UI modela ({ $downloadedSize } od { $totalSize } MB) + .aria-valuetext = Preuzimanje alternativnog teksta UI modela ({ $downloadedSize } od { $totalSize } MB) +pdfjs-editor-new-alt-text-added-button-label = Alternativni tekst je dodan +pdfjs-editor-new-alt-text-missing-button-label = Nedostaje alternativni tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Pregledaj alternativni tekst +pdfjs-editor-new-alt-text-to-review-button-label = Pregledaj alternativni tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Stvoreno automatski: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Postavke alternativnog teksta slike +pdfjs-image-alt-text-settings-button-label = Postavke alternativnog teksta slike +pdfjs-editor-alt-text-settings-dialog-label = Postavke alternativnog teksta slike +pdfjs-editor-alt-text-settings-automatic-title = Automatski alternativni tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Stvori alternativni tekst automatski +pdfjs-editor-alt-text-settings-create-model-description = Predlaže opise koji pomažu osobama koji ne mogu vidjeti sliku ili kada se slika ne učita. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativni tekst UI modela ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Radi lokalno na tvom uređaju kako bi tvoji podaci ostali privatni. Potrebno za automatski alternativni tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Izbriši +pdfjs-editor-alt-text-settings-download-model-button = Preuzmi +pdfjs-editor-alt-text-settings-downloading-model-button = Preuzimanje … +pdfjs-editor-alt-text-settings-editor-title = Uređivač alternativnog teksta +pdfjs-editor-alt-text-settings-show-dialog-button-label = Prikaži uređivač alternativnog teksta odmah pri dodavanju slike +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaže osigurati da sve tvoje slike imaju alternativni tekst. +pdfjs-editor-alt-text-settings-close-button = Zatvori diff --git a/public/pdfjs/web/locale/hsb/viewer.ftl b/public/pdfjs/web/locale/hsb/viewer.ftl new file mode 100644 index 0000000..065ab8d --- /dev/null +++ b/public/pdfjs/web/locale/hsb/viewer.ftl @@ -0,0 +1,521 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Předchadna strona +pdfjs-previous-button-label = Wróćo +pdfjs-next-button = + .title = Přichodna strona +pdfjs-next-button-label = Dale +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Strona +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = z { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount }) +pdfjs-zoom-out-button = + .title = Pomjeńšić +pdfjs-zoom-out-button-label = Pomjeńšić +pdfjs-zoom-in-button = + .title = Powjetšić +pdfjs-zoom-in-button-label = Powjetšić +pdfjs-zoom-select = + .title = Skalowanje +pdfjs-presentation-mode-button = + .title = Do prezentaciskeho modusa přeńć +pdfjs-presentation-mode-button-label = Prezentaciski modus +pdfjs-open-file-button = + .title = Dataju wočinić +pdfjs-open-file-button-label = Wočinić +pdfjs-print-button = + .title = Ćišćeć +pdfjs-print-button-label = Ćišćeć +pdfjs-save-button = + .title = Składować +pdfjs-save-button-label = Składować +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Sćahnyć +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Sćahnyć +pdfjs-bookmark-button = + .title = Aktualna strona (URL z aktualneje strony pokazać) +pdfjs-bookmark-button-label = Aktualna strona + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Nastroje +pdfjs-tools-button-label = Nastroje +pdfjs-first-page-button = + .title = K prěnjej stronje +pdfjs-first-page-button-label = K prěnjej stronje +pdfjs-last-page-button = + .title = K poslednjej stronje +pdfjs-last-page-button-label = K poslednjej stronje +pdfjs-page-rotate-cw-button = + .title = K směrej časnika wjerćeć +pdfjs-page-rotate-cw-button-label = K směrej časnika wjerćeć +pdfjs-page-rotate-ccw-button = + .title = Přećiwo směrej časnika wjerćeć +pdfjs-page-rotate-ccw-button-label = Přećiwo směrej časnika wjerćeć +pdfjs-cursor-text-select-tool-button = + .title = Nastroj za wuběranje teksta zmóžnić +pdfjs-cursor-text-select-tool-button-label = Nastroj za wuběranje teksta +pdfjs-cursor-hand-tool-button = + .title = Ručny nastroj zmóžnić +pdfjs-cursor-hand-tool-button-label = Ručny nastroj +pdfjs-scroll-page-button = + .title = Kulenje strony wužiwać +pdfjs-scroll-page-button-label = Kulenje strony +pdfjs-scroll-vertical-button = + .title = Wertikalne suwanje wužiwać +pdfjs-scroll-vertical-button-label = Wertikalne suwanje +pdfjs-scroll-horizontal-button = + .title = Horicontalne suwanje wužiwać +pdfjs-scroll-horizontal-button-label = Horicontalne suwanje +pdfjs-scroll-wrapped-button = + .title = Postupne suwanje wužiwać +pdfjs-scroll-wrapped-button-label = Postupne suwanje +pdfjs-spread-none-button = + .title = Strony njezwjazać +pdfjs-spread-none-button-label = Žana dwójna strona +pdfjs-spread-odd-button = + .title = Strony započinajo z njerunymi stronami zwjazać +pdfjs-spread-odd-button-label = Njerune strony +pdfjs-spread-even-button = + .title = Strony započinajo z runymi stronami zwjazać +pdfjs-spread-even-button-label = Rune strony + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentowe kajkosće… +pdfjs-document-properties-button-label = Dokumentowe kajkosće… +pdfjs-document-properties-file-name = Mjeno dataje: +pdfjs-document-properties-file-size = Wulkosć dataje: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtow) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtow) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtow) +pdfjs-document-properties-title = Titul: +pdfjs-document-properties-author = Awtor: +pdfjs-document-properties-subject = Předmjet: +pdfjs-document-properties-keywords = Klučowe słowa: +pdfjs-document-properties-creation-date = Datum wutworjenja: +pdfjs-document-properties-modification-date = Datum změny: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Awtor: +pdfjs-document-properties-producer = PDF-zhotowjer: +pdfjs-document-properties-version = PDF-wersija: +pdfjs-document-properties-page-count = Ličba stronow: +pdfjs-document-properties-page-size = Wulkosć strony: +pdfjs-document-properties-page-size-unit-inches = cól +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = wysoki format +pdfjs-document-properties-page-size-orientation-landscape = prěčny format +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Haj +pdfjs-document-properties-linearized-no = Ně +pdfjs-document-properties-close-button = Začinić + +## Print + +pdfjs-print-progress-message = Dokument so za ćišćenje přihotuje… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Přetorhnyć +pdfjs-printing-not-supported = Warnowanje: Ćišćenje so přez tutón wobhladowak połnje njepodpěruje. +pdfjs-printing-not-ready = Warnowanje: PDF njeje so za ćišćenje dospołnje začitał. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Bóčnicu pokazać/schować +pdfjs-toggle-sidebar-notification-button = + .title = Bóčnicu přepinać (dokument rozrjad/přiwěški/woršty wobsahuje) +pdfjs-toggle-sidebar-button-label = Bóčnicu pokazać/schować +pdfjs-document-outline-button = + .title = Dokumentowy naćisk pokazać (dwójne kliknjenje, zo bychu so wšě zapiski pokazali/schowali) +pdfjs-document-outline-button-label = Dokumentowa struktura +pdfjs-attachments-button = + .title = Přiwěški pokazać +pdfjs-attachments-button-label = Přiwěški +pdfjs-layers-button = + .title = Woršty pokazać (klikńće dwójce, zo byšće wšě woršty na standardny staw wróćo stajił) +pdfjs-layers-button-label = Woršty +pdfjs-thumbs-button = + .title = Miniatury pokazać +pdfjs-thumbs-button-label = Miniatury +pdfjs-current-outline-item-button = + .title = Aktualny rozrjadowy zapisk pytać +pdfjs-current-outline-item-button-label = Aktualny rozrjadowy zapisk +pdfjs-findbar-button = + .title = W dokumenće pytać +pdfjs-findbar-button-label = Pytać +pdfjs-additional-layers = Dalše woršty + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Strona { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura strony { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Pytać + .placeholder = W dokumenće pytać… +pdfjs-find-previous-button = + .title = Předchadne wustupowanje pytanskeho wuraza pytać +pdfjs-find-previous-button-label = Wróćo +pdfjs-find-next-button = + .title = Přichodne wustupowanje pytanskeho wuraza pytać +pdfjs-find-next-button-label = Dale +pdfjs-find-highlight-checkbox = Wšě wuzběhnyć +pdfjs-find-match-case-checkbox-label = Wulkopisanje wobkedźbować +pdfjs-find-match-diacritics-checkbox-label = Diakritiske znamješka wužiwać +pdfjs-find-entire-word-checkbox-label = Cyłe słowa +pdfjs-find-reached-top = Spočatk dokumenta docpěty, pokročuje so z kóncom +pdfjs-find-reached-bottom = Kónc dokument docpěty, pokročuje so ze spočatkom +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } z { $total } wotpowědnika + [two] { $current } z { $total } wotpowědnikow + [few] { $current } z { $total } wotpowědnikow + *[other] { $current } z { $total } wotpowědnikow + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Wyše { $limit } wotpowědnik + [two] Wyše { $limit } wotpowědnikaj + [few] Wyše { $limit } wotpowědniki + *[other] Wyše { $limit } wotpowědnikow + } +pdfjs-find-not-found = Pytanski wuraz njeje so namakał + +## Predefined zoom values + +pdfjs-page-scale-width = Šěrokosć strony +pdfjs-page-scale-fit = Wulkosć strony +pdfjs-page-scale-auto = Awtomatiske skalowanje +pdfjs-page-scale-actual = Aktualna wulkosć +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Strona { $page } + +## Loading indicator messages + +pdfjs-loading-error = Při začitowanju PDF je zmylk wustupił. +pdfjs-invalid-file-error = Njepłaćiwa abo wobškodźena PDF-dataja. +pdfjs-missing-file-error = Falowaca PDF-dataja. +pdfjs-unexpected-response-error = Njewočakowana serwerowa wotmołwa. +pdfjs-rendering-error = Při zwobraznjenju strony je zmylk wustupił. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Typ přispomnjenki: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Zapodajće hesło, zo byšće PDF-dataju wočinił. +pdfjs-password-invalid = Njepłaćiwe hesło. Prošu spytajće hišće raz. +pdfjs-password-ok-button = W porjadku +pdfjs-password-cancel-button = Přetorhnyć +pdfjs-web-fonts-disabled = Webpisma su znjemóžnjene: njeje móžno, zasadźene PDF-pisma wužiwać. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Rysować +pdfjs-editor-ink-button-label = Rysować +pdfjs-editor-stamp-button = + .title = Wobrazy přidać abo wobdźěłać +pdfjs-editor-stamp-button-label = Wobrazy přidać abo wobdźěłać +pdfjs-editor-highlight-button = + .title = Wuzběhnyć +pdfjs-editor-highlight-button-label = Wuzběhnyć +pdfjs-highlight-floating-button1 = + .title = Wuzběhnjenje + .aria-label = Wuzběhnjenje +pdfjs-highlight-floating-button-label = Wuzběhnjenje + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Rysowanku wotstronić +pdfjs-editor-remove-freetext-button = + .title = Tekst wotstronić +pdfjs-editor-remove-stamp-button = + .title = Wobraz wotstronić +pdfjs-editor-remove-highlight-button = + .title = Wuzběhnjenje wotstronić + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Barba +pdfjs-editor-free-text-size-input = Wulkosć +pdfjs-editor-ink-color-input = Barba +pdfjs-editor-ink-thickness-input = Tołstosć +pdfjs-editor-ink-opacity-input = Opacita +pdfjs-editor-stamp-add-image-button = + .title = Wobraz přidać +pdfjs-editor-stamp-add-image-button-label = Wobraz přidać +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tołstosć +pdfjs-editor-free-highlight-thickness-title = + .title = Tołstosć změnić, hdyž so zapiski wuzběhuja, kotrež tekst njejsu +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstowy editor + .default-content = Započńće pisać … +pdfjs-free-text = + .aria-label = Tekstowy editor +pdfjs-free-text-default-content = Započńće pisać… +pdfjs-ink = + .aria-label = Rysowanski editor +pdfjs-ink-canvas = + .aria-label = Wobraz wutworjeny wot wužiwarja + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternatiwny tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatiwny tekst wobdźěłać +pdfjs-editor-alt-text-edit-button-label = Alternatiwny tekst wobdźěłać +pdfjs-editor-alt-text-dialog-label = Nastajenje wubrać +pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomha, hdyž ludźo njemóža wobraz widźeć abo hdyž so wobraz njezačita. +pdfjs-editor-alt-text-add-description-label = Wopisanje přidać +pdfjs-editor-alt-text-add-description-description = Pisajće 1 sadu abo 2 sadźe, kotrejž temu, nastajenje abo akcije wopisujetej. +pdfjs-editor-alt-text-mark-decorative-label = Jako dekoratiwny markěrować +pdfjs-editor-alt-text-mark-decorative-description = To so za pyšace wobrazy wužiwa, na přikład ramiki abo wodowe znamjenja. +pdfjs-editor-alt-text-cancel-button = Přetorhnyć +pdfjs-editor-alt-text-save-button = Składować +pdfjs-editor-alt-text-decorative-tooltip = Jako dekoratiwny markěrowany +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na přikład, „Młody muž za blidom sedźi, zo by jědź jědł“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatiwny tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Horjeka nalěwo – wulkosć změnić +pdfjs-editor-resizer-label-top-middle = Horjeka wosrjedź – wulkosć změnić +pdfjs-editor-resizer-label-top-right = Horjeka naprawo – wulkosć změnić +pdfjs-editor-resizer-label-middle-right = Wosrjedź naprawo – wulkosć změnić +pdfjs-editor-resizer-label-bottom-right = Deleka naprawo – wulkosć změnić +pdfjs-editor-resizer-label-bottom-middle = Deleka wosrjedź – wulkosć změnić +pdfjs-editor-resizer-label-bottom-left = Deleka nalěwo – wulkosć změnić +pdfjs-editor-resizer-label-middle-left = Wosrjedź nalěwo – wulkosć změnić +pdfjs-editor-resizer-top-left = + .aria-label = Horjeka nalěwo – wulkosć změnić +pdfjs-editor-resizer-top-middle = + .aria-label = Horjeka wosrjedź – wulkosć změnić +pdfjs-editor-resizer-top-right = + .aria-label = Horjeka naprawo – wulkosć změnić +pdfjs-editor-resizer-middle-right = + .aria-label = Wosrjedź naprawo – wulkosć změnić +pdfjs-editor-resizer-bottom-right = + .aria-label = Deleka naprawo – wulkosć změnić +pdfjs-editor-resizer-bottom-middle = + .aria-label = Deleka wosrjedź – wulkosć změnić +pdfjs-editor-resizer-bottom-left = + .aria-label = Deleka nalěwo – wulkosć změnić +pdfjs-editor-resizer-middle-left = + .aria-label = Wosrjedź nalěwo – wulkosć změnić + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Barba wuzběhnjenja +pdfjs-editor-colorpicker-button = + .title = Barbu změnić +pdfjs-editor-colorpicker-dropdown = + .aria-label = Wuběr barbow +pdfjs-editor-colorpicker-yellow = + .title = Žołty +pdfjs-editor-colorpicker-green = + .title = Zeleny +pdfjs-editor-colorpicker-blue = + .title = Módry +pdfjs-editor-colorpicker-pink = + .title = Pink +pdfjs-editor-colorpicker-red = + .title = Čerwjeny + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Wšě pokazać +pdfjs-editor-highlight-show-all-button = + .title = Wšě pokazać + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatiwny tekst wobdźěłać (wobrazowe wopisanje) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatiwny tekst přidać (wobrazowe wopisanje) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Pisajće tu swoje wopisanje… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krótke wopisanje za ludźi, kotřiž njemóžeće wobraz widźeć abo hdyž so wobraz njezačita. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tutón alternatiwny tekst je so awtomatisce wutworił a je snano njedokładny. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Dalše informacije +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatiwny tekst awtomatisce wutworić +pdfjs-editor-new-alt-text-not-now-button = Nic nětko +pdfjs-editor-new-alt-text-error-title = Alternatiwny tekst njeda so awtomatisce wutworić +pdfjs-editor-new-alt-text-error-description = Prošu pisajće swój alternatiwny tekst abo spytajće pozdźišo hišće raz. +pdfjs-editor-new-alt-text-error-close-button = Začinić +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Model KI za alternatiwny tekst so sćahuje ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Model KI za alternatiwny tekst so sćahuje ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatiwny tekst je so přidał +pdfjs-editor-new-alt-text-added-button-label = Alternatiwny tekst je so přidał +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatiwny tekst faluje +pdfjs-editor-new-alt-text-missing-button-label = Alternatiwny tekst faluje +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatiwny tekst přepruwować +pdfjs-editor-new-alt-text-to-review-button-label = Alternatiwny tekst přepruwować +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Awtomatisce wutworjeny: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastajenja alternatiwneho wobrazoweho teksta +pdfjs-image-alt-text-settings-button-label = Nastajenja alternatiwneho wobrazoweho teksta +pdfjs-editor-alt-text-settings-dialog-label = Nastajenja alternatiwneho wobrazoweho teksta +pdfjs-editor-alt-text-settings-automatic-title = Awtomatiski alternatiwny tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatiwny tekst awtomatisce wutworić +pdfjs-editor-alt-text-settings-create-model-description = Namjetuje wopisanja, zo by ludźom pomhał, kotřiž njemóžeće wobraz widźeć abo hdyž so wobraz njezačita. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model KI alternatiwneho teksta ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Běži lokalnje na wašim graće, zo bychu waše daty priwatne wostali. Za awtomatiski alternatiwny tekst trěbny. +pdfjs-editor-alt-text-settings-delete-model-button = Zhašeć +pdfjs-editor-alt-text-settings-download-model-button = Sćahnyć +pdfjs-editor-alt-text-settings-downloading-model-button = Sćahuje so… +pdfjs-editor-alt-text-settings-editor-title = Editor za alternatiwny tekst +pdfjs-editor-alt-text-settings-show-dialog-button-label = Editor alternatiwneho teksta hnydom pokazać, hdyž so wobraz přidawa +pdfjs-editor-alt-text-settings-show-dialog-description = Pomha, wam wšěm swojim wobrazam alternatiwny tekst přidać. +pdfjs-editor-alt-text-settings-close-button = Začinić + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Wotstronjene wuzběhnyć +pdfjs-editor-undo-bar-message-freetext = Tekst je so wotstronił +pdfjs-editor-undo-bar-message-ink = Rysowanka je so wotstroniła +pdfjs-editor-undo-bar-message-stamp = Wobraz je so wotstronił +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } přispomnjenka je so wotstroniła + [two] { $count } přispomnjence stej so wotstroniłoj + [few] { $count } přispomnjenki su so wotstronili + *[other] { $count } přispomnjenkow je so wotstroniło + } +pdfjs-editor-undo-bar-undo-button = + .title = Cofnyć +pdfjs-editor-undo-bar-undo-button-label = Cofnyć +pdfjs-editor-undo-bar-close-button = + .title = Začinić +pdfjs-editor-undo-bar-close-button-label = Začinić diff --git a/public/pdfjs/web/locale/hu/viewer.ftl b/public/pdfjs/web/locale/hu/viewer.ftl new file mode 100644 index 0000000..76307a2 --- /dev/null +++ b/public/pdfjs/web/locale/hu/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Előző oldal +pdfjs-previous-button-label = Előző +pdfjs-next-button = + .title = Következő oldal +pdfjs-next-button-label = Tovább +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Oldal +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = összesen: { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = Kicsinyítés +pdfjs-zoom-out-button-label = Kicsinyítés +pdfjs-zoom-in-button = + .title = Nagyítás +pdfjs-zoom-in-button-label = Nagyítás +pdfjs-zoom-select = + .title = Nagyítás +pdfjs-presentation-mode-button = + .title = Váltás bemutató módba +pdfjs-presentation-mode-button-label = Bemutató mód +pdfjs-open-file-button = + .title = Fájl megnyitása +pdfjs-open-file-button-label = Megnyitás +pdfjs-print-button = + .title = Nyomtatás +pdfjs-print-button-label = Nyomtatás +pdfjs-save-button = + .title = Mentés +pdfjs-save-button-label = Mentés +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Letöltés +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Letöltés +pdfjs-bookmark-button = + .title = Jelenlegi oldal (webcím megtekintése a jelenlegi oldalról) +pdfjs-bookmark-button-label = Jelenlegi oldal + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Eszközök +pdfjs-tools-button-label = Eszközök +pdfjs-first-page-button = + .title = Ugrás az első oldalra +pdfjs-first-page-button-label = Ugrás az első oldalra +pdfjs-last-page-button = + .title = Ugrás az utolsó oldalra +pdfjs-last-page-button-label = Ugrás az utolsó oldalra +pdfjs-page-rotate-cw-button = + .title = Forgatás az óramutató járásával egyezően +pdfjs-page-rotate-cw-button-label = Forgatás az óramutató járásával egyezően +pdfjs-page-rotate-ccw-button = + .title = Forgatás az óramutató járásával ellentétesen +pdfjs-page-rotate-ccw-button-label = Forgatás az óramutató járásával ellentétesen +pdfjs-cursor-text-select-tool-button = + .title = Szövegkijelölő eszköz bekapcsolása +pdfjs-cursor-text-select-tool-button-label = Szövegkijelölő eszköz +pdfjs-cursor-hand-tool-button = + .title = Kéz eszköz bekapcsolása +pdfjs-cursor-hand-tool-button-label = Kéz eszköz +pdfjs-scroll-page-button = + .title = Oldalgörgetés használata +pdfjs-scroll-page-button-label = Oldalgörgetés +pdfjs-scroll-vertical-button = + .title = Függőleges görgetés használata +pdfjs-scroll-vertical-button-label = Függőleges görgetés +pdfjs-scroll-horizontal-button = + .title = Vízszintes görgetés használata +pdfjs-scroll-horizontal-button-label = Vízszintes görgetés +pdfjs-scroll-wrapped-button = + .title = Rácsos elrendezés használata +pdfjs-scroll-wrapped-button-label = Rácsos elrendezés +pdfjs-spread-none-button = + .title = Ne tapassza össze az oldalakat +pdfjs-spread-none-button-label = Nincs összetapasztás +pdfjs-spread-odd-button = + .title = Lapok összetapasztása, a páratlan számú oldalakkal kezdve +pdfjs-spread-odd-button-label = Összetapasztás: páratlan +pdfjs-spread-even-button = + .title = Lapok összetapasztása, a páros számú oldalakkal kezdve +pdfjs-spread-even-button-label = Összetapasztás: páros + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentum tulajdonságai… +pdfjs-document-properties-button-label = Dokumentum tulajdonságai… +pdfjs-document-properties-file-name = Fájlnév: +pdfjs-document-properties-file-size = Fájlméret: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bájt) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bájt) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bájt) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bájt) +pdfjs-document-properties-title = Cím: +pdfjs-document-properties-author = Szerző: +pdfjs-document-properties-subject = Tárgy: +pdfjs-document-properties-keywords = Kulcsszavak: +pdfjs-document-properties-creation-date = Létrehozás dátuma: +pdfjs-document-properties-modification-date = Módosítás dátuma: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Létrehozta: +pdfjs-document-properties-producer = PDF előállító: +pdfjs-document-properties-version = PDF verzió: +pdfjs-document-properties-page-count = Oldalszám: +pdfjs-document-properties-page-size = Lapméret: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = álló +pdfjs-document-properties-page-size-orientation-landscape = fekvő +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Jogi információk + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Gyors webes nézet: +pdfjs-document-properties-linearized-yes = Igen +pdfjs-document-properties-linearized-no = Nem +pdfjs-document-properties-close-button = Bezárás + +## Print + +pdfjs-print-progress-message = Dokumentum előkészítése nyomtatáshoz… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Mégse +pdfjs-printing-not-supported = Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást. +pdfjs-printing-not-ready = Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Oldalsáv be/ki +pdfjs-toggle-sidebar-notification-button = + .title = Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket/rétegeket tartalmaz) +pdfjs-toggle-sidebar-button-label = Oldalsáv be/ki +pdfjs-document-outline-button = + .title = Dokumentum megjelenítése online (dupla kattintás minden elem kinyitásához/összecsukásához) +pdfjs-document-outline-button-label = Dokumentumvázlat +pdfjs-attachments-button = + .title = Mellékletek megjelenítése +pdfjs-attachments-button-label = Van melléklet +pdfjs-layers-button = + .title = Rétegek megjelenítése (dupla kattintás az összes réteg alapértelmezett állapotra visszaállításához) +pdfjs-layers-button-label = Rétegek +pdfjs-thumbs-button = + .title = Bélyegképek megjelenítése +pdfjs-thumbs-button-label = Bélyegképek +pdfjs-current-outline-item-button = + .title = Jelenlegi vázlatelem megkeresése +pdfjs-current-outline-item-button-label = Jelenlegi vázlatelem +pdfjs-findbar-button = + .title = Keresés a dokumentumban +pdfjs-findbar-button-label = Keresés +pdfjs-additional-layers = További rétegek + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page }. oldal +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page }. oldal bélyegképe + +## Find panel button title and messages + +pdfjs-find-input = + .title = Keresés + .placeholder = Keresés a dokumentumban… +pdfjs-find-previous-button = + .title = A kifejezés előző előfordulásának keresése +pdfjs-find-previous-button-label = Előző +pdfjs-find-next-button = + .title = A kifejezés következő előfordulásának keresése +pdfjs-find-next-button-label = Tovább +pdfjs-find-highlight-checkbox = Összes kiemelése +pdfjs-find-match-case-checkbox-label = Kis- és nagybetűk megkülönböztetése +pdfjs-find-match-diacritics-checkbox-label = Diakritikus jelek +pdfjs-find-entire-word-checkbox-label = Teljes szavak +pdfjs-find-reached-top = A dokumentum eleje elérve, folytatás a végétől +pdfjs-find-reached-bottom = A dokumentum vége elérve, folytatás az elejétől +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } / { $total } találat + *[other] { $current } / { $total } találat + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Több mint { $limit } találat + *[other] Több mint { $limit } találat + } +pdfjs-find-not-found = A kifejezés nem található + +## Predefined zoom values + +pdfjs-page-scale-width = Oldalszélesség +pdfjs-page-scale-fit = Teljes oldal +pdfjs-page-scale-auto = Automatikus nagyítás +pdfjs-page-scale-actual = Valódi méret +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page }. oldal + +## Loading indicator messages + +pdfjs-loading-error = Hiba történt a PDF betöltésekor. +pdfjs-invalid-file-error = Érvénytelen vagy sérült PDF fájl. +pdfjs-missing-file-error = Hiányzó PDF fájl. +pdfjs-unexpected-response-error = Váratlan kiszolgálóválasz. +pdfjs-rendering-error = Hiba történt az oldal feldolgozása közben. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } megjegyzés] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Adja meg a jelszót a PDF fájl megnyitásához. +pdfjs-password-invalid = Helytelen jelszó. Próbálja újra. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Mégse +pdfjs-web-fonts-disabled = Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek. + +## Editing + +pdfjs-editor-free-text-button = + .title = Szöveg +pdfjs-editor-free-text-button-label = Szöveg +pdfjs-editor-ink-button = + .title = Rajzolás +pdfjs-editor-ink-button-label = Rajzolás +pdfjs-editor-stamp-button = + .title = Képek hozzáadása vagy szerkesztése +pdfjs-editor-stamp-button-label = Képek hozzáadása vagy szerkesztése +pdfjs-editor-highlight-button = + .title = Kiemelés +pdfjs-editor-highlight-button-label = Kiemelés +pdfjs-highlight-floating-button1 = + .title = Kiemelés + .aria-label = Kiemelés +pdfjs-highlight-floating-button-label = Kiemelés + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Rajz eltávolítása +pdfjs-editor-remove-freetext-button = + .title = Szöveg eltávolítása +pdfjs-editor-remove-stamp-button = + .title = Kép eltávolítása +pdfjs-editor-remove-highlight-button = + .title = Kiemelés eltávolítása + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Szín +pdfjs-editor-free-text-size-input = Méret +pdfjs-editor-ink-color-input = Szín +pdfjs-editor-ink-thickness-input = Vastagság +pdfjs-editor-ink-opacity-input = Átlátszatlanság +pdfjs-editor-stamp-add-image-button = + .title = Kép hozzáadása +pdfjs-editor-stamp-add-image-button-label = Kép hozzáadása +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Vastagság +pdfjs-editor-free-highlight-thickness-title = + .title = Vastagság módosítása, ha nem szöveges elemeket emel ki +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Szövegszerkesztő + .default-content = Kezdjen gépelni… +pdfjs-free-text = + .aria-label = Szövegszerkesztő +pdfjs-free-text-default-content = Kezdjen el gépelni… +pdfjs-ink = + .aria-label = Rajzszerkesztő +pdfjs-ink-canvas = + .aria-label = Felhasználó által készített kép + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternatív szöveg +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatív szöveg szerkesztése +pdfjs-editor-alt-text-edit-button-label = Alternatív szöveg szerkesztése +pdfjs-editor-alt-text-dialog-label = Válasszon egy lehetőséget +pdfjs-editor-alt-text-dialog-description = Az alternatív szöveg segít, ha az emberek nem látják a képet, vagy ha az nem töltődik be. +pdfjs-editor-alt-text-add-description-label = Leírás hozzáadása +pdfjs-editor-alt-text-add-description-description = Törekedjen 1-2 mondatra, amely jellemzi a témát, környezetet vagy cselekvést. +pdfjs-editor-alt-text-mark-decorative-label = Megjelölés dekoratívként +pdfjs-editor-alt-text-mark-decorative-description = Ez a díszítőképeknél használatos, mint a szegélyek vagy a vízjelek. +pdfjs-editor-alt-text-cancel-button = Mégse +pdfjs-editor-alt-text-save-button = Mentés +pdfjs-editor-alt-text-decorative-tooltip = Megjelölve dekoratívként +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Például: „Egy fiatal férfi leül enni egy asztalhoz” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatív szöveg + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Bal felső sarok – átméretezés +pdfjs-editor-resizer-label-top-middle = Felül középen – átméretezés +pdfjs-editor-resizer-label-top-right = Jobb felső sarok – átméretezés +pdfjs-editor-resizer-label-middle-right = Jobbra középen – átméretezés +pdfjs-editor-resizer-label-bottom-right = Jobb alsó sarok – átméretezés +pdfjs-editor-resizer-label-bottom-middle = Alul középen – átméretezés +pdfjs-editor-resizer-label-bottom-left = Bal alsó sarok – átméretezés +pdfjs-editor-resizer-label-middle-left = Balra középen – átméretezés +pdfjs-editor-resizer-top-left = + .aria-label = Bal felső sarok – átméretezés +pdfjs-editor-resizer-top-middle = + .aria-label = Felül középen – átméretezés +pdfjs-editor-resizer-top-right = + .aria-label = Jobb felső sarok – átméretezés +pdfjs-editor-resizer-middle-right = + .aria-label = Jobbra középen – átméretezés +pdfjs-editor-resizer-bottom-right = + .aria-label = Jobb alsó sarok – átméretezés +pdfjs-editor-resizer-bottom-middle = + .aria-label = Alul középen – átméretezés +pdfjs-editor-resizer-bottom-left = + .aria-label = Bal alsó sarok – átméretezés +pdfjs-editor-resizer-middle-left = + .aria-label = Balra középen – átméretezés + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Kiemelés színe +pdfjs-editor-colorpicker-button = + .title = Szín módosítása +pdfjs-editor-colorpicker-dropdown = + .aria-label = Színválasztások +pdfjs-editor-colorpicker-yellow = + .title = Sárga +pdfjs-editor-colorpicker-green = + .title = Zöld +pdfjs-editor-colorpicker-blue = + .title = Kék +pdfjs-editor-colorpicker-pink = + .title = Rózsaszín +pdfjs-editor-colorpicker-red = + .title = Vörös + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Összes megjelenítése +pdfjs-editor-highlight-show-all-button = + .title = Összes megjelenítése + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatív szöveg szerkesztése (képleírás) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatív szöveg hozzáadása (képleírás) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Írja ide a leírását… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Rövid leírás azoknak, akik nem látják a képet, vagy arra az esetre, ha a kép nem tölt be. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ez az alternatív szöveg automatikusan lett létrehozva, és pontatlan lehet. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = További tudnivalók +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatív szöveg automatikus létrehozása +pdfjs-editor-new-alt-text-not-now-button = Most nem +pdfjs-editor-new-alt-text-error-title = Az alternatív szöveg automatikus létrehozása nem sikerült +pdfjs-editor-new-alt-text-error-description = Írja meg a saját alternatív szövegét, vagy próbálja újra később. +pdfjs-editor-new-alt-text-error-close-button = Bezárás +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alternatív szöveg MI modell letöltése ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = Alternatív szöveg MI modell letöltése ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatív szöveg hozzáadva +pdfjs-editor-new-alt-text-added-button-label = Alternatív szöveg hozzáadva +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Hiányzó alternatív szöveg +pdfjs-editor-new-alt-text-missing-button-label = Hiányzó alternatív szöveg +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatív szöveg áttekintése +pdfjs-editor-new-alt-text-to-review-button-label = Alternatív szöveg szerkesztése +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikusan létrehozva: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Kép alternatív szövegének beállításai +pdfjs-image-alt-text-settings-button-label = Kép alternatív szövegének beállításai +pdfjs-editor-alt-text-settings-dialog-label = Kép alternatív szövegének beállításai +pdfjs-editor-alt-text-settings-automatic-title = Automatikus alternatív szöveg +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatív szöveg automatikus létrehozása +pdfjs-editor-alt-text-settings-create-model-description = Leírásokat javasol, hogy segítsen azoknak, akik nem látják a képet, vagy arra az esetre, ha a kép nem tölt be. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternatív szöveg MI modellje ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Helyben fut az eszközén, így az adatai privátok maradnak. Az automatikus alternatív szövegekhez szükséges. +pdfjs-editor-alt-text-settings-delete-model-button = Törlés +pdfjs-editor-alt-text-settings-download-model-button = Letöltés +pdfjs-editor-alt-text-settings-downloading-model-button = Letöltés… +pdfjs-editor-alt-text-settings-editor-title = Alternatív szöveg szerkesztője +pdfjs-editor-alt-text-settings-show-dialog-button-label = Az alternatív szöveg szerkesztőjének azonnali megjelenítése egy kép hozzáadásakor +pdfjs-editor-alt-text-settings-show-dialog-description = Segít elérni, hogy az összes képén legyen alternatív szöveg. +pdfjs-editor-alt-text-settings-close-button = Bezárás + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Kiemelés eltávolítva +pdfjs-editor-undo-bar-message-freetext = Szöveg eltávolítva +pdfjs-editor-undo-bar-message-ink = Rajz eltávolítva +pdfjs-editor-undo-bar-message-stamp = Kép eltávolítva +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } kommentár eltávolítva + *[other] { $count } kommentár eltávolítva + } +pdfjs-editor-undo-bar-undo-button = + .title = Visszavonás +pdfjs-editor-undo-bar-undo-button-label = Visszavonás +pdfjs-editor-undo-bar-close-button = + .title = Bezárás +pdfjs-editor-undo-bar-close-button-label = Bezárás diff --git a/public/pdfjs/web/locale/hy-AM/viewer.ftl b/public/pdfjs/web/locale/hy-AM/viewer.ftl new file mode 100644 index 0000000..5c9dd27 --- /dev/null +++ b/public/pdfjs/web/locale/hy-AM/viewer.ftl @@ -0,0 +1,272 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Նախորդ էջը +pdfjs-previous-button-label = Նախորդը +pdfjs-next-button = + .title = Հաջորդ էջը +pdfjs-next-button-label = Հաջորդը +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Էջ. +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = -ը՝ { $pagesCount }-ից +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber }-ը { $pagesCount })-ից +pdfjs-zoom-out-button = + .title = Փոքրացնել +pdfjs-zoom-out-button-label = Փոքրացնել +pdfjs-zoom-in-button = + .title = Խոշորացնել +pdfjs-zoom-in-button-label = Խոշորացնել +pdfjs-zoom-select = + .title = Դիտափոխում +pdfjs-presentation-mode-button = + .title = Անցնել Ներկայացման եղանակին +pdfjs-presentation-mode-button-label = Ներկայացման եղանակ +pdfjs-open-file-button = + .title = Բացել նիշք +pdfjs-open-file-button-label = Բացել +pdfjs-print-button = + .title = Տպել +pdfjs-print-button-label = Տպել +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Ներբեռնել +pdfjs-bookmark-button-label = Ընթացիկ էջ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Գործիքներ +pdfjs-tools-button-label = Գործիքներ +pdfjs-first-page-button = + .title = Անցնել առաջին էջին +pdfjs-first-page-button-label = Անցնել առաջին էջին +pdfjs-last-page-button = + .title = Անցնել վերջին էջին +pdfjs-last-page-button-label = Անցնել վերջին էջին +pdfjs-page-rotate-cw-button = + .title = Պտտել ըստ ժամացույցի սլաքի +pdfjs-page-rotate-cw-button-label = Պտտել ըստ ժամացույցի սլաքի +pdfjs-page-rotate-ccw-button = + .title = Պտտել հակառակ ժամացույցի սլաքի +pdfjs-page-rotate-ccw-button-label = Պտտել հակառակ ժամացույցի սլաքի +pdfjs-cursor-text-select-tool-button = + .title = Միացնել գրույթ ընտրելու գործիքը +pdfjs-cursor-text-select-tool-button-label = Գրույթը ընտրելու գործիք +pdfjs-cursor-hand-tool-button = + .title = Միացնել Ձեռքի գործիքը +pdfjs-cursor-hand-tool-button-label = Ձեռքի գործիք +pdfjs-scroll-vertical-button = + .title = Օգտագործել ուղղահայաց ոլորում +pdfjs-scroll-vertical-button-label = Ուղղահայաց ոլորում +pdfjs-scroll-horizontal-button = + .title = Օգտագործել հորիզոնական ոլորում +pdfjs-scroll-horizontal-button-label = Հորիզոնական ոլորում +pdfjs-scroll-wrapped-button = + .title = Օգտագործել փաթաթված ոլորում +pdfjs-scroll-wrapped-button-label = Փաթաթված ոլորում +pdfjs-spread-none-button = + .title = Մի միացեք էջի վերածածկերին +pdfjs-spread-none-button-label = Չկա վերածածկեր +pdfjs-spread-odd-button = + .title = Միացեք էջի վերածածկերին սկսելով՝ կենտ համարակալված էջերով +pdfjs-spread-odd-button-label = Կենտ վերածածկեր +pdfjs-spread-even-button = + .title = Միացեք էջի վերածածկերին սկսելով՝ զույգ համարակալված էջերով +pdfjs-spread-even-button-label = Զույգ վերածածկեր + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Փաստաթղթի հատկությունները… +pdfjs-document-properties-button-label = Փաստաթղթի հատկությունները… +pdfjs-document-properties-file-name = Նիշքի անունը. +pdfjs-document-properties-file-size = Նիշք չափը. +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } ԿԲ ({ $size_b } բայթ) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } ՄԲ ({ $size_b } բայթ) +pdfjs-document-properties-title = Վերնագիր. +pdfjs-document-properties-author = Հեղինակ․ +pdfjs-document-properties-subject = Վերնագիր. +pdfjs-document-properties-keywords = Հիմնաբառ. +pdfjs-document-properties-creation-date = Ստեղծելու ամսաթիվը. +pdfjs-document-properties-modification-date = Փոփոխելու ամսաթիվը. +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Ստեղծող. +pdfjs-document-properties-producer = PDF-ի հեղինակը. +pdfjs-document-properties-version = PDF-ի տարբերակը. +pdfjs-document-properties-page-count = Էջերի քանակը. +pdfjs-document-properties-page-size = Էջի չափը. +pdfjs-document-properties-page-size-unit-inches = ում +pdfjs-document-properties-page-size-unit-millimeters = մմ +pdfjs-document-properties-page-size-orientation-portrait = ուղղաձիգ +pdfjs-document-properties-page-size-orientation-landscape = հորիզոնական +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Նամակ +pdfjs-document-properties-page-size-name-legal = Օրինական + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Արագ վեբ դիտում․ +pdfjs-document-properties-linearized-yes = Այո +pdfjs-document-properties-linearized-no = Ոչ +pdfjs-document-properties-close-button = Փակել + +## Print + +pdfjs-print-progress-message = Նախապատրաստում է փաստաթուղթը տպելուն... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Չեղարկել +pdfjs-printing-not-supported = Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։ +pdfjs-printing-not-ready = Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար: + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Բացել/Փակել Կողային վահանակը +pdfjs-toggle-sidebar-button-label = Բացել/Փակել Կողային վահանակը +pdfjs-document-outline-button = + .title = Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միավորները ընդարձակելու/կոծկելու համար) +pdfjs-document-outline-button-label = Փաստաթղթի բովանդակությունը +pdfjs-attachments-button = + .title = Ցուցադրել կցորդները +pdfjs-attachments-button-label = Կցորդներ +pdfjs-thumbs-button = + .title = Ցուցադրել Մանրապատկերը +pdfjs-thumbs-button-label = Մանրապատկերը +pdfjs-findbar-button = + .title = Գտնել փաստաթղթում +pdfjs-findbar-button-label = Որոնում + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Էջը { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Էջի մանրապատկերը { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Որոնում + .placeholder = Գտնել փաստաթղթում... +pdfjs-find-previous-button = + .title = Գտնել անրահայտության նախորդ հանդիպումը +pdfjs-find-previous-button-label = Նախորդը +pdfjs-find-next-button = + .title = Գտիր արտահայտության հաջորդ հանդիպումը +pdfjs-find-next-button-label = Հաջորդը +pdfjs-find-highlight-checkbox = Գունանշել բոլորը +pdfjs-find-match-case-checkbox-label = Մեծ(փոքր)ատառ հաշվի առնել +pdfjs-find-entire-word-checkbox-label = Ամբողջ բառերը +pdfjs-find-reached-top = Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից +pdfjs-find-reached-bottom = Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից +pdfjs-find-not-found = Արտահայտությունը չգտնվեց + +## Predefined zoom values + +pdfjs-page-scale-width = Էջի լայնքը +pdfjs-page-scale-fit = Ձգել էջը +pdfjs-page-scale-auto = Ինքնաշխատ +pdfjs-page-scale-actual = Իրական չափը +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Սխալ՝ PDF ֆայլը բացելիս։ +pdfjs-invalid-file-error = Սխալ կամ վնասված PDF ֆայլ: +pdfjs-missing-file-error = PDF ֆայլը բացակայում է: +pdfjs-unexpected-response-error = Սպասարկիչի անսպասելի պատասխան: +pdfjs-rendering-error = Սխալ՝ էջը ստեղծելիս: + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Ծանոթություն] + +## Password + +pdfjs-password-label = Մուտքագրեք PDF-ի գաղտնաբառը: +pdfjs-password-invalid = Գաղտնաբառը սխալ է: Կրկին փորձեք: +pdfjs-password-ok-button = Լավ +pdfjs-password-cancel-button = Չեղարկել +pdfjs-web-fonts-disabled = Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները: + +## Editing + + +## Remove button for the various kind of editor. + + +## + +pdfjs-free-text-default-content = Սկսել մուտքագրումը… + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Ցուցադրել բոլորը +pdfjs-editor-highlight-show-all-button = + .title = Ցուցադրել բոլորը diff --git a/public/pdfjs/web/locale/hye/viewer.ftl b/public/pdfjs/web/locale/hye/viewer.ftl new file mode 100644 index 0000000..75cdc06 --- /dev/null +++ b/public/pdfjs/web/locale/hye/viewer.ftl @@ -0,0 +1,268 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Նախորդ էջ +pdfjs-previous-button-label = Նախորդը +pdfjs-next-button = + .title = Յաջորդ էջ +pdfjs-next-button-label = Յաջորդը +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = էջ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount }-ից +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber }-ը { $pagesCount })-ից +pdfjs-zoom-out-button = + .title = Փոքրացնել +pdfjs-zoom-out-button-label = Փոքրացնել +pdfjs-zoom-in-button = + .title = Խոշորացնել +pdfjs-zoom-in-button-label = Խոշորացնել +pdfjs-zoom-select = + .title = Խոշորացում +pdfjs-presentation-mode-button = + .title = Անցնել ներկայացման եղանակին +pdfjs-presentation-mode-button-label = Ներկայացման եղանակ +pdfjs-open-file-button = + .title = Բացել նիշքը +pdfjs-open-file-button-label = Բացել +pdfjs-print-button = + .title = Տպել +pdfjs-print-button-label = Տպել + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Գործիքներ +pdfjs-tools-button-label = Գործիքներ +pdfjs-first-page-button = + .title = Գնալ դէպի առաջին էջ +pdfjs-first-page-button-label = Գնալ դէպի առաջին էջ +pdfjs-last-page-button = + .title = Գնալ դէպի վերջին էջ +pdfjs-last-page-button-label = Գնալ դէպի վերջին էջ +pdfjs-page-rotate-cw-button = + .title = Պտտել ժամացոյցի սլաքի ուղղութեամբ +pdfjs-page-rotate-cw-button-label = Պտտել ժամացոյցի սլաքի ուղղութեամբ +pdfjs-page-rotate-ccw-button = + .title = Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ +pdfjs-page-rotate-ccw-button-label = Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ +pdfjs-cursor-text-select-tool-button = + .title = Միացնել գրոյթ ընտրելու գործիքը +pdfjs-cursor-text-select-tool-button-label = Գրուածք ընտրելու գործիք +pdfjs-cursor-hand-tool-button = + .title = Միացնել ձեռքի գործիքը +pdfjs-cursor-hand-tool-button-label = Ձեռքի գործիք +pdfjs-scroll-page-button = + .title = Աւգտագործել էջի ոլորում +pdfjs-scroll-page-button-label = Էջի ոլորում +pdfjs-scroll-vertical-button = + .title = Աւգտագործել ուղղահայեաց ոլորում +pdfjs-scroll-vertical-button-label = Ուղղահայեաց ոլորում +pdfjs-scroll-horizontal-button = + .title = Աւգտագործել հորիզոնական ոլորում +pdfjs-scroll-horizontal-button-label = Հորիզոնական ոլորում +pdfjs-scroll-wrapped-button = + .title = Աւգտագործել փաթաթուած ոլորում +pdfjs-scroll-wrapped-button-label = Փաթաթուած ոլորում +pdfjs-spread-none-button = + .title = Մի միացէք էջի կոնտեքստում +pdfjs-spread-none-button-label = Չկայ կոնտեքստ +pdfjs-spread-odd-button = + .title = Միացէք էջի կոնտեքստին սկսելով՝ կենտ համարակալուած էջերով +pdfjs-spread-odd-button-label = Տարաւրինակ կոնտեքստ +pdfjs-spread-even-button = + .title = Միացէք էջի կոնտեքստին սկսելով՝ զոյգ համարակալուած էջերով +pdfjs-spread-even-button-label = Հաւասար վերածածկեր + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Փաստաթղթի հատկութիւնները… +pdfjs-document-properties-button-label = Փաստաթղթի յատկութիւնները… +pdfjs-document-properties-file-name = Նիշքի անունը․ +pdfjs-document-properties-file-size = Նիշք չափը. +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } ԿԲ ({ $size_b } բայթ) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } ՄԲ ({ $size_b } բայթ) +pdfjs-document-properties-title = Վերնագիր +pdfjs-document-properties-author = Հեղինակ․ +pdfjs-document-properties-subject = առարկայ +pdfjs-document-properties-keywords = Հիմնաբառեր +pdfjs-document-properties-creation-date = Ստեղծման ամսաթիւ +pdfjs-document-properties-modification-date = Փոփոխութեան ամսաթիւ. +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Ստեղծող +pdfjs-document-properties-producer = PDF-ի Արտադրողը. +pdfjs-document-properties-version = PDF-ի տարբերակը. +pdfjs-document-properties-page-count = Էջերի քանակը. +pdfjs-document-properties-page-size = Էջի չափը. +pdfjs-document-properties-page-size-unit-inches = ում +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = ուղղաձիգ +pdfjs-document-properties-page-size-orientation-landscape = հորիզոնական +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Նամակ +pdfjs-document-properties-page-size-name-legal = Աւրինական + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Արագ վեբ դիտում․ +pdfjs-document-properties-linearized-yes = Այո +pdfjs-document-properties-linearized-no = Ոչ +pdfjs-document-properties-close-button = Փակել + +## Print + +pdfjs-print-progress-message = Նախապատրաստում է փաստաթուղթը տպելուն… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Չեղարկել +pdfjs-printing-not-supported = Զգուշացում. Տպելը ամբողջութեամբ չի աջակցուում զննարկիչի կողմից։ +pdfjs-printing-not-ready = Զգուշացում. PDF֊ը ամբողջութեամբ չի բեռնաւորուել տպելու համար։ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Փոխարկել կողային վահանակը +pdfjs-toggle-sidebar-notification-button = + .title = Փոխանջատել կողմնասիւնը (փաստաթուղթը պարունակում է ուրուագիծ/կցորդներ/շերտեր) +pdfjs-toggle-sidebar-button-label = Փոխարկել կողային վահանակը +pdfjs-document-outline-button = + .title = Ցուցադրել փաստաթղթի ուրուագիծը (կրկնակի սեղմէք՝ միաւորները ընդարձակելու/կոծկելու համար) +pdfjs-document-outline-button-label = Փաստաթղթի ուրուագիծ +pdfjs-attachments-button = + .title = Ցուցադրել կցորդները +pdfjs-attachments-button-label = Կցորդներ +pdfjs-layers-button = + .title = Ցուցադրել շերտերը (կրկնահպել վերակայելու բոլոր շերտերը սկզբնադիր վիճակի) +pdfjs-layers-button-label = Շերտեր +pdfjs-thumbs-button = + .title = Ցուցադրել մանրապատկերը +pdfjs-thumbs-button-label = Մանրապատկեր +pdfjs-current-outline-item-button = + .title = Գտէք ընթացիկ գծագրման տարրը +pdfjs-current-outline-item-button-label = Ընթացիկ գծագրման տարր +pdfjs-findbar-button = + .title = Գտնել փաստաթղթում +pdfjs-findbar-button-label = Որոնում +pdfjs-additional-layers = Լրացուցիչ շերտեր + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Էջը { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Էջի մանրապատկերը { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Որոնում + .placeholder = Գտնել փաստաթղթում… +pdfjs-find-previous-button = + .title = Գտնել արտայայտութեան նախորդ արտայայտութիւնը +pdfjs-find-previous-button-label = Նախորդը +pdfjs-find-next-button = + .title = Գտիր արտայայտութեան յաջորդ արտայայտութիւնը +pdfjs-find-next-button-label = Հաջորդը +pdfjs-find-highlight-checkbox = Գունանշել բոլորը +pdfjs-find-match-case-checkbox-label = Հաշուի առնել հանգամանքը +pdfjs-find-match-diacritics-checkbox-label = Հնչիւնատարբերիչ նշանների համապատասխանեցում +pdfjs-find-entire-word-checkbox-label = Ամբողջ բառերը +pdfjs-find-reached-top = Հասել եք փաստաթղթի վերեւին,շարունակել ներքեւից +pdfjs-find-reached-bottom = Հասել էք փաստաթղթի վերջին, շարունակել վերեւից +pdfjs-find-not-found = Արտայայտութիւնը չգտնուեց + +## Predefined zoom values + +pdfjs-page-scale-width = Էջի լայնութիւն +pdfjs-page-scale-fit = Հարմարեցնել էջը +pdfjs-page-scale-auto = Ինքնաշխատ խոշորացում +pdfjs-page-scale-actual = Իրական չափը +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Էջ { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDF նիշքը բացելիս սխալ է տեղի ունեցել։ +pdfjs-invalid-file-error = Սխալ կամ վնասուած PDF նիշք։ +pdfjs-missing-file-error = PDF նիշքը բացակաիւմ է։ +pdfjs-unexpected-response-error = Սպասարկիչի անսպասելի պատասխան։ +pdfjs-rendering-error = Սխալ է տեղի ունեցել էջի մեկնաբանման ժամանակ + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Ծանոթութիւն] + +## Password + +pdfjs-password-label = Մուտքագրէք գաղտնաբառը այս PDF նիշքը բացելու համար +pdfjs-password-invalid = Գաղտնաբառը սխալ է: Կրկին փորձէք: +pdfjs-password-ok-button = Լաւ +pdfjs-password-cancel-button = Չեղարկել +pdfjs-web-fonts-disabled = Վեբ-տառատեսակները անջատուած են. հնարաւոր չէ աւգտագործել ներկառուցուած PDF տառատեսակները։ + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ia/viewer.ftl b/public/pdfjs/web/locale/ia/viewer.ftl new file mode 100644 index 0000000..91fbaf9 --- /dev/null +++ b/public/pdfjs/web/locale/ia/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagina previe +pdfjs-previous-button-label = Previe +pdfjs-next-button = + .title = Pagina sequente +pdfjs-next-button-label = Sequente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Distantiar +pdfjs-zoom-out-button-label = Distantiar +pdfjs-zoom-in-button = + .title = Approximar +pdfjs-zoom-in-button-label = Approximar +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Excambiar a modo presentation +pdfjs-presentation-mode-button-label = Modo presentation +pdfjs-open-file-button = + .title = Aperir le file +pdfjs-open-file-button-label = Aperir +pdfjs-print-button = + .title = Imprimer +pdfjs-print-button-label = Imprimer +pdfjs-save-button = + .title = Salvar +pdfjs-save-button-label = Salvar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Discargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Discargar +pdfjs-bookmark-button = + .title = Pagina actual (vide le URL del pagina actual) +pdfjs-bookmark-button-label = Pagina actual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Instrumentos +pdfjs-tools-button-label = Instrumentos +pdfjs-first-page-button = + .title = Ir al prime pagina +pdfjs-first-page-button-label = Ir al prime pagina +pdfjs-last-page-button = + .title = Ir al ultime pagina +pdfjs-last-page-button-label = Ir al ultime pagina +pdfjs-page-rotate-cw-button = + .title = Rotar in senso horari +pdfjs-page-rotate-cw-button-label = Rotar in senso horari +pdfjs-page-rotate-ccw-button = + .title = Rotar in senso antihorari +pdfjs-page-rotate-ccw-button-label = Rotar in senso antihorari +pdfjs-cursor-text-select-tool-button = + .title = Activar le instrumento de selection de texto +pdfjs-cursor-text-select-tool-button-label = Instrumento de selection de texto +pdfjs-cursor-hand-tool-button = + .title = Activar le instrumento mano +pdfjs-cursor-hand-tool-button-label = Instrumento mano +pdfjs-scroll-page-button = + .title = Usar rolamento de pagina +pdfjs-scroll-page-button-label = Rolamento de pagina +pdfjs-scroll-vertical-button = + .title = Usar rolamento vertical +pdfjs-scroll-vertical-button-label = Rolamento vertical +pdfjs-scroll-horizontal-button = + .title = Usar rolamento horizontal +pdfjs-scroll-horizontal-button-label = Rolamento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar rolamento incapsulate +pdfjs-scroll-wrapped-button-label = Rolamento incapsulate +pdfjs-spread-none-button = + .title = Non junger paginas dual +pdfjs-spread-none-button-label = Sin paginas dual +pdfjs-spread-odd-button = + .title = Junger paginas dual a partir de paginas con numeros impar +pdfjs-spread-odd-button-label = Paginas dual impar +pdfjs-spread-even-button = + .title = Junger paginas dual a partir de paginas con numeros par +pdfjs-spread-even-button-label = Paginas dual par + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Proprietates del documento… +pdfjs-document-properties-button-label = Proprietates del documento… +pdfjs-document-properties-file-name = Nomine del file: +pdfjs-document-properties-file-size = Dimension de file: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titulo: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Subjecto: +pdfjs-document-properties-keywords = Parolas clave: +pdfjs-document-properties-creation-date = Data de creation: +pdfjs-document-properties-modification-date = Data de modification: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creator: +pdfjs-document-properties-producer = Productor PDF: +pdfjs-document-properties-version = Version PDF: +pdfjs-document-properties-page-count = Numero de paginas: +pdfjs-document-properties-page-size = Dimension del pagina: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = horizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Littera +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista web rapide: +pdfjs-document-properties-linearized-yes = Si +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Clauder + +## Print + +pdfjs-print-progress-message = Preparation del documento pro le impression… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancellar +pdfjs-printing-not-supported = Attention : le impression non es totalmente supportate per ce navigator. +pdfjs-printing-not-ready = Attention: le file PDF non es integremente cargate pro lo poter imprimer. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Monstrar/celar le barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Monstrar/celar le barra lateral (le documento contine structura/attachamentos/stratos) +pdfjs-toggle-sidebar-button-label = Monstrar/celar le barra lateral +pdfjs-document-outline-button = + .title = Monstrar le schema del documento (clic duple pro expander/contraher tote le elementos) +pdfjs-document-outline-button-label = Schema del documento +pdfjs-attachments-button = + .title = Monstrar le annexos +pdfjs-attachments-button-label = Annexos +pdfjs-layers-button = + .title = Monstrar stratos (clicca duple pro remontar tote le stratos al stato predefinite) +pdfjs-layers-button-label = Stratos +pdfjs-thumbs-button = + .title = Monstrar le vignettes +pdfjs-thumbs-button-label = Vignettes +pdfjs-current-outline-item-button = + .title = Trovar le elemento de structura actual +pdfjs-current-outline-item-button-label = Elemento de structura actual +pdfjs-findbar-button = + .title = Cercar in le documento +pdfjs-findbar-button-label = Cercar +pdfjs-additional-layers = Altere stratos + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Vignette del pagina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Cercar + .placeholder = Cercar in le documento… +pdfjs-find-previous-button = + .title = Trovar le previe occurrentia del phrase +pdfjs-find-previous-button-label = Previe +pdfjs-find-next-button = + .title = Trovar le successive occurrentia del phrase +pdfjs-find-next-button-label = Sequente +pdfjs-find-highlight-checkbox = Evidentiar toto +pdfjs-find-match-case-checkbox-label = Distinguer majusculas/minusculas +pdfjs-find-match-diacritics-checkbox-label = Differentiar diacriticos +pdfjs-find-entire-word-checkbox-label = Parolas integre +pdfjs-find-reached-top = Initio del documento attingite, continuation ab fin +pdfjs-find-reached-bottom = Fin del documento attingite, continuation ab initio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } correspondentia + *[other] { $current } de { $total } correspondentias + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Plus de { $limit } correspondentia + *[other] Plus de { $limit } correspondentias + } +pdfjs-find-not-found = Phrase non trovate + +## Predefined zoom values + +pdfjs-page-scale-width = Plen largor del pagina +pdfjs-page-scale-fit = Pagina integre +pdfjs-page-scale-auto = Zoom automatic +pdfjs-page-scale-actual = Dimension real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Un error occurreva durante que on cargava le file PDF. +pdfjs-invalid-file-error = File PDF corrumpite o non valide. +pdfjs-missing-file-error = File PDF mancante. +pdfjs-unexpected-response-error = Responsa del servitor inexpectate. +pdfjs-rendering-error = Un error occurreva durante que on processava le pagina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Insere le contrasigno pro aperir iste file PDF. +pdfjs-password-invalid = Contrasigno invalide. Per favor retenta. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancellar +pdfjs-web-fonts-disabled = Le typos de litteras web es disactivate: impossibile usar le typos de litteras PDF incorporate. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Designar +pdfjs-editor-ink-button-label = Designar +pdfjs-editor-stamp-button = + .title = Adder o rediger imagines +pdfjs-editor-stamp-button-label = Adder o rediger imagines +pdfjs-editor-highlight-button = + .title = Evidentia +pdfjs-editor-highlight-button-label = Evidentia +pdfjs-highlight-floating-button1 = + .title = Evidentiar + .aria-label = Evidentiar +pdfjs-highlight-floating-button-label = Evidentiar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Remover le designo +pdfjs-editor-remove-freetext-button = + .title = Remover texto +pdfjs-editor-remove-stamp-button = + .title = Remover imagine +pdfjs-editor-remove-highlight-button = + .title = Remover evidentia + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Dimension +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Spissor +pdfjs-editor-ink-opacity-input = Opacitate +pdfjs-editor-stamp-add-image-button = + .title = Adder imagine +pdfjs-editor-stamp-add-image-button-label = Adder imagine +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Spissor +pdfjs-editor-free-highlight-thickness-title = + .title = Cambiar spissor evidentiante elementos differente de texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Initiar a inserer… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Comenciar a scriber… +pdfjs-ink = + .aria-label = Editor de designos +pdfjs-ink-canvas = + .aria-label = Imagine create per le usator + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternative +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger texto alternative +pdfjs-editor-alt-text-edit-button-label = Rediger texto alternative +pdfjs-editor-alt-text-dialog-label = Elige un option +pdfjs-editor-alt-text-dialog-description = Le texto alternative (alt text) adjuta quando le personas non pote vider le imagine o quando illo non carga. +pdfjs-editor-alt-text-add-description-label = Adder un description +pdfjs-editor-alt-text-add-description-description = Mira a 1-2 phrases que describe le subjecto, parametro, o actiones. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorative +pdfjs-editor-alt-text-mark-decorative-description = Isto es usate pro imagines ornamental, como bordaturas o filigranas. +pdfjs-editor-alt-text-cancel-button = Cancellar +pdfjs-editor-alt-text-save-button = Salvar +pdfjs-editor-alt-text-decorative-tooltip = Marcate como decorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Per exemplo, “Un juvene sede a un tabula pro mangiar un repasto” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternative + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Angulo superior sinistre — redimensionar +pdfjs-editor-resizer-label-top-middle = Medio superior — redimensionar +pdfjs-editor-resizer-label-top-right = Angulo superior dextre — redimensionar +pdfjs-editor-resizer-label-middle-right = Medio dextre — redimensionar +pdfjs-editor-resizer-label-bottom-right = Angulo inferior dextre — redimensionar +pdfjs-editor-resizer-label-bottom-middle = Medio inferior — redimensionar +pdfjs-editor-resizer-label-bottom-left = Angulo inferior sinistre — redimensionar +pdfjs-editor-resizer-label-middle-left = Medio sinistre — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Angulo superior sinistre — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Medio superior — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Angulo superior dextre — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Medio dextre — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Angulo inferior dextre — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Medio inferior — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Angulo inferior sinistre — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Medio sinistre — redimensionar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color pro evidentiar +pdfjs-editor-colorpicker-button = + .title = Cambiar color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Electiones del color +pdfjs-editor-colorpicker-yellow = + .title = Jalne +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Blau +pdfjs-editor-colorpicker-pink = + .title = Rosate +pdfjs-editor-colorpicker-red = + .title = Rubie + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Monstrar toto +pdfjs-editor-highlight-show-all-button = + .title = Monstrar toto + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger texto alternative (description del imagine) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adder texto alternative (description del imagine) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scribe tu description ci… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve description pro personas qui non pote vider le imagine o quando le imagine non se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Iste texto alternative ha essite create automaticamente e pote esser inexacte. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pro saper plus +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternative automaticamente +pdfjs-editor-new-alt-text-not-now-button = Non ora +pdfjs-editor-new-alt-text-error-title = Impossibile crear texto alternative automaticamente +pdfjs-editor-new-alt-text-error-description = Scribe tu proprie texto alternative o retenta plus tarde. +pdfjs-editor-new-alt-text-error-close-button = Clauder +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Discargante modello de intelligentia artificial del texto alternative ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Discargante modello de intelligentia artificial del texto alternative ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternative addite +pdfjs-editor-new-alt-text-added-button-label = Texto alternative addite +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Texto alternative mancante +pdfjs-editor-new-alt-text-missing-button-label = Texto alternative mancante +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revider texto alternative +pdfjs-editor-new-alt-text-to-review-button-label = Revider texto alternative +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automaticamente create: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Parametros del texto alternative del imagine +pdfjs-image-alt-text-settings-button-label = Parametros del texto alternative del imagine +pdfjs-editor-alt-text-settings-dialog-label = Parametros del texto alternative del imagine +pdfjs-editor-alt-text-settings-automatic-title = Texto alternative automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternative automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Suggere descriptiones pro adjutar le personas qui non pote vider le imagine o quando le imagine non carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modello de intelligentia artificial del texto alternative ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Flue localmente sur tu apparato assi tu datos remane private. Necessari pro texto alternative automatic. +pdfjs-editor-alt-text-settings-delete-model-button = Deler +pdfjs-editor-alt-text-settings-download-model-button = Discargar +pdfjs-editor-alt-text-settings-downloading-model-button = Discargante… +pdfjs-editor-alt-text-settings-editor-title = Rediger texto alternative +pdfjs-editor-alt-text-settings-show-dialog-button-label = Monstrar le redactor de texto alternative a pena on adde un imagine +pdfjs-editor-alt-text-settings-show-dialog-description = Te adjuta a verifica que tote tu imagines ha un texto alternative. +pdfjs-editor-alt-text-settings-close-button = Clauder + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Evidentiation removite +pdfjs-editor-undo-bar-message-freetext = Texto removite +pdfjs-editor-undo-bar-message-ink = Designo removite +pdfjs-editor-undo-bar-message-stamp = Imagine removite +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removite + *[other] { $count } annotationes removite + } +pdfjs-editor-undo-bar-undo-button = + .title = Disfacer +pdfjs-editor-undo-bar-undo-button-label = Disfacer +pdfjs-editor-undo-bar-close-button = + .title = Clauder +pdfjs-editor-undo-bar-close-button-label = Clauder diff --git a/public/pdfjs/web/locale/id/viewer.ftl b/public/pdfjs/web/locale/id/viewer.ftl new file mode 100644 index 0000000..c985a33 --- /dev/null +++ b/public/pdfjs/web/locale/id/viewer.ftl @@ -0,0 +1,374 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Laman Sebelumnya +pdfjs-previous-button-label = Sebelumnya +pdfjs-next-button = + .title = Laman Selanjutnya +pdfjs-next-button-label = Selanjutnya +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Halaman +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = dari { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } dari { $pagesCount }) +pdfjs-zoom-out-button = + .title = Perkecil +pdfjs-zoom-out-button-label = Perkecil +pdfjs-zoom-in-button = + .title = Perbesar +pdfjs-zoom-in-button-label = Perbesar +pdfjs-zoom-select = + .title = Perbesaran +pdfjs-presentation-mode-button = + .title = Ganti ke Mode Presentasi +pdfjs-presentation-mode-button-label = Mode Presentasi +pdfjs-open-file-button = + .title = Buka Berkas +pdfjs-open-file-button-label = Buka +pdfjs-print-button = + .title = Cetak +pdfjs-print-button-label = Cetak +pdfjs-save-button = + .title = Simpan +pdfjs-save-button-label = Simpan +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Unduh +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Unduh +pdfjs-bookmark-button = + .title = Laman Saat Ini (Lihat URL dari Laman Sekarang) +pdfjs-bookmark-button-label = Laman Saat Ini + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Alat +pdfjs-tools-button-label = Alat +pdfjs-first-page-button = + .title = Buka Halaman Pertama +pdfjs-first-page-button-label = Buka Halaman Pertama +pdfjs-last-page-button = + .title = Buka Halaman Terakhir +pdfjs-last-page-button-label = Buka Halaman Terakhir +pdfjs-page-rotate-cw-button = + .title = Putar Searah Jarum Jam +pdfjs-page-rotate-cw-button-label = Putar Searah Jarum Jam +pdfjs-page-rotate-ccw-button = + .title = Putar Berlawanan Arah Jarum Jam +pdfjs-page-rotate-ccw-button-label = Putar Berlawanan Arah Jarum Jam +pdfjs-cursor-text-select-tool-button = + .title = Aktifkan Alat Seleksi Teks +pdfjs-cursor-text-select-tool-button-label = Alat Seleksi Teks +pdfjs-cursor-hand-tool-button = + .title = Aktifkan Alat Tangan +pdfjs-cursor-hand-tool-button-label = Alat Tangan +pdfjs-scroll-page-button = + .title = Gunakan Pengguliran Laman +pdfjs-scroll-page-button-label = Pengguliran Laman +pdfjs-scroll-vertical-button = + .title = Gunakan Penggeseran Vertikal +pdfjs-scroll-vertical-button-label = Penggeseran Vertikal +pdfjs-scroll-horizontal-button = + .title = Gunakan Penggeseran Horizontal +pdfjs-scroll-horizontal-button-label = Penggeseran Horizontal +pdfjs-scroll-wrapped-button = + .title = Gunakan Penggeseran Terapit +pdfjs-scroll-wrapped-button-label = Penggeseran Terapit +pdfjs-spread-none-button = + .title = Jangan gabungkan lembar halaman +pdfjs-spread-none-button-label = Tidak Ada Lembaran +pdfjs-spread-odd-button = + .title = Gabungkan lembar lamanan mulai dengan halaman ganjil +pdfjs-spread-odd-button-label = Lembaran Ganjil +pdfjs-spread-even-button = + .title = Gabungkan lembar halaman dimulai dengan halaman genap +pdfjs-spread-even-button-label = Lembaran Genap + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Properti Dokumen… +pdfjs-document-properties-button-label = Properti Dokumen… +pdfjs-document-properties-file-name = Nama berkas: +pdfjs-document-properties-file-size = Ukuran berkas: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +pdfjs-document-properties-title = Judul: +pdfjs-document-properties-author = Penyusun: +pdfjs-document-properties-subject = Subjek: +pdfjs-document-properties-keywords = Kata Kunci: +pdfjs-document-properties-creation-date = Tanggal Dibuat: +pdfjs-document-properties-modification-date = Tanggal Dimodifikasi: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Pembuat: +pdfjs-document-properties-producer = Pemroduksi PDF: +pdfjs-document-properties-version = Versi PDF: +pdfjs-document-properties-page-count = Jumlah Halaman: +pdfjs-document-properties-page-size = Ukuran Laman: +pdfjs-document-properties-page-size-unit-inches = inci +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = tegak +pdfjs-document-properties-page-size-orientation-landscape = mendatar +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Tampilan Web Kilat: +pdfjs-document-properties-linearized-yes = Ya +pdfjs-document-properties-linearized-no = Tidak +pdfjs-document-properties-close-button = Tutup + +## Print + +pdfjs-print-progress-message = Menyiapkan dokumen untuk pencetakan… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Batalkan +pdfjs-printing-not-supported = Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini. +pdfjs-printing-not-ready = Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Aktif/Nonaktifkan Bilah Samping +pdfjs-toggle-sidebar-notification-button = + .title = Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran/lapisan) +pdfjs-toggle-sidebar-button-label = Aktif/Nonaktifkan Bilah Samping +pdfjs-document-outline-button = + .title = Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item) +pdfjs-document-outline-button-label = Kerangka Dokumen +pdfjs-attachments-button = + .title = Tampilkan Lampiran +pdfjs-attachments-button-label = Lampiran +pdfjs-layers-button = + .title = Tampilkan Lapisan (klik ganda untuk mengatur ulang semua lapisan ke keadaan baku) +pdfjs-layers-button-label = Lapisan +pdfjs-thumbs-button = + .title = Tampilkan Miniatur +pdfjs-thumbs-button-label = Miniatur +pdfjs-current-outline-item-button = + .title = Cari Butir Ikhtisar Saat Ini +pdfjs-current-outline-item-button-label = Butir Ikhtisar Saat Ini +pdfjs-findbar-button = + .title = Temukan di Dokumen +pdfjs-findbar-button-label = Temukan +pdfjs-additional-layers = Lapisan Tambahan + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Laman { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatur Laman { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Temukan + .placeholder = Temukan di dokumen… +pdfjs-find-previous-button = + .title = Temukan kata sebelumnya +pdfjs-find-previous-button-label = Sebelumnya +pdfjs-find-next-button = + .title = Temukan lebih lanjut +pdfjs-find-next-button-label = Selanjutnya +pdfjs-find-highlight-checkbox = Sorot semuanya +pdfjs-find-match-case-checkbox-label = Cocokkan BESAR/kecil +pdfjs-find-match-diacritics-checkbox-label = Pencocokan Diakritik +pdfjs-find-entire-word-checkbox-label = Seluruh teks +pdfjs-find-reached-top = Sampai di awal dokumen, dilanjutkan dari bawah +pdfjs-find-reached-bottom = Sampai di akhir dokumen, dilanjutkan dari atas +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = { $current } dari { $total } yang cocok +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = Lebih dari { $limit } kecocokan +pdfjs-find-not-found = Frasa tidak ditemukan + +## Predefined zoom values + +pdfjs-page-scale-width = Lebar Laman +pdfjs-page-scale-fit = Muat Laman +pdfjs-page-scale-auto = Perbesaran Otomatis +pdfjs-page-scale-actual = Ukuran Asli +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Halaman { $page } + +## Loading indicator messages + +pdfjs-loading-error = Galat terjadi saat memuat PDF. +pdfjs-invalid-file-error = Berkas PDF tidak valid atau rusak. +pdfjs-missing-file-error = Berkas PDF tidak ada. +pdfjs-unexpected-response-error = Balasan server yang tidak diharapkan. +pdfjs-rendering-error = Galat terjadi saat merender laman. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotasi { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Masukkan sandi untuk membuka berkas PDF ini. +pdfjs-password-invalid = Sandi tidak valid. Silakan coba lagi. +pdfjs-password-ok-button = Oke +pdfjs-password-cancel-button = Batal +pdfjs-web-fonts-disabled = Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat. + +## Editing + +pdfjs-editor-free-text-button = + .title = Teks +pdfjs-editor-free-text-button-label = Teks +pdfjs-editor-ink-button = + .title = Gambar +pdfjs-editor-ink-button-label = Gambar +pdfjs-editor-stamp-button = + .title = Tambah atau edit gambar +pdfjs-editor-stamp-button-label = Tambah atau edit gambar +pdfjs-editor-highlight-button = + .title = Sorot +pdfjs-editor-highlight-button-label = Sorot +pdfjs-highlight-floating-button1 = + .title = Sorot + .aria-label = Sorot +pdfjs-highlight-floating-button-label = Sorot + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Hapus gambar +pdfjs-editor-remove-freetext-button = + .title = Hapus teks +pdfjs-editor-remove-stamp-button = + .title = Hapus gambar +pdfjs-editor-remove-highlight-button = + .title = Hapus sorotan + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Warna +pdfjs-editor-free-text-size-input = Ukuran +pdfjs-editor-ink-color-input = Warna +pdfjs-editor-ink-thickness-input = Ketebalan +pdfjs-editor-ink-opacity-input = Opasitas +pdfjs-editor-stamp-add-image-button = + .title = Tambahkan gambar +pdfjs-editor-stamp-add-image-button-label = Tambahkan gambar +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Ketebalan +pdfjs-editor-free-highlight-thickness-title = + .title = Ubah ketebalan saat menyorot item selain teks +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor Teks + .default-content = Mulai mengetik… +pdfjs-free-text = + .aria-label = Editor Teks +pdfjs-free-text-default-content = Mulai mengetik… +pdfjs-ink = + .aria-label = Editor Gambar +pdfjs-ink-canvas = + .aria-label = Gambar yang dibuat pengguna + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Teks alternatif +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit teks alternatif +pdfjs-editor-alt-text-edit-button-label = Edit teks alternatif +pdfjs-editor-alt-text-dialog-label = Pilih opsi + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/is/viewer.ftl b/public/pdfjs/web/locale/is/viewer.ftl new file mode 100644 index 0000000..deda510 --- /dev/null +++ b/public/pdfjs/web/locale/is/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Fyrri síða +pdfjs-previous-button-label = Fyrri +pdfjs-next-button = + .title = Næsta síða +pdfjs-next-button-label = Næsti +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Síða +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = af { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } af { $pagesCount }) +pdfjs-zoom-out-button = + .title = Minnka aðdrátt +pdfjs-zoom-out-button-label = Minnka aðdrátt +pdfjs-zoom-in-button = + .title = Auka aðdrátt +pdfjs-zoom-in-button-label = Auka aðdrátt +pdfjs-zoom-select = + .title = Aðdráttur +pdfjs-presentation-mode-button = + .title = Skipta yfir á kynningarham +pdfjs-presentation-mode-button-label = Kynningarhamur +pdfjs-open-file-button = + .title = Opna skrá +pdfjs-open-file-button-label = Opna +pdfjs-print-button = + .title = Prenta +pdfjs-print-button-label = Prenta +pdfjs-save-button = + .title = Vista +pdfjs-save-button-label = Vista +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Sækja +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Sækja +pdfjs-bookmark-button = + .title = Núverandi síða (Skoða vefslóð frá núverandi síðu) +pdfjs-bookmark-button-label = Núverandi síða + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Verkfæri +pdfjs-tools-button-label = Verkfæri +pdfjs-first-page-button = + .title = Fara á fyrstu síðu +pdfjs-first-page-button-label = Fara á fyrstu síðu +pdfjs-last-page-button = + .title = Fara á síðustu síðu +pdfjs-last-page-button-label = Fara á síðustu síðu +pdfjs-page-rotate-cw-button = + .title = Snúa réttsælis +pdfjs-page-rotate-cw-button-label = Snúa réttsælis +pdfjs-page-rotate-ccw-button = + .title = Snúa rangsælis +pdfjs-page-rotate-ccw-button-label = Snúa rangsælis +pdfjs-cursor-text-select-tool-button = + .title = Virkja textavalsáhald +pdfjs-cursor-text-select-tool-button-label = Textavalsáhald +pdfjs-cursor-hand-tool-button = + .title = Virkja handarverkfæri +pdfjs-cursor-hand-tool-button-label = Handarverkfæri +pdfjs-scroll-page-button = + .title = Nota síðuskrun +pdfjs-scroll-page-button-label = Síðuskrun +pdfjs-scroll-vertical-button = + .title = Nota lóðrétt skrun +pdfjs-scroll-vertical-button-label = Lóðrétt skrun +pdfjs-scroll-horizontal-button = + .title = Nota lárétt skrun +pdfjs-scroll-horizontal-button-label = Lárétt skrun +pdfjs-scroll-wrapped-button = + .title = Nota línuskipt síðuskrun +pdfjs-scroll-wrapped-button-label = Línuskipt síðuskrun +pdfjs-spread-none-button = + .title = Ekki taka þátt í dreifingu síðna +pdfjs-spread-none-button-label = Engin dreifing +pdfjs-spread-odd-button = + .title = Taka þátt í dreifingu síðna með oddatölum +pdfjs-spread-odd-button-label = Oddatöludreifing +pdfjs-spread-even-button = + .title = Taktu þátt í dreifingu síðna með jöfnuntölum +pdfjs-spread-even-button-label = Jafnatöludreifing + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Eiginleikar skjals… +pdfjs-document-properties-button-label = Eiginleikar skjals… +pdfjs-document-properties-file-name = Skráarnafn: +pdfjs-document-properties-file-size = Skrárstærð: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bæti) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bæti) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titill: +pdfjs-document-properties-author = Hönnuður: +pdfjs-document-properties-subject = Efni: +pdfjs-document-properties-keywords = Stikkorð: +pdfjs-document-properties-creation-date = Búið til: +pdfjs-document-properties-modification-date = Dags breytingar: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Höfundur: +pdfjs-document-properties-producer = PDF framleiðandi: +pdfjs-document-properties-version = PDF útgáfa: +pdfjs-document-properties-page-count = Blaðsíðufjöldi: +pdfjs-document-properties-page-size = Stærð síðu: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = skammsnið +pdfjs-document-properties-page-size-orientation-landscape = langsnið +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fljótleg vefskoðun: +pdfjs-document-properties-linearized-yes = Já +pdfjs-document-properties-linearized-no = Nei +pdfjs-document-properties-close-button = Loka + +## Print + +pdfjs-print-progress-message = Undirbý skjal fyrir prentun… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Hætta við +pdfjs-printing-not-supported = Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra. +pdfjs-printing-not-ready = Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Víxla hliðarspjaldi af/á +pdfjs-toggle-sidebar-notification-button = + .title = Víxla hliðarslá (skjal inniheldur yfirlit/viðhengi/lög) +pdfjs-toggle-sidebar-button-label = Víxla hliðarspjaldi af/á +pdfjs-document-outline-button = + .title = Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum) +pdfjs-document-outline-button-label = Efnisskipan skjals +pdfjs-attachments-button = + .title = Sýna viðhengi +pdfjs-attachments-button-label = Viðhengi +pdfjs-layers-button = + .title = Birta lög (tvísmelltu til að endurstilla öll lög í sjálfgefna stöðu) +pdfjs-layers-button-label = Lög +pdfjs-thumbs-button = + .title = Sýna smámyndir +pdfjs-thumbs-button-label = Smámyndir +pdfjs-current-outline-item-button = + .title = Finna núverandi atriði efnisskipunar +pdfjs-current-outline-item-button-label = Núverandi atriði efnisskipunar +pdfjs-findbar-button = + .title = Leita í skjali +pdfjs-findbar-button-label = Leita +pdfjs-additional-layers = Viðbótarlög + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Síða { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Smámynd af síðu { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Leita + .placeholder = Leita í skjali… +pdfjs-find-previous-button = + .title = Leita að fyrra tilfelli þessara orða +pdfjs-find-previous-button-label = Fyrri +pdfjs-find-next-button = + .title = Leita að næsta tilfelli þessara orða +pdfjs-find-next-button-label = Næsti +pdfjs-find-highlight-checkbox = Lita allt +pdfjs-find-match-case-checkbox-label = Passa við stafstöðu +pdfjs-find-match-diacritics-checkbox-label = Passa við broddstafi +pdfjs-find-entire-word-checkbox-label = Heil orð +pdfjs-find-reached-top = Náði efst í skjal, held áfram neðst +pdfjs-find-reached-bottom = Náði enda skjals, held áfram efst +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } af { $total } passar við + *[other] { $current } af { $total } passa við + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Fleiri en { $limit } passar við + *[other] Fleiri en { $limit } passa við + } +pdfjs-find-not-found = Fann ekki orðið + +## Predefined zoom values + +pdfjs-page-scale-width = Síðubreidd +pdfjs-page-scale-fit = Passa á síðu +pdfjs-page-scale-auto = Sjálfvirkur aðdráttur +pdfjs-page-scale-actual = Raunstærð +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Síða { $page } + +## Loading indicator messages + +pdfjs-loading-error = Villa kom upp við að hlaða inn PDF. +pdfjs-invalid-file-error = Ógild eða skemmd PDF skrá. +pdfjs-missing-file-error = Vantar PDF skrá. +pdfjs-unexpected-response-error = Óvænt svar frá netþjóni. +pdfjs-rendering-error = Upp kom villa við að birta síðuna. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Skýring] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Settu inn lykilorð til að opna þessa PDF-skrá. +pdfjs-password-invalid = Ógilt lykilorð. Reyndu aftur. +pdfjs-password-ok-button = Í lagi +pdfjs-password-cancel-button = Hætta við +pdfjs-web-fonts-disabled = Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texti +pdfjs-editor-free-text-button-label = Texti +pdfjs-editor-ink-button = + .title = Teikna +pdfjs-editor-ink-button-label = Teikna +pdfjs-editor-stamp-button = + .title = Bæta við eða breyta myndum +pdfjs-editor-stamp-button-label = Bæta við eða breyta myndum +pdfjs-editor-highlight-button = + .title = Áherslulita +pdfjs-editor-highlight-button-label = Áherslulita +pdfjs-highlight-floating-button1 = + .title = Áherslulita + .aria-label = Áherslulita +pdfjs-highlight-floating-button-label = Áherslulita + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Fjarlægja teikningu +pdfjs-editor-remove-freetext-button = + .title = Fjarlægja texta +pdfjs-editor-remove-stamp-button = + .title = Fjarlægja mynd +pdfjs-editor-remove-highlight-button = + .title = Fjarlægja áherslulit + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Litur +pdfjs-editor-free-text-size-input = Stærð +pdfjs-editor-ink-color-input = Litur +pdfjs-editor-ink-thickness-input = Þykkt +pdfjs-editor-ink-opacity-input = Ógegnsæi +pdfjs-editor-stamp-add-image-button = + .title = Bæta við mynd +pdfjs-editor-stamp-add-image-button-label = Bæta við mynd +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Þykkt +pdfjs-editor-free-highlight-thickness-title = + .title = Breyta þykkt við áherslulitun annarra atriða en texta +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Textaritill + .default-content = Byrjaðu að skrifa… +pdfjs-free-text = + .aria-label = Textaritill +pdfjs-free-text-default-content = Byrjaðu að skrifa… +pdfjs-ink = + .aria-label = Teikniritill +pdfjs-ink-canvas = + .aria-label = Mynd gerð af notanda + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alt-varatexti +pdfjs-editor-alt-text-edit-button = + .aria-label = Breyta alt-myndatexta +pdfjs-editor-alt-text-edit-button-label = Breyta alt-varatexta +pdfjs-editor-alt-text-dialog-label = Veldu valkost +pdfjs-editor-alt-text-dialog-description = Alt-varatexti (auka-myndatexti) hjálpar þegar fólk getur ekki séð myndina eða þegar hún hleðst ekki inn. +pdfjs-editor-alt-text-add-description-label = Bættu við lýsingu +pdfjs-editor-alt-text-add-description-description = Reyndu að takmarka þetta við 1-2 setningar sem lýsa efninu, umhverfi eða aðgerðum. +pdfjs-editor-alt-text-mark-decorative-label = Merkja sem skraut +pdfjs-editor-alt-text-mark-decorative-description = Þetta er notað fyrir skrautmyndir, eins og borða eða vatnsmerki. +pdfjs-editor-alt-text-cancel-button = Hætta við +pdfjs-editor-alt-text-save-button = Vista +pdfjs-editor-alt-text-decorative-tooltip = Merkt sem skraut +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Til dæmis: „Ungur maður sest við borð til að snæða máltíð“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt-myndatexti + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Efst í vinstra horni - breyta stærð +pdfjs-editor-resizer-label-top-middle = Efst á miðju - breyta stærð +pdfjs-editor-resizer-label-top-right = Efst í hægra horni - breyta stærð +pdfjs-editor-resizer-label-middle-right = Miðja til hægri - breyta stærð +pdfjs-editor-resizer-label-bottom-right = Neðst í hægra horni - breyta stærð +pdfjs-editor-resizer-label-bottom-middle = Neðst á miðju - breyta stærð +pdfjs-editor-resizer-label-bottom-left = Neðst í vinstra horni - breyta stærð +pdfjs-editor-resizer-label-middle-left = Miðja til vinstri - breyta stærð +pdfjs-editor-resizer-top-left = + .aria-label = Efst í vinstra horni - breyta stærð +pdfjs-editor-resizer-top-middle = + .aria-label = Efst á miðju - breyta stærð +pdfjs-editor-resizer-top-right = + .aria-label = Efst í hægra horni - breyta stærð +pdfjs-editor-resizer-middle-right = + .aria-label = Miðja til hægri - breyta stærð +pdfjs-editor-resizer-bottom-right = + .aria-label = Neðst í hægra horni - breyta stærð +pdfjs-editor-resizer-bottom-middle = + .aria-label = Neðst á miðju - breyta stærð +pdfjs-editor-resizer-bottom-left = + .aria-label = Neðst í vinstra horni - breyta stærð +pdfjs-editor-resizer-middle-left = + .aria-label = Miðja til vinstri - breyta stærð + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Áherslulitur +pdfjs-editor-colorpicker-button = + .title = Skipta um lit +pdfjs-editor-colorpicker-dropdown = + .aria-label = Val lita +pdfjs-editor-colorpicker-yellow = + .title = Gult +pdfjs-editor-colorpicker-green = + .title = Grænt +pdfjs-editor-colorpicker-blue = + .title = Blátt +pdfjs-editor-colorpicker-pink = + .title = Bleikt +pdfjs-editor-colorpicker-red = + .title = Rautt + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Birta allt +pdfjs-editor-highlight-show-all-button = + .title = Birta allt + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Breyta alt-myndatexta (lýsingu á mynd) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Bæta við alt-myndatexta (lýsingu á mynd) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skrifaðu lýsinguna þína hér… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Stutt lýsing fyrir fólk sem getur ekki séð myndina eða þegar myndin hleðst ekki inn. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Þessi alt-myndatexti var búinn til sjálfvirkt og gæti verið ónákvæmur. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Kanna nánar +pdfjs-editor-new-alt-text-create-automatically-button-label = Útbúa alt-myndatexta sjálfvirkt +pdfjs-editor-new-alt-text-not-now-button = Ekki núna +pdfjs-editor-new-alt-text-error-title = Gat ekki búið til alt-myndatexta sjálfkrafa +pdfjs-editor-new-alt-text-error-description = Skrifaðu þinn eiginn alt-myndatexta eða reyndu aftur síðar. +pdfjs-editor-new-alt-text-error-close-button = Loka +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Sækir gervigreindarlíkan með alt-myndatextum ({ $downloadedSize } af { $totalSize } MB) + .aria-valuetext = Sækir gervigreindarlíkan með alt-myndatextum ({ $downloadedSize } af { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt-myndatexta bætt við +pdfjs-editor-new-alt-text-added-button-label = Alt-myndatexta bætt við +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Vantar alt-myndatexta +pdfjs-editor-new-alt-text-missing-button-label = Vantar alt-myndatexta +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Yfirfara alt-myndatexta +pdfjs-editor-new-alt-text-to-review-button-label = Yfirfara myndatexta +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Útbúið sjálfvirkt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Stillingar fyrir alt-texta myndar +pdfjs-image-alt-text-settings-button-label = Stillingar fyrir alt-texta myndar +pdfjs-editor-alt-text-settings-dialog-label = Stillingar fyrir alt-texta myndar +pdfjs-editor-alt-text-settings-automatic-title = Sjálfvirkur alt-myndatexti +pdfjs-editor-alt-text-settings-create-model-button-label = Útbúa alt-myndatexta sjálfvirkt +pdfjs-editor-alt-text-settings-create-model-description = Stingur upp á lýsingum til að hjálpa fólki sem getur ekki séð myndina eða þegar myndin hleðst ekki inn. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Gervigreindarlíkan alt-myndatexta ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Keyrir staðbundið á tækinu þínu svo gögnin þín haldast undir þinni stjórn. Nauðsynlegt fyrir sjálfvirka alt-myndatexta. +pdfjs-editor-alt-text-settings-delete-model-button = Eyða +pdfjs-editor-alt-text-settings-download-model-button = Sækja +pdfjs-editor-alt-text-settings-downloading-model-button = Sæki… +pdfjs-editor-alt-text-settings-editor-title = Ritill fyrir alt-myndatexta +pdfjs-editor-alt-text-settings-show-dialog-button-label = Sýna alt-myndatextaritil strax þegar mynd er bætt við +pdfjs-editor-alt-text-settings-show-dialog-description = Hjálpar þér að tryggja að allar myndirnar þínar séu með alt-myndatexta. +pdfjs-editor-alt-text-settings-close-button = Loka + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Áherslulitun fjarlægð +pdfjs-editor-undo-bar-message-freetext = Texti fjarlægður +pdfjs-editor-undo-bar-message-ink = Teikning fjarlægð +pdfjs-editor-undo-bar-message-stamp = Mynd fjarlægð +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } glósa fjarlægð + *[other] { $count } glósur fjarlægðar + } +pdfjs-editor-undo-bar-undo-button = + .title = Afturkalla +pdfjs-editor-undo-bar-undo-button-label = Afturkalla +pdfjs-editor-undo-bar-close-button = + .title = Loka +pdfjs-editor-undo-bar-close-button-label = Loka diff --git a/public/pdfjs/web/locale/it/viewer.ftl b/public/pdfjs/web/locale/it/viewer.ftl new file mode 100644 index 0000000..d1de7e1 --- /dev/null +++ b/public/pdfjs/web/locale/it/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagina precedente +pdfjs-previous-button-label = Precedente +pdfjs-next-button = + .title = Pagina successiva +pdfjs-next-button-label = Successiva +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = di { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } di { $pagesCount }) +pdfjs-zoom-out-button = + .title = Riduci zoom +pdfjs-zoom-out-button-label = Riduci zoom +pdfjs-zoom-in-button = + .title = Aumenta zoom +pdfjs-zoom-in-button-label = Aumenta zoom +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Passa alla modalità presentazione +pdfjs-presentation-mode-button-label = Modalità presentazione +pdfjs-open-file-button = + .title = Apri file +pdfjs-open-file-button-label = Apri +pdfjs-print-button = + .title = Stampa +pdfjs-print-button-label = Stampa +pdfjs-save-button = + .title = Salva +pdfjs-save-button-label = Salva +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Scarica +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Scarica +pdfjs-bookmark-button = + .title = Pagina corrente (mostra URL della pagina corrente) +pdfjs-bookmark-button-label = Pagina corrente + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Strumenti +pdfjs-tools-button-label = Strumenti +pdfjs-first-page-button = + .title = Vai alla prima pagina +pdfjs-first-page-button-label = Vai alla prima pagina +pdfjs-last-page-button = + .title = Vai all’ultima pagina +pdfjs-last-page-button-label = Vai all’ultima pagina +pdfjs-page-rotate-cw-button = + .title = Ruota in senso orario +pdfjs-page-rotate-cw-button-label = Ruota in senso orario +pdfjs-page-rotate-ccw-button = + .title = Ruota in senso antiorario +pdfjs-page-rotate-ccw-button-label = Ruota in senso antiorario +pdfjs-cursor-text-select-tool-button = + .title = Attiva strumento di selezione testo +pdfjs-cursor-text-select-tool-button-label = Strumento di selezione testo +pdfjs-cursor-hand-tool-button = + .title = Attiva strumento mano +pdfjs-cursor-hand-tool-button-label = Strumento mano +pdfjs-scroll-page-button = + .title = Utilizza scorrimento pagine +pdfjs-scroll-page-button-label = Scorrimento pagine +pdfjs-scroll-vertical-button = + .title = Scorri le pagine in verticale +pdfjs-scroll-vertical-button-label = Scorrimento verticale +pdfjs-scroll-horizontal-button = + .title = Scorri le pagine in orizzontale +pdfjs-scroll-horizontal-button-label = Scorrimento orizzontale +pdfjs-scroll-wrapped-button = + .title = Scorri le pagine in verticale, disponendole da sinistra a destra e andando a capo automaticamente +pdfjs-scroll-wrapped-button-label = Scorrimento con a capo automatico +pdfjs-spread-none-button = + .title = Non raggruppare pagine +pdfjs-spread-none-button-label = Nessun raggruppamento +pdfjs-spread-odd-button = + .title = Crea gruppi di pagine che iniziano con numeri di pagina dispari +pdfjs-spread-odd-button-label = Raggruppamento dispari +pdfjs-spread-even-button = + .title = Crea gruppi di pagine che iniziano con numeri di pagina pari +pdfjs-spread-even-button-label = Raggruppamento pari + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Proprietà del documento… +pdfjs-document-properties-button-label = Proprietà del documento… +pdfjs-document-properties-file-name = Nome file: +pdfjs-document-properties-file-size = Dimensione file: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +pdfjs-document-properties-title = Titolo: +pdfjs-document-properties-author = Autore: +pdfjs-document-properties-subject = Oggetto: +pdfjs-document-properties-keywords = Parole chiave: +pdfjs-document-properties-creation-date = Data creazione: +pdfjs-document-properties-modification-date = Data modifica: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Autore originale: +pdfjs-document-properties-producer = Produttore PDF: +pdfjs-document-properties-version = Versione PDF: +pdfjs-document-properties-page-count = Conteggio pagine: +pdfjs-document-properties-page-size = Dimensioni pagina: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = verticale +pdfjs-document-properties-page-size-orientation-landscape = orizzontale +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Lettera +pdfjs-document-properties-page-size-name-legal = Legale + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Visualizzazione web veloce: +pdfjs-document-properties-linearized-yes = Sì +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Chiudi + +## Print + +pdfjs-print-progress-message = Preparazione documento per la stampa… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Annulla +pdfjs-printing-not-supported = Attenzione: la stampa non è completamente supportata da questo browser. +pdfjs-printing-not-ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Attiva/disattiva barra laterale +pdfjs-toggle-sidebar-notification-button = + .title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati/livelli) +pdfjs-toggle-sidebar-button-label = Attiva/disattiva barra laterale +pdfjs-document-outline-button = + .title = Visualizza la struttura del documento (doppio clic per visualizzare/comprimere tutti gli elementi) +pdfjs-document-outline-button-label = Struttura documento +pdfjs-attachments-button = + .title = Visualizza allegati +pdfjs-attachments-button-label = Allegati +pdfjs-layers-button = + .title = Visualizza livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito) +pdfjs-layers-button-label = Livelli +pdfjs-thumbs-button = + .title = Mostra le miniature +pdfjs-thumbs-button-label = Miniature +pdfjs-current-outline-item-button = + .title = Trova elemento struttura corrente +pdfjs-current-outline-item-button-label = Elemento struttura corrente +pdfjs-findbar-button = + .title = Trova nel documento +pdfjs-findbar-button-label = Trova +pdfjs-additional-layers = Livelli aggiuntivi + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura della pagina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Trova + .placeholder = Trova nel documento… +pdfjs-find-previous-button = + .title = Trova l’occorrenza precedente del testo da cercare +pdfjs-find-previous-button-label = Precedente +pdfjs-find-next-button = + .title = Trova l’occorrenza successiva del testo da cercare +pdfjs-find-next-button-label = Successivo +pdfjs-find-highlight-checkbox = Evidenzia +pdfjs-find-match-case-checkbox-label = Maiuscole/minuscole +pdfjs-find-match-diacritics-checkbox-label = Segni diacritici +pdfjs-find-entire-word-checkbox-label = Parole intere +pdfjs-find-reached-top = Raggiunto l’inizio della pagina, continua dalla fine +pdfjs-find-reached-bottom = Raggiunta la fine della pagina, continua dall’inizio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } di { $total } corrispondenza + *[other] { $current } di { $total } corrispondenze + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Più di una { $limit } corrispondenza + *[other] Più di { $limit } corrispondenze + } +pdfjs-find-not-found = Testo non trovato + +## Predefined zoom values + +pdfjs-page-scale-width = Larghezza pagina +pdfjs-page-scale-fit = Adatta a una pagina +pdfjs-page-scale-auto = Zoom automatico +pdfjs-page-scale-actual = Dimensioni effettive +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Si è verificato un errore durante il caricamento del PDF. +pdfjs-invalid-file-error = File PDF non valido o danneggiato. +pdfjs-missing-file-error = File PDF non disponibile. +pdfjs-unexpected-response-error = Risposta imprevista del server +pdfjs-rendering-error = Si è verificato un errore durante il rendering della pagina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Annotazione: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Inserire la password per aprire questo file PDF. +pdfjs-password-invalid = Password non corretta. Riprovare. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Annulla +pdfjs-web-fonts-disabled = I web font risultano disattivati: impossibile utilizzare i caratteri incorporati nel PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Testo +pdfjs-editor-free-text-button-label = Testo +pdfjs-editor-ink-button = + .title = Disegno +pdfjs-editor-ink-button-label = Disegno +pdfjs-editor-stamp-button = + .title = Aggiungi o rimuovi immagine +pdfjs-editor-stamp-button-label = Aggiungi o rimuovi immagine +pdfjs-editor-highlight-button = + .title = Evidenzia +pdfjs-editor-highlight-button-label = Evidenzia +pdfjs-highlight-floating-button1 = + .title = Evidenzia + .aria-label = Evidenzia +pdfjs-highlight-floating-button-label = Evidenzia + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Rimuovi disegno +pdfjs-editor-remove-freetext-button = + .title = Rimuovi testo +pdfjs-editor-remove-stamp-button = + .title = Rimuovi immagine +pdfjs-editor-remove-highlight-button = + .title = Rimuovi evidenziazione + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Colore +pdfjs-editor-free-text-size-input = Dimensione +pdfjs-editor-ink-color-input = Colore +pdfjs-editor-ink-thickness-input = Spessore +pdfjs-editor-ink-opacity-input = Opacità +pdfjs-editor-stamp-add-image-button = + .title = Aggiungi immagine +pdfjs-editor-stamp-add-image-button-label = Aggiungi immagine +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Spessore +pdfjs-editor-free-highlight-thickness-title = + .title = Modifica lo spessore della selezione per elementi non testuali +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor di testo + .default-content = Inizia a digitare… +pdfjs-free-text = + .aria-label = Editor di testo +pdfjs-free-text-default-content = Inizia a digitare… +pdfjs-ink = + .aria-label = Editor disegni +pdfjs-ink-canvas = + .aria-label = Immagine creata dall’utente + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Testo alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifica testo alternativo +pdfjs-editor-alt-text-edit-button-label = Modifica testo alternativo +pdfjs-editor-alt-text-dialog-label = Scegli un’opzione +pdfjs-editor-alt-text-dialog-description = Il testo alternativo (“alt text”) aiuta quando le persone non possono vedere l’immagine o quando l’immagine non viene caricata. +pdfjs-editor-alt-text-add-description-label = Aggiungi una descrizione +pdfjs-editor-alt-text-add-description-description = Punta a una o due frasi che descrivono l’argomento, l’ambientazione o le azioni. +pdfjs-editor-alt-text-mark-decorative-label = Contrassegna come decorativa +pdfjs-editor-alt-text-mark-decorative-description = Viene utilizzato per immagini ornamentali, come bordi o filigrane. +pdfjs-editor-alt-text-cancel-button = Annulla +pdfjs-editor-alt-text-save-button = Salva +pdfjs-editor-alt-text-decorative-tooltip = Contrassegnata come decorativa +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Ad esempio, “Un giovane si siede a tavola per mangiare” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Testo alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Angolo in alto a sinistra — ridimensiona +pdfjs-editor-resizer-label-top-middle = Lato superiore nel mezzo — ridimensiona +pdfjs-editor-resizer-label-top-right = Angolo in alto a destra — ridimensiona +pdfjs-editor-resizer-label-middle-right = Lato destro nel mezzo — ridimensiona +pdfjs-editor-resizer-label-bottom-right = Angolo in basso a destra — ridimensiona +pdfjs-editor-resizer-label-bottom-middle = Lato inferiore nel mezzo — ridimensiona +pdfjs-editor-resizer-label-bottom-left = Angolo in basso a sinistra — ridimensiona +pdfjs-editor-resizer-label-middle-left = Lato sinistro nel mezzo — ridimensiona +pdfjs-editor-resizer-top-left = + .aria-label = Angolo in alto a sinistra — ridimensiona +pdfjs-editor-resizer-top-middle = + .aria-label = Lato superiore nel mezzo — ridimensiona +pdfjs-editor-resizer-top-right = + .aria-label = Angolo in alto a destra — ridimensiona +pdfjs-editor-resizer-middle-right = + .aria-label = Lato destro nel mezzo — ridimensiona +pdfjs-editor-resizer-bottom-right = + .aria-label = Angolo in basso a destra — ridimensiona +pdfjs-editor-resizer-bottom-middle = + .aria-label = Lato inferiore nel mezzo — ridimensiona +pdfjs-editor-resizer-bottom-left = + .aria-label = Angolo in basso a sinistra — ridimensiona +pdfjs-editor-resizer-middle-left = + .aria-label = Lato sinistro nel mezzo — ridimensiona + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Colore evidenziatore +pdfjs-editor-colorpicker-button = + .title = Cambia colore +pdfjs-editor-colorpicker-dropdown = + .aria-label = Colori disponibili +pdfjs-editor-colorpicker-yellow = + .title = Giallo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Blu +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Rosso + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostra tutto +pdfjs-editor-highlight-show-all-button = + .title = Mostra tutto + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifica testo alternativo (descrizione dell’immagine) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Aggiungi testo alternativo (descrizione dell’immagine) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scrivi qui la tua descrizione… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descrizione per le persone che non possono vedere l’immagine, o mostrata quando l’immagine non si carica. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Questo testo alternativo è stato creato automaticamente e potrebbe non essere accurato. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ulteriori informazioni +pdfjs-editor-new-alt-text-create-automatically-button-label = Crea automaticamente testo alternativo +pdfjs-editor-new-alt-text-not-now-button = Non adesso +pdfjs-editor-new-alt-text-error-title = Impossibile creare automaticamente il testo alternativo +pdfjs-editor-new-alt-text-error-description = Scrivi il testo alternativo o riprova più tardi. +pdfjs-editor-new-alt-text-error-close-button = Chiudi +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Download in corso del modello IA per il testo alternativo ({ $downloadedSize } di { $totalSize } MB) + .aria-valuetext = Download in corso del modello IA per il testo alternativo ({ $downloadedSize } di { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Aggiunto testo alternativo +pdfjs-editor-new-alt-text-added-button-label = Aggiunto testo alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Testo alternativo mancante +pdfjs-editor-new-alt-text-missing-button-label = Testo alternativo mancante +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Verifica testo alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Verifica testo alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creato automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Impostazioni testo alternativo per le immagini +pdfjs-image-alt-text-settings-button-label = Impostazioni testo alternativo per le immagini +pdfjs-editor-alt-text-settings-dialog-label = Impostazioni testo alternativo per le immagini +pdfjs-editor-alt-text-settings-automatic-title = Testo alternativo automatico +pdfjs-editor-alt-text-settings-create-model-button-label = Crea testo alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Suggerisce una descrizione per le persone che non possono vedere l’immagine, o mostrata quando l’immagine non si carica. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modello IA per il testo alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Viene eseguito localmente sul tuo dispositivo in modo che i tuoi dati rimangano riservati. È richiesto per la generazione automatica del testo alternativo. +pdfjs-editor-alt-text-settings-delete-model-button = Elimina +pdfjs-editor-alt-text-settings-download-model-button = Scarica +pdfjs-editor-alt-text-settings-downloading-model-button = Download… +pdfjs-editor-alt-text-settings-editor-title = Modifica testo alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostra l’editor del testo alternativo non appena si aggiunge un’immagine +pdfjs-editor-alt-text-settings-show-dialog-description = Ti aiuta ad assicurarti che tutte le tue immagini abbiano il testo alternativo. +pdfjs-editor-alt-text-settings-close-button = Chiudi + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Evidenziazione rimossa +pdfjs-editor-undo-bar-message-freetext = Testo rimosso +pdfjs-editor-undo-bar-message-ink = Disegno rimosso +pdfjs-editor-undo-bar-message-stamp = Immagine rimossa +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotazione rimossa + *[other] { $count } annotazioni rimosse + } +pdfjs-editor-undo-bar-undo-button = + .title = Annulla +pdfjs-editor-undo-bar-undo-button-label = Annulla +pdfjs-editor-undo-bar-close-button = + .title = Chiudi +pdfjs-editor-undo-bar-close-button-label = Chiudi diff --git a/public/pdfjs/web/locale/ja/viewer.ftl b/public/pdfjs/web/locale/ja/viewer.ftl new file mode 100644 index 0000000..0f37f2a --- /dev/null +++ b/public/pdfjs/web/locale/ja/viewer.ftl @@ -0,0 +1,503 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = 前のページへ戻ります +pdfjs-previous-button-label = 前へ +pdfjs-next-button = + .title = 次のページへ進みます +pdfjs-next-button-label = 次へ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ページ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = 表示を縮小します +pdfjs-zoom-out-button-label = 縮小 +pdfjs-zoom-in-button = + .title = 表示を拡大します +pdfjs-zoom-in-button-label = 拡大 +pdfjs-zoom-select = + .title = 拡大/縮小 +pdfjs-presentation-mode-button = + .title = プレゼンテーションモードに切り替えます +pdfjs-presentation-mode-button-label = プレゼンテーションモード +pdfjs-open-file-button = + .title = ファイルを開きます +pdfjs-open-file-button-label = 開く +pdfjs-print-button = + .title = 印刷します +pdfjs-print-button-label = 印刷 +pdfjs-save-button = + .title = 保存します +pdfjs-save-button-label = 保存 +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ダウンロードします +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ダウンロード +pdfjs-bookmark-button = + .title = 現在のページの URL です (現在のページを表示する URL) +pdfjs-bookmark-button-label = 現在のページ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ツール +pdfjs-tools-button-label = ツール +pdfjs-first-page-button = + .title = 最初のページへ移動します +pdfjs-first-page-button-label = 最初のページへ移動 +pdfjs-last-page-button = + .title = 最後のページへ移動します +pdfjs-last-page-button-label = 最後のページへ移動 +pdfjs-page-rotate-cw-button = + .title = ページを右へ回転します +pdfjs-page-rotate-cw-button-label = 右回転 +pdfjs-page-rotate-ccw-button = + .title = ページを左へ回転します +pdfjs-page-rotate-ccw-button-label = 左回転 +pdfjs-cursor-text-select-tool-button = + .title = テキスト選択ツールを有効にします +pdfjs-cursor-text-select-tool-button-label = テキスト選択ツール +pdfjs-cursor-hand-tool-button = + .title = 手のひらツールを有効にします +pdfjs-cursor-hand-tool-button-label = 手のひらツール +pdfjs-scroll-page-button = + .title = ページ単位でスクロールします +pdfjs-scroll-page-button-label = ページ単位でスクロール +pdfjs-scroll-vertical-button = + .title = 縦スクロールにします +pdfjs-scroll-vertical-button-label = 縦スクロール +pdfjs-scroll-horizontal-button = + .title = 横スクロールにします +pdfjs-scroll-horizontal-button-label = 横スクロール +pdfjs-scroll-wrapped-button = + .title = 折り返しスクロールにします +pdfjs-scroll-wrapped-button-label = 折り返しスクロール +pdfjs-spread-none-button = + .title = 見開きにしません +pdfjs-spread-none-button-label = 見開きにしない +pdfjs-spread-odd-button = + .title = 奇数ページ開始で見開きにします +pdfjs-spread-odd-button-label = 奇数ページ見開き +pdfjs-spread-even-button = + .title = 偶数ページ開始で見開きにします +pdfjs-spread-even-button-label = 偶数ページ見開き + +## Document properties dialog + +pdfjs-document-properties-button = + .title = 文書のプロパティ... +pdfjs-document-properties-button-label = 文書のプロパティ... +pdfjs-document-properties-file-name = ファイル名: +pdfjs-document-properties-file-size = ファイルサイズ: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } バイト) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } バイト) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } バイト) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } バイト) +pdfjs-document-properties-title = タイトル: +pdfjs-document-properties-author = 作成者: +pdfjs-document-properties-subject = 件名: +pdfjs-document-properties-keywords = キーワード: +pdfjs-document-properties-creation-date = 作成日: +pdfjs-document-properties-modification-date = 更新日: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = アプリケーション: +pdfjs-document-properties-producer = PDF 作成: +pdfjs-document-properties-version = PDF のバージョン: +pdfjs-document-properties-page-count = ページ数: +pdfjs-document-properties-page-size = ページサイズ: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = 縦 +pdfjs-document-properties-page-size-orientation-landscape = 横 +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = レター +pdfjs-document-properties-page-size-name-legal = リーガル + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = ウェブ表示用に最適化: +pdfjs-document-properties-linearized-yes = はい +pdfjs-document-properties-linearized-no = いいえ +pdfjs-document-properties-close-button = 閉じる + +## Print + +pdfjs-print-progress-message = 文書の印刷を準備しています... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = キャンセル +pdfjs-printing-not-supported = 警告: このブラウザーでは印刷が完全にサポートされていません。 +pdfjs-printing-not-ready = 警告: PDF を印刷するための読み込みが終了していません。 + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = サイドバー表示を切り替えます +pdfjs-toggle-sidebar-notification-button = + .title = サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付 / レイヤー) +pdfjs-toggle-sidebar-button-label = サイドバーの切り替え +pdfjs-document-outline-button = + .title = 文書の目次を表示します (ダブルクリックで項目を開閉します) +pdfjs-document-outline-button-label = 文書の目次 +pdfjs-attachments-button = + .title = 添付ファイルを表示します +pdfjs-attachments-button-label = 添付ファイル +pdfjs-layers-button = + .title = レイヤーを表示します (ダブルクリックですべてのレイヤーが初期状態に戻ります) +pdfjs-layers-button-label = レイヤー +pdfjs-thumbs-button = + .title = 縮小版を表示します +pdfjs-thumbs-button-label = 縮小版 +pdfjs-current-outline-item-button = + .title = 現在のアウトライン項目を検索 +pdfjs-current-outline-item-button-label = 現在のアウトライン項目 +pdfjs-findbar-button = + .title = 文書内を検索します +pdfjs-findbar-button-label = 検索 +pdfjs-additional-layers = 追加レイヤー + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } ページ +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } ページの縮小版 + +## Find panel button title and messages + +pdfjs-find-input = + .title = 検索 + .placeholder = 文書内を検索... +pdfjs-find-previous-button = + .title = 現在より前の位置で指定文字列が現れる部分を検索します +pdfjs-find-previous-button-label = 前へ +pdfjs-find-next-button = + .title = 現在より後の位置で指定文字列が現れる部分を検索します +pdfjs-find-next-button-label = 次へ +pdfjs-find-highlight-checkbox = すべて強調表示 +pdfjs-find-match-case-checkbox-label = 大文字/小文字を区別 +pdfjs-find-match-diacritics-checkbox-label = 発音区別符号を区別 +pdfjs-find-entire-word-checkbox-label = 単語一致 +pdfjs-find-reached-top = 文書先頭に到達したので末尾から続けて検索します +pdfjs-find-reached-bottom = 文書末尾に到達したので先頭から続けて検索します +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = { $total } 件中 { $current } 件目 +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = { $limit } 件以上一致 +pdfjs-find-not-found = 見つかりませんでした + +## Predefined zoom values + +pdfjs-page-scale-width = 幅に合わせる +pdfjs-page-scale-fit = ページのサイズに合わせる +pdfjs-page-scale-auto = 自動ズーム +pdfjs-page-scale-actual = 実際のサイズ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page } ページ + +## Loading indicator messages + +pdfjs-loading-error = PDF の読み込み中にエラーが発生しました。 +pdfjs-invalid-file-error = 無効または破損した PDF ファイル。 +pdfjs-missing-file-error = PDF ファイルが見つかりません。 +pdfjs-unexpected-response-error = サーバーから予期せぬ応答がありました。 +pdfjs-rendering-error = ページのレンダリング中にエラーが発生しました。 + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } 注釈] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = この PDF ファイルを開くためのパスワードを入力してください。 +pdfjs-password-invalid = パスワードが正しくありません。もう一度試してください。 +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = キャンセル +pdfjs-web-fonts-disabled = ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。 + +## Editing + +pdfjs-editor-free-text-button = + .title = フリーテキスト注釈を追加します +pdfjs-editor-free-text-button-label = フリーテキスト注釈 +pdfjs-editor-ink-button = + .title = インク注釈を追加します +pdfjs-editor-ink-button-label = インク注釈 +pdfjs-editor-stamp-button = + .title = 画像を追加または編集します +pdfjs-editor-stamp-button-label = 画像を追加または編集 +pdfjs-editor-highlight-button = + .title = 強調します +pdfjs-editor-highlight-button-label = 強調 +pdfjs-highlight-floating-button1 = + .title = 強調 + .aria-label = 強調します +pdfjs-highlight-floating-button-label = 強調 + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = インク注釈を削除します +pdfjs-editor-remove-freetext-button = + .title = テキストを削除します +pdfjs-editor-remove-stamp-button = + .title = 画像を削除します +pdfjs-editor-remove-highlight-button = + .title = 強調を削除します + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = 色 +pdfjs-editor-free-text-size-input = サイズ +pdfjs-editor-ink-color-input = 色 +pdfjs-editor-ink-thickness-input = 太さ +pdfjs-editor-ink-opacity-input = 不透明度 +pdfjs-editor-stamp-add-image-button = + .title = 画像を追加します +pdfjs-editor-stamp-add-image-button-label = 画像を追加 +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = 太さ +pdfjs-editor-free-highlight-thickness-title = + .title = テキスト以外のアイテムを強調する時の太さを変更します +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = フリーテキスト注釈エディター + .default-content = テキストを入力してください... +pdfjs-free-text = + .aria-label = フリーテキスト注釈エディター +pdfjs-free-text-default-content = テキストを入力してください... +pdfjs-ink = + .aria-label = インク注釈エディター +pdfjs-ink-canvas = + .aria-label = ユーザー作成画像 + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = 代替テキスト +pdfjs-editor-alt-text-edit-button = + .aria-label = 代替テキストを編集 +pdfjs-editor-alt-text-edit-button-label = 代替テキストを編集 +pdfjs-editor-alt-text-dialog-label = オプションの選択 +pdfjs-editor-alt-text-dialog-description = 代替テキストは画像が表示されない場合や読み込まれない場合にユーザーの助けになります。 +pdfjs-editor-alt-text-add-description-label = 説明を追加 +pdfjs-editor-alt-text-add-description-description = 対象や設定、動作を説明する短い文章を記入してください。 +pdfjs-editor-alt-text-mark-decorative-label = 装飾マークを付ける +pdfjs-editor-alt-text-mark-decorative-description = これは区切り線やウォーターマークなどの装飾画像に使用されます。 +pdfjs-editor-alt-text-cancel-button = キャンセル +pdfjs-editor-alt-text-save-button = 保存 +pdfjs-editor-alt-text-decorative-tooltip = 装飾マークが付いています +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = 例:「若い人がテーブルの席について食事をしています」 +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 代替テキスト + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = 左上隅 — サイズ変更 +pdfjs-editor-resizer-label-top-middle = 上中央 — サイズ変更 +pdfjs-editor-resizer-label-top-right = 右上隅 — サイズ変更 +pdfjs-editor-resizer-label-middle-right = 右中央 — サイズ変更 +pdfjs-editor-resizer-label-bottom-right = 右下隅 — サイズ変更 +pdfjs-editor-resizer-label-bottom-middle = 下中央 — サイズ変更 +pdfjs-editor-resizer-label-bottom-left = 左下隅 — サイズ変更 +pdfjs-editor-resizer-label-middle-left = 左中央 — サイズ変更 +pdfjs-editor-resizer-top-left = + .aria-label = 左上隅 — サイズ変更 +pdfjs-editor-resizer-top-middle = + .aria-label = 上中央 — サイズ変更 +pdfjs-editor-resizer-top-right = + .aria-label = 右上隅 — サイズ変更 +pdfjs-editor-resizer-middle-right = + .aria-label = 右中央 — サイズ変更 +pdfjs-editor-resizer-bottom-right = + .aria-label = 右下隅 — サイズ変更 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 下中央 — サイズ変更 +pdfjs-editor-resizer-bottom-left = + .aria-label = 左下隅 — サイズ変更 +pdfjs-editor-resizer-middle-left = + .aria-label = 左中央 — サイズ変更 + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = 強調色 +pdfjs-editor-colorpicker-button = + .title = 色を変更します +pdfjs-editor-colorpicker-dropdown = + .aria-label = 色の選択 +pdfjs-editor-colorpicker-yellow = + .title = 黄色 +pdfjs-editor-colorpicker-green = + .title = 緑色 +pdfjs-editor-colorpicker-blue = + .title = 青色 +pdfjs-editor-colorpicker-pink = + .title = ピンク色 +pdfjs-editor-colorpicker-red = + .title = 赤色 + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = すべて表示 +# (^m^) en-US: .title = Show all +pdfjs-editor-highlight-show-all-button = + .title = 強調の表示を切り替えます + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 代替テキストを編集 (画像の説明) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 代替テキストを追加 (画像の説明) +pdfjs-editor-new-alt-text-textarea = + .placeholder = ここに説明を記入してください... +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 画像が読み込まれない場合や見えない人のための短い説明です。 +pdfjs-editor-new-alt-text-disclaimer1 = この代替テキストは自動的に生成されたため正確でない可能性があります。 +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 詳細情報 +pdfjs-editor-new-alt-text-create-automatically-button-label = 代替テキストを自動生成 +pdfjs-editor-new-alt-text-not-now-button = 後で +pdfjs-editor-new-alt-text-error-title = 代替テキストを自動生成できませんでした +pdfjs-editor-new-alt-text-error-description = ご自分で代替テキストを書くか後でもう一度試してください。 +pdfjs-editor-new-alt-text-error-close-button = 閉じる +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 代替テキスト AI モデルをダウンロードしています ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = 代替テキスト AI モデルをダウンロードしています ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 代替テキストを追加しました +pdfjs-editor-new-alt-text-added-button-label = 代替テキストを追加しました +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 代替テキストがありません +pdfjs-editor-new-alt-text-missing-button-label = 代替テキストがありません +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 代替テキストをレビュー +pdfjs-editor-new-alt-text-to-review-button-label = 代替テキストをレビュー +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 自動生成されました: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 画像の代替テキスト設定 +pdfjs-image-alt-text-settings-button-label = 画像の代替テキスト設定 +pdfjs-editor-alt-text-settings-dialog-label = 画像の代替テキスト設定 +pdfjs-editor-alt-text-settings-automatic-title = 自動代替テキスト +pdfjs-editor-alt-text-settings-create-model-button-label = 代替テキストを自動生成 +pdfjs-editor-alt-text-settings-create-model-description = 画像が読み込まれない場合や見えない人のために説明を提案します。 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 代替テキスト AI モデル ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = ローカルの端末上で実行されるためデータは非公開になります。代替テキストの自動生成に必要です。 +pdfjs-editor-alt-text-settings-delete-model-button = 削除 +pdfjs-editor-alt-text-settings-download-model-button = ダウンロード +pdfjs-editor-alt-text-settings-downloading-model-button = ダウンロード中... +pdfjs-editor-alt-text-settings-editor-title = 代替テキストエディター +pdfjs-editor-alt-text-settings-show-dialog-button-label = 画像の追加時に代替テキストエディターを表示する +pdfjs-editor-alt-text-settings-show-dialog-description = すべての画像に代替テキストを追加する助けになります。 +pdfjs-editor-alt-text-settings-close-button = 閉じる + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 強調表示が削除されました +pdfjs-editor-undo-bar-message-freetext = フリーテキスト注釈が削除されました +pdfjs-editor-undo-bar-message-ink = インク注釈が削除されました +pdfjs-editor-undo-bar-message-stamp = 画像が削除されました +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = { $count } 個の注釈が削除されました +pdfjs-editor-undo-bar-undo-button = + .title = 元に戻す +pdfjs-editor-undo-bar-undo-button-label = 元に戻す +pdfjs-editor-undo-bar-close-button = + .title = 閉じる +pdfjs-editor-undo-bar-close-button-label = 閉じる diff --git a/public/pdfjs/web/locale/ka/viewer.ftl b/public/pdfjs/web/locale/ka/viewer.ftl new file mode 100644 index 0000000..d500f3e --- /dev/null +++ b/public/pdfjs/web/locale/ka/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = წინა გვერდი +pdfjs-previous-button-label = წინა +pdfjs-next-button = + .title = შემდეგი გვერდი +pdfjs-next-button-label = შემდეგი +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = გვერდი +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount }-დან +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } { $pagesCount }-დან) +pdfjs-zoom-out-button = + .title = ზომის შემცირება +pdfjs-zoom-out-button-label = დაშორება +pdfjs-zoom-in-button = + .title = ზომის გაზრდა +pdfjs-zoom-in-button-label = მოახლოება +pdfjs-zoom-select = + .title = ზომა +pdfjs-presentation-mode-button = + .title = წარდგენის რეჟიმზე გადართვა +pdfjs-presentation-mode-button-label = წარდგენის რეჟიმი +pdfjs-open-file-button = + .title = ფაილის გახსნა +pdfjs-open-file-button-label = გახსნა +pdfjs-print-button = + .title = ამობეჭდვა +pdfjs-print-button-label = ამობეჭდვა +pdfjs-save-button = + .title = შენახვა +pdfjs-save-button-label = შენახვა +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ჩამოტვირთვა +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ჩამოტვირთვა +pdfjs-bookmark-button = + .title = მიმდინარე გვერდი (ბმული ამ გვერდისთვის) +pdfjs-bookmark-button-label = მიმდინარე გვერდი + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ხელსაწყოები +pdfjs-tools-button-label = ხელსაწყოები +pdfjs-first-page-button = + .title = პირველ გვერდზე გადასვლა +pdfjs-first-page-button-label = პირველ გვერდზე გადასვლა +pdfjs-last-page-button = + .title = ბოლო გვერდზე გადასვლა +pdfjs-last-page-button-label = ბოლო გვერდზე გადასვლა +pdfjs-page-rotate-cw-button = + .title = საათის ისრის მიმართულებით შებრუნება +pdfjs-page-rotate-cw-button-label = მარჯვნივ გადაბრუნება +pdfjs-page-rotate-ccw-button = + .title = საათის ისრის საპირისპიროდ შებრუნება +pdfjs-page-rotate-ccw-button-label = მარცხნივ გადაბრუნება +pdfjs-cursor-text-select-tool-button = + .title = მოსანიშნი მაჩვენებლის გამოყენება +pdfjs-cursor-text-select-tool-button-label = მოსანიშნი მაჩვენებელი +pdfjs-cursor-hand-tool-button = + .title = გადასაადგილებელი მაჩვენებლის გამოყენება +pdfjs-cursor-hand-tool-button-label = გადასაადგილებელი +pdfjs-scroll-page-button = + .title = გვერდზე გადაადგილების გამოყენება +pdfjs-scroll-page-button-label = გვერდშივე გადაადგილება +pdfjs-scroll-vertical-button = + .title = გვერდების შვეულად ჩვენება +pdfjs-scroll-vertical-button-label = შვეული გადაადგილება +pdfjs-scroll-horizontal-button = + .title = გვერდების თარაზულად ჩვენება +pdfjs-scroll-horizontal-button-label = განივი გადაადგილება +pdfjs-scroll-wrapped-button = + .title = გვერდების ცხრილურად ჩვენება +pdfjs-scroll-wrapped-button-label = ცხრილური გადაადგილება +pdfjs-spread-none-button = + .title = ორ გვერდზე გაშლის გარეშე +pdfjs-spread-none-button-label = ცალგვერდიანი ჩვენება +pdfjs-spread-odd-button = + .title = ორ გვერდზე გაშლა კენტი გვერდიდან +pdfjs-spread-odd-button-label = ორ გვერდზე კენტიდან +pdfjs-spread-even-button = + .title = ორ გვერდზე გაშლა ლუწი გვერდიდან +pdfjs-spread-even-button-label = ორ გვერდზე ლუწიდან + +## Document properties dialog + +pdfjs-document-properties-button = + .title = დოკუმენტის შესახებ… +pdfjs-document-properties-button-label = დოკუმენტის შესახებ… +pdfjs-document-properties-file-name = ფაილის სახელი: +pdfjs-document-properties-file-size = ფაილის მოცულობა: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } კბაიტი ({ $b } ბაიტი) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } მბაიტი ({ $b } ბაიტი) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } კბ ({ $size_b } ბაიტი) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } მბ ({ $size_b } ბაიტი) +pdfjs-document-properties-title = სათაური: +pdfjs-document-properties-author = შემქმნელი: +pdfjs-document-properties-subject = თემა: +pdfjs-document-properties-keywords = საკვანძო სიტყვები: +pdfjs-document-properties-creation-date = შექმნის დრო: +pdfjs-document-properties-modification-date = ჩასწორების დრო: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = შემდგენელი: +pdfjs-document-properties-producer = PDF-შემდგენელი: +pdfjs-document-properties-version = PDF-ვერსია: +pdfjs-document-properties-page-count = გვერდები: +pdfjs-document-properties-page-size = გვერდის ზომა: +pdfjs-document-properties-page-size-unit-inches = დუიმი +pdfjs-document-properties-page-size-unit-millimeters = მმ +pdfjs-document-properties-page-size-orientation-portrait = შვეულად +pdfjs-document-properties-page-size-orientation-landscape = თარაზულად +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = მსუბუქი ვებჩვენება: +pdfjs-document-properties-linearized-yes = დიახ +pdfjs-document-properties-linearized-no = არა +pdfjs-document-properties-close-button = დახურვა + +## Print + +pdfjs-print-progress-message = დოკუმენტი მზადდება ამოსაბეჭდად… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = გაუქმება +pdfjs-printing-not-supported = გაფრთხილება: ამობეჭდვა ამ ბრაუზერში არაა სრულად მხარდაჭერილი. +pdfjs-printing-not-ready = გაფრთხილება: PDF სრულად ჩატვირთული არაა, ამობეჭდვის დასაწყებად. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = გვერდითა ზოლის გამოჩენა/დამალვა +pdfjs-toggle-sidebar-notification-button = + .title = გვერდითი ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს/შრეებს) +pdfjs-toggle-sidebar-button-label = გვერდითა ზოლის გამოჩენა/დამალვა +pdfjs-document-outline-button = + .title = დოკუმენტის სარჩევის ჩვენება (ორმაგი წკაპით თითოეულის ჩამოშლა/აკეცვა) +pdfjs-document-outline-button-label = დოკუმენტის სარჩევი +pdfjs-attachments-button = + .title = დანართების ჩვენება +pdfjs-attachments-button-label = დანართები +pdfjs-layers-button = + .title = შრეების გამოჩენა (ორმაგი წკაპით ყველა შრის ნაგულისხმევზე დაბრუნება) +pdfjs-layers-button-label = შრეები +pdfjs-thumbs-button = + .title = შეთვალიერება +pdfjs-thumbs-button-label = ესკიზები +pdfjs-current-outline-item-button = + .title = მიმდინარე გვერდის მონახვა სარჩევში +pdfjs-current-outline-item-button-label = მიმდინარე გვერდი სარჩევში +pdfjs-findbar-button = + .title = პოვნა დოკუმენტში +pdfjs-findbar-button-label = ძიება +pdfjs-additional-layers = დამატებითი შრეები + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = გვერდი { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = გვერდის შეთვალიერება { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ძიება + .placeholder = პოვნა დოკუმენტში… +pdfjs-find-previous-button = + .title = წინა დამთხვევის პოვნა +pdfjs-find-previous-button-label = წინა +pdfjs-find-next-button = + .title = მომდევნო დამთხვევის პოვნა +pdfjs-find-next-button-label = შემდეგი +pdfjs-find-highlight-checkbox = ყველაფრის მონიშვნა +pdfjs-find-match-case-checkbox-label = მთავრულით +pdfjs-find-match-diacritics-checkbox-label = ნიშნებით +pdfjs-find-entire-word-checkbox-label = მთლიანი სიტყვები +pdfjs-find-reached-top = მიღწეულია დოკუმენტის დასაწყისი, გრძელდება ბოლოდან +pdfjs-find-reached-bottom = მიღწეულია დოკუმენტის ბოლო, გრძელდება დასაწყისიდან +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] თანხვედრა { $current }, სულ { $total } + *[other] თანხვედრა { $current }, სულ { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] არანაკლებ { $limit } თანხვედრა + *[other] არანაკლებ { $limit } თანხვედრა + } +pdfjs-find-not-found = ფრაზა ვერ მოიძებნა + +## Predefined zoom values + +pdfjs-page-scale-width = გვერდის სიგანეზე +pdfjs-page-scale-fit = მთლიანი გვერდი +pdfjs-page-scale-auto = ავტომატური +pdfjs-page-scale-actual = საწყისი ზომა +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = გვერდი { $page } + +## Loading indicator messages + +pdfjs-loading-error = შეცდომა, PDF-ფაილის ჩატვირთვისას. +pdfjs-invalid-file-error = არამართებული ან დაზიანებული PDF-ფაილი. +pdfjs-missing-file-error = ნაკლული PDF-ფაილი. +pdfjs-unexpected-response-error = სერვერის მოულოდნელი პასუხი. +pdfjs-rendering-error = შეცდომა, გვერდის ჩვენებისას. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } შენიშვნა] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = შეიყვანეთ პაროლი PDF-ფაილის გასახსნელად. +pdfjs-password-invalid = არასწორი პაროლი. გთხოვთ, სცადოთ ხელახლა. +pdfjs-password-ok-button = კარგი +pdfjs-password-cancel-button = გაუქმება +pdfjs-web-fonts-disabled = ვებშრიფტები გამორთულია: ჩაშენებული PDF-შრიფტების გამოყენება ვერ ხერხდება. + +## Editing + +pdfjs-editor-free-text-button = + .title = წარწერა +pdfjs-editor-free-text-button-label = წარწერა +pdfjs-editor-ink-button = + .title = ხაზვა +pdfjs-editor-ink-button-label = ხაზვა +pdfjs-editor-stamp-button = + .title = სურათების დართვა ან ჩასწორება +pdfjs-editor-stamp-button-label = სურათების დართვა ან ჩასწორება +pdfjs-editor-highlight-button = + .title = მონიშვნა +pdfjs-editor-highlight-button-label = მონიშვნა +pdfjs-highlight-floating-button1 = + .title = მონიშვნა + .aria-label = მონიშვნა +pdfjs-highlight-floating-button-label = მონიშვნა + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = დახაზულის მოცილება +pdfjs-editor-remove-freetext-button = + .title = წარწერის მოცილება +pdfjs-editor-remove-stamp-button = + .title = სურათის მოცილება +pdfjs-editor-remove-highlight-button = + .title = მონიშვნის მოცილება + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = ფერი +pdfjs-editor-free-text-size-input = ზომა +pdfjs-editor-ink-color-input = ფერი +pdfjs-editor-ink-thickness-input = სისქე +pdfjs-editor-ink-opacity-input = გაუმჭვირვალობა +pdfjs-editor-stamp-add-image-button = + .title = სურათის დამატება +pdfjs-editor-stamp-add-image-button-label = სურათის დამატება +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = სისქე +pdfjs-editor-free-highlight-thickness-title = + .title = სისქის შეცვლა წარწერის გარდა სხვა ნაწილების მონიშვნისას +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = ნაწერის ჩასწორება + .default-content = დაიწყეთ აკრეფა… +pdfjs-free-text = + .aria-label = ნაწერის ჩასწორება +pdfjs-free-text-default-content = აკრიფეთ… +pdfjs-ink = + .aria-label = დახაზულის შესწორება +pdfjs-ink-canvas = + .aria-label = მომხმარებლის შექმნილი სურათი + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = თანდართული წარწერა +pdfjs-editor-alt-text-edit-button = + .aria-label = დართული წარწერის ჩასწორება +pdfjs-editor-alt-text-edit-button-label = თანდართული წარწერის ჩასწორება +pdfjs-editor-alt-text-dialog-label = არჩევა +pdfjs-editor-alt-text-dialog-description = თანდართული (შემნაცვლებელი) წარწერა გამოსადეგია მათთვის, ვინც ვერ ხედავს სურათებს ან გამოისახება მაშინ, როცა სურათი ვერ ჩაიტვირთება. +pdfjs-editor-alt-text-add-description-label = აღწერილობის მითითება +pdfjs-editor-alt-text-add-description-description = განკუთვნილია 1-2 წინადადებით საგნის, მახასიათებლის ან მოქმედების აღსაწერად. +pdfjs-editor-alt-text-mark-decorative-label = მოინიშნოს მორთულობად +pdfjs-editor-alt-text-mark-decorative-description = განკუთვნილია შესამკობი სურათებისთვის, გარსშემოსავლები ჩარჩოებისა და ჭვირნიშნებისთვის. +pdfjs-editor-alt-text-cancel-button = გაუქმება +pdfjs-editor-alt-text-save-button = შენახვა +pdfjs-editor-alt-text-decorative-tooltip = მოინიშნოს მორთულობად +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = მაგალითად, „ახალგაზრდა მამაკაცი მაგიდასთან ზის და სადილობს“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = დართული წარწერა + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = ზევით მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-label-top-middle = ზევით შუაში — ზომაცვლა +pdfjs-editor-resizer-label-top-right = ზევით მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-label-middle-right = შუაში მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-label-bottom-right = ქვევით მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-label-bottom-middle = ქვევით შუაში — ზომაცვლა +pdfjs-editor-resizer-label-bottom-left = ზვევით მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-label-middle-left = შუაში მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-top-left = + .aria-label = ზევით მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-top-middle = + .aria-label = ზევით შუაში — ზომაცვლა +pdfjs-editor-resizer-top-right = + .aria-label = ზევით მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-middle-right = + .aria-label = შუაში მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-bottom-right = + .aria-label = ქვევით მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-bottom-middle = + .aria-label = ქვევით შუაში — ზომაცვლა +pdfjs-editor-resizer-bottom-left = + .aria-label = ზვევით მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-middle-left = + .aria-label = შუაში მარცხნივ — ზომაცვლა + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = მოსანიშნი ფერი +pdfjs-editor-colorpicker-button = + .title = ფერის შეცვლა +pdfjs-editor-colorpicker-dropdown = + .aria-label = ფერის არჩევა +pdfjs-editor-colorpicker-yellow = + .title = ყვითელი +pdfjs-editor-colorpicker-green = + .title = მწვანე +pdfjs-editor-colorpicker-blue = + .title = ლურჯი +pdfjs-editor-colorpicker-pink = + .title = ვარდისფერი +pdfjs-editor-colorpicker-red = + .title = წითელი + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = ყველას ჩვენება +pdfjs-editor-highlight-show-all-button = + .title = ყველას ჩვენება + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = დართული წარწერის ჩასწორება (სურათის აღწერის) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = დართული წარწერის დამატება (სურათის აღწერის) +pdfjs-editor-new-alt-text-textarea = + .placeholder = დაწერეთ თქვენი აღწერა აქ… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = მოკლე აღწერა მათთვის, ვინც ვერ ხედავს სურათს ან ვისთანაც ვერ ჩაიტვირთება სურათი. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ეს დართული წარწერა ავტომატურადაა შედგენილი და შესაძლოა, უმართებულო იყოს. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ვრცლად +pdfjs-editor-new-alt-text-create-automatically-button-label = დართული წარწერის ავტომატური შედგენა +pdfjs-editor-new-alt-text-not-now-button = ახლა არა +pdfjs-editor-new-alt-text-error-title = დართული წარწერის შედგენა ვერ მოხერხდა +pdfjs-editor-new-alt-text-error-description = გთხოვთ დაწეროთ საკუთარი დანართი და კვლავ სცადოთ მოგვიანებით. +pdfjs-editor-new-alt-text-error-close-button = დახურვა +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = ჩამოიტვირთება დართული წარწერის შესადეგი AI-მოდელი ({ $downloadedSize } ზომით { $totalSize } მბაიტი) + .aria-valuetext = ჩამოიტვირთება დართული წარწერის შესადეგი AI-მოდელი ({ $downloadedSize } ზომით { $totalSize } მბაიტი) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = დართული წარწერა დამატებულია +pdfjs-editor-new-alt-text-added-button-label = დართული წარწერა დამატებულია +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = აკლია დართული წარწერა +pdfjs-editor-new-alt-text-missing-button-label = აკლია დართული წარწერა +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = დართული წარწერის გადახედვა +pdfjs-editor-new-alt-text-to-review-button-label = დართული წარწერის გადახედვა +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = შედგენილია ავტომატურად: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = სურათის დართული წარწერის პარამეტრები +pdfjs-image-alt-text-settings-button-label = სურათის დართული წარწერის პარამეტრები +pdfjs-editor-alt-text-settings-dialog-label = სურათის დართული წარწერის პარამეტრები +pdfjs-editor-alt-text-settings-automatic-title = ავტომატურად დართული წარწერა +pdfjs-editor-alt-text-settings-create-model-button-label = დართული წარწერის ავტომატური შედგენა +pdfjs-editor-alt-text-settings-create-model-description = აღწერს სურათს მათთვის, ვინც ვერ ხედავს ან ვისთანაც ვერ ჩაიტვირთება. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = დართული წარწერის შესადგენი AI-მოდელი ({ $totalSize } მბაიტი) +pdfjs-editor-alt-text-settings-ai-model-description = ეშვება ადგილობრივად თქვენს მოწყობილობასა, ასე რომ მონაცემები დარჩება პირადი. საჭიროა წარწერის ავტომატურად დართვისთვის. +pdfjs-editor-alt-text-settings-delete-model-button = წაშლა +pdfjs-editor-alt-text-settings-download-model-button = ჩამოტვირთვა +pdfjs-editor-alt-text-settings-downloading-model-button = ჩამოიტვრითება... +pdfjs-editor-alt-text-settings-editor-title = დართული წარწერის ჩამსწორებელი +pdfjs-editor-alt-text-settings-show-dialog-button-label = გამოჩნდეს დართული წარწერის ჩამსწორებელი სურათის დამატებისთანავე +pdfjs-editor-alt-text-settings-show-dialog-description = უზრუნველყოფს, რომ თქვენს ყველა სურათს ახლდეს დართული წარწერა. +pdfjs-editor-alt-text-settings-close-button = დახურვა + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = მონიშვნა მოცილებულია +pdfjs-editor-undo-bar-message-freetext = წარწერა მოცილებულია +pdfjs-editor-undo-bar-message-ink = ნახატი მოცილებულია +pdfjs-editor-undo-bar-message-stamp = სურათი მოცილებულია +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } შენიშვნა მოცილებულია + *[other] { $count } შენიშვნა მოცილებულია + } +pdfjs-editor-undo-bar-undo-button = + .title = დაბრუნება +pdfjs-editor-undo-bar-undo-button-label = დაბრუნება +pdfjs-editor-undo-bar-close-button = + .title = დახურვა +pdfjs-editor-undo-bar-close-button-label = დახურვა diff --git a/public/pdfjs/web/locale/kab/viewer.ftl b/public/pdfjs/web/locale/kab/viewer.ftl new file mode 100644 index 0000000..dda88c1 --- /dev/null +++ b/public/pdfjs/web/locale/kab/viewer.ftl @@ -0,0 +1,438 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Asebter azewwar +pdfjs-previous-button-label = Azewwar +pdfjs-next-button = + .title = Asebter d-iteddun +pdfjs-next-button-label = Ddu ɣer zdat +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Asebter +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = ɣef { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } n { $pagesCount }) +pdfjs-zoom-out-button = + .title = Semẓi +pdfjs-zoom-out-button-label = Semẓi +pdfjs-zoom-in-button = + .title = Semɣeṛ +pdfjs-zoom-in-button-label = Semɣeṛ +pdfjs-zoom-select = + .title = Semɣeṛ/Semẓi +pdfjs-presentation-mode-button = + .title = Uɣal ɣer Uskar Tihawt +pdfjs-presentation-mode-button-label = Askar Tihawt +pdfjs-open-file-button = + .title = Ldi Afaylu +pdfjs-open-file-button-label = Ldi +pdfjs-print-button = + .title = Siggez +pdfjs-print-button-label = Siggez +pdfjs-save-button = + .title = Sekles +pdfjs-save-button-label = Sekles +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Sader +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Sader +pdfjs-bookmark-button = + .title = Asebter amiran (Sken-d tansa URL seg usebter amiran) +pdfjs-bookmark-button-label = Asebter amiran + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ifecka +pdfjs-tools-button-label = Ifecka +pdfjs-first-page-button = + .title = Ddu ɣer usebter amezwaru +pdfjs-first-page-button-label = Ddu ɣer usebter amezwaru +pdfjs-last-page-button = + .title = Ddu ɣer usebter aneggaru +pdfjs-last-page-button-label = Ddu ɣer usebter aneggaru +pdfjs-page-rotate-cw-button = + .title = Tuzzya tusrigt +pdfjs-page-rotate-cw-button-label = Tuzzya tusrigt +pdfjs-page-rotate-ccw-button = + .title = Tuzzya amgal-usrig +pdfjs-page-rotate-ccw-button-label = Tuzzya amgal-usrig +pdfjs-cursor-text-select-tool-button = + .title = Rmed afecku n tefrant n uḍris +pdfjs-cursor-text-select-tool-button-label = Afecku n tefrant n uḍris +pdfjs-cursor-hand-tool-button = + .title = Rmed afecku afus +pdfjs-cursor-hand-tool-button-label = Afecku afus +pdfjs-scroll-page-button = + .title = Seqdec adrurem n usebter +pdfjs-scroll-page-button-label = Adrurem n usebter +pdfjs-scroll-vertical-button = + .title = Seqdec adrurem ubdid +pdfjs-scroll-vertical-button-label = Adrurem ubdid +pdfjs-scroll-horizontal-button = + .title = Seqdec adrurem aglawan +pdfjs-scroll-horizontal-button-label = Adrurem aglawan +pdfjs-scroll-wrapped-button = + .title = Seqdec adrurem yuẓen +pdfjs-scroll-wrapped-button-label = Adrurem yuẓen +pdfjs-spread-none-button = + .title = Ur sedday ara isiɣzaf n usebter +pdfjs-spread-none-button-label = Ulac isiɣzaf +pdfjs-spread-odd-button = + .title = Seddu isiɣzaf n usebter ibeddun s yisebtar irayuganen +pdfjs-spread-odd-button-label = Isiɣzaf irayuganen +pdfjs-spread-even-button = + .title = Seddu isiɣzaf n usebter ibeddun s yisebtar iyuganen +pdfjs-spread-even-button-label = Isiɣzaf iyuganen + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Taɣaṛa n isemli… +pdfjs-document-properties-button-label = Taɣaṛa n isemli… +pdfjs-document-properties-file-name = Isem n ufaylu: +pdfjs-document-properties-file-size = Teɣzi n ufaylu: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } yibiten) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } yibiten) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KAṬ ({ $size_b } ibiten) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MAṬ ({ $size_b } iṭamḍanen) +pdfjs-document-properties-title = Azwel: +pdfjs-document-properties-author = Ameskar: +pdfjs-document-properties-subject = Amgay: +pdfjs-document-properties-keywords = Awalen n tsaruţ +pdfjs-document-properties-creation-date = Azemz n tmerna: +pdfjs-document-properties-modification-date = Azemz n usnifel: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Yerna-t: +pdfjs-document-properties-producer = Afecku n uselket PDF: +pdfjs-document-properties-version = Lqem PDF: +pdfjs-document-properties-page-count = Amḍan n yisebtar: +pdfjs-document-properties-page-size = Tuγzi n usebter: +pdfjs-document-properties-page-size-unit-inches = deg +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = s teɣzi +pdfjs-document-properties-page-size-orientation-landscape = s tehri +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Asekkil +pdfjs-document-properties-page-size-name-legal = Usḍif + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Taskant Web taruradt: +pdfjs-document-properties-linearized-yes = Ih +pdfjs-document-properties-linearized-no = Ala +pdfjs-document-properties-close-button = Mdel + +## Print + +pdfjs-print-progress-message = Aheggi i usiggez n isemli… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Sefsex +pdfjs-printing-not-supported = Ɣuṛ-k: Asiggez ur ittusefrak ara yakan imaṛṛa deg iminig-a. +pdfjs-printing-not-ready = Ɣuṛ-k: Afaylu PDF ur d-yuli ara imeṛṛa akken ad ittusiggez. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Sken/Fer agalis adisan +pdfjs-toggle-sidebar-notification-button = + .title = Ffer/Sekn agalis adisan (isemli yegber aɣawas/ticeqqufin yeddan/tissiwin) +pdfjs-toggle-sidebar-button-label = Sken/Fer agalis adisan +pdfjs-document-outline-button = + .title = Sken isemli (Senned snat tikal i wesemɣer/Afneẓ n iferdisen meṛṛa) +pdfjs-document-outline-button-label = Isɣalen n isebtar +pdfjs-attachments-button = + .title = Sken ticeqqufin yeddan +pdfjs-attachments-button-label = Ticeqqufin yeddan +pdfjs-layers-button = + .title = Skeen tissiwin (sit sin yiberdan i uwennez n meṛṛa tissiwin ɣer waddad amezwer) +pdfjs-layers-button-label = Tissiwin +pdfjs-thumbs-button = + .title = Sken tanfult. +pdfjs-thumbs-button-label = Tinfulin +pdfjs-current-outline-item-button = + .title = Af-d aferdis n uɣawas amiran +pdfjs-current-outline-item-button-label = Aferdis n uɣawas amiran +pdfjs-findbar-button = + .title = Nadi deg isemli +pdfjs-findbar-button-label = Nadi +pdfjs-additional-layers = Tissiwin-nniḍen + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Asebter { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Tanfult n usebter { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Nadi + .placeholder = Nadi deg isemli… +pdfjs-find-previous-button = + .title = Aff-d tamseḍriwt n twinest n deffir +pdfjs-find-previous-button-label = Azewwar +pdfjs-find-next-button = + .title = Aff-d timseḍriwt n twinest d-iteddun +pdfjs-find-next-button-label = Ddu ɣer zdat +pdfjs-find-highlight-checkbox = Err izirig imaṛṛa +pdfjs-find-match-case-checkbox-label = Qadeṛ amasal n isekkilen +pdfjs-find-match-diacritics-checkbox-label = Qadeṛ ifeskilen +pdfjs-find-entire-word-checkbox-label = Awalen iččuranen +pdfjs-find-reached-top = Yabbeḍ s afella n usebter, tuɣalin s wadda +pdfjs-find-reached-bottom = Tebḍeḍ s adda n usebter, tuɣalin s afella +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Timeḍriwt { $current } ɣef { $total } + *[other] Timeḍriwin { $current } ɣef { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Ugar n { $limit } umṣada + *[other] Ugar n { $limit } yimṣadayen + } +pdfjs-find-not-found = Ulac tawinest + +## Predefined zoom values + +pdfjs-page-scale-width = Tehri n usebter +pdfjs-page-scale-fit = Asebter imaṛṛa +pdfjs-page-scale-auto = Asemɣeṛ/Asemẓi awurman +pdfjs-page-scale-actual = Teɣzi tilawt +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Asebter { $page } + +## Loading indicator messages + +pdfjs-loading-error = Teḍra-d tuccḍa deg alluy n PDF: +pdfjs-invalid-file-error = Afaylu PDF arameɣtu neɣ yexṣeṛ. +pdfjs-missing-file-error = Ulac afaylu PDF. +pdfjs-unexpected-response-error = Aqeddac yerra-d yir tiririt ur nettwaṛǧi ara. +pdfjs-rendering-error = Teḍra-d tuccḍa deg uskan n usebter. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Tabzimt { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Sekcem awal uffir akken ad ldiḍ afaylu-yagi PDF +pdfjs-password-invalid = Awal uffir mačči d ameɣtu, Ɛreḍ tikelt-nniḍen. +pdfjs-password-ok-button = IH +pdfjs-password-cancel-button = Sefsex +pdfjs-web-fonts-disabled = Tisefsiyin web ttwassensent; D awezɣi useqdec n tsefsiyin yettwarnan ɣer PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Aḍris +pdfjs-editor-free-text-button-label = Aḍris +pdfjs-editor-ink-button = + .title = Suneɣ +pdfjs-editor-ink-button-label = Suneɣ +pdfjs-editor-stamp-button = + .title = Rnu neɣ ẓreg tugniwin +pdfjs-editor-stamp-button-label = Rnu neɣ ẓreg tugniwin +pdfjs-editor-highlight-button = + .title = Derrer +pdfjs-editor-highlight-button-label = Derrer +pdfjs-highlight-floating-button1 = + .title = Derrer + .aria-label = Derrer +pdfjs-highlight-floating-button-label = Derrer + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Kkes asuneɣ +pdfjs-editor-remove-freetext-button = + .title = Kkes aḍris +pdfjs-editor-remove-stamp-button = + .title = Kkes tugna +pdfjs-editor-remove-highlight-button = + .title = Kkes aderrer + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Initen +pdfjs-editor-free-text-size-input = Teɣzi +pdfjs-editor-ink-color-input = Ini +pdfjs-editor-ink-thickness-input = Tuzert +pdfjs-editor-ink-opacity-input = Tebrek +pdfjs-editor-stamp-add-image-button = + .title = Rnu tawlaft +pdfjs-editor-stamp-add-image-button-label = Rnu tawlaft +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tuzert +pdfjs-editor-free-highlight-thickness-title = + .title = Beddel tuzert mi ara d-tesbeggneḍ iferdisen niḍen ur nelli d aḍris +pdfjs-free-text = + .aria-label = Amaẓrag n uḍris +pdfjs-free-text-default-content = Bdu tira... +pdfjs-ink = + .aria-label = Amaẓrag n usuneɣ +pdfjs-ink-canvas = + .aria-label = Tugna yettwarnan sɣur useqdac + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button-label = Aḍris amaskal +pdfjs-editor-alt-text-edit-button-label = Ẓreg aḍris amaskal +pdfjs-editor-alt-text-dialog-label = Fren taxtirt +pdfjs-editor-alt-text-add-description-label = Rnu aglam +pdfjs-editor-alt-text-mark-decorative-label = Creḍ d adlag +pdfjs-editor-alt-text-cancel-button = Sefsex +pdfjs-editor-alt-text-save-button = Sekles +pdfjs-editor-alt-text-decorative-tooltip = Yettwacreḍ d adlag + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Tiɣmert n ufella n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-label-top-middle = Talemmat n ufella — semsawi teɣzi +pdfjs-editor-resizer-label-top-right = Tiɣmert n ufella n yeffus — semsawi teɣzi +pdfjs-editor-resizer-label-middle-right = Talemmast tayeffust — semsawi teɣzi +pdfjs-editor-resizer-label-bottom-right = Tiɣmert n wadda n yeffus — semsawi teɣzi +pdfjs-editor-resizer-label-bottom-middle = Talemmat n wadda — semsawi teɣzi +pdfjs-editor-resizer-label-bottom-left = Tiɣmert n wadda n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-label-middle-left = Talemmast tazelmdaḍt — semsawi teɣzi +pdfjs-editor-resizer-top-left = + .aria-label = Tiɣmert n ufella n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-top-middle = + .aria-label = Talemmat n ufella — semsawi teɣzi +pdfjs-editor-resizer-top-right = + .aria-label = Tiɣmert n ufella n yeffus — semsawi teɣzi +pdfjs-editor-resizer-middle-right = + .aria-label = Talemmast tayeffust — semsawi teɣzi +pdfjs-editor-resizer-bottom-right = + .aria-label = Tiɣmert n wadda n yeffus — semsawi teɣzi +pdfjs-editor-resizer-bottom-middle = + .aria-label = Talemmat n wadda — semsawi teɣzi +pdfjs-editor-resizer-bottom-left = + .aria-label = Tiɣmert n wadda n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-middle-left = + .aria-label = Talemmast tazelmdaḍt — semsawi teɣzi + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Ini n uderrer +pdfjs-editor-colorpicker-button = + .title = Senfel ini +pdfjs-editor-colorpicker-dropdown = + .aria-label = Afran n yiniten +pdfjs-editor-colorpicker-yellow = + .title = Awraɣ +pdfjs-editor-colorpicker-green = + .title = Azegzaw +pdfjs-editor-colorpicker-blue = + .title = Amidadi +pdfjs-editor-colorpicker-pink = + .title = Axuxi +pdfjs-editor-colorpicker-red = + .title = Azggaɣ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Sken akk +pdfjs-editor-highlight-show-all-button = + .title = Sken akk + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Rnu aḍris niḍen (aglam n tugna) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Aru aglam-ik dagi… +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Issin ugar +pdfjs-editor-new-alt-text-create-automatically-button-label = Rnu aḍris niḍen s wudem awurman +pdfjs-editor-new-alt-text-not-now-button = Mačči tura +pdfjs-editor-new-alt-text-error-title = D awezɣi timerna n uḍris niḍen s wudem awurman +pdfjs-editor-new-alt-text-error-close-button = Mdel + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = Kkes +pdfjs-editor-alt-text-settings-download-model-button = Sader +pdfjs-editor-alt-text-settings-downloading-model-button = Asader… +pdfjs-editor-alt-text-settings-close-button = Mdel diff --git a/public/pdfjs/web/locale/kk/viewer.ftl b/public/pdfjs/web/locale/kk/viewer.ftl new file mode 100644 index 0000000..fb14226 --- /dev/null +++ b/public/pdfjs/web/locale/kk/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Алдыңғы парақ +pdfjs-previous-button-label = Алдыңғысы +pdfjs-next-button = + .title = Келесі парақ +pdfjs-next-button-label = Келесі +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Парақ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } ішінен +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = (парақ { $pageNumber }, { $pagesCount } ішінен) +pdfjs-zoom-out-button = + .title = Кішірейту +pdfjs-zoom-out-button-label = Кішірейту +pdfjs-zoom-in-button = + .title = Үлкейту +pdfjs-zoom-in-button-label = Үлкейту +pdfjs-zoom-select = + .title = Масштаб +pdfjs-presentation-mode-button = + .title = Презентация режиміне ауысу +pdfjs-presentation-mode-button-label = Презентация режимі +pdfjs-open-file-button = + .title = Файлды ашу +pdfjs-open-file-button-label = Ашу +pdfjs-print-button = + .title = Баспаға шығару +pdfjs-print-button-label = Баспаға шығару +pdfjs-save-button = + .title = Сақтау +pdfjs-save-button-label = Сақтау +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Жүктеп алу +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Жүктеп алу +pdfjs-bookmark-button = + .title = Ағымдағы бет (Ағымдағы беттен URL адресін көру) +pdfjs-bookmark-button-label = Ағымдағы бет + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Құралдар +pdfjs-tools-button-label = Құралдар +pdfjs-first-page-button = + .title = Алғашқы параққа өту +pdfjs-first-page-button-label = Алғашқы параққа өту +pdfjs-last-page-button = + .title = Соңғы параққа өту +pdfjs-last-page-button-label = Соңғы параққа өту +pdfjs-page-rotate-cw-button = + .title = Сағат тілі бағытымен айналдыру +pdfjs-page-rotate-cw-button-label = Сағат тілі бағытымен бұру +pdfjs-page-rotate-ccw-button = + .title = Сағат тілі бағытына қарсы бұру +pdfjs-page-rotate-ccw-button-label = Сағат тілі бағытына қарсы бұру +pdfjs-cursor-text-select-tool-button = + .title = Мәтінді таңдау құралын іске қосу +pdfjs-cursor-text-select-tool-button-label = Мәтінді таңдау құралы +pdfjs-cursor-hand-tool-button = + .title = Қол құралын іске қосу +pdfjs-cursor-hand-tool-button-label = Қол құралы +pdfjs-scroll-page-button = + .title = Беттерді айналдыруды пайдалану +pdfjs-scroll-page-button-label = Беттерді айналдыру +pdfjs-scroll-vertical-button = + .title = Вертикалды айналдыруды қолдану +pdfjs-scroll-vertical-button-label = Вертикалды айналдыру +pdfjs-scroll-horizontal-button = + .title = Горизонталды айналдыруды қолдану +pdfjs-scroll-horizontal-button-label = Горизонталды айналдыру +pdfjs-scroll-wrapped-button = + .title = Масштабталатын айналдыруды қолдану +pdfjs-scroll-wrapped-button-label = Масштабталатын айналдыру +pdfjs-spread-none-button = + .title = Жазық беттер режимін қолданбау +pdfjs-spread-none-button-label = Жазық беттер режимсіз +pdfjs-spread-odd-button = + .title = Жазық беттер тақ нөмірлі беттерден басталады +pdfjs-spread-odd-button-label = Тақ нөмірлі беттер сол жақтан +pdfjs-spread-even-button = + .title = Жазық беттер жұп нөмірлі беттерден басталады +pdfjs-spread-even-button-label = Жұп нөмірлі беттер сол жақтан + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Құжат қасиеттері… +pdfjs-document-properties-button-label = Құжат қасиеттері… +pdfjs-document-properties-file-name = Файл аты: +pdfjs-document-properties-file-size = Файл өлшемі: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байт) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +pdfjs-document-properties-title = Тақырыбы: +pdfjs-document-properties-author = Авторы: +pdfjs-document-properties-subject = Тақырыбы: +pdfjs-document-properties-keywords = Кілт сөздер: +pdfjs-document-properties-creation-date = Жасалған күні: +pdfjs-document-properties-modification-date = Түзету күні: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Жасаған: +pdfjs-document-properties-producer = PDF өндірген: +pdfjs-document-properties-version = PDF нұсқасы: +pdfjs-document-properties-page-count = Беттер саны: +pdfjs-document-properties-page-size = Бет өлшемі: +pdfjs-document-properties-page-size-unit-inches = дюйм +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = тік +pdfjs-document-properties-page-size-orientation-landscape = жатық +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Жылдам Web көрінісі: +pdfjs-document-properties-linearized-yes = Иә +pdfjs-document-properties-linearized-no = Жоқ +pdfjs-document-properties-close-button = Жабу + +## Print + +pdfjs-print-progress-message = Құжатты баспаға шығару үшін дайындау… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Бас тарту +pdfjs-printing-not-supported = Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды. +pdfjs-printing-not-ready = Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Бүйір панелін көрсету/жасыру +pdfjs-toggle-sidebar-notification-button = + .title = Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар/қабаттар бар) +pdfjs-toggle-sidebar-button-label = Бүйір панелін көрсету/жасыру +pdfjs-document-outline-button = + .title = Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек) +pdfjs-document-outline-button-label = Құжат құрамасы +pdfjs-attachments-button = + .title = Салынымдарды көрсету +pdfjs-attachments-button-label = Салынымдар +pdfjs-layers-button = + .title = Қабаттарды көрсету (барлық қабаттарды бастапқы күйге келтіру үшін екі рет шертіңіз) +pdfjs-layers-button-label = Қабаттар +pdfjs-thumbs-button = + .title = Кіші көріністерді көрсету +pdfjs-thumbs-button-label = Кіші көріністер +pdfjs-current-outline-item-button = + .title = Құрылымның ағымдағы элементін табу +pdfjs-current-outline-item-button-label = Құрылымның ағымдағы элементі +pdfjs-findbar-button = + .title = Құжаттан табу +pdfjs-findbar-button-label = Табу +pdfjs-additional-layers = Қосымша қабаттар + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } парағы +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } парағы үшін кіші көрінісі + +## Find panel button title and messages + +pdfjs-find-input = + .title = Табу + .placeholder = Құжаттан табу… +pdfjs-find-previous-button = + .title = Осы сөздердің мәтіннен алдыңғы кездесуін табу +pdfjs-find-previous-button-label = Алдыңғысы +pdfjs-find-next-button = + .title = Осы сөздердің мәтіннен келесі кездесуін табу +pdfjs-find-next-button-label = Келесі +pdfjs-find-highlight-checkbox = Барлығын түспен ерекшелеу +pdfjs-find-match-case-checkbox-label = Регистрді ескеру +pdfjs-find-match-diacritics-checkbox-label = Диакритиканы ескеру +pdfjs-find-entire-word-checkbox-label = Сөздер толығымен +pdfjs-find-reached-top = Құжаттың басына жеттік, соңынан бастап жалғастырамыз +pdfjs-find-reached-bottom = Құжаттың соңына жеттік, басынан бастап жалғастырамыз +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } сәйкестік, барлығы { $total } + *[other] { $current } сәйкестік, барлығы { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] { $limit } сәйкестіктен көп + *[other] { $limit } сәйкестіктен көп + } +pdfjs-find-not-found = Сөз(дер) табылмады + +## Predefined zoom values + +pdfjs-page-scale-width = Парақ ені +pdfjs-page-scale-fit = Парақты сыйдыру +pdfjs-page-scale-auto = Автомасштабтау +pdfjs-page-scale-actual = Нақты өлшемі +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Бет { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDF жүктеу кезінде қате кетті. +pdfjs-invalid-file-error = Зақымдалған немесе қате PDF файл. +pdfjs-missing-file-error = PDF файлы жоқ. +pdfjs-unexpected-response-error = Сервердің күтпеген жауабы. +pdfjs-rendering-error = Парақты өңдеу кезінде қате кетті. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } аңдатпасы] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Бұл PDF файлын ашу үшін парольді енгізіңіз. +pdfjs-password-invalid = Пароль дұрыс емес. Қайталап көріңіз. +pdfjs-password-ok-button = ОК +pdfjs-password-cancel-button = Бас тарту +pdfjs-web-fonts-disabled = Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес. + +## Editing + +pdfjs-editor-free-text-button = + .title = Мәтін +pdfjs-editor-free-text-button-label = Мәтін +pdfjs-editor-ink-button = + .title = Сурет салу +pdfjs-editor-ink-button-label = Сурет салу +pdfjs-editor-stamp-button = + .title = Суреттерді қосу немесе түзету +pdfjs-editor-stamp-button-label = Суреттерді қосу немесе түзету +pdfjs-editor-highlight-button = + .title = Ерекшелеу +pdfjs-editor-highlight-button-label = Ерекшелеу +pdfjs-highlight-floating-button1 = + .title = Ерекшелеу + .aria-label = Ерекшелеу +pdfjs-highlight-floating-button-label = Ерекшелеу + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Сызбаны өшіру +pdfjs-editor-remove-freetext-button = + .title = Мәтінді өшіру +pdfjs-editor-remove-stamp-button = + .title = Суретті өшіру +pdfjs-editor-remove-highlight-button = + .title = Түспен ерекшелеуді өшіру + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Түс +pdfjs-editor-free-text-size-input = Өлшемі +pdfjs-editor-ink-color-input = Түс +pdfjs-editor-ink-thickness-input = Қалыңдығы +pdfjs-editor-ink-opacity-input = Мөлдірсіздігі +pdfjs-editor-stamp-add-image-button = + .title = Суретті қосу +pdfjs-editor-stamp-add-image-button-label = Суретті қосу +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Қалыңдығы +pdfjs-editor-free-highlight-thickness-title = + .title = Мәтіннен басқа элементтерді ерекшелеу кезінде қалыңдықты өзгерту +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Мәтін түзеткіші + .default-content = Теріп бастаңыз… +pdfjs-free-text = + .aria-label = Мәтін түзеткіші +pdfjs-free-text-default-content = Теруді бастау… +pdfjs-ink = + .aria-label = Сурет түзеткіші +pdfjs-ink-canvas = + .aria-label = Пайдаланушы жасаған сурет + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Балама мәтін +pdfjs-editor-alt-text-edit-button = + .aria-label = Балама мәтінді өңдеу +pdfjs-editor-alt-text-edit-button-label = Балама мәтінді өңдеу +pdfjs-editor-alt-text-dialog-label = Опцияны таңдау +pdfjs-editor-alt-text-dialog-description = Балама мәтін адамдар суретті көре алмағанда немесе ол жүктелмегенде көмектеседі. +pdfjs-editor-alt-text-add-description-label = Сипаттаманы қосу +pdfjs-editor-alt-text-add-description-description = Тақырыпты, баптауды немесе әрекетті сипаттайтын 1-2 сөйлемді қолдануға тырысыңыз. +pdfjs-editor-alt-text-mark-decorative-label = Декоративті деп белгілеу +pdfjs-editor-alt-text-mark-decorative-description = Бұл жиектер немесе су белгілері сияқты оюлық суреттер үшін пайдаланылады. +pdfjs-editor-alt-text-cancel-button = Бас тарту +pdfjs-editor-alt-text-save-button = Сақтау +pdfjs-editor-alt-text-decorative-tooltip = Декоративті деп белгіленген +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Мысалы, "Жас жігіт тамақ ішу үшін үстел басына отырады" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Балама мәтін + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Жоғарғы сол жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-label-top-middle = Жоғарғы ортасы — өлшемін өзгерту +pdfjs-editor-resizer-label-top-right = Жоғарғы оң жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-label-middle-right = Ортаңғы оң жақ — өлшемін өзгерту +pdfjs-editor-resizer-label-bottom-right = Төменгі оң жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-label-bottom-middle = Төменгі ортасы — өлшемін өзгерту +pdfjs-editor-resizer-label-bottom-left = Төменгі сол жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-label-middle-left = Ортаңғы сол жақ — өлшемін өзгерту +pdfjs-editor-resizer-top-left = + .aria-label = Жоғарғы сол жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-top-middle = + .aria-label = Жоғарғы ортасы — өлшемін өзгерту +pdfjs-editor-resizer-top-right = + .aria-label = Жоғарғы оң жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-middle-right = + .aria-label = Ортаңғы оң жақ — өлшемін өзгерту +pdfjs-editor-resizer-bottom-right = + .aria-label = Төменгі оң жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-bottom-middle = + .aria-label = Төменгі ортасы — өлшемін өзгерту +pdfjs-editor-resizer-bottom-left = + .aria-label = Төменгі сол жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-middle-left = + .aria-label = Ортаңғы сол жақ — өлшемін өзгерту + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Ерекшелеу түсі +pdfjs-editor-colorpicker-button = + .title = Түсті өзгерту +pdfjs-editor-colorpicker-dropdown = + .aria-label = Түс таңдаулары +pdfjs-editor-colorpicker-yellow = + .title = Сары +pdfjs-editor-colorpicker-green = + .title = Жасыл +pdfjs-editor-colorpicker-blue = + .title = Көк +pdfjs-editor-colorpicker-pink = + .title = Қызғылт +pdfjs-editor-colorpicker-red = + .title = Қызыл + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Барлығын көрсету +pdfjs-editor-highlight-show-all-button = + .title = Барлығын көрсету + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Балама мәтінді өңдеу (сурет сипаттамасы) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Балама мәтінді қосу (сурет сипаттамасы) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Сипаттамаңызды осында жазыңыз… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Суретті көре алмайтын адамдар үшін немесе сурет жүктелмеген кезіне арналған қысқаша сипаттама. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Бұл балама мәтін автоматты түрде жасалды және дәлсіз болуы мүмкін. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Көбірек білу +pdfjs-editor-new-alt-text-create-automatically-button-label = Балама мәтінді автоматты түрде жасау +pdfjs-editor-new-alt-text-not-now-button = Қазір емес +pdfjs-editor-new-alt-text-error-title = Балама мәтінді автоматты түрде жасау мүмкін болмады +pdfjs-editor-new-alt-text-error-description = Өзіңіздің балама мәтініңізді жазыңыз немесе кейінірек қайталап көріңіз. +pdfjs-editor-new-alt-text-error-close-button = Жабу +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Балама мәтін үшін ЖИ моделі жүктеп алынуда ({ $downloadedSize }/{ $totalSize } МБ) + .aria-valuetext = Балама мәтін үшін ЖИ моделі жүктеп алынуда ({ $downloadedSize }/{ $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Балама мәтін қосылды +pdfjs-editor-new-alt-text-added-button-label = Балама мәтін қосылды +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Балама мәтін жоқ +pdfjs-editor-new-alt-text-missing-button-label = Балама мәтін жоқ +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Балама мәтінге пікір қалдыру +pdfjs-editor-new-alt-text-to-review-button-label = Балама мәтінге пікір қалдыру +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Автоматты түрде жасалды: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Суреттің балама мәтінінің баптаулары +pdfjs-image-alt-text-settings-button-label = Суреттің балама мәтінінің баптаулары +pdfjs-editor-alt-text-settings-dialog-label = Суреттің балама мәтінінің баптаулары +pdfjs-editor-alt-text-settings-automatic-title = Автоматты балама мәтін +pdfjs-editor-alt-text-settings-create-model-button-label = Балама мәтінді автоматты түрде жасау +pdfjs-editor-alt-text-settings-create-model-description = Суретті көре алмайтын адамдар үшін немесе сурет жүктелмеген кезіне арналған сипаттамаларды ұсынады. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Баламалы мәтіннің ЖИ моделі ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Деректеріңіз жеке болып қалуы үшін құрылғыңызда жергілікті түрде жұмыс істейді. Автоматты балама мәтін үшін қажет. +pdfjs-editor-alt-text-settings-delete-model-button = Өшіру +pdfjs-editor-alt-text-settings-download-model-button = Жүктеп алу +pdfjs-editor-alt-text-settings-downloading-model-button = Жүктеліп алынуда… +pdfjs-editor-alt-text-settings-editor-title = Баламалы мәтін редакторы +pdfjs-editor-alt-text-settings-show-dialog-button-label = Суретті қосқанда балама мәтін редакторын бірден көрсету +pdfjs-editor-alt-text-settings-show-dialog-description = Барлық суреттерде балама мәтін бар екеніне көз жеткізуге көмектеседі. +pdfjs-editor-alt-text-settings-close-button = Жабу + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Ерекшелеу өшірілді +pdfjs-editor-undo-bar-message-freetext = Мәтін өшірілді +pdfjs-editor-undo-bar-message-ink = Сызба өшірілді +pdfjs-editor-undo-bar-message-stamp = Сурет өшірілді +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } анимация өшірілді + *[other] { $count } анимация өшірілді + } +pdfjs-editor-undo-bar-undo-button = + .title = Болдырмау +pdfjs-editor-undo-bar-undo-button-label = Болдырмау +pdfjs-editor-undo-bar-close-button = + .title = Жабу +pdfjs-editor-undo-bar-close-button-label = Жабу diff --git a/public/pdfjs/web/locale/km/viewer.ftl b/public/pdfjs/web/locale/km/viewer.ftl new file mode 100644 index 0000000..6efd105 --- /dev/null +++ b/public/pdfjs/web/locale/km/viewer.ftl @@ -0,0 +1,223 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = ទំព័រ​មុន +pdfjs-previous-button-label = មុន +pdfjs-next-button = + .title = ទំព័រ​បន្ទាប់ +pdfjs-next-button-label = បន្ទាប់ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ទំព័រ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = នៃ { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } នៃ { $pagesCount }) +pdfjs-zoom-out-button = + .title = ​បង្រួម +pdfjs-zoom-out-button-label = ​បង្រួម +pdfjs-zoom-in-button = + .title = ​ពង្រីក +pdfjs-zoom-in-button-label = ​ពង្រីក +pdfjs-zoom-select = + .title = ពង្រីក +pdfjs-presentation-mode-button = + .title = ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ +pdfjs-presentation-mode-button-label = របៀប​បទ​បង្ហាញ +pdfjs-open-file-button = + .title = បើក​ឯកសារ +pdfjs-open-file-button-label = បើក +pdfjs-print-button = + .title = បោះពុម្ព +pdfjs-print-button-label = បោះពុម្ព + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ឧបករណ៍ +pdfjs-tools-button-label = ឧបករណ៍ +pdfjs-first-page-button = + .title = ទៅកាន់​ទំព័រ​ដំបូង​ +pdfjs-first-page-button-label = ទៅកាន់​ទំព័រ​ដំបូង​ +pdfjs-last-page-button = + .title = ទៅកាន់​ទំព័រ​ចុងក្រោយ​ +pdfjs-last-page-button-label = ទៅកាន់​ទំព័រ​ចុងក្រោយ +pdfjs-page-rotate-cw-button = + .title = បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +pdfjs-page-rotate-cw-button-label = បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +pdfjs-page-rotate-ccw-button = + .title = បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ +pdfjs-page-rotate-ccw-button-label = បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ +pdfjs-cursor-text-select-tool-button = + .title = បើក​ឧបករណ៍​ជ្រើស​អត្ថបទ +pdfjs-cursor-text-select-tool-button-label = ឧបករណ៍​ជ្រើស​អត្ថបទ +pdfjs-cursor-hand-tool-button = + .title = បើក​ឧបករណ៍​ដៃ +pdfjs-cursor-hand-tool-button-label = ឧបករណ៍​ដៃ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = លក្ខណ​សម្បត្តិ​ឯកសារ… +pdfjs-document-properties-button-label = លក្ខណ​សម្បត្តិ​ឯកសារ… +pdfjs-document-properties-file-name = ឈ្មោះ​ឯកសារ៖ +pdfjs-document-properties-file-size = ទំហំ​ឯកសារ៖ +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } បៃ) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } បៃ) +pdfjs-document-properties-title = ចំណងជើង៖ +pdfjs-document-properties-author = អ្នក​និពន្ធ៖ +pdfjs-document-properties-subject = ប្រធានបទ៖ +pdfjs-document-properties-keywords = ពាក្យ​គន្លឹះ៖ +pdfjs-document-properties-creation-date = កាលបរិច្ឆេទ​បង្កើត៖ +pdfjs-document-properties-modification-date = កាលបរិច្ឆេទ​កែប្រែ៖ +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = អ្នក​បង្កើត៖ +pdfjs-document-properties-producer = កម្មវិធី​បង្កើត PDF ៖ +pdfjs-document-properties-version = កំណែ PDF ៖ +pdfjs-document-properties-page-count = ចំនួន​ទំព័រ៖ +pdfjs-document-properties-page-size-unit-inches = អ៊ីញ +pdfjs-document-properties-page-size-unit-millimeters = មម +pdfjs-document-properties-page-size-orientation-portrait = បញ្ឈរ +pdfjs-document-properties-page-size-orientation-landscape = ផ្តេក +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = សំបុត្រ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = បាទ/ចាស +pdfjs-document-properties-linearized-no = ទេ +pdfjs-document-properties-close-button = បិទ + +## Print + +pdfjs-print-progress-message = កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = បោះបង់ +pdfjs-printing-not-supported = ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។ +pdfjs-printing-not-ready = ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = បិទ/បើក​គ្រាប់​រំកិល +pdfjs-toggle-sidebar-button-label = បិទ/បើក​គ្រាប់​រំកិល +pdfjs-document-outline-button = + .title = បង្ហាញ​គ្រោង​ឯកសារ (ចុច​ទ្វេ​ដង​ដើម្បី​ពង្រីក/បង្រួម​ធាតុ​ទាំងអស់) +pdfjs-document-outline-button-label = គ្រោង​ឯកសារ +pdfjs-attachments-button = + .title = បង្ហាញ​ឯកសារ​ភ្ជាប់ +pdfjs-attachments-button-label = ឯកសារ​ភ្ជាប់ +pdfjs-thumbs-button = + .title = បង្ហាញ​រូបភាព​តូចៗ +pdfjs-thumbs-button-label = រួបភាព​តូចៗ +pdfjs-findbar-button = + .title = រក​នៅ​ក្នុង​ឯកសារ +pdfjs-findbar-button-label = រក + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = ទំព័រ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = រូបភាព​តូច​របស់​ទំព័រ { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = រក + .placeholder = រក​នៅ​ក្នុង​ឯកសារ... +pdfjs-find-previous-button = + .title = រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន +pdfjs-find-previous-button-label = មុន +pdfjs-find-next-button = + .title = រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់ +pdfjs-find-next-button-label = បន្ទាប់ +pdfjs-find-highlight-checkbox = បន្លិច​ទាំងអស់ +pdfjs-find-match-case-checkbox-label = ករណី​ដំណូច +pdfjs-find-reached-top = បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ +pdfjs-find-reached-bottom = បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ +pdfjs-find-not-found = រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា + +## Predefined zoom values + +pdfjs-page-scale-width = ទទឹង​ទំព័រ +pdfjs-page-scale-fit = សម​ទំព័រ +pdfjs-page-scale-auto = ពង្រីក​ស្វ័យប្រវត្តិ +pdfjs-page-scale-actual = ទំហំ​ជាក់ស្ដែង +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។ +pdfjs-invalid-file-error = ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។ +pdfjs-missing-file-error = បាត់​ឯកសារ PDF +pdfjs-unexpected-response-error = ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។ +pdfjs-rendering-error = មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។ + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } ចំណារ​ពន្យល់] + +## Password + +pdfjs-password-label = បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។ +pdfjs-password-invalid = ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។ +pdfjs-password-ok-button = យល់​ព្រម +pdfjs-password-cancel-button = បោះបង់ +pdfjs-web-fonts-disabled = បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។ + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/kn/viewer.ftl b/public/pdfjs/web/locale/kn/viewer.ftl new file mode 100644 index 0000000..0332255 --- /dev/null +++ b/public/pdfjs/web/locale/kn/viewer.ftl @@ -0,0 +1,213 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = ಹಿಂದಿನ ಪುಟ +pdfjs-previous-button-label = ಹಿಂದಿನ +pdfjs-next-button = + .title = ಮುಂದಿನ ಪುಟ +pdfjs-next-button-label = ಮುಂದಿನ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ಪುಟ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } ರಲ್ಲಿ +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } ರಲ್ಲಿ { $pageNumber }) +pdfjs-zoom-out-button = + .title = ಕಿರಿದಾಗಿಸು +pdfjs-zoom-out-button-label = ಕಿರಿದಾಗಿಸಿ +pdfjs-zoom-in-button = + .title = ಹಿರಿದಾಗಿಸು +pdfjs-zoom-in-button-label = ಹಿರಿದಾಗಿಸಿ +pdfjs-zoom-select = + .title = ಗಾತ್ರಬದಲಿಸು +pdfjs-presentation-mode-button = + .title = ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು +pdfjs-presentation-mode-button-label = ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ +pdfjs-open-file-button = + .title = ಕಡತವನ್ನು ತೆರೆ +pdfjs-open-file-button-label = ತೆರೆಯಿರಿ +pdfjs-print-button = + .title = ಮುದ್ರಿಸು +pdfjs-print-button-label = ಮುದ್ರಿಸಿ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ಉಪಕರಣಗಳು +pdfjs-tools-button-label = ಉಪಕರಣಗಳು +pdfjs-first-page-button = + .title = ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +pdfjs-first-page-button-label = ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +pdfjs-last-page-button = + .title = ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +pdfjs-last-page-button-label = ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +pdfjs-page-rotate-cw-button = + .title = ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +pdfjs-page-rotate-cw-button-label = ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +pdfjs-page-rotate-ccw-button = + .title = ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +pdfjs-page-rotate-ccw-button-label = ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +pdfjs-cursor-text-select-tool-button = + .title = ಪಠ್ಯ ಆಯ್ಕೆ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ +pdfjs-cursor-text-select-tool-button-label = ಪಠ್ಯ ಆಯ್ಕೆಯ ಉಪಕರಣ +pdfjs-cursor-hand-tool-button = + .title = ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ +pdfjs-cursor-hand-tool-button-label = ಕೈ ಉಪಕರಣ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... +pdfjs-document-properties-button-label = ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... +pdfjs-document-properties-file-name = ಕಡತದ ಹೆಸರು: +pdfjs-document-properties-file-size = ಕಡತದ ಗಾತ್ರ: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ಬೈಟ್‍ಗಳು) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ಬೈಟ್‍ಗಳು) +pdfjs-document-properties-title = ಶೀರ್ಷಿಕೆ: +pdfjs-document-properties-author = ಕರ್ತೃ: +pdfjs-document-properties-subject = ವಿಷಯ: +pdfjs-document-properties-keywords = ಮುಖ್ಯಪದಗಳು: +pdfjs-document-properties-creation-date = ರಚಿಸಿದ ದಿನಾಂಕ: +pdfjs-document-properties-modification-date = ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = ರಚಿಸಿದವರು: +pdfjs-document-properties-producer = PDF ಉತ್ಪಾದಕ: +pdfjs-document-properties-version = PDF ಆವೃತ್ತಿ: +pdfjs-document-properties-page-count = ಪುಟದ ಎಣಿಕೆ: +pdfjs-document-properties-page-size-unit-inches = ಇದರಲ್ಲಿ +pdfjs-document-properties-page-size-orientation-portrait = ಭಾವಚಿತ್ರ +pdfjs-document-properties-page-size-orientation-landscape = ಪ್ರಕೃತಿ ಚಿತ್ರ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = ಮುಚ್ಚು + +## Print + +pdfjs-print-progress-message = ಮುದ್ರಿಸುವುದಕ್ಕಾಗಿ ದಸ್ತಾವೇಜನ್ನು ಸಿದ್ಧಗೊಳಿಸಲಾಗುತ್ತಿದೆ… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ರದ್ದು ಮಾಡು +pdfjs-printing-not-supported = ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ. +pdfjs-printing-not-ready = ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು +pdfjs-toggle-sidebar-button-label = ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು +pdfjs-document-outline-button-label = ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ +pdfjs-attachments-button = + .title = ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು +pdfjs-attachments-button-label = ಲಗತ್ತುಗಳು +pdfjs-thumbs-button = + .title = ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು +pdfjs-thumbs-button-label = ಚಿಕ್ಕಚಿತ್ರಗಳು +pdfjs-findbar-button = + .title = ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು +pdfjs-findbar-button-label = ಹುಡುಕು + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = ಪುಟ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ಹುಡುಕು + .placeholder = ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು… +pdfjs-find-previous-button = + .title = ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು +pdfjs-find-previous-button-label = ಹಿಂದಿನ +pdfjs-find-next-button = + .title = ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು +pdfjs-find-next-button-label = ಮುಂದಿನ +pdfjs-find-highlight-checkbox = ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು +pdfjs-find-match-case-checkbox-label = ಕೇಸನ್ನು ಹೊಂದಿಸು +pdfjs-find-reached-top = ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು +pdfjs-find-reached-bottom = ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು +pdfjs-find-not-found = ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ + +## Predefined zoom values + +pdfjs-page-scale-width = ಪುಟದ ಅಗಲ +pdfjs-page-scale-fit = ಪುಟದ ಸರಿಹೊಂದಿಕೆ +pdfjs-page-scale-auto = ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ +pdfjs-page-scale-actual = ನಿಜವಾದ ಗಾತ್ರ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. +pdfjs-invalid-file-error = ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ. +pdfjs-missing-file-error = PDF ಕಡತ ಇಲ್ಲ. +pdfjs-unexpected-response-error = ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ. +pdfjs-rendering-error = ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } ಟಿಪ್ಪಣಿ] + +## Password + +pdfjs-password-label = PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ. +pdfjs-password-invalid = ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = ರದ್ದು ಮಾಡು +pdfjs-web-fonts-disabled = ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ko/viewer.ftl b/public/pdfjs/web/locale/ko/viewer.ftl new file mode 100644 index 0000000..a321a11 --- /dev/null +++ b/public/pdfjs/web/locale/ko/viewer.ftl @@ -0,0 +1,503 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = 이전 페이지 +pdfjs-previous-button-label = 이전 +pdfjs-next-button = + .title = 다음 페이지 +pdfjs-next-button-label = 다음 +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = 페이지 +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = 축소 +pdfjs-zoom-out-button-label = 축소 +pdfjs-zoom-in-button = + .title = 확대 +pdfjs-zoom-in-button-label = 확대 +pdfjs-zoom-select = + .title = 확대/축소 +pdfjs-presentation-mode-button = + .title = 프레젠테이션 모드로 전환 +pdfjs-presentation-mode-button-label = 프레젠테이션 모드 +pdfjs-open-file-button = + .title = 파일 열기 +pdfjs-open-file-button-label = 열기 +pdfjs-print-button = + .title = 인쇄 +pdfjs-print-button-label = 인쇄 +pdfjs-save-button = + .title = 저장 +pdfjs-save-button-label = 저장 +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = 다운로드 +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = 다운로드 +pdfjs-bookmark-button = + .title = 현재 페이지 (현재 페이지에서 URL 보기) +pdfjs-bookmark-button-label = 현재 페이지 + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = 도구 +pdfjs-tools-button-label = 도구 +pdfjs-first-page-button = + .title = 첫 페이지로 이동 +pdfjs-first-page-button-label = 첫 페이지로 이동 +pdfjs-last-page-button = + .title = 마지막 페이지로 이동 +pdfjs-last-page-button-label = 마지막 페이지로 이동 +pdfjs-page-rotate-cw-button = + .title = 시계방향으로 회전 +pdfjs-page-rotate-cw-button-label = 시계방향으로 회전 +pdfjs-page-rotate-ccw-button = + .title = 시계 반대방향으로 회전 +pdfjs-page-rotate-ccw-button-label = 시계 반대방향으로 회전 +pdfjs-cursor-text-select-tool-button = + .title = 텍스트 선택 도구 활성화 +pdfjs-cursor-text-select-tool-button-label = 텍스트 선택 도구 +pdfjs-cursor-hand-tool-button = + .title = 손 도구 활성화 +pdfjs-cursor-hand-tool-button-label = 손 도구 +pdfjs-scroll-page-button = + .title = 페이지 스크롤 사용 +pdfjs-scroll-page-button-label = 페이지 스크롤 +pdfjs-scroll-vertical-button = + .title = 세로 스크롤 사용 +pdfjs-scroll-vertical-button-label = 세로 스크롤 +pdfjs-scroll-horizontal-button = + .title = 가로 스크롤 사용 +pdfjs-scroll-horizontal-button-label = 가로 스크롤 +pdfjs-scroll-wrapped-button = + .title = 래핑(자동 줄 바꿈) 스크롤 사용 +pdfjs-scroll-wrapped-button-label = 래핑 스크롤 +pdfjs-spread-none-button = + .title = 한 페이지 보기 +pdfjs-spread-none-button-label = 펼침 없음 +pdfjs-spread-odd-button = + .title = 홀수 페이지로 시작하는 두 페이지 보기 +pdfjs-spread-odd-button-label = 홀수 펼침 +pdfjs-spread-even-button = + .title = 짝수 페이지로 시작하는 두 페이지 보기 +pdfjs-spread-even-button-label = 짝수 펼침 + +## Document properties dialog + +pdfjs-document-properties-button = + .title = 문서 속성… +pdfjs-document-properties-button-label = 문서 속성… +pdfjs-document-properties-file-name = 파일 이름: +pdfjs-document-properties-file-size = 파일 크기: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 바이트) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 바이트) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b }바이트) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b }바이트) +pdfjs-document-properties-title = 제목: +pdfjs-document-properties-author = 작성자: +pdfjs-document-properties-subject = 주제: +pdfjs-document-properties-keywords = 키워드: +pdfjs-document-properties-creation-date = 작성 날짜: +pdfjs-document-properties-modification-date = 수정 날짜: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = 작성 프로그램: +pdfjs-document-properties-producer = PDF 변환 소프트웨어: +pdfjs-document-properties-version = PDF 버전: +pdfjs-document-properties-page-count = 페이지 수: +pdfjs-document-properties-page-size = 페이지 크기: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = 세로 방향 +pdfjs-document-properties-page-size-orientation-landscape = 가로 방향 +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = 레터 +pdfjs-document-properties-page-size-name-legal = 리걸 + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = 빠른 웹 보기: +pdfjs-document-properties-linearized-yes = 예 +pdfjs-document-properties-linearized-no = 아니요 +pdfjs-document-properties-close-button = 닫기 + +## Print + +pdfjs-print-progress-message = 인쇄 문서 준비 중… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = 취소 +pdfjs-printing-not-supported = 경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다. +pdfjs-printing-not-ready = 경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = 사이드바 표시/숨기기 +pdfjs-toggle-sidebar-notification-button = + .title = 사이드바 표시/숨기기 (문서에 아웃라인/첨부파일/레이어 포함됨) +pdfjs-toggle-sidebar-button-label = 사이드바 표시/숨기기 +pdfjs-document-outline-button = + .title = 문서 아웃라인 보기 (더블 클릭해서 모든 항목 펼치기/접기) +pdfjs-document-outline-button-label = 문서 아웃라인 +pdfjs-attachments-button = + .title = 첨부파일 보기 +pdfjs-attachments-button-label = 첨부파일 +pdfjs-layers-button = + .title = 레이어 보기 (더블 클릭해서 모든 레이어를 기본 상태로 재설정) +pdfjs-layers-button-label = 레이어 +pdfjs-thumbs-button = + .title = 미리보기 +pdfjs-thumbs-button-label = 미리보기 +pdfjs-current-outline-item-button = + .title = 현재 아웃라인 항목 찾기 +pdfjs-current-outline-item-button-label = 현재 아웃라인 항목 +pdfjs-findbar-button = + .title = 검색 +pdfjs-findbar-button-label = 검색 +pdfjs-additional-layers = 추가 레이어 + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } 페이지 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } 페이지 미리보기 + +## Find panel button title and messages + +pdfjs-find-input = + .title = 찾기 + .placeholder = 문서에서 찾기… +pdfjs-find-previous-button = + .title = 지정 문자열에 일치하는 1개 부분을 검색 +pdfjs-find-previous-button-label = 이전 +pdfjs-find-next-button = + .title = 지정 문자열에 일치하는 다음 부분을 검색 +pdfjs-find-next-button-label = 다음 +pdfjs-find-highlight-checkbox = 모두 강조 표시 +pdfjs-find-match-case-checkbox-label = 대/소문자 구분 +pdfjs-find-match-diacritics-checkbox-label = 분음 부호 일치 +pdfjs-find-entire-word-checkbox-label = 단어 단위로 +pdfjs-find-reached-top = 문서 처음까지 검색하고 끝으로 돌아와 검색했습니다. +pdfjs-find-reached-bottom = 문서 끝까지 검색하고 앞으로 돌아와 검색했습니다. +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = { $current } / { $total } 일치 +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = { $limit }개 이상 일치 +pdfjs-find-not-found = 검색 결과 없음 + +## Predefined zoom values + +pdfjs-page-scale-width = 페이지 너비에 맞추기 +pdfjs-page-scale-fit = 페이지에 맞추기 +pdfjs-page-scale-auto = 자동 +pdfjs-page-scale-actual = 실제 크기 +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page } 페이지 + +## Loading indicator messages + +pdfjs-loading-error = PDF를 로드하는 동안 오류가 발생했습니다. +pdfjs-invalid-file-error = 잘못되었거나 손상된 PDF 파일. +pdfjs-missing-file-error = PDF 파일 없음. +pdfjs-unexpected-response-error = 예기치 않은 서버 응답입니다. +pdfjs-rendering-error = 페이지를 렌더링하는 동안 오류가 발생했습니다. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } 주석] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = 이 PDF 파일을 열 수 있는 비밀번호를 입력하세요. +pdfjs-password-invalid = 잘못된 비밀번호입니다. 다시 시도하세요. +pdfjs-password-ok-button = 확인 +pdfjs-password-cancel-button = 취소 +pdfjs-web-fonts-disabled = 웹 폰트가 비활성화됨: 내장된 PDF 글꼴을 사용할 수 없습니다. + +## Editing + +pdfjs-editor-free-text-button = + .title = 텍스트 +pdfjs-editor-free-text-button-label = 텍스트 +pdfjs-editor-ink-button = + .title = 그리기 +pdfjs-editor-ink-button-label = 그리기 +pdfjs-editor-stamp-button = + .title = 이미지 추가 또는 편집 +pdfjs-editor-stamp-button-label = 이미지 추가 또는 편집 +pdfjs-editor-highlight-button = + .title = 강조 표시 +pdfjs-editor-highlight-button-label = 강조 표시 +pdfjs-highlight-floating-button1 = + .title = 강조 표시 + .aria-label = 강조 표시 +pdfjs-highlight-floating-button-label = 강조 표시 + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = 그리기 제거 +pdfjs-editor-remove-freetext-button = + .title = 텍스트 제거 +pdfjs-editor-remove-stamp-button = + .title = 이미지 제거 +pdfjs-editor-remove-highlight-button = + .title = 강조 표시 제거 + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = 색상 +pdfjs-editor-free-text-size-input = 크기 +pdfjs-editor-ink-color-input = 색상 +pdfjs-editor-ink-thickness-input = 두께 +pdfjs-editor-ink-opacity-input = 불투명도 +pdfjs-editor-stamp-add-image-button = + .title = 이미지 추가 +pdfjs-editor-stamp-add-image-button-label = 이미지 추가 +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = 두께 +pdfjs-editor-free-highlight-thickness-title = + .title = 텍스트 이외의 항목을 강조 표시할 때 두께 변경 +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = 텍스트 편집기 + .default-content = 입력을 시작하세요… +pdfjs-free-text = + .aria-label = 텍스트 편집기 +pdfjs-free-text-default-content = 입력하세요… +pdfjs-ink = + .aria-label = 그리기 편집기 +pdfjs-ink-canvas = + .aria-label = 사용자 생성 이미지 + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = 대체 텍스트 +pdfjs-editor-alt-text-edit-button = + .aria-label = 대체 텍스트 편집 +pdfjs-editor-alt-text-edit-button-label = 대체 텍스트 편집 +pdfjs-editor-alt-text-dialog-label = 옵션을 선택하세요 +pdfjs-editor-alt-text-dialog-description = 대체 텍스트는 사람들이 이미지를 볼 수 없거나 이미지가 로드되지 않을 때 도움이 됩니다. +pdfjs-editor-alt-text-add-description-label = 설명 추가 +pdfjs-editor-alt-text-add-description-description = 주제, 설정, 동작을 설명하는 1~2개의 문장을 목표로 하세요. +pdfjs-editor-alt-text-mark-decorative-label = 장식용으로 표시 +pdfjs-editor-alt-text-mark-decorative-description = 테두리나 워터마크와 같은 장식적인 이미지에 사용됩니다. +pdfjs-editor-alt-text-cancel-button = 취소 +pdfjs-editor-alt-text-save-button = 저장 +pdfjs-editor-alt-text-decorative-tooltip = 장식용으로 표시됨 +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = 예를 들어, “한 청년이 식탁에 앉아 식사를 하고 있습니다.” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 대체 텍스트 + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = 왼쪽 위 — 크기 조정 +pdfjs-editor-resizer-label-top-middle = 가운데 위 - 크기 조정 +pdfjs-editor-resizer-label-top-right = 오른쪽 위 — 크기 조정 +pdfjs-editor-resizer-label-middle-right = 오른쪽 가운데 — 크기 조정 +pdfjs-editor-resizer-label-bottom-right = 오른쪽 아래 - 크기 조정 +pdfjs-editor-resizer-label-bottom-middle = 가운데 아래 — 크기 조정 +pdfjs-editor-resizer-label-bottom-left = 왼쪽 아래 - 크기 조정 +pdfjs-editor-resizer-label-middle-left = 왼쪽 가운데 — 크기 조정 +pdfjs-editor-resizer-top-left = + .aria-label = 왼쪽 위 — 크기 조정 +pdfjs-editor-resizer-top-middle = + .aria-label = 가운데 위 - 크기 조정 +pdfjs-editor-resizer-top-right = + .aria-label = 오른쪽 위 — 크기 조정 +pdfjs-editor-resizer-middle-right = + .aria-label = 오른쪽 가운데 — 크기 조정 +pdfjs-editor-resizer-bottom-right = + .aria-label = 오른쪽 아래 - 크기 조정 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 가운데 아래 — 크기 조정 +pdfjs-editor-resizer-bottom-left = + .aria-label = 왼쪽 아래 - 크기 조정 +pdfjs-editor-resizer-middle-left = + .aria-label = 왼쪽 가운데 — 크기 조정 + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = 색상 +pdfjs-editor-colorpicker-button = + .title = 색상 변경 +pdfjs-editor-colorpicker-dropdown = + .aria-label = 색상 선택 +pdfjs-editor-colorpicker-yellow = + .title = 노란색 +pdfjs-editor-colorpicker-green = + .title = 녹색 +pdfjs-editor-colorpicker-blue = + .title = 파란색 +pdfjs-editor-colorpicker-pink = + .title = 분홍색 +pdfjs-editor-colorpicker-red = + .title = 빨간색 + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = 모두 보기 +pdfjs-editor-highlight-show-all-button = + .title = 모두 보기 + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 대체 텍스트 (이미지 설명) 편집 +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 대체 텍스트 (이미지 설명) 추가 +pdfjs-editor-new-alt-text-textarea = + .placeholder = 여기에 설명을 작성하세요… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 이미지가 보이지 않거나 이미지가 로딩되지 않는 경우를 위한 간단한 설명입니다. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = 이 대체 텍스트는 자동으로 생성되었으므로 정확하지 않을 수 있습니다. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 더 알아보기 +pdfjs-editor-new-alt-text-create-automatically-button-label = 자동으로 대체 텍스트 생성 +pdfjs-editor-new-alt-text-not-now-button = 나중에 +pdfjs-editor-new-alt-text-error-title = 대체 텍스트를 자동으로 생성할 수 없습니다. +pdfjs-editor-new-alt-text-error-description = 대체 텍스트를 직접 작성하거나 나중에 다시 시도하세요. +pdfjs-editor-new-alt-text-error-close-button = 닫기 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 대체 텍스트 AI 모델 다운로드 중 ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = 대체 텍스트 AI 모델 다운로드 중 ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 대체 텍스트 추가됨 +pdfjs-editor-new-alt-text-added-button-label = 대체 텍스트 추가됨 +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 대체 텍스트 누락 +pdfjs-editor-new-alt-text-missing-button-label = 대체 텍스트 누락 +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 대체 텍스트 검토 +pdfjs-editor-new-alt-text-to-review-button-label = 대체 텍스트 검토 +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 자동으로 생성됨: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 이미지 대체 텍스트 설정 +pdfjs-image-alt-text-settings-button-label = 이미지 대체 텍스트 설정 +pdfjs-editor-alt-text-settings-dialog-label = 이미지 대체 텍스트 설정 +pdfjs-editor-alt-text-settings-automatic-title = 자동 대체 텍스트 +pdfjs-editor-alt-text-settings-create-model-button-label = 자동으로 대체 텍스트 생성 +pdfjs-editor-alt-text-settings-create-model-description = 이미지가 보이지 않거나 이미지가 로딩되지 않을 때 도움이 되는 설명을 제안합니다. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 대체 텍스트 AI 모델 ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = 사용자의 장치에서 로컬로 실행되므로 데이터가 비공개로 유지됩니다. 자동 대체 텍스트에 필요합니다. +pdfjs-editor-alt-text-settings-delete-model-button = 삭제 +pdfjs-editor-alt-text-settings-download-model-button = 다운로드 +pdfjs-editor-alt-text-settings-downloading-model-button = 다운로드 중… +pdfjs-editor-alt-text-settings-editor-title = 대체 텍스트 편집기 +pdfjs-editor-alt-text-settings-show-dialog-button-label = 이미지 추가 시 바로 대체 텍스트 편집기 표시 +pdfjs-editor-alt-text-settings-show-dialog-description = 모든 이미지에 대체 텍스트가 있는지 확인하는 데 도움이 됩니다. +pdfjs-editor-alt-text-settings-close-button = 닫기 + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 강조 표시 제거됨 +pdfjs-editor-undo-bar-message-freetext = 텍스트 제거됨 +pdfjs-editor-undo-bar-message-ink = 그리기 제거됨 +pdfjs-editor-undo-bar-message-stamp = 이미지 제거됨 +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = 주석 { $count }개 제거됨 +pdfjs-editor-undo-bar-undo-button = + .title = 실행 취소 +pdfjs-editor-undo-bar-undo-button-label = 실행 취소 +pdfjs-editor-undo-bar-close-button = + .title = 닫기 +pdfjs-editor-undo-bar-close-button-label = 닫기 diff --git a/public/pdfjs/web/locale/lij/viewer.ftl b/public/pdfjs/web/locale/lij/viewer.ftl new file mode 100644 index 0000000..b2941f9 --- /dev/null +++ b/public/pdfjs/web/locale/lij/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagina primma +pdfjs-previous-button-label = Precedente +pdfjs-next-button = + .title = Pagina dòppo +pdfjs-next-button-label = Pròscima +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Diminoisci zoom +pdfjs-zoom-out-button-label = Diminoisci zoom +pdfjs-zoom-in-button = + .title = Aomenta zoom +pdfjs-zoom-in-button-label = Aomenta zoom +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Vanni into mòddo de prezentaçion +pdfjs-presentation-mode-button-label = Mòddo de prezentaçion +pdfjs-open-file-button = + .title = Arvi file +pdfjs-open-file-button-label = Arvi +pdfjs-print-button = + .title = Stanpa +pdfjs-print-button-label = Stanpa + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Atressi +pdfjs-tools-button-label = Atressi +pdfjs-first-page-button = + .title = Vanni a-a primma pagina +pdfjs-first-page-button-label = Vanni a-a primma pagina +pdfjs-last-page-button = + .title = Vanni a l'urtima pagina +pdfjs-last-page-button-label = Vanni a l'urtima pagina +pdfjs-page-rotate-cw-button = + .title = Gia into verso oraio +pdfjs-page-rotate-cw-button-label = Gia into verso oraio +pdfjs-page-rotate-ccw-button = + .title = Gia into verso antioraio +pdfjs-page-rotate-ccw-button-label = Gia into verso antioraio +pdfjs-cursor-text-select-tool-button = + .title = Abilita strumento de seleçion do testo +pdfjs-cursor-text-select-tool-button-label = Strumento de seleçion do testo +pdfjs-cursor-hand-tool-button = + .title = Abilita strumento man +pdfjs-cursor-hand-tool-button-label = Strumento man +pdfjs-scroll-vertical-button = + .title = Deuvia rebelamento verticale +pdfjs-scroll-vertical-button-label = Rebelamento verticale +pdfjs-scroll-horizontal-button = + .title = Deuvia rebelamento orizontâ +pdfjs-scroll-horizontal-button-label = Rebelamento orizontâ +pdfjs-scroll-wrapped-button = + .title = Deuvia rebelamento incapsolou +pdfjs-scroll-wrapped-button-label = Rebelamento incapsolou +pdfjs-spread-none-button = + .title = No unite a-a difuxon de pagina +pdfjs-spread-none-button-label = No difuxon +pdfjs-spread-odd-button = + .title = Uniscite a-a difuxon de pagina co-o numero dèspa +pdfjs-spread-odd-button-label = Difuxon dèspa +pdfjs-spread-even-button = + .title = Uniscite a-a difuxon de pagina co-o numero pari +pdfjs-spread-even-button-label = Difuxon pari + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propietæ do documento… +pdfjs-document-properties-button-label = Propietæ do documento… +pdfjs-document-properties-file-name = Nomme schedaio: +pdfjs-document-properties-file-size = Dimenscion schedaio: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +pdfjs-document-properties-title = Titolo: +pdfjs-document-properties-author = Aoto: +pdfjs-document-properties-subject = Ogetto: +pdfjs-document-properties-keywords = Paròlle ciave: +pdfjs-document-properties-creation-date = Dæta creaçion: +pdfjs-document-properties-modification-date = Dæta cangiamento: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Aotô originale: +pdfjs-document-properties-producer = Produtô PDF: +pdfjs-document-properties-version = Verscion PDF: +pdfjs-document-properties-page-count = Contezzo pagine: +pdfjs-document-properties-page-size = Dimenscion da pagina: +pdfjs-document-properties-page-size-unit-inches = dii gròsci +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = drito +pdfjs-document-properties-page-size-orientation-landscape = desteizo +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letia +pdfjs-document-properties-page-size-name-legal = Lezze + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista veloce do Web: +pdfjs-document-properties-linearized-yes = Sci +pdfjs-document-properties-linearized-no = No +pdfjs-document-properties-close-button = Særa + +## Print + +pdfjs-print-progress-message = Praparo o documento pe-a stanpa… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Anulla +pdfjs-printing-not-supported = Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô. +pdfjs-printing-not-ready = Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Ativa/dizativa bara de scianco +pdfjs-toggle-sidebar-button-label = Ativa/dizativa bara de scianco +pdfjs-document-outline-button = + .title = Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi) +pdfjs-document-outline-button-label = Contorno do documento +pdfjs-attachments-button = + .title = Fanni vedde alegæ +pdfjs-attachments-button-label = Alegæ +pdfjs-thumbs-button = + .title = Mostra miniatue +pdfjs-thumbs-button-label = Miniatue +pdfjs-findbar-button = + .title = Treuva into documento +pdfjs-findbar-button-label = Treuva + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatua da pagina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Treuva + .placeholder = Treuva into documento… +pdfjs-find-previous-button = + .title = Treuva a ripetiçion precedente do testo da çercâ +pdfjs-find-previous-button-label = Precedente +pdfjs-find-next-button = + .title = Treuva a ripetiçion dòppo do testo da çercâ +pdfjs-find-next-button-label = Segoente +pdfjs-find-highlight-checkbox = Evidençia +pdfjs-find-match-case-checkbox-label = Maioscole/minoscole +pdfjs-find-entire-word-checkbox-label = Poula intrega +pdfjs-find-reached-top = Razonto a fin da pagina, continoa da l'iniçio +pdfjs-find-reached-bottom = Razonto l'iniçio da pagina, continoa da-a fin +pdfjs-find-not-found = Testo no trovou + +## Predefined zoom values + +pdfjs-page-scale-width = Larghessa pagina +pdfjs-page-scale-fit = Adatta a una pagina +pdfjs-page-scale-auto = Zoom aotomatico +pdfjs-page-scale-actual = Dimenscioin efetive +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = S'é verificou 'n'erô itno caregamento do PDF. +pdfjs-invalid-file-error = O schedaio PDF o l'é no valido ò aroinou. +pdfjs-missing-file-error = O schedaio PDF o no gh'é. +pdfjs-unexpected-response-error = Risposta inprevista do-u server +pdfjs-rendering-error = Gh'é stæto 'n'erô itno rendering da pagina. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotaçion: { $type }] + +## Password + +pdfjs-password-label = Dimme a paròlla segreta pe arvî sto schedaio PDF. +pdfjs-password-invalid = Paròlla segreta sbalia. Preuva torna. +pdfjs-password-ok-button = Va ben +pdfjs-password-cancel-button = Anulla +pdfjs-web-fonts-disabled = I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/lo/viewer.ftl b/public/pdfjs/web/locale/lo/viewer.ftl new file mode 100644 index 0000000..557e201 --- /dev/null +++ b/public/pdfjs/web/locale/lo/viewer.ftl @@ -0,0 +1,313 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = ຫນ້າກ່ອນຫນ້າ +pdfjs-previous-button-label = ກ່ອນຫນ້າ +pdfjs-next-button = + .title = ຫນ້າຖັດໄປ +pdfjs-next-button-label = ຖັດໄປ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ຫນ້າ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = ຈາກ { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } ຈາກ { $pagesCount }) +pdfjs-zoom-out-button = + .title = ຂະຫຍາຍອອກ +pdfjs-zoom-out-button-label = ຂະຫຍາຍອອກ +pdfjs-zoom-in-button = + .title = ຂະຫຍາຍເຂົ້າ +pdfjs-zoom-in-button-label = ຂະຫຍາຍເຂົ້າ +pdfjs-zoom-select = + .title = ຂະຫຍາຍ +pdfjs-presentation-mode-button = + .title = ສັບປ່ຽນເປັນໂຫມດການນຳສະເຫນີ +pdfjs-presentation-mode-button-label = ໂຫມດການນຳສະເຫນີ +pdfjs-open-file-button = + .title = ເປີດໄຟລ໌ +pdfjs-open-file-button-label = ເປີດ +pdfjs-print-button = + .title = ພິມ +pdfjs-print-button-label = ພິມ +pdfjs-save-button = + .title = ບັນທຶກ +pdfjs-save-button-label = ບັນທຶກ +pdfjs-bookmark-button = + .title = ໜ້າປັດຈຸບັນ (ເບິ່ງ URL ຈາກໜ້າປັດຈຸບັນ) +pdfjs-bookmark-button-label = ຫນ້າ​ປັດ​ຈຸ​ບັນ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ເຄື່ອງມື +pdfjs-tools-button-label = ເຄື່ອງມື +pdfjs-first-page-button = + .title = ໄປທີ່ຫນ້າທຳອິດ +pdfjs-first-page-button-label = ໄປທີ່ຫນ້າທຳອິດ +pdfjs-last-page-button = + .title = ໄປທີ່ຫນ້າສຸດທ້າຍ +pdfjs-last-page-button-label = ໄປທີ່ຫນ້າສຸດທ້າຍ +pdfjs-page-rotate-cw-button = + .title = ຫມູນຕາມເຂັມໂມງ +pdfjs-page-rotate-cw-button-label = ຫມູນຕາມເຂັມໂມງ +pdfjs-page-rotate-ccw-button = + .title = ຫມູນທວນເຂັມໂມງ +pdfjs-page-rotate-ccw-button-label = ຫມູນທວນເຂັມໂມງ +pdfjs-cursor-text-select-tool-button = + .title = ເປີດໃຊ້ເຄື່ອງມືການເລືອກຂໍ້ຄວາມ +pdfjs-cursor-text-select-tool-button-label = ເຄື່ອງມືເລືອກຂໍ້ຄວາມ +pdfjs-cursor-hand-tool-button = + .title = ເປີດໃຊ້ເຄື່ອງມືມື +pdfjs-cursor-hand-tool-button-label = ເຄື່ອງມືມື +pdfjs-scroll-page-button = + .title = ໃຊ້ການເລື່ອນໜ້າ +pdfjs-scroll-page-button-label = ເລື່ອນໜ້າ +pdfjs-scroll-vertical-button = + .title = ໃຊ້ການເລື່ອນແນວຕັ້ງ +pdfjs-scroll-vertical-button-label = ເລື່ອນແນວຕັ້ງ +pdfjs-scroll-horizontal-button = + .title = ໃຊ້ການເລື່ອນແນວນອນ +pdfjs-scroll-horizontal-button-label = ເລື່ອນແນວນອນ +pdfjs-scroll-wrapped-button = + .title = ໃຊ້ Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = ບໍ່ຕ້ອງຮ່ວມການແຜ່ກະຈາຍຫນ້າ +pdfjs-spread-none-button-label = ບໍ່ມີການແຜ່ກະຈາຍ +pdfjs-spread-odd-button = + .title = ເຂົ້າຮ່ວມການແຜ່ກະຈາຍຫນ້າເລີ່ມຕົ້ນດ້ວຍຫນ້າເລກຄີກ +pdfjs-spread-odd-button-label = ການແຜ່ກະຈາຍຄີກ +pdfjs-spread-even-button = + .title = ເຂົ້າຮ່ວມການແຜ່ກະຈາຍຂອງຫນ້າເລີ່ມຕົ້ນດ້ວຍຫນ້າເລກຄູ່ +pdfjs-spread-even-button-label = ການແຜ່ກະຈາຍຄູ່ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = ຄຸນສົມບັດເອກະສານ... +pdfjs-document-properties-button-label = ຄຸນສົມບັດເອກະສານ... +pdfjs-document-properties-file-name = ຊື່ໄຟລ໌: +pdfjs-document-properties-file-size = ຂະຫນາດໄຟລ໌: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ໄບຕ໌) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ໄບຕ໌) +pdfjs-document-properties-title = ຫົວຂໍ້: +pdfjs-document-properties-author = ຜູ້ຂຽນ: +pdfjs-document-properties-subject = ຫົວຂໍ້: +pdfjs-document-properties-keywords = ຄໍາທີ່ຕ້ອງການຄົ້ນຫາ: +pdfjs-document-properties-creation-date = ວັນທີສ້າງ: +pdfjs-document-properties-modification-date = ວັນທີແກ້ໄຂ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = ຜູ້ສ້າງ: +pdfjs-document-properties-producer = ຜູ້ຜະລິດ PDF: +pdfjs-document-properties-version = ເວີຊັ່ນ PDF: +pdfjs-document-properties-page-count = ຈຳນວນໜ້າ: +pdfjs-document-properties-page-size = ຂະໜາດໜ້າ: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = ລວງຕັ້ງ +pdfjs-document-properties-page-size-orientation-landscape = ລວງນອນ +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = ຈົດໝາຍ +pdfjs-document-properties-page-size-name-legal = ຂໍ້ກົດຫມາຍ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = ມຸມມອງເວັບທີ່ໄວ: +pdfjs-document-properties-linearized-yes = ແມ່ນ +pdfjs-document-properties-linearized-no = ບໍ່ +pdfjs-document-properties-close-button = ປິດ + +## Print + +pdfjs-print-progress-message = ກຳລັງກະກຽມເອກະສານສຳລັບການພິມ... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ຍົກເລີກ +pdfjs-printing-not-supported = ຄຳເຕືອນ: ບຼາວເຊີນີ້ບໍ່ຮອງຮັບການພິມຢ່າງເຕັມທີ່. +pdfjs-printing-not-ready = ຄໍາ​ເຕືອນ​: PDF ບໍ່​ໄດ້​ຖືກ​ໂຫຼດ​ຢ່າງ​ເຕັມ​ທີ່​ສໍາ​ລັບ​ການ​ພິມ​. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = ເປີດ/ປິດແຖບຂ້າງ +pdfjs-toggle-sidebar-notification-button = + .title = ສະຫຼັບແຖບດ້ານຂ້າງ (ເອກະສານປະກອບມີໂຄງຮ່າງ/ໄຟລ໌ແນບ/ຊັ້ນຂໍ້ມູນ) +pdfjs-toggle-sidebar-button-label = ເປີດ/ປິດແຖບຂ້າງ +pdfjs-document-outline-button = + .title = ສະ​ແດງ​ໂຄງ​ຮ່າງ​ເອ​ກະ​ສານ (ກົດ​ສອງ​ຄັ້ງ​ເພື່ອ​ຂະ​ຫຍາຍ / ຫຍໍ້​ລາຍ​ການ​ທັງ​ຫມົດ​) +pdfjs-document-outline-button-label = ເຄົ້າຮ່າງເອກະສານ +pdfjs-attachments-button = + .title = ສະແດງໄຟລ໌ແນບ +pdfjs-attachments-button-label = ໄຟລ໌ແນບ +pdfjs-layers-button = + .title = ສະແດງຊັ້ນຂໍ້ມູນ (ຄລິກສອງເທື່ອເພື່ອຣີເຊັດຊັ້ນຂໍ້ມູນທັງໝົດໃຫ້ເປັນສະຖານະເລີ່ມຕົ້ນ) +pdfjs-layers-button-label = ຊັ້ນ +pdfjs-thumbs-button = + .title = ສະແດງຮູບຫຍໍ້ +pdfjs-thumbs-button-label = ຮູບຕົວຢ່າງ +pdfjs-current-outline-item-button = + .title = ຊອກຫາລາຍການໂຄງຮ່າງປະຈຸບັນ +pdfjs-current-outline-item-button-label = ລາຍການໂຄງຮ່າງປະຈຸບັນ +pdfjs-findbar-button = + .title = ຊອກຫາໃນເອກະສານ +pdfjs-findbar-button-label = ຄົ້ນຫາ +pdfjs-additional-layers = ຊັ້ນຂໍ້ມູນເພີ່ມເຕີມ + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = ໜ້າ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = ຮູບຕົວຢ່າງຂອງໜ້າ { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ຄົ້ນຫາ + .placeholder = ຊອກຫາໃນເອກະສານ... +pdfjs-find-previous-button = + .title = ຊອກຫາການປະກົດຕົວທີ່ຜ່ານມາຂອງປະໂຫຍກ +pdfjs-find-previous-button-label = ກ່ອນຫນ້ານີ້ +pdfjs-find-next-button = + .title = ຊອກຫາຕຳແຫນ່ງຖັດໄປຂອງວະລີ +pdfjs-find-next-button-label = ຕໍ່ໄປ +pdfjs-find-highlight-checkbox = ໄຮໄລທ໌ທັງຫມົດ +pdfjs-find-match-case-checkbox-label = ກໍລະນີທີ່ກົງກັນ +pdfjs-find-match-diacritics-checkbox-label = ເຄື່ອງໝາຍກຳກັບການອອກສຽງກົງກັນ +pdfjs-find-entire-word-checkbox-label = ກົງກັນທຸກຄຳ +pdfjs-find-reached-top = ມາຮອດເທິງຂອງເອກະສານ, ສືບຕໍ່ຈາກລຸ່ມ +pdfjs-find-reached-bottom = ຮອດຕອນທ້າຍຂອງເອກະສານ, ສືບຕໍ່ຈາກເທິງ +pdfjs-find-not-found = ບໍ່ພົບວະລີທີ່ຕ້ອງການ + +## Predefined zoom values + +pdfjs-page-scale-width = ຄວາມກວ້າງໜ້າ +pdfjs-page-scale-fit = ໜ້າພໍດີ +pdfjs-page-scale-auto = ຊູມອັດຕະໂນມັດ +pdfjs-page-scale-actual = ຂະໜາດຕົວຈິງ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = ໜ້າ { $page } + +## Loading indicator messages + +pdfjs-loading-error = ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງໂຫລດ PDF. +pdfjs-invalid-file-error = ໄຟລ໌ PDF ບໍ່ຖືກຕ້ອງຫລືເສຍຫາຍ. +pdfjs-missing-file-error = ບໍ່ມີໄຟລ໌ PDF. +pdfjs-unexpected-response-error = ການຕອບສະໜອງຂອງເຊີບເວີທີ່ບໍ່ຄາດຄິດ. +pdfjs-rendering-error = ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງເຣັນເດີຫນ້າ. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } ຄຳບັນຍາຍ] + +## Password + +pdfjs-password-label = ໃສ່ລະຫັດຜ່ານເພື່ອເປີດໄຟລ໌ PDF ນີ້. +pdfjs-password-invalid = ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ. ກະລຸນາລອງອີກຄັ້ງ. +pdfjs-password-ok-button = ຕົກລົງ +pdfjs-password-cancel-button = ຍົກເລີກ +pdfjs-web-fonts-disabled = ຟອນເວັບຖືກປິດໃຊ້ງານ: ບໍ່ສາມາດໃຊ້ຟອນ PDF ທີ່ຝັງໄວ້ໄດ້. + +## Editing + +pdfjs-editor-free-text-button = + .title = ຂໍ້ຄວາມ +pdfjs-editor-free-text-button-label = ຂໍ້ຄວາມ +pdfjs-editor-ink-button = + .title = ແຕ້ມ +pdfjs-editor-ink-button-label = ແຕ້ມ + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = ສີ +pdfjs-editor-free-text-size-input = ຂະຫນາດ +pdfjs-editor-ink-color-input = ສີ +pdfjs-editor-ink-thickness-input = ຄວາມຫນາ +pdfjs-editor-ink-opacity-input = ຄວາມໂປ່ງໃສ +pdfjs-free-text = + .aria-label = ຕົວແກ້ໄຂຂໍ້ຄວາມ +pdfjs-free-text-default-content = ເລີ່ມພິມ... +pdfjs-ink = + .aria-label = ຕົວແກ້ໄຂຮູບແຕ້ມ +pdfjs-ink-canvas = + .aria-label = ຮູບພາບທີ່ຜູ້ໃຊ້ສ້າງ + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/locale.json b/public/pdfjs/web/locale/locale.json new file mode 100644 index 0000000..2012211 --- /dev/null +++ b/public/pdfjs/web/locale/locale.json @@ -0,0 +1 @@ +{"ach":"ach/viewer.ftl","af":"af/viewer.ftl","an":"an/viewer.ftl","ar":"ar/viewer.ftl","ast":"ast/viewer.ftl","az":"az/viewer.ftl","be":"be/viewer.ftl","bg":"bg/viewer.ftl","bn":"bn/viewer.ftl","bo":"bo/viewer.ftl","br":"br/viewer.ftl","brx":"brx/viewer.ftl","bs":"bs/viewer.ftl","ca":"ca/viewer.ftl","cak":"cak/viewer.ftl","ckb":"ckb/viewer.ftl","cs":"cs/viewer.ftl","cy":"cy/viewer.ftl","da":"da/viewer.ftl","de":"de/viewer.ftl","dsb":"dsb/viewer.ftl","el":"el/viewer.ftl","en-ca":"en-CA/viewer.ftl","en-gb":"en-GB/viewer.ftl","en-us":"en-US/viewer.ftl","eo":"eo/viewer.ftl","es-ar":"es-AR/viewer.ftl","es-cl":"es-CL/viewer.ftl","es-es":"es-ES/viewer.ftl","es-mx":"es-MX/viewer.ftl","et":"et/viewer.ftl","eu":"eu/viewer.ftl","fa":"fa/viewer.ftl","ff":"ff/viewer.ftl","fi":"fi/viewer.ftl","fr":"fr/viewer.ftl","fur":"fur/viewer.ftl","fy-nl":"fy-NL/viewer.ftl","ga-ie":"ga-IE/viewer.ftl","gd":"gd/viewer.ftl","gl":"gl/viewer.ftl","gn":"gn/viewer.ftl","gu-in":"gu-IN/viewer.ftl","he":"he/viewer.ftl","hi-in":"hi-IN/viewer.ftl","hr":"hr/viewer.ftl","hsb":"hsb/viewer.ftl","hu":"hu/viewer.ftl","hy-am":"hy-AM/viewer.ftl","hye":"hye/viewer.ftl","ia":"ia/viewer.ftl","id":"id/viewer.ftl","is":"is/viewer.ftl","it":"it/viewer.ftl","ja":"ja/viewer.ftl","ka":"ka/viewer.ftl","kab":"kab/viewer.ftl","kk":"kk/viewer.ftl","km":"km/viewer.ftl","kn":"kn/viewer.ftl","ko":"ko/viewer.ftl","lij":"lij/viewer.ftl","lo":"lo/viewer.ftl","lt":"lt/viewer.ftl","ltg":"ltg/viewer.ftl","lv":"lv/viewer.ftl","meh":"meh/viewer.ftl","mk":"mk/viewer.ftl","mr":"mr/viewer.ftl","ms":"ms/viewer.ftl","my":"my/viewer.ftl","nb-no":"nb-NO/viewer.ftl","ne-np":"ne-NP/viewer.ftl","nl":"nl/viewer.ftl","nn-no":"nn-NO/viewer.ftl","oc":"oc/viewer.ftl","pa-in":"pa-IN/viewer.ftl","pl":"pl/viewer.ftl","pt-br":"pt-BR/viewer.ftl","pt-pt":"pt-PT/viewer.ftl","rm":"rm/viewer.ftl","ro":"ro/viewer.ftl","ru":"ru/viewer.ftl","sat":"sat/viewer.ftl","sc":"sc/viewer.ftl","scn":"scn/viewer.ftl","sco":"sco/viewer.ftl","si":"si/viewer.ftl","sk":"sk/viewer.ftl","skr":"skr/viewer.ftl","sl":"sl/viewer.ftl","son":"son/viewer.ftl","sq":"sq/viewer.ftl","sr":"sr/viewer.ftl","sv-se":"sv-SE/viewer.ftl","szl":"szl/viewer.ftl","ta":"ta/viewer.ftl","te":"te/viewer.ftl","tg":"tg/viewer.ftl","th":"th/viewer.ftl","tl":"tl/viewer.ftl","tr":"tr/viewer.ftl","trs":"trs/viewer.ftl","uk":"uk/viewer.ftl","ur":"ur/viewer.ftl","uz":"uz/viewer.ftl","vi":"vi/viewer.ftl","wo":"wo/viewer.ftl","xh":"xh/viewer.ftl","zh-cn":"zh-CN/viewer.ftl","zh-tw":"zh-TW/viewer.ftl"} \ No newline at end of file diff --git a/public/pdfjs/web/locale/lt/viewer.ftl b/public/pdfjs/web/locale/lt/viewer.ftl new file mode 100644 index 0000000..a8ee7a0 --- /dev/null +++ b/public/pdfjs/web/locale/lt/viewer.ftl @@ -0,0 +1,268 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Ankstesnis puslapis +pdfjs-previous-button-label = Ankstesnis +pdfjs-next-button = + .title = Kitas puslapis +pdfjs-next-button-label = Kitas +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Puslapis +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = iš { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } iš { $pagesCount }) +pdfjs-zoom-out-button = + .title = Sumažinti +pdfjs-zoom-out-button-label = Sumažinti +pdfjs-zoom-in-button = + .title = Padidinti +pdfjs-zoom-in-button-label = Padidinti +pdfjs-zoom-select = + .title = Mastelis +pdfjs-presentation-mode-button = + .title = Pereiti į pateikties veikseną +pdfjs-presentation-mode-button-label = Pateikties veiksena +pdfjs-open-file-button = + .title = Atverti failą +pdfjs-open-file-button-label = Atverti +pdfjs-print-button = + .title = Spausdinti +pdfjs-print-button-label = Spausdinti + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Priemonės +pdfjs-tools-button-label = Priemonės +pdfjs-first-page-button = + .title = Eiti į pirmą puslapį +pdfjs-first-page-button-label = Eiti į pirmą puslapį +pdfjs-last-page-button = + .title = Eiti į paskutinį puslapį +pdfjs-last-page-button-label = Eiti į paskutinį puslapį +pdfjs-page-rotate-cw-button = + .title = Pasukti pagal laikrodžio rodyklę +pdfjs-page-rotate-cw-button-label = Pasukti pagal laikrodžio rodyklę +pdfjs-page-rotate-ccw-button = + .title = Pasukti prieš laikrodžio rodyklę +pdfjs-page-rotate-ccw-button-label = Pasukti prieš laikrodžio rodyklę +pdfjs-cursor-text-select-tool-button = + .title = Įjungti teksto žymėjimo įrankį +pdfjs-cursor-text-select-tool-button-label = Teksto žymėjimo įrankis +pdfjs-cursor-hand-tool-button = + .title = Įjungti vilkimo įrankį +pdfjs-cursor-hand-tool-button-label = Vilkimo įrankis +pdfjs-scroll-page-button = + .title = Naudoti puslapio slinkimą +pdfjs-scroll-page-button-label = Puslapio slinkimas +pdfjs-scroll-vertical-button = + .title = Naudoti vertikalų slinkimą +pdfjs-scroll-vertical-button-label = Vertikalus slinkimas +pdfjs-scroll-horizontal-button = + .title = Naudoti horizontalų slinkimą +pdfjs-scroll-horizontal-button-label = Horizontalus slinkimas +pdfjs-scroll-wrapped-button = + .title = Naudoti išklotą slinkimą +pdfjs-scroll-wrapped-button-label = Išklotas slinkimas +pdfjs-spread-none-button = + .title = Nejungti puslapių į dvilapius +pdfjs-spread-none-button-label = Be dvilapių +pdfjs-spread-odd-button = + .title = Sujungti į dvilapius pradedant nelyginiais puslapiais +pdfjs-spread-odd-button-label = Nelyginiai dvilapiai +pdfjs-spread-even-button = + .title = Sujungti į dvilapius pradedant lyginiais puslapiais +pdfjs-spread-even-button-label = Lyginiai dvilapiai + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumento savybės… +pdfjs-document-properties-button-label = Dokumento savybės… +pdfjs-document-properties-file-name = Failo vardas: +pdfjs-document-properties-file-size = Failo dydis: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) +pdfjs-document-properties-title = Antraštė: +pdfjs-document-properties-author = Autorius: +pdfjs-document-properties-subject = Tema: +pdfjs-document-properties-keywords = Reikšminiai žodžiai: +pdfjs-document-properties-creation-date = Sukūrimo data: +pdfjs-document-properties-modification-date = Modifikavimo data: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Kūrėjas: +pdfjs-document-properties-producer = PDF generatorius: +pdfjs-document-properties-version = PDF versija: +pdfjs-document-properties-page-count = Puslapių skaičius: +pdfjs-document-properties-page-size = Puslapio dydis: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = stačias +pdfjs-document-properties-page-size-orientation-landscape = gulsčias +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Laiškas +pdfjs-document-properties-page-size-name-legal = Dokumentas + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Spartus žiniatinklio rodinys: +pdfjs-document-properties-linearized-yes = Taip +pdfjs-document-properties-linearized-no = Ne +pdfjs-document-properties-close-button = Užverti + +## Print + +pdfjs-print-progress-message = Dokumentas ruošiamas spausdinimui… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Atsisakyti +pdfjs-printing-not-supported = Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas. +pdfjs-printing-not-ready = Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Rodyti / slėpti šoninį polangį +pdfjs-toggle-sidebar-notification-button = + .title = Parankinė (dokumentas turi struktūrą / priedų / sluoksnių) +pdfjs-toggle-sidebar-button-label = Šoninis polangis +pdfjs-document-outline-button = + .title = Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus elementus) +pdfjs-document-outline-button-label = Dokumento struktūra +pdfjs-attachments-button = + .title = Rodyti priedus +pdfjs-attachments-button-label = Priedai +pdfjs-layers-button = + .title = Rodyti sluoksnius (spustelėkite dukart, norėdami atstatyti visus sluoksnius į numatytąją būseną) +pdfjs-layers-button-label = Sluoksniai +pdfjs-thumbs-button = + .title = Rodyti puslapių miniatiūras +pdfjs-thumbs-button-label = Miniatiūros +pdfjs-current-outline-item-button = + .title = Rasti dabartinį struktūros elementą +pdfjs-current-outline-item-button-label = Dabartinis struktūros elementas +pdfjs-findbar-button = + .title = Ieškoti dokumente +pdfjs-findbar-button-label = Rasti +pdfjs-additional-layers = Papildomi sluoksniai + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } puslapis +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } puslapio miniatiūra + +## Find panel button title and messages + +pdfjs-find-input = + .title = Rasti + .placeholder = Rasti dokumente… +pdfjs-find-previous-button = + .title = Ieškoti ankstesnio frazės egzemplioriaus +pdfjs-find-previous-button-label = Ankstesnis +pdfjs-find-next-button = + .title = Ieškoti tolesnio frazės egzemplioriaus +pdfjs-find-next-button-label = Tolesnis +pdfjs-find-highlight-checkbox = Viską paryškinti +pdfjs-find-match-case-checkbox-label = Skirti didžiąsias ir mažąsias raides +pdfjs-find-match-diacritics-checkbox-label = Skirti diakritinius ženklus +pdfjs-find-entire-word-checkbox-label = Ištisi žodžiai +pdfjs-find-reached-top = Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos +pdfjs-find-reached-bottom = Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios +pdfjs-find-not-found = Ieškoma frazė nerasta + +## Predefined zoom values + +pdfjs-page-scale-width = Priderinti prie lapo pločio +pdfjs-page-scale-fit = Pritaikyti prie lapo dydžio +pdfjs-page-scale-auto = Automatinis mastelis +pdfjs-page-scale-actual = Tikras dydis +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page } puslapis + +## Loading indicator messages + +pdfjs-loading-error = Įkeliant PDF failą įvyko klaida. +pdfjs-invalid-file-error = Tai nėra PDF failas arba jis yra sugadintas. +pdfjs-missing-file-error = PDF failas nerastas. +pdfjs-unexpected-response-error = Netikėtas serverio atsakas. +pdfjs-rendering-error = Atvaizduojant puslapį įvyko klaida. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [„{ $type }“ tipo anotacija] + +## Password + +pdfjs-password-label = Įveskite slaptažodį šiam PDF failui atverti. +pdfjs-password-invalid = Slaptažodis neteisingas. Bandykite dar kartą. +pdfjs-password-ok-button = Gerai +pdfjs-password-cancel-button = Atsisakyti +pdfjs-web-fonts-disabled = Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ltg/viewer.ftl b/public/pdfjs/web/locale/ltg/viewer.ftl new file mode 100644 index 0000000..d262165 --- /dev/null +++ b/public/pdfjs/web/locale/ltg/viewer.ftl @@ -0,0 +1,246 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Īprīkšejā lopa +pdfjs-previous-button-label = Īprīkšejā +pdfjs-next-button = + .title = Nuokomuo lopa +pdfjs-next-button-label = Nuokomuo +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Lopa +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = nu { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } nu { $pagesCount }) +pdfjs-zoom-out-button = + .title = Attuolynuot +pdfjs-zoom-out-button-label = Attuolynuot +pdfjs-zoom-in-button = + .title = Pītuvynuot +pdfjs-zoom-in-button-label = Pītuvynuot +pdfjs-zoom-select = + .title = Palelynuojums +pdfjs-presentation-mode-button = + .title = Puorslēgtīs iz Prezentacejis režymu +pdfjs-presentation-mode-button-label = Prezentacejis režyms +pdfjs-open-file-button = + .title = Attaiseit failu +pdfjs-open-file-button-label = Attaiseit +pdfjs-print-button = + .title = Drukuošona +pdfjs-print-button-label = Drukōt + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Reiki +pdfjs-tools-button-label = Reiki +pdfjs-first-page-button = + .title = Īt iz pyrmū lopu +pdfjs-first-page-button-label = Īt iz pyrmū lopu +pdfjs-last-page-button = + .title = Īt iz piedejū lopu +pdfjs-last-page-button-label = Īt iz piedejū lopu +pdfjs-page-rotate-cw-button = + .title = Pagrīzt pa pulksteni +pdfjs-page-rotate-cw-button-label = Pagrīzt pa pulksteni +pdfjs-page-rotate-ccw-button = + .title = Pagrīzt pret pulksteni +pdfjs-page-rotate-ccw-button-label = Pagrīzt pret pulksteni +pdfjs-cursor-text-select-tool-button = + .title = Aktivizēt teksta izvieles reiku +pdfjs-cursor-text-select-tool-button-label = Teksta izvieles reiks +pdfjs-cursor-hand-tool-button = + .title = Aktivēt rūkys reiku +pdfjs-cursor-hand-tool-button-label = Rūkys reiks +pdfjs-scroll-vertical-button = + .title = Izmontōt vertikalū ritinōšonu +pdfjs-scroll-vertical-button-label = Vertikalō ritinōšona +pdfjs-scroll-horizontal-button = + .title = Izmontōt horizontalū ritinōšonu +pdfjs-scroll-horizontal-button-label = Horizontalō ritinōšona +pdfjs-scroll-wrapped-button = + .title = Izmontōt mārūgojamū ritinōšonu +pdfjs-scroll-wrapped-button-label = Mārūgojamō ritinōšona +pdfjs-spread-none-button = + .title = Naizmontōt lopu atvāruma režimu +pdfjs-spread-none-button-label = Bez atvārumim +pdfjs-spread-odd-button = + .title = Izmontōt lopu atvārumus sōkut nu napōra numeru lopom +pdfjs-spread-odd-button-label = Napōra lopys pa kreisi +pdfjs-spread-even-button = + .title = Izmontōt lopu atvārumus sōkut nu pōra numeru lopom +pdfjs-spread-even-button-label = Pōra lopys pa kreisi + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumenta īstatiejumi… +pdfjs-document-properties-button-label = Dokumenta īstatiejumi… +pdfjs-document-properties-file-name = Faila nūsaukums: +pdfjs-document-properties-file-size = Faila izmārs: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } biti) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } biti) +pdfjs-document-properties-title = Nūsaukums: +pdfjs-document-properties-author = Autors: +pdfjs-document-properties-subject = Tema: +pdfjs-document-properties-keywords = Atslāgi vuordi: +pdfjs-document-properties-creation-date = Izveides datums: +pdfjs-document-properties-modification-date = lobuošonys datums: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Radeituojs: +pdfjs-document-properties-producer = PDF producents: +pdfjs-document-properties-version = PDF verseja: +pdfjs-document-properties-page-count = Lopu skaits: +pdfjs-document-properties-page-size = Lopas izmārs: +pdfjs-document-properties-page-size-unit-inches = collas +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portreta orientaceja +pdfjs-document-properties-page-size-orientation-landscape = ainovys orientaceja +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Jā +pdfjs-document-properties-linearized-no = Nā +pdfjs-document-properties-close-button = Aiztaiseit + +## Print + +pdfjs-print-progress-message = Preparing document for printing… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Atceļt +pdfjs-printing-not-supported = Uzmaneibu: Drukuošona nu itei puorlūka dorbojās tikai daleji. +pdfjs-printing-not-ready = Uzmaneibu: PDF nav pilneibā īluodeits drukuošonai. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Puorslēgt suonu jūslu +pdfjs-toggle-sidebar-button-label = Puorslēgt suonu jūslu +pdfjs-document-outline-button = + .title = Show Document Outline (double-click to expand/collapse all items) +pdfjs-document-outline-button-label = Dokumenta saturs +pdfjs-attachments-button = + .title = Show Attachments +pdfjs-attachments-button-label = Attachments +pdfjs-thumbs-button = + .title = Paruodeit seiktālus +pdfjs-thumbs-button-label = Seiktāli +pdfjs-findbar-button = + .title = Mekleit dokumentā +pdfjs-findbar-button-label = Mekleit + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Lopa { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Lopys { $page } seiktāls + +## Find panel button title and messages + +pdfjs-find-input = + .title = Mekleit + .placeholder = Mekleit dokumentā… +pdfjs-find-previous-button = + .title = Atrast īprīkšejū +pdfjs-find-previous-button-label = Īprīkšejā +pdfjs-find-next-button = + .title = Atrast nuokamū +pdfjs-find-next-button-label = Nuokomuo +pdfjs-find-highlight-checkbox = Īkruosuot vysys +pdfjs-find-match-case-checkbox-label = Lelū, mozū burtu jiuteigs +pdfjs-find-reached-top = Sasnīgts dokumenta suokums, turpynojom nu beigom +pdfjs-find-reached-bottom = Sasnīgtys dokumenta beigys, turpynojom nu suokuma +pdfjs-find-not-found = Frāze nav atrosta + +## Predefined zoom values + +pdfjs-page-scale-width = Lopys plotumā +pdfjs-page-scale-fit = Ītylpynūt lopu +pdfjs-page-scale-auto = Automatiskais izmārs +pdfjs-page-scale-actual = Patīsais izmārs +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Īluodejūt PDF nūtyka klaida. +pdfjs-invalid-file-error = Nadereigs voi būjuots PDF fails. +pdfjs-missing-file-error = PDF fails nav atrosts. +pdfjs-unexpected-response-error = Unexpected server response. +pdfjs-rendering-error = Attālojūt lopu rodās klaida + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = Īvodit paroli, kab attaiseitu PDF failu. +pdfjs-password-invalid = Napareiza parole, raugit vēļreiz. +pdfjs-password-ok-button = Labi +pdfjs-password-cancel-button = Atceļt +pdfjs-web-fonts-disabled = Šķārsteikla fonti nav aktivizāti: Navar īgult PDF fontus. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/lv/viewer.ftl b/public/pdfjs/web/locale/lv/viewer.ftl new file mode 100644 index 0000000..067dc10 --- /dev/null +++ b/public/pdfjs/web/locale/lv/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Iepriekšējā lapa +pdfjs-previous-button-label = Iepriekšējā +pdfjs-next-button = + .title = Nākamā lapa +pdfjs-next-button-label = Nākamā +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Lapa +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = no { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } no { $pagesCount }) +pdfjs-zoom-out-button = + .title = Attālināt +pdfjs-zoom-out-button-label = Attālināt +pdfjs-zoom-in-button = + .title = Pietuvināt +pdfjs-zoom-in-button-label = Pietuvināt +pdfjs-zoom-select = + .title = Palielinājums +pdfjs-presentation-mode-button = + .title = Pārslēgties uz Prezentācijas režīmu +pdfjs-presentation-mode-button-label = Prezentācijas režīms +pdfjs-open-file-button = + .title = Atvērt failu +pdfjs-open-file-button-label = Atvērt +pdfjs-print-button = + .title = Drukāšana +pdfjs-print-button-label = Drukāt + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Rīki +pdfjs-tools-button-label = Rīki +pdfjs-first-page-button = + .title = Iet uz pirmo lapu +pdfjs-first-page-button-label = Iet uz pirmo lapu +pdfjs-last-page-button = + .title = Iet uz pēdējo lapu +pdfjs-last-page-button-label = Iet uz pēdējo lapu +pdfjs-page-rotate-cw-button = + .title = Pagriezt pa pulksteni +pdfjs-page-rotate-cw-button-label = Pagriezt pa pulksteni +pdfjs-page-rotate-ccw-button = + .title = Pagriezt pret pulksteni +pdfjs-page-rotate-ccw-button-label = Pagriezt pret pulksteni +pdfjs-cursor-text-select-tool-button = + .title = Aktivizēt teksta izvēles rīku +pdfjs-cursor-text-select-tool-button-label = Teksta izvēles rīks +pdfjs-cursor-hand-tool-button = + .title = Aktivēt rokas rīku +pdfjs-cursor-hand-tool-button-label = Rokas rīks +pdfjs-scroll-vertical-button = + .title = Izmantot vertikālo ritināšanu +pdfjs-scroll-vertical-button-label = Vertikālā ritināšana +pdfjs-scroll-horizontal-button = + .title = Izmantot horizontālo ritināšanu +pdfjs-scroll-horizontal-button-label = Horizontālā ritināšana +pdfjs-scroll-wrapped-button = + .title = Izmantot apkļauto ritināšanu +pdfjs-scroll-wrapped-button-label = Apkļautā ritināšana +pdfjs-spread-none-button = + .title = Nepievienoties lapu izpletumiem +pdfjs-spread-none-button-label = Neizmantot izpletumus +pdfjs-spread-odd-button = + .title = Izmantot lapu izpletumus sākot ar nepāra numuru lapām +pdfjs-spread-odd-button-label = Nepāra izpletumi +pdfjs-spread-even-button = + .title = Izmantot lapu izpletumus sākot ar pāra numuru lapām +pdfjs-spread-even-button-label = Pāra izpletumi + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumenta iestatījumi… +pdfjs-document-properties-button-label = Dokumenta iestatījumi… +pdfjs-document-properties-file-name = Faila nosaukums: +pdfjs-document-properties-file-size = Faila izmērs: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } biti) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } biti) +pdfjs-document-properties-title = Nosaukums: +pdfjs-document-properties-author = Autors: +pdfjs-document-properties-subject = Tēma: +pdfjs-document-properties-keywords = Atslēgas vārdi: +pdfjs-document-properties-creation-date = Izveides datums: +pdfjs-document-properties-modification-date = LAbošanas datums: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Radītājs: +pdfjs-document-properties-producer = PDF producents: +pdfjs-document-properties-version = PDF versija: +pdfjs-document-properties-page-count = Lapu skaits: +pdfjs-document-properties-page-size = Papīra izmērs: +pdfjs-document-properties-page-size-unit-inches = collas +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portretorientācija +pdfjs-document-properties-page-size-orientation-landscape = ainavorientācija +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Vēstule +pdfjs-document-properties-page-size-name-legal = Juridiskie teksti + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Ātrā tīmekļa skats: +pdfjs-document-properties-linearized-yes = Jā +pdfjs-document-properties-linearized-no = Nē +pdfjs-document-properties-close-button = Aizvērt + +## Print + +pdfjs-print-progress-message = Gatavo dokumentu drukāšanai... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Atcelt +pdfjs-printing-not-supported = Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji. +pdfjs-printing-not-ready = Uzmanību: PDF nav pilnībā ielādēts drukāšanai. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Pārslēgt sānu joslu +pdfjs-toggle-sidebar-button-label = Pārslēgt sānu joslu +pdfjs-document-outline-button = + .title = Rādīt dokumenta struktūru (veiciet dubultklikšķi lai izvērstu/sakļautu visus vienumus) +pdfjs-document-outline-button-label = Dokumenta saturs +pdfjs-attachments-button = + .title = Rādīt pielikumus +pdfjs-attachments-button-label = Pielikumi +pdfjs-thumbs-button = + .title = Parādīt sīktēlus +pdfjs-thumbs-button-label = Sīktēli +pdfjs-findbar-button = + .title = Meklēt dokumentā +pdfjs-findbar-button-label = Meklēt + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Lapa { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Lapas { $page } sīktēls + +## Find panel button title and messages + +pdfjs-find-input = + .title = Meklēt + .placeholder = Meklēt dokumentā… +pdfjs-find-previous-button = + .title = Atrast iepriekšējo +pdfjs-find-previous-button-label = Iepriekšējā +pdfjs-find-next-button = + .title = Atrast nākamo +pdfjs-find-next-button-label = Nākamā +pdfjs-find-highlight-checkbox = Iekrāsot visas +pdfjs-find-match-case-checkbox-label = Lielo, mazo burtu jutīgs +pdfjs-find-entire-word-checkbox-label = Veselus vārdus +pdfjs-find-reached-top = Sasniegts dokumenta sākums, turpinām no beigām +pdfjs-find-reached-bottom = Sasniegtas dokumenta beigas, turpinām no sākuma +pdfjs-find-not-found = Frāze nav atrasta + +## Predefined zoom values + +pdfjs-page-scale-width = Lapas platumā +pdfjs-page-scale-fit = Ietilpinot lapu +pdfjs-page-scale-auto = Automātiskais izmērs +pdfjs-page-scale-actual = Patiesais izmērs +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Ielādējot PDF notika kļūda. +pdfjs-invalid-file-error = Nederīgs vai bojāts PDF fails. +pdfjs-missing-file-error = PDF fails nav atrasts. +pdfjs-unexpected-response-error = Negaidīa servera atbilde. +pdfjs-rendering-error = Attēlojot lapu radās kļūda + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } anotācija] + +## Password + +pdfjs-password-label = Ievadiet paroli, lai atvērtu PDF failu. +pdfjs-password-invalid = Nepareiza parole, mēģiniet vēlreiz. +pdfjs-password-ok-button = Labi +pdfjs-password-cancel-button = Atcelt +pdfjs-web-fonts-disabled = Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/meh/viewer.ftl b/public/pdfjs/web/locale/meh/viewer.ftl new file mode 100644 index 0000000..d8bddc9 --- /dev/null +++ b/public/pdfjs/web/locale/meh/viewer.ftl @@ -0,0 +1,87 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página yata +pdfjs-zoom-select = + .title = Nasa´a ka´nu/Nasa´a luli +pdfjs-open-file-button-label = Síne + +## Secondary toolbar and context menu + + +## Document properties dialog + +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = Kuvi +pdfjs-document-properties-close-button = Nakasɨ + +## Print + +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Nkuvi-ka + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-findbar-button-label = Nánuku + +## Thumbnails panel item (tooltip and alt text for images) + + +## Find panel button title and messages + + +## Predefined zoom values + +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } + +## Password + +pdfjs-password-cancel-button = Nkuvi-ka + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/mk/viewer.ftl b/public/pdfjs/web/locale/mk/viewer.ftl new file mode 100644 index 0000000..47d24b2 --- /dev/null +++ b/public/pdfjs/web/locale/mk/viewer.ftl @@ -0,0 +1,215 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Претходна страница +pdfjs-previous-button-label = Претходна +pdfjs-next-button = + .title = Следна страница +pdfjs-next-button-label = Следна +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Страница +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = од { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } од { $pagesCount }) +pdfjs-zoom-out-button = + .title = Намалување +pdfjs-zoom-out-button-label = Намали +pdfjs-zoom-in-button = + .title = Зголемување +pdfjs-zoom-in-button-label = Зголеми +pdfjs-zoom-select = + .title = Променување на големина +pdfjs-presentation-mode-button = + .title = Премини во презентациски режим +pdfjs-presentation-mode-button-label = Презентациски режим +pdfjs-open-file-button = + .title = Отворање датотека +pdfjs-open-file-button-label = Отвори +pdfjs-print-button = + .title = Печатење +pdfjs-print-button-label = Печати + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Алатки +pdfjs-tools-button-label = Алатки +pdfjs-first-page-button = + .title = Оди до првата страница +pdfjs-first-page-button-label = Оди до првата страница +pdfjs-last-page-button = + .title = Оди до последната страница +pdfjs-last-page-button-label = Оди до последната страница +pdfjs-page-rotate-cw-button = + .title = Ротирај по стрелките на часовникот +pdfjs-page-rotate-cw-button-label = Ротирај по стрелките на часовникот +pdfjs-page-rotate-ccw-button = + .title = Ротирај спротивно од стрелките на часовникот +pdfjs-page-rotate-ccw-button-label = Ротирај спротивно од стрелките на часовникот +pdfjs-cursor-text-select-tool-button = + .title = Овозможи алатка за избор на текст +pdfjs-cursor-text-select-tool-button-label = Алатка за избор на текст + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Својства на документот… +pdfjs-document-properties-button-label = Својства на документот… +pdfjs-document-properties-file-name = Име на датотека: +pdfjs-document-properties-file-size = Големина на датотеката: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } бајти) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } бајти) +pdfjs-document-properties-title = Наслов: +pdfjs-document-properties-author = Автор: +pdfjs-document-properties-subject = Тема: +pdfjs-document-properties-keywords = Клучни зборови: +pdfjs-document-properties-creation-date = Датум на создавање: +pdfjs-document-properties-modification-date = Датум на промена: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Креатор: +pdfjs-document-properties-version = Верзија на PDF: +pdfjs-document-properties-page-count = Број на страници: +pdfjs-document-properties-page-size = Големина на страница: +pdfjs-document-properties-page-size-unit-inches = инч +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = портрет +pdfjs-document-properties-page-size-orientation-landscape = пејзаж +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Писмо + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = Да +pdfjs-document-properties-linearized-no = Не +pdfjs-document-properties-close-button = Затвори + +## Print + +pdfjs-print-progress-message = Документ се подготвува за печатење… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Откажи +pdfjs-printing-not-supported = Предупредување: Печатењето не е целосно поддржано во овој прелистувач. +pdfjs-printing-not-ready = Предупредување: PDF документот не е целосно вчитан за печатење. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Вклучи странична лента +pdfjs-toggle-sidebar-button-label = Вклучи странична лента +pdfjs-document-outline-button-label = Содржина на документот +pdfjs-attachments-button = + .title = Прикажи додатоци +pdfjs-thumbs-button = + .title = Прикажување на икони +pdfjs-thumbs-button-label = Икони +pdfjs-findbar-button = + .title = Најди во документот +pdfjs-findbar-button-label = Најди + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Страница { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Икона од страница { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Пронајди + .placeholder = Пронајди во документот… +pdfjs-find-previous-button = + .title = Најди ја предходната појава на фразата +pdfjs-find-previous-button-label = Претходно +pdfjs-find-next-button = + .title = Најди ја следната појава на фразата +pdfjs-find-next-button-label = Следно +pdfjs-find-highlight-checkbox = Означи сѐ +pdfjs-find-match-case-checkbox-label = Токму така +pdfjs-find-entire-word-checkbox-label = Цели зборови +pdfjs-find-reached-top = Барањето стигна до почетокот на документот и почнува од крајот +pdfjs-find-reached-bottom = Барањето стигна до крајот на документот и почнува од почеток +pdfjs-find-not-found = Фразата не е пронајдена + +## Predefined zoom values + +pdfjs-page-scale-width = Ширина на страница +pdfjs-page-scale-fit = Цела страница +pdfjs-page-scale-auto = Автоматска големина +pdfjs-page-scale-actual = Вистинска големина +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Настана грешка при вчитувањето на PDF-от. +pdfjs-invalid-file-error = Невалидна или корумпирана PDF датотека. +pdfjs-missing-file-error = Недостасува PDF документ. +pdfjs-unexpected-response-error = Неочекуван одговор од серверот. +pdfjs-rendering-error = Настана грешка при прикажувањето на страницата. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } + +## Password + +pdfjs-password-label = Внесете ја лозинката за да ја отворите оваа датотека. +pdfjs-password-invalid = Невалидна лозинка. Обидете се повторно. +pdfjs-password-ok-button = Во ред +pdfjs-password-cancel-button = Откажи +pdfjs-web-fonts-disabled = Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/mr/viewer.ftl b/public/pdfjs/web/locale/mr/viewer.ftl new file mode 100644 index 0000000..49948b1 --- /dev/null +++ b/public/pdfjs/web/locale/mr/viewer.ftl @@ -0,0 +1,239 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = मागील पृष्ठ +pdfjs-previous-button-label = मागील +pdfjs-next-button = + .title = पुढील पृष्ठ +pdfjs-next-button-label = पुढील +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = पृष्ठ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount }पैकी +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } पैकी { $pageNumber }) +pdfjs-zoom-out-button = + .title = छोटे करा +pdfjs-zoom-out-button-label = छोटे करा +pdfjs-zoom-in-button = + .title = मोठे करा +pdfjs-zoom-in-button-label = मोठे करा +pdfjs-zoom-select = + .title = लहान किंवा मोठे करा +pdfjs-presentation-mode-button = + .title = प्रस्तुतिकरण मोडचा वापर करा +pdfjs-presentation-mode-button-label = प्रस्तुतिकरण मोड +pdfjs-open-file-button = + .title = फाइल उघडा +pdfjs-open-file-button-label = उघडा +pdfjs-print-button = + .title = छपाई करा +pdfjs-print-button-label = छपाई करा + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = साधने +pdfjs-tools-button-label = साधने +pdfjs-first-page-button = + .title = पहिल्या पृष्ठावर जा +pdfjs-first-page-button-label = पहिल्या पृष्ठावर जा +pdfjs-last-page-button = + .title = शेवटच्या पृष्ठावर जा +pdfjs-last-page-button-label = शेवटच्या पृष्ठावर जा +pdfjs-page-rotate-cw-button = + .title = घड्याळाच्या काट्याच्या दिशेने फिरवा +pdfjs-page-rotate-cw-button-label = घड्याळाच्या काट्याच्या दिशेने फिरवा +pdfjs-page-rotate-ccw-button = + .title = घड्याळाच्या काट्याच्या उलट दिशेने फिरवा +pdfjs-page-rotate-ccw-button-label = घड्याळाच्या काट्याच्या उलट दिशेने फिरवा +pdfjs-cursor-text-select-tool-button = + .title = मजकूर निवड साधन कार्यान्वयीत करा +pdfjs-cursor-text-select-tool-button-label = मजकूर निवड साधन +pdfjs-cursor-hand-tool-button = + .title = हात साधन कार्यान्वित करा +pdfjs-cursor-hand-tool-button-label = हस्त साधन +pdfjs-scroll-vertical-button = + .title = अनुलंब स्क्रोलिंग वापरा +pdfjs-scroll-vertical-button-label = अनुलंब स्क्रोलिंग +pdfjs-scroll-horizontal-button = + .title = क्षैतिज स्क्रोलिंग वापरा +pdfjs-scroll-horizontal-button-label = क्षैतिज स्क्रोलिंग + +## Document properties dialog + +pdfjs-document-properties-button = + .title = दस्तऐवज गुणधर्म… +pdfjs-document-properties-button-label = दस्तऐवज गुणधर्म… +pdfjs-document-properties-file-name = फाइलचे नाव: +pdfjs-document-properties-file-size = फाइल आकार: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } बाइट्स) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } बाइट्स) +pdfjs-document-properties-title = शिर्षक: +pdfjs-document-properties-author = लेखक: +pdfjs-document-properties-subject = विषय: +pdfjs-document-properties-keywords = मुख्यशब्द: +pdfjs-document-properties-creation-date = निर्माण दिनांक: +pdfjs-document-properties-modification-date = दुरूस्ती दिनांक: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = निर्माता: +pdfjs-document-properties-producer = PDF निर्माता: +pdfjs-document-properties-version = PDF आवृत्ती: +pdfjs-document-properties-page-count = पृष्ठ संख्या: +pdfjs-document-properties-page-size = पृष्ठ आकार: +pdfjs-document-properties-page-size-unit-inches = इंच +pdfjs-document-properties-page-size-unit-millimeters = मीमी +pdfjs-document-properties-page-size-orientation-portrait = उभी मांडणी +pdfjs-document-properties-page-size-orientation-landscape = आडवे +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = जलद वेब दृष्य: +pdfjs-document-properties-linearized-yes = हो +pdfjs-document-properties-linearized-no = नाही +pdfjs-document-properties-close-button = बंद करा + +## Print + +pdfjs-print-progress-message = छपाई करीता पृष्ठ तयार करीत आहे… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = रद्द करा +pdfjs-printing-not-supported = सावधानता: या ब्राउझरतर्फे छपाइ पूर्णपणे समर्थीत नाही. +pdfjs-printing-not-ready = सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = बाजूचीपट्टी टॉगल करा +pdfjs-toggle-sidebar-button-label = बाजूचीपट्टी टॉगल करा +pdfjs-document-outline-button = + .title = दस्तऐवज बाह्यरेखा दर्शवा (विस्तृत करण्यासाठी दोनवेळा क्लिक करा /सर्व घटक दाखवा) +pdfjs-document-outline-button-label = दस्तऐवज रूपरेषा +pdfjs-attachments-button = + .title = जोडपत्र दाखवा +pdfjs-attachments-button-label = जोडपत्र +pdfjs-thumbs-button = + .title = थंबनेल्स् दाखवा +pdfjs-thumbs-button-label = थंबनेल्स् +pdfjs-findbar-button = + .title = दस्तऐवजात शोधा +pdfjs-findbar-button-label = शोधा + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = पृष्ठ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = पृष्ठाचे थंबनेल { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = शोधा + .placeholder = दस्तऐवजात शोधा… +pdfjs-find-previous-button = + .title = वाकप्रयोगची मागील घटना शोधा +pdfjs-find-previous-button-label = मागील +pdfjs-find-next-button = + .title = वाकप्रयोगची पुढील घटना शोधा +pdfjs-find-next-button-label = पुढील +pdfjs-find-highlight-checkbox = सर्व ठळक करा +pdfjs-find-match-case-checkbox-label = आकार जुळवा +pdfjs-find-entire-word-checkbox-label = संपूर्ण शब्द +pdfjs-find-reached-top = दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे +pdfjs-find-reached-bottom = दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे +pdfjs-find-not-found = वाकप्रयोग आढळले नाही + +## Predefined zoom values + +pdfjs-page-scale-width = पृष्ठाची रूंदी +pdfjs-page-scale-fit = पृष्ठ बसवा +pdfjs-page-scale-auto = स्वयं लाहन किंवा मोठे करणे +pdfjs-page-scale-actual = प्रत्यक्ष आकार +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF लोड करतेवेळी त्रुटी आढळली. +pdfjs-invalid-file-error = अवैध किंवा दोषीत PDF फाइल. +pdfjs-missing-file-error = न आढळणारी PDF फाइल. +pdfjs-unexpected-response-error = अनपेक्षित सर्व्हर प्रतिसाद. +pdfjs-rendering-error = पृष्ठ दाखवतेवेळी त्रुटी आढळली. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } टिपण्णी] + +## Password + +pdfjs-password-label = ही PDF फाइल उघडण्याकरिता पासवर्ड द्या. +pdfjs-password-invalid = अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा. +pdfjs-password-ok-button = ठीक आहे +pdfjs-password-cancel-button = रद्द करा +pdfjs-web-fonts-disabled = वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ms/viewer.ftl b/public/pdfjs/web/locale/ms/viewer.ftl new file mode 100644 index 0000000..11b8665 --- /dev/null +++ b/public/pdfjs/web/locale/ms/viewer.ftl @@ -0,0 +1,247 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Halaman Dahulu +pdfjs-previous-button-label = Dahulu +pdfjs-next-button = + .title = Halaman Berikut +pdfjs-next-button-label = Berikut +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Halaman +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = daripada { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } daripada { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zum Keluar +pdfjs-zoom-out-button-label = Zum Keluar +pdfjs-zoom-in-button = + .title = Zum Masuk +pdfjs-zoom-in-button-label = Zum Masuk +pdfjs-zoom-select = + .title = Zum +pdfjs-presentation-mode-button = + .title = Tukar ke Mod Persembahan +pdfjs-presentation-mode-button-label = Mod Persembahan +pdfjs-open-file-button = + .title = Buka Fail +pdfjs-open-file-button-label = Buka +pdfjs-print-button = + .title = Cetak +pdfjs-print-button-label = Cetak + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Alatan +pdfjs-tools-button-label = Alatan +pdfjs-first-page-button = + .title = Pergi ke Halaman Pertama +pdfjs-first-page-button-label = Pergi ke Halaman Pertama +pdfjs-last-page-button = + .title = Pergi ke Halaman Terakhir +pdfjs-last-page-button-label = Pergi ke Halaman Terakhir +pdfjs-page-rotate-cw-button = + .title = Berputar ikut arah Jam +pdfjs-page-rotate-cw-button-label = Berputar ikut arah Jam +pdfjs-page-rotate-ccw-button = + .title = Pusing berlawan arah jam +pdfjs-page-rotate-ccw-button-label = Pusing berlawan arah jam +pdfjs-cursor-text-select-tool-button = + .title = Dayakan Alatan Pilihan Teks +pdfjs-cursor-text-select-tool-button-label = Alatan Pilihan Teks +pdfjs-cursor-hand-tool-button = + .title = Dayakan Alatan Tangan +pdfjs-cursor-hand-tool-button-label = Alatan Tangan +pdfjs-scroll-vertical-button = + .title = Guna Skrol Menegak +pdfjs-scroll-vertical-button-label = Skrol Menegak +pdfjs-scroll-horizontal-button = + .title = Guna Skrol Mengufuk +pdfjs-scroll-horizontal-button-label = Skrol Mengufuk +pdfjs-scroll-wrapped-button = + .title = Guna Skrol Berbalut +pdfjs-scroll-wrapped-button-label = Skrol Berbalut +pdfjs-spread-none-button = + .title = Jangan hubungkan hamparan halaman +pdfjs-spread-none-button-label = Tanpa Hamparan +pdfjs-spread-odd-button = + .title = Hubungkan hamparan halaman dengan halaman nombor ganjil +pdfjs-spread-odd-button-label = Hamparan Ganjil +pdfjs-spread-even-button = + .title = Hubungkan hamparan halaman dengan halaman nombor genap +pdfjs-spread-even-button-label = Hamparan Seimbang + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Sifat Dokumen… +pdfjs-document-properties-button-label = Sifat Dokumen… +pdfjs-document-properties-file-name = Nama fail: +pdfjs-document-properties-file-size = Saiz fail: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bait) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bait) +pdfjs-document-properties-title = Tajuk: +pdfjs-document-properties-author = Pengarang: +pdfjs-document-properties-subject = Subjek: +pdfjs-document-properties-keywords = Kata kunci: +pdfjs-document-properties-creation-date = Masa Dicipta: +pdfjs-document-properties-modification-date = Tarikh Ubahsuai: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Pencipta: +pdfjs-document-properties-producer = Pengeluar PDF: +pdfjs-document-properties-version = Versi PDF: +pdfjs-document-properties-page-count = Kiraan Laman: +pdfjs-document-properties-page-size = Saiz Halaman: +pdfjs-document-properties-page-size-unit-inches = dalam +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = potret +pdfjs-document-properties-page-size-orientation-landscape = landskap +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Paparan Web Pantas: +pdfjs-document-properties-linearized-yes = Ya +pdfjs-document-properties-linearized-no = Tidak +pdfjs-document-properties-close-button = Tutup + +## Print + +pdfjs-print-progress-message = Menyediakan dokumen untuk dicetak… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Batal +pdfjs-printing-not-supported = Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini. +pdfjs-printing-not-ready = Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Togol Bar Sisi +pdfjs-toggle-sidebar-button-label = Togol Bar Sisi +pdfjs-document-outline-button = + .title = Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item) +pdfjs-document-outline-button-label = Rangka Dokumen +pdfjs-attachments-button = + .title = Papar Lampiran +pdfjs-attachments-button-label = Lampiran +pdfjs-thumbs-button = + .title = Papar Thumbnails +pdfjs-thumbs-button-label = Imej kecil +pdfjs-findbar-button = + .title = Cari didalam Dokumen +pdfjs-findbar-button-label = Cari + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Halaman { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Halaman Imej kecil { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Cari + .placeholder = Cari dalam dokumen… +pdfjs-find-previous-button = + .title = Cari teks frasa berkenaan yang terdahulu +pdfjs-find-previous-button-label = Dahulu +pdfjs-find-next-button = + .title = Cari teks frasa berkenaan yang berikut +pdfjs-find-next-button-label = Berikut +pdfjs-find-highlight-checkbox = Serlahkan semua +pdfjs-find-match-case-checkbox-label = Huruf sepadan +pdfjs-find-entire-word-checkbox-label = Seluruh perkataan +pdfjs-find-reached-top = Mencapai teratas daripada dokumen, sambungan daripada bawah +pdfjs-find-reached-bottom = Mencapai terakhir daripada dokumen, sambungan daripada atas +pdfjs-find-not-found = Frasa tidak ditemui + +## Predefined zoom values + +pdfjs-page-scale-width = Lebar Halaman +pdfjs-page-scale-fit = Muat Halaman +pdfjs-page-scale-auto = Zoom Automatik +pdfjs-page-scale-actual = Saiz Sebenar +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Masalah berlaku semasa menuatkan sebuah PDF. +pdfjs-invalid-file-error = Tidak sah atau fail PDF rosak. +pdfjs-missing-file-error = Fail PDF Hilang. +pdfjs-unexpected-response-error = Respon pelayan yang tidak dijangka. +pdfjs-rendering-error = Ralat berlaku ketika memberikan halaman. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Anotasi] + +## Password + +pdfjs-password-label = Masukan kata kunci untuk membuka fail PDF ini. +pdfjs-password-invalid = Kata laluan salah. Cuba lagi. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Batal +pdfjs-web-fonts-disabled = Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/my/viewer.ftl b/public/pdfjs/web/locale/my/viewer.ftl new file mode 100644 index 0000000..d3b973d --- /dev/null +++ b/public/pdfjs/web/locale/my/viewer.ftl @@ -0,0 +1,206 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = အရင် စာမျက်နှာ +pdfjs-previous-button-label = အရင်နေရာ +pdfjs-next-button = + .title = ရှေ့ စာမျက်နှာ +pdfjs-next-button-label = နောက်တခု +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = စာမျက်နှာ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } ၏ +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } ၏ { $pageNumber }) +pdfjs-zoom-out-button = + .title = ချုံ့ပါ +pdfjs-zoom-out-button-label = ချုံ့ပါ +pdfjs-zoom-in-button = + .title = ချဲ့ပါ +pdfjs-zoom-in-button-label = ချဲ့ပါ +pdfjs-zoom-select = + .title = ချုံ့/ချဲ့ပါ +pdfjs-presentation-mode-button = + .title = ဆွေးနွေးတင်ပြစနစ်သို့ ကူးပြောင်းပါ +pdfjs-presentation-mode-button-label = ဆွေးနွေးတင်ပြစနစ် +pdfjs-open-file-button = + .title = ဖိုင်အားဖွင့်ပါ။ +pdfjs-open-file-button-label = ဖွင့်ပါ +pdfjs-print-button = + .title = ပုံနှိုပ်ပါ +pdfjs-print-button-label = ပုံနှိုပ်ပါ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ကိရိယာများ +pdfjs-tools-button-label = ကိရိယာများ +pdfjs-first-page-button = + .title = ပထမ စာမျက်နှာသို့ +pdfjs-first-page-button-label = ပထမ စာမျက်နှာသို့ +pdfjs-last-page-button = + .title = နောက်ဆုံး စာမျက်နှာသို့ +pdfjs-last-page-button-label = နောက်ဆုံး စာမျက်နှာသို့ +pdfjs-page-rotate-cw-button = + .title = နာရီလက်တံ အတိုင်း +pdfjs-page-rotate-cw-button-label = နာရီလက်တံ အတိုင်း +pdfjs-page-rotate-ccw-button = + .title = နာရီလက်တံ ပြောင်းပြန် +pdfjs-page-rotate-ccw-button-label = နာရီလက်တံ ပြောင်းပြန် + +## Document properties dialog + +pdfjs-document-properties-button = + .title = မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ +pdfjs-document-properties-button-label = မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ +pdfjs-document-properties-file-name = ဖိုင် : +pdfjs-document-properties-file-size = ဖိုင်ဆိုဒ် : +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } ကီလိုဘိုတ် ({ $size_b }ဘိုတ်) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = ခေါင်းစဉ်‌ - +pdfjs-document-properties-author = ရေးသားသူ: +pdfjs-document-properties-subject = အကြောင်းအရာ: +pdfjs-document-properties-keywords = သော့ချက် စာလုံး: +pdfjs-document-properties-creation-date = ထုတ်လုပ်ရက်စွဲ: +pdfjs-document-properties-modification-date = ပြင်ဆင်ရက်စွဲ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = ဖန်တီးသူ: +pdfjs-document-properties-producer = PDF ထုတ်လုပ်သူ: +pdfjs-document-properties-version = PDF ဗားရှင်း: +pdfjs-document-properties-page-count = စာမျက်နှာအရေအတွက်: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = ပိတ် + +## Print + +pdfjs-print-progress-message = Preparing document for printing… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ပယ်​ဖျက်ပါ +pdfjs-printing-not-supported = သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။ +pdfjs-printing-not-ready = သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = ဘေးတန်းဖွင့်ပိတ် +pdfjs-toggle-sidebar-button-label = ဖွင့်ပိတ် ဆလိုက်ဒါ +pdfjs-document-outline-button = + .title = စာတမ်းအကျဉ်းချုပ်ကို ပြပါ (စာရင်းအားလုံးကို ချုံ့/ချဲ့ရန် ကလစ်နှစ်ချက်နှိပ်ပါ) +pdfjs-document-outline-button-label = စာတမ်းအကျဉ်းချုပ် +pdfjs-attachments-button = + .title = တွဲချက်များ ပြပါ +pdfjs-attachments-button-label = တွဲထားချက်များ +pdfjs-thumbs-button = + .title = ပုံရိပ်ငယ်များကို ပြပါ +pdfjs-thumbs-button-label = ပုံရိပ်ငယ်များ +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = ရှာဖွေပါ + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = စာမျက်နှာ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = စာမျက်နှာရဲ့ ပုံရိပ်ငယ် { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ရှာဖွေပါ + .placeholder = စာတမ်းထဲတွင် ရှာဖွေရန်… +pdfjs-find-previous-button = + .title = စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ +pdfjs-find-previous-button-label = နောက်သို့ +pdfjs-find-next-button = + .title = စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ +pdfjs-find-next-button-label = ရှေ့သို့ +pdfjs-find-highlight-checkbox = အားလုံးကို မျဉ်းသားပါ +pdfjs-find-match-case-checkbox-label = စာလုံး တိုက်ဆိုင်ပါ +pdfjs-find-reached-top = စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ +pdfjs-find-reached-bottom = စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ +pdfjs-find-not-found = စကားစု မတွေ့ရဘူး + +## Predefined zoom values + +pdfjs-page-scale-width = စာမျက်နှာ အကျယ် +pdfjs-page-scale-fit = စာမျက်နှာ ကွက်တိ +pdfjs-page-scale-auto = အလိုအလျောက် ချုံ့ချဲ့ +pdfjs-page-scale-actual = အမှန်တကယ်ရှိတဲ့ အရွယ် +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ +pdfjs-invalid-file-error = မရသော သို့ ပျက်နေသော PDF ဖိုင် +pdfjs-missing-file-error = PDF ပျောက်ဆုံး +pdfjs-unexpected-response-error = မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက် +pdfjs-rendering-error = စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } အဓိပ္ပာယ်ဖွင့်ဆိုချက်] + +## Password + +pdfjs-password-label = ယခု PDF ကို ဖွင့်ရန် စကားဝှက်ကို ရိုက်ပါ။ +pdfjs-password-invalid = စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။ +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = ပယ်​ဖျက်ပါ +pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/nb-NO/viewer.ftl b/public/pdfjs/web/locale/nb-NO/viewer.ftl new file mode 100644 index 0000000..a644157 --- /dev/null +++ b/public/pdfjs/web/locale/nb-NO/viewer.ftl @@ -0,0 +1,495 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Forrige side +pdfjs-previous-button-label = Forrige +pdfjs-next-button = + .title = Neste side +pdfjs-next-button-label = Neste +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Side +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = av { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } av { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom ut +pdfjs-zoom-out-button-label = Zoom ut +pdfjs-zoom-in-button = + .title = Zoom inn +pdfjs-zoom-in-button-label = Zoom inn +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Bytt til presentasjonsmodus +pdfjs-presentation-mode-button-label = Presentasjonsmodus +pdfjs-open-file-button = + .title = Åpne fil +pdfjs-open-file-button-label = Åpne +pdfjs-print-button = + .title = Skriv ut +pdfjs-print-button-label = Skriv ut +pdfjs-save-button = + .title = Lagre +pdfjs-save-button-label = Lagre +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Last ned +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Last ned +pdfjs-bookmark-button = + .title = Gjeldende side (se URL fra gjeldende side) +pdfjs-bookmark-button-label = Gjeldende side + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Verktøy +pdfjs-tools-button-label = Verktøy +pdfjs-first-page-button = + .title = Gå til første side +pdfjs-first-page-button-label = Gå til første side +pdfjs-last-page-button = + .title = Gå til siste side +pdfjs-last-page-button-label = Gå til siste side +pdfjs-page-rotate-cw-button = + .title = Roter med klokken +pdfjs-page-rotate-cw-button-label = Roter med klokken +pdfjs-page-rotate-ccw-button = + .title = Roter mot klokken +pdfjs-page-rotate-ccw-button-label = Roter mot klokken +pdfjs-cursor-text-select-tool-button = + .title = Aktiver tekstmarkeringsverktøy +pdfjs-cursor-text-select-tool-button-label = Tekstmarkeringsverktøy +pdfjs-cursor-hand-tool-button = + .title = Aktiver handverktøy +pdfjs-cursor-hand-tool-button-label = Handverktøy +pdfjs-scroll-page-button = + .title = Bruk siderulling +pdfjs-scroll-page-button-label = Siderulling +pdfjs-scroll-vertical-button = + .title = Bruk vertikal rulling +pdfjs-scroll-vertical-button-label = Vertikal rulling +pdfjs-scroll-horizontal-button = + .title = Bruk horisontal rulling +pdfjs-scroll-horizontal-button-label = Horisontal rulling +pdfjs-scroll-wrapped-button = + .title = Bruk flersiderulling +pdfjs-scroll-wrapped-button-label = Flersiderulling +pdfjs-spread-none-button = + .title = Vis enkeltsider +pdfjs-spread-none-button-label = Enkeltsider +pdfjs-spread-odd-button = + .title = Vis oppslag med ulike sidenumre til venstre +pdfjs-spread-odd-button-label = Oppslag med forside +pdfjs-spread-even-button = + .title = Vis oppslag med like sidenumre til venstre +pdfjs-spread-even-button-label = Oppslag uten forside + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentegenskaper … +pdfjs-document-properties-button-label = Dokumentegenskaper … +pdfjs-document-properties-file-name = Filnavn: +pdfjs-document-properties-file-size = Filstørrelse: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Dokumentegenskaper … +pdfjs-document-properties-author = Forfatter: +pdfjs-document-properties-subject = Emne: +pdfjs-document-properties-keywords = Nøkkelord: +pdfjs-document-properties-creation-date = Opprettet dato: +pdfjs-document-properties-modification-date = Endret dato: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Opprettet av: +pdfjs-document-properties-producer = PDF-verktøy: +pdfjs-document-properties-version = PDF-versjon: +pdfjs-document-properties-page-count = Sideantall: +pdfjs-document-properties-page-size = Sidestørrelse: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = stående +pdfjs-document-properties-page-size-orientation-landscape = liggende +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Hurtig nettvisning: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nei +pdfjs-document-properties-close-button = Lukk + +## Print + +pdfjs-print-progress-message = Forbereder dokument for utskrift … +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Avbryt +pdfjs-printing-not-supported = Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren. +pdfjs-printing-not-ready = Advarsel: PDF er ikke fullstendig innlastet for utskrift. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Slå av/på sidestolpe +pdfjs-toggle-sidebar-notification-button = + .title = Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg/lag) +pdfjs-toggle-sidebar-button-label = Slå av/på sidestolpe +pdfjs-document-outline-button = + .title = Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer) +pdfjs-document-outline-button-label = Dokumentdisposisjon +pdfjs-attachments-button = + .title = Vis vedlegg +pdfjs-attachments-button-label = Vedlegg +pdfjs-layers-button = + .title = Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand) +pdfjs-layers-button-label = Lag +pdfjs-thumbs-button = + .title = Vis miniatyrbilde +pdfjs-thumbs-button-label = Miniatyrbilde +pdfjs-current-outline-item-button = + .title = Finn gjeldende disposisjonselement +pdfjs-current-outline-item-button-label = Gjeldende disposisjonselement +pdfjs-findbar-button = + .title = Finn i dokumentet +pdfjs-findbar-button-label = Finn +pdfjs-additional-layers = Ytterligere lag + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatyrbilde av side { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Søk + .placeholder = Søk i dokument… +pdfjs-find-previous-button = + .title = Finn forrige forekomst av frasen +pdfjs-find-previous-button-label = Forrige +pdfjs-find-next-button = + .title = Finn neste forekomst av frasen +pdfjs-find-next-button-label = Neste +pdfjs-find-highlight-checkbox = Uthev alle +pdfjs-find-match-case-checkbox-label = Skill store/små bokstaver +pdfjs-find-match-diacritics-checkbox-label = Samsvar diakritiske tegn +pdfjs-find-entire-word-checkbox-label = Hele ord +pdfjs-find-reached-top = Nådde toppen av dokumentet, fortsetter fra bunnen +pdfjs-find-reached-bottom = Nådde bunnen av dokumentet, fortsetter fra toppen +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } av { $total } treff + *[other] { $current } av { $total } treff + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mer enn { $limit } treff + *[other] Mer enn { $limit } treff + } +pdfjs-find-not-found = Fant ikke teksten + +## Predefined zoom values + +pdfjs-page-scale-width = Sidebredde +pdfjs-page-scale-fit = Tilpass til siden +pdfjs-page-scale-auto = Automatisk zoom +pdfjs-page-scale-actual = Virkelig størrelse +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Side { $page } + +## Loading indicator messages + +pdfjs-loading-error = En feil oppstod ved lasting av PDF. +pdfjs-invalid-file-error = Ugyldig eller skadet PDF-fil. +pdfjs-missing-file-error = Manglende PDF-fil. +pdfjs-unexpected-response-error = Uventet serverrespons. +pdfjs-rendering-error = En feil oppstod ved opptegning av siden. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } annotasjon] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Skriv inn passordet for å åpne denne PDF-filen. +pdfjs-password-invalid = Ugyldig passord. Prøv igjen. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Avbryt +pdfjs-web-fonts-disabled = Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Tegn +pdfjs-editor-ink-button-label = Tegn +pdfjs-editor-stamp-button = + .title = Legg til eller rediger bilder +pdfjs-editor-stamp-button-label = Legg til eller rediger bilder +pdfjs-editor-highlight-button = + .title = Markere +pdfjs-editor-highlight-button-label = Markere +pdfjs-highlight-floating-button1 = + .title = Markere + .aria-label = Markere +pdfjs-highlight-floating-button-label = Markere + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Fjern tegningen +pdfjs-editor-remove-freetext-button = + .title = Fjern tekst +pdfjs-editor-remove-stamp-button = + .title = Fjern bildet +pdfjs-editor-remove-highlight-button = + .title = Fjern utheving + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Farge +pdfjs-editor-free-text-size-input = Størrelse +pdfjs-editor-ink-color-input = Farge +pdfjs-editor-ink-thickness-input = Tykkelse +pdfjs-editor-ink-opacity-input = Ugjennomsiktighet +pdfjs-editor-stamp-add-image-button = + .title = Legg til bilde +pdfjs-editor-stamp-add-image-button-label = Legg til bilde +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tykkelse +pdfjs-editor-free-highlight-thickness-title = + .title = Endre tykkelse når du markerer andre elementer enn tekst +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstredigering + .default-content = Begynn å skrive… +pdfjs-free-text = + .aria-label = Tekstredigering +pdfjs-free-text-default-content = Begynn å skrive… +pdfjs-ink = + .aria-label = Tegneredigering +pdfjs-ink-canvas = + .aria-label = Brukerskapt bilde + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alt-tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger alt-tekst +pdfjs-editor-alt-text-edit-button-label = Rediger alt-tekst tekst +pdfjs-editor-alt-text-dialog-label = Velg et alternativ +pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper når folk ikke kan se bildet eller når det ikke lastes inn. +pdfjs-editor-alt-text-add-description-label = Legg til en beskrivelse +pdfjs-editor-alt-text-add-description-description = Gå etter 1-2 setninger som beskriver emnet, settingen eller handlingene. +pdfjs-editor-alt-text-mark-decorative-label = Merk som dekorativt +pdfjs-editor-alt-text-mark-decorative-description = Dette brukes til dekorative bilder, som kantlinjer eller vannmerker. +pdfjs-editor-alt-text-cancel-button = Avbryt +pdfjs-editor-alt-text-save-button = Lagre +pdfjs-editor-alt-text-decorative-tooltip = Merket som dekorativ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = For eksempel, «En ung mann setter seg ved et bord for å spise et måltid» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt-tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Øverste venstre hjørne – endre størrelse +pdfjs-editor-resizer-label-top-middle = Øverst i midten — endre størrelse +pdfjs-editor-resizer-label-top-right = Øverste høyre hjørne – endre størrelse +pdfjs-editor-resizer-label-middle-right = Midt til høyre – endre størrelse +pdfjs-editor-resizer-label-bottom-right = Nederste høyre hjørne – endre størrelse +pdfjs-editor-resizer-label-bottom-middle = Nederst i midten — endre størrelse +pdfjs-editor-resizer-label-bottom-left = Nederste venstre hjørne – endre størrelse +pdfjs-editor-resizer-label-middle-left = Midt til venstre — endre størrelse +pdfjs-editor-resizer-top-left = + .aria-label = Øverste venstre hjørne – endre størrelse +pdfjs-editor-resizer-top-middle = + .aria-label = Øverst i midten — endre størrelse +pdfjs-editor-resizer-top-right = + .aria-label = Øverste høyre hjørne – endre størrelse +pdfjs-editor-resizer-middle-right = + .aria-label = Midt til høyre – endre størrelse +pdfjs-editor-resizer-bottom-right = + .aria-label = Nederste høyre hjørne – endre størrelse +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nederst i midten — endre størrelse +pdfjs-editor-resizer-bottom-left = + .aria-label = Nederste venstre hjørne – endre størrelse +pdfjs-editor-resizer-middle-left = + .aria-label = Midt til venstre — endre størrelse + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Uthevingsfarge +pdfjs-editor-colorpicker-button = + .title = Endre farge +pdfjs-editor-colorpicker-dropdown = + .aria-label = Fargevalg +pdfjs-editor-colorpicker-yellow = + .title = Gul +pdfjs-editor-colorpicker-green = + .title = Grønn +pdfjs-editor-colorpicker-blue = + .title = Blå +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Rød + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (bildebeskrivelse) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Legg til alternativ tekst (bildebeskrivelse) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv din beskrivelse her… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort beskrivelse for folk som ikke kan se bildet eller når bildet ikke lastes inn. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative teksten ble opprettet automatisk og kan være unøyaktig. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Les mer +pdfjs-editor-new-alt-text-create-automatically-button-label = Lag alternativ tekst automatisk +pdfjs-editor-new-alt-text-not-now-button = Ikke nå +pdfjs-editor-new-alt-text-error-title = Kunne ikke opprette alternativ tekst automatisk +pdfjs-editor-new-alt-text-error-description = Skriv din egen alternativ-tekst eller prøv igjen senere. +pdfjs-editor-new-alt-text-error-close-button = Lukk +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Laster ned alternativ tekst AI-modell ({ $downloadedSize } av { $totalSize } MB) + .aria-valuetext = Laster ned alternativ tekst AI-modell ({ $downloadedSize } av { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt-tekst lagt til +pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst lagt til +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mangler alt-tekst +pdfjs-editor-new-alt-text-missing-button-label = Mangler alternativ tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Gjennomgå alt-tekst +pdfjs-editor-new-alt-text-to-review-button-label = Gjennomgå alternativ tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Opprettet automatisk: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Innstillinger for alternativ tekst for bilde +pdfjs-image-alt-text-settings-button-label = Innstillinger for alternativ tekst for bilde +pdfjs-editor-alt-text-settings-dialog-label = Innstillinger for alternativ tekst for bilde +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekst automatisk +pdfjs-editor-alt-text-settings-create-model-description = Foreslår beskrivelser for å hjelpe folk som ikke kan se bildet eller når bildet ikke lastes inn. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativ tekst AI-modell ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Kjører lokalt på enheten din slik at dataene dine forblir private. Nødvendig for automatisk alternativ tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Slett +pdfjs-editor-alt-text-settings-download-model-button = Last ned +pdfjs-editor-alt-text-settings-downloading-model-button = Laster ned… +pdfjs-editor-alt-text-settings-editor-title = Alternativ tekst-redigerer +pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis alternativ tekst-redigerer direkte når du legger til et bilde +pdfjs-editor-alt-text-settings-show-dialog-description = Hjelper deg å sørge for at alle bildene dine har alternativ tekst. +pdfjs-editor-alt-text-settings-close-button = Lukk diff --git a/public/pdfjs/web/locale/ne-NP/viewer.ftl b/public/pdfjs/web/locale/ne-NP/viewer.ftl new file mode 100644 index 0000000..65193b6 --- /dev/null +++ b/public/pdfjs/web/locale/ne-NP/viewer.ftl @@ -0,0 +1,234 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = अघिल्लो पृष्ठ +pdfjs-previous-button-label = अघिल्लो +pdfjs-next-button = + .title = पछिल्लो पृष्ठ +pdfjs-next-button-label = पछिल्लो +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = पृष्ठ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } मध्ये +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } को { $pageNumber }) +pdfjs-zoom-out-button = + .title = जुम घटाउनुहोस् +pdfjs-zoom-out-button-label = जुम घटाउनुहोस् +pdfjs-zoom-in-button = + .title = जुम बढाउनुहोस् +pdfjs-zoom-in-button-label = जुम बढाउनुहोस् +pdfjs-zoom-select = + .title = जुम गर्नुहोस् +pdfjs-presentation-mode-button = + .title = प्रस्तुति मोडमा जानुहोस् +pdfjs-presentation-mode-button-label = प्रस्तुति मोड +pdfjs-open-file-button = + .title = फाइल खोल्नुहोस् +pdfjs-open-file-button-label = खोल्नुहोस् +pdfjs-print-button = + .title = मुद्रण गर्नुहोस् +pdfjs-print-button-label = मुद्रण गर्नुहोस् + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = औजारहरू +pdfjs-tools-button-label = औजारहरू +pdfjs-first-page-button = + .title = पहिलो पृष्ठमा जानुहोस् +pdfjs-first-page-button-label = पहिलो पृष्ठमा जानुहोस् +pdfjs-last-page-button = + .title = पछिल्लो पृष्ठमा जानुहोस् +pdfjs-last-page-button-label = पछिल्लो पृष्ठमा जानुहोस् +pdfjs-page-rotate-cw-button = + .title = घडीको दिशामा घुमाउनुहोस् +pdfjs-page-rotate-cw-button-label = घडीको दिशामा घुमाउनुहोस् +pdfjs-page-rotate-ccw-button = + .title = घडीको विपरित दिशामा घुमाउनुहोस् +pdfjs-page-rotate-ccw-button-label = घडीको विपरित दिशामा घुमाउनुहोस् +pdfjs-cursor-text-select-tool-button = + .title = पाठ चयन उपकरण सक्षम गर्नुहोस् +pdfjs-cursor-text-select-tool-button-label = पाठ चयन उपकरण +pdfjs-cursor-hand-tool-button = + .title = हाते उपकरण सक्षम गर्नुहोस् +pdfjs-cursor-hand-tool-button-label = हाते उपकरण +pdfjs-scroll-vertical-button = + .title = ठाडो स्क्रोलिङ्ग प्रयोग गर्नुहोस् +pdfjs-scroll-vertical-button-label = ठाडो स्क्र्रोलिङ्ग +pdfjs-scroll-horizontal-button = + .title = तेर्सो स्क्रोलिङ्ग प्रयोग गर्नुहोस् +pdfjs-scroll-horizontal-button-label = तेर्सो स्क्रोलिङ्ग +pdfjs-scroll-wrapped-button = + .title = लिपि स्क्रोलिङ्ग प्रयोग गर्नुहोस् +pdfjs-scroll-wrapped-button-label = लिपि स्क्रोलिङ्ग +pdfjs-spread-none-button = + .title = पृष्ठ स्प्रेडमा सामेल हुनुहुन्न +pdfjs-spread-none-button-label = स्प्रेड छैन + +## Document properties dialog + +pdfjs-document-properties-button = + .title = कागजात विशेषताहरू... +pdfjs-document-properties-button-label = कागजात विशेषताहरू... +pdfjs-document-properties-file-name = फाइल नाम: +pdfjs-document-properties-file-size = फाइल आकार: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = शीर्षक: +pdfjs-document-properties-author = लेखक: +pdfjs-document-properties-subject = विषयः +pdfjs-document-properties-keywords = शब्दकुञ्जीः +pdfjs-document-properties-creation-date = सिर्जना गरिएको मिति: +pdfjs-document-properties-modification-date = परिमार्जित मिति: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = सर्जक: +pdfjs-document-properties-producer = PDF निर्माता: +pdfjs-document-properties-version = PDF संस्करण +pdfjs-document-properties-page-count = पृष्ठ गणना: +pdfjs-document-properties-page-size = पृष्ठ आकार: +pdfjs-document-properties-page-size-unit-inches = इन्च +pdfjs-document-properties-page-size-unit-millimeters = मि.मि. +pdfjs-document-properties-page-size-orientation-portrait = पोट्रेट +pdfjs-document-properties-page-size-orientation-landscape = परिदृश्य +pdfjs-document-properties-page-size-name-letter = अक्षर +pdfjs-document-properties-page-size-name-legal = कानूनी + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-linearized-yes = हो +pdfjs-document-properties-linearized-no = होइन +pdfjs-document-properties-close-button = बन्द गर्नुहोस् + +## Print + +pdfjs-print-progress-message = मुद्रणका लागि कागजात तयारी गरिदै… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = रद्द गर्नुहोस् +pdfjs-printing-not-supported = चेतावनी: यो ब्राउजरमा मुद्रण पूर्णतया समर्थित छैन। +pdfjs-printing-not-ready = चेतावनी: PDF मुद्रणका लागि पूर्णतया लोड भएको छैन। + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = टगल साइडबार +pdfjs-toggle-sidebar-button-label = टगल साइडबार +pdfjs-document-outline-button = + .title = कागजातको रूपरेखा देखाउनुहोस् (सबै वस्तुहरू विस्तार/पतन गर्न डबल-क्लिक गर्नुहोस्) +pdfjs-document-outline-button-label = दस्तावेजको रूपरेखा +pdfjs-attachments-button = + .title = संलग्नहरू देखाउनुहोस् +pdfjs-attachments-button-label = संलग्नकहरू +pdfjs-thumbs-button = + .title = थम्बनेलहरू देखाउनुहोस् +pdfjs-thumbs-button-label = थम्बनेलहरू +pdfjs-findbar-button = + .title = कागजातमा फेला पार्नुहोस् +pdfjs-findbar-button-label = फेला पार्नुहोस् + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = पृष्ठ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } पृष्ठको थम्बनेल + +## Find panel button title and messages + +pdfjs-find-input = + .title = फेला पार्नुहोस् + .placeholder = कागजातमा फेला पार्नुहोस्… +pdfjs-find-previous-button = + .title = यस वाक्यांशको अघिल्लो घटना फेला पार्नुहोस् +pdfjs-find-previous-button-label = अघिल्लो +pdfjs-find-next-button = + .title = यस वाक्यांशको पछिल्लो घटना फेला पार्नुहोस् +pdfjs-find-next-button-label = अर्को +pdfjs-find-highlight-checkbox = सबै हाइलाइट गर्ने +pdfjs-find-match-case-checkbox-label = केस जोडा मिलाउनुहोस् +pdfjs-find-entire-word-checkbox-label = पुरा शब्दहरु +pdfjs-find-reached-top = पृष्ठको शिर्षमा पुगीयो, तलबाट जारी गरिएको थियो +pdfjs-find-reached-bottom = पृष्ठको अन्त्यमा पुगीयो, शिर्षबाट जारी गरिएको थियो +pdfjs-find-not-found = वाक्यांश फेला परेन + +## Predefined zoom values + +pdfjs-page-scale-width = पृष्ठ चौडाइ +pdfjs-page-scale-fit = पृष्ठ ठिक्क मिल्ने +pdfjs-page-scale-auto = स्वचालित जुम +pdfjs-page-scale-actual = वास्तविक आकार +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = यो PDF लोड गर्दा एउटा त्रुटि देखापर्‍यो। +pdfjs-invalid-file-error = अवैध वा दुषित PDF फाइल। +pdfjs-missing-file-error = हराईरहेको PDF फाइल। +pdfjs-unexpected-response-error = अप्रत्याशित सर्भर प्रतिक्रिया। +pdfjs-rendering-error = पृष्ठ प्रतिपादन गर्दा एउटा त्रुटि देखापर्‍यो। + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = यस PDF फाइललाई खोल्न गोप्यशब्द प्रविष्ट गर्नुहोस्। +pdfjs-password-invalid = अवैध गोप्यशब्द। पुनः प्रयास गर्नुहोस्। +pdfjs-password-ok-button = ठिक छ +pdfjs-password-cancel-button = रद्द गर्नुहोस् +pdfjs-web-fonts-disabled = वेब फन्ट असक्षम छन्: एम्बेडेड PDF फन्ट प्रयोग गर्न असमर्थ। + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/nl/viewer.ftl b/public/pdfjs/web/locale/nl/viewer.ftl new file mode 100644 index 0000000..fe24ce7 --- /dev/null +++ b/public/pdfjs/web/locale/nl/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Vorige pagina +pdfjs-previous-button-label = Vorige +pdfjs-next-button = + .title = Volgende pagina +pdfjs-next-button-label = Volgende +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = van { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } van { $pagesCount }) +pdfjs-zoom-out-button = + .title = Uitzoomen +pdfjs-zoom-out-button-label = Uitzoomen +pdfjs-zoom-in-button = + .title = Inzoomen +pdfjs-zoom-in-button-label = Inzoomen +pdfjs-zoom-select = + .title = Zoomen +pdfjs-presentation-mode-button = + .title = Wisselen naar presentatiemodus +pdfjs-presentation-mode-button-label = Presentatiemodus +pdfjs-open-file-button = + .title = Bestand openen +pdfjs-open-file-button-label = Openen +pdfjs-print-button = + .title = Afdrukken +pdfjs-print-button-label = Afdrukken +pdfjs-save-button = + .title = Opslaan +pdfjs-save-button-label = Opslaan +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Downloaden +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Downloaden +pdfjs-bookmark-button = + .title = Huidige pagina (URL van huidige pagina bekijken) +pdfjs-bookmark-button-label = Huidige pagina + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Hulpmiddelen +pdfjs-tools-button-label = Hulpmiddelen +pdfjs-first-page-button = + .title = Naar eerste pagina gaan +pdfjs-first-page-button-label = Naar eerste pagina gaan +pdfjs-last-page-button = + .title = Naar laatste pagina gaan +pdfjs-last-page-button-label = Naar laatste pagina gaan +pdfjs-page-rotate-cw-button = + .title = Rechtsom draaien +pdfjs-page-rotate-cw-button-label = Rechtsom draaien +pdfjs-page-rotate-ccw-button = + .title = Linksom draaien +pdfjs-page-rotate-ccw-button-label = Linksom draaien +pdfjs-cursor-text-select-tool-button = + .title = Tekstselectiehulpmiddel inschakelen +pdfjs-cursor-text-select-tool-button-label = Tekstselectiehulpmiddel +pdfjs-cursor-hand-tool-button = + .title = Handhulpmiddel inschakelen +pdfjs-cursor-hand-tool-button-label = Handhulpmiddel +pdfjs-scroll-page-button = + .title = Paginascrollen gebruiken +pdfjs-scroll-page-button-label = Paginascrollen +pdfjs-scroll-vertical-button = + .title = Verticaal scrollen gebruiken +pdfjs-scroll-vertical-button-label = Verticaal scrollen +pdfjs-scroll-horizontal-button = + .title = Horizontaal scrollen gebruiken +pdfjs-scroll-horizontal-button-label = Horizontaal scrollen +pdfjs-scroll-wrapped-button = + .title = Scrollen met terugloop gebruiken +pdfjs-scroll-wrapped-button-label = Scrollen met terugloop +pdfjs-spread-none-button = + .title = Dubbele pagina’s niet samenvoegen +pdfjs-spread-none-button-label = Geen dubbele pagina’s +pdfjs-spread-odd-button = + .title = Dubbele pagina’s samenvoegen vanaf oneven pagina’s +pdfjs-spread-odd-button-label = Oneven dubbele pagina’s +pdfjs-spread-even-button = + .title = Dubbele pagina’s samenvoegen vanaf even pagina’s +pdfjs-spread-even-button-label = Even dubbele pagina’s + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Documenteigenschappen… +pdfjs-document-properties-button-label = Documenteigenschappen… +pdfjs-document-properties-file-name = Bestandsnaam: +pdfjs-document-properties-file-size = Bestandsgrootte: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Auteur: +pdfjs-document-properties-subject = Onderwerp: +pdfjs-document-properties-keywords = Sleutelwoorden: +pdfjs-document-properties-creation-date = Aanmaakdatum: +pdfjs-document-properties-modification-date = Wijzigingsdatum: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Maker: +pdfjs-document-properties-producer = PDF-producent: +pdfjs-document-properties-version = PDF-versie: +pdfjs-document-properties-page-count = Aantal pagina’s: +pdfjs-document-properties-page-size = Paginagrootte: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = staand +pdfjs-document-properties-page-size-orientation-landscape = liggend +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Snelle webweergave: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nee +pdfjs-document-properties-close-button = Sluiten + +## Print + +pdfjs-print-progress-message = Document voorbereiden voor afdrukken… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Annuleren +pdfjs-printing-not-supported = Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser. +pdfjs-printing-not-ready = Waarschuwing: de PDF is niet volledig geladen voor afdrukken. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Zijbalk in-/uitschakelen +pdfjs-toggle-sidebar-notification-button = + .title = Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen/lagen) +pdfjs-toggle-sidebar-button-label = Zijbalk in-/uitschakelen +pdfjs-document-outline-button = + .title = Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen) +pdfjs-document-outline-button-label = Documentoverzicht +pdfjs-attachments-button = + .title = Bijlagen tonen +pdfjs-attachments-button-label = Bijlagen +pdfjs-layers-button = + .title = Lagen tonen (dubbelklik om alle lagen naar de standaardstatus terug te zetten) +pdfjs-layers-button-label = Lagen +pdfjs-thumbs-button = + .title = Miniaturen tonen +pdfjs-thumbs-button-label = Miniaturen +pdfjs-current-outline-item-button = + .title = Huidig item in inhoudsopgave zoeken +pdfjs-current-outline-item-button-label = Huidig item in inhoudsopgave +pdfjs-findbar-button = + .title = Zoeken in document +pdfjs-findbar-button-label = Zoeken +pdfjs-additional-layers = Aanvullende lagen + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatuur van pagina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Zoeken + .placeholder = Zoeken in document… +pdfjs-find-previous-button = + .title = De vorige overeenkomst van de tekst zoeken +pdfjs-find-previous-button-label = Vorige +pdfjs-find-next-button = + .title = De volgende overeenkomst van de tekst zoeken +pdfjs-find-next-button-label = Volgende +pdfjs-find-highlight-checkbox = Alles markeren +pdfjs-find-match-case-checkbox-label = Hoofdlettergevoelig +pdfjs-find-match-diacritics-checkbox-label = Diakritische tekens gebruiken +pdfjs-find-entire-word-checkbox-label = Hele woorden +pdfjs-find-reached-top = Bovenkant van document bereikt, doorgegaan vanaf onderkant +pdfjs-find-reached-bottom = Onderkant van document bereikt, doorgegaan vanaf bovenkant +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } van { $total } overeenkomst + *[other] { $current } van { $total } overeenkomsten + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Meer dan { $limit } overeenkomst + *[other] Meer dan { $limit } overeenkomsten + } +pdfjs-find-not-found = Tekst niet gevonden + +## Predefined zoom values + +pdfjs-page-scale-width = Paginabreedte +pdfjs-page-scale-fit = Hele pagina +pdfjs-page-scale-auto = Automatisch zoomen +pdfjs-page-scale-actual = Werkelijke grootte +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Er is een fout opgetreden bij het laden van de PDF. +pdfjs-invalid-file-error = Ongeldig of beschadigd PDF-bestand. +pdfjs-missing-file-error = PDF-bestand ontbreekt. +pdfjs-unexpected-response-error = Onverwacht serverantwoord. +pdfjs-rendering-error = Er is een fout opgetreden bij het weergeven van de pagina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }-aantekening] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Voer het wachtwoord in om dit PDF-bestand te openen. +pdfjs-password-invalid = Ongeldig wachtwoord. Probeer het opnieuw. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Annuleren +pdfjs-web-fonts-disabled = Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Tekenen +pdfjs-editor-ink-button-label = Tekenen +pdfjs-editor-stamp-button = + .title = Afbeeldingen toevoegen of bewerken +pdfjs-editor-stamp-button-label = Afbeeldingen toevoegen of bewerken +pdfjs-editor-highlight-button = + .title = Markeren +pdfjs-editor-highlight-button-label = Markeren +pdfjs-highlight-floating-button1 = + .title = Markeren + .aria-label = Markeren +pdfjs-highlight-floating-button-label = Markeren + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Tekening verwijderen +pdfjs-editor-remove-freetext-button = + .title = Tekst verwijderen +pdfjs-editor-remove-stamp-button = + .title = Afbeelding verwijderen +pdfjs-editor-remove-highlight-button = + .title = Markering verwijderen + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Kleur +pdfjs-editor-free-text-size-input = Grootte +pdfjs-editor-ink-color-input = Kleur +pdfjs-editor-ink-thickness-input = Dikte +pdfjs-editor-ink-opacity-input = Opaciteit +pdfjs-editor-stamp-add-image-button = + .title = Afbeelding toevoegen +pdfjs-editor-stamp-add-image-button-label = Afbeelding toevoegen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Dikte +pdfjs-editor-free-highlight-thickness-title = + .title = Dikte wijzigen bij accentuering van andere items dan tekst +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstbewerker + .default-content = Start met typen… +pdfjs-free-text = + .aria-label = Tekstbewerker +pdfjs-free-text-default-content = Begin met typen… +pdfjs-ink = + .aria-label = Tekeningbewerker +pdfjs-ink-canvas = + .aria-label = Door gebruiker gemaakte afbeelding + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternatieve tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatieve tekst bewerken +pdfjs-editor-alt-text-edit-button-label = Alternatieve tekst bewerken +pdfjs-editor-alt-text-dialog-label = Kies een optie +pdfjs-editor-alt-text-dialog-description = Alternatieve tekst helpt wanneer mensen de afbeelding niet kunnen zien of wanneer deze niet wordt geladen. +pdfjs-editor-alt-text-add-description-label = Voeg een beschrijving toe +pdfjs-editor-alt-text-add-description-description = Streef naar 1-2 zinnen die het onderwerp, de omgeving of de acties beschrijven. +pdfjs-editor-alt-text-mark-decorative-label = Als decoratief markeren +pdfjs-editor-alt-text-mark-decorative-description = Dit wordt gebruikt voor sierafbeeldingen, zoals randen of watermerken. +pdfjs-editor-alt-text-cancel-button = Annuleren +pdfjs-editor-alt-text-save-button = Opslaan +pdfjs-editor-alt-text-decorative-tooltip = Als decoratief gemarkeerd +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Bijvoorbeeld: ‘Een jonge man gaat aan een tafel zitten om te eten’ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatieve tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Linkerbovenhoek – formaat wijzigen +pdfjs-editor-resizer-label-top-middle = Midden boven – formaat wijzigen +pdfjs-editor-resizer-label-top-right = Rechterbovenhoek – formaat wijzigen +pdfjs-editor-resizer-label-middle-right = Midden rechts – formaat wijzigen +pdfjs-editor-resizer-label-bottom-right = Rechterbenedenhoek – formaat wijzigen +pdfjs-editor-resizer-label-bottom-middle = Midden onder – formaat wijzigen +pdfjs-editor-resizer-label-bottom-left = Linkerbenedenhoek – formaat wijzigen +pdfjs-editor-resizer-label-middle-left = Links midden – formaat wijzigen +pdfjs-editor-resizer-top-left = + .aria-label = Linkerbovenhoek – formaat wijzigen +pdfjs-editor-resizer-top-middle = + .aria-label = Midden boven – formaat wijzigen +pdfjs-editor-resizer-top-right = + .aria-label = Rechterbovenhoek – formaat wijzigen +pdfjs-editor-resizer-middle-right = + .aria-label = Midden rechts – formaat wijzigen +pdfjs-editor-resizer-bottom-right = + .aria-label = Rechterbenedenhoek – formaat wijzigen +pdfjs-editor-resizer-bottom-middle = + .aria-label = Midden onder – formaat wijzigen +pdfjs-editor-resizer-bottom-left = + .aria-label = Linkerbenedenhoek – formaat wijzigen +pdfjs-editor-resizer-middle-left = + .aria-label = Links midden – formaat wijzigen + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Markeringskleur +pdfjs-editor-colorpicker-button = + .title = Kleur wijzigen +pdfjs-editor-colorpicker-dropdown = + .aria-label = Kleurkeuzes +pdfjs-editor-colorpicker-yellow = + .title = Geel +pdfjs-editor-colorpicker-green = + .title = Groen +pdfjs-editor-colorpicker-blue = + .title = Blauw +pdfjs-editor-colorpicker-pink = + .title = Roze +pdfjs-editor-colorpicker-red = + .title = Rood + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Alles tonen +pdfjs-editor-highlight-show-all-button = + .title = Alles tonen + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatieve tekst (afbeeldingsbeschrijving) bewerken +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatieve tekst (afbeeldingsbeschrijving) toevoegen +pdfjs-editor-new-alt-text-textarea = + .placeholder = Schrijf hier uw beschrijving… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Korte beschrijving voor mensen die de afbeelding niet kunnen zien of wanneer de afbeelding niet wordt geladen. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Deze alternatieve tekst is automatisch gemaakt en is mogelijk onjuist. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Meer info +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatieve tekst automatisch aanmaken +pdfjs-editor-new-alt-text-not-now-button = Niet nu +pdfjs-editor-new-alt-text-error-title = Kan alternatieve tekst niet automatisch aanmaken +pdfjs-editor-new-alt-text-error-description = Schrijf uw eigen alternatieve tekst of probeer het later nog eens. +pdfjs-editor-new-alt-text-error-close-button = Sluiten +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = AI-model voor alternatieve tekst downloaden ({ $downloadedSize } van { $totalSize } MB) + .aria-valuetext = AI-model voor alternatieve tekst downloaden ({ $downloadedSize } van { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatieve tekst toegevoegd +pdfjs-editor-new-alt-text-added-button-label = Alternatieve tekst toegevoegd +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatieve tekst ontbreekt +pdfjs-editor-new-alt-text-missing-button-label = Alternatieve tekst ontbreekt +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatieve tekst beoordelen +pdfjs-editor-new-alt-text-to-review-button-label = Alternatieve tekst beoordelen +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatisch aangemaakt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Instellingen voor alternatieve tekst van afbeeldingen +pdfjs-image-alt-text-settings-button-label = Instellingen voor alternatieve tekst van afbeeldingen +pdfjs-editor-alt-text-settings-dialog-label = Instellingen voor alternatieve tekst van afbeeldingen +pdfjs-editor-alt-text-settings-automatic-title = Automatische alternatieve tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatieve tekst automatisch aanmaken +pdfjs-editor-alt-text-settings-create-model-description = Stelt beschrijvingen voor om mensen te helpen die de afbeelding niet kunnen zien of voor wie de afbeelding niet wordt geladen. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-model voor alternatieve tekst ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Wordt lokaal op uw apparaat uitgevoerd, zodat uw gegevens privé blijven. Vereist voor automatische alternatieve tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Verwijderen +pdfjs-editor-alt-text-settings-download-model-button = Downloaden +pdfjs-editor-alt-text-settings-downloading-model-button = Downloaden… +pdfjs-editor-alt-text-settings-editor-title = Alternatieve-tekstbewerker +pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternatieve-tekstbewerker meteen tonen bij toevoegen van een afbeelding +pdfjs-editor-alt-text-settings-show-dialog-description = Helpt u ervoor te zorgen dat al uw afbeeldingen alternatieve tekst hebben. +pdfjs-editor-alt-text-settings-close-button = Sluiten + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markering verwijderd +pdfjs-editor-undo-bar-message-freetext = Tekst verwijderd +pdfjs-editor-undo-bar-message-ink = Tekening verwijderd +pdfjs-editor-undo-bar-message-stamp = Afbeelding verwijderd +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotatie verwijderd + *[other] { $count } annotaties verwijderd + } +pdfjs-editor-undo-bar-undo-button = + .title = Ongedaan maken +pdfjs-editor-undo-bar-undo-button-label = Ongedaan maken +pdfjs-editor-undo-bar-close-button = + .title = Sluiten +pdfjs-editor-undo-bar-close-button-label = Sluiten diff --git a/public/pdfjs/web/locale/nn-NO/viewer.ftl b/public/pdfjs/web/locale/nn-NO/viewer.ftl new file mode 100644 index 0000000..d617e16 --- /dev/null +++ b/public/pdfjs/web/locale/nn-NO/viewer.ftl @@ -0,0 +1,498 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Føregåande side +pdfjs-previous-button-label = Føregåande +pdfjs-next-button = + .title = Neste side +pdfjs-next-button-label = Neste +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Side +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = av { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } av { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom ut +pdfjs-zoom-out-button-label = Zoom ut +pdfjs-zoom-in-button = + .title = Zoom inn +pdfjs-zoom-in-button-label = Zoom inn +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Byt til presentasjonsmodus +pdfjs-presentation-mode-button-label = Presentasjonsmodus +pdfjs-open-file-button = + .title = Opne fil +pdfjs-open-file-button-label = Opne +pdfjs-print-button = + .title = Skriv ut +pdfjs-print-button-label = Skriv ut +pdfjs-save-button = + .title = Lagre +pdfjs-save-button-label = Lagre +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Last ned +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Last ned +pdfjs-bookmark-button = + .title = Gjeldande side (sjå URL frå gjeldande side) +pdfjs-bookmark-button-label = Gjeldande side + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Verktøy +pdfjs-tools-button-label = Verktøy +pdfjs-first-page-button = + .title = Gå til første side +pdfjs-first-page-button-label = Gå til første side +pdfjs-last-page-button = + .title = Gå til siste side +pdfjs-last-page-button-label = Gå til siste side +pdfjs-page-rotate-cw-button = + .title = Roter med klokka +pdfjs-page-rotate-cw-button-label = Roter med klokka +pdfjs-page-rotate-ccw-button = + .title = Roter mot klokka +pdfjs-page-rotate-ccw-button-label = Roter mot klokka +pdfjs-cursor-text-select-tool-button = + .title = Aktiver tekstmarkeringsverktøy +pdfjs-cursor-text-select-tool-button-label = Tekstmarkeringsverktøy +pdfjs-cursor-hand-tool-button = + .title = Aktiver handverktøy +pdfjs-cursor-hand-tool-button-label = Handverktøy +pdfjs-scroll-page-button = + .title = Bruk siderulling +pdfjs-scroll-page-button-label = Siderulling +pdfjs-scroll-vertical-button = + .title = Bruk vertikal rulling +pdfjs-scroll-vertical-button-label = Vertikal rulling +pdfjs-scroll-horizontal-button = + .title = Bruk horisontal rulling +pdfjs-scroll-horizontal-button-label = Horisontal rulling +pdfjs-scroll-wrapped-button = + .title = Bruk fleirsiderulling +pdfjs-scroll-wrapped-button-label = Fleirsiderulling +pdfjs-spread-none-button = + .title = Vis enkeltsider +pdfjs-spread-none-button-label = Enkeltside +pdfjs-spread-odd-button = + .title = Vis oppslag med ulike sidenummer til venstre +pdfjs-spread-odd-button-label = Oppslag med framside +pdfjs-spread-even-button = + .title = Vis oppslag med like sidenummmer til venstre +pdfjs-spread-even-button-label = Oppslag utan framside + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumenteigenskapar… +pdfjs-document-properties-button-label = Dokumenteigenskapar… +pdfjs-document-properties-file-name = Filnamn: +pdfjs-document-properties-file-size = Filstorleik: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Tittel: +pdfjs-document-properties-author = Forfattar: +pdfjs-document-properties-subject = Emne: +pdfjs-document-properties-keywords = Stikkord: +pdfjs-document-properties-creation-date = Dato oppretta: +pdfjs-document-properties-modification-date = Dato endra: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Oppretta av: +pdfjs-document-properties-producer = PDF-verktøy: +pdfjs-document-properties-version = PDF-versjon: +pdfjs-document-properties-page-count = Sidetal: +pdfjs-document-properties-page-size = Sidestørrelse: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = ståande (portrait) +pdfjs-document-properties-page-size-orientation-landscape = liggande (landscape) +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Brev +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Rask nettvising: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nei +pdfjs-document-properties-close-button = Lat att + +## Print + +pdfjs-print-progress-message = Førebur dokumentet for utskrift… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Avbryt +pdfjs-printing-not-supported = Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren. +pdfjs-printing-not-ready = Åtvaring: PDF ikkje fullstendig innlasta for utskrift. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Slå av/på sidestolpe +pdfjs-toggle-sidebar-notification-button = + .title = Vis/gøym sidestolpe (dokumentet inneheld oversikt/vedlegg/lag) +pdfjs-toggle-sidebar-button-label = Slå av/på sidestolpe +pdfjs-document-outline-button = + .title = Vis dokumentdisposisjonen (dobbelklikk for å utvide/gøyme alle elementa) +pdfjs-document-outline-button-label = Dokumentdisposisjon +pdfjs-attachments-button = + .title = Vis vedlegg +pdfjs-attachments-button-label = Vedlegg +pdfjs-layers-button = + .title = Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand) +pdfjs-layers-button-label = Lag +pdfjs-thumbs-button = + .title = Vis miniatyrbilde +pdfjs-thumbs-button-label = Miniatyrbilde +pdfjs-current-outline-item-button = + .title = Finn gjeldande disposisjonselement +pdfjs-current-outline-item-button-label = Gjeldande disposisjonselement +pdfjs-findbar-button = + .title = Finn i dokumentet +pdfjs-findbar-button-label = Finn +pdfjs-additional-layers = Ytterlegare lag + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatyrbilde av side { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Søk + .placeholder = Søk i dokument… +pdfjs-find-previous-button = + .title = Finn førre førekomst av frasen +pdfjs-find-previous-button-label = Førre +pdfjs-find-next-button = + .title = Finn neste førekomst av frasen +pdfjs-find-next-button-label = Neste +pdfjs-find-highlight-checkbox = Uthev alle +pdfjs-find-match-case-checkbox-label = Skil store/små bokstavar +pdfjs-find-match-diacritics-checkbox-label = Samsvar diakritiske teikn +pdfjs-find-entire-word-checkbox-label = Heile ord +pdfjs-find-reached-top = Nådde toppen av dokumentet, fortset frå botnen +pdfjs-find-reached-bottom = Nådde botnen av dokumentet, fortset frå toppen +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } av { $total } treff + *[other] { $current } av { $total } treff + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Meir enn { $limit } treff + *[other] Meir enn { $limit } treff + } +pdfjs-find-not-found = Fann ikkje teksten + +## Predefined zoom values + +pdfjs-page-scale-width = Sidebreidde +pdfjs-page-scale-fit = Tilpass til sida +pdfjs-page-scale-auto = Automatisk skalering +pdfjs-page-scale-actual = Verkeleg storleik +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Side { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ein feil oppstod ved lasting av PDF. +pdfjs-invalid-file-error = Ugyldig eller korrupt PDF-fil. +pdfjs-missing-file-error = Manglande PDF-fil. +pdfjs-unexpected-response-error = Uventa tenarrespons. +pdfjs-rendering-error = Ein feil oppstod under vising av sida. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } annotasjon] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Skriv inn passordet for å opne denne PDF-fila. +pdfjs-password-invalid = Ugyldig passord. Prøv på nytt. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Avbryt +pdfjs-web-fonts-disabled = Web-skrifter er slått av: Kan ikkje bruke innbundne PDF-skrifter. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Teikne +pdfjs-editor-ink-button-label = Teikne +pdfjs-editor-stamp-button = + .title = Legg til eller rediger bilde +pdfjs-editor-stamp-button-label = Legg til eller rediger bilde +pdfjs-editor-highlight-button = + .title = Markere +pdfjs-editor-highlight-button-label = Markere +pdfjs-highlight-floating-button1 = + .title = Markere + .aria-label = Markere +pdfjs-highlight-floating-button-label = Markere + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Fjern teikninga +pdfjs-editor-remove-freetext-button = + .title = Fjern tekst +pdfjs-editor-remove-stamp-button = + .title = Fjern bildet +pdfjs-editor-remove-highlight-button = + .title = Fjern utheving + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Farge +pdfjs-editor-free-text-size-input = Storleik +pdfjs-editor-ink-color-input = Farge +pdfjs-editor-ink-thickness-input = Tjukn +pdfjs-editor-ink-opacity-input = Ugjennomskinleg +pdfjs-editor-stamp-add-image-button = + .title = Legg til bilde +pdfjs-editor-stamp-add-image-button-label = Legg til bilde +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tjukn +pdfjs-editor-free-highlight-thickness-title = + .title = Endre tjukn når du markerer andre element enn tekst +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Tekstredigering + .default-content = Begynn å skrive… +pdfjs-free-text = + .aria-label = Tekstredigering +pdfjs-free-text-default-content = Byrje å skrive… +pdfjs-ink = + .aria-label = Teikneredigering +pdfjs-ink-canvas = + .aria-label = Brukarskapt bilde + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alt-tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger alt-tekst tekst +pdfjs-editor-alt-text-edit-button-label = Rediger alt-tekst tekst +pdfjs-editor-alt-text-dialog-label = Vel eit alternativ +pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper når folk ikkje kan sjå bildet eller når det ikkje vert lasta inn. +pdfjs-editor-alt-text-add-description-label = Legg til ei skildring +pdfjs-editor-alt-text-add-description-description = Gå etter 1-2 setninger som skildrar emnet, settinga eller handlingane. +pdfjs-editor-alt-text-mark-decorative-label = Merk som dekorativt +pdfjs-editor-alt-text-mark-decorative-description = Dette vert brukt til dekorative bilde, som kantlinjer eller vassmerke. +pdfjs-editor-alt-text-cancel-button = Avbryt +pdfjs-editor-alt-text-save-button = Lagre +pdfjs-editor-alt-text-decorative-tooltip = Merkt som dekorativ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Til dømes, «Ein ung mann set seg ved eit bord for å ete eit måltid» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt-tekst + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Øvste venstre hjørne – endre størrelse +pdfjs-editor-resizer-label-top-middle = Øvst i midten — endre størrelse +pdfjs-editor-resizer-label-top-right = Øvste høgre hjørne – endre størrelse +pdfjs-editor-resizer-label-middle-right = Midt til høgre – endre størrelse +pdfjs-editor-resizer-label-bottom-right = Nedste høgre hjørne – endre størrelse +pdfjs-editor-resizer-label-bottom-middle = Nedst i midten — endre størrelse +pdfjs-editor-resizer-label-bottom-left = Nedste venstre hjørne – endre størrelse +pdfjs-editor-resizer-label-middle-left = Midt til venstre — endre størrelse +pdfjs-editor-resizer-top-left = + .aria-label = Øvste venstre hjørne – endre størrelse +pdfjs-editor-resizer-top-middle = + .aria-label = Øvst i midten — endre størrelse +pdfjs-editor-resizer-top-right = + .aria-label = Øvste høgre hjørne – endre størrelse +pdfjs-editor-resizer-middle-right = + .aria-label = Midt til høgre – endre størrelse +pdfjs-editor-resizer-bottom-right = + .aria-label = Nedste høgre hjørne – endre størrelse +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nedst i midten — endre størrelse +pdfjs-editor-resizer-bottom-left = + .aria-label = Nedste venstre hjørne – endre størrelse +pdfjs-editor-resizer-middle-left = + .aria-label = Midt til venstre — endre størrelse + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Uthevingsfarge +pdfjs-editor-colorpicker-button = + .title = Endre farge +pdfjs-editor-colorpicker-dropdown = + .aria-label = Fargeval +pdfjs-editor-colorpicker-yellow = + .title = Gul +pdfjs-editor-colorpicker-green = + .title = Grøn +pdfjs-editor-colorpicker-blue = + .title = Blå +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Raud + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (bildeskildring) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Legg til alternativ tekst (bildeskildring) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv skildringa di her… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort skildring for personar som ikkje kan sjå bildet, eller når bildet ikkje lastar inn. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative teksten vart oppretta automatisk, og kan vere unøyaktig. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Les meir +pdfjs-editor-new-alt-text-create-automatically-button-label = Opprett alternativ tekt automatisk +pdfjs-editor-new-alt-text-not-now-button = Ikkje no +pdfjs-editor-new-alt-text-error-title = Klarte ikkje å opprette alternativ tekst automatisk +pdfjs-editor-new-alt-text-error-description = Skriv din eigen alternative tekst eller prøv igjen seinare. +pdfjs-editor-new-alt-text-error-close-button = Lat att +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Lastar ned AI-modell med alternativ tekst ({ $downloadedSize } av { $totalSize } MB) + .aria-valuetext = Lastar ned AI-modell med alternativ tekst ({ $downloadedSize } av { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ tekst lagt til +pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst lagt til +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Manglande alternativ tekst +pdfjs-editor-new-alt-text-missing-button-label = Manglande alternativ tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Vurder alternativ tekst +pdfjs-editor-new-alt-text-to-review-button-label = Vurder alternativ tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Oppretta automatisk: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Alternative tekst-innstillingar for bilde +pdfjs-image-alt-text-settings-button-label = Alternative tekst-innstillingar for bilde +pdfjs-editor-alt-text-settings-dialog-label = Alternative tekst-innstillingar for bilde +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekt automatisk +pdfjs-editor-alt-text-settings-create-model-description = Foreslår skildringar for å hjelpe folk som ikkje kan sjå bildet eller når bildet ikkje blir lasta inn. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-modell for alternativ tekst ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Køyrer lokalt på eininga di slik at dataa dine blir verande private. Påkravd for automatisk alternativ tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Slett +pdfjs-editor-alt-text-settings-download-model-button = Last ned +pdfjs-editor-alt-text-settings-downloading-model-button = Lastar ned… +pdfjs-editor-alt-text-settings-editor-title = Alternativ tekst-redigerar +pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis alternativ tekst-redigerar direkte når du legg til eit bilde +pdfjs-editor-alt-text-settings-show-dialog-description = Hjelper deg med å sørgje for at alle bilda dine har alternativ tekst. +pdfjs-editor-alt-text-settings-close-button = Lat att + +## "Annotations removed" bar + diff --git a/public/pdfjs/web/locale/oc/viewer.ftl b/public/pdfjs/web/locale/oc/viewer.ftl new file mode 100644 index 0000000..b347aef --- /dev/null +++ b/public/pdfjs/web/locale/oc/viewer.ftl @@ -0,0 +1,409 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagina precedenta +pdfjs-previous-button-label = Precedent +pdfjs-next-button = + .title = Pagina seguenta +pdfjs-next-button-label = Seguent +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = sus { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom arrièr +pdfjs-zoom-out-button-label = Zoom arrièr +pdfjs-zoom-in-button = + .title = Zoom avant +pdfjs-zoom-in-button-label = Zoom avant +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Bascular en mòde presentacion +pdfjs-presentation-mode-button-label = Mòde Presentacion +pdfjs-open-file-button = + .title = Dobrir lo fichièr +pdfjs-open-file-button-label = Dobrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Enregistrar +pdfjs-save-button-label = Enregistrar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Telecargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Telecargar +pdfjs-bookmark-button = + .title = Pagina actuala (mostrar l’adreça de la pagina actuala) +pdfjs-bookmark-button-label = Pagina actuala + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Aisinas +pdfjs-tools-button-label = Aisinas +pdfjs-first-page-button = + .title = Anar a la primièra pagina +pdfjs-first-page-button-label = Anar a la primièra pagina +pdfjs-last-page-button = + .title = Anar a la darrièra pagina +pdfjs-last-page-button-label = Anar a la darrièra pagina +pdfjs-page-rotate-cw-button = + .title = Rotacion orària +pdfjs-page-rotate-cw-button-label = Rotacion orària +pdfjs-page-rotate-ccw-button = + .title = Rotacion antiorària +pdfjs-page-rotate-ccw-button-label = Rotacion antiorària +pdfjs-cursor-text-select-tool-button = + .title = Activar l'aisina de seleccion de tèxte +pdfjs-cursor-text-select-tool-button-label = Aisina de seleccion de tèxte +pdfjs-cursor-hand-tool-button = + .title = Activar l’aisina man +pdfjs-cursor-hand-tool-button-label = Aisina man +pdfjs-scroll-page-button = + .title = Activar lo defilament per pagina +pdfjs-scroll-page-button-label = Defilament per pagina +pdfjs-scroll-vertical-button = + .title = Utilizar lo defilament vertical +pdfjs-scroll-vertical-button-label = Defilament vertical +pdfjs-scroll-horizontal-button = + .title = Utilizar lo defilament orizontal +pdfjs-scroll-horizontal-button-label = Defilament orizontal +pdfjs-scroll-wrapped-button = + .title = Activar lo defilament continú +pdfjs-scroll-wrapped-button-label = Defilament continú +pdfjs-spread-none-button = + .title = Agropar pas las paginas doas a doas +pdfjs-spread-none-button-label = Una sola pagina +pdfjs-spread-odd-button = + .title = Mostrar doas paginas en començant per las paginas imparas a esquèrra +pdfjs-spread-odd-button-label = Dobla pagina, impara a drecha +pdfjs-spread-even-button = + .title = Mostrar doas paginas en començant per las paginas paras a esquèrra +pdfjs-spread-even-button-label = Dobla pagina, para a drecha + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Proprietats del document… +pdfjs-document-properties-button-label = Proprietats del document… +pdfjs-document-properties-file-name = Nom del fichièr : +pdfjs-document-properties-file-size = Talha del fichièr : +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } Ko ({ $size_b } octets) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } Mo ({ $size_b } octets) +pdfjs-document-properties-title = Títol : +pdfjs-document-properties-author = Autor : +pdfjs-document-properties-subject = Subjècte : +pdfjs-document-properties-keywords = Mots claus : +pdfjs-document-properties-creation-date = Data de creacion : +pdfjs-document-properties-modification-date = Data de modificacion : +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, a { $time } +pdfjs-document-properties-creator = Creator : +pdfjs-document-properties-producer = Aisina de conversion PDF : +pdfjs-document-properties-version = Version PDF : +pdfjs-document-properties-page-count = Nombre de paginas : +pdfjs-document-properties-page-size = Talha de la pagina : +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = retrach +pdfjs-document-properties-page-size-orientation-landscape = païsatge +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letra +pdfjs-document-properties-page-size-name-legal = Document juridic + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista web rapida : +pdfjs-document-properties-linearized-yes = Òc +pdfjs-document-properties-linearized-no = Non +pdfjs-document-properties-close-button = Tampar + +## Print + +pdfjs-print-progress-message = Preparacion del document per l’impression… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Anullar +pdfjs-printing-not-supported = Atencion : l'impression es pas complètament gerida per aqueste navegador. +pdfjs-printing-not-ready = Atencion : lo PDF es pas entièrament cargat per lo poder imprimir. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Afichar/amagar lo panèl lateral +pdfjs-toggle-sidebar-notification-button = + .title = Afichar/amagar lo panèl lateral (lo document conten esquèmas/pèças juntas/calques) +pdfjs-toggle-sidebar-button-label = Afichar/amagar lo panèl lateral +pdfjs-document-outline-button = + .title = Mostrar los esquèmas del document (dobleclicar per espandre/reduire totes los elements) +pdfjs-document-outline-button-label = Marcapaginas del document +pdfjs-attachments-button = + .title = Visualizar las pèças juntas +pdfjs-attachments-button-label = Pèças juntas +pdfjs-layers-button = + .title = Afichar los calques (doble-clicar per reïnicializar totes los calques a l’estat per defaut) +pdfjs-layers-button-label = Calques +pdfjs-thumbs-button = + .title = Afichar las vinhetas +pdfjs-thumbs-button-label = Vinhetas +pdfjs-current-outline-item-button = + .title = Trobar l’element de plan actual +pdfjs-current-outline-item-button-label = Element de plan actual +pdfjs-findbar-button = + .title = Cercar dins lo document +pdfjs-findbar-button-label = Recercar +pdfjs-additional-layers = Calques suplementaris + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Vinheta de la pagina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Recercar + .placeholder = Cercar dins lo document… +pdfjs-find-previous-button = + .title = Tròba l'ocurréncia precedenta de la frasa +pdfjs-find-previous-button-label = Precedent +pdfjs-find-next-button = + .title = Tròba l'ocurréncia venenta de la frasa +pdfjs-find-next-button-label = Seguent +pdfjs-find-highlight-checkbox = Suslinhar tot +pdfjs-find-match-case-checkbox-label = Respectar la cassa +pdfjs-find-match-diacritics-checkbox-label = Respectar los diacritics +pdfjs-find-entire-word-checkbox-label = Mots entièrs +pdfjs-find-reached-top = Naut de la pagina atenh, perseguida del bas +pdfjs-find-reached-bottom = Bas de la pagina atench, perseguida al començament +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Ocurréncia { $current } de { $total } + *[other] Ocurréncia { $current } de { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mai de { $limit } ocurréncia + *[other] Mai de { $limit } ocurréncias + } +pdfjs-find-not-found = Frasa pas trobada + +## Predefined zoom values + +pdfjs-page-scale-width = Largor plena +pdfjs-page-scale-fit = Pagina entièra +pdfjs-page-scale-auto = Zoom automatic +pdfjs-page-scale-actual = Talha vertadièra +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Una error s'es producha pendent lo cargament del fichièr PDF. +pdfjs-invalid-file-error = Fichièr PDF invalid o corromput. +pdfjs-missing-file-error = Fichièr PDF mancant. +pdfjs-unexpected-response-error = Responsa de servidor imprevista. +pdfjs-rendering-error = Una error s'es producha pendent l'afichatge de la pagina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } a { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotacion { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Picatz lo senhal per dobrir aqueste fichièr PDF. +pdfjs-password-invalid = Senhal incorrècte. Tornatz ensajar. +pdfjs-password-ok-button = D'acòrdi +pdfjs-password-cancel-button = Anullar +pdfjs-web-fonts-disabled = Las polissas web son desactivadas : impossible d'utilizar las polissas integradas al PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tèxte +pdfjs-editor-free-text-button-label = Tèxte +pdfjs-editor-ink-button = + .title = Dessenhar +pdfjs-editor-ink-button-label = Dessenhar +pdfjs-editor-stamp-button = + .title = Apondre o modificar d’imatges +pdfjs-editor-stamp-button-label = Apondre o modificar d’imatges +pdfjs-editor-highlight-button = + .title = Subrelinhar +pdfjs-editor-highlight-button-label = Subrelinhar +pdfjs-highlight-floating-button1 = + .title = Subrelinhar + .aria-label = Subrelinhar +pdfjs-highlight-floating-button-label = Subrelinhar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Levar lo dessenh +pdfjs-editor-remove-freetext-button = + .title = Suprimir lo tèxte +pdfjs-editor-remove-stamp-button = + .title = Suprimir l’imatge +pdfjs-editor-remove-highlight-button = + .title = Levar lo suslinhatge + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Color +pdfjs-editor-free-text-size-input = Talha +pdfjs-editor-ink-color-input = Color +pdfjs-editor-ink-thickness-input = Espessor +pdfjs-editor-ink-opacity-input = Opacitat +pdfjs-editor-stamp-add-image-button = + .title = Apondre imatge +pdfjs-editor-stamp-add-image-button-label = Apondre imatge +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Espessor +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de tèxte + .default-content = Començatz de picar… +pdfjs-free-text = + .aria-label = Editor de tèxte +pdfjs-free-text-default-content = Començatz d’escriure… +pdfjs-ink = + .aria-label = Editor de dessenh +pdfjs-ink-canvas = + .aria-label = Imatge creat per l’utilizaire + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Tèxt alternatiu +pdfjs-editor-alt-text-edit-button-label = Modificar lo tèxt alternatiu +pdfjs-editor-alt-text-dialog-label = Causir una opcion +pdfjs-editor-alt-text-add-description-label = Apondre una descripcion +pdfjs-editor-alt-text-cancel-button = Anullar +pdfjs-editor-alt-text-save-button = Enregistrar + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color de suslinhatge +pdfjs-editor-colorpicker-button = + .title = Cambiar de color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Causida de colors +pdfjs-editor-colorpicker-yellow = + .title = Jaune +pdfjs-editor-colorpicker-green = + .title = Verd +pdfjs-editor-colorpicker-blue = + .title = Blau +pdfjs-editor-colorpicker-pink = + .title = Ròse +pdfjs-editor-colorpicker-red = + .title = Roge + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = O afichar tot +pdfjs-editor-highlight-show-all-button = + .title = O afichar tot + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-error-close-button = Tampar + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-automatic-title = Tèxte alternatiu automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Crear un tèxte alternatiu automaticament +pdfjs-editor-alt-text-settings-delete-model-button = Suprimir +pdfjs-editor-alt-text-settings-download-model-button = Telecargar +pdfjs-editor-alt-text-settings-downloading-model-button = Telecargament… +pdfjs-editor-alt-text-settings-editor-title = Editor de tèxte alternatiu +pdfjs-editor-alt-text-settings-close-button = Tampar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-freetext = Tèxte suprimit +pdfjs-editor-undo-bar-message-ink = Dessenh suprimit +pdfjs-editor-undo-bar-message-stamp = Imatge suprimit +pdfjs-editor-undo-bar-undo-button = + .title = Anullar +pdfjs-editor-undo-bar-undo-button-label = Anullar +pdfjs-editor-undo-bar-close-button = + .title = Tampar +pdfjs-editor-undo-bar-close-button-label = Tampar diff --git a/public/pdfjs/web/locale/pa-IN/viewer.ftl b/public/pdfjs/web/locale/pa-IN/viewer.ftl new file mode 100644 index 0000000..10a6112 --- /dev/null +++ b/public/pdfjs/web/locale/pa-IN/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = ਪਿਛਲਾ ਸਫ਼ਾ +pdfjs-previous-button-label = ਪਿੱਛੇ +pdfjs-next-button = + .title = ਅਗਲਾ ਸਫ਼ਾ +pdfjs-next-button-label = ਅੱਗੇ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ਸਫ਼ਾ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } ਵਿੱਚੋਂ +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = { $pagesCount }) ਵਿੱਚੋਂ ({ $pageNumber } +pdfjs-zoom-out-button = + .title = ਜ਼ੂਮ ਆਉਟ +pdfjs-zoom-out-button-label = ਜ਼ੂਮ ਆਉਟ +pdfjs-zoom-in-button = + .title = ਜ਼ੂਮ ਇਨ +pdfjs-zoom-in-button-label = ਜ਼ੂਮ ਇਨ +pdfjs-zoom-select = + .title = ਜ਼ੂਨ +pdfjs-presentation-mode-button = + .title = ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ +pdfjs-presentation-mode-button-label = ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ +pdfjs-open-file-button = + .title = ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹੋ +pdfjs-open-file-button-label = ਖੋਲ੍ਹੋ +pdfjs-print-button = + .title = ਪਰਿੰਟ +pdfjs-print-button-label = ਪਰਿੰਟ +pdfjs-save-button = + .title = ਸੰਭਾਲੋ +pdfjs-save-button-label = ਸੰਭਾਲੋ +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ਡਾਊਨਲੋਡ +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ਡਾਊਨਲੋਡ +pdfjs-bookmark-button = + .title = ਮੌਜੂਦਾ ਸਫ਼਼ਾ (ਮੌਜੂਦਾ ਸਫ਼ੇ ਤੋਂ URL ਵੇਖੋ) +pdfjs-bookmark-button-label = ਮੌਜੂਦਾ ਸਫ਼਼ਾ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ਟੂਲ +pdfjs-tools-button-label = ਟੂਲ +pdfjs-first-page-button = + .title = ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +pdfjs-first-page-button-label = ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +pdfjs-last-page-button = + .title = ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +pdfjs-last-page-button-label = ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +pdfjs-page-rotate-cw-button = + .title = ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ +pdfjs-page-rotate-cw-button-label = ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ +pdfjs-page-rotate-ccw-button = + .title = ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ +pdfjs-page-rotate-ccw-button-label = ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ +pdfjs-cursor-text-select-tool-button = + .title = ਲਿਖਤ ਚੋਣ ਟੂਲ ਸਮਰੱਥ ਕਰੋ +pdfjs-cursor-text-select-tool-button-label = ਲਿਖਤ ਚੋਣ ਟੂਲ +pdfjs-cursor-hand-tool-button = + .title = ਹੱਥ ਟੂਲ ਸਮਰੱਥ ਕਰੋ +pdfjs-cursor-hand-tool-button-label = ਹੱਥ ਟੂਲ +pdfjs-scroll-page-button = + .title = ਸਫ਼ਾ ਖਿਸਕਾਉਣ ਨੂੰ ਵਰਤੋਂ +pdfjs-scroll-page-button-label = ਸਫ਼ਾ ਖਿਸਕਾਉਣਾ +pdfjs-scroll-vertical-button = + .title = ਖੜ੍ਹਵੇਂ ਸਕਰਾਉਣ ਨੂੰ ਵਰਤੋਂ +pdfjs-scroll-vertical-button-label = ਖੜ੍ਹਵਾਂ ਸਰਕਾਉਣਾ +pdfjs-scroll-horizontal-button = + .title = ਲੇਟਵੇਂ ਸਰਕਾਉਣ ਨੂੰ ਵਰਤੋਂ +pdfjs-scroll-horizontal-button-label = ਲੇਟਵਾਂ ਸਰਕਾਉਣਾ +pdfjs-scroll-wrapped-button = + .title = ਸਮੇਟੇ ਸਰਕਾਉਣ ਨੂੰ ਵਰਤੋਂ +pdfjs-scroll-wrapped-button-label = ਸਮੇਟਿਆ ਸਰਕਾਉਣਾ +pdfjs-spread-none-button = + .title = ਸਫ਼ਾ ਫੈਲਾਅ ਵਿੱਚ ਸ਼ਾਮਲ ਨਾ ਹੋਵੋ +pdfjs-spread-none-button-label = ਕੋਈ ਫੈਲਾਅ ਨਹੀਂ +pdfjs-spread-odd-button = + .title = ਟਾਂਕ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ +pdfjs-spread-odd-button-label = ਟਾਂਕ ਫੈਲਾਅ +pdfjs-spread-even-button = + .title = ਜਿਸਤ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ +pdfjs-spread-even-button-label = ਜਿਸਤ ਫੈਲਾਅ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = …ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ +pdfjs-document-properties-button-label = …ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ +pdfjs-document-properties-file-name = ਫਾਈਲ ਦਾ ਨਾਂ: +pdfjs-document-properties-file-size = ਫਾਈਲ ਦਾ ਆਕਾਰ: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } ਬਾਈਟ) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ਬਾਈਟ) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ਬਾਈਟ) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ਬਾਈਟ) +pdfjs-document-properties-title = ਟਾਈਟਲ: +pdfjs-document-properties-author = ਲੇਖਕ: +pdfjs-document-properties-subject = ਵਿਸ਼ਾ: +pdfjs-document-properties-keywords = ਸ਼ਬਦ: +pdfjs-document-properties-creation-date = ਬਣਾਉਣ ਦੀ ਮਿਤੀ: +pdfjs-document-properties-modification-date = ਸੋਧ ਦੀ ਮਿਤੀ: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = ਨਿਰਮਾਤਾ: +pdfjs-document-properties-producer = PDF ਪ੍ਰੋਡਿਊਸਰ: +pdfjs-document-properties-version = PDF ਵਰਜਨ: +pdfjs-document-properties-page-count = ਸਫ਼ੇ ਦੀ ਗਿਣਤੀ: +pdfjs-document-properties-page-size = ਸਫ਼ਾ ਆਕਾਰ: +pdfjs-document-properties-page-size-unit-inches = ਇੰਚ +pdfjs-document-properties-page-size-unit-millimeters = ਮਿਮੀ +pdfjs-document-properties-page-size-orientation-portrait = ਪੋਰਟਰੇਟ +pdfjs-document-properties-page-size-orientation-landscape = ਲੈਂਡਸਕੇਪ +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = ਲੈਟਰ +pdfjs-document-properties-page-size-name-legal = ਕਨੂੰਨੀ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = ਤੇਜ਼ ਵੈੱਬ ਝਲਕ: +pdfjs-document-properties-linearized-yes = ਹਾਂ +pdfjs-document-properties-linearized-no = ਨਹੀਂ +pdfjs-document-properties-close-button = ਬੰਦ ਕਰੋ + +## Print + +pdfjs-print-progress-message = …ਪਰਿੰਟ ਕਰਨ ਲਈ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ਰੱਦ ਕਰੋ +pdfjs-printing-not-supported = ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। +pdfjs-printing-not-ready = ਸਾਵਧਾਨ: PDF ਨੂੰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ। + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = ਬਾਹੀ ਬਦਲੋ +pdfjs-toggle-sidebar-notification-button = + .title = ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਖਾਕਾ/ਅਟੈਚਮੈਂਟ/ਪਰਤਾਂ ਰੱਖਦਾ ਹੈ) +pdfjs-toggle-sidebar-button-label = ਬਾਹੀ ਬਦਲੋ +pdfjs-document-outline-button = + .title = ਦਸਤਾਵੇਜ਼ ਖਾਕਾ ਦਿਖਾਓ (ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਫੈਲਾਉਣ/ਸਮੇਟਣ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ) +pdfjs-document-outline-button-label = ਦਸਤਾਵੇਜ਼ ਖਾਕਾ +pdfjs-attachments-button = + .title = ਅਟੈਚਮੈਂਟ ਵੇਖਾਓ +pdfjs-attachments-button-label = ਅਟੈਚਮੈਂਟਾਂ +pdfjs-layers-button = + .title = ਪਰਤਾਂ ਵੇਖਾਓ (ਸਾਰੀਆਂ ਪਰਤਾਂ ਨੂੰ ਮੂਲ ਹਾਲਤ ਉੱਤੇ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ) +pdfjs-layers-button-label = ਪਰਤਾਂ +pdfjs-thumbs-button = + .title = ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ +pdfjs-thumbs-button-label = ਥੰਮਨੇਲ +pdfjs-current-outline-item-button = + .title = ਮੌੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼ ਲੱਭੋ +pdfjs-current-outline-item-button-label = ਮੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼ +pdfjs-findbar-button = + .title = ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ +pdfjs-findbar-button-label = ਲੱਭੋ +pdfjs-additional-layers = ਵਾਧੂ ਪਰਤਾਂ + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = ਸਫ਼ਾ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ + +## Find panel button title and messages + +pdfjs-find-input = + .title = ਲੱਭੋ + .placeholder = …ਦਸਤਾਵੇਜ਼ 'ਚ ਲੱਭੋ +pdfjs-find-previous-button = + .title = ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ +pdfjs-find-previous-button-label = ਪਿੱਛੇ +pdfjs-find-next-button = + .title = ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ +pdfjs-find-next-button-label = ਅੱਗੇ +pdfjs-find-highlight-checkbox = ਸਭ ਉਭਾਰੋ +pdfjs-find-match-case-checkbox-label = ਅੱਖਰ ਆਕਾਰ ਨੂੰ ਮਿਲਾਉ +pdfjs-find-match-diacritics-checkbox-label = ਭੇਦਸੂਚਕ ਮੇਲ +pdfjs-find-entire-word-checkbox-label = ਪੂਰੇ ਸ਼ਬਦ +pdfjs-find-reached-top = ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ +pdfjs-find-reached-bottom = ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $total } ਵਿੱਚੋਂ { $current } ਮੇਲ + *[other] { $total } ਵਿੱਚੋਂ { $current } ਮੇਲ + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] { $limit } ਤੋਂ ਵੱਧ ਮੇਲ + *[other] { $limit } ਤੋਂ ਵੱਧ ਮੇਲ + } +pdfjs-find-not-found = ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ + +## Predefined zoom values + +pdfjs-page-scale-width = ਸਫ਼ੇ ਦੀ ਚੌੜਾਈ +pdfjs-page-scale-fit = ਸਫ਼ਾ ਫਿੱਟ +pdfjs-page-scale-auto = ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ ਕਰੋ +pdfjs-page-scale-actual = ਆਟੋਮੈਟਿਕ ਆਕਾਰ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = ਸਫ਼ਾ { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। +pdfjs-invalid-file-error = ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ। +pdfjs-missing-file-error = ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ। +pdfjs-unexpected-response-error = ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ। +pdfjs-rendering-error = ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } ਵਿਆਖਿਆ] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = ਇਹ PDF ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ। +pdfjs-password-invalid = ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ। +pdfjs-password-ok-button = ਠੀਕ ਹੈ +pdfjs-password-cancel-button = ਰੱਦ ਕਰੋ +pdfjs-web-fonts-disabled = ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਨੂੰ ਵਰਤਣ ਲਈ ਅਸਮਰੱਥ ਹੈ। + +## Editing + +pdfjs-editor-free-text-button = + .title = ਲਿਖਤ +pdfjs-editor-free-text-button-label = ਲਿਖਤ +pdfjs-editor-ink-button = + .title = ਵਾਹੋ +pdfjs-editor-ink-button-label = ਵਾਹੋ +pdfjs-editor-stamp-button = + .title = ਚਿੱਤਰ ਜੋੜੋ ਜਾਂ ਸੋਧੋ +pdfjs-editor-stamp-button-label = ਚਿੱਤਰ ਜੋੜੋ ਜਾਂ ਸੋਧੋ +pdfjs-editor-highlight-button = + .title = ਹਾਈਲਾਈਟ +pdfjs-editor-highlight-button-label = ਹਾਈਲਾਈਟ +pdfjs-highlight-floating-button1 = + .title = ਹਾਈਲਾਈਟ + .aria-label = ਹਾਈਲਾਈਟ +pdfjs-highlight-floating-button-label = ਹਾਈਲਾਈਟ + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = ਡਰਾਇੰਗ ਨੂੰ ਹਟਾਓ +pdfjs-editor-remove-freetext-button = + .title = ਲਿਖਤ ਨੂੰ ਹਟਾਓ +pdfjs-editor-remove-stamp-button = + .title = ਚਿੱਤਰ ਨੂੰ ਹਟਾਓ +pdfjs-editor-remove-highlight-button = + .title = ਹਾਈਲਾਈਟ ਨੂੰ ਹਟਾਓ + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = ਰੰਗ +pdfjs-editor-free-text-size-input = ਆਕਾਰ +pdfjs-editor-ink-color-input = ਰੰਗ +pdfjs-editor-ink-thickness-input = ਮੋਟਾਈ +pdfjs-editor-ink-opacity-input = ਧੁੰਦਲਾਪਨ +pdfjs-editor-stamp-add-image-button = + .title = ਚਿੱਤਰ ਜੋੜੋ +pdfjs-editor-stamp-add-image-button-label = ਚਿੱਤਰ ਜੋੜੋ +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = ਮੋਟਾਈ +pdfjs-editor-free-highlight-thickness-title = + .title = ਚੀਜ਼ਾਂ ਨੂੰ ਹੋਰ ਲਿਖਤਾਂ ਤੋਂ ਉਘਾੜਨ ਸਮੇਂ ਮੋਟਾਈ ਨੂੰ ਬਦਲੋ +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = ਲਿਖਤ ਐਡੀਟਰ + .default-content = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ +pdfjs-free-text = + .aria-label = ਲਿਖਤ ਐਡੀਟਰ +pdfjs-free-text-default-content = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ +pdfjs-ink = + .aria-label = ਵਹਾਉਣ ਐਡੀਟਰ +pdfjs-ink-canvas = + .aria-label = ਵਰਤੋਂਕਾਰ ਵਲੋਂ ਬਣਾਇਆ ਚਿੱਤਰ + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = ਬਦਲਵੀਂ ਲਿਖਤ +pdfjs-editor-alt-text-edit-button = + .aria-label = ਬਦਲਵੀ ਲਿਖਤ ਨੂੰ ਸੋਧੋ +pdfjs-editor-alt-text-edit-button-label = ਬਦਲਵੀ ਲਿਖਤ ਨੂੰ ਸੋਧੋ +pdfjs-editor-alt-text-dialog-label = ਚੋਣ ਕਰੋ +pdfjs-editor-alt-text-dialog-description = ਚਿੱਤਰ ਨਾ ਦਿੱਸਣ ਜਾਂ ਲੋਡ ਨਾ ਹੋਣ ਦੀ ਹਾਲਤ ਵਿੱਚ Alt ਲਿਖਤ (ਬਦਲਵੀਂ ਲਿਖਤ) ਲੋਕਾਂ ਲਈ ਮਦਦਗਾਰ ਹੁੰਦੀ ਹੈ। +pdfjs-editor-alt-text-add-description-label = ਵਰਣਨ ਜੋੜੋ +pdfjs-editor-alt-text-add-description-description = 1-2 ਵਾਕ ਰੱਖੋ, ਜੋ ਕਿ ਵਿਸ਼ੇ, ਸੈਟਿੰਗ ਜਾਂ ਕਾਰਵਾਈਆਂ ਬਾਰੇ ਦਰਸਾਉਂਦੇ ਹੋਣ। +pdfjs-editor-alt-text-mark-decorative-label = ਸਜਾਵਟ ਵਜੋਂ ਨਿਸ਼ਾਨ ਲਾਇਆ +pdfjs-editor-alt-text-mark-decorative-description = ਇਸ ਨੂੰ ਸਜਾਵਟੀ ਚਿੱਤਰਾਂ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਜਿਵੇਂ ਕਿ ਹਾਸ਼ੀਆ ਜਾਂ ਵਾਟਰਮਾਰਕ ਆਦਿ। +pdfjs-editor-alt-text-cancel-button = ਰੱਦ ਕਰੋ +pdfjs-editor-alt-text-save-button = ਸੰਭਾਲੋ +pdfjs-editor-alt-text-decorative-tooltip = ਸਜਾਵਟ ਵਜੋਂ ਨਿਸ਼ਾਨ ਲਾਓ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = ਮਿਸਾਲ ਵਜੋਂ, “ਗੱਭਰੂ ਭੋਜਨ ਲੈ ਕੇ ਮੇਜ਼ ਉੱਤੇ ਬੈਠਾ ਹੈ” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = ਬਦਲਵੀਂ ਲਿਖਤ + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = ਉੱਤੇ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-top-middle = ਉੱਤੇ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-top-right = ਉੱਤੇ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-middle-right = ਮੱਧ ਸੱਜਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-bottom-right = ਹੇਠਾਂ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-bottom-middle = ਹੇਠਾਂ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-bottom-left = ਹੇਠਾਂ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-label-middle-left = ਮੱਧ ਖੱਬਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-top-left = + .aria-label = ਉੱਤੇ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-top-middle = + .aria-label = ਉੱਤੇ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-top-right = + .aria-label = ਉੱਤੇ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-middle-right = + .aria-label = ਮੱਧ ਸੱਜਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-bottom-right = + .aria-label = ਹੇਠਾਂ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-bottom-middle = + .aria-label = ਹੇਠਾਂ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-bottom-left = + .aria-label = ਹੇਠਾਂ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-middle-left = + .aria-label = ਮੱਧ ਖੱਬਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = ਹਾਈਟਲਾਈਟ ਦਾ ਰੰਗ +pdfjs-editor-colorpicker-button = + .title = ਰੰਗ ਨੂੰ ਬਦਲੋ +pdfjs-editor-colorpicker-dropdown = + .aria-label = ਰੰਗ ਚੋਣਾਂ +pdfjs-editor-colorpicker-yellow = + .title = ਪੀਲਾ +pdfjs-editor-colorpicker-green = + .title = ਹਰਾ +pdfjs-editor-colorpicker-blue = + .title = ਨੀਲਾ +pdfjs-editor-colorpicker-pink = + .title = ਗੁਲਾਬੀ +pdfjs-editor-colorpicker-red = + .title = ਲਾਲ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = ਸਭ ਵੇਖੋ +pdfjs-editor-highlight-show-all-button = + .title = ਸਭ ਵੇਖੋ + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = ਬਦਲਵੀਂ ਲਿਖਤ (ਚਿੱਤਰ ਦਾ ਵਰਣਨ) ਨੂੰ ਸੋਧੋ +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = ਬਦਲਵੀਂ ਲਿਖਤ (ਚਿੱਤਰ ਦਾ ਵਰਣਨ) ਨੂੰ ਜੋੜੋ +pdfjs-editor-new-alt-text-textarea = + .placeholder = …ਆਪਣਾ ਵਰਣਨਾ ਇੱਥੇ ਲਿਖੋ +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = ਲੋਕ, ਜੋ ਕਿ ਚਿੱਤਰ ਨਹੀਂ ਵੇਖ ਸਕਦੇ ਜਾਂ ਜਦ ਵੀ ਚਿੱਤਰਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਉਸ ਲਈ ਛੋਟਾ ਵੇਰਵਾ ਦਿਓ। +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ਇਹ ਬਦਲਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਤਿਆਰ ਕੀਤੀ ਗਈ ਸੀ ਅਤੇ ਗਲਤ ਵੀ ਹੋ ਸਕਦੀ ਹੈ। +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ਹੋਰ ਜਾਣੋ +pdfjs-editor-new-alt-text-create-automatically-button-label = ਬਲਦਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਬਣਾਓ +pdfjs-editor-new-alt-text-not-now-button = ਹੁਣੇ ਨਹੀਂ +pdfjs-editor-new-alt-text-error-title = ਬਦਲਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ +pdfjs-editor-new-alt-text-error-description = ਆਪਣਾ ਖੁਦ ਦੀ ਬਦਲਵੀਂ ਲਿਖਤ ਲਿਖੋ ਜਾਂ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-editor-new-alt-text-error-close-button = ਬੰਦ ਕਰੋ +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = ਬਦਲਵਾਂ ਲਿਖਤ AI ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ ({ $totalSize } MB ਵਿੱਚੋਂ { $downloadedSize }) + .aria-valuetext = ਬਦਲਵਾਂ ਲਿਖਤ AI ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ ({ $totalSize } MB ਵਿੱਚੋਂ { $downloadedSize }) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = ਬਦਲਵੀਂ ਲਿਖਤ ਜੋੜੀ +pdfjs-editor-new-alt-text-added-button-label = ਬਦਲਵੀਂ ਲਿਖਤ ਜੋੜੀ +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = ਬਦਲਵਾਂ ਲਿਖਤ ਗੁੰਮ ਹੈ +pdfjs-editor-new-alt-text-missing-button-label = ਬਦਲਵਾਂ ਲਿਖਤ ਗੁੰਮ ਹੈ +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = ਬਦਲਵੀਂ ਲਿਖਤ ਦਾ ਰੀਵਿਊ ਕਰੋ +pdfjs-editor-new-alt-text-to-review-button-label = ਬਦਲਵੀਂ ਲਿਖਤ ਦਾ ਰੀਵਿਊ ਕਰੋ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = ਆਪਣੇ-ਆਪ ਬਣਾਇਆ: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = ਚਿੱਤਰ ਬਦਲਵੀਂ ਲਿਖਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ +pdfjs-image-alt-text-settings-button-label = ਚਿੱਤਰ ਬਦਲਵੀਂ ਲਿਖਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ +pdfjs-editor-alt-text-settings-dialog-label = ਚਿੱਤਰ ਬਦਲਵੀਂ ਲਿਖਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ +pdfjs-editor-alt-text-settings-automatic-title = ਆਟੋਮਮੈਟਿਕ ਬਦਲਵੀਂ ਲਿਖਤ +pdfjs-editor-alt-text-settings-create-model-button-label = ਬਲਦਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਬਣਾਓ +pdfjs-editor-alt-text-settings-create-model-description = ਚਿੱਤਰ ਨਾ ਵੇਖ ਸਕਣ ਵਾਲੇ ਲੋਕਾਂ ਦੀ ਮਦਦ ਜਾਂ ਜਦ ਵੀ ਚਿੱਤਰਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਉਸ ਲਈ ਛੋਟਾ ਵੇਰਵਾ ਦਿਓ। +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = ਬਦਲਵੀ ਲਿਖਤ ਲਈ AI ਮਾਡਲ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਉੱਤੇ ਲੋਕਲ ਹੀ ਚੱਲਦਾ ਹੋਣ ਕਰਕੇ ਤੁਹਾਡਾ ਡਾਟਾ ਪ੍ਰਾਈਵੇਟ ਹੀ ਰਹਿੰਦਾ ਹੈ। ਆਟੋਮੈਟਿਕ ਬਦਲਵੀਂ ਲਿਖਤ ਲਈ ਚਾਹੀਦਾ ਹੈ। +pdfjs-editor-alt-text-settings-delete-model-button = ਹਟਾਓ +pdfjs-editor-alt-text-settings-download-model-button = ਡਾਊਨਲੋਡ +pdfjs-editor-alt-text-settings-downloading-model-button = …ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +pdfjs-editor-alt-text-settings-editor-title = ਬਦਲਵੀਂ ਲਿਖਤ ਐਡੀਟਰ +pdfjs-editor-alt-text-settings-show-dialog-button-label = ਜਦੋਂ ਵਿੱਚ ਚਿੱਤਰ ਜੋੜਿਆ ਜਾਵੇ ਤਾਂ ਫ਼ੌਰਨ ਬਦਲਵੀ ਲਿਖਤ ਸੰਪਾਦਕ ਵੇਖਾਓ +pdfjs-editor-alt-text-settings-show-dialog-description = ਤੁਹਾਡੀ ਮਦਦ ਕਰਦਾ ਹੈ ਕਿ ਤੁਹਾਡੇ ਸਾਰੇ ਚਿੱਤਰਾਂ ਲਈ ਬਦਲਵੀਂ ਲਿਖਤ ਮੌਜੂਦ ਹੋਵੇ। +pdfjs-editor-alt-text-settings-close-button = ਬੰਦ ਕਰੋ + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = ਹਾਈਲਾਈਟ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-freetext = ਲਿਖਤ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-ink = ਡਰਾਇੰਗ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-stamp = ਚਿੱਤਰ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } ਵਿਆਖਿਆ ਨੂੰ ਹਟਾਇਆ + *[other] { $count } ਵਿਆਖਿਆਵਾਂ ਨੂੰ ਹਟਾਇਆ + } +pdfjs-editor-undo-bar-undo-button = + .title = ਵਾਪਸ +pdfjs-editor-undo-bar-undo-button-label = ਵਾਪਸ +pdfjs-editor-undo-bar-close-button = + .title = ਬੰਦ ਕਰੋ +pdfjs-editor-undo-bar-close-button-label = ਬੰਦ ਕਰੋ diff --git a/public/pdfjs/web/locale/pl/viewer.ftl b/public/pdfjs/web/locale/pl/viewer.ftl new file mode 100644 index 0000000..07f9416 --- /dev/null +++ b/public/pdfjs/web/locale/pl/viewer.ftl @@ -0,0 +1,518 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Poprzednia strona +pdfjs-previous-button-label = Poprzednia +pdfjs-next-button = + .title = Następna strona +pdfjs-next-button-label = Następna +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Strona +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = z { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount }) +pdfjs-zoom-out-button = + .title = Pomniejsz +pdfjs-zoom-out-button-label = Pomniejsz +pdfjs-zoom-in-button = + .title = Powiększ +pdfjs-zoom-in-button-label = Powiększ +pdfjs-zoom-select = + .title = Skala +pdfjs-presentation-mode-button = + .title = Przełącz na tryb prezentacji +pdfjs-presentation-mode-button-label = Tryb prezentacji +pdfjs-open-file-button = + .title = Otwórz plik +pdfjs-open-file-button-label = Otwórz +pdfjs-print-button = + .title = Drukuj +pdfjs-print-button-label = Drukuj +pdfjs-save-button = + .title = Zapisz +pdfjs-save-button-label = Zapisz +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Pobierz +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Pobierz +pdfjs-bookmark-button = + .title = Bieżąca strona (adres do otwarcia na bieżącej stronie) +pdfjs-bookmark-button-label = Bieżąca strona + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Narzędzia +pdfjs-tools-button-label = Narzędzia +pdfjs-first-page-button = + .title = Przejdź do pierwszej strony +pdfjs-first-page-button-label = Przejdź do pierwszej strony +pdfjs-last-page-button = + .title = Przejdź do ostatniej strony +pdfjs-last-page-button-label = Przejdź do ostatniej strony +pdfjs-page-rotate-cw-button = + .title = Obróć zgodnie z ruchem wskazówek zegara +pdfjs-page-rotate-cw-button-label = Obróć zgodnie z ruchem wskazówek zegara +pdfjs-page-rotate-ccw-button = + .title = Obróć przeciwnie do ruchu wskazówek zegara +pdfjs-page-rotate-ccw-button-label = Obróć przeciwnie do ruchu wskazówek zegara +pdfjs-cursor-text-select-tool-button = + .title = Włącz narzędzie zaznaczania tekstu +pdfjs-cursor-text-select-tool-button-label = Narzędzie zaznaczania tekstu +pdfjs-cursor-hand-tool-button = + .title = Włącz narzędzie rączka +pdfjs-cursor-hand-tool-button-label = Narzędzie rączka +pdfjs-scroll-page-button = + .title = Przewijaj strony +pdfjs-scroll-page-button-label = Przewijanie stron +pdfjs-scroll-vertical-button = + .title = Przewijaj dokument w pionie +pdfjs-scroll-vertical-button-label = Przewijanie pionowe +pdfjs-scroll-horizontal-button = + .title = Przewijaj dokument w poziomie +pdfjs-scroll-horizontal-button-label = Przewijanie poziome +pdfjs-scroll-wrapped-button = + .title = Strony dokumentu wyświetlaj i przewijaj w kolumnach +pdfjs-scroll-wrapped-button-label = Widok dwóch stron +pdfjs-spread-none-button = + .title = Nie ustawiaj stron obok siebie +pdfjs-spread-none-button-label = Brak kolumn +pdfjs-spread-odd-button = + .title = Strony nieparzyste ustawiaj na lewo od parzystych +pdfjs-spread-odd-button-label = Nieparzyste po lewej +pdfjs-spread-even-button = + .title = Strony parzyste ustawiaj na lewo od nieparzystych +pdfjs-spread-even-button-label = Parzyste po lewej + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Właściwości dokumentu… +pdfjs-document-properties-button-label = Właściwości dokumentu… +pdfjs-document-properties-file-name = Nazwa pliku: +pdfjs-document-properties-file-size = Rozmiar pliku: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } B) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } B) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) +pdfjs-document-properties-title = Tytuł: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Temat: +pdfjs-document-properties-keywords = Słowa kluczowe: +pdfjs-document-properties-creation-date = Data utworzenia: +pdfjs-document-properties-modification-date = Data modyfikacji: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Utworzony przez: +pdfjs-document-properties-producer = PDF wyprodukowany przez: +pdfjs-document-properties-version = Wersja PDF: +pdfjs-document-properties-page-count = Liczba stron: +pdfjs-document-properties-page-size = Wymiary strony: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = pionowa +pdfjs-document-properties-page-size-orientation-landscape = pozioma +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = US Letter +pdfjs-document-properties-page-size-name-legal = US Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width }×{ $height } { $unit } (orientacja { $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width }×{ $height } { $unit } ({ $name }, orientacja { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Szybki podgląd w Internecie: +pdfjs-document-properties-linearized-yes = tak +pdfjs-document-properties-linearized-no = nie +pdfjs-document-properties-close-button = Zamknij + +## Print + +pdfjs-print-progress-message = Przygotowywanie dokumentu do druku… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Anuluj +pdfjs-printing-not-supported = Ostrzeżenie: drukowanie nie jest w pełni obsługiwane przez tę przeglądarkę. +pdfjs-printing-not-ready = Ostrzeżenie: dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Przełącz panel boczny +pdfjs-toggle-sidebar-notification-button = + .title = Przełącz panel boczny (dokument zawiera konspekt/załączniki/warstwy) +pdfjs-toggle-sidebar-button-label = Przełącz panel boczny +pdfjs-document-outline-button = + .title = Konspekt dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje) +pdfjs-document-outline-button-label = Konspekt dokumentu +pdfjs-attachments-button = + .title = Załączniki +pdfjs-attachments-button-label = Załączniki +pdfjs-layers-button = + .title = Warstwy (podwójne kliknięcie przywraca wszystkie warstwy do stanu domyślnego) +pdfjs-layers-button-label = Warstwy +pdfjs-thumbs-button = + .title = Miniatury +pdfjs-thumbs-button-label = Miniatury +pdfjs-current-outline-item-button = + .title = Znajdź bieżący element konspektu +pdfjs-current-outline-item-button-label = Bieżący element konspektu +pdfjs-findbar-button = + .title = Znajdź w dokumencie +pdfjs-findbar-button-label = Znajdź +pdfjs-additional-layers = Dodatkowe warstwy + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page }. strona +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura { $page }. strony + +## Find panel button title and messages + +pdfjs-find-input = + .title = Znajdź + .placeholder = Znajdź w dokumencie… +pdfjs-find-previous-button = + .title = Znajdź poprzednie wystąpienie tekstu +pdfjs-find-previous-button-label = Poprzednie +pdfjs-find-next-button = + .title = Znajdź następne wystąpienie tekstu +pdfjs-find-next-button-label = Następne +pdfjs-find-highlight-checkbox = Wyróżnianie wszystkich +pdfjs-find-match-case-checkbox-label = Rozróżnianie wielkości liter +pdfjs-find-match-diacritics-checkbox-label = Rozróżnianie liter diakrytyzowanych +pdfjs-find-entire-word-checkbox-label = Całe słowa +pdfjs-find-reached-top = Początek dokumentu. Wyszukiwanie od końca. +pdfjs-find-reached-bottom = Koniec dokumentu. Wyszukiwanie od początku. +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current }. z { $total } trafienia + [few] { $current }. z { $total } trafień + *[many] { $current }. z { $total } trafień + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Więcej niż { $limit } trafienie + [few] Więcej niż { $limit } trafienia + *[many] Więcej niż { $limit } trafień + } +pdfjs-find-not-found = Nie znaleziono tekstu + +## Predefined zoom values + +pdfjs-page-scale-width = Szerokość strony +pdfjs-page-scale-fit = Dopasowanie strony +pdfjs-page-scale-auto = Skala automatyczna +pdfjs-page-scale-actual = Rozmiar oryginalny +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page }. strona + +## Loading indicator messages + +pdfjs-loading-error = Podczas wczytywania dokumentu PDF wystąpił błąd. +pdfjs-invalid-file-error = Nieprawidłowy lub uszkodzony plik PDF. +pdfjs-missing-file-error = Brak pliku PDF. +pdfjs-unexpected-response-error = Nieoczekiwana odpowiedź serwera. +pdfjs-rendering-error = Podczas renderowania strony wystąpił błąd. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Przypis: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Wprowadź hasło, aby otworzyć ten dokument PDF. +pdfjs-password-invalid = Nieprawidłowe hasło. Proszę spróbować ponownie. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Anuluj +pdfjs-web-fonts-disabled = Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Rysunek +pdfjs-editor-ink-button-label = Rysunek +pdfjs-editor-stamp-button = + .title = Dodaj lub edytuj obrazy +pdfjs-editor-stamp-button-label = Dodaj lub edytuj obrazy +pdfjs-editor-highlight-button = + .title = Wyróżnij +pdfjs-editor-highlight-button-label = Wyróżnij +pdfjs-highlight-floating-button1 = + .title = Wyróżnij + .aria-label = Wyróżnij +pdfjs-highlight-floating-button-label = Wyróżnij + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Usuń rysunek +pdfjs-editor-remove-freetext-button = + .title = Usuń tekst +pdfjs-editor-remove-stamp-button = + .title = Usuń obraz +pdfjs-editor-remove-highlight-button = + .title = Usuń wyróżnienie + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Kolor +pdfjs-editor-free-text-size-input = Rozmiar +pdfjs-editor-ink-color-input = Kolor +pdfjs-editor-ink-thickness-input = Grubość +pdfjs-editor-ink-opacity-input = Nieprzezroczystość +pdfjs-editor-stamp-add-image-button = + .title = Dodaj obraz +pdfjs-editor-stamp-add-image-button-label = Dodaj obraz +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grubość +pdfjs-editor-free-highlight-thickness-title = + .title = Zmień grubość podczas wyróżniania elementów innych niż tekst +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Edytor tekstu + .default-content = Zacznij pisać… +pdfjs-free-text = + .aria-label = Edytor tekstu +pdfjs-free-text-default-content = Zacznij pisać… +pdfjs-ink = + .aria-label = Edytor rysunku +pdfjs-ink-canvas = + .aria-label = Obraz utworzony przez użytkownika + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Tekst alternatywny +pdfjs-editor-alt-text-edit-button = + .aria-label = Edytuj tekst alternatywny +pdfjs-editor-alt-text-edit-button-label = Edytuj tekst alternatywny +pdfjs-editor-alt-text-dialog-label = Wybierz opcję +pdfjs-editor-alt-text-dialog-description = Tekst alternatywny pomaga, kiedy ktoś nie może zobaczyć obrazu lub gdy się nie wczytuje. +pdfjs-editor-alt-text-add-description-label = Dodaj opis +pdfjs-editor-alt-text-add-description-description = Staraj się napisać 1-2 zdania opisujące temat, miejsce lub działania. +pdfjs-editor-alt-text-mark-decorative-label = Oznacz jako dekoracyjne +pdfjs-editor-alt-text-mark-decorative-description = Używane w przypadku obrazów ozdobnych, takich jak obramowania lub znaki wodne. +pdfjs-editor-alt-text-cancel-button = Anuluj +pdfjs-editor-alt-text-save-button = Zapisz +pdfjs-editor-alt-text-decorative-tooltip = Oznaczone jako dekoracyjne +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na przykład: „Młody człowiek siada przy stole, aby zjeść posiłek” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Tekst alternatywny + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Lewy górny róg — zmień rozmiar +pdfjs-editor-resizer-label-top-middle = Górny środkowy — zmień rozmiar +pdfjs-editor-resizer-label-top-right = Prawy górny róg — zmień rozmiar +pdfjs-editor-resizer-label-middle-right = Prawy środkowy — zmień rozmiar +pdfjs-editor-resizer-label-bottom-right = Prawy dolny róg — zmień rozmiar +pdfjs-editor-resizer-label-bottom-middle = Dolny środkowy — zmień rozmiar +pdfjs-editor-resizer-label-bottom-left = Lewy dolny róg — zmień rozmiar +pdfjs-editor-resizer-label-middle-left = Lewy środkowy — zmień rozmiar +pdfjs-editor-resizer-top-left = + .aria-label = Lewy górny róg — zmień rozmiar +pdfjs-editor-resizer-top-middle = + .aria-label = Górny środkowy — zmień rozmiar +pdfjs-editor-resizer-top-right = + .aria-label = Prawy górny róg — zmień rozmiar +pdfjs-editor-resizer-middle-right = + .aria-label = Prawy środkowy — zmień rozmiar +pdfjs-editor-resizer-bottom-right = + .aria-label = Prawy dolny róg — zmień rozmiar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Dolny środkowy — zmień rozmiar +pdfjs-editor-resizer-bottom-left = + .aria-label = Lewy dolny róg — zmień rozmiar +pdfjs-editor-resizer-middle-left = + .aria-label = Lewy środkowy — zmień rozmiar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Kolor wyróżnienia +pdfjs-editor-colorpicker-button = + .title = Zmień kolor +pdfjs-editor-colorpicker-dropdown = + .aria-label = Wybór kolorów +pdfjs-editor-colorpicker-yellow = + .title = Żółty +pdfjs-editor-colorpicker-green = + .title = Zielony +pdfjs-editor-colorpicker-blue = + .title = Niebieski +pdfjs-editor-colorpicker-pink = + .title = Różowy +pdfjs-editor-colorpicker-red = + .title = Czerwony + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Pokaż wszystkie +pdfjs-editor-highlight-show-all-button = + .title = Pokaż wszystkie + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edytuj tekst alternatywny (opis obrazu) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Dodaj tekst alternatywny (opis obrazu) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Napisz tutaj opis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krótki opis dla osób, które nie widzą obrazu lub kiedy obraz się nie wczytuje. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ten tekst alternatywny został utworzony automatycznie i może być niepoprawny. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Więcej informacji +pdfjs-editor-new-alt-text-create-automatically-button-label = Automatycznie utwórz tekst alternatywny +pdfjs-editor-new-alt-text-not-now-button = Nie teraz +pdfjs-editor-new-alt-text-error-title = Nie można automatycznie utworzyć tekstu alternatywnego +pdfjs-editor-new-alt-text-error-description = Proszę napisać własny tekst alternatywny lub spróbować ponownie później. +pdfjs-editor-new-alt-text-error-close-button = Zamknij +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Pobieranie modelu SI tekstu alternatywnego ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Pobieranie modelu SI tekstu alternatywnego ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Dodano tekst alternatywny +pdfjs-editor-new-alt-text-added-button-label = Dodano tekst alternatywny +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Brak tekstu alternatywnego +pdfjs-editor-new-alt-text-missing-button-label = Brak tekstu alternatywnego +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Przejrzyj tekst alternatywny +pdfjs-editor-new-alt-text-to-review-button-label = Przejrzyj tekst alternatywny +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Utworzono automatycznie: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ustawienia tekstu alternatywnego obrazów +pdfjs-image-alt-text-settings-button-label = Ustawienia tekstu alternatywnego obrazów +pdfjs-editor-alt-text-settings-dialog-label = Ustawienia tekstu alternatywnego obrazów +pdfjs-editor-alt-text-settings-automatic-title = Automatyczny tekst alternatywny +pdfjs-editor-alt-text-settings-create-model-button-label = Automatyczne tworzenie tekstu alternatywnego +pdfjs-editor-alt-text-settings-create-model-description = Podpowiada opisy, które mogą pomóc osobom, które nie widzą obrazu lub kiedy obraz się nie wczytuje. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model SI tekstu alternatywnego ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Działa lokalnie na urządzeniu użytkownika, więc Twoje dane pozostają prywatne. Wymagane do funkcji automatycznego tekstu alternatywnego. +pdfjs-editor-alt-text-settings-delete-model-button = Usuń +pdfjs-editor-alt-text-settings-download-model-button = Pobierz +pdfjs-editor-alt-text-settings-downloading-model-button = Pobieranie… +pdfjs-editor-alt-text-settings-editor-title = Edytor tekstu alternatywnego +pdfjs-editor-alt-text-settings-show-dialog-button-label = Wyświetlanie edytora tekstu alternatywnego od razu po dodaniu obrazu +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga upewnić się, że wszystkie obrazy mają tekst alternatywny. +pdfjs-editor-alt-text-settings-close-button = Zamknij + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Usunięto wyróżnienie +pdfjs-editor-undo-bar-message-freetext = Usunięto tekst +pdfjs-editor-undo-bar-message-ink = Usunięto rysunek +pdfjs-editor-undo-bar-message-stamp = Usunięto obraz +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Usunięto przypis + [few] Usunięto { $count } przypisy + *[many] Usunięto { $count } przypisów + } +pdfjs-editor-undo-bar-undo-button = + .title = Cofnij +pdfjs-editor-undo-bar-undo-button-label = Cofnij +pdfjs-editor-undo-bar-close-button = + .title = Zamknij +pdfjs-editor-undo-bar-close-button-label = Zamknij diff --git a/public/pdfjs/web/locale/pt-BR/viewer.ftl b/public/pdfjs/web/locale/pt-BR/viewer.ftl new file mode 100644 index 0000000..7da5201 --- /dev/null +++ b/public/pdfjs/web/locale/pt-BR/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Próxima página +pdfjs-next-button-label = Próxima +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Página +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Reduzir +pdfjs-zoom-out-button-label = Reduzir +pdfjs-zoom-in-button = + .title = Ampliar +pdfjs-zoom-in-button-label = Ampliar +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Mudar para o modo de apresentação +pdfjs-presentation-mode-button-label = Modo de apresentação +pdfjs-open-file-button = + .title = Abrir arquivo +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Salvar +pdfjs-save-button-label = Salvar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Baixar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Baixar +pdfjs-bookmark-button = + .title = Página atual (ver URL da página atual) +pdfjs-bookmark-button-label = Pagina atual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ferramentas +pdfjs-tools-button-label = Ferramentas +pdfjs-first-page-button = + .title = Ir para a primeira página +pdfjs-first-page-button-label = Ir para a primeira página +pdfjs-last-page-button = + .title = Ir para a última página +pdfjs-last-page-button-label = Ir para a última página +pdfjs-page-rotate-cw-button = + .title = Girar no sentido horário +pdfjs-page-rotate-cw-button-label = Girar no sentido horário +pdfjs-page-rotate-ccw-button = + .title = Girar no sentido anti-horário +pdfjs-page-rotate-ccw-button-label = Girar no sentido anti-horário +pdfjs-cursor-text-select-tool-button = + .title = Ativar a ferramenta de seleção de texto +pdfjs-cursor-text-select-tool-button-label = Ferramenta de seleção de texto +pdfjs-cursor-hand-tool-button = + .title = Ativar ferramenta de deslocamento +pdfjs-cursor-hand-tool-button-label = Ferramenta de deslocamento +pdfjs-scroll-page-button = + .title = Usar rolagem de página +pdfjs-scroll-page-button-label = Rolagem de página +pdfjs-scroll-vertical-button = + .title = Usar deslocamento vertical +pdfjs-scroll-vertical-button-label = Deslocamento vertical +pdfjs-scroll-horizontal-button = + .title = Usar deslocamento horizontal +pdfjs-scroll-horizontal-button-label = Deslocamento horizontal +pdfjs-scroll-wrapped-button = + .title = Usar deslocamento contido +pdfjs-scroll-wrapped-button-label = Deslocamento contido +pdfjs-spread-none-button = + .title = Não reagrupar páginas +pdfjs-spread-none-button-label = Não estender +pdfjs-spread-odd-button = + .title = Agrupar páginas começando em páginas com números ímpares +pdfjs-spread-odd-button-label = Estender ímpares +pdfjs-spread-even-button = + .title = Agrupar páginas começando em páginas com números pares +pdfjs-spread-even-button-label = Estender pares + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propriedades do documento… +pdfjs-document-properties-button-label = Propriedades do documento… +pdfjs-document-properties-file-name = Nome do arquivo: +pdfjs-document-properties-file-size = Tamanho do arquivo: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Assunto: +pdfjs-document-properties-keywords = Palavras-chave: +pdfjs-document-properties-creation-date = Data da criação: +pdfjs-document-properties-modification-date = Data da modificação: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Criação: +pdfjs-document-properties-producer = Criador do PDF: +pdfjs-document-properties-version = Versão do PDF: +pdfjs-document-properties-page-count = Número de páginas: +pdfjs-document-properties-page-size = Tamanho da página: +pdfjs-document-properties-page-size-unit-inches = pol. +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = retrato +pdfjs-document-properties-page-size-orientation-landscape = paisagem +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Jurídico + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Exibição web rápida: +pdfjs-document-properties-linearized-yes = Sim +pdfjs-document-properties-linearized-no = Não +pdfjs-document-properties-close-button = Fechar + +## Print + +pdfjs-print-progress-message = Preparando documento para impressão… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Aviso: a impressão não é totalmente suportada neste navegador. +pdfjs-printing-not-ready = Aviso: o PDF não está totalmente carregado para impressão. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Exibir/ocultar painel lateral +pdfjs-toggle-sidebar-notification-button = + .title = Exibir/ocultar painel lateral (documento contém estrutura/anexos/camadas) +pdfjs-toggle-sidebar-button-label = Exibir/ocultar painel lateral +pdfjs-document-outline-button = + .title = Mostrar estrutura do documento (duplo-clique expande/recolhe todos os itens) +pdfjs-document-outline-button-label = Estrutura do documento +pdfjs-attachments-button = + .title = Mostrar anexos +pdfjs-attachments-button-label = Anexos +pdfjs-layers-button = + .title = Mostrar camadas (duplo-clique redefine todas as camadas ao estado predefinido) +pdfjs-layers-button-label = Camadas +pdfjs-thumbs-button = + .title = Mostrar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Encontrar item atual da estrutura +pdfjs-current-outline-item-button-label = Item atual da estrutura +pdfjs-findbar-button = + .title = Procurar no documento +pdfjs-findbar-button-label = Procurar +pdfjs-additional-layers = Camadas adicionais + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura da página { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Procurar + .placeholder = Procurar no documento… +pdfjs-find-previous-button = + .title = Procurar a ocorrência anterior da frase +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Procurar a próxima ocorrência da frase +pdfjs-find-next-button-label = Próxima +pdfjs-find-highlight-checkbox = Destacar tudo +pdfjs-find-match-case-checkbox-label = Diferenciar maiúsculas/minúsculas +pdfjs-find-match-diacritics-checkbox-label = Considerar acentuação +pdfjs-find-entire-word-checkbox-label = Palavras completas +pdfjs-find-reached-top = Início do documento alcançado, continuando do fim +pdfjs-find-reached-bottom = Fim do documento alcançado, continuando do início +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } ocorrência + *[other] { $current } de { $total } ocorrências + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mais de { $limit } ocorrência + *[other] Mais de { $limit } ocorrências + } +pdfjs-find-not-found = Não encontrado + +## Predefined zoom values + +pdfjs-page-scale-width = Largura da página +pdfjs-page-scale-fit = Ajustar à janela +pdfjs-page-scale-auto = Zoom automático +pdfjs-page-scale-actual = Tamanho real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Página { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ocorreu um erro ao carregar o PDF. +pdfjs-invalid-file-error = Arquivo PDF corrompido ou inválido. +pdfjs-missing-file-error = Arquivo PDF ausente. +pdfjs-unexpected-response-error = Resposta inesperada do servidor. +pdfjs-rendering-error = Ocorreu um erro ao renderizar a página. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotação { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Forneça a senha para abrir este arquivo PDF. +pdfjs-password-invalid = Senha inválida. Tente novamente. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = As fontes web estão desativadas: não foi possível usar fontes incorporadas do PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Desenho +pdfjs-editor-ink-button-label = Desenho +pdfjs-editor-stamp-button = + .title = Adicionar ou editar imagens +pdfjs-editor-stamp-button-label = Adicionar ou editar imagens +pdfjs-editor-highlight-button = + .title = Destaque +pdfjs-editor-highlight-button-label = Destaque +pdfjs-highlight-floating-button1 = + .title = Destaque + .aria-label = Destaque +pdfjs-highlight-floating-button-label = Destaque + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Remover desenho +pdfjs-editor-remove-freetext-button = + .title = Remover texto +pdfjs-editor-remove-stamp-button = + .title = Remover imagem +pdfjs-editor-remove-highlight-button = + .title = Remover destaque + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Cor +pdfjs-editor-free-text-size-input = Tamanho +pdfjs-editor-ink-color-input = Cor +pdfjs-editor-ink-thickness-input = Espessura +pdfjs-editor-ink-opacity-input = Opacidade +pdfjs-editor-stamp-add-image-button = + .title = Adicionar imagem +pdfjs-editor-stamp-add-image-button-label = Adicionar imagem +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Espessura +pdfjs-editor-free-highlight-thickness-title = + .title = Mudar espessura ao destacar itens que não são texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Comece a digitar… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Comece digitando… +pdfjs-ink = + .aria-label = Editor de desenho +pdfjs-ink-canvas = + .aria-label = Imagem criada pelo usuário + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-dialog-label = Escolha uma opção +pdfjs-editor-alt-text-dialog-description = O texto alternativo ajuda quando uma imagem não aparece ou não é carregada. +pdfjs-editor-alt-text-add-description-label = Adicionar uma descrição +pdfjs-editor-alt-text-add-description-description = Procure usar uma ou duas frases que descrevam o assunto, cenário ou ação. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa +pdfjs-editor-alt-text-mark-decorative-description = Isto é usado em imagens ornamentais, como bordas ou marcas d'água. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Salvar +pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativa +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por exemplo, “Um jovem senta-se à mesa para comer uma refeição” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Canto superior esquerdo — redimensionar +pdfjs-editor-resizer-label-top-middle = No centro do topo — redimensionar +pdfjs-editor-resizer-label-top-right = Canto superior direito — redimensionar +pdfjs-editor-resizer-label-middle-right = No meio à direita — redimensionar +pdfjs-editor-resizer-label-bottom-right = Canto inferior direito — redimensionar +pdfjs-editor-resizer-label-bottom-middle = No centro da base — redimensionar +pdfjs-editor-resizer-label-bottom-left = Canto inferior esquerdo — redimensionar +pdfjs-editor-resizer-label-middle-left = No meio à esquerda — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Canto superior esquerdo — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = No centro do topo — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Canto superior direito — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = No meio à direita — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Canto inferior direito — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = No centro da base — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Canto inferior esquerdo — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = No meio à esquerda — redimensionar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Cor de destaque +pdfjs-editor-colorpicker-button = + .title = Mudar cor +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opções de cores +pdfjs-editor-colorpicker-yellow = + .title = Amarelo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Vermelho + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar todos +pdfjs-editor-highlight-show-all-button = + .title = Mostrar todos + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descrição da imagem) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adicionar texto alternativo (descrição da imagem) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escreva sua descrição aqui… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Descrição curta para pessoas que não conseguem ver a imagem ou quando a imagem não é carregada. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo foi criado automaticamente, pode não estar correto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saiba mais +pdfjs-editor-new-alt-text-create-automatically-button-label = Criar texto alternativo automaticamente +pdfjs-editor-new-alt-text-not-now-button = Agora não +pdfjs-editor-new-alt-text-error-title = Não foi possível criar texto alternativo automaticamente +pdfjs-editor-new-alt-text-error-description = Escreva seu próprio texto alternativo ou tente novamente mais tarde. +pdfjs-editor-new-alt-text-error-close-button = Fechar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Baixando modelo de inteligência artificial de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Baixando modelo de inteligência artificial de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo adicionado +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo adicionado +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Criado automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Configurações de texto alternativo de imagens +pdfjs-image-alt-text-settings-button-label = Configurações de texto alternativo de imagens +pdfjs-editor-alt-text-settings-dialog-label = Configurações de texto alternativo de imagens +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Criar texto alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugere uma descrição para ajudar pessoas que não conseguem ver a imagem ou quando a imagem não é carregada. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de inteligência artificial de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Funciona localmente no seu dispositivo para que seus dados permaneçam privativos. Necessário para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Excluir +pdfjs-editor-alt-text-settings-download-model-button = Baixar +pdfjs-editor-alt-text-settings-downloading-model-button = Baixando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar o editor de texto alternativo imediatamente ao adicionar uma imagem +pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a assegurar que todas as suas imagens tenham texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Fechar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Destaque removido +pdfjs-editor-undo-bar-message-freetext = Texto removido +pdfjs-editor-undo-bar-message-ink = Desenho removido +pdfjs-editor-undo-bar-message-stamp = Imagem removida +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotação removida + *[other] { $count } anotações removidas + } +pdfjs-editor-undo-bar-undo-button = + .title = Desfazer +pdfjs-editor-undo-bar-undo-button-label = Desfazer +pdfjs-editor-undo-bar-close-button = + .title = Fechar +pdfjs-editor-undo-bar-close-button-label = Fechar diff --git a/public/pdfjs/web/locale/pt-PT/viewer.ftl b/public/pdfjs/web/locale/pt-PT/viewer.ftl new file mode 100644 index 0000000..1829417 --- /dev/null +++ b/public/pdfjs/web/locale/pt-PT/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Página anterior +pdfjs-previous-button-label = Anterior +pdfjs-next-button = + .title = Página seguinte +pdfjs-next-button-label = Seguinte +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Página +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Reduzir +pdfjs-zoom-out-button-label = Reduzir +pdfjs-zoom-in-button = + .title = Ampliar +pdfjs-zoom-in-button-label = Ampliar +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Trocar para o modo de apresentação +pdfjs-presentation-mode-button-label = Modo de apresentação +pdfjs-open-file-button = + .title = Abrir ficheiro +pdfjs-open-file-button-label = Abrir +pdfjs-print-button = + .title = Imprimir +pdfjs-print-button-label = Imprimir +pdfjs-save-button = + .title = Guardar +pdfjs-save-button-label = Guardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Transferir +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Transferir +pdfjs-bookmark-button = + .title = Página atual (ver URL da página atual) +pdfjs-bookmark-button-label = Pagina atual + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Ferramentas +pdfjs-tools-button-label = Ferramentas +pdfjs-first-page-button = + .title = Ir para a primeira página +pdfjs-first-page-button-label = Ir para a primeira página +pdfjs-last-page-button = + .title = Ir para a última página +pdfjs-last-page-button-label = Ir para a última página +pdfjs-page-rotate-cw-button = + .title = Rodar à direita +pdfjs-page-rotate-cw-button-label = Rodar à direita +pdfjs-page-rotate-ccw-button = + .title = Rodar à esquerda +pdfjs-page-rotate-ccw-button-label = Rodar à esquerda +pdfjs-cursor-text-select-tool-button = + .title = Ativar ferramenta de seleção de texto +pdfjs-cursor-text-select-tool-button-label = Ferramenta de seleção de texto +pdfjs-cursor-hand-tool-button = + .title = Ativar ferramenta de mão +pdfjs-cursor-hand-tool-button-label = Ferramenta de mão +pdfjs-scroll-page-button = + .title = Utilizar deslocamento da página +pdfjs-scroll-page-button-label = Deslocamento da página +pdfjs-scroll-vertical-button = + .title = Utilizar deslocação vertical +pdfjs-scroll-vertical-button-label = Deslocação vertical +pdfjs-scroll-horizontal-button = + .title = Utilizar deslocação horizontal +pdfjs-scroll-horizontal-button-label = Deslocação horizontal +pdfjs-scroll-wrapped-button = + .title = Utilizar deslocação encapsulada +pdfjs-scroll-wrapped-button-label = Deslocação encapsulada +pdfjs-spread-none-button = + .title = Não juntar páginas dispersas +pdfjs-spread-none-button-label = Sem spreads +pdfjs-spread-odd-button = + .title = Juntar páginas dispersas a partir de páginas com números ímpares +pdfjs-spread-odd-button-label = Spreads ímpares +pdfjs-spread-even-button = + .title = Juntar páginas dispersas a partir de páginas com números pares +pdfjs-spread-even-button-label = Spreads pares + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propriedades do documento… +pdfjs-document-properties-button-label = Propriedades do documento… +pdfjs-document-properties-file-name = Nome do ficheiro: +pdfjs-document-properties-file-size = Tamanho do ficheiro: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Título: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Assunto: +pdfjs-document-properties-keywords = Palavras-chave: +pdfjs-document-properties-creation-date = Data de criação: +pdfjs-document-properties-modification-date = Data de modificação: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Criador: +pdfjs-document-properties-producer = Produtor de PDF: +pdfjs-document-properties-version = Versão do PDF: +pdfjs-document-properties-page-count = N.º de páginas: +pdfjs-document-properties-page-size = Tamanho da página: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = retrato +pdfjs-document-properties-page-size-orientation-landscape = paisagem +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Carta +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista rápida web: +pdfjs-document-properties-linearized-yes = Sim +pdfjs-document-properties-linearized-no = Não +pdfjs-document-properties-close-button = Fechar + +## Print + +pdfjs-print-progress-message = A preparar o documento para impressão… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cancelar +pdfjs-printing-not-supported = Aviso: a impressão não é totalmente suportada por este navegador. +pdfjs-printing-not-ready = Aviso: o PDF ainda não está totalmente carregado. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Alternar barra lateral +pdfjs-toggle-sidebar-notification-button = + .title = Alternar barra lateral (o documento contém contornos/anexos/camadas) +pdfjs-toggle-sidebar-button-label = Alternar barra lateral +pdfjs-document-outline-button = + .title = Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens) +pdfjs-document-outline-button-label = Esquema do documento +pdfjs-attachments-button = + .title = Mostrar anexos +pdfjs-attachments-button-label = Anexos +pdfjs-layers-button = + .title = Mostrar camadas (clique duas vezes para repor todas as camadas para o estado predefinido) +pdfjs-layers-button-label = Camadas +pdfjs-thumbs-button = + .title = Mostrar miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Encontrar o item atualmente destacado +pdfjs-current-outline-item-button-label = Item atualmente destacado +pdfjs-findbar-button = + .title = Localizar em documento +pdfjs-findbar-button-label = Localizar +pdfjs-additional-layers = Camadas adicionais + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura da página { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Localizar + .placeholder = Localizar em documento… +pdfjs-find-previous-button = + .title = Localizar ocorrência anterior da frase +pdfjs-find-previous-button-label = Anterior +pdfjs-find-next-button = + .title = Localizar ocorrência seguinte da frase +pdfjs-find-next-button-label = Seguinte +pdfjs-find-highlight-checkbox = Destacar tudo +pdfjs-find-match-case-checkbox-label = Correspondência +pdfjs-find-match-diacritics-checkbox-label = Corresponder diacríticos +pdfjs-find-entire-word-checkbox-label = Palavras completas +pdfjs-find-reached-top = Topo do documento atingido, a continuar a partir do fundo +pdfjs-find-reached-bottom = Fim do documento atingido, a continuar a partir do topo +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } correspondência + *[other] { $current } de { $total } correspondências + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mais de { $limit } correspondência + *[other] Mais de { $limit } correspondências + } +pdfjs-find-not-found = Frase não encontrada + +## Predefined zoom values + +pdfjs-page-scale-width = Ajustar à largura +pdfjs-page-scale-fit = Ajustar à página +pdfjs-page-scale-auto = Zoom automático +pdfjs-page-scale-actual = Tamanho real +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Página { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ocorreu um erro ao carregar o PDF. +pdfjs-invalid-file-error = Ficheiro PDF inválido ou danificado. +pdfjs-missing-file-error = Ficheiro PDF inexistente. +pdfjs-unexpected-response-error = Resposta inesperada do servidor. +pdfjs-rendering-error = Ocorreu um erro ao processar a página. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotação { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Introduza a palavra-passe para abrir este ficheiro PDF. +pdfjs-password-invalid = Palavra-passe inválida. Por favor, tente novamente. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Cancelar +pdfjs-web-fonts-disabled = Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF embutidos. + +## Editing + +pdfjs-editor-free-text-button = + .title = Texto +pdfjs-editor-free-text-button-label = Texto +pdfjs-editor-ink-button = + .title = Desenhar +pdfjs-editor-ink-button-label = Desenhar +pdfjs-editor-stamp-button = + .title = Adicionar ou editar imagens +pdfjs-editor-stamp-button-label = Adicionar ou editar imagens +pdfjs-editor-highlight-button = + .title = Destaque +pdfjs-editor-highlight-button-label = Destaque +pdfjs-highlight-floating-button1 = + .title = Realçar + .aria-label = Realçar +pdfjs-highlight-floating-button-label = Realçar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Remover desenho +pdfjs-editor-remove-freetext-button = + .title = Remover texto +pdfjs-editor-remove-stamp-button = + .title = Remover imagem +pdfjs-editor-remove-highlight-button = + .title = Remover destaque + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Cor +pdfjs-editor-free-text-size-input = Tamanho +pdfjs-editor-ink-color-input = Cor +pdfjs-editor-ink-thickness-input = Espessura +pdfjs-editor-ink-opacity-input = Opacidade +pdfjs-editor-stamp-add-image-button = + .title = Adicionar imagem +pdfjs-editor-stamp-add-image-button-label = Adicionar imagem +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Espessura +pdfjs-editor-free-highlight-thickness-title = + .title = Alterar espessura quando destacar itens que não sejam texto +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de texto + .default-content = Comece a escrever… +pdfjs-free-text = + .aria-label = Editor de texto +pdfjs-free-text-default-content = Começar a digitar… +pdfjs-ink = + .aria-label = Editor de desenho +pdfjs-ink-canvas = + .aria-label = Imagem criada pelo utilizador + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-dialog-label = Escolher uma opção +pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alternativo) ajuda quando as pessoas não conseguem ver a imagem ou quando a mesma não é carregada. +pdfjs-editor-alt-text-add-description-label = Adicionar uma descrição +pdfjs-editor-alt-text-add-description-description = Aponte para 1-2 frases que descrevam o assunto, definição ou ações. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa +pdfjs-editor-alt-text-mark-decorative-description = Isto é utilizado para imagens decorativas, tais como limites ou marcas d'água. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Guardar +pdfjs-editor-alt-text-decorative-tooltip = Marcada como decorativa +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por exemplo, “Um jovem senta-se à mesa para comer uma refeição” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Canto superior esquerdo — redimensionar +pdfjs-editor-resizer-label-top-middle = Superior ao centro — redimensionar +pdfjs-editor-resizer-label-top-right = Canto superior direito — redimensionar +pdfjs-editor-resizer-label-middle-right = Centro à direita — redimensionar +pdfjs-editor-resizer-label-bottom-right = Canto inferior direito — redimensionar +pdfjs-editor-resizer-label-bottom-middle = Inferior ao centro — redimensionar +pdfjs-editor-resizer-label-bottom-left = Canto inferior esquerdo — redimensionar +pdfjs-editor-resizer-label-middle-left = Centro à esquerda — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Canto superior esquerdo — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Superior ao centro — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Canto superior direito — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Centro à direita — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Canto inferior direito — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Inferior ao centro — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Canto inferior esquerdo — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Centro à esquerda — redimensionar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Cor de destaque +pdfjs-editor-colorpicker-button = + .title = Alterar cor +pdfjs-editor-colorpicker-dropdown = + .aria-label = Escolhas de cor +pdfjs-editor-colorpicker-yellow = + .title = Amarelo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Vermelho + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar tudo +pdfjs-editor-highlight-show-all-button = + .title = Mostrar tudo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descrição da imagem) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adicionar texto alternativo (descrição da imagem) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escreva a sua descrição aqui… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Descrição curta para as pessoas que não podem visualizar a imagem ou quando a imagem não carrega. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo foi criado automaticamente e pode ser impreciso. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber mais +pdfjs-editor-new-alt-text-create-automatically-button-label = Criar texto alternativo automaticamente +pdfjs-editor-new-alt-text-not-now-button = Agora não +pdfjs-editor-new-alt-text-error-title = Não foi possível criar o texto alternativo automaticamente +pdfjs-editor-new-alt-text-error-description = Escreva o seu próprio texto alternativo ou tente novamente mais tarde. +pdfjs-editor-new-alt-text-error-close-button = Fechar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = A transferir o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = A transferir o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo adicionado +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo adicionado +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Texto alternativo em falta +pdfjs-editor-new-alt-text-missing-button-label = Texto alternativo em falta +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Rever texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Rever texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Criado automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Definições de texto alternativo da imagem +pdfjs-image-alt-text-settings-button-label = Definições de texto alternativo da imagem +pdfjs-editor-alt-text-settings-dialog-label = Definições de texto alternativo das imagens +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Criar texto alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugere descrições para ajudar as pessoas que não podem visualizar a imagem ou quando a imagem não carrega. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = É executado localmente no seu dispositivo para que os seus dados se mantenham privados. É necessário para o texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Transferir +pdfjs-editor-alt-text-settings-downloading-model-button = A transferir… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar editor de texto alternativo imediatamente ao adicionar uma imagem +pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a garantir que todas as suas imagens tenham um texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Fechar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Destaque removido +pdfjs-editor-undo-bar-message-freetext = Texto removido +pdfjs-editor-undo-bar-message-ink = Desenho removido +pdfjs-editor-undo-bar-message-stamp = Imagem removida +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotação removida + *[other] { $count } anotações removidas + } +pdfjs-editor-undo-bar-undo-button = + .title = Anular +pdfjs-editor-undo-bar-undo-button-label = Anular +pdfjs-editor-undo-bar-close-button = + .title = Fechar +pdfjs-editor-undo-bar-close-button-label = Fechar diff --git a/public/pdfjs/web/locale/rm/viewer.ftl b/public/pdfjs/web/locale/rm/viewer.ftl new file mode 100644 index 0000000..76992da --- /dev/null +++ b/public/pdfjs/web/locale/rm/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagina precedenta +pdfjs-previous-button-label = Enavos +pdfjs-next-button = + .title = Proxima pagina +pdfjs-next-button-label = Enavant +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = da { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } da { $pagesCount }) +pdfjs-zoom-out-button = + .title = Empitschnir +pdfjs-zoom-out-button-label = Empitschnir +pdfjs-zoom-in-button = + .title = Engrondir +pdfjs-zoom-in-button-label = Engrondir +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Midar en il modus da preschentaziun +pdfjs-presentation-mode-button-label = Modus da preschentaziun +pdfjs-open-file-button = + .title = Avrir datoteca +pdfjs-open-file-button-label = Avrir +pdfjs-print-button = + .title = Stampar +pdfjs-print-button-label = Stampar +pdfjs-save-button = + .title = Memorisar +pdfjs-save-button-label = Memorisar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Telechargiar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Telechargiar +pdfjs-bookmark-button = + .title = Pagina actuala (mussar l'URL da la pagina actuala) +pdfjs-bookmark-button-label = Pagina actuala + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Utensils +pdfjs-tools-button-label = Utensils +pdfjs-first-page-button = + .title = Siglir a l'emprima pagina +pdfjs-first-page-button-label = Siglir a l'emprima pagina +pdfjs-last-page-button = + .title = Siglir a la davosa pagina +pdfjs-last-page-button-label = Siglir a la davosa pagina +pdfjs-page-rotate-cw-button = + .title = Rotar en direcziun da l'ura +pdfjs-page-rotate-cw-button-label = Rotar en direcziun da l'ura +pdfjs-page-rotate-ccw-button = + .title = Rotar en direcziun cuntraria a l'ura +pdfjs-page-rotate-ccw-button-label = Rotar en direcziun cuntraria a l'ura +pdfjs-cursor-text-select-tool-button = + .title = Activar l'utensil per selecziunar text +pdfjs-cursor-text-select-tool-button-label = Utensil per selecziunar text +pdfjs-cursor-hand-tool-button = + .title = Activar l'utensil da maun +pdfjs-cursor-hand-tool-button-label = Utensil da maun +pdfjs-scroll-page-button = + .title = Utilisar la defilada per pagina +pdfjs-scroll-page-button-label = Defilada per pagina +pdfjs-scroll-vertical-button = + .title = Utilisar il defilar vertical +pdfjs-scroll-vertical-button-label = Defilar vertical +pdfjs-scroll-horizontal-button = + .title = Utilisar il defilar orizontal +pdfjs-scroll-horizontal-button-label = Defilar orizontal +pdfjs-scroll-wrapped-button = + .title = Utilisar il defilar en colonnas +pdfjs-scroll-wrapped-button-label = Defilar en colonnas +pdfjs-spread-none-button = + .title = Betg parallelisar las paginas +pdfjs-spread-none-button-label = Betg parallel +pdfjs-spread-odd-button = + .title = Parallelisar las paginas cun cumenzar cun paginas spèras +pdfjs-spread-odd-button-label = Parallel spèr +pdfjs-spread-even-button = + .title = Parallelisar las paginas cun cumenzar cun paginas pèras +pdfjs-spread-even-button-label = Parallel pèr + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Caracteristicas dal document… +pdfjs-document-properties-button-label = Caracteristicas dal document… +pdfjs-document-properties-file-name = Num da la datoteca: +pdfjs-document-properties-file-size = Grondezza da la datoteca: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Autur: +pdfjs-document-properties-subject = Tema: +pdfjs-document-properties-keywords = Chavazzins: +pdfjs-document-properties-creation-date = Data da creaziun: +pdfjs-document-properties-modification-date = Data da modificaziun: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date } { $time } +pdfjs-document-properties-creator = Creà da: +pdfjs-document-properties-producer = Creà il PDF cun: +pdfjs-document-properties-version = Versiun da PDF: +pdfjs-document-properties-page-count = Dumber da paginas: +pdfjs-document-properties-page-size = Grondezza da la pagina: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = vertical +pdfjs-document-properties-page-size-orientation-landscape = orizontal +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Gea +pdfjs-document-properties-linearized-no = Na +pdfjs-document-properties-close-button = Serrar + +## Print + +pdfjs-print-progress-message = Preparar il document per stampar… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Interrumper +pdfjs-printing-not-supported = Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur. +pdfjs-printing-not-ready = Attenziun: Il PDF n'è betg chargià cumplettamain per stampar. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Activar/deactivar la trav laterala +pdfjs-toggle-sidebar-notification-button = + .title = Activar/deactivar la trav laterala (il document cuntegna structura dal document/agiuntas/nivels) +pdfjs-toggle-sidebar-button-label = Activar/deactivar la trav laterala +pdfjs-document-outline-button = + .title = Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements) +pdfjs-document-outline-button-label = Structura dal document +pdfjs-attachments-button = + .title = Mussar agiuntas +pdfjs-attachments-button-label = Agiuntas +pdfjs-layers-button = + .title = Mussar ils nivels (cliccar dubel per restaurar il stadi da standard da tut ils nivels) +pdfjs-layers-button-label = Nivels +pdfjs-thumbs-button = + .title = Mussar las miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Tschertgar l'element da structura actual +pdfjs-current-outline-item-button-label = Element da structura actual +pdfjs-findbar-button = + .title = Tschertgar en il document +pdfjs-findbar-button-label = Tschertgar +pdfjs-additional-layers = Nivels supplementars + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura da la pagina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Tschertgar + .placeholder = Tschertgar en il document… +pdfjs-find-previous-button = + .title = Tschertgar la posiziun precedenta da l'expressiun +pdfjs-find-previous-button-label = Enavos +pdfjs-find-next-button = + .title = Tschertgar la proxima posiziun da l'expressiun +pdfjs-find-next-button-label = Enavant +pdfjs-find-highlight-checkbox = Relevar tuts +pdfjs-find-match-case-checkbox-label = Resguardar maiusclas/minusclas +pdfjs-find-match-diacritics-checkbox-label = Resguardar ils segns diacritics +pdfjs-find-entire-word-checkbox-label = Pleds entirs +pdfjs-find-reached-top = Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document +pdfjs-find-reached-bottom = La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } dad { $total } correspundenza + *[other] { $current } da { $total } correspundenzas + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Dapli che { $limit } correspundenza + *[other] Dapli che { $limit } correspundenzas + } +pdfjs-find-not-found = Impussibel da chattar l'expressiun + +## Predefined zoom values + +pdfjs-page-scale-width = Ladezza da la pagina +pdfjs-page-scale-fit = Entira pagina +pdfjs-page-scale-auto = Zoom automatic +pdfjs-page-scale-actual = Grondezza actuala +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ina errur è cumparida cun chargiar il PDF. +pdfjs-invalid-file-error = Datoteca PDF nunvalida u donnegiada. +pdfjs-missing-file-error = Datoteca PDF manconta. +pdfjs-unexpected-response-error = Resposta nunspetgada dal server. +pdfjs-rendering-error = Ina errur è cumparida cun visualisar questa pagina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Annotaziun da { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Endatescha il pled-clav per avrir questa datoteca da PDF. +pdfjs-password-invalid = Pled-clav nunvalid. Emprova anc ina giada. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Interrumper +pdfjs-web-fonts-disabled = Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Dissegnar +pdfjs-editor-ink-button-label = Dissegnar +pdfjs-editor-stamp-button = + .title = Agiuntar u modifitgar maletgs +pdfjs-editor-stamp-button-label = Agiuntar u modifitgar maletgs +pdfjs-editor-highlight-button = + .title = Marcar +pdfjs-editor-highlight-button-label = Marcar +pdfjs-highlight-floating-button1 = + .title = Marcar + .aria-label = Marcar +pdfjs-highlight-floating-button-label = Marcar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Allontanar il dissegn +pdfjs-editor-remove-freetext-button = + .title = Allontanar il text +pdfjs-editor-remove-stamp-button = + .title = Allontanar la grafica +pdfjs-editor-remove-highlight-button = + .title = Allontanar l'emfasa + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Colur +pdfjs-editor-free-text-size-input = Grondezza +pdfjs-editor-ink-color-input = Colur +pdfjs-editor-ink-thickness-input = Grossezza +pdfjs-editor-ink-opacity-input = Opacitad +pdfjs-editor-stamp-add-image-button = + .title = Agiuntar in maletg +pdfjs-editor-stamp-add-image-button-label = Agiuntar in maletg +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grossezza +pdfjs-editor-free-highlight-thickness-title = + .title = Midar la grossezza cun relevar elements betg textuals +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editur da text + .default-content = Cumenza a tippar… +pdfjs-free-text = + .aria-label = Editur da text +pdfjs-free-text-default-content = Cumenzar a tippar… +pdfjs-ink = + .aria-label = Editur dissegn +pdfjs-ink-canvas = + .aria-label = Maletg creà da l'utilisader + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Text alternativ +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifitgar il text alternativ +pdfjs-editor-alt-text-edit-button-label = Modifitgar il text alternativ +pdfjs-editor-alt-text-dialog-label = Tscherner ina opziun +pdfjs-editor-alt-text-dialog-description = Il text alternativ (alt text) gida en cas che persunas na vesan betg il maletg u sch'i na reussescha betg d'al chargiar. +pdfjs-editor-alt-text-add-description-label = Agiuntar ina descripziun +pdfjs-editor-alt-text-add-description-description = Scriva idealmain 1-2 frasas che descrivan l'object, la situaziun u las acziuns. +pdfjs-editor-alt-text-mark-decorative-label = Marcar sco decorativ +pdfjs-editor-alt-text-mark-decorative-description = Quai vegn duvrà per maletgs ornamentals, sco urs u filigranas. +pdfjs-editor-alt-text-cancel-button = Interrumper +pdfjs-editor-alt-text-save-button = Memorisar +pdfjs-editor-alt-text-decorative-tooltip = Marcà sco decorativ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Per exempel: «In um giuven sesa a maisa per mangiar in past» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Text alternativ + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Chantun sura a sanestra — redimensiunar +pdfjs-editor-resizer-label-top-middle = Sura amez — redimensiunar +pdfjs-editor-resizer-label-top-right = Chantun sura a dretga — redimensiunar +pdfjs-editor-resizer-label-middle-right = Da vart dretga amez — redimensiunar +pdfjs-editor-resizer-label-bottom-right = Chantun sut a dretga — redimensiunar +pdfjs-editor-resizer-label-bottom-middle = Sutvart amez — redimensiunar +pdfjs-editor-resizer-label-bottom-left = Chantun sut a sanestra — redimensiunar +pdfjs-editor-resizer-label-middle-left = Vart sanestra amez — redimensiunar +pdfjs-editor-resizer-top-left = + .aria-label = Chantun sura a sanestra — redimensiunar +pdfjs-editor-resizer-top-middle = + .aria-label = Sura amez — redimensiunar +pdfjs-editor-resizer-top-right = + .aria-label = Chantun sura a dretga — redimensiunar +pdfjs-editor-resizer-middle-right = + .aria-label = Da vart dretga amez — redimensiunar +pdfjs-editor-resizer-bottom-right = + .aria-label = Chantun sut a dretga — redimensiunar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Sutvart amez — redimensiunar +pdfjs-editor-resizer-bottom-left = + .aria-label = Chantun sut a sanestra — redimensiunar +pdfjs-editor-resizer-middle-left = + .aria-label = Vart sanestra amez — redimensiunar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Colur per l'emfasa +pdfjs-editor-colorpicker-button = + .title = Midar la colur +pdfjs-editor-colorpicker-dropdown = + .aria-label = Colurs disponiblas +pdfjs-editor-colorpicker-yellow = + .title = Mellen +pdfjs-editor-colorpicker-green = + .title = Verd +pdfjs-editor-colorpicker-blue = + .title = Blau +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Cotschen + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mussar tut +pdfjs-editor-highlight-show-all-button = + .title = Mussar tut + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifitgar il text alternativ (descripziun dal maletg) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Agiuntar in text alternativ (descripziun dal maletg) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scriva qua tia descripziun… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Curta descripziun per persunas che na vesan betg il maletg u per cass en ils quals il maletg na vegn betg chargià. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Quest text alternativ è vegnì creà automaticamain ed è eventualmain nunprecis. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ulteriuras infurmaziuns +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear automaticamain il text alternativ +pdfjs-editor-new-alt-text-not-now-button = Betg ussa +pdfjs-editor-new-alt-text-error-title = I n’è betg reussì da crear automaticamain il text alternativ +pdfjs-editor-new-alt-text-error-description = Scriva per plaschair tes agen text alternativ u emprova pli tard anc ina giada. +pdfjs-editor-new-alt-text-error-close-button = Serrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Telechargiar il model IA da text alternativ ({ $downloadedSize } da { $totalSize } MB) + .aria-valuetext = Telechargiar il model IA da text alternativ ({ $downloadedSize } da { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Agiuntà text alternativ +pdfjs-editor-new-alt-text-added-button-label = Text alternativ agiuntà +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Text alternativ manca +pdfjs-editor-new-alt-text-missing-button-label = Text alternativ manca +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Repassar il text alternativ +pdfjs-editor-new-alt-text-to-review-button-label = Repassar il text alternativ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creà automaticamain: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Parameters dal text alternativ da maletgs +pdfjs-image-alt-text-settings-button-label = Parameters dal text alternativ da maletgs +pdfjs-editor-alt-text-settings-dialog-label = Parameters dal text alternativ da maletgs +pdfjs-editor-alt-text-settings-automatic-title = Text alternativ automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Crear automaticamain text alternativ +pdfjs-editor-alt-text-settings-create-model-description = Propona descripziuns per gidar a persunas che na vesan betg il maletg u per cass en ils quals il maletg na vegn betg chargià. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model IA da text alternativ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Vegn exequì localmain sin tes apparat per che tias datas restian privatas. Necessari per text alternativ automatic. +pdfjs-editor-alt-text-settings-delete-model-button = Stizzar +pdfjs-editor-alt-text-settings-download-model-button = Telechargiar +pdfjs-editor-alt-text-settings-downloading-model-button = Telechargiar… +pdfjs-editor-alt-text-settings-editor-title = Editur per text alternativ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mussar l’editur per text alternativ directamain cun agiuntar in maletg +pdfjs-editor-alt-text-settings-show-dialog-description = Ta gida a garantir che tut tes maletgs hajan in text alternativ. +pdfjs-editor-alt-text-settings-close-button = Serrar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Allontanà la marcaziun +pdfjs-editor-undo-bar-message-freetext = Allontanà il text +pdfjs-editor-undo-bar-message-ink = Allontanà il dissegn +pdfjs-editor-undo-bar-message-stamp = Allontanà il maletg +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotaziun allontanada + *[other] { $count } annotaziuns allontanadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Revocar +pdfjs-editor-undo-bar-undo-button-label = Revocar +pdfjs-editor-undo-bar-close-button = + .title = Serrar +pdfjs-editor-undo-bar-close-button-label = Serrar diff --git a/public/pdfjs/web/locale/ro/viewer.ftl b/public/pdfjs/web/locale/ro/viewer.ftl new file mode 100644 index 0000000..7c6f0b6 --- /dev/null +++ b/public/pdfjs/web/locale/ro/viewer.ftl @@ -0,0 +1,251 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pagina precedentă +pdfjs-previous-button-label = Înapoi +pdfjs-next-button = + .title = Pagina următoare +pdfjs-next-button-label = Înainte +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pagina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = din { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } din { $pagesCount }) +pdfjs-zoom-out-button = + .title = Micșorează +pdfjs-zoom-out-button-label = Micșorează +pdfjs-zoom-in-button = + .title = Mărește +pdfjs-zoom-in-button-label = Mărește +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Comută la modul de prezentare +pdfjs-presentation-mode-button-label = Mod de prezentare +pdfjs-open-file-button = + .title = Deschide un fișier +pdfjs-open-file-button-label = Deschide +pdfjs-print-button = + .title = Tipărește +pdfjs-print-button-label = Tipărește + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Instrumente +pdfjs-tools-button-label = Instrumente +pdfjs-first-page-button = + .title = Mergi la prima pagină +pdfjs-first-page-button-label = Mergi la prima pagină +pdfjs-last-page-button = + .title = Mergi la ultima pagină +pdfjs-last-page-button-label = Mergi la ultima pagină +pdfjs-page-rotate-cw-button = + .title = Rotește în sensul acelor de ceas +pdfjs-page-rotate-cw-button-label = Rotește în sensul acelor de ceas +pdfjs-page-rotate-ccw-button = + .title = Rotește în sens invers al acelor de ceas +pdfjs-page-rotate-ccw-button-label = Rotește în sens invers al acelor de ceas +pdfjs-cursor-text-select-tool-button = + .title = Activează instrumentul de selecție a textului +pdfjs-cursor-text-select-tool-button-label = Instrumentul de selecție a textului +pdfjs-cursor-hand-tool-button = + .title = Activează instrumentul mână +pdfjs-cursor-hand-tool-button-label = Unealta mână +pdfjs-scroll-vertical-button = + .title = Folosește derularea verticală +pdfjs-scroll-vertical-button-label = Derulare verticală +pdfjs-scroll-horizontal-button = + .title = Folosește derularea orizontală +pdfjs-scroll-horizontal-button-label = Derulare orizontală +pdfjs-scroll-wrapped-button = + .title = Folosește derularea încadrată +pdfjs-scroll-wrapped-button-label = Derulare încadrată +pdfjs-spread-none-button = + .title = Nu uni paginile broșate +pdfjs-spread-none-button-label = Fără pagini broșate +pdfjs-spread-odd-button = + .title = Unește paginile broșate începând cu cele impare +pdfjs-spread-odd-button-label = Broșare pagini impare +pdfjs-spread-even-button = + .title = Unește paginile broșate începând cu cele pare +pdfjs-spread-even-button-label = Broșare pagini pare + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Proprietățile documentului… +pdfjs-document-properties-button-label = Proprietățile documentului… +pdfjs-document-properties-file-name = Numele fișierului: +pdfjs-document-properties-file-size = Mărimea fișierului: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byți) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byți) +pdfjs-document-properties-title = Titlu: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Subiect: +pdfjs-document-properties-keywords = Cuvinte cheie: +pdfjs-document-properties-creation-date = Data creării: +pdfjs-document-properties-modification-date = Data modificării: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Autor: +pdfjs-document-properties-producer = Producător PDF: +pdfjs-document-properties-version = Versiune PDF: +pdfjs-document-properties-page-count = Număr de pagini: +pdfjs-document-properties-page-size = Mărimea paginii: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = verticală +pdfjs-document-properties-page-size-orientation-landscape = orizontală +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Literă +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vizualizare web rapidă: +pdfjs-document-properties-linearized-yes = Da +pdfjs-document-properties-linearized-no = Nu +pdfjs-document-properties-close-button = Închide + +## Print + +pdfjs-print-progress-message = Se pregătește documentul pentru tipărire… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Renunță +pdfjs-printing-not-supported = Avertisment: Tipărirea nu este suportată în totalitate de acest browser. +pdfjs-printing-not-ready = Avertisment: PDF-ul nu este încărcat complet pentru tipărire. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Comută bara laterală +pdfjs-toggle-sidebar-button-label = Comută bara laterală +pdfjs-document-outline-button = + .title = Afișează schița documentului (dublu-clic pentru a extinde/restrânge toate elementele) +pdfjs-document-outline-button-label = Schița documentului +pdfjs-attachments-button = + .title = Afișează atașamentele +pdfjs-attachments-button-label = Atașamente +pdfjs-thumbs-button = + .title = Afișează miniaturi +pdfjs-thumbs-button-label = Miniaturi +pdfjs-findbar-button = + .title = Caută în document +pdfjs-findbar-button-label = Caută + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura paginii { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Caută + .placeholder = Caută în document… +pdfjs-find-previous-button = + .title = Mergi la apariția anterioară a textului +pdfjs-find-previous-button-label = Înapoi +pdfjs-find-next-button = + .title = Mergi la apariția următoare a textului +pdfjs-find-next-button-label = Înainte +pdfjs-find-highlight-checkbox = Evidențiază toate aparițiile +pdfjs-find-match-case-checkbox-label = Ține cont de majuscule și minuscule +pdfjs-find-entire-word-checkbox-label = Cuvinte întregi +pdfjs-find-reached-top = Am ajuns la începutul documentului, continuă de la sfârșit +pdfjs-find-reached-bottom = Am ajuns la sfârșitul documentului, continuă de la început +pdfjs-find-not-found = Nu s-a găsit textul + +## Predefined zoom values + +pdfjs-page-scale-width = Lățime pagină +pdfjs-page-scale-fit = Potrivire la pagină +pdfjs-page-scale-auto = Zoom automat +pdfjs-page-scale-actual = Mărime reală +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = A intervenit o eroare la încărcarea PDF-ului. +pdfjs-invalid-file-error = Fișier PDF nevalid sau corupt. +pdfjs-missing-file-error = Fișier PDF lipsă. +pdfjs-unexpected-response-error = Răspuns neașteptat de la server. +pdfjs-rendering-error = A intervenit o eroare la randarea paginii. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Adnotare { $type }] + +## Password + +pdfjs-password-label = Introdu parola pentru a deschide acest fișier PDF. +pdfjs-password-invalid = Parolă nevalidă. Te rugăm să încerci din nou. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Renunță +pdfjs-web-fonts-disabled = Fonturile web sunt dezactivate: nu se pot folosi fonturile PDF încorporate. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ru/viewer.ftl b/public/pdfjs/web/locale/ru/viewer.ftl new file mode 100644 index 0000000..81c2f41 --- /dev/null +++ b/public/pdfjs/web/locale/ru/viewer.ftl @@ -0,0 +1,518 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Предыдущая страница +pdfjs-previous-button-label = Предыдущая +pdfjs-next-button = + .title = Следующая страница +pdfjs-next-button-label = Следующая +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Страница +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = из { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } из { $pagesCount }) +pdfjs-zoom-out-button = + .title = Уменьшить +pdfjs-zoom-out-button-label = Уменьшить +pdfjs-zoom-in-button = + .title = Увеличить +pdfjs-zoom-in-button-label = Увеличить +pdfjs-zoom-select = + .title = Масштаб +pdfjs-presentation-mode-button = + .title = Перейти в режим презентации +pdfjs-presentation-mode-button-label = Режим презентации +pdfjs-open-file-button = + .title = Открыть файл +pdfjs-open-file-button-label = Открыть +pdfjs-print-button = + .title = Печать +pdfjs-print-button-label = Печать +pdfjs-save-button = + .title = Сохранить +pdfjs-save-button-label = Сохранить +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Загрузить +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Загрузить +pdfjs-bookmark-button = + .title = Текущая страница (просмотр URL-адреса с текущей страницы) +pdfjs-bookmark-button-label = Текущая страница + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Инструменты +pdfjs-tools-button-label = Инструменты +pdfjs-first-page-button = + .title = Перейти на первую страницу +pdfjs-first-page-button-label = Перейти на первую страницу +pdfjs-last-page-button = + .title = Перейти на последнюю страницу +pdfjs-last-page-button-label = Перейти на последнюю страницу +pdfjs-page-rotate-cw-button = + .title = Повернуть по часовой стрелке +pdfjs-page-rotate-cw-button-label = Повернуть по часовой стрелке +pdfjs-page-rotate-ccw-button = + .title = Повернуть против часовой стрелки +pdfjs-page-rotate-ccw-button-label = Повернуть против часовой стрелки +pdfjs-cursor-text-select-tool-button = + .title = Включить Инструмент «Выделение текста» +pdfjs-cursor-text-select-tool-button-label = Инструмент «Выделение текста» +pdfjs-cursor-hand-tool-button = + .title = Включить Инструмент «Рука» +pdfjs-cursor-hand-tool-button-label = Инструмент «Рука» +pdfjs-scroll-page-button = + .title = Использовать прокрутку страниц +pdfjs-scroll-page-button-label = Прокрутка страниц +pdfjs-scroll-vertical-button = + .title = Использовать вертикальную прокрутку +pdfjs-scroll-vertical-button-label = Вертикальная прокрутка +pdfjs-scroll-horizontal-button = + .title = Использовать горизонтальную прокрутку +pdfjs-scroll-horizontal-button-label = Горизонтальная прокрутка +pdfjs-scroll-wrapped-button = + .title = Использовать масштабируемую прокрутку +pdfjs-scroll-wrapped-button-label = Масштабируемая прокрутка +pdfjs-spread-none-button = + .title = Не использовать режим разворотов страниц +pdfjs-spread-none-button-label = Без разворотов страниц +pdfjs-spread-odd-button = + .title = Развороты начинаются с нечётных номеров страниц +pdfjs-spread-odd-button-label = Нечётные страницы слева +pdfjs-spread-even-button = + .title = Развороты начинаются с чётных номеров страниц +pdfjs-spread-even-button-label = Чётные страницы слева + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Свойства документа… +pdfjs-document-properties-button-label = Свойства документа… +pdfjs-document-properties-file-name = Имя файла: +pdfjs-document-properties-file-size = Размер файла: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байт) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +pdfjs-document-properties-title = Заголовок: +pdfjs-document-properties-author = Автор: +pdfjs-document-properties-subject = Тема: +pdfjs-document-properties-keywords = Ключевые слова: +pdfjs-document-properties-creation-date = Дата создания: +pdfjs-document-properties-modification-date = Дата изменения: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Приложение: +pdfjs-document-properties-producer = Производитель PDF: +pdfjs-document-properties-version = Версия PDF: +pdfjs-document-properties-page-count = Число страниц: +pdfjs-document-properties-page-size = Размер страницы: +pdfjs-document-properties-page-size-unit-inches = дюймов +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = книжная +pdfjs-document-properties-page-size-orientation-landscape = альбомная +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Быстрый просмотр в Web: +pdfjs-document-properties-linearized-yes = Да +pdfjs-document-properties-linearized-no = Нет +pdfjs-document-properties-close-button = Закрыть + +## Print + +pdfjs-print-progress-message = Подготовка документа к печати… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Отмена +pdfjs-printing-not-supported = Предупреждение: В этом браузере не полностью поддерживается печать. +pdfjs-printing-not-ready = Предупреждение: PDF не полностью загружен для печати. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Показать/скрыть боковую панель +pdfjs-toggle-sidebar-notification-button = + .title = Показать/скрыть боковую панель (документ имеет содержание/вложения/слои) +pdfjs-toggle-sidebar-button-label = Показать/скрыть боковую панель +pdfjs-document-outline-button = + .title = Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы) +pdfjs-document-outline-button-label = Содержание документа +pdfjs-attachments-button = + .title = Показать вложения +pdfjs-attachments-button-label = Вложения +pdfjs-layers-button = + .title = Показать слои (дважды щёлкните, чтобы сбросить все слои к состоянию по умолчанию) +pdfjs-layers-button-label = Слои +pdfjs-thumbs-button = + .title = Показать миниатюры +pdfjs-thumbs-button-label = Миниатюры +pdfjs-current-outline-item-button = + .title = Найти текущий элемент структуры +pdfjs-current-outline-item-button-label = Текущий элемент структуры +pdfjs-findbar-button = + .title = Найти в документе +pdfjs-findbar-button-label = Найти +pdfjs-additional-layers = Дополнительные слои + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Страница { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Миниатюра страницы { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Найти + .placeholder = Найти в документе… +pdfjs-find-previous-button = + .title = Найти предыдущее вхождение фразы в текст +pdfjs-find-previous-button-label = Назад +pdfjs-find-next-button = + .title = Найти следующее вхождение фразы в текст +pdfjs-find-next-button-label = Далее +pdfjs-find-highlight-checkbox = Подсветить все +pdfjs-find-match-case-checkbox-label = С учётом регистра +pdfjs-find-match-diacritics-checkbox-label = С учётом диакритических знаков +pdfjs-find-entire-word-checkbox-label = Слова целиком +pdfjs-find-reached-top = Достигнут верх документа, продолжено снизу +pdfjs-find-reached-bottom = Достигнут конец документа, продолжено сверху +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } из { $total } совпадения + [few] { $current } из { $total } совпадений + *[many] { $current } из { $total } совпадений + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Более { $limit } совпадения + [few] Более { $limit } совпадений + *[many] Более { $limit } совпадений + } +pdfjs-find-not-found = Фраза не найдена + +## Predefined zoom values + +pdfjs-page-scale-width = По ширине страницы +pdfjs-page-scale-fit = По размеру страницы +pdfjs-page-scale-auto = Автоматически +pdfjs-page-scale-actual = Реальный размер +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Страница { $page } + +## Loading indicator messages + +pdfjs-loading-error = При загрузке PDF произошла ошибка. +pdfjs-invalid-file-error = Некорректный или повреждённый PDF-файл. +pdfjs-missing-file-error = PDF-файл отсутствует. +pdfjs-unexpected-response-error = Неожиданный ответ сервера. +pdfjs-rendering-error = При создании страницы произошла ошибка. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Аннотация { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Введите пароль, чтобы открыть этот PDF-файл. +pdfjs-password-invalid = Неверный пароль. Пожалуйста, попробуйте снова. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Отмена +pdfjs-web-fonts-disabled = Веб-шрифты отключены: не удалось задействовать встроенные PDF-шрифты. + +## Editing + +pdfjs-editor-free-text-button = + .title = Текст +pdfjs-editor-free-text-button-label = Текст +pdfjs-editor-ink-button = + .title = Рисовать +pdfjs-editor-ink-button-label = Рисовать +pdfjs-editor-stamp-button = + .title = Добавить или изменить изображения +pdfjs-editor-stamp-button-label = Добавить или изменить изображения +pdfjs-editor-highlight-button = + .title = Выделение +pdfjs-editor-highlight-button-label = Выделение +pdfjs-highlight-floating-button1 = + .title = Выделение + .aria-label = Выделение +pdfjs-highlight-floating-button-label = Выделение + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Удалить рисунок +pdfjs-editor-remove-freetext-button = + .title = Удалить текст +pdfjs-editor-remove-stamp-button = + .title = Удалить изображение +pdfjs-editor-remove-highlight-button = + .title = Удалить выделение + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Цвет +pdfjs-editor-free-text-size-input = Размер +pdfjs-editor-ink-color-input = Цвет +pdfjs-editor-ink-thickness-input = Толщина +pdfjs-editor-ink-opacity-input = Прозрачность +pdfjs-editor-stamp-add-image-button = + .title = Добавить изображение +pdfjs-editor-stamp-add-image-button-label = Добавить изображение +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Толщина +pdfjs-editor-free-highlight-thickness-title = + .title = Изменить толщину при выделении элементов, кроме текста +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Текстовый редактор + .default-content = Начните ввод... +pdfjs-free-text = + .aria-label = Текстовый редактор +pdfjs-free-text-default-content = Начните вводить… +pdfjs-ink = + .aria-label = Редактор рисования +pdfjs-ink-canvas = + .aria-label = Созданное пользователем изображение + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Альтернативный текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Изменить альтернативный текст +pdfjs-editor-alt-text-edit-button-label = Изменить альтернативный текст +pdfjs-editor-alt-text-dialog-label = Выберите вариант +pdfjs-editor-alt-text-dialog-description = Альтернативный текст помогает, когда люди не видят изображение или оно не загружается. +pdfjs-editor-alt-text-add-description-label = Добавить описание +pdfjs-editor-alt-text-add-description-description = Старайтесь составлять 1–2 предложения, описывающих предмет, обстановку или действия. +pdfjs-editor-alt-text-mark-decorative-label = Отметить как декоративное +pdfjs-editor-alt-text-mark-decorative-description = Используется для декоративных изображений, таких как рамки или водяные знаки. +pdfjs-editor-alt-text-cancel-button = Отменить +pdfjs-editor-alt-text-save-button = Сохранить +pdfjs-editor-alt-text-decorative-tooltip = Помечен как декоративный +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Например: «Молодой человек садится за стол, чтобы поесть» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Альтернативный текст + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Левый верхний угол — изменить размер +pdfjs-editor-resizer-label-top-middle = Вверху посередине — изменить размер +pdfjs-editor-resizer-label-top-right = Верхний правый угол — изменить размер +pdfjs-editor-resizer-label-middle-right = В центре справа — изменить размер +pdfjs-editor-resizer-label-bottom-right = Нижний правый угол — изменить размер +pdfjs-editor-resizer-label-bottom-middle = Внизу посередине — изменить размер +pdfjs-editor-resizer-label-bottom-left = Нижний левый угол — изменить размер +pdfjs-editor-resizer-label-middle-left = В центре слева — изменить размер +pdfjs-editor-resizer-top-left = + .aria-label = Левый верхний угол — изменить размер +pdfjs-editor-resizer-top-middle = + .aria-label = Вверху посередине — изменить размер +pdfjs-editor-resizer-top-right = + .aria-label = Верхний правый угол — изменить размер +pdfjs-editor-resizer-middle-right = + .aria-label = В центре справа — изменить размер +pdfjs-editor-resizer-bottom-right = + .aria-label = Нижний правый угол — изменить размер +pdfjs-editor-resizer-bottom-middle = + .aria-label = Внизу посередине — изменить размер +pdfjs-editor-resizer-bottom-left = + .aria-label = Нижний левый угол — изменить размер +pdfjs-editor-resizer-middle-left = + .aria-label = В центре слева — изменить размер + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Цвет выделения +pdfjs-editor-colorpicker-button = + .title = Изменить цвет +pdfjs-editor-colorpicker-dropdown = + .aria-label = Выбор цвета +pdfjs-editor-colorpicker-yellow = + .title = Жёлтый +pdfjs-editor-colorpicker-green = + .title = Зелёный +pdfjs-editor-colorpicker-blue = + .title = Синий +pdfjs-editor-colorpicker-pink = + .title = Розовый +pdfjs-editor-colorpicker-red = + .title = Красный + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Показать все +pdfjs-editor-highlight-show-all-button = + .title = Показать все + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Изменить альтернативный текст (описание изображения) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Добавить альтернативный текст (описание изображения) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напишите здесь своё описание… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Короткое описание для людей, которые не видят изображение, или если изображение не загружается. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Этот альтернативный текст был создан автоматически и может быть неточным. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Подробнее +pdfjs-editor-new-alt-text-create-automatically-button-label = Автоматически создавать альтернативный текст +pdfjs-editor-new-alt-text-not-now-button = Не сейчас +pdfjs-editor-new-alt-text-error-title = Не удалось автоматически создать альтернативный текст +pdfjs-editor-new-alt-text-error-description = Пожалуйста, напишите свой альтернативный текст или попробуйте ещё раз позже. +pdfjs-editor-new-alt-text-error-close-button = Закрыть +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Загрузка модели ИИ для альтернативного текста ({ $downloadedSize } из { $totalSize } МБ) + .aria-valuetext = Загрузка модели ИИ для альтернативного текста ({ $downloadedSize } из { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Альтернативный текст добавлен +pdfjs-editor-new-alt-text-added-button-label = Альтернативный текст добавлен +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Отсутствует альтернативный текст +pdfjs-editor-new-alt-text-missing-button-label = Отсутствует альтернативный текст +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Оценить альтернативный текст +pdfjs-editor-new-alt-text-to-review-button-label = Оценить альтернативный текст +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Создано автоматически: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Настройки альтернативного текста для изображения +pdfjs-image-alt-text-settings-button-label = Настройки альтернативного текста для изображения +pdfjs-editor-alt-text-settings-dialog-label = Настройки альтернативного текста для изображения +pdfjs-editor-alt-text-settings-automatic-title = Автоматический альтернативный текст +pdfjs-editor-alt-text-settings-create-model-button-label = Автоматически создавать альтернативный текст +pdfjs-editor-alt-text-settings-create-model-description = Предлагает описания, чтобы помочь людям, которые не видят изображение, или если изображение не загружается. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = ИИ-модель альтернативного текста ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Запускается локально на вашем устройстве, поэтому ваши данные остаются конфиденциальными. Требуется для автоматического альтернативного текста. +pdfjs-editor-alt-text-settings-delete-model-button = Удалить +pdfjs-editor-alt-text-settings-download-model-button = Загрузить +pdfjs-editor-alt-text-settings-downloading-model-button = Загрузка… +pdfjs-editor-alt-text-settings-editor-title = Редактор альтернативного текста +pdfjs-editor-alt-text-settings-show-dialog-button-label = Сразу показывать редактор альтернативного текста при добавлении изображения +pdfjs-editor-alt-text-settings-show-dialog-description = Помогает вам убедиться, что все ваши изображения имеют альтернативный текст. +pdfjs-editor-alt-text-settings-close-button = Закрыть + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Выделение удалено +pdfjs-editor-undo-bar-message-freetext = Текст удалён +pdfjs-editor-undo-bar-message-ink = Рисунок удалён +pdfjs-editor-undo-bar-message-stamp = Изображение удалено +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } аннотация удалена + [few] { $count } аннотации удалены + *[many] { $count } аннотаций удалены + } +pdfjs-editor-undo-bar-undo-button = + .title = Отменить +pdfjs-editor-undo-bar-undo-button-label = Отменить +pdfjs-editor-undo-bar-close-button = + .title = Закрыть +pdfjs-editor-undo-bar-close-button-label = Закрыть diff --git a/public/pdfjs/web/locale/sat/viewer.ftl b/public/pdfjs/web/locale/sat/viewer.ftl new file mode 100644 index 0000000..2fbbc12 --- /dev/null +++ b/public/pdfjs/web/locale/sat/viewer.ftl @@ -0,0 +1,325 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = ᱢᱟᱲᱟᱝ ᱥᱟᱦᱴᱟ +pdfjs-previous-button-label = ᱢᱟᱲᱟᱝᱟᱜ +pdfjs-next-button = + .title = ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ ᱥᱟᱦᱴᱟ +pdfjs-next-button-label = ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ᱥᱟᱦᱴᱟ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = ᱨᱮᱭᱟᱜ { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } ᱠᱷᱚᱱ { $pagesCount }) +pdfjs-zoom-out-button = + .title = ᱦᱤᱲᱤᱧ ᱛᱮᱭᱟᱨ +pdfjs-zoom-out-button-label = ᱦᱤᱲᱤᱧ ᱛᱮᱭᱟᱨ +pdfjs-zoom-in-button = + .title = ᱢᱟᱨᱟᱝ ᱛᱮᱭᱟᱨ +pdfjs-zoom-in-button-label = ᱢᱟᱨᱟᱝ ᱛᱮᱭᱟᱨ +pdfjs-zoom-select = + .title = ᱡᱩᱢ +pdfjs-presentation-mode-button = + .title = ᱩᱫᱩᱜ ᱥᱚᱫᱚᱨ ᱚᱵᱚᱥᱛᱟ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ +pdfjs-presentation-mode-button-label = ᱩᱫᱩᱜ ᱥᱚᱫᱚᱨ ᱚᱵᱚᱥᱛᱟ ᱨᱮ +pdfjs-open-file-button = + .title = ᱨᱮᱫ ᱡᱷᱤᱡᱽ ᱢᱮ +pdfjs-open-file-button-label = ᱡᱷᱤᱡᱽ ᱢᱮ +pdfjs-print-button = + .title = ᱪᱷᱟᱯᱟ +pdfjs-print-button-label = ᱪᱷᱟᱯᱟ +pdfjs-save-button = + .title = ᱥᱟᱺᱪᱟᱣ ᱢᱮ +pdfjs-save-button-label = ᱥᱟᱺᱪᱟᱣ ᱢᱮ +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ᱰᱟᱣᱩᱱᱞᱚᱰ +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ᱰᱟᱣᱩᱱᱞᱚᱰ +pdfjs-bookmark-button = + .title = ᱱᱤᱛᱚᱜᱟᱜ ᱥᱟᱦᱴᱟ (ᱱᱤᱛᱚᱜᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱ URL ᱫᱮᱠᱷᱟᱣ ᱢᱮ) +pdfjs-bookmark-button-label = ᱱᱤᱛᱚᱜᱟᱜ ᱥᱟᱦᱴᱟ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱚ +pdfjs-tools-button-label = ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱚ +pdfjs-first-page-button = + .title = ᱯᱩᱭᱞᱩ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +pdfjs-first-page-button-label = ᱯᱩᱭᱞᱩ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +pdfjs-last-page-button = + .title = ᱢᱩᱪᱟᱹᱫ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +pdfjs-last-page-button-label = ᱢᱩᱪᱟᱹᱫ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +pdfjs-page-rotate-cw-button = + .title = ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱟᱹᱪᱩᱨ +pdfjs-page-rotate-cw-button-label = ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱟᱹᱪᱩᱨ +pdfjs-page-rotate-ccw-button = + .title = ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱩᱞᱴᱟᱹ ᱟᱹᱪᱩᱨ +pdfjs-page-rotate-ccw-button-label = ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱩᱞᱴᱟᱹ ᱟᱹᱪᱩᱨ +pdfjs-cursor-text-select-tool-button = + .title = ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱦᱟᱹᱛᱤᱭᱟᱨ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ +pdfjs-cursor-text-select-tool-button-label = ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱦᱟᱹᱛᱤᱭᱟᱨ +pdfjs-cursor-hand-tool-button = + .title = ᱛᱤ ᱦᱟᱹᱛᱤᱭᱟᱨ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ +pdfjs-cursor-hand-tool-button-label = ᱛᱤ ᱦᱟᱹᱛᱤᱭᱟᱨ +pdfjs-scroll-page-button = + .title = ᱥᱟᱦᱴᱟ ᱜᱩᱲᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ +pdfjs-scroll-page-button-label = ᱥᱟᱦᱴᱟ ᱜᱩᱲᱟᱹᱣ +pdfjs-scroll-vertical-button = + .title = ᱥᱤᱫᱽ ᱜᱩᱲᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ +pdfjs-scroll-vertical-button-label = ᱥᱤᱫᱽ ᱜᱩᱲᱟᱹᱣ +pdfjs-scroll-horizontal-button = + .title = ᱜᱤᱛᱤᱡ ᱛᱮ ᱜᱩᱲᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ +pdfjs-scroll-horizontal-button-label = ᱜᱤᱛᱤᱡ ᱛᱮ ᱜᱩᱲᱟᱹᱣ +pdfjs-scroll-wrapped-button = + .title = ᱞᱤᱯᱴᱟᱹᱣ ᱜᱩᱰᱨᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ +pdfjs-scroll-wrapped-button-label = ᱞᱤᱯᱴᱟᱣ ᱜᱩᱰᱨᱟᱹᱣ +pdfjs-spread-none-button = + .title = ᱟᱞᱚᱢ ᱡᱚᱲᱟᱣ ᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱯᱟᱥᱱᱟᱣᱜᱼᱟ +pdfjs-spread-none-button-label = ᱯᱟᱥᱱᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ +pdfjs-spread-odd-button = + .title = ᱥᱟᱦᱴᱟ ᱯᱟᱥᱱᱟᱣ ᱡᱚᱲᱟᱣ ᱢᱮ ᱡᱟᱦᱟᱸ ᱫᱚ ᱚᱰᱼᱮᱞ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱞᱟᱜ ᱮᱛᱦᱚᱵᱚᱜ ᱠᱟᱱᱟ +pdfjs-spread-odd-button-label = ᱚᱰ ᱯᱟᱥᱱᱟᱣ +pdfjs-spread-even-button = + .title = ᱥᱟᱦᱴᱟ ᱯᱟᱥᱱᱟᱣ ᱡᱚᱲᱟᱣ ᱢᱮ ᱡᱟᱦᱟᱸ ᱫᱚ ᱤᱣᱮᱱᱼᱮᱞ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱞᱟᱜ ᱮᱛᱦᱚᱵᱚᱜ ᱠᱟᱱᱟ +pdfjs-spread-even-button-label = ᱯᱟᱥᱱᱟᱣ ᱤᱣᱮᱱ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = ᱫᱚᱞᱤᱞ ᱜᱩᱱᱠᱚ … +pdfjs-document-properties-button-label = ᱫᱚᱞᱤᱞ ᱜᱩᱱᱠᱚ … +pdfjs-document-properties-file-name = ᱨᱮᱫᱽ ᱧᱩᱛᱩᱢ : +pdfjs-document-properties-file-size = ᱨᱮᱫᱽ ᱢᱟᱯ : +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ᱵᱟᱭᱤᱴ ᱠᱚ) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ᱵᱟᱭᱤᱴ ᱠᱚ) +pdfjs-document-properties-title = ᱧᱩᱛᱩᱢ : +pdfjs-document-properties-author = ᱚᱱᱚᱞᱤᱭᱟᱹ : +pdfjs-document-properties-subject = ᱵᱤᱥᱚᱭ : +pdfjs-document-properties-keywords = ᱠᱟᱹᱴᱷᱤ ᱥᱟᱵᱟᱫᱽ : +pdfjs-document-properties-creation-date = ᱛᱮᱭᱟᱨ ᱢᱟᱸᱦᱤᱛ : +pdfjs-document-properties-modification-date = ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱢᱟᱹᱦᱤᱛ : +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = ᱵᱮᱱᱟᱣᱤᱡ : +pdfjs-document-properties-producer = PDF ᱛᱮᱭᱟᱨ ᱚᱰᱚᱠᱤᱡ : +pdfjs-document-properties-version = PDF ᱵᱷᱟᱹᱨᱥᱚᱱ : +pdfjs-document-properties-page-count = ᱥᱟᱦᱴᱟ ᱞᱮᱠᱷᱟ : +pdfjs-document-properties-page-size = ᱥᱟᱦᱴᱟ ᱢᱟᱯ : +pdfjs-document-properties-page-size-unit-inches = ᱤᱧᱪ +pdfjs-document-properties-page-size-unit-millimeters = ᱢᱤᱢᱤ +pdfjs-document-properties-page-size-orientation-portrait = ᱯᱚᱴᱨᱮᱴ +pdfjs-document-properties-page-size-orientation-landscape = ᱞᱮᱱᱰᱥᱠᱮᱯ +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = ᱪᱤᱴᱷᱤ +pdfjs-document-properties-page-size-name-legal = ᱠᱟᱹᱱᱩᱱᱤ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = ᱞᱚᱜᱚᱱ ᱣᱮᱵᱽ ᱧᱮᱞ : +pdfjs-document-properties-linearized-yes = ᱦᱚᱭ +pdfjs-document-properties-linearized-no = ᱵᱟᱝ +pdfjs-document-properties-close-button = ᱵᱚᱸᱫᱚᱭ ᱢᱮ + +## Print + +pdfjs-print-progress-message = ᱪᱷᱟᱯᱟ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱞᱤᱞ ᱛᱮᱭᱟᱨᱚᱜ ᱠᱟᱱᱟ … +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ᱵᱟᱹᱰᱨᱟᱹ +pdfjs-printing-not-supported = ᱦᱚᱥᱤᱭᱟᱨ : ᱪᱷᱟᱯᱟ ᱱᱚᱣᱟ ᱯᱟᱱᱛᱮᱭᱟᱜ ᱫᱟᱨᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱵᱟᱭ ᱜᱚᱲᱚᱣᱟᱠᱟᱱᱟ ᱾ +pdfjs-printing-not-ready = ᱦᱩᱥᱤᱭᱟᱹᱨ : ᱪᱷᱟᱯᱟ ᱞᱟᱹᱜᱤᱫ PDF ᱯᱩᱨᱟᱹ ᱵᱟᱭ ᱞᱟᱫᱮ ᱟᱠᱟᱱᱟ ᱾ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = ᱫᱷᱟᱨᱮᱵᱟᱨ ᱥᱮᱫ ᱩᱪᱟᱹᱲᱚᱜ ᱢᱮ +pdfjs-toggle-sidebar-notification-button = + .title = ᱫᱷᱟᱨᱮᱵᱟᱨ ᱥᱮᱫ ᱩᱪᱟᱹᱲᱚᱜ ᱢᱮ (ᱫᱚᱞᱤᱞ ᱨᱮ ᱟᱣᱴᱞᱟᱭᱤᱢ ᱢᱮᱱᱟᱜᱼᱟ/ᱞᱟᱪᱷᱟᱠᱚ/ᱯᱚᱨᱚᱛᱠᱚ) +pdfjs-toggle-sidebar-button-label = ᱫᱷᱟᱨᱮᱵᱟᱨ ᱥᱮᱫ ᱩᱪᱟᱹᱲᱚᱜ ᱢᱮ +pdfjs-document-outline-button = + .title = ᱫᱚᱞᱚᱞ ᱟᱣᱴᱞᱟᱭᱤᱱ ᱫᱮᱠᱷᱟᱣ ᱢᱮ (ᱡᱷᱚᱛᱚ ᱡᱤᱱᱤᱥᱠᱚ ᱵᱟᱨ ᱡᱮᱠᱷᱟ ᱚᱛᱟ ᱠᱮᱛᱮ ᱡᱷᱟᱹᱞ/ᱦᱩᱰᱤᱧ ᱪᱷᱚᱭ ᱢᱮ) +pdfjs-document-outline-button-label = ᱫᱚᱞᱤᱞ ᱛᱮᱭᱟᱨ ᱛᱮᱫ +pdfjs-attachments-button = + .title = ᱞᱟᱴᱷᱟ ᱥᱮᱞᱮᱫ ᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ +pdfjs-attachments-button-label = ᱞᱟᱴᱷᱟ ᱥᱮᱞᱮᱫ ᱠᱚ +pdfjs-layers-button = + .title = ᱯᱚᱨᱚᱛ ᱫᱮᱠᱷᱟᱣ ᱢᱮ (ᱢᱩᱞ ᱡᱟᱭᱜᱟ ᱛᱮ ᱡᱷᱚᱛᱚ ᱯᱚᱨᱚᱛᱠᱚ ᱨᱤᱥᱮᱴ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱨ ᱡᱮᱠᱷᱟ ᱚᱛᱚᱭ ᱢᱮ) +pdfjs-layers-button-label = ᱯᱚᱨᱚᱛᱠᱚ +pdfjs-thumbs-button = + .title = ᱪᱤᱛᱟᱹᱨ ᱟᱦᱞᱟ ᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ +pdfjs-thumbs-button-label = ᱪᱤᱛᱟᱹᱨ ᱟᱦᱞᱟ ᱠᱚ +pdfjs-current-outline-item-button = + .title = ᱱᱤᱛᱚᱜᱟᱜ ᱟᱣᱴᱞᱟᱭᱤᱱ ᱡᱟᱱᱤᱥ ᱯᱟᱱᱛᱮ ᱢᱮ +pdfjs-current-outline-item-button-label = ᱱᱤᱛᱚᱜᱟᱜ ᱟᱣᱴᱞᱟᱭᱤᱱ ᱡᱟᱱᱤᱥ +pdfjs-findbar-button = + .title = ᱫᱚᱞᱤᱞ ᱨᱮ ᱯᱟᱱᱛᱮ +pdfjs-findbar-button-label = ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ +pdfjs-additional-layers = ᱵᱟᱹᱲᱛᱤ ᱯᱚᱨᱚᱛᱠᱚ + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } ᱥᱟᱦᱴᱟ +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱪᱤᱛᱟᱹᱨ ᱟᱦᱞᱟ + +## Find panel button title and messages + +pdfjs-find-input = + .title = ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + .placeholder = ᱫᱚᱞᱤᱞ ᱨᱮ ᱯᱟᱱᱛᱮ ᱢᱮ … +pdfjs-find-previous-button = + .title = ᱟᱭᱟᱛ ᱦᱤᱸᱥ ᱨᱮᱭᱟᱜ ᱯᱟᱹᱦᱤᱞ ᱥᱮᱫᱟᱜ ᱚᱰᱚᱠ ᱧᱟᱢ ᱢᱮ +pdfjs-find-previous-button-label = ᱢᱟᱲᱟᱝᱟᱜ +pdfjs-find-next-button = + .title = ᱟᱭᱟᱛ ᱦᱤᱸᱥ ᱨᱮᱭᱟᱜ ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ ᱚᱰᱚᱠ ᱧᱟᱢ ᱢᱮ +pdfjs-find-next-button-label = ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ +pdfjs-find-highlight-checkbox = ᱡᱷᱚᱛᱚ ᱩᱫᱩᱜ ᱨᱟᱠᱟᱵ +pdfjs-find-match-case-checkbox-label = ᱡᱚᱲ ᱠᱟᱛᱷᱟ +pdfjs-find-match-diacritics-checkbox-label = ᱵᱤᱥᱮᱥᱚᱠ ᱠᱚ ᱢᱮᱲᱟᱣ ᱢᱮ +pdfjs-find-entire-word-checkbox-label = ᱡᱷᱚᱛᱚ ᱟᱹᱲᱟᱹᱠᱚ +pdfjs-find-reached-top = ᱫᱚᱞᱤᱞ ᱨᱮᱭᱟᱜ ᱪᱤᱴ ᱨᱮ ᱥᱮᱴᱮᱨ, ᱞᱟᱛᱟᱨ ᱠᱷᱚᱱ ᱞᱮᱛᱟᱲ +pdfjs-find-reached-bottom = ᱫᱚᱞᱤᱞ ᱨᱮᱭᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱨᱮ ᱥᱮᱴᱮᱨ, ᱪᱚᱴ ᱠᱷᱚᱱ ᱞᱮᱛᱟᱲ +pdfjs-find-not-found = ᱛᱚᱯᱚᱞ ᱫᱚᱱᱚᱲ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ + +## Predefined zoom values + +pdfjs-page-scale-width = ᱥᱟᱦᱴᱟ ᱚᱥᱟᱨ +pdfjs-page-scale-fit = ᱥᱟᱦᱴᱟ ᱠᱷᱟᱯ +pdfjs-page-scale-auto = ᱟᱡᱼᱟᱡ ᱛᱮ ᱦᱩᱰᱤᱧ ᱞᱟᱹᱴᱩ ᱛᱮᱭᱟᱨ +pdfjs-page-scale-actual = ᱴᱷᱤᱠ ᱢᱟᱨᱟᱝ ᱛᱮᱫ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = { $page } ᱥᱟᱦᱴᱟ + +## Loading indicator messages + +pdfjs-loading-error = PDF ᱞᱟᱫᱮ ᱡᱚᱦᱚᱜ ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱮᱱᱟ ᱾ +pdfjs-invalid-file-error = ᱵᱟᱝ ᱵᱟᱛᱟᱣ ᱟᱨᱵᱟᱝᱠᱷᱟᱱ ᱰᱤᱜᱟᱹᱣ PDF ᱨᱮᱫᱽ ᱾ +pdfjs-missing-file-error = ᱟᱫᱟᱜ PDF ᱨᱮᱫᱽ ᱾ +pdfjs-unexpected-response-error = ᱵᱟᱝᱵᱩᱡᱷ ᱥᱚᱨᱵᱷᱚᱨ ᱛᱮᱞᱟ ᱾ +pdfjs-rendering-error = ᱥᱟᱦᱴᱟ ᱮᱢ ᱡᱚᱦᱚᱠ ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱮᱱᱟ ᱾ + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } ᱢᱚᱱᱛᱚ ᱮᱢ] + +## Password + +pdfjs-password-label = ᱱᱚᱶᱟ PDF ᱨᱮᱫᱽ ᱡᱷᱤᱡᱽ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱫᱮᱨ ᱢᱮ ᱾ +pdfjs-password-invalid = ᱵᱷᱩᱞ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱾ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱫᱩᱦᱲᱟᱹ ᱪᱮᱥᱴᱟᱭ ᱢᱮ ᱾ +pdfjs-password-ok-button = ᱴᱷᱤᱠ +pdfjs-password-cancel-button = ᱵᱟᱹᱰᱨᱟᱹ +pdfjs-web-fonts-disabled = ᱣᱮᱵᱽ ᱪᱤᱠᱤ ᱵᱟᱝ ᱦᱩᱭ ᱦᱚᱪᱚ ᱠᱟᱱᱟ : ᱵᱷᱤᱛᱤᱨ ᱛᱷᱟᱯᱚᱱ PDF ᱪᱤᱠᱤ ᱵᱮᱵᱷᱟᱨ ᱵᱟᱝ ᱦᱩᱭ ᱠᱮᱭᱟ ᱾ + +## Editing + +pdfjs-editor-free-text-button = + .title = ᱚᱞ +pdfjs-editor-free-text-button-label = ᱚᱞ +pdfjs-editor-ink-button = + .title = ᱛᱮᱭᱟᱨ +pdfjs-editor-ink-button-label = ᱛᱮᱭᱟᱨ +pdfjs-editor-stamp-button = + .title = ᱪᱤᱛᱟᱹᱨᱠᱚ ᱥᱮᱞᱮᱫ ᱥᱮ ᱥᱟᱯᱲᱟᱣ ᱢᱮ +pdfjs-editor-stamp-button-label = ᱪᱤᱛᱟᱹᱨᱠᱚ ᱥᱮᱞᱮᱫ ᱥᱮ ᱥᱟᱯᱲᱟᱣ ᱢᱮ + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = ᱨᱚᱝ +pdfjs-editor-free-text-size-input = ᱢᱟᱯ +pdfjs-editor-ink-color-input = ᱨᱚᱝ +pdfjs-editor-ink-thickness-input = ᱢᱚᱴᱟ +pdfjs-editor-ink-opacity-input = ᱟᱨᱯᱟᱨ +pdfjs-editor-stamp-add-image-button = + .title = ᱪᱤᱛᱟᱹᱨ ᱥᱮᱞᱮᱫ ᱢᱮ +pdfjs-editor-stamp-add-image-button-label = ᱪᱤᱛᱟᱹᱨ ᱥᱮᱞᱮᱫ ᱢᱮ +pdfjs-free-text = + .aria-label = ᱚᱞ ᱥᱟᱯᱲᱟᱣᱤᱭᱟᱹ +pdfjs-free-text-default-content = ᱚᱞ ᱮᱛᱦᱚᱵ ᱢᱮ … +pdfjs-ink = + .aria-label = ᱛᱮᱭᱟᱨ ᱥᱟᱯᱲᱟᱣᱤᱭᱟᱹ +pdfjs-ink-canvas = + .aria-label = ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱛᱮᱭᱟᱨ ᱠᱟᱫ ᱪᱤᱛᱟᱹᱨ + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/sc/viewer.ftl b/public/pdfjs/web/locale/sc/viewer.ftl new file mode 100644 index 0000000..1137c2b --- /dev/null +++ b/public/pdfjs/web/locale/sc/viewer.ftl @@ -0,0 +1,367 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pàgina anteriore +pdfjs-previous-button-label = S'ischeda chi b'est primu +pdfjs-next-button = + .title = Pàgina imbeniente +pdfjs-next-button-label = Imbeniente +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pàgina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = de { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount }) +pdfjs-zoom-out-button = + .title = Impitica +pdfjs-zoom-out-button-label = Impitica +pdfjs-zoom-in-button = + .title = Ismànnia +pdfjs-zoom-in-button-label = Ismànnia +pdfjs-zoom-select = + .title = Ismànnia +pdfjs-presentation-mode-button = + .title = Cola a sa modalidade de presentatzione +pdfjs-presentation-mode-button-label = Modalidade de presentatzione +pdfjs-open-file-button = + .title = Aberi s'archìviu +pdfjs-open-file-button-label = Abertu +pdfjs-print-button = + .title = Imprenta +pdfjs-print-button-label = Imprenta +pdfjs-save-button = + .title = Sarva +pdfjs-save-button-label = Sarva +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Iscàrriga +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Iscàrriga +pdfjs-bookmark-button = + .title = Pàgina atuale (ammustra s’URL de sa pàgina atuale) +pdfjs-bookmark-button-label = Pàgina atuale + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Istrumentos +pdfjs-tools-button-label = Istrumentos +pdfjs-first-page-button = + .title = Bae a sa prima pàgina +pdfjs-first-page-button-label = Bae a sa prima pàgina +pdfjs-last-page-button = + .title = Bae a s'ùrtima pàgina +pdfjs-last-page-button-label = Bae a s'ùrtima pàgina +pdfjs-page-rotate-cw-button = + .title = Gira in sensu oràriu +pdfjs-page-rotate-cw-button-label = Gira in sensu oràriu +pdfjs-page-rotate-ccw-button = + .title = Gira in sensu anti-oràriu +pdfjs-page-rotate-ccw-button-label = Gira in sensu anti-oràriu +pdfjs-cursor-text-select-tool-button = + .title = Ativa s'aina de seletzione de testu +pdfjs-cursor-text-select-tool-button-label = Aina de seletzione de testu +pdfjs-cursor-hand-tool-button = + .title = Ativa s'aina de manu +pdfjs-cursor-hand-tool-button-label = Aina de manu +pdfjs-scroll-page-button = + .title = Imprea s'iscurrimentu de pàgina +pdfjs-scroll-page-button-label = Iscurrimentu de pàgina +pdfjs-scroll-vertical-button = + .title = Imprea s'iscurrimentu verticale +pdfjs-scroll-vertical-button-label = Iscurrimentu verticale +pdfjs-scroll-horizontal-button = + .title = Imprea s'iscurrimentu orizontale +pdfjs-scroll-horizontal-button-label = Iscurrimentu orizontale +pdfjs-scroll-wrapped-button = + .title = Imprea s'iscurrimentu continu +pdfjs-scroll-wrapped-button-label = Iscurrimentu continu + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Propiedades de su documentu… +pdfjs-document-properties-button-label = Propiedades de su documentu… +pdfjs-document-properties-file-name = Nòmine de s'archìviu: +pdfjs-document-properties-file-size = Mannària de s'archìviu: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Tìtulu: +pdfjs-document-properties-author = Autoria: +pdfjs-document-properties-subject = Ogetu: +pdfjs-document-properties-keywords = Faeddos crae: +pdfjs-document-properties-creation-date = Data de creatzione: +pdfjs-document-properties-modification-date = Data de modìfica: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Creatzione: +pdfjs-document-properties-producer = Produtore de PDF: +pdfjs-document-properties-version = Versione de PDF: +pdfjs-document-properties-page-count = Contu de pàginas: +pdfjs-document-properties-page-size = Mannària de sa pàgina: +pdfjs-document-properties-page-size-unit-inches = pòddighes +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = verticale +pdfjs-document-properties-page-size-orientation-landscape = orizontale +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Lìtera +pdfjs-document-properties-page-size-name-legal = Legale + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Visualizatzione web lestra: +pdfjs-document-properties-linearized-yes = Eja +pdfjs-document-properties-linearized-no = Nono +pdfjs-document-properties-close-button = Serra + +## Print + +pdfjs-print-progress-message = Aparitzende s'imprenta de su documentu… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Cantzella +pdfjs-printing-not-supported = Atentzione: s'imprenta no est funtzionende de su totu in custu navigadore. +pdfjs-printing-not-ready = Atentzione: su PDF no est istadu carrigadu de su totu pro s'imprenta. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Ativa/disativa sa barra laterale +pdfjs-toggle-sidebar-notification-button = + .title = Ativa/disativa sa barra laterale (su documentu cuntenet un'ischema, alligongiados o livellos) +pdfjs-toggle-sidebar-button-label = Ativa/disativa sa barra laterale +pdfjs-document-outline-button-label = Ischema de su documentu +pdfjs-attachments-button = + .title = Ammustra alligongiados +pdfjs-attachments-button-label = Alliongiados +pdfjs-layers-button = + .title = Ammustra livellos (clic dòpiu pro ripristinare totu is livellos a s'istadu predefinidu) +pdfjs-layers-button-label = Livellos +pdfjs-thumbs-button = + .title = Ammustra miniaturas +pdfjs-thumbs-button-label = Miniaturas +pdfjs-current-outline-item-button = + .title = Agata s'elementu atuale de s'ischema +pdfjs-current-outline-item-button-label = Elementu atuale de s'ischema +pdfjs-findbar-button = + .title = Agata in su documentu +pdfjs-findbar-button-label = Agata +pdfjs-additional-layers = Livellos additzionales + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pàgina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura de sa pàgina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Agata + .placeholder = Agata in su documentu… +pdfjs-find-previous-button = + .title = Agata s'ocurrèntzia pretzedente de sa fràsia +pdfjs-find-previous-button-label = S'ischeda chi b'est primu +pdfjs-find-next-button = + .title = Agata s'ocurrèntzia imbeniente de sa fràsia +pdfjs-find-next-button-label = Imbeniente +pdfjs-find-highlight-checkbox = Evidèntzia totu +pdfjs-find-match-case-checkbox-label = Distinghe intre majùsculas e minùsculas +pdfjs-find-match-diacritics-checkbox-label = Respeta is diacrìticos +pdfjs-find-entire-word-checkbox-label = Faeddos intreos +pdfjs-find-reached-top = S'est lòmpidu a su cumintzu de su documentu, si sighit dae su bàsciu +pdfjs-find-reached-bottom = Acabbu de su documentu, si sighit dae s'artu +pdfjs-find-not-found = Testu no agatadu + +## Predefined zoom values + +pdfjs-page-scale-auto = Ingrandimentu automàticu +pdfjs-page-scale-actual = Mannària reale +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pàgina { $page } + +## Loading indicator messages + +pdfjs-loading-error = Faddina in sa càrriga de su PDF. +pdfjs-invalid-file-error = Archìviu PDF non vàlidu o corrùmpidu. +pdfjs-missing-file-error = Ammancat s'archìviu PDF. +pdfjs-unexpected-response-error = Risposta imprevista de su serbidore. +pdfjs-rendering-error = Faddina in sa visualizatzione de sa pàgina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } + +## Password + +pdfjs-password-label = Inserta sa crae pro abèrrere custu archìviu PDF. +pdfjs-password-invalid = Sa crae no est curreta. Torra a nche proare. +pdfjs-password-ok-button = Andat bene +pdfjs-password-cancel-button = Cantzella +pdfjs-web-fonts-disabled = Is tipografias web sunt disativadas: is tipografias incrustadas a su PDF non podent èssere impreadas. + +## Editing + +pdfjs-editor-free-text-button = + .title = Testu +pdfjs-editor-free-text-button-label = Testu +pdfjs-editor-ink-button = + .title = Disinnu +pdfjs-editor-ink-button-label = Disinnu +pdfjs-editor-stamp-button = + .title = Agiunghe o modìfica immàgines +pdfjs-editor-stamp-button-label = Agiunghe o modìfica immàgines +pdfjs-editor-highlight-button = + .title = Evidèntzia +pdfjs-editor-highlight-button-label = Evidèntzia +pdfjs-highlight-floating-button1 = + .title = Evidèntzia + .aria-label = Evidèntzia +pdfjs-highlight-floating-button-label = Evidèntzia + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Boga su disinnu +pdfjs-editor-remove-freetext-button = + .title = Boga su testu +pdfjs-editor-remove-stamp-button = + .title = Boga s’immàgine +pdfjs-editor-remove-highlight-button = + .title = Boga s’evidèntzia + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Colore +pdfjs-editor-free-text-size-input = Mannària +pdfjs-editor-ink-color-input = Colore +pdfjs-editor-ink-thickness-input = Grussària +pdfjs-editor-stamp-add-image-button = + .title = Agiunghe un’immàgine +pdfjs-editor-stamp-add-image-button-label = Agiunghe un’immàgine +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grussària +pdfjs-free-text = + .aria-label = Editore de testu +pdfjs-free-text-default-content = Cumintza a iscrìere… +pdfjs-ink = + .aria-label = Editore de disinnos +pdfjs-ink-canvas = + .aria-label = Immàgine creada dae s’utente + +## Alt-text dialog + +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button-label = Testu alternativu +pdfjs-editor-alt-text-edit-button-label = Modifica su testu alternativu +pdfjs-editor-alt-text-dialog-label = Sèbera un’optzione +pdfjs-editor-alt-text-dialog-description = Su testu alternativu (“alt text”) est ùtile pro persones chi non podent bìdere s’immàgine o cando non benit carrigada. +pdfjs-editor-alt-text-add-description-label = Agiunghe una descritzione +pdfjs-editor-alt-text-cancel-button = Annulla +pdfjs-editor-alt-text-save-button = Sarva + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + +pdfjs-editor-colorpicker-button = + .title = Modifica su colore +pdfjs-editor-colorpicker-dropdown = + .aria-label = Colores a disponimentu +pdfjs-editor-colorpicker-yellow = + .title = Grogu +pdfjs-editor-colorpicker-green = + .title = Birde +pdfjs-editor-colorpicker-blue = + .title = Biaitu +pdfjs-editor-colorpicker-pink = + .title = Rosa + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button-label = Mancat su testu alternativu +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button-label = Revisiona su testu alternativu +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creadu in automàticu: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Cunfiguratzione de su testu alternativu de is immàgines +pdfjs-image-alt-text-settings-button-label = Cunfiguratzione de su testu alternativu de is immàgines +pdfjs-editor-alt-text-settings-dialog-label = Cunfiguratzione de su testu alternativu de is immàgines +pdfjs-editor-alt-text-settings-automatic-title = Testu alternativu automàticu +pdfjs-editor-alt-text-settings-create-model-button-label = Crea testu alternativu in automàticu +pdfjs-editor-alt-text-settings-create-model-description = Cussìgiat descritziones pro agiudare a gente chi non podet bìdere s’immàgine o cando non benit carrigada. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modellu de IA pro su testu alternativu ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Est esecutadu in locale in manera chi is datos tuos abarrent in privadu. Rechestu pro sa generatzione automàtica de testu alternativu. +pdfjs-editor-alt-text-settings-delete-model-button = Cantzella +pdfjs-editor-alt-text-settings-download-model-button = Iscàrriga +pdfjs-editor-alt-text-settings-downloading-model-button = Iscarrighende… +pdfjs-editor-alt-text-settings-editor-title = Editore de testu alternativu +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mustra deretu s’editore de testu alternativu cando siat agiunta un’immàgine +pdfjs-editor-alt-text-settings-show-dialog-description = T’agiudat a assegurare chi totu is immàgines tuas tèngiant unu testu alternativu. +pdfjs-editor-alt-text-settings-close-button = Serra diff --git a/public/pdfjs/web/locale/scn/viewer.ftl b/public/pdfjs/web/locale/scn/viewer.ftl new file mode 100644 index 0000000..a3c7c03 --- /dev/null +++ b/public/pdfjs/web/locale/scn/viewer.ftl @@ -0,0 +1,74 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-zoom-out-button = + .title = Cchiù nicu +pdfjs-zoom-out-button-label = Cchiù nicu +pdfjs-zoom-in-button = + .title = Cchiù granni +pdfjs-zoom-in-button-label = Cchiù granni + +## Secondary toolbar and context menu + + +## Document properties dialog + + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Vista web lesta: +pdfjs-document-properties-linearized-yes = Se + +## Print + +pdfjs-print-progress-close-button = Sfai + +## Tooltips and alt text for side panel toolbar buttons + + +## Thumbnails panel item (tooltip and alt text for images) + + +## Find panel button title and messages + + +## Predefined zoom values + +pdfjs-page-scale-width = Larghizza dâ pàggina + +## PDF page + + +## Loading indicator messages + + +## Annotations + + +## Password + +pdfjs-password-cancel-button = Sfai + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/sco/viewer.ftl b/public/pdfjs/web/locale/sco/viewer.ftl new file mode 100644 index 0000000..6f71c47 --- /dev/null +++ b/public/pdfjs/web/locale/sco/viewer.ftl @@ -0,0 +1,264 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Page Afore +pdfjs-previous-button-label = Previous +pdfjs-next-button = + .title = Page Efter +pdfjs-next-button-label = Neist +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Page +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = o { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } o { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zoom Oot +pdfjs-zoom-out-button-label = Zoom Oot +pdfjs-zoom-in-button = + .title = Zoom In +pdfjs-zoom-in-button-label = Zoom In +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Flit tae Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Open File +pdfjs-open-file-button-label = Open +pdfjs-print-button = + .title = Prent +pdfjs-print-button-label = Prent + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Tools +pdfjs-tools-button-label = Tools +pdfjs-first-page-button = + .title = Gang tae First Page +pdfjs-first-page-button-label = Gang tae First Page +pdfjs-last-page-button = + .title = Gang tae Lest Page +pdfjs-last-page-button-label = Gang tae Lest Page +pdfjs-page-rotate-cw-button = + .title = Rotate Clockwise +pdfjs-page-rotate-cw-button-label = Rotate Clockwise +pdfjs-page-rotate-ccw-button = + .title = Rotate Coonterclockwise +pdfjs-page-rotate-ccw-button-label = Rotate Coonterclockwise +pdfjs-cursor-text-select-tool-button = + .title = Enable Text Walin Tool +pdfjs-cursor-text-select-tool-button-label = Text Walin Tool +pdfjs-cursor-hand-tool-button = + .title = Enable Haun Tool +pdfjs-cursor-hand-tool-button-label = Haun Tool +pdfjs-scroll-vertical-button = + .title = Yaise Vertical Scrollin +pdfjs-scroll-vertical-button-label = Vertical Scrollin +pdfjs-scroll-horizontal-button = + .title = Yaise Horizontal Scrollin +pdfjs-scroll-horizontal-button-label = Horizontal Scrollin +pdfjs-scroll-wrapped-button = + .title = Yaise Wrapped Scrollin +pdfjs-scroll-wrapped-button-label = Wrapped Scrollin +pdfjs-spread-none-button = + .title = Dinnae jyn page spreids +pdfjs-spread-none-button-label = Nae Spreids +pdfjs-spread-odd-button = + .title = Jyn page spreids stertin wi odd-numbered pages +pdfjs-spread-odd-button-label = Odd Spreids +pdfjs-spread-even-button = + .title = Jyn page spreids stertin wi even-numbered pages +pdfjs-spread-even-button-label = Even Spreids + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Document Properties… +pdfjs-document-properties-button-label = Document Properties… +pdfjs-document-properties-file-name = File nemme: +pdfjs-document-properties-file-size = File size: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Title: +pdfjs-document-properties-author = Author: +pdfjs-document-properties-subject = Subjeck: +pdfjs-document-properties-keywords = Keywirds: +pdfjs-document-properties-creation-date = Date o Makkin: +pdfjs-document-properties-modification-date = Date o Chynges: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Makker: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Page Coont: +pdfjs-document-properties-page-size = Page Size: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portrait +pdfjs-document-properties-page-size-orientation-landscape = landscape +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Wab View: +pdfjs-document-properties-linearized-yes = Aye +pdfjs-document-properties-linearized-no = Naw +pdfjs-document-properties-close-button = Sneck + +## Print + +pdfjs-print-progress-message = Reddin document fur prentin… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Stap +pdfjs-printing-not-supported = Tak tent: Prentin isnae richt supportit by this stravaiger. +pdfjs-printing-not-ready = Tak tent: The PDF isnae richt loadit fur prentin. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Toggle Sidebaur +pdfjs-toggle-sidebar-notification-button = + .title = Toggle Sidebaur (document conteens ootline/attachments/layers) +pdfjs-toggle-sidebar-button-label = Toggle Sidebaur +pdfjs-document-outline-button = + .title = Kythe Document Ootline (double-click fur tae oot-fauld/in-fauld aw items) +pdfjs-document-outline-button-label = Document Ootline +pdfjs-attachments-button = + .title = Kythe Attachments +pdfjs-attachments-button-label = Attachments +pdfjs-layers-button = + .title = Kythe Layers (double-click fur tae reset aw layers tae the staunart state) +pdfjs-layers-button-label = Layers +pdfjs-thumbs-button = + .title = Kythe Thumbnails +pdfjs-thumbs-button-label = Thumbnails +pdfjs-current-outline-item-button = + .title = Find Current Ootline Item +pdfjs-current-outline-item-button-label = Current Ootline Item +pdfjs-findbar-button = + .title = Find in Document +pdfjs-findbar-button-label = Find +pdfjs-additional-layers = Mair Layers + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail o Page { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Find + .placeholder = Find in document… +pdfjs-find-previous-button = + .title = Airt oot the last time this phrase occurred +pdfjs-find-previous-button-label = Previous +pdfjs-find-next-button = + .title = Airt oot the neist time this phrase occurs +pdfjs-find-next-button-label = Neist +pdfjs-find-highlight-checkbox = Highlicht aw +pdfjs-find-match-case-checkbox-label = Match case +pdfjs-find-entire-word-checkbox-label = Hale Wirds +pdfjs-find-reached-top = Raxed tap o document, went on fae the dowp end +pdfjs-find-reached-bottom = Raxed end o document, went on fae the tap +pdfjs-find-not-found = Phrase no fund + +## Predefined zoom values + +pdfjs-page-scale-width = Page Width +pdfjs-page-scale-fit = Page Fit +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Actual Size +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Page { $page } + +## Loading indicator messages + +pdfjs-loading-error = An mishanter tuik place while loadin the PDF. +pdfjs-invalid-file-error = No suithfest or camshauchlet PDF file. +pdfjs-missing-file-error = PDF file tint. +pdfjs-unexpected-response-error = Unexpectit server repone. +pdfjs-rendering-error = A mishanter tuik place while renderin the page. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = Inpit the passwird fur tae open this PDF file. +pdfjs-password-invalid = Passwird no suithfest. Gonnae gie it anither shot. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Stap +pdfjs-web-fonts-disabled = Wab fonts are disabled: cannae yaise embeddit PDF fonts. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/si/viewer.ftl b/public/pdfjs/web/locale/si/viewer.ftl new file mode 100644 index 0000000..0481116 --- /dev/null +++ b/public/pdfjs/web/locale/si/viewer.ftl @@ -0,0 +1,271 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = කලින් පිටුව +pdfjs-previous-button-label = කලින් +pdfjs-next-button = + .title = ඊළඟ පිටුව +pdfjs-next-button-label = ඊළඟ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = පිටුව +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = කුඩාලනය +pdfjs-zoom-out-button-label = කුඩාලනය +pdfjs-zoom-in-button = + .title = විශාලනය +pdfjs-zoom-in-button-label = විශාලනය +pdfjs-zoom-select = + .title = විශාල කරන්න +pdfjs-presentation-mode-button = + .title = සමර්පණ ප්‍රකාරය වෙත මාරුවන්න +pdfjs-presentation-mode-button-label = සමර්පණ ප්‍රකාරය +pdfjs-open-file-button = + .title = ගොනුව අරින්න +pdfjs-open-file-button-label = අරින්න +pdfjs-print-button = + .title = මුද්‍රණය +pdfjs-print-button-label = මුද්‍රණය +pdfjs-save-button = + .title = සුරකින්න +pdfjs-save-button-label = සුරකින්න +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = බාගන්න +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = බාගන්න +pdfjs-bookmark-button-label = පවතින පිටුව + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = මෙවලම් +pdfjs-tools-button-label = මෙවලම් +pdfjs-first-page-button = + .title = මුල් පිටුවට යන්න +pdfjs-first-page-button-label = මුල් පිටුවට යන්න +pdfjs-last-page-button = + .title = අවසන් පිටුවට යන්න +pdfjs-last-page-button-label = අවසන් පිටුවට යන්න +pdfjs-cursor-text-select-tool-button = + .title = පෙළ තේරීමේ මෙවලම සබල කරන්න +pdfjs-cursor-text-select-tool-button-label = පෙළ තේරීමේ මෙවලම +pdfjs-cursor-hand-tool-button = + .title = අත් මෙවලම සබල කරන්න +pdfjs-cursor-hand-tool-button-label = අත් මෙවලම +pdfjs-scroll-page-button = + .title = පිටුව අනුචලනය භාවිතය +pdfjs-scroll-page-button-label = පිටුව අනුචලනය +pdfjs-scroll-vertical-button = + .title = සිරස් අනුචලනය භාවිතය +pdfjs-scroll-vertical-button-label = සිරස් අනුචලනය +pdfjs-scroll-horizontal-button = + .title = තිරස් අනුචලනය භාවිතය +pdfjs-scroll-horizontal-button-label = තිරස් අනුචලනය + +## Document properties dialog + +pdfjs-document-properties-button = + .title = ලේඛනයේ ගුණාංග… +pdfjs-document-properties-button-label = ලේඛනයේ ගුණාංග… +pdfjs-document-properties-file-name = ගොනුවේ නම: +pdfjs-document-properties-file-size = ගොනුවේ ප්‍රමාණය: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = කි.බ. { $size_kb } (බයිට { $size_b }) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = මෙ.බ. { $size_mb } (බයිට { $size_b }) +pdfjs-document-properties-title = සිරැසිය: +pdfjs-document-properties-author = කතෘ: +pdfjs-document-properties-subject = මාතෘකාව: +pdfjs-document-properties-keywords = මූල පද: +pdfjs-document-properties-creation-date = සෑදූ දිනය: +pdfjs-document-properties-modification-date = සංශෝධිත දිනය: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = නිර්මාතෘ: +pdfjs-document-properties-producer = පීඩීඑෆ් සම්පාදක: +pdfjs-document-properties-version = පීඩීඑෆ් අනුවාදය: +pdfjs-document-properties-page-count = පිටු ගණන: +pdfjs-document-properties-page-size = පිටුවේ තරම: +pdfjs-document-properties-page-size-unit-inches = අඟල් +pdfjs-document-properties-page-size-unit-millimeters = මි.මී. +pdfjs-document-properties-page-size-orientation-portrait = සිරස් +pdfjs-document-properties-page-size-orientation-landscape = තිරස් +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width }×{ $height }{ $unit }{ $name }{ $orientation } + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = වේගවත් වියමන දැක්ම: +pdfjs-document-properties-linearized-yes = ඔව් +pdfjs-document-properties-linearized-no = නැහැ +pdfjs-document-properties-close-button = වසන්න + +## Print + +pdfjs-print-progress-message = මුද්‍රණය සඳහා ලේඛනය සූදානම් වෙමින්… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = අවලංගු කරන්න +pdfjs-printing-not-supported = අවවාදයයි: මෙම අතිරික්සුව මුද්‍රණය සඳහා හොඳින් සහාය නොදක්වයි. +pdfjs-printing-not-ready = අවවාදයයි: මුද්‍රණයට පීඩීඑෆ් ගොනුව සම්පූර්ණයෙන් පූරණය වී නැත. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-document-outline-button-label = ලේඛනයේ වටසන +pdfjs-attachments-button = + .title = ඇමුණුම් පෙන්වන්න +pdfjs-attachments-button-label = ඇමුණුම් +pdfjs-layers-button = + .title = ස්තර පෙන්වන්න (සියළු ස්තර පෙරනිමි තත්‍වයට යළි සැකසීමට දෙවරක් ඔබන්න) +pdfjs-layers-button-label = ස්තර +pdfjs-thumbs-button = + .title = සිඟිති රූ පෙන්වන්න +pdfjs-thumbs-button-label = සිඟිති රූ +pdfjs-findbar-button = + .title = ලේඛනයෙහි සොයන්න +pdfjs-findbar-button-label = සොයන්න +pdfjs-additional-layers = අතිරේක ස්තර + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = පිටුව { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = පිටුවේ සිඟිත රූව { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = සොයන්න + .placeholder = ලේඛනයේ සොයන්න… +pdfjs-find-previous-button = + .title = මෙම වැකිකඩ කලින් යෙදුණු ස්ථානය සොයන්න +pdfjs-find-previous-button-label = කලින් +pdfjs-find-next-button = + .title = මෙම වැකිකඩ ඊළඟට යෙදෙන ස්ථානය සොයන්න +pdfjs-find-next-button-label = ඊළඟ +pdfjs-find-highlight-checkbox = සියල්ල උද්දීපනය +pdfjs-find-entire-word-checkbox-label = සමස්ත වචන +pdfjs-find-reached-top = ලේඛනයේ මුදුනට ළඟා විය, පහළ සිට ඉහළට +pdfjs-find-reached-bottom = ලේඛනයේ අවසානයට ළඟා විය, ඉහළ සිට පහළට +pdfjs-find-not-found = වැකිකඩ හමු නොවුණි + +## Predefined zoom values + +pdfjs-page-scale-width = පිටුවේ පළල +pdfjs-page-scale-auto = ස්වයංක්‍රීය විශාලනය +pdfjs-page-scale-actual = සැබෑ ප්‍රමාණය +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = පිටුව { $page } + +## Loading indicator messages + +pdfjs-loading-error = පීඩීඑෆ් පූරණය කිරීමේදී දෝෂයක් සිදු විය. +pdfjs-invalid-file-error = වලංගු නොවන හෝ හානිවූ පීඩීඑෆ් ගොනුවකි. +pdfjs-missing-file-error = මඟහැරුණු පීඩීඑෆ් ගොනුවකි. +pdfjs-unexpected-response-error = අනපේක්‍ෂිත සේවාදායක ප්‍රතිචාරයකි. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } + +## Password + +pdfjs-password-label = මෙම පීඩීඑෆ් ගොනුව විවෘත කිරීමට මුරපදය යොදන්න. +pdfjs-password-invalid = වැරදි මුරපදයකි. නැවත උත්සාහ කරන්න. +pdfjs-password-ok-button = හරි +pdfjs-password-cancel-button = අවලංගු +pdfjs-web-fonts-disabled = වියමන අකුරු අබලයි: පීඩීඑෆ් වෙත කාවැද්දූ රුවකුරු භාවිතා කළ නොහැකිය. + +## Editing + +pdfjs-editor-free-text-button = + .title = පෙළ +pdfjs-editor-free-text-button-label = පෙළ +pdfjs-editor-ink-button = + .title = අඳින්න +pdfjs-editor-ink-button-label = අඳින්න +pdfjs-editor-stamp-button = + .title = රූප සංස්කරණය හෝ එක් කරන්න +pdfjs-editor-stamp-button-label = රූප සංස්කරණය හෝ එක් කරන්න + +## Remove button for the various kind of editor. + + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = වර්ණය +pdfjs-editor-free-text-size-input = තරම +pdfjs-editor-ink-color-input = වර්ණය +pdfjs-editor-ink-thickness-input = ඝණකම +pdfjs-free-text = + .aria-label = වදන් සකසනය +pdfjs-free-text-default-content = ලිවීීම අරඹන්න… + +## Alt-text dialog + +pdfjs-editor-alt-text-mark-decorative-description = මෙය දාර හෝ දිය සලකුණු වැනි අලංකාර රූප සඳහා භාවිතා වේ. + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + + +## Color picker + + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/sk/viewer.ftl b/public/pdfjs/web/locale/sk/viewer.ftl new file mode 100644 index 0000000..5cbbb8d --- /dev/null +++ b/public/pdfjs/web/locale/sk/viewer.ftl @@ -0,0 +1,521 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Predchádzajúca strana +pdfjs-previous-button-label = Predchádzajúca +pdfjs-next-button = + .title = Nasledujúca strana +pdfjs-next-button-label = Nasledujúca +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Strana +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = z { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zmenšiť veľkosť +pdfjs-zoom-out-button-label = Zmenšiť veľkosť +pdfjs-zoom-in-button = + .title = Zväčšiť veľkosť +pdfjs-zoom-in-button-label = Zväčšiť veľkosť +pdfjs-zoom-select = + .title = Nastavenie veľkosti +pdfjs-presentation-mode-button = + .title = Prepnúť na režim prezentácie +pdfjs-presentation-mode-button-label = Režim prezentácie +pdfjs-open-file-button = + .title = Otvoriť súbor +pdfjs-open-file-button-label = Otvoriť +pdfjs-print-button = + .title = Tlačiť +pdfjs-print-button-label = Tlačiť +pdfjs-save-button = + .title = Uložiť +pdfjs-save-button-label = Uložiť +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Stiahnuť +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Stiahnuť +pdfjs-bookmark-button = + .title = Aktuálna stránka (zobraziť adresu URL z aktuálnej stránky) +pdfjs-bookmark-button-label = Aktuálna stránka + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Nástroje +pdfjs-tools-button-label = Nástroje +pdfjs-first-page-button = + .title = Prejsť na prvú stranu +pdfjs-first-page-button-label = Prejsť na prvú stranu +pdfjs-last-page-button = + .title = Prejsť na poslednú stranu +pdfjs-last-page-button-label = Prejsť na poslednú stranu +pdfjs-page-rotate-cw-button = + .title = Otočiť v smere hodinových ručičiek +pdfjs-page-rotate-cw-button-label = Otočiť v smere hodinových ručičiek +pdfjs-page-rotate-ccw-button = + .title = Otočiť proti smeru hodinových ručičiek +pdfjs-page-rotate-ccw-button-label = Otočiť proti smeru hodinových ručičiek +pdfjs-cursor-text-select-tool-button = + .title = Povoliť výber textu +pdfjs-cursor-text-select-tool-button-label = Výber textu +pdfjs-cursor-hand-tool-button = + .title = Povoliť nástroj ruka +pdfjs-cursor-hand-tool-button-label = Nástroj ruka +pdfjs-scroll-page-button = + .title = Použiť rolovanie po stránkach +pdfjs-scroll-page-button-label = Rolovanie po stránkach +pdfjs-scroll-vertical-button = + .title = Používať zvislé posúvanie +pdfjs-scroll-vertical-button-label = Zvislé posúvanie +pdfjs-scroll-horizontal-button = + .title = Používať vodorovné posúvanie +pdfjs-scroll-horizontal-button-label = Vodorovné posúvanie +pdfjs-scroll-wrapped-button = + .title = Použiť postupné posúvanie +pdfjs-scroll-wrapped-button-label = Postupné posúvanie +pdfjs-spread-none-button = + .title = Nezdružovať stránky +pdfjs-spread-none-button-label = Žiadne združovanie +pdfjs-spread-odd-button = + .title = Združí stránky a umiestni nepárne stránky vľavo +pdfjs-spread-odd-button-label = Združiť stránky (nepárne vľavo) +pdfjs-spread-even-button = + .title = Združí stránky a umiestni párne stránky vľavo +pdfjs-spread-even-button-label = Združiť stránky (párne vľavo) + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Vlastnosti dokumentu… +pdfjs-document-properties-button-label = Vlastnosti dokumentu… +pdfjs-document-properties-file-name = Názov súboru: +pdfjs-document-properties-file-size = Veľkosť súboru: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bajtov) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bajtov) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtov) +pdfjs-document-properties-title = Názov: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Predmet: +pdfjs-document-properties-keywords = Kľúčové slová: +pdfjs-document-properties-creation-date = Dátum vytvorenia: +pdfjs-document-properties-modification-date = Dátum úpravy: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Aplikácia: +pdfjs-document-properties-producer = Tvorca PDF: +pdfjs-document-properties-version = Verzia PDF: +pdfjs-document-properties-page-count = Počet strán: +pdfjs-document-properties-page-size = Veľkosť stránky: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = na výšku +pdfjs-document-properties-page-size-orientation-landscape = na šírku +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = List +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Rýchle zobrazovanie z webu: +pdfjs-document-properties-linearized-yes = Áno +pdfjs-document-properties-linearized-no = Nie +pdfjs-document-properties-close-button = Zavrieť + +## Print + +pdfjs-print-progress-message = Príprava dokumentu na tlač… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Zrušiť +pdfjs-printing-not-supported = Upozornenie: tlač nie je v tomto prehliadači plne podporovaná. +pdfjs-printing-not-ready = Upozornenie: súbor PDF nie je plne načítaný pre tlač. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Prepnúť bočný panel +pdfjs-toggle-sidebar-notification-button = + .title = Prepnúť bočný panel (dokument obsahuje osnovu/prílohy/vrstvy) +pdfjs-toggle-sidebar-button-label = Prepnúť bočný panel +pdfjs-document-outline-button = + .title = Zobraziť osnovu dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky) +pdfjs-document-outline-button-label = Osnova dokumentu +pdfjs-attachments-button = + .title = Zobraziť prílohy +pdfjs-attachments-button-label = Prílohy +pdfjs-layers-button = + .title = Zobraziť vrstvy (dvojitým kliknutím uvediete všetky vrstvy do pôvodného stavu) +pdfjs-layers-button-label = Vrstvy +pdfjs-thumbs-button = + .title = Zobraziť miniatúry +pdfjs-thumbs-button-label = Miniatúry +pdfjs-current-outline-item-button = + .title = Nájsť aktuálnu položku v osnove +pdfjs-current-outline-item-button-label = Aktuálna položka v osnove +pdfjs-findbar-button = + .title = Hľadať v dokumente +pdfjs-findbar-button-label = Hľadať +pdfjs-additional-layers = Ďalšie vrstvy + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Strana { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatúra strany { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Hľadať + .placeholder = Hľadať v dokumente… +pdfjs-find-previous-button = + .title = Vyhľadať predchádzajúci výskyt reťazca +pdfjs-find-previous-button-label = Predchádzajúce +pdfjs-find-next-button = + .title = Vyhľadať ďalší výskyt reťazca +pdfjs-find-next-button-label = Ďalšie +pdfjs-find-highlight-checkbox = Zvýrazniť všetky +pdfjs-find-match-case-checkbox-label = Rozlišovať veľkosť písmen +pdfjs-find-match-diacritics-checkbox-label = Rozlišovať diakritiku +pdfjs-find-entire-word-checkbox-label = Celé slová +pdfjs-find-reached-top = Bol dosiahnutý začiatok stránky, pokračuje sa od konca +pdfjs-find-reached-bottom = Bol dosiahnutý koniec stránky, pokračuje sa od začiatku +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Výskyt { $current } z { $total } + [few] Výskyt { $current } z { $total } + [many] Výskyt { $current } z { $total } + *[other] Výskyt { $current } z { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Viac ako { $limit } výskyt + [few] Viac ako { $limit } výskyty + [many] Viac ako { $limit } výskytov + *[other] Viac ako { $limit } výskytov + } +pdfjs-find-not-found = Výraz nebol nájdený + +## Predefined zoom values + +pdfjs-page-scale-width = Na šírku strany +pdfjs-page-scale-fit = Na veľkosť strany +pdfjs-page-scale-auto = Automatická veľkosť +pdfjs-page-scale-actual = Skutočná veľkosť +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Strana { $page } + +## Loading indicator messages + +pdfjs-loading-error = Počas načítavania dokumentu PDF sa vyskytla chyba. +pdfjs-invalid-file-error = Neplatný alebo poškodený súbor PDF. +pdfjs-missing-file-error = Chýbajúci súbor PDF. +pdfjs-unexpected-response-error = Neočakávaná odpoveď zo servera. +pdfjs-rendering-error = Pri vykresľovaní stránky sa vyskytla chyba. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotácia typu { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo. +pdfjs-password-invalid = Heslo nie je platné. Skúste to znova. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Zrušiť +pdfjs-web-fonts-disabled = Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Kresliť +pdfjs-editor-ink-button-label = Kresliť +pdfjs-editor-stamp-button = + .title = Pridať alebo upraviť obrázky +pdfjs-editor-stamp-button-label = Pridať alebo upraviť obrázky +pdfjs-editor-highlight-button = + .title = Zvýrazniť +pdfjs-editor-highlight-button-label = Zvýrazniť +pdfjs-highlight-floating-button1 = + .title = Zvýrazniť + .aria-label = Zvýrazniť +pdfjs-highlight-floating-button-label = Zvýrazniť + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Odstrániť kresbu +pdfjs-editor-remove-freetext-button = + .title = Odstrániť text +pdfjs-editor-remove-stamp-button = + .title = Odstrániť obrázok +pdfjs-editor-remove-highlight-button = + .title = Odstrániť zvýraznenie + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Farba +pdfjs-editor-free-text-size-input = Veľkosť +pdfjs-editor-ink-color-input = Farba +pdfjs-editor-ink-thickness-input = Hrúbka +pdfjs-editor-ink-opacity-input = Priehľadnosť +pdfjs-editor-stamp-add-image-button = + .title = Pridať obrázok +pdfjs-editor-stamp-add-image-button-label = Pridať obrázok +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Hrúbka +pdfjs-editor-free-highlight-thickness-title = + .title = Zmeňte hrúbku pre zvýrazňovanie iných položiek ako textu +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Textový editor + .default-content = Začnite písať… +pdfjs-free-text = + .aria-label = Textový editor +pdfjs-free-text-default-content = Začnite písať… +pdfjs-ink = + .aria-label = Editor kreslenia +pdfjs-ink-canvas = + .aria-label = Obrázok vytvorený používateľom + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternatívny text +pdfjs-editor-alt-text-edit-button = + .aria-label = Upraviť alternatívny text +pdfjs-editor-alt-text-edit-button-label = Upraviť alternatívny text +pdfjs-editor-alt-text-dialog-label = Vyberte možnosť +pdfjs-editor-alt-text-dialog-description = Alternatívny text (alt text) pomáha, keď ľudia obrázok nevidia alebo sa nenačítava. +pdfjs-editor-alt-text-add-description-label = Pridať popis +pdfjs-editor-alt-text-add-description-description = Zamerajte sa na 1-2 vety, ktoré popisujú predmet, prostredie alebo akcie. +pdfjs-editor-alt-text-mark-decorative-label = Označiť ako dekoratívny +pdfjs-editor-alt-text-mark-decorative-description = Používa sa na ozdobné obrázky, ako sú okraje alebo vodoznaky. +pdfjs-editor-alt-text-cancel-button = Zrušiť +pdfjs-editor-alt-text-save-button = Uložiť +pdfjs-editor-alt-text-decorative-tooltip = Označený ako dekoratívny +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Napríklad: „Mladý muž si sadá za stôl, aby sa najedol“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatívny text + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Ľavý horný roh – zmena veľkosti +pdfjs-editor-resizer-label-top-middle = Horný stred – zmena veľkosti +pdfjs-editor-resizer-label-top-right = Pravý horný roh – zmena veľkosti +pdfjs-editor-resizer-label-middle-right = Vpravo uprostred – zmena veľkosti +pdfjs-editor-resizer-label-bottom-right = Pravý dolný roh – zmena veľkosti +pdfjs-editor-resizer-label-bottom-middle = Stred dole – zmena veľkosti +pdfjs-editor-resizer-label-bottom-left = Ľavý dolný roh – zmena veľkosti +pdfjs-editor-resizer-label-middle-left = Vľavo uprostred – zmena veľkosti +pdfjs-editor-resizer-top-left = + .aria-label = Ľavý horný roh – zmena veľkosti +pdfjs-editor-resizer-top-middle = + .aria-label = Horný stred – zmena veľkosti +pdfjs-editor-resizer-top-right = + .aria-label = Pravý horný roh – zmena veľkosti +pdfjs-editor-resizer-middle-right = + .aria-label = Vpravo uprostred – zmena veľkosti +pdfjs-editor-resizer-bottom-right = + .aria-label = Pravý dolný roh – zmena veľkosti +pdfjs-editor-resizer-bottom-middle = + .aria-label = Stred dole – zmena veľkosti +pdfjs-editor-resizer-bottom-left = + .aria-label = Ľavý dolný roh – zmena veľkosti +pdfjs-editor-resizer-middle-left = + .aria-label = Vľavo uprostred – zmena veľkosti + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Farba zvýraznenia +pdfjs-editor-colorpicker-button = + .title = Zmeniť farbu +pdfjs-editor-colorpicker-dropdown = + .aria-label = Výber farieb +pdfjs-editor-colorpicker-yellow = + .title = Žltá +pdfjs-editor-colorpicker-green = + .title = Zelená +pdfjs-editor-colorpicker-blue = + .title = Modrá +pdfjs-editor-colorpicker-pink = + .title = Ružová +pdfjs-editor-colorpicker-red = + .title = Červená + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Zobraziť všetko +pdfjs-editor-highlight-show-all-button = + .title = Zobraziť všetko + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Upraviť alternatívny text (popis obrázka) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Pridať alternatívny text (popis obrázka) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Sem napíšte svoj popis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krátky popis pre ľudí, ktorí nevidia obrázok alebo ak sa obrázok nenačíta. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tento alternatívny text bol vytvorený automaticky a môže byť nepresný. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ďalšie informácie +pdfjs-editor-new-alt-text-create-automatically-button-label = Automaticky vytvoriť alternatívny text +pdfjs-editor-new-alt-text-not-now-button = Teraz nie +pdfjs-editor-new-alt-text-error-title = Alternatívny text sa nepodarilo vytvoriť automaticky +pdfjs-editor-new-alt-text-error-description = Napíšte svoj vlastný alternatívny text alebo to skúste znova neskôr. +pdfjs-editor-new-alt-text-error-close-button = Zavrieť +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Sťahuje sa model AI pre alternatívne texty ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Sťahuje sa model AI pre alternatívne texty ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatívny text bol pridaný +pdfjs-editor-new-alt-text-added-button-label = Alternatívny text bol pridaný +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Chýbajúci alternatívny text +pdfjs-editor-new-alt-text-missing-button-label = Chýbajúci alternatívny text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Skontrolovať alternatívny text +pdfjs-editor-new-alt-text-to-review-button-label = Skontrolovať alternatívny text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Vytvorené automaticky: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastavenia alternatívneho textu obrázka +pdfjs-image-alt-text-settings-button-label = Nastavenia alternatívneho textu obrázka +pdfjs-editor-alt-text-settings-dialog-label = Nastavenia alternatívneho textu obrázka +pdfjs-editor-alt-text-settings-automatic-title = Automatický alternatívny text +pdfjs-editor-alt-text-settings-create-model-button-label = Automaticky vytvoriť alternatívny text +pdfjs-editor-alt-text-settings-create-model-description = Navrhuje popisy, ktoré pomôžu ľuďom, ktorým sa obrázok nezobrazuje alebo ak sa obrázok nenačíta. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI pre alternatívne texty ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Beží lokálne na vašom zariadení, takže vaše dáta zostanú súkromné. Vyžaduje sa pre automatický alternatívny text. +pdfjs-editor-alt-text-settings-delete-model-button = Odstrániť +pdfjs-editor-alt-text-settings-download-model-button = Stiahnuť +pdfjs-editor-alt-text-settings-downloading-model-button = Sťahuje sa… +pdfjs-editor-alt-text-settings-editor-title = Editor alternatívneho textu +pdfjs-editor-alt-text-settings-show-dialog-button-label = Pri pridávaní obrázka ihneď zobraziť editor alternatívneho textu +pdfjs-editor-alt-text-settings-show-dialog-description = Pomáha vám zabezpečiť, aby všetky vaše obrázky mali alternatívny text. +pdfjs-editor-alt-text-settings-close-button = Zavrieť + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Zvýraznenie bolo odstránené +pdfjs-editor-undo-bar-message-freetext = Text bol odstránený +pdfjs-editor-undo-bar-message-ink = Kreslenie bolo odstránené +pdfjs-editor-undo-bar-message-stamp = Obrázok bol odstránený +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotácia odstránená + [few] { $count } anotácie odstránené + [many] { $count } anotácií odstránených + *[other] { $count } anotácií odstránených + } +pdfjs-editor-undo-bar-undo-button = + .title = Späť +pdfjs-editor-undo-bar-undo-button-label = Späť +pdfjs-editor-undo-bar-close-button = + .title = Zavrieť +pdfjs-editor-undo-bar-close-button-label = Zavrieť diff --git a/public/pdfjs/web/locale/skr/viewer.ftl b/public/pdfjs/web/locale/skr/viewer.ftl new file mode 100644 index 0000000..2d0e87f --- /dev/null +++ b/public/pdfjs/web/locale/skr/viewer.ftl @@ -0,0 +1,498 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = پچھلا ورقہ +pdfjs-previous-button-label = پچھلا +pdfjs-next-button = + .title = اڳلا ورقہ +pdfjs-next-button-label = اڳلا +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = ورقہ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } دا +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } دا { $pagesCount }) +pdfjs-zoom-out-button = + .title = زوم آؤٹ +pdfjs-zoom-out-button-label = زوم آؤٹ +pdfjs-zoom-in-button = + .title = زوم اِن +pdfjs-zoom-in-button-label = زوم اِن +pdfjs-zoom-select = + .title = زوم +pdfjs-presentation-mode-button = + .title = پریزنٹیشن موڈ تے سوئچ کرو +pdfjs-presentation-mode-button-label = پریزنٹیشن موڈ +pdfjs-open-file-button = + .title = فائل کھولو +pdfjs-open-file-button-label = کھولو +pdfjs-print-button = + .title = چھاپو +pdfjs-print-button-label = چھاپو +pdfjs-save-button = + .title = ہتھیکڑا کرو +pdfjs-save-button-label = ہتھیکڑا کرو +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ڈاؤن لوڈ +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ڈاؤن لوڈ +pdfjs-bookmark-button = + .title = موجودہ ورقہ (موجودہ ورقے کنوں یوآرایل ݙیکھو) +pdfjs-bookmark-button-label = موجودہ ورقہ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = اوزار +pdfjs-tools-button-label = اوزار +pdfjs-first-page-button = + .title = پہلے ورقے تے ونڄو +pdfjs-first-page-button-label = پہلے ورقے تے ونڄو +pdfjs-last-page-button = + .title = چھیکڑی ورقے تے ونڄو +pdfjs-last-page-button-label = چھیکڑی ورقے تے ونڄو +pdfjs-page-rotate-cw-button = + .title = گھڑی وانگوں گھماؤ +pdfjs-page-rotate-cw-button-label = گھڑی وانگوں گھماؤ +pdfjs-page-rotate-ccw-button = + .title = گھڑی تے اُپٹھ گھماؤ +pdfjs-page-rotate-ccw-button-label = گھڑی تے اُپٹھ گھماؤ +pdfjs-cursor-text-select-tool-button = + .title = متن منتخب کݨ والا آلہ فعال بݨاؤ +pdfjs-cursor-text-select-tool-button-label = متن منتخب کرݨ والا آلہ +pdfjs-cursor-hand-tool-button = + .title = ہینڈ ٹول فعال بݨاؤ +pdfjs-cursor-hand-tool-button-label = ہینڈ ٹول +pdfjs-scroll-page-button = + .title = پیج سکرولنگ استعمال کرو +pdfjs-scroll-page-button-label = پیج سکرولنگ +pdfjs-scroll-vertical-button = + .title = عمودی سکرولنگ استعمال کرو +pdfjs-scroll-vertical-button-label = عمودی سکرولنگ +pdfjs-scroll-horizontal-button = + .title = افقی سکرولنگ استعمال کرو +pdfjs-scroll-horizontal-button-label = افقی سکرولنگ +pdfjs-scroll-wrapped-button = + .title = ویڑھی ہوئی سکرولنگ استعمال کرو +pdfjs-scroll-wrapped-button-label = وہڑھی ہوئی سکرولنگ +pdfjs-spread-none-button = + .title = پیج سپریڈز وِچ شامل نہ تھیوو۔ +pdfjs-spread-none-button-label = کوئی پولھ کائنی +pdfjs-spread-odd-button = + .title = طاق نمبر والے ورقیاں دے نال شروع تھیوݨ والے پیج سپریڈز وِچ شامل تھیوو۔ +pdfjs-spread-odd-button-label = تاک پھیلاؤ +pdfjs-spread-even-button = + .title = جفت نمر والے ورقیاں نال شروع تھیوݨ والے پیج سپریڈز وِ شامل تھیوو۔ +pdfjs-spread-even-button-label = جفت پھیلاؤ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = دستاویز خواص… +pdfjs-document-properties-button-label = دستاویز خواص … +pdfjs-document-properties-file-name = فائل دا ناں: +pdfjs-document-properties-file-size = فائل دا سائز: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } بائٹاں) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } بائٹاں) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } کے بی ({ $size_b } بائٹس) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } ایم بی ({ $size_b } بائٹس) +pdfjs-document-properties-title = عنوان: +pdfjs-document-properties-author = تخلیق کار: +pdfjs-document-properties-subject = موضوع: +pdfjs-document-properties-keywords = کلیدی الفاظ: +pdfjs-document-properties-creation-date = تخلیق دی تاریخ: +pdfjs-document-properties-modification-date = ترمیم دی تاریخ: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = تخلیق کار: +pdfjs-document-properties-producer = PDF پیدا کار: +pdfjs-document-properties-version = PDF ورژن: +pdfjs-document-properties-page-count = ورقہ شماری: +pdfjs-document-properties-page-size = ورقہ دی سائز: +pdfjs-document-properties-page-size-unit-inches = وِچ +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = عمودی انداز +pdfjs-document-properties-page-size-orientation-landscape = افقى انداز +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = لیٹر +pdfjs-document-properties-page-size-name-legal = قنونی + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = تکھا ویب نظارہ: +pdfjs-document-properties-linearized-yes = جیا +pdfjs-document-properties-linearized-no = کو +pdfjs-document-properties-close-button = بند کرو + +## Print + +pdfjs-print-progress-message = چھاپݨ کیتے دستاویز تیار تھیندے پئے ہن … +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = منسوخ کرو +pdfjs-printing-not-supported = چتاوݨی: چھپائی ایں براؤزر تے پوری طراں معاونت شدہ کائنی۔ +pdfjs-printing-not-ready = چتاوݨی: PDF چھپائی کیتے پوری طراں لوڈ نئیں تھئی۔ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = سائیڈ بار ٹوگل کرو +pdfjs-toggle-sidebar-notification-button = + .title = سائیڈ بار ٹوگل کرو (دستاویز وِچ آؤٹ لائن/ منسلکات/ پرتاں شامل ہن) +pdfjs-toggle-sidebar-button-label = سائیڈ بار ٹوگل کرو +pdfjs-document-outline-button = + .title = دستاویز دا خاکہ ݙکھاؤ (تمام آئٹمز کوں پھیلاوݨ/سنگوڑݨ کیتے ڈبل کلک کرو) +pdfjs-document-outline-button-label = دستاویز آؤٹ لائن +pdfjs-attachments-button = + .title = نتھیاں ݙکھاؤ +pdfjs-attachments-button-label = منسلکات +pdfjs-layers-button = + .title = پرتاں ݙکھاؤ (تمام پرتاں کوں ڈیفالٹ حالت وِچ دوبارہ ترتیب ݙیوݨ کیتے ڈبل کلک کرو) +pdfjs-layers-button-label = پرتاں +pdfjs-thumbs-button = + .title = تھمبنیل ݙکھاؤ +pdfjs-thumbs-button-label = تھمبنیلز +pdfjs-current-outline-item-button = + .title = موجودہ آؤٹ لائن آئٹم لبھو +pdfjs-current-outline-item-button-label = موجودہ آؤٹ لائن آئٹم +pdfjs-findbar-button = + .title = دستاویز وِچ لبھو +pdfjs-findbar-button-label = لبھو +pdfjs-additional-layers = اضافی پرتاں + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = ورقہ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = ورقے دا تھمبنیل { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = لبھو + .placeholder = دستاویز وِچ لبھو … +pdfjs-find-previous-button = + .title = فقرے دا پچھلا واقعہ لبھو +pdfjs-find-previous-button-label = پچھلا +pdfjs-find-next-button = + .title = فقرے دا اڳلا واقعہ لبھو +pdfjs-find-next-button-label = اڳلا +pdfjs-find-highlight-checkbox = تمام نشابر کرو +pdfjs-find-match-case-checkbox-label = حروف مشابہ کرو +pdfjs-find-match-diacritics-checkbox-label = ڈائیکرٹکس مشابہ کرو +pdfjs-find-entire-word-checkbox-label = تمام الفاظ +pdfjs-find-reached-top = ورقے دے شروع تے پُج ڳیا، تلوں جاری کیتا ڳیا +pdfjs-find-reached-bottom = ورقے دے پاند تے پُڄ ڳیا، اُتوں شروع کیتا ڳیا +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $total } وِچوں { $current } مشابہ + *[other] { $total } وِچوں { $current } مشابے + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] { $limit } توں ودھ مماثلت۔ + *[other] { $limit } توں ودھ مماثلتاں۔ + } +pdfjs-find-not-found = فقرہ نئیں ملیا + +## Predefined zoom values + +pdfjs-page-scale-width = ورقے دی چوڑائی +pdfjs-page-scale-fit = ورقہ فٹنگ +pdfjs-page-scale-auto = آپوں آپ زوم +pdfjs-page-scale-actual = اصل میچا +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = ورقہ { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDF لوڈ کریندے ویلھے نقص آ ڳیا۔ +pdfjs-invalid-file-error = غلط یا خراب شدہ PDF فائل۔ +pdfjs-missing-file-error = PDF فائل غائب ہے۔ +pdfjs-unexpected-response-error = سرور دا غیر متوقع جواب۔ +pdfjs-rendering-error = ورقہ رینڈر کریندے ویلھے ہک خرابی پیش آڳئی۔ + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } تشریح] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = ایہ PDF فائل کھولݨ کیتے پاس ورڈ درج کرو۔ +pdfjs-password-invalid = غلط پاس ورڈ: براہ مہربانی ولدا کوشش کرو۔ +pdfjs-password-ok-button = ٹھیک ہے +pdfjs-password-cancel-button = منسوخ کرو +pdfjs-web-fonts-disabled = ویب فونٹس غیر فعال ہن: ایمبیڈڈ PDF فونٹس استعمال کرݨ کنوں قاصر ہن + +## Editing + +pdfjs-editor-free-text-button = + .title = متن +pdfjs-editor-free-text-button-label = متن +pdfjs-editor-ink-button = + .title = چھکو +pdfjs-editor-ink-button-label = چھکو +pdfjs-editor-stamp-button = + .title = تصویراں کوں شامل کرو یا ترمیم کرو +pdfjs-editor-stamp-button-label = تصویراں کوں شامل کرو یا ترمیم کرو +pdfjs-editor-highlight-button = + .title = نمایاں کرو +pdfjs-editor-highlight-button-label = نمایاں کرو +pdfjs-highlight-floating-button1 = + .title = نمایاں کرو + .aria-label = نمایاں کرو +pdfjs-highlight-floating-button-label = نمایاں کرو + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = ڈرائینگ ہٹاؤ +pdfjs-editor-remove-freetext-button = + .title = متن ہٹاؤ +pdfjs-editor-remove-stamp-button = + .title = تصویر ہٹاؤ +pdfjs-editor-remove-highlight-button = + .title = نمایاں ہٹاؤ + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = رنگ +pdfjs-editor-free-text-size-input = سائز +pdfjs-editor-ink-color-input = رنگ +pdfjs-editor-ink-thickness-input = ٹھولھ +pdfjs-editor-ink-opacity-input = دھندلاپن +pdfjs-editor-stamp-add-image-button = + .title = تصویر شامل کرو +pdfjs-editor-stamp-add-image-button-label = تصویر شامل کرو +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = مُٹاݨ +pdfjs-editor-free-highlight-thickness-title = + .title = متن توں ان٘ج ٻئے شئیں کوں نمایاں کرݨ ویلے مُٹاݨ کوں بدلو +pdfjs-free-text = + .aria-label = ٹیکسٹ ایڈیٹر +pdfjs-free-text-default-content = ٹائپنگ شروع کرو … +pdfjs-ink = + .aria-label = ڈرا ایڈیٹر +pdfjs-ink-canvas = + .aria-label = صارف دی بݨائی ہوئی تصویر + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alt متن +pdfjs-editor-alt-text-edit-button-label = alt متن وِچ ترمیم کرو +pdfjs-editor-alt-text-dialog-label = ہِک اختیار چُݨو +pdfjs-editor-alt-text-dialog-description = Alt متن (متبادل متن) اِیں ویلے مَدَت کرین٘دا ہِے جہڑیلے لوک تصویر کوں نِھیں ݙیکھ سڳدے یا جہڑیلے اِیہ لوڈ کائنی تِھین٘دا۔ +pdfjs-editor-alt-text-add-description-label = تفصیل شامل کرو +pdfjs-editor-alt-text-add-description-description = 1-2 جملیاں دا مقصد جہڑے موضوع، ترتیب، یا اعمال کوں بیان کرین٘دے ہِن۔ +pdfjs-editor-alt-text-mark-decorative-label = آرائشی طور تے نشان زد کرو +pdfjs-editor-alt-text-mark-decorative-description = اِیہ آرائشی تصویراں کِیتے استعمال تِھین٘دا ہِے، جیویں بارڈر یا واٹر مارکس۔ +pdfjs-editor-alt-text-cancel-button = منسوخ +pdfjs-editor-alt-text-save-button = محفوظ +pdfjs-editor-alt-text-decorative-tooltip = آرائشی دے طور تے نشان زد تِھی ڳِیا +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = مثال دے طور تے، "ہِک جؤان کھاݨاں کھاوݨ کِیتے میز اُتّے ٻیٹھا ہِے" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt متن + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = اُتلی کَھٻّی نُکّڑ — سائز بدلو +pdfjs-editor-resizer-label-top-middle = اُتلا وِچلا — سائز بدلو +pdfjs-editor-resizer-label-top-right = اُتلی سَڄّی نُکَّڑ — سائز بدلو +pdfjs-editor-resizer-label-middle-right = وِچلا سڄّا — سائز بدلو +pdfjs-editor-resizer-label-bottom-right = تلوِیں سَڄّی نُکَّڑ — سائز بدلو +pdfjs-editor-resizer-label-bottom-middle = تلواں وِچلا — سائز بدلو +pdfjs-editor-resizer-label-bottom-left = تلوِیں کَھٻّی نُکّڑ — سائز بدلو +pdfjs-editor-resizer-label-middle-left = وِچلا کَھٻّا — سائز بدلو +pdfjs-editor-resizer-top-left = + .aria-label = اُتلی کَھٻّی نُکّڑ — سائز بدلو +pdfjs-editor-resizer-top-middle = + .aria-label = اُتلا وِچلا — سائز بدلو +pdfjs-editor-resizer-top-right = + .aria-label = اُتلی سَڄّی نُکَّڑ — سائز بدلو +pdfjs-editor-resizer-middle-right = + .aria-label = وِچلا سڄّا — سائز بدلو +pdfjs-editor-resizer-bottom-right = + .aria-label = تلوِیں سَڄّی نُکَّڑ — سائز بدلو +pdfjs-editor-resizer-bottom-middle = + .aria-label = تلواں وِچلا — سائز بدلو +pdfjs-editor-resizer-bottom-left = + .aria-label = تلوِیں کَھٻّی نُکّڑ — سائز بدلو +pdfjs-editor-resizer-middle-left = + .aria-label = وِچلا کَھٻّا — سائز بدلو + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = نشابر رنگ +pdfjs-editor-colorpicker-button = + .title = رنگ بدلو +pdfjs-editor-colorpicker-dropdown = + .aria-label = رنگ اختیارات +pdfjs-editor-colorpicker-yellow = + .title = پیلا +pdfjs-editor-colorpicker-green = + .title = ساوا +pdfjs-editor-colorpicker-blue = + .title = نیلا +pdfjs-editor-colorpicker-pink = + .title = گلابی +pdfjs-editor-colorpicker-red = + .title = لال + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = سارے ݙکھاؤ +pdfjs-editor-highlight-show-all-button = + .title = سارے ݙکھاؤ + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = آلٹ عبارت وچ تبدیلی کرو (تصویر تفصیل) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = آلٹ عبارت شامل کرو (تصویر تفصیل) +pdfjs-editor-new-alt-text-textarea = + .placeholder = اتھ آپݨی وضاحت لکھو۔۔۔ +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = اُنہاں لوکاں کیتے مختصر تفصیل جہڑے تصویر کائنی ݙیکھ سڳدے یا ڄݙݨ تصویر لوڈ کائبی تھیندی۔ +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = آلٹ عبارت خودکار تخلیق تھئی ہے تے غلط تھی سڳدی ہے۔ +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ٻیا سِکھو +pdfjs-editor-new-alt-text-create-automatically-button-label = آلٹ عبارت خودکار بݨاؤ +pdfjs-editor-new-alt-text-not-now-button = ہݨ کائناں +pdfjs-editor-new-alt-text-error-title = آلٹ عبارت خودکار نہ بݨاؤ +pdfjs-editor-new-alt-text-error-description = سوہݨا، آپݨی آلٹ عبارت لکھو یا ولدا بعد وچ کوشش کرو۔ +pdfjs-editor-new-alt-text-error-close-button = بند کرو +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = آلٹ عبارت اے آئی ماڈل({ $totalSize }ایم بی دے { $downloadedSize }) ڈاؤن لوڈ تھیندا پئے + .aria-valuetext = آلٹ عبارت اے آئی ماڈل({ $totalSize }ایم بی دے { $downloadedSize }) ڈاؤن لوڈ تھیندا پئے +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = آلٹ عبارت شامل تھی ڳئی +pdfjs-editor-new-alt-text-added-button-label = آلٹ عبارت شامل تھی ڳئی +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = متبادل عبارت غائب ہے +pdfjs-editor-new-alt-text-missing-button-label = متبادل عبارت غائب ہے +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = alt متن تے نظرثانی کرو +pdfjs-editor-new-alt-text-to-review-button-label = alt متن تے نظرثانی کرو +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = خودکار تخلیق تھئی: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = تصویر آلٹ عبارت ترتیباں +pdfjs-image-alt-text-settings-button-label = تصویر آلٹ عبارت ترتیباں +pdfjs-editor-alt-text-settings-dialog-label = تصویر آلٹ عبارت ترتیباں +pdfjs-editor-alt-text-settings-automatic-title = خودکار آلٹ عبارت +pdfjs-editor-alt-text-settings-create-model-button-label = آلٹ عبارت خودکار بݨاؤ +pdfjs-editor-alt-text-settings-create-model-description = اُنہاں لوکاں دی مدد کیتے تفصیل تجویز کرو جہڑے تصویر کائنی ݙیکھ سڳدے یا ڄݙݨ تصویر لوڈ کائبی تھیندی۔ +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = آلٹ عبارت اے آئی ماڈل ({ $totalSize } ایم بی) +pdfjs-editor-alt-text-settings-ai-model-description = تہاݙی ڈیوائس تے مقامی طور تے چلدا ہے تاں جو تہاݙا ڈیٹا نجی رہوے۔ خودکار آلٹ عبارت کیتے ضروری ہے۔ +pdfjs-editor-alt-text-settings-delete-model-button = مٹاؤ +pdfjs-editor-alt-text-settings-download-model-button = ڈاؤن لوڈ +pdfjs-editor-alt-text-settings-downloading-model-button = ڈاؤن لوڈ تھیندا پئے … +pdfjs-editor-alt-text-settings-editor-title = متبادل ٹیکسٹ ایڈیٹر +pdfjs-editor-alt-text-settings-show-dialog-button-label = تصویر شامل کرݨ ویلے فوری طور تے آلٹ ٹیکسٹ ایڈیٹر ݙکھاؤ +pdfjs-editor-alt-text-settings-show-dialog-description = ایہ تہاکوں یقینی بݨاوݨ وچ مدد کریندے جو تہاݙیاں ساریاں تصویراں وچ آلٹ عبارت ہے۔ +pdfjs-editor-alt-text-settings-close-button = بند کرو + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-undo-button = + .title = کیتا اݨ کیتا +pdfjs-editor-undo-bar-undo-button-label = کیتا اݨ کیتا +pdfjs-editor-undo-bar-close-button = + .title = بند کرو +pdfjs-editor-undo-bar-close-button-label = بند کرو diff --git a/public/pdfjs/web/locale/sl/viewer.ftl b/public/pdfjs/web/locale/sl/viewer.ftl new file mode 100644 index 0000000..4e004bd --- /dev/null +++ b/public/pdfjs/web/locale/sl/viewer.ftl @@ -0,0 +1,521 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Prejšnja stran +pdfjs-previous-button-label = Nazaj +pdfjs-next-button = + .title = Naslednja stran +pdfjs-next-button-label = Naprej +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Stran +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = od { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } od { $pagesCount }) +pdfjs-zoom-out-button = + .title = Pomanjšaj +pdfjs-zoom-out-button-label = Pomanjšaj +pdfjs-zoom-in-button = + .title = Povečaj +pdfjs-zoom-in-button-label = Povečaj +pdfjs-zoom-select = + .title = Povečava +pdfjs-presentation-mode-button = + .title = Preklopi v način predstavitve +pdfjs-presentation-mode-button-label = Način predstavitve +pdfjs-open-file-button = + .title = Odpri datoteko +pdfjs-open-file-button-label = Odpri +pdfjs-print-button = + .title = Natisni +pdfjs-print-button-label = Natisni +pdfjs-save-button = + .title = Shrani +pdfjs-save-button-label = Shrani +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Prenesi +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Prenesi +pdfjs-bookmark-button = + .title = Trenutna stran (prikaži URL, ki vodi do trenutne strani) +pdfjs-bookmark-button-label = Na trenutno stran + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Orodja +pdfjs-tools-button-label = Orodja +pdfjs-first-page-button = + .title = Pojdi na prvo stran +pdfjs-first-page-button-label = Pojdi na prvo stran +pdfjs-last-page-button = + .title = Pojdi na zadnjo stran +pdfjs-last-page-button-label = Pojdi na zadnjo stran +pdfjs-page-rotate-cw-button = + .title = Zavrti v smeri urnega kazalca +pdfjs-page-rotate-cw-button-label = Zavrti v smeri urnega kazalca +pdfjs-page-rotate-ccw-button = + .title = Zavrti v nasprotni smeri urnega kazalca +pdfjs-page-rotate-ccw-button-label = Zavrti v nasprotni smeri urnega kazalca +pdfjs-cursor-text-select-tool-button = + .title = Omogoči orodje za izbor besedila +pdfjs-cursor-text-select-tool-button-label = Orodje za izbor besedila +pdfjs-cursor-hand-tool-button = + .title = Omogoči roko +pdfjs-cursor-hand-tool-button-label = Roka +pdfjs-scroll-page-button = + .title = Uporabi drsenje po strani +pdfjs-scroll-page-button-label = Drsenje po strani +pdfjs-scroll-vertical-button = + .title = Uporabi navpično drsenje +pdfjs-scroll-vertical-button-label = Navpično drsenje +pdfjs-scroll-horizontal-button = + .title = Uporabi vodoravno drsenje +pdfjs-scroll-horizontal-button-label = Vodoravno drsenje +pdfjs-scroll-wrapped-button = + .title = Uporabi ovito drsenje +pdfjs-scroll-wrapped-button-label = Ovito drsenje +pdfjs-spread-none-button = + .title = Ne združuj razponov strani +pdfjs-spread-none-button-label = Brez razponov +pdfjs-spread-odd-button = + .title = Združuj razpone strani z začetkom pri lihih straneh +pdfjs-spread-odd-button-label = Lihi razponi +pdfjs-spread-even-button = + .title = Združuj razpone strani z začetkom pri sodih straneh +pdfjs-spread-even-button-label = Sodi razponi + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Lastnosti dokumenta … +pdfjs-document-properties-button-label = Lastnosti dokumenta … +pdfjs-document-properties-file-name = Ime datoteke: +pdfjs-document-properties-file-size = Velikost datoteke: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtov) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtov) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtov) +pdfjs-document-properties-title = Ime: +pdfjs-document-properties-author = Avtor: +pdfjs-document-properties-subject = Tema: +pdfjs-document-properties-keywords = Ključne besede: +pdfjs-document-properties-creation-date = Datum nastanka: +pdfjs-document-properties-modification-date = Datum spremembe: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Ustvaril: +pdfjs-document-properties-producer = Izdelovalec PDF: +pdfjs-document-properties-version = Različica PDF: +pdfjs-document-properties-page-count = Število strani: +pdfjs-document-properties-page-size = Velikost strani: +pdfjs-document-properties-page-size-unit-inches = palcev +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = pokončno +pdfjs-document-properties-page-size-orientation-landscape = ležeče +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Pismo +pdfjs-document-properties-page-size-name-legal = Pravno + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Hitri spletni ogled: +pdfjs-document-properties-linearized-yes = Da +pdfjs-document-properties-linearized-no = Ne +pdfjs-document-properties-close-button = Zapri + +## Print + +pdfjs-print-progress-message = Priprava dokumenta na tiskanje … +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress } % +pdfjs-print-progress-close-button = Prekliči +pdfjs-printing-not-supported = Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja. +pdfjs-printing-not-ready = Opozorilo: PDF ni v celoti naložen za tiskanje. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Preklopi stransko vrstico +pdfjs-toggle-sidebar-notification-button = + .title = Preklopi stransko vrstico (dokument vsebuje oris/priponke/plasti) +pdfjs-toggle-sidebar-button-label = Preklopi stransko vrstico +pdfjs-document-outline-button = + .title = Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov) +pdfjs-document-outline-button-label = Oris dokumenta +pdfjs-attachments-button = + .title = Prikaži priponke +pdfjs-attachments-button-label = Priponke +pdfjs-layers-button = + .title = Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje) +pdfjs-layers-button-label = Plasti +pdfjs-thumbs-button = + .title = Prikaži sličice +pdfjs-thumbs-button-label = Sličice +pdfjs-current-outline-item-button = + .title = Najdi trenutni predmet orisa +pdfjs-current-outline-item-button-label = Trenutni predmet orisa +pdfjs-findbar-button = + .title = Iskanje po dokumentu +pdfjs-findbar-button-label = Najdi +pdfjs-additional-layers = Dodatne plasti + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Stran { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Sličica strani { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Najdi + .placeholder = Najdi v dokumentu … +pdfjs-find-previous-button = + .title = Najdi prejšnjo ponovitev iskanega +pdfjs-find-previous-button-label = Najdi nazaj +pdfjs-find-next-button = + .title = Najdi naslednjo ponovitev iskanega +pdfjs-find-next-button-label = Najdi naprej +pdfjs-find-highlight-checkbox = Označi vse +pdfjs-find-match-case-checkbox-label = Razlikuj velike/male črke +pdfjs-find-match-diacritics-checkbox-label = Razlikuj diakritične znake +pdfjs-find-entire-word-checkbox-label = Cele besede +pdfjs-find-reached-top = Dosežen začetek dokumenta iz smeri konca +pdfjs-find-reached-bottom = Doseženo konec dokumenta iz smeri začetka +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Zadetek { $current } od { $total } + [two] Zadetek { $current } od { $total } + [few] Zadetek { $current } od { $total } + *[other] Zadetek { $current } od { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Več kot { $limit } zadetek + [two] Več kot { $limit } zadetka + [few] Več kot { $limit } zadetki + *[other] Več kot { $limit } zadetkov + } +pdfjs-find-not-found = Iskanega ni mogoče najti + +## Predefined zoom values + +pdfjs-page-scale-width = Širina strani +pdfjs-page-scale-fit = Prilagodi stran +pdfjs-page-scale-auto = Samodejno +pdfjs-page-scale-actual = Dejanska velikost +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale } % + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Stran { $page } + +## Loading indicator messages + +pdfjs-loading-error = Med nalaganjem datoteke PDF je prišlo do napake. +pdfjs-invalid-file-error = Neveljavna ali pokvarjena datoteka PDF. +pdfjs-missing-file-error = Ni datoteke PDF. +pdfjs-unexpected-response-error = Nepričakovan odgovor strežnika. +pdfjs-rendering-error = Med pripravljanjem strani je prišlo do napake! + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Opomba vrste { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Vnesite geslo za odpiranje te datoteke PDF. +pdfjs-password-invalid = Neveljavno geslo. Poskusite znova. +pdfjs-password-ok-button = V redu +pdfjs-password-cancel-button = Prekliči +pdfjs-web-fonts-disabled = Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti. + +## Editing + +pdfjs-editor-free-text-button = + .title = Besedilo +pdfjs-editor-free-text-button-label = Besedilo +pdfjs-editor-ink-button = + .title = Riši +pdfjs-editor-ink-button-label = Riši +pdfjs-editor-stamp-button = + .title = Dodajanje ali urejanje slik +pdfjs-editor-stamp-button-label = Dodajanje ali urejanje slik +pdfjs-editor-highlight-button = + .title = Označevalnik +pdfjs-editor-highlight-button-label = Označevalnik +pdfjs-highlight-floating-button1 = + .title = Označi + .aria-label = Označi +pdfjs-highlight-floating-button-label = Označi + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Odstrani risbo +pdfjs-editor-remove-freetext-button = + .title = Odstrani besedilo +pdfjs-editor-remove-stamp-button = + .title = Odstrani sliko +pdfjs-editor-remove-highlight-button = + .title = Odstrani označbo + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Barva +pdfjs-editor-free-text-size-input = Velikost +pdfjs-editor-ink-color-input = Barva +pdfjs-editor-ink-thickness-input = Debelina +pdfjs-editor-ink-opacity-input = Neprosojnost +pdfjs-editor-stamp-add-image-button = + .title = Dodaj sliko +pdfjs-editor-stamp-add-image-button-label = Dodaj sliko +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Debelina +pdfjs-editor-free-highlight-thickness-title = + .title = Spremeni debelino pri označevanju nebesedilnih elementov +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Urejevalnik besedila + .default-content = Začnite tipkati … +pdfjs-free-text = + .aria-label = Urejevalnik besedila +pdfjs-free-text-default-content = Začnite tipkati … +pdfjs-ink = + .aria-label = Urejevalnik risanja +pdfjs-ink-canvas = + .aria-label = Uporabnikova slika + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Nadomestno besedilo +pdfjs-editor-alt-text-edit-button = + .aria-label = Uredi nadomestno besedilo +pdfjs-editor-alt-text-edit-button-label = Uredi nadomestno besedilo +pdfjs-editor-alt-text-dialog-label = Izberite možnost +pdfjs-editor-alt-text-dialog-description = Nadomestno besedilo se prikaže tistim, ki ne vidijo slike, ali če se ta ne naloži. +pdfjs-editor-alt-text-add-description-label = Dodaj opis +pdfjs-editor-alt-text-add-description-description = Poskušajte v enem ali dveh stavkih opisati motiv, okolje ali dejanja. +pdfjs-editor-alt-text-mark-decorative-label = Označi kot okrasno +pdfjs-editor-alt-text-mark-decorative-description = Uporablja se za slike, ki služijo samo okrasu, na primer obrobe ali vodne žige. +pdfjs-editor-alt-text-cancel-button = Prekliči +pdfjs-editor-alt-text-save-button = Shrani +pdfjs-editor-alt-text-decorative-tooltip = Označeno kot okrasno +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na primer: "Mladenič sedi za mizo pri jedi" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Nadomestno besedilo + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Zgornji levi kot – spremeni velikost +pdfjs-editor-resizer-label-top-middle = Zgoraj na sredini – spremeni velikost +pdfjs-editor-resizer-label-top-right = Zgornji desni kot – spremeni velikost +pdfjs-editor-resizer-label-middle-right = Desno na sredini – spremeni velikost +pdfjs-editor-resizer-label-bottom-right = Spodnji desni kot – spremeni velikost +pdfjs-editor-resizer-label-bottom-middle = Spodaj na sredini – spremeni velikost +pdfjs-editor-resizer-label-bottom-left = Spodnji levi kot – spremeni velikost +pdfjs-editor-resizer-label-middle-left = Levo na sredini – spremeni velikost +pdfjs-editor-resizer-top-left = + .aria-label = Zgornji levi kot – spremeni velikost +pdfjs-editor-resizer-top-middle = + .aria-label = Zgoraj na sredini – spremeni velikost +pdfjs-editor-resizer-top-right = + .aria-label = Zgornji desni kot – spremeni velikost +pdfjs-editor-resizer-middle-right = + .aria-label = Desno na sredini – spremeni velikost +pdfjs-editor-resizer-bottom-right = + .aria-label = Spodnji desni kot – spremeni velikost +pdfjs-editor-resizer-bottom-middle = + .aria-label = Spodaj na sredini – spremeni velikost +pdfjs-editor-resizer-bottom-left = + .aria-label = Spodnji levi kot – spremeni velikost +pdfjs-editor-resizer-middle-left = + .aria-label = Levo na sredini – spremeni velikost + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Barva označbe +pdfjs-editor-colorpicker-button = + .title = Spremeni barvo +pdfjs-editor-colorpicker-dropdown = + .aria-label = Izbira barve +pdfjs-editor-colorpicker-yellow = + .title = Rumena +pdfjs-editor-colorpicker-green = + .title = Zelena +pdfjs-editor-colorpicker-blue = + .title = Modra +pdfjs-editor-colorpicker-pink = + .title = Roza +pdfjs-editor-colorpicker-red = + .title = Rdeča + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Prikaži vse +pdfjs-editor-highlight-show-all-button = + .title = Prikaži vse + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Uredi nadomestno besedilo (opis slike) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Dodaj nadomestno besedilo (opis slike) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Tukaj napišite svoj opis … +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kratek opis za ljudi, ki ne morejo videti slike, ali za primer, ko se slika ne naloži. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = To nadomestno besedilo je bilo ustvarjeno samodejno in je lahko netočno. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Več o tem +pdfjs-editor-new-alt-text-create-automatically-button-label = Samodejno ustvari nadomestno besedilo +pdfjs-editor-new-alt-text-not-now-button = Ne zdaj +pdfjs-editor-new-alt-text-error-title = Nadomestnega besedila ni bilo mogoče samodejno ustvariti +pdfjs-editor-new-alt-text-error-description = Sestavite svoje nadomestno besedilo ali poskusite znova pozneje. +pdfjs-editor-new-alt-text-error-close-button = Zapri +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Prenašanje modela UI za nadomestno besedilo ({ $downloadedSize } od { $totalSize } MB) + .aria-valuetext = Prenašanje modela UI za nadomestno besedilo ({ $downloadedSize } od { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Nadomestno besedilo dodano +pdfjs-editor-new-alt-text-added-button-label = Nadomestno besedilo dodano +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Nadomestno besedilo manjka +pdfjs-editor-new-alt-text-missing-button-label = Nadomestno besedilo manjka +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Oceni nadomestno besedilo +pdfjs-editor-new-alt-text-to-review-button-label = Oceni nadomestno besedilo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Samodejno ustvarjeno: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastavitve nadomestnega besedila slike +pdfjs-image-alt-text-settings-button-label = Nastavitve nadomestnega besedila slike +pdfjs-editor-alt-text-settings-dialog-label = Nastavitve nadomestnega besedila slike +pdfjs-editor-alt-text-settings-automatic-title = Samodejno nadomestno besedilo +pdfjs-editor-alt-text-settings-create-model-button-label = Samodejno ustvari nadomestno besedilo +pdfjs-editor-alt-text-settings-create-model-description = Predlaga opise za pomoč ljudem, ki ne morejo videti slike, ali za primer, ko se slika ne naloži. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model UI za nadomestno besedilo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Izvaja se lokalno na vaši napravi, tako da vaši podatki ostajajo zasebni. Zahtevano za samodejno nadomestno besedilo. +pdfjs-editor-alt-text-settings-delete-model-button = Izbriši +pdfjs-editor-alt-text-settings-download-model-button = Prenesi +pdfjs-editor-alt-text-settings-downloading-model-button = Prenašanje ... +pdfjs-editor-alt-text-settings-editor-title = Urejevalnik nadomestnega besedila +pdfjs-editor-alt-text-settings-show-dialog-button-label = Ob dodajanju slike takoj prikaži urejevalnik nadomestnega besedila +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga vam zagotoviti, da imajo vse vaše slike nadomestno besedilo. +pdfjs-editor-alt-text-settings-close-button = Zapri + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Označba odstranjena +pdfjs-editor-undo-bar-message-freetext = Besedilo odstranjeno +pdfjs-editor-undo-bar-message-ink = Risba odstranjena +pdfjs-editor-undo-bar-message-stamp = Slika odstranjena +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } označba odstranjena + [two] { $count } označbi odstranjeni + [few] { $count } označbe odstranjene + *[other] { $count } označb odstranjenih + } +pdfjs-editor-undo-bar-undo-button = + .title = Razveljavi +pdfjs-editor-undo-bar-undo-button-label = Razveljavi +pdfjs-editor-undo-bar-close-button = + .title = Zapri +pdfjs-editor-undo-bar-close-button-label = Zapri diff --git a/public/pdfjs/web/locale/son/viewer.ftl b/public/pdfjs/web/locale/son/viewer.ftl new file mode 100644 index 0000000..fa4f6b1 --- /dev/null +++ b/public/pdfjs/web/locale/son/viewer.ftl @@ -0,0 +1,206 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Moo bisante +pdfjs-previous-button-label = Bisante +pdfjs-next-button = + .title = Jinehere moo +pdfjs-next-button-label = Jine +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Moo +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } ra +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } ka hun { $pagesCount }) ra +pdfjs-zoom-out-button = + .title = Nakasandi +pdfjs-zoom-out-button-label = Nakasandi +pdfjs-zoom-in-button = + .title = Bebbeerandi +pdfjs-zoom-in-button-label = Bebbeerandi +pdfjs-zoom-select = + .title = Bebbeerandi +pdfjs-presentation-mode-button = + .title = Bere cebeyan alhaali +pdfjs-presentation-mode-button-label = Cebeyan alhaali +pdfjs-open-file-button = + .title = Tuku feeri +pdfjs-open-file-button-label = Feeri +pdfjs-print-button = + .title = Kar +pdfjs-print-button-label = Kar + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Goyjinawey +pdfjs-tools-button-label = Goyjinawey +pdfjs-first-page-button = + .title = Koy moo jinaa ga +pdfjs-first-page-button-label = Koy moo jinaa ga +pdfjs-last-page-button = + .title = Koy moo koraa ga +pdfjs-last-page-button-label = Koy moo koraa ga +pdfjs-page-rotate-cw-button = + .title = Kuubi kanbe guma here +pdfjs-page-rotate-cw-button-label = Kuubi kanbe guma here +pdfjs-page-rotate-ccw-button = + .title = Kuubi kanbe wowa here +pdfjs-page-rotate-ccw-button-label = Kuubi kanbe wowa here + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Takadda mayrawey… +pdfjs-document-properties-button-label = Takadda mayrawey… +pdfjs-document-properties-file-name = Tuku maa: +pdfjs-document-properties-file-size = Tuku adadu: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = KB { $size_kb } (cebsu-ize { $size_b }) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = MB { $size_mb } (cebsu-ize { $size_b }) +pdfjs-document-properties-title = Tiiramaa: +pdfjs-document-properties-author = Hantumkaw: +pdfjs-document-properties-subject = Dalil: +pdfjs-document-properties-keywords = Kufalkalimawey: +pdfjs-document-properties-creation-date = Teeyan han: +pdfjs-document-properties-modification-date = Barmayan han: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Teekaw: +pdfjs-document-properties-producer = PDF berandikaw: +pdfjs-document-properties-version = PDF dumi: +pdfjs-document-properties-page-count = Moo hinna: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = Daabu + +## Print + +pdfjs-print-progress-message = Goo ma takaddaa soolu k'a kar se… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Naŋ +pdfjs-printing-not-supported = Yaamar: Karyan ši tee ka timme nda ceecikaa woo. +pdfjs-printing-not-ready = Yaamar: PDF ši zunbu ka timme karyan še. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Kanjari ceraw zuu +pdfjs-toggle-sidebar-button-label = Kanjari ceraw zuu +pdfjs-document-outline-button = + .title = Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi) +pdfjs-document-outline-button-label = Takadda filla-boŋ +pdfjs-attachments-button = + .title = Hangarey cebe +pdfjs-attachments-button-label = Hangarey +pdfjs-thumbs-button = + .title = Kabeboy biyey cebe +pdfjs-thumbs-button-label = Kabeboy biyey +pdfjs-findbar-button = + .title = Ceeci takaddaa ra +pdfjs-findbar-button-label = Ceeci + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } moo +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Kabeboy bii { $page } moo še + +## Find panel button title and messages + +pdfjs-find-input = + .title = Ceeci + .placeholder = Ceeci takaddaa ra… +pdfjs-find-previous-button = + .title = Kalimaɲaŋoo bangayri bisantaa ceeci +pdfjs-find-previous-button-label = Bisante +pdfjs-find-next-button = + .title = Kalimaɲaŋoo hiino bangayroo ceeci +pdfjs-find-next-button-label = Jine +pdfjs-find-highlight-checkbox = Ikul šilbay +pdfjs-find-match-case-checkbox-label = Harfu-beeriyan hawgay +pdfjs-find-reached-top = A too moŋoo boŋoo, koy jine ka šinitin nda cewoo +pdfjs-find-reached-bottom = A too moɲoo cewoo, koy jine šintioo ga +pdfjs-find-not-found = Kalimaɲaa mana duwandi + +## Predefined zoom values + +pdfjs-page-scale-width = Mooo hayyan +pdfjs-page-scale-fit = Moo sawayan +pdfjs-page-scale-auto = Boŋše azzaati barmayyan +pdfjs-page-scale-actual = Adadu cimi +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Firka bangay kaŋ PDF goo ma zumandi. +pdfjs-invalid-file-error = PDF tuku laala wala laybante. +pdfjs-missing-file-error = PDF tuku kumante. +pdfjs-unexpected-response-error = Manti feršikaw tuuruyan maatante. +pdfjs-rendering-error = Firka bangay kaŋ moɲoo goo ma willandi. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = { $type } maasa-caw] + +## Password + +pdfjs-password-label = Šennikufal dam ka PDF tukoo woo feeri. +pdfjs-password-invalid = Šennikufal laalo. Ceeci koyne taare. +pdfjs-password-ok-button = Ayyo +pdfjs-password-cancel-button = Naŋ +pdfjs-web-fonts-disabled = Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/sq/viewer.ftl b/public/pdfjs/web/locale/sq/viewer.ftl new file mode 100644 index 0000000..2b1c91a --- /dev/null +++ b/public/pdfjs/web/locale/sq/viewer.ftl @@ -0,0 +1,506 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Faqja e Mëparshme +pdfjs-previous-button-label = E mëparshmja +pdfjs-next-button = + .title = Faqja Pasuese +pdfjs-next-button-label = Pasuesja +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Faqe +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = nga { $pagesCount } gjithsej +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } nga { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zvogëlojeni +pdfjs-zoom-out-button-label = Zvogëlojeni +pdfjs-zoom-in-button = + .title = Zmadhojeni +pdfjs-zoom-in-button-label = Zmadhojini +pdfjs-zoom-select = + .title = Zmadhim/Zvogëlim +pdfjs-presentation-mode-button = + .title = Kalo te Mënyra Paraqitje +pdfjs-presentation-mode-button-label = Mënyra Paraqitje +pdfjs-open-file-button = + .title = Hapni Kartelë +pdfjs-open-file-button-label = Hape +pdfjs-print-button = + .title = Shtypje +pdfjs-print-button-label = Shtype +pdfjs-save-button = + .title = Ruaje +pdfjs-save-button-label = Ruaje +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Shkarkojeni +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Shkarkoje +pdfjs-bookmark-button = + .title = Faqja e Tanishme (Shihni URL nga Faqja e Tanishme) +pdfjs-bookmark-button-label = Faqja e Tanishme + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Mjete +pdfjs-tools-button-label = Mjete +pdfjs-first-page-button = + .title = Kaloni te Faqja e Parë +pdfjs-first-page-button-label = Kaloni te Faqja e Parë +pdfjs-last-page-button = + .title = Kaloni te Faqja e Fundit +pdfjs-last-page-button-label = Kaloni te Faqja e Fundit +pdfjs-page-rotate-cw-button = + .title = Rrotullojeni Në Kahun Orar +pdfjs-page-rotate-cw-button-label = Rrotulloje Në Kahun Orar +pdfjs-page-rotate-ccw-button = + .title = Rrotullojeni Në Kahun Kundërorar +pdfjs-page-rotate-ccw-button-label = Rrotulloje Në Kahun Kundërorar +pdfjs-cursor-text-select-tool-button = + .title = Aktivizo Mjet Përzgjedhjeje Teksti +pdfjs-cursor-text-select-tool-button-label = Mjet Përzgjedhjeje Teksti +pdfjs-cursor-hand-tool-button = + .title = Aktivizo Mjetin Dorë +pdfjs-cursor-hand-tool-button-label = Mjeti Dorë +pdfjs-scroll-page-button = + .title = Përdor Rrëshqitje Në Faqe +pdfjs-scroll-page-button-label = Rrëshqitje Në Faqe +pdfjs-scroll-vertical-button = + .title = Përdor Rrëshqitje Vertikale +pdfjs-scroll-vertical-button-label = Rrëshqitje Vertikale +pdfjs-scroll-horizontal-button = + .title = Përdor Rrëshqitje Horizontale +pdfjs-scroll-horizontal-button-label = Rrëshqitje Horizontale +pdfjs-scroll-wrapped-button = + .title = Përdor Rrëshqitje Me Mbështjellje +pdfjs-scroll-wrapped-button-label = Rrëshqitje Me Mbështjellje + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Veti Dokumenti… +pdfjs-document-properties-button-label = Veti Dokumenti… +pdfjs-document-properties-file-name = Emër kartele: +pdfjs-document-properties-file-size = Madhësi kartele: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajte) +pdfjs-document-properties-title = Titull: +pdfjs-document-properties-author = Autor: +pdfjs-document-properties-subject = Subjekt: +pdfjs-document-properties-keywords = Fjalëkyçe: +pdfjs-document-properties-creation-date = Datë Krijimi: +pdfjs-document-properties-modification-date = Datë Ndryshimi: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Krijues: +pdfjs-document-properties-producer = Prodhues PDF-je: +pdfjs-document-properties-version = Version PDF-je: +pdfjs-document-properties-page-count = Numër Faqesh: +pdfjs-document-properties-page-size = Madhësi Faqeje: +pdfjs-document-properties-page-size-unit-inches = inç +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = portret +pdfjs-document-properties-page-size-orientation-landscape = së gjeri +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Parje e Shpjetë në Web: +pdfjs-document-properties-linearized-yes = Po +pdfjs-document-properties-linearized-no = Jo +pdfjs-document-properties-close-button = Mbylleni + +## Print + +pdfjs-print-progress-message = Po përgatitet dokumenti për shtypje… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Anuloje +pdfjs-printing-not-supported = Kujdes: Shtypja s’mbulohet plotësisht nga ky shfletues. +pdfjs-printing-not-ready = Kujdes: PDF-ja s’është ngarkuar plotësisht që ta shtypni. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Shfaqni/Fshihni Anështyllën +pdfjs-toggle-sidebar-notification-button = + .title = Hap/Mbyll Anështylë (dokumenti përmban përvijim/nashkëngjitje/shtresa) +pdfjs-toggle-sidebar-button-label = Shfaq/Fshih Anështyllën +pdfjs-document-outline-button = + .title = Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët) +pdfjs-document-outline-button-label = Përvijim Dokumenti +pdfjs-attachments-button = + .title = Shfaqni Bashkëngjitje +pdfjs-attachments-button-label = Bashkëngjitje +pdfjs-layers-button = + .title = Shfaq Shtresa (dyklikoni që të rikthehen krejt shtresat në gjendjen e tyre parazgjedhje) +pdfjs-layers-button-label = Shtresa +pdfjs-thumbs-button = + .title = Shfaqni Miniatura +pdfjs-thumbs-button-label = Miniatura +pdfjs-current-outline-item-button = + .title = Gjej Objektin e Tanishëm të Përvijuar +pdfjs-current-outline-item-button-label = Objekt i Tanishëm i Përvijuar +pdfjs-findbar-button = + .title = Gjeni në Dokument +pdfjs-findbar-button-label = Gjej +pdfjs-additional-layers = Shtresa Shtesë + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Faqja { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniaturë e Faqes { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Gjej + .placeholder = Gjeni në dokument… +pdfjs-find-previous-button = + .title = Gjeni hasjen e mëparshme të togfjalëshit +pdfjs-find-previous-button-label = E mëparshmja +pdfjs-find-next-button = + .title = Gjeni hasjen pasuese të togfjalëshit +pdfjs-find-next-button-label = Pasuesja +pdfjs-find-highlight-checkbox = Theksoji të tëra +pdfjs-find-match-case-checkbox-label = Siç Është Shkruar +pdfjs-find-match-diacritics-checkbox-label = Me Përputhje Me Shenjat Diakritike +pdfjs-find-entire-word-checkbox-label = Fjalë të Plota +pdfjs-find-reached-top = U mbërrit në krye të dokumentit, vazhduar prej fundit +pdfjs-find-reached-bottom = U mbërrit në fund të dokumentit, vazhduar prej kreut +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } nga { $total } përputhje + *[other] { $current } nga { $total } përputhje + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Më tepër se { $limit } përputhje + *[other] Më tepër se { $limit } përputhje + } +pdfjs-find-not-found = Togfjalësh që s’gjendet + +## Predefined zoom values + +pdfjs-page-scale-width = Gjerësi Faqeje +pdfjs-page-scale-fit = Sa Nxë Faqja +pdfjs-page-scale-auto = Zoom i Vetvetishëm +pdfjs-page-scale-actual = Madhësia Faktike +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Faqja { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ndodhi një gabim gjatë ngarkimit të PDF-së. +pdfjs-invalid-file-error = Kartelë PDF e pavlefshme ose e dëmtuar. +pdfjs-missing-file-error = Kartelë PDF që mungon. +pdfjs-unexpected-response-error = Përgjigje shërbyesi e papritur. +pdfjs-rendering-error = Ndodhi një gabim gjatë riprodhimit të faqes. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Nënvizim { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Jepni fjalëkalimin që të hapet kjo kartelë PDF. +pdfjs-password-invalid = Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Anuloje +pdfjs-web-fonts-disabled = Shkronjat Web janë të çaktivizuara: s’arrihet të përdoren shkronja të trupëzuara në PDF. + +## Editing + +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Vizatoni +pdfjs-editor-ink-button-label = Vizatoni +pdfjs-editor-stamp-button = + .title = Shtoni ose përpunoni figura +pdfjs-editor-stamp-button-label = Shtoni ose përpunoni figura +pdfjs-editor-highlight-button = + .title = Theksim +pdfjs-editor-highlight-button-label = Theksoje +pdfjs-highlight-floating-button1 = + .title = Theksim + .aria-label = Theksim +pdfjs-highlight-floating-button-label = Theksim + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Hiq vizatim +pdfjs-editor-remove-freetext-button = + .title = Hiq tekst +pdfjs-editor-remove-stamp-button = + .title = Hiq figurë +pdfjs-editor-remove-highlight-button = + .title = Hiqe theksimin + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Ngjyrë +pdfjs-editor-free-text-size-input = Madhësi +pdfjs-editor-ink-color-input = Ngjyrë +pdfjs-editor-ink-thickness-input = Trashësi +pdfjs-editor-ink-opacity-input = Patejdukshmëri +pdfjs-editor-stamp-add-image-button = + .title = Shtoni figurë +pdfjs-editor-stamp-add-image-button-label = Shtoni figurë +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Trashësi +pdfjs-editor-free-highlight-thickness-title = + .title = Ndryshoni trashësinë kur theksoni objekte tjetër nga tekst +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Përpunues Tekstesh + .default-content = Filloni të shtypni… +pdfjs-free-text = + .aria-label = Përpunues Tekstesh +pdfjs-free-text-default-content = Filloni të shtypni… +pdfjs-ink = + .aria-label = Përpunues Vizatimesh +pdfjs-ink-canvas = + .aria-label = Figurë e krijuar nga përdoruesi + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Tekst alternativ +pdfjs-editor-alt-text-edit-button = + .aria-label = Përpunoni tekst alternativ +pdfjs-editor-alt-text-edit-button-label = Përpunoni tekst alternativ +pdfjs-editor-alt-text-dialog-label = Zgjidhni një mundësi +pdfjs-editor-alt-text-dialog-description = Teksti alt (tekst alternativ) vjen në ndihmë kur njerëzit s’mund të shohin figurën, ose kur ajo nuk ngarkohet. +pdfjs-editor-alt-text-add-description-label = Shtoni një përshkrim +pdfjs-editor-alt-text-add-description-description = Synoni për 1-2 togfjalësha që përshkruajnë subjektin, rrethanat apo veprimet. +pdfjs-editor-alt-text-mark-decorative-label = Vëri shenjë si dekorative +pdfjs-editor-alt-text-mark-decorative-description = Kjo përdoret për figura zbukuruese, fjala vjen, anë, ose watermark-e. +pdfjs-editor-alt-text-cancel-button = Anuloje +pdfjs-editor-alt-text-save-button = Ruaje +pdfjs-editor-alt-text-decorative-tooltip = Iu vu shenjë si dekorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Për shembull, “Një djalosh ulet në një tryezë të hajë” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Tekst alternativ + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Cepi i sipërm majtas — ripërmasojeni +pdfjs-editor-resizer-label-top-middle = Mesi i pjesës sipër — ripërmasojeni +pdfjs-editor-resizer-label-top-right = Cepi i sipërm djathtas — ripërmasojeni +pdfjs-editor-resizer-label-middle-right = Djathtas në mes — ripërmasojeni +pdfjs-editor-resizer-label-bottom-right = Cepi i poshtëm djathtas — ripërmasojeni +pdfjs-editor-resizer-label-bottom-middle = Mesi i pjesës poshtë — ripërmasojeni +pdfjs-editor-resizer-label-bottom-left = Cepi i poshtëm — ripërmasojeni +pdfjs-editor-resizer-label-middle-left = Majtas në mes — ripërmasojeni +pdfjs-editor-resizer-top-left = + .aria-label = Cepi i sipërm majtas — ripërmasojeni +pdfjs-editor-resizer-top-middle = + .aria-label = Mesi i pjesës sipër — ripërmasojeni +pdfjs-editor-resizer-top-right = + .aria-label = Cepi i sipërm djathtas — ripërmasojeni +pdfjs-editor-resizer-middle-right = + .aria-label = Djathtas në mes — ripërmasojeni +pdfjs-editor-resizer-bottom-right = + .aria-label = Cepi i poshtëm djathtas — ripërmasojeni +pdfjs-editor-resizer-bottom-middle = + .aria-label = Mesi i pjesës poshtë — ripërmasojeni +pdfjs-editor-resizer-bottom-left = + .aria-label = Cepi i poshtëm — ripërmasojeni +pdfjs-editor-resizer-middle-left = + .aria-label = Majtas në mes — ripërmasojeni + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Ngjyrë theksimi +pdfjs-editor-colorpicker-button = + .title = Ndryshoni ngjyrë +pdfjs-editor-colorpicker-dropdown = + .aria-label = Zgjedhje ngjyre +pdfjs-editor-colorpicker-yellow = + .title = E verdhë +pdfjs-editor-colorpicker-green = + .title = E gjelbër +pdfjs-editor-colorpicker-blue = + .title = Blu +pdfjs-editor-colorpicker-pink = + .title = Rozë +pdfjs-editor-colorpicker-red = + .title = E kuqe + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Shfaqi krejt +pdfjs-editor-highlight-show-all-button = + .title = Shfaqi krejt + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Përpunoni tekst alternativ (përshkrim figure) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Shtoni tekst alternativ (përshkrim figure) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Shkruani këtu përshkrimin tuaj… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Përshkrim i shkurtër për persona që s’munden të shohin figurën, ose për kur figura nuk ngarkohet dot. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ky tekst alternativ qe krijuar automatikisht dhe mund të jetë i pasaktë. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Mësoni më tepër +pdfjs-editor-new-alt-text-create-automatically-button-label = Krijo automatikisht tekst alternativ +pdfjs-editor-new-alt-text-not-now-button = Jo tani +pdfjs-editor-new-alt-text-error-title = S’u krijua dot automatikisht tekst alternativ +pdfjs-editor-new-alt-text-error-description = Ju lutemi, shkruani tekstin tuaj alternativ, ose riprovoni më vonë. +pdfjs-editor-new-alt-text-error-close-button = Mbylle +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Po shkarkohet model IA teksti alternativ ({ $downloadedSize } nga { $totalSize } MB) + .aria-valuetext = Po shkarkohet model IA teksti alternativ ({ $downloadedSize } nga { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = U shtua tekst alternativ +pdfjs-editor-new-alt-text-added-button-label = U shtua tekst alternativ +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mungon tekst alternativ +pdfjs-editor-new-alt-text-missing-button-label = Mungon tekst alternativ +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Shqyrtoni tekst alternativ +pdfjs-editor-new-alt-text-to-review-button-label = Shqyrtoni tekst alternativ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Krijuar automatikisht: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Rregullime teksti alternativ figure +pdfjs-image-alt-text-settings-button-label = Rregullime teksti alternativ figure +pdfjs-editor-alt-text-settings-dialog-label = Rregullime teksti alternativ figure +pdfjs-editor-alt-text-settings-automatic-title = Tekst alternativ i automatizuar +pdfjs-editor-alt-text-settings-create-model-button-label = Krijo automatikisht tekst alternativ +pdfjs-editor-alt-text-settings-create-model-description = Sugjeron përshkrime, për të ndihmuar persona që s’munden të shohin figurën, ose për kur figura nuk ngarkohet dot. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model IA teksti alternativ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Xhiron lokalisht në pajisjen tuaj, pra të dhënat tuaja mbeten private. E domosdoshme për tekst të automatizuar alternativ. +pdfjs-editor-alt-text-settings-delete-model-button = Fshije +pdfjs-editor-alt-text-settings-download-model-button = Shkarkoje +pdfjs-editor-alt-text-settings-downloading-model-button = Po shkarkohet… +pdfjs-editor-alt-text-settings-editor-title = Përpunues teksti alternativ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Shfaq menjëherë përpunues teksti alternativ, kur shtohet një figurë +pdfjs-editor-alt-text-settings-show-dialog-description = Ju ndihmon të siguroheni se krejt figurat tuaja kanë tekst alternativ. +pdfjs-editor-alt-text-settings-close-button = Mbylle + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = U hoq theksimi +pdfjs-editor-undo-bar-message-freetext = U hoq tekst +pdfjs-editor-undo-bar-message-ink = U hoq vizatim +pdfjs-editor-undo-bar-message-stamp = U hoq figurë +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] U hoq { $count } shënim + *[other] U hoqën { $count } shënime + } +pdfjs-editor-undo-bar-undo-button = + .title = Zhbëje +pdfjs-editor-undo-bar-undo-button-label = Zhbëje +pdfjs-editor-undo-bar-close-button = + .title = Mbylle +pdfjs-editor-undo-bar-close-button-label = Mbylle diff --git a/public/pdfjs/web/locale/sr/viewer.ftl b/public/pdfjs/web/locale/sr/viewer.ftl new file mode 100644 index 0000000..e125dfb --- /dev/null +++ b/public/pdfjs/web/locale/sr/viewer.ftl @@ -0,0 +1,421 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Претходна страница +pdfjs-previous-button-label = Претходна +pdfjs-next-button = + .title = Следећа страница +pdfjs-next-button-label = Следећа +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Страница +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = од { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } од { $pagesCount }) +pdfjs-zoom-out-button = + .title = Умањи +pdfjs-zoom-out-button-label = Умањи +pdfjs-zoom-in-button = + .title = Увеличај +pdfjs-zoom-in-button-label = Увеличај +pdfjs-zoom-select = + .title = Увеличавање +pdfjs-presentation-mode-button = + .title = Промени на приказ у режиму презентације +pdfjs-presentation-mode-button-label = Режим презентације +pdfjs-open-file-button = + .title = Отвори датотеку +pdfjs-open-file-button-label = Отвори +pdfjs-print-button = + .title = Штампај +pdfjs-print-button-label = Штампај +pdfjs-save-button = + .title = Сачувај +pdfjs-save-button-label = Сачувај +pdfjs-bookmark-button = + .title = Тренутна страница (погледајте URL са тренутне странице) +pdfjs-bookmark-button-label = Тренутна страница + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Алатке +pdfjs-tools-button-label = Алатке +pdfjs-first-page-button = + .title = Иди на прву страницу +pdfjs-first-page-button-label = Иди на прву страницу +pdfjs-last-page-button = + .title = Иди на последњу страницу +pdfjs-last-page-button-label = Иди на последњу страницу +pdfjs-page-rotate-cw-button = + .title = Ротирај у смеру казаљке на сату +pdfjs-page-rotate-cw-button-label = Ротирај у смеру казаљке на сату +pdfjs-page-rotate-ccw-button = + .title = Ротирај у смеру супротном од казаљке на сату +pdfjs-page-rotate-ccw-button-label = Ротирај у смеру супротном од казаљке на сату +pdfjs-cursor-text-select-tool-button = + .title = Омогући алат за селектовање текста +pdfjs-cursor-text-select-tool-button-label = Алат за селектовање текста +pdfjs-cursor-hand-tool-button = + .title = Омогући алат за померање +pdfjs-cursor-hand-tool-button-label = Алат за померање +pdfjs-scroll-page-button = + .title = Користи скроловање по омоту +pdfjs-scroll-page-button-label = Скроловање странице +pdfjs-scroll-vertical-button = + .title = Користи вертикално скроловање +pdfjs-scroll-vertical-button-label = Вертикално скроловање +pdfjs-scroll-horizontal-button = + .title = Користи хоризонтално скроловање +pdfjs-scroll-horizontal-button-label = Хоризонтално скроловање +pdfjs-scroll-wrapped-button = + .title = Користи скроловање по омоту +pdfjs-scroll-wrapped-button-label = Скроловање по омоту +pdfjs-spread-none-button = + .title = Немој спајати ширења страница +pdfjs-spread-none-button-label = Без распростирања +pdfjs-spread-odd-button = + .title = Споји ширења страница које почињу непарним бројем +pdfjs-spread-odd-button-label = Непарна распростирања +pdfjs-spread-even-button = + .title = Споји ширења страница које почињу парним бројем +pdfjs-spread-even-button-label = Парна распростирања + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Параметри документа… +pdfjs-document-properties-button-label = Параметри документа… +pdfjs-document-properties-file-name = Име датотеке: +pdfjs-document-properties-file-size = Величина датотеке: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) +pdfjs-document-properties-title = Наслов: +pdfjs-document-properties-author = Аутор: +pdfjs-document-properties-subject = Тема: +pdfjs-document-properties-keywords = Кључне речи: +pdfjs-document-properties-creation-date = Датум креирања: +pdfjs-document-properties-modification-date = Датум модификације: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Стваралац: +pdfjs-document-properties-producer = PDF произвођач: +pdfjs-document-properties-version = PDF верзија: +pdfjs-document-properties-page-count = Број страница: +pdfjs-document-properties-page-size = Величина странице: +pdfjs-document-properties-page-size-unit-inches = ин +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = усправно +pdfjs-document-properties-page-size-orientation-landscape = водоравно +pdfjs-document-properties-page-size-name-a-three = А3 +pdfjs-document-properties-page-size-name-a-four = А4 +pdfjs-document-properties-page-size-name-letter = Слово +pdfjs-document-properties-page-size-name-legal = Права + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Брз веб приказ: +pdfjs-document-properties-linearized-yes = Да +pdfjs-document-properties-linearized-no = Не +pdfjs-document-properties-close-button = Затвори + +## Print + +pdfjs-print-progress-message = Припремам документ за штампање… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Откажи +pdfjs-printing-not-supported = Упозорење: Штампање није у потпуности подржано у овом прегледачу. +pdfjs-printing-not-ready = Упозорење: PDF није у потпуности учитан за штампу. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Прикажи/сакриј бочни панел +pdfjs-toggle-sidebar-notification-button = + .title = Прикажи/сакриј бочни панел (документ садржи контуру/прилоге/слојеве) +pdfjs-toggle-sidebar-button-label = Прикажи/сакриј бочни панел +pdfjs-document-outline-button = + .title = Прикажи структуру документа (двоструким кликом проширујете/скупљате све ставке) +pdfjs-document-outline-button-label = Контура документа +pdfjs-attachments-button = + .title = Прикажи прилоге +pdfjs-attachments-button-label = Прилози +pdfjs-layers-button = + .title = Прикажи слојеве (дупли клик за враћање свих слојева у подразумевано стање) +pdfjs-layers-button-label = Слојеви +pdfjs-thumbs-button = + .title = Прикажи сличице +pdfjs-thumbs-button-label = Сличице +pdfjs-current-outline-item-button = + .title = Пронађите тренутни елемент структуре +pdfjs-current-outline-item-button-label = Тренутна контура +pdfjs-findbar-button = + .title = Пронађи у документу +pdfjs-findbar-button-label = Пронађи +pdfjs-additional-layers = Додатни слојеви + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Страница { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Сличица од странице { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Пронађи + .placeholder = Пронађи у документу… +pdfjs-find-previous-button = + .title = Пронађи претходно појављивање фразе +pdfjs-find-previous-button-label = Претходна +pdfjs-find-next-button = + .title = Пронађи следеће појављивање фразе +pdfjs-find-next-button-label = Следећа +pdfjs-find-highlight-checkbox = Истакнути све +pdfjs-find-match-case-checkbox-label = Подударања +pdfjs-find-match-diacritics-checkbox-label = Дијакритика +pdfjs-find-entire-word-checkbox-label = Целе речи +pdfjs-find-reached-top = Достигнут врх документа, наставио са дна +pdfjs-find-reached-bottom = Достигнуто дно документа, наставио са врха +pdfjs-find-not-found = Фраза није пронађена + +## Predefined zoom values + +pdfjs-page-scale-width = Ширина странице +pdfjs-page-scale-fit = Прилагоди страницу +pdfjs-page-scale-auto = Аутоматско увеличавање +pdfjs-page-scale-actual = Стварна величина +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Страница { $page } + +## Loading indicator messages + +pdfjs-loading-error = Дошло је до грешке приликом учитавања PDF-а. +pdfjs-invalid-file-error = PDF датотека је неважећа или је оштећена. +pdfjs-missing-file-error = Недостаје PDF датотека. +pdfjs-unexpected-response-error = Неочекиван одговор од сервера. +pdfjs-rendering-error = Дошло је до грешке приликом рендеровања ове странице. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } коментар] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Унесите лозинку да бисте отворили овај PDF докуменат. +pdfjs-password-invalid = Неисправна лозинка. Покушајте поново. +pdfjs-password-ok-button = У реду +pdfjs-password-cancel-button = Откажи +pdfjs-web-fonts-disabled = Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове. + +## Editing + +pdfjs-editor-free-text-button = + .title = Текст +pdfjs-editor-free-text-button-label = Текст +pdfjs-editor-ink-button = + .title = Цртај +pdfjs-editor-ink-button-label = Цртај +pdfjs-editor-stamp-button = + .title = Додај или уреди слике +pdfjs-editor-stamp-button-label = Додај или уреди слике +pdfjs-editor-highlight-button = + .title = Означи +pdfjs-editor-highlight-button-label = Означи +pdfjs-highlight-floating-button1 = + .title = Означи + .aria-label = Означи +pdfjs-highlight-floating-button-label = Означи + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Уклони цртеж +pdfjs-editor-remove-freetext-button = + .title = Уклони текст +pdfjs-editor-remove-stamp-button = + .title = Уклони слику +pdfjs-editor-remove-highlight-button = + .title = Уклони ознаку + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Боја +pdfjs-editor-free-text-size-input = Величина +pdfjs-editor-ink-color-input = Боја +pdfjs-editor-ink-thickness-input = Дебљина +pdfjs-editor-ink-opacity-input = Опацитет +pdfjs-editor-stamp-add-image-button = + .title = Додај слику +pdfjs-editor-stamp-add-image-button-label = Додај слику +pdfjs-editor-free-highlight-thickness-title = + .title = Промени дебљину при означавању других ставки сем текста +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Уређивач текста + .default-content = Почни куцати… +pdfjs-free-text = + .aria-label = Уређивач текста +pdfjs-free-text-default-content = Почни куцање… +pdfjs-ink = + .aria-label = Уређивач цртежа +pdfjs-ink-canvas = + .aria-label = Кориснички направљена слика + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Алтернативни текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Уреди алтернативни текст +pdfjs-editor-alt-text-edit-button-label = Уреди алтернативни текст +pdfjs-editor-alt-text-dialog-label = Одабери опцију +pdfjs-editor-alt-text-dialog-description = Алтернативни текст помаже слепим и слабовидим особама или када се слика не учита. +pdfjs-editor-alt-text-add-description-label = Додај опис +pdfjs-editor-alt-text-add-description-description = Сажмите у 1-2 реченице које описују предмет, окружење или радње. +pdfjs-editor-alt-text-mark-decorative-label = Означи као украсно +pdfjs-editor-alt-text-mark-decorative-description = Ово је за украсне слике, као што су ивице или водени печати. +pdfjs-editor-alt-text-cancel-button = Откажи +pdfjs-editor-alt-text-save-button = Сачувај +pdfjs-editor-alt-text-decorative-tooltip = Означено као украсно +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = На пример: „Младић седа за сто да једе“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Алтернативни текст + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Горњи леви угао — промени величину +pdfjs-editor-resizer-label-top-middle = Средина горе — промени величину +pdfjs-editor-resizer-label-top-right = Горњи десни угао — промени величину +pdfjs-editor-resizer-label-middle-right = Средина десно — промени величину +pdfjs-editor-resizer-label-bottom-right = Доњи десни угао — промени величину +pdfjs-editor-resizer-label-bottom-middle = Средина доле — промени величину +pdfjs-editor-resizer-label-bottom-left = Доњи леви угао — промени величину +pdfjs-editor-resizer-label-middle-left = Средина лево — промени величину +pdfjs-editor-resizer-top-left = + .aria-label = Горњи леви угао — промени величину +pdfjs-editor-resizer-top-middle = + .aria-label = Средина горе — промени величину +pdfjs-editor-resizer-top-right = + .aria-label = Горњи десни угао — промени величину +pdfjs-editor-resizer-middle-right = + .aria-label = Средина десно — промени величину +pdfjs-editor-resizer-bottom-right = + .aria-label = Доњи десни угао — промени величину +pdfjs-editor-resizer-bottom-middle = + .aria-label = Средина доле — промени величину +pdfjs-editor-resizer-bottom-left = + .aria-label = Доњи леви угао — промени величину +pdfjs-editor-resizer-middle-left = + .aria-label = Средина лево — промени величину + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Боја означавања +pdfjs-editor-colorpicker-button = + .title = Промени боју +pdfjs-editor-colorpicker-dropdown = + .aria-label = Избор боја +pdfjs-editor-colorpicker-yellow = + .title = Жута +pdfjs-editor-colorpicker-green = + .title = Зелена +pdfjs-editor-colorpicker-blue = + .title = Плава +pdfjs-editor-colorpicker-pink = + .title = Розе +pdfjs-editor-colorpicker-red = + .title = Црвена + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Прикажи све +pdfjs-editor-highlight-show-all-button = + .title = Прикажи све + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Уреди алтернативни текст (опис слике) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Додај алтернативни текст (опис слике) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напиши опис овде… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Кратак опис за слепе и слабовиде људе или када се слика не успе учитати. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Овај алтернативни текст је направљен аутоматски и може бити нетачан. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Сазнајте више +pdfjs-editor-new-alt-text-create-automatically-button-label = Прави алтернативни текст аутоматски +pdfjs-editor-new-alt-text-not-now-button = Не сада + +## Image alt-text settings + diff --git a/public/pdfjs/web/locale/sv-SE/viewer.ftl b/public/pdfjs/web/locale/sv-SE/viewer.ftl new file mode 100644 index 0000000..6c4c610 --- /dev/null +++ b/public/pdfjs/web/locale/sv-SE/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Föregående sida +pdfjs-previous-button-label = Föregående +pdfjs-next-button = + .title = Nästa sida +pdfjs-next-button-label = Nästa +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Sida +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = av { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } av { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zooma ut +pdfjs-zoom-out-button-label = Zooma ut +pdfjs-zoom-in-button = + .title = Zooma in +pdfjs-zoom-in-button-label = Zooma in +pdfjs-zoom-select = + .title = Zoom +pdfjs-presentation-mode-button = + .title = Byt till presentationsläge +pdfjs-presentation-mode-button-label = Presentationsläge +pdfjs-open-file-button = + .title = Öppna fil +pdfjs-open-file-button-label = Öppna +pdfjs-print-button = + .title = Skriv ut +pdfjs-print-button-label = Skriv ut +pdfjs-save-button = + .title = Spara +pdfjs-save-button-label = Spara +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Hämta +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Hämta +pdfjs-bookmark-button = + .title = Aktuell sida (Visa URL från aktuell sida) +pdfjs-bookmark-button-label = Aktuell sida + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Verktyg +pdfjs-tools-button-label = Verktyg +pdfjs-first-page-button = + .title = Gå till första sidan +pdfjs-first-page-button-label = Gå till första sidan +pdfjs-last-page-button = + .title = Gå till sista sidan +pdfjs-last-page-button-label = Gå till sista sidan +pdfjs-page-rotate-cw-button = + .title = Rotera medurs +pdfjs-page-rotate-cw-button-label = Rotera medurs +pdfjs-page-rotate-ccw-button = + .title = Rotera moturs +pdfjs-page-rotate-ccw-button-label = Rotera moturs +pdfjs-cursor-text-select-tool-button = + .title = Aktivera textmarkeringsverktyg +pdfjs-cursor-text-select-tool-button-label = Textmarkeringsverktyg +pdfjs-cursor-hand-tool-button = + .title = Aktivera handverktyg +pdfjs-cursor-hand-tool-button-label = Handverktyg +pdfjs-scroll-page-button = + .title = Använd sidrullning +pdfjs-scroll-page-button-label = Sidrullning +pdfjs-scroll-vertical-button = + .title = Använd vertikal rullning +pdfjs-scroll-vertical-button-label = Vertikal rullning +pdfjs-scroll-horizontal-button = + .title = Använd horisontell rullning +pdfjs-scroll-horizontal-button-label = Horisontell rullning +pdfjs-scroll-wrapped-button = + .title = Använd överlappande rullning +pdfjs-scroll-wrapped-button-label = Överlappande rullning +pdfjs-spread-none-button = + .title = Visa enkelsidor +pdfjs-spread-none-button-label = Enkelsidor +pdfjs-spread-odd-button = + .title = Visa uppslag med olika sidnummer till vänster +pdfjs-spread-odd-button-label = Uppslag med framsida +pdfjs-spread-even-button = + .title = Visa uppslag med lika sidnummer till vänster +pdfjs-spread-even-button-label = Uppslag utan framsida + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Dokumentegenskaper… +pdfjs-document-properties-button-label = Dokumentegenskaper… +pdfjs-document-properties-file-name = Filnamn: +pdfjs-document-properties-file-size = Filstorlek: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +pdfjs-document-properties-title = Titel: +pdfjs-document-properties-author = Författare: +pdfjs-document-properties-subject = Ämne: +pdfjs-document-properties-keywords = Nyckelord: +pdfjs-document-properties-creation-date = Skapades: +pdfjs-document-properties-modification-date = Ändrades: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Skapare: +pdfjs-document-properties-producer = PDF-producent: +pdfjs-document-properties-version = PDF-version: +pdfjs-document-properties-page-count = Sidantal: +pdfjs-document-properties-page-size = Pappersstorlek: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = porträtt +pdfjs-document-properties-page-size-orientation-landscape = landskap +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Snabb webbvisning: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Nej +pdfjs-document-properties-close-button = Stäng + +## Print + +pdfjs-print-progress-message = Förbereder sidor för utskrift… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Avbryt +pdfjs-printing-not-supported = Varning: Utskrifter stöds inte helt av den här webbläsaren. +pdfjs-printing-not-ready = Varning: PDF:en är inte klar för utskrift. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Visa/dölj sidofält +pdfjs-toggle-sidebar-notification-button = + .title = Växla sidofält (dokumentet innehåller dokumentstruktur/bilagor/lager) +pdfjs-toggle-sidebar-button-label = Visa/dölj sidofält +pdfjs-document-outline-button = + .title = Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt) +pdfjs-document-outline-button-label = Dokumentöversikt +pdfjs-attachments-button = + .title = Visa Bilagor +pdfjs-attachments-button-label = Bilagor +pdfjs-layers-button = + .title = Visa lager (dubbelklicka för att återställa alla lager till standardläge) +pdfjs-layers-button-label = Lager +pdfjs-thumbs-button = + .title = Visa miniatyrer +pdfjs-thumbs-button-label = Miniatyrer +pdfjs-current-outline-item-button = + .title = Hitta aktuellt dispositionsobjekt +pdfjs-current-outline-item-button-label = Aktuellt dispositionsobjekt +pdfjs-findbar-button = + .title = Sök i dokument +pdfjs-findbar-button-label = Sök +pdfjs-additional-layers = Ytterligare lager + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Sida { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatyr av sida { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Sök + .placeholder = Sök i dokument… +pdfjs-find-previous-button = + .title = Hitta föregående förekomst av frasen +pdfjs-find-previous-button-label = Föregående +pdfjs-find-next-button = + .title = Hitta nästa förekomst av frasen +pdfjs-find-next-button-label = Nästa +pdfjs-find-highlight-checkbox = Markera alla +pdfjs-find-match-case-checkbox-label = Matcha versal/gemen +pdfjs-find-match-diacritics-checkbox-label = Matcha diakritiska tecken +pdfjs-find-entire-word-checkbox-label = Hela ord +pdfjs-find-reached-top = Nådde början av dokumentet, började från slutet +pdfjs-find-reached-bottom = Nådde slutet på dokumentet, började från början +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } av { $total } match + *[other] { $current } av { $total } matchningar + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mer än { $limit } matchning + *[other] Fler än { $limit } matchningar + } +pdfjs-find-not-found = Frasen hittades inte + +## Predefined zoom values + +pdfjs-page-scale-width = Sidbredd +pdfjs-page-scale-fit = Anpassa sida +pdfjs-page-scale-auto = Automatisk zoom +pdfjs-page-scale-actual = Verklig storlek +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Sida { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ett fel uppstod vid laddning av PDF-filen. +pdfjs-invalid-file-error = Ogiltig eller korrupt PDF-fil. +pdfjs-missing-file-error = Saknad PDF-fil. +pdfjs-unexpected-response-error = Oväntat svar från servern. +pdfjs-rendering-error = Ett fel uppstod vid visning av sidan. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }-annotering] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Skriv in lösenordet för att öppna PDF-filen. +pdfjs-password-invalid = Ogiltigt lösenord. Försök igen. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Avbryt +pdfjs-web-fonts-disabled = Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt. + +## Editing + +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Rita +pdfjs-editor-ink-button-label = Rita +pdfjs-editor-stamp-button = + .title = Lägg till eller redigera bilder +pdfjs-editor-stamp-button-label = Lägg till eller redigera bilder +pdfjs-editor-highlight-button = + .title = Markera +pdfjs-editor-highlight-button-label = Markera +pdfjs-highlight-floating-button1 = + .title = Markera + .aria-label = Markera +pdfjs-highlight-floating-button-label = Markera + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Ta bort ritning +pdfjs-editor-remove-freetext-button = + .title = Ta bort text +pdfjs-editor-remove-stamp-button = + .title = Ta bort bild +pdfjs-editor-remove-highlight-button = + .title = Ta bort markering + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Färg +pdfjs-editor-free-text-size-input = Storlek +pdfjs-editor-ink-color-input = Färg +pdfjs-editor-ink-thickness-input = Tjocklek +pdfjs-editor-ink-opacity-input = Opacitet +pdfjs-editor-stamp-add-image-button = + .title = Lägg till bild +pdfjs-editor-stamp-add-image-button-label = Lägg till bild +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tjocklek +pdfjs-editor-free-highlight-thickness-title = + .title = Ändra tjocklek när du markerar andra objekt än text +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Textredigerare + .default-content = Börja skriva… +pdfjs-free-text = + .aria-label = Textredigerare +pdfjs-free-text-default-content = Börja skriva… +pdfjs-ink = + .aria-label = Ritredigerare +pdfjs-ink-canvas = + .aria-label = Användarskapad bild + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternativ text +pdfjs-editor-alt-text-edit-button = + .aria-label = Redigera alternativ text +pdfjs-editor-alt-text-edit-button-label = Redigera alternativ text +pdfjs-editor-alt-text-dialog-label = Välj ett alternativ +pdfjs-editor-alt-text-dialog-description = Alt text (alternativ text) hjälper till när människor inte kan se bilden eller när den inte laddas. +pdfjs-editor-alt-text-add-description-label = Lägg till en beskrivning +pdfjs-editor-alt-text-add-description-description = Sikta på 1-2 meningar som beskriver ämnet, miljön eller handlingen. +pdfjs-editor-alt-text-mark-decorative-label = Markera som dekorativ +pdfjs-editor-alt-text-mark-decorative-description = Detta används för dekorativa bilder, som kanter eller vattenstämplar. +pdfjs-editor-alt-text-cancel-button = Avbryt +pdfjs-editor-alt-text-save-button = Spara +pdfjs-editor-alt-text-decorative-tooltip = Märkt som dekorativ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Till exempel, "En ung man sätter sig vid ett bord för att äta en måltid" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ text + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Det övre vänstra hörnet — ändra storlek +pdfjs-editor-resizer-label-top-middle = Överst i mitten — ändra storlek +pdfjs-editor-resizer-label-top-right = Det övre högra hörnet — ändra storlek +pdfjs-editor-resizer-label-middle-right = Mitten höger — ändra storlek +pdfjs-editor-resizer-label-bottom-right = Nedre högra hörnet — ändra storlek +pdfjs-editor-resizer-label-bottom-middle = Nedre mitten — ändra storlek +pdfjs-editor-resizer-label-bottom-left = Nedre vänstra hörnet — ändra storlek +pdfjs-editor-resizer-label-middle-left = Mitten till vänster — ändra storlek +pdfjs-editor-resizer-top-left = + .aria-label = Det övre vänstra hörnet — ändra storlek +pdfjs-editor-resizer-top-middle = + .aria-label = Överst i mitten — ändra storlek +pdfjs-editor-resizer-top-right = + .aria-label = Det övre högra hörnet — ändra storlek +pdfjs-editor-resizer-middle-right = + .aria-label = Mitten höger — ändra storlek +pdfjs-editor-resizer-bottom-right = + .aria-label = Nedre högra hörnet — ändra storlek +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nedre mitten — ändra storlek +pdfjs-editor-resizer-bottom-left = + .aria-label = Nedre vänstra hörnet — ändra storlek +pdfjs-editor-resizer-middle-left = + .aria-label = Mitten till vänster — ändra storlek + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Markeringsfärg +pdfjs-editor-colorpicker-button = + .title = Ändra färg +pdfjs-editor-colorpicker-dropdown = + .aria-label = Färgval +pdfjs-editor-colorpicker-yellow = + .title = Gul +pdfjs-editor-colorpicker-green = + .title = Grön +pdfjs-editor-colorpicker-blue = + .title = Blå +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Röd + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Visa alla +pdfjs-editor-highlight-show-all-button = + .title = Visa alla + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Redigera alternativ text (bildbeskrivning) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Lägg till alternativ text (bildbeskrivning) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv din beskrivning här… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort beskrivning för personer som inte kan se bilden eller när bilden inte laddas. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denna alternativa text skapades automatiskt och kan vara felaktig. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Läs mer +pdfjs-editor-new-alt-text-create-automatically-button-label = Skapa alternativ text automatiskt +pdfjs-editor-new-alt-text-not-now-button = Inte nu +pdfjs-editor-new-alt-text-error-title = Det gick inte att skapa alternativ text automatiskt +pdfjs-editor-new-alt-text-error-description = Skriv din egna alternativa text eller försök igen senare. +pdfjs-editor-new-alt-text-error-close-button = Stäng +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Hämtar AI-modell med alternativ text ({ $downloadedSize } av { $totalSize } MB) + .aria-valuetext = Hämtar AI-modell med alternativ text ({ $downloadedSize } av { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ text tillagd +pdfjs-editor-new-alt-text-added-button-label = Alternativ text tillagd +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Saknar alternativ text +pdfjs-editor-new-alt-text-missing-button-label = Saknar alternativ text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Granska alternativ text +pdfjs-editor-new-alt-text-to-review-button-label = Granska alternativ text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Skapas automatiskt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Alternativ textinställningar för bild +pdfjs-image-alt-text-settings-button-label = Alternativ textinställningar för bild +pdfjs-editor-alt-text-settings-dialog-label = Alternativ textinställningar för bild +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ text +pdfjs-editor-alt-text-settings-create-model-button-label = Skapa alternativ text automatiskt +pdfjs-editor-alt-text-settings-create-model-description = Föreslår beskrivningar för att hjälpa personer som inte kan se bilden eller när bilden inte laddas. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-modell för alternativ text ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Körs lokalt på din enhet så att din data förblir privat. Krävs för automatisk alternativ text. +pdfjs-editor-alt-text-settings-delete-model-button = Ta bort +pdfjs-editor-alt-text-settings-download-model-button = Hämta +pdfjs-editor-alt-text-settings-downloading-model-button = Hämtar… +pdfjs-editor-alt-text-settings-editor-title = Alternativ textredigerare +pdfjs-editor-alt-text-settings-show-dialog-button-label = Visa alternativ textredigerare direkt när du lägger till en bild +pdfjs-editor-alt-text-settings-show-dialog-description = Hjälper dig att se till att alla dina bilder har alternativ text. +pdfjs-editor-alt-text-settings-close-button = Stäng + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markering borttagen +pdfjs-editor-undo-bar-message-freetext = Text borttagen +pdfjs-editor-undo-bar-message-ink = Ritning borttagen +pdfjs-editor-undo-bar-message-stamp = Bild borttagen +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anteckning har tagits bort + *[other] { $count } anteckningar har tagits bort + } +pdfjs-editor-undo-bar-undo-button = + .title = Ångra +pdfjs-editor-undo-bar-undo-button-label = Ångra +pdfjs-editor-undo-bar-close-button = + .title = Stäng +pdfjs-editor-undo-bar-close-button-label = Stäng diff --git a/public/pdfjs/web/locale/szl/viewer.ftl b/public/pdfjs/web/locale/szl/viewer.ftl new file mode 100644 index 0000000..cbf166e --- /dev/null +++ b/public/pdfjs/web/locale/szl/viewer.ftl @@ -0,0 +1,257 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Piyrwyjszo strōna +pdfjs-previous-button-label = Piyrwyjszo +pdfjs-next-button = + .title = Nastympno strōna +pdfjs-next-button-label = Dalij +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Strōna +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = ze { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } ze { $pagesCount }) +pdfjs-zoom-out-button = + .title = Zmyńsz +pdfjs-zoom-out-button-label = Zmyńsz +pdfjs-zoom-in-button = + .title = Zwiynksz +pdfjs-zoom-in-button-label = Zwiynksz +pdfjs-zoom-select = + .title = Srogość +pdfjs-presentation-mode-button = + .title = Przełōncz na tryb prezyntacyje +pdfjs-presentation-mode-button-label = Tryb prezyntacyje +pdfjs-open-file-button = + .title = Ôdewrzij zbiōr +pdfjs-open-file-button-label = Ôdewrzij +pdfjs-print-button = + .title = Durkuj +pdfjs-print-button-label = Durkuj + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Noczynia +pdfjs-tools-button-label = Noczynia +pdfjs-first-page-button = + .title = Idź ku piyrszyj strōnie +pdfjs-first-page-button-label = Idź ku piyrszyj strōnie +pdfjs-last-page-button = + .title = Idź ku ôstatnij strōnie +pdfjs-last-page-button-label = Idź ku ôstatnij strōnie +pdfjs-page-rotate-cw-button = + .title = Zwyrtnij w prawo +pdfjs-page-rotate-cw-button-label = Zwyrtnij w prawo +pdfjs-page-rotate-ccw-button = + .title = Zwyrtnij w lewo +pdfjs-page-rotate-ccw-button-label = Zwyrtnij w lewo +pdfjs-cursor-text-select-tool-button = + .title = Załōncz noczynie ôbiyranio tekstu +pdfjs-cursor-text-select-tool-button-label = Noczynie ôbiyranio tekstu +pdfjs-cursor-hand-tool-button = + .title = Załōncz noczynie rōnczka +pdfjs-cursor-hand-tool-button-label = Noczynie rōnczka +pdfjs-scroll-vertical-button = + .title = Używej piōnowego przewijanio +pdfjs-scroll-vertical-button-label = Piōnowe przewijanie +pdfjs-scroll-horizontal-button = + .title = Używej poziōmego przewijanio +pdfjs-scroll-horizontal-button-label = Poziōme przewijanie +pdfjs-scroll-wrapped-button = + .title = Używej szichtowego przewijanio +pdfjs-scroll-wrapped-button-label = Szichtowe przewijanie +pdfjs-spread-none-button = + .title = Niy dowej strōn w widoku po dwie +pdfjs-spread-none-button-label = Po jednyj strōnie +pdfjs-spread-odd-button = + .title = Pokoż strōny po dwie; niyporziste po lewyj +pdfjs-spread-odd-button-label = Niyporziste po lewyj +pdfjs-spread-even-button = + .title = Pokoż strōny po dwie; porziste po lewyj +pdfjs-spread-even-button-label = Porziste po lewyj + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Włosności dokumyntu… +pdfjs-document-properties-button-label = Włosności dokumyntu… +pdfjs-document-properties-file-name = Miano zbioru: +pdfjs-document-properties-file-size = Srogość zbioru: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) +pdfjs-document-properties-title = Tytuł: +pdfjs-document-properties-author = Autōr: +pdfjs-document-properties-subject = Tymat: +pdfjs-document-properties-keywords = Kluczowe słowa: +pdfjs-document-properties-creation-date = Data zrychtowanio: +pdfjs-document-properties-modification-date = Data zmiany: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Zrychtowane ôd: +pdfjs-document-properties-producer = PDF ôd: +pdfjs-document-properties-version = Wersyjo PDF: +pdfjs-document-properties-page-count = Wielość strōn: +pdfjs-document-properties-page-size = Srogość strōny: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = piōnowo +pdfjs-document-properties-page-size-orientation-landscape = poziōmo +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Gibki necowy podglōnd: +pdfjs-document-properties-linearized-yes = Ja +pdfjs-document-properties-linearized-no = Niy +pdfjs-document-properties-close-button = Zawrzij + +## Print + +pdfjs-print-progress-message = Rychtowanie dokumyntu do durku… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Pociep +pdfjs-printing-not-supported = Pozōr: Ta przeglōndarka niy cołkiym ôbsuguje durk. +pdfjs-printing-not-ready = Pozōr: Tyn PDF niy ma za tela zaladowany do durku. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Przełōncz posek na rancie +pdfjs-toggle-sidebar-notification-button = + .title = Przełōncz posek na rancie (dokumynt mo struktura/przidowki/warstwy) +pdfjs-toggle-sidebar-button-label = Przełōncz posek na rancie +pdfjs-document-outline-button = + .title = Pokoż struktura dokumyntu (tuplowane klikniyncie rozszyrzo/swijo wszyskie elymynta) +pdfjs-document-outline-button-label = Struktura dokumyntu +pdfjs-attachments-button = + .title = Pokoż przidowki +pdfjs-attachments-button-label = Przidowki +pdfjs-layers-button = + .title = Pokoż warstwy (tuplowane klikniyncie resetuje wszyskie warstwy do bazowego stanu) +pdfjs-layers-button-label = Warstwy +pdfjs-thumbs-button = + .title = Pokoż miniatury +pdfjs-thumbs-button-label = Miniatury +pdfjs-findbar-button = + .title = Znojdź w dokumyncie +pdfjs-findbar-button-label = Znojdź +pdfjs-additional-layers = Nadbytnie warstwy + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Strōna { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Miniatura strōny { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Znojdź + .placeholder = Znojdź w dokumyncie… +pdfjs-find-previous-button = + .title = Znojdź piyrwyjsze pokozanie sie tyj frazy +pdfjs-find-previous-button-label = Piyrwyjszo +pdfjs-find-next-button = + .title = Znojdź nastympne pokozanie sie tyj frazy +pdfjs-find-next-button-label = Dalij +pdfjs-find-highlight-checkbox = Zaznacz wszysko +pdfjs-find-match-case-checkbox-label = Poznowej srogość liter +pdfjs-find-entire-word-checkbox-label = Cołke słowa +pdfjs-find-reached-top = Doszło do samego wiyrchu strōny, dalij ôd spodku +pdfjs-find-reached-bottom = Doszło do samego spodku strōny, dalij ôd wiyrchu +pdfjs-find-not-found = Fraza niy znaleziōno + +## Predefined zoom values + +pdfjs-page-scale-width = Szyrzka strōny +pdfjs-page-scale-fit = Napasowanie strōny +pdfjs-page-scale-auto = Autōmatyczno srogość +pdfjs-page-scale-actual = Aktualno srogość +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Przi ladowaniu PDFa pokozoł sie feler. +pdfjs-invalid-file-error = Zły abo felerny zbiōr PDF. +pdfjs-missing-file-error = Chybio zbioru PDF. +pdfjs-unexpected-response-error = Niyôczekowano ôdpowiydź serwera. +pdfjs-rendering-error = Przi renderowaniu strōny pokozoł sie feler. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Anotacyjo typu { $type }] + +## Password + +pdfjs-password-label = Wkludź hasło, coby ôdewrzić tyn zbiōr PDF. +pdfjs-password-invalid = Hasło je złe. Sprōbuj jeszcze roz. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Pociep +pdfjs-web-fonts-disabled = Necowe fōnty sōm zastawiōne: niy idzie użyć wkludzōnych fōntōw PDF. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/ta/viewer.ftl b/public/pdfjs/web/locale/ta/viewer.ftl new file mode 100644 index 0000000..82cf197 --- /dev/null +++ b/public/pdfjs/web/locale/ta/viewer.ftl @@ -0,0 +1,223 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = முந்தைய பக்கம் +pdfjs-previous-button-label = முந்தையது +pdfjs-next-button = + .title = அடுத்த பக்கம் +pdfjs-next-button-label = அடுத்து +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = பக்கம் +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } இல் +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = { $pagesCount }) இல் ({ $pageNumber } +pdfjs-zoom-out-button = + .title = சிறிதாக்கு +pdfjs-zoom-out-button-label = சிறிதாக்கு +pdfjs-zoom-in-button = + .title = பெரிதாக்கு +pdfjs-zoom-in-button-label = பெரிதாக்கு +pdfjs-zoom-select = + .title = பெரிதாக்கு +pdfjs-presentation-mode-button = + .title = விளக்ககாட்சி பயன்முறைக்கு மாறு +pdfjs-presentation-mode-button-label = விளக்ககாட்சி பயன்முறை +pdfjs-open-file-button = + .title = கோப்பினை திற +pdfjs-open-file-button-label = திற +pdfjs-print-button = + .title = அச்சிடு +pdfjs-print-button-label = அச்சிடு + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = கருவிகள் +pdfjs-tools-button-label = கருவிகள் +pdfjs-first-page-button = + .title = முதல் பக்கத்திற்கு செல்லவும் +pdfjs-first-page-button-label = முதல் பக்கத்திற்கு செல்லவும் +pdfjs-last-page-button = + .title = கடைசி பக்கத்திற்கு செல்லவும் +pdfjs-last-page-button-label = கடைசி பக்கத்திற்கு செல்லவும் +pdfjs-page-rotate-cw-button = + .title = வலஞ்சுழியாக சுழற்று +pdfjs-page-rotate-cw-button-label = வலஞ்சுழியாக சுழற்று +pdfjs-page-rotate-ccw-button = + .title = இடஞ்சுழியாக சுழற்று +pdfjs-page-rotate-ccw-button-label = இடஞ்சுழியாக சுழற்று +pdfjs-cursor-text-select-tool-button = + .title = உரைத் தெரிவு கருவியைச் செயல்படுத்து +pdfjs-cursor-text-select-tool-button-label = உரைத் தெரிவு கருவி +pdfjs-cursor-hand-tool-button = + .title = கைக் கருவிக்ச் செயற்படுத்து +pdfjs-cursor-hand-tool-button-label = கைக்குருவி + +## Document properties dialog + +pdfjs-document-properties-button = + .title = ஆவண பண்புகள்... +pdfjs-document-properties-button-label = ஆவண பண்புகள்... +pdfjs-document-properties-file-name = கோப்பு பெயர்: +pdfjs-document-properties-file-size = கோப்பின் அளவு: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } கிபை ({ $size_b } பைட்டுகள்) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } மெபை ({ $size_b } பைட்டுகள்) +pdfjs-document-properties-title = தலைப்பு: +pdfjs-document-properties-author = எழுதியவர் +pdfjs-document-properties-subject = பொருள்: +pdfjs-document-properties-keywords = முக்கிய வார்த்தைகள்: +pdfjs-document-properties-creation-date = படைத்த தேதி : +pdfjs-document-properties-modification-date = திருத்திய தேதி: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = உருவாக்குபவர்: +pdfjs-document-properties-producer = பிடிஎஃப் தயாரிப்பாளர்: +pdfjs-document-properties-version = PDF பதிப்பு: +pdfjs-document-properties-page-count = பக்க எண்ணிக்கை: +pdfjs-document-properties-page-size = பக்க அளவு: +pdfjs-document-properties-page-size-unit-inches = இதில் +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = நிலைபதிப்பு +pdfjs-document-properties-page-size-orientation-landscape = நிலைபரப்பு +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = கடிதம் +pdfjs-document-properties-page-size-name-legal = சட்டபூர்வ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-close-button = மூடுக + +## Print + +pdfjs-print-progress-message = அச்சிடுவதற்கான ஆவணம் தயாராகிறது... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ரத்து +pdfjs-printing-not-supported = எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை. +pdfjs-printing-not-ready = எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = பக்கப் பட்டியை நிலைமாற்று +pdfjs-toggle-sidebar-button-label = பக்கப் பட்டியை நிலைமாற்று +pdfjs-document-outline-button = + .title = ஆவண அடக்கத்தைக் காட்டு (இருமுறைச் சொடுக்கி அனைத்து உறுப்பிடிகளையும் விரி/சேர்) +pdfjs-document-outline-button-label = ஆவண வெளிவரை +pdfjs-attachments-button = + .title = இணைப்புகளை காண்பி +pdfjs-attachments-button-label = இணைப்புகள் +pdfjs-thumbs-button = + .title = சிறுபடங்களைக் காண்பி +pdfjs-thumbs-button-label = சிறுபடங்கள் +pdfjs-findbar-button = + .title = ஆவணத்தில் கண்டறி +pdfjs-findbar-button-label = தேடு + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = பக்கம் { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = பக்கத்தின் சிறுபடம் { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = கண்டுபிடி + .placeholder = ஆவணத்தில் கண்டறி… +pdfjs-find-previous-button = + .title = இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு +pdfjs-find-previous-button-label = முந்தையது +pdfjs-find-next-button = + .title = இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு +pdfjs-find-next-button-label = அடுத்து +pdfjs-find-highlight-checkbox = அனைத்தையும் தனிப்படுத்து +pdfjs-find-match-case-checkbox-label = பேரெழுத்தாக்கத்தை உணர் +pdfjs-find-reached-top = ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது +pdfjs-find-reached-bottom = ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது +pdfjs-find-not-found = சொற்றொடர் காணவில்லை + +## Predefined zoom values + +pdfjs-page-scale-width = பக்க அகலம் +pdfjs-page-scale-fit = பக்கப் பொருத்தம் +pdfjs-page-scale-auto = தானியக்க பெரிதாக்கல் +pdfjs-page-scale-actual = உண்மையான அளவு +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது. +pdfjs-invalid-file-error = செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு. +pdfjs-missing-file-error = PDF கோப்பு காணவில்லை. +pdfjs-unexpected-response-error = சேவகன் பதில் எதிர்பாரதது. +pdfjs-rendering-error = இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } விளக்கம்] + +## Password + +pdfjs-password-label = இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும். +pdfjs-password-invalid = செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க. +pdfjs-password-ok-button = சரி +pdfjs-password-cancel-button = ரத்து +pdfjs-web-fonts-disabled = வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/te/viewer.ftl b/public/pdfjs/web/locale/te/viewer.ftl new file mode 100644 index 0000000..94dc2b8 --- /dev/null +++ b/public/pdfjs/web/locale/te/viewer.ftl @@ -0,0 +1,239 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = మునుపటి పేజీ +pdfjs-previous-button-label = క్రితం +pdfjs-next-button = + .title = తరువాత పేజీ +pdfjs-next-button-label = తరువాత +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = పేజీ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = మొత్తం { $pagesCount } లో +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = (మొత్తం { $pagesCount } లో { $pageNumber }వది) +pdfjs-zoom-out-button = + .title = జూమ్ తగ్గించు +pdfjs-zoom-out-button-label = జూమ్ తగ్గించు +pdfjs-zoom-in-button = + .title = జూమ్ చేయి +pdfjs-zoom-in-button-label = జూమ్ చేయి +pdfjs-zoom-select = + .title = జూమ్ +pdfjs-presentation-mode-button = + .title = ప్రదర్శనా రీతికి మారు +pdfjs-presentation-mode-button-label = ప్రదర్శనా రీతి +pdfjs-open-file-button = + .title = ఫైల్ తెరువు +pdfjs-open-file-button-label = తెరువు +pdfjs-print-button = + .title = ముద్రించు +pdfjs-print-button-label = ముద్రించు + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = పనిముట్లు +pdfjs-tools-button-label = పనిముట్లు +pdfjs-first-page-button = + .title = మొదటి పేజీకి వెళ్ళు +pdfjs-first-page-button-label = మొదటి పేజీకి వెళ్ళు +pdfjs-last-page-button = + .title = చివరి పేజీకి వెళ్ళు +pdfjs-last-page-button-label = చివరి పేజీకి వెళ్ళు +pdfjs-page-rotate-cw-button = + .title = సవ్యదిశలో తిప్పు +pdfjs-page-rotate-cw-button-label = సవ్యదిశలో తిప్పు +pdfjs-page-rotate-ccw-button = + .title = అపసవ్యదిశలో తిప్పు +pdfjs-page-rotate-ccw-button-label = అపసవ్యదిశలో తిప్పు +pdfjs-cursor-text-select-tool-button = + .title = టెక్స్ట్ ఎంపిక సాధనాన్ని ప్రారంభించండి +pdfjs-cursor-text-select-tool-button-label = టెక్స్ట్ ఎంపిక సాధనం +pdfjs-cursor-hand-tool-button = + .title = చేతి సాధనం చేతనించు +pdfjs-cursor-hand-tool-button-label = చేతి సాధనం +pdfjs-scroll-vertical-button-label = నిలువు స్క్రోలింగు + +## Document properties dialog + +pdfjs-document-properties-button = + .title = పత్రము లక్షణాలు... +pdfjs-document-properties-button-label = పత్రము లక్షణాలు... +pdfjs-document-properties-file-name = దస్త్రం పేరు: +pdfjs-document-properties-file-size = దస్త్రం పరిమాణం: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = శీర్షిక: +pdfjs-document-properties-author = మూలకర్త: +pdfjs-document-properties-subject = విషయం: +pdfjs-document-properties-keywords = కీ పదాలు: +pdfjs-document-properties-creation-date = సృష్టించిన తేదీ: +pdfjs-document-properties-modification-date = సవరించిన తేదీ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = సృష్టికర్త: +pdfjs-document-properties-producer = PDF ఉత్పాదకి: +pdfjs-document-properties-version = PDF వర్షన్: +pdfjs-document-properties-page-count = పేజీల సంఖ్య: +pdfjs-document-properties-page-size = కాగితం పరిమాణం: +pdfjs-document-properties-page-size-unit-inches = లో +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = నిలువుచిత్రం +pdfjs-document-properties-page-size-orientation-landscape = అడ్డచిత్రం +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = లేఖ +pdfjs-document-properties-page-size-name-legal = చట్టపరమైన + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +pdfjs-document-properties-linearized-yes = అవును +pdfjs-document-properties-linearized-no = కాదు +pdfjs-document-properties-close-button = మూసివేయి + +## Print + +pdfjs-print-progress-message = ముద్రించడానికి పత్రము సిద్ధమవుతున్నది… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = రద్దుచేయి +pdfjs-printing-not-supported = హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటు లేదు. +pdfjs-printing-not-ready = హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = పక్కపట్టీ మార్చు +pdfjs-toggle-sidebar-button-label = పక్కపట్టీ మార్చు +pdfjs-document-outline-button = + .title = పత్రము రూపము చూపించు (డబుల్ క్లిక్ చేసి అన్ని అంశాలను విస్తరించు/కూల్చు) +pdfjs-document-outline-button-label = పత్రము అవుట్‌లైన్ +pdfjs-attachments-button = + .title = అనుబంధాలు చూపు +pdfjs-attachments-button-label = అనుబంధాలు +pdfjs-layers-button-label = పొరలు +pdfjs-thumbs-button = + .title = థంబ్‌నైల్స్ చూపు +pdfjs-thumbs-button-label = థంబ్‌నైల్స్ +pdfjs-findbar-button = + .title = పత్రములో కనుగొనుము +pdfjs-findbar-button-label = కనుగొను +pdfjs-additional-layers = అదనపు పొరలు + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = పేజీ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } పేజీ నఖచిత్రం + +## Find panel button title and messages + +pdfjs-find-input = + .title = కనుగొను + .placeholder = పత్రములో కనుగొను… +pdfjs-find-previous-button = + .title = పదం యొక్క ముందు సంభవాన్ని కనుగొను +pdfjs-find-previous-button-label = మునుపటి +pdfjs-find-next-button = + .title = పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను +pdfjs-find-next-button-label = తరువాత +pdfjs-find-highlight-checkbox = అన్నిటిని ఉద్దీపనం చేయుము +pdfjs-find-match-case-checkbox-label = అక్షరముల తేడాతో పోల్చు +pdfjs-find-entire-word-checkbox-label = పూర్తి పదాలు +pdfjs-find-reached-top = పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి +pdfjs-find-reached-bottom = పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి +pdfjs-find-not-found = పదబంధం కనబడలేదు + +## Predefined zoom values + +pdfjs-page-scale-width = పేజీ వెడల్పు +pdfjs-page-scale-fit = పేజీ అమర్పు +pdfjs-page-scale-auto = స్వయంచాలక జూమ్ +pdfjs-page-scale-actual = యథార్ధ పరిమాణం +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది. +pdfjs-invalid-file-error = చెల్లని లేదా పాడైన PDF ఫైలు. +pdfjs-missing-file-error = దొరకని PDF ఫైలు. +pdfjs-unexpected-response-error = అనుకోని సర్వర్ స్పందన. +pdfjs-rendering-error = పేజీను రెండర్ చేయుటలో ఒక దోషం ఎదురైంది. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } టీకా] + +## Password + +pdfjs-password-label = ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము. +pdfjs-password-invalid = సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి. +pdfjs-password-ok-button = సరే +pdfjs-password-cancel-button = రద్దుచేయి +pdfjs-web-fonts-disabled = వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది. + +## Editing + +# Editor Parameters +pdfjs-editor-free-text-color-input = రంగు +pdfjs-editor-free-text-size-input = పరిమాణం +pdfjs-editor-ink-color-input = రంగు +pdfjs-editor-ink-thickness-input = మందం +pdfjs-editor-ink-opacity-input = అకిరణ్యత + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/tg/viewer.ftl b/public/pdfjs/web/locale/tg/viewer.ftl new file mode 100644 index 0000000..b39fee5 --- /dev/null +++ b/public/pdfjs/web/locale/tg/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Саҳифаи қаблӣ +pdfjs-previous-button-label = Қаблӣ +pdfjs-next-button = + .title = Саҳифаи навбатӣ +pdfjs-next-button-label = Навбатӣ +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Саҳифа +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = аз { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } аз { $pagesCount }) +pdfjs-zoom-out-button = + .title = Хурд кардан +pdfjs-zoom-out-button-label = Хурд кардан +pdfjs-zoom-in-button = + .title = Калон кардан +pdfjs-zoom-in-button-label = Калон кардан +pdfjs-zoom-select = + .title = Танзими андоза +pdfjs-presentation-mode-button = + .title = Гузариш ба реҷаи тақдим +pdfjs-presentation-mode-button-label = Реҷаи тақдим +pdfjs-open-file-button = + .title = Кушодани файл +pdfjs-open-file-button-label = Кушодан +pdfjs-print-button = + .title = Чоп кардан +pdfjs-print-button-label = Чоп кардан +pdfjs-save-button = + .title = Нигоҳ доштан +pdfjs-save-button-label = Нигоҳ доштан +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Боргирӣ кардан +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Боргирӣ кардан +pdfjs-bookmark-button = + .title = Саҳифаи ҷорӣ (Дидани нишонии URL аз саҳифаи ҷорӣ) +pdfjs-bookmark-button-label = Саҳифаи ҷорӣ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Абзорҳо +pdfjs-tools-button-label = Абзорҳо +pdfjs-first-page-button = + .title = Ба саҳифаи аввал гузаред +pdfjs-first-page-button-label = Ба саҳифаи аввал гузаред +pdfjs-last-page-button = + .title = Ба саҳифаи охирин гузаред +pdfjs-last-page-button-label = Ба саҳифаи охирин гузаред +pdfjs-page-rotate-cw-button = + .title = Ба самти ҳаракати ақрабаки соат давр задан +pdfjs-page-rotate-cw-button-label = Ба самти ҳаракати ақрабаки соат давр задан +pdfjs-page-rotate-ccw-button = + .title = Ба муқобили самти ҳаракати ақрабаки соат давр задан +pdfjs-page-rotate-ccw-button-label = Ба муқобили самти ҳаракати ақрабаки соат давр задан +pdfjs-cursor-text-select-tool-button = + .title = Фаъол кардани «Абзори интихоби матн» +pdfjs-cursor-text-select-tool-button-label = Абзори интихоби матн +pdfjs-cursor-hand-tool-button = + .title = Фаъол кардани «Абзори даст» +pdfjs-cursor-hand-tool-button-label = Абзори даст +pdfjs-scroll-page-button = + .title = Истифодаи варақзанӣ +pdfjs-scroll-page-button-label = Варақзанӣ +pdfjs-scroll-vertical-button = + .title = Истифодаи варақзании амудӣ +pdfjs-scroll-vertical-button-label = Варақзании амудӣ +pdfjs-scroll-horizontal-button = + .title = Истифодаи варақзании уфуқӣ +pdfjs-scroll-horizontal-button-label = Варақзании уфуқӣ +pdfjs-scroll-wrapped-button = + .title = Истифодаи варақзании миқёсбандӣ +pdfjs-scroll-wrapped-button-label = Варақзании миқёсбандӣ +pdfjs-spread-none-button = + .title = Густариши саҳифаҳо истифода бурда нашавад +pdfjs-spread-none-button-label = Бе густурдани саҳифаҳо +pdfjs-spread-odd-button = + .title = Густариши саҳифаҳо аз саҳифаҳо бо рақамҳои тоқ оғоз карда мешавад +pdfjs-spread-odd-button-label = Саҳифаҳои тоқ аз тарафи чап +pdfjs-spread-even-button = + .title = Густариши саҳифаҳо аз саҳифаҳо бо рақамҳои ҷуфт оғоз карда мешавад +pdfjs-spread-even-button-label = Саҳифаҳои ҷуфт аз тарафи чап + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Хусусиятҳои ҳуҷҷат… +pdfjs-document-properties-button-label = Хусусиятҳои ҳуҷҷат… +pdfjs-document-properties-file-name = Номи файл: +pdfjs-document-properties-file-size = Андозаи файл: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байт) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +pdfjs-document-properties-title = Сарлавҳа: +pdfjs-document-properties-author = Муаллиф: +pdfjs-document-properties-subject = Мавзуъ: +pdfjs-document-properties-keywords = Калимаҳои калидӣ: +pdfjs-document-properties-creation-date = Санаи эҷод: +pdfjs-document-properties-modification-date = Санаи тағйирот: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Эҷодкунанда: +pdfjs-document-properties-producer = Таҳиякунандаи «PDF»: +pdfjs-document-properties-version = Версияи «PDF»: +pdfjs-document-properties-page-count = Шумораи саҳифаҳо: +pdfjs-document-properties-page-size = Андозаи саҳифа: +pdfjs-document-properties-page-size-unit-inches = дюйм +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = амудӣ +pdfjs-document-properties-page-size-orientation-landscape = уфуқӣ +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Мактуб +pdfjs-document-properties-page-size-name-legal = Ҳуқуқӣ + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Намоиши тез дар Интернет: +pdfjs-document-properties-linearized-yes = Ҳа +pdfjs-document-properties-linearized-no = Не +pdfjs-document-properties-close-button = Пӯшидан + +## Print + +pdfjs-print-progress-message = Омодасозии ҳуҷҷат барои чоп… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Бекор кардан +pdfjs-printing-not-supported = Диққат: Чопкунӣ аз тарафи ин браузер ба таври пурра дастгирӣ намешавад. +pdfjs-printing-not-ready = Диққат: Файли «PDF» барои чопкунӣ пурра бор карда нашуд. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Фаъол кардани навори ҷонибӣ +pdfjs-toggle-sidebar-notification-button = + .title = Фаъол кардани навори ҷонибӣ (ҳуҷҷат дорои сохтор/замимаҳо/қабатҳо мебошад) +pdfjs-toggle-sidebar-button-label = Фаъол кардани навори ҷонибӣ +pdfjs-document-outline-button = + .title = Намоиш додани сохтори ҳуҷҷат (барои баркушодан/пеҷондани ҳамаи унсурҳо дубора зер кунед) +pdfjs-document-outline-button-label = Сохтори ҳуҷҷат +pdfjs-attachments-button = + .title = Намоиш додани замимаҳо +pdfjs-attachments-button-label = Замимаҳо +pdfjs-layers-button = + .title = Намоиш додани қабатҳо (барои барқарор кардани ҳамаи қабатҳо ба вазъияти пешфарз дубора зер кунед) +pdfjs-layers-button-label = Қабатҳо +pdfjs-thumbs-button = + .title = Намоиш додани тасвирчаҳо +pdfjs-thumbs-button-label = Тасвирчаҳо +pdfjs-current-outline-item-button = + .title = Ёфтани унсури сохтори ҷорӣ +pdfjs-current-outline-item-button-label = Унсури сохтори ҷорӣ +pdfjs-findbar-button = + .title = Ёфтан дар ҳуҷҷат +pdfjs-findbar-button-label = Ёфтан +pdfjs-additional-layers = Қабатҳои иловагӣ + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Саҳифаи { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Тасвирчаи саҳифаи { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Ёфтан + .placeholder = Ёфтан дар ҳуҷҷат… +pdfjs-find-previous-button = + .title = Ҷустуҷӯи мавриди қаблии ибораи пешниҳодшуда +pdfjs-find-previous-button-label = Қаблӣ +pdfjs-find-next-button = + .title = Ҷустуҷӯи мавриди навбатии ибораи пешниҳодшуда +pdfjs-find-next-button-label = Навбатӣ +pdfjs-find-highlight-checkbox = Ҳамаашро бо ранг ҷудо кардан +pdfjs-find-match-case-checkbox-label = Бо дарназардошти ҳарфҳои хурду калон +pdfjs-find-match-diacritics-checkbox-label = Бо дарназардошти аломатҳои диакритикӣ +pdfjs-find-entire-word-checkbox-label = Калимаҳои пурра +pdfjs-find-reached-top = Ба болои ҳуҷҷат расид, аз поён идома ёфт +pdfjs-find-reached-bottom = Ба поёни ҳуҷҷат расид, аз боло идома ёфт +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } аз { $total } мувофиқат + *[other] { $current } аз { $total } мувофиқат + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Зиёда аз { $limit } мувофиқат + *[other] Зиёда аз { $limit } мувофиқат + } +pdfjs-find-not-found = Ибора ёфт нашуд + +## Predefined zoom values + +pdfjs-page-scale-width = Аз рӯи паҳнои саҳифа +pdfjs-page-scale-fit = Аз рӯи андозаи саҳифа +pdfjs-page-scale-auto = Андозаи худкор +pdfjs-page-scale-actual = Андозаи воқеӣ +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Саҳифаи { $page } + +## Loading indicator messages + +pdfjs-loading-error = Ҳангоми боркунии «PDF» хато ба миён омад. +pdfjs-invalid-file-error = Файли «PDF» нодуруст ё вайроншуда мебошад. +pdfjs-missing-file-error = Файли «PDF» ғоиб аст. +pdfjs-unexpected-response-error = Ҷавоби ногаҳон аз сервер. +pdfjs-rendering-error = Ҳангоми шаклсозии саҳифа хато ба миён омад. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Ҳошиянависӣ - { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Барои кушодани ин файли «PDF» ниҳонвожаро ворид кунед. +pdfjs-password-invalid = Ниҳонвожаи нодуруст. Лутфан, аз нав кӯшиш кунед. +pdfjs-password-ok-button = ХУБ +pdfjs-password-cancel-button = Бекор кардан +pdfjs-web-fonts-disabled = Шрифтҳои интернетӣ ғайрифаъоланд: истифодаи шрифтҳои дарунсохти «PDF» ғайриимкон аст. + +## Editing + +pdfjs-editor-free-text-button = + .title = Матн +pdfjs-editor-free-text-button-label = Матн +pdfjs-editor-ink-button = + .title = Расмкашӣ +pdfjs-editor-ink-button-label = Расмкашӣ +pdfjs-editor-stamp-button = + .title = Илова ё таҳрир кардани тасвирҳо +pdfjs-editor-stamp-button-label = Илова ё таҳрир кардани тасвирҳо +pdfjs-editor-highlight-button = + .title = Ҷудокунӣ +pdfjs-editor-highlight-button-label = Ҷудокунӣ +pdfjs-highlight-floating-button1 = + .title = Ҷудокунӣ + .aria-label = Ҷудокунӣ +pdfjs-highlight-floating-button-label = Ҷудокунӣ + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Тоза кардани нақша +pdfjs-editor-remove-freetext-button = + .title = Тоза кардани матн +pdfjs-editor-remove-stamp-button = + .title = Тоза кардани тасвир +pdfjs-editor-remove-highlight-button = + .title = Тоза кардани ҷудокунӣ + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Ранг +pdfjs-editor-free-text-size-input = Андоза +pdfjs-editor-ink-color-input = Ранг +pdfjs-editor-ink-thickness-input = Ғафсӣ +pdfjs-editor-ink-opacity-input = Шаффофӣ +pdfjs-editor-stamp-add-image-button = + .title = Илова кардани тасвир +pdfjs-editor-stamp-add-image-button-label = Илова кардани тасвир +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Ғафсӣ +pdfjs-editor-free-highlight-thickness-title = + .title = Иваз кардани ғафсӣ ҳангоми ҷудокунии унсурҳо ба ғайр аз матн +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Муҳаррири матн + .default-content = Матнро ворид кунед… +pdfjs-free-text = + .aria-label = Муҳаррири матн +pdfjs-free-text-default-content = Нависед… +pdfjs-ink = + .aria-label = Муҳаррири расмкашӣ +pdfjs-ink-canvas = + .aria-label = Тасвири эҷодкардаи корбар + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Матни иловагӣ +pdfjs-editor-alt-text-edit-button = + .aria-label = Таҳрир кардани матни ивазкунанда +pdfjs-editor-alt-text-edit-button-label = Таҳрир кардани матни иловагӣ +pdfjs-editor-alt-text-dialog-label = Имконеро интихоб намоед +pdfjs-editor-alt-text-dialog-description = Вақте ки одамон тасвирро дида наметавонанд ё вақте ки тасвир бор карда намешавад, матни иловагӣ (Alt text) кумак мерасонад. +pdfjs-editor-alt-text-add-description-label = Илова кардани тавсиф +pdfjs-editor-alt-text-add-description-description = Кӯшиш кунед, ки 1-2 ҷумлаеро нависед, ки ба мавзӯъ, танзим ё амалҳо тавзеҳ медиҳад. +pdfjs-editor-alt-text-mark-decorative-label = Гузоштан ҳамчун матни ороишӣ +pdfjs-editor-alt-text-mark-decorative-description = Ин барои тасвирҳои ороишӣ, ба монанди марзҳо ё аломатҳои обӣ, истифода мешавад. +pdfjs-editor-alt-text-cancel-button = Бекор кардан +pdfjs-editor-alt-text-save-button = Нигоҳ доштан +pdfjs-editor-alt-text-decorative-tooltip = Ҳамчун матни ороишӣ гузошта шуд +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Барои мисол, «Ман забони тоҷикиро дӯст медорам» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Матни ивазкунанда + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Кунҷи чапи боло — тағйир додани андоза +pdfjs-editor-resizer-label-top-middle = Канори миёнаи боло — тағйир додани андоза +pdfjs-editor-resizer-label-top-right = Кунҷи рости боло — тағйир додани андоза +pdfjs-editor-resizer-label-middle-right = Канори миёнаи рост — тағйир додани андоза +pdfjs-editor-resizer-label-bottom-right = Кунҷи рости поён — тағйир додани андоза +pdfjs-editor-resizer-label-bottom-middle = Канори миёнаи поён — тағйир додани андоза +pdfjs-editor-resizer-label-bottom-left = Кунҷи чапи поён — тағйир додани андоза +pdfjs-editor-resizer-label-middle-left = Канори миёнаи чап — тағйир додани андоза +pdfjs-editor-resizer-top-left = + .aria-label = Кунҷи чапи боло — тағйир додани андоза +pdfjs-editor-resizer-top-middle = + .aria-label = Канори миёнаи боло — тағйир додани андоза +pdfjs-editor-resizer-top-right = + .aria-label = Кунҷи рости боло — тағйир додани андоза +pdfjs-editor-resizer-middle-right = + .aria-label = Канори миёнаи рост — тағйир додани андоза +pdfjs-editor-resizer-bottom-right = + .aria-label = Кунҷи рости поён — тағйир додани андоза +pdfjs-editor-resizer-bottom-middle = + .aria-label = Канори миёнаи поён — тағйир додани андоза +pdfjs-editor-resizer-bottom-left = + .aria-label = Кунҷи чапи поён — тағйир додани андоза +pdfjs-editor-resizer-middle-left = + .aria-label = Канори миёнаи чап — тағйир додани андоза + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Ранги ҷудокунӣ +pdfjs-editor-colorpicker-button = + .title = Иваз кардани ранг +pdfjs-editor-colorpicker-dropdown = + .aria-label = Интихоби ранг +pdfjs-editor-colorpicker-yellow = + .title = Зард +pdfjs-editor-colorpicker-green = + .title = Сабз +pdfjs-editor-colorpicker-blue = + .title = Кабуд +pdfjs-editor-colorpicker-pink = + .title = Гулобӣ +pdfjs-editor-colorpicker-red = + .title = Сурх + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Ҳамаро намоиш додан +pdfjs-editor-highlight-show-all-button = + .title = Ҳамаро намоиш додан + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Таҳрир кардани матни иловагӣ (тафсири тасвир) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Илова кардани матни иловагӣ (тафсири тасвир) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Тафсири худро дар ин ҷо нависед… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Тавсифи мухтасар барои одамоне, ки аксҳоро дида наметавонанд ё вақте ки аксҳо кушода намешаванд. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ин матни ивазкунанда ба таври худкор сохта шудааст ва шояд нодуруст бошад. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Маълумоти бештар +pdfjs-editor-new-alt-text-create-automatically-button-label = Ба таври худкор эҷод кардани матни иловагӣ +pdfjs-editor-new-alt-text-not-now-button = Ҳоло не +pdfjs-editor-new-alt-text-error-title = Матни иловагӣ ба таври худкор эҷод карда нашуд +pdfjs-editor-new-alt-text-error-description = Лутфан, матни иловагии худро ворид кунед ё баъдтар аз нав кӯшиш кунед. +pdfjs-editor-new-alt-text-error-close-button = Пӯшидан +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Боргирии модели зеҳни сунъӣ (AI) барои матни ивазкунанда ({ $downloadedSize } аз { $totalSize } МБ) + .aria-valuetext = Боргирии модели зеҳни сунъӣ (AI) барои матни ивазкунанда ({ $downloadedSize } аз { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Матни иловагӣ илова карда шуд +pdfjs-editor-new-alt-text-added-button-label = Матни иловагӣ илова карда шуд +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Матни иловагӣ вуҷуд надорад +pdfjs-editor-new-alt-text-missing-button-label = Матни иловагӣ вуҷуд надорад +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Бознигарӣ кардани матни иловагӣ +pdfjs-editor-new-alt-text-to-review-button-label = Бознигарӣ кардани матни иловагӣ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Ба таври худкор сохта шудааст: «{ $generatedAltText }» + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Танзимоти матни иловагии тасвир +pdfjs-image-alt-text-settings-button-label = Танзимоти матни иловагии тасвир +pdfjs-editor-alt-text-settings-dialog-label = Танзимоти матни иловагии тасвир +pdfjs-editor-alt-text-settings-automatic-title = Матни иловагии худкор +pdfjs-editor-alt-text-settings-create-model-button-label = Ба таври худкор эҷод кардани матни иловагӣ +pdfjs-editor-alt-text-settings-create-model-description = Ин имкон барои расонидани кумак ба одамоне, ки аксҳоро дида наметавонанд ё вақте ки аксҳо кушода намешаванд, тавсифи аксҳоро пешниҳод мекунад. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Модели зеҳни сунъӣ «AI» барои матни ивазкунанда ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Дар дастгоҳи шумо ба таври маҳаллӣ кор мекунад, бинобар ин махфияти маълумоти шахсии шумо нигоҳ дошта мешавад. Барои матни ивазкунандаи худкор лозим аст. +pdfjs-editor-alt-text-settings-delete-model-button = Нест кардан +pdfjs-editor-alt-text-settings-download-model-button = Боргирӣ кардан +pdfjs-editor-alt-text-settings-downloading-model-button = Дар ҳоли боргирӣ… +pdfjs-editor-alt-text-settings-editor-title = Муҳаррири матни иловагӣ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Дарҳол нишон додани муҳаррири матни ивазкунанда ҳангоми иловакунии тасвир +pdfjs-editor-alt-text-settings-show-dialog-description = Ба шумо кумак мекунад, ки боварӣ ҳосил кунед, ки ҳамаи тасвирҳои шумо дорои матни ивазкунанда мебошанд. +pdfjs-editor-alt-text-settings-close-button = Пӯшидан + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Ҷудосозӣ тоза карда шуд +pdfjs-editor-undo-bar-message-freetext = Матн тоза карда шуд +pdfjs-editor-undo-bar-message-ink = Расм тоза карда шуд +pdfjs-editor-undo-bar-message-stamp = Тасвир тоза карда шуд +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } ҳошиянависӣ тоза карда шуд + *[other] { $count } ҳошиянависӣ тоза карда шуданд + } +pdfjs-editor-undo-bar-undo-button = + .title = Бекор кардан +pdfjs-editor-undo-bar-undo-button-label = Бекор кардан +pdfjs-editor-undo-bar-close-button = + .title = Пӯшидан +pdfjs-editor-undo-bar-close-button-label = Пӯшидан diff --git a/public/pdfjs/web/locale/th/viewer.ftl b/public/pdfjs/web/locale/th/viewer.ftl new file mode 100644 index 0000000..cba15f9 --- /dev/null +++ b/public/pdfjs/web/locale/th/viewer.ftl @@ -0,0 +1,503 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = หน้าก่อนหน้า +pdfjs-previous-button-label = ก่อนหน้า +pdfjs-next-button = + .title = หน้าถัดไป +pdfjs-next-button-label = ถัดไป +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = หน้า +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = จาก { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } จาก { $pagesCount }) +pdfjs-zoom-out-button = + .title = ซูมออก +pdfjs-zoom-out-button-label = ซูมออก +pdfjs-zoom-in-button = + .title = ซูมเข้า +pdfjs-zoom-in-button-label = ซูมเข้า +pdfjs-zoom-select = + .title = ซูม +pdfjs-presentation-mode-button = + .title = สลับเป็นโหมดการนำเสนอ +pdfjs-presentation-mode-button-label = โหมดการนำเสนอ +pdfjs-open-file-button = + .title = เปิดไฟล์ +pdfjs-open-file-button-label = เปิด +pdfjs-print-button = + .title = พิมพ์ +pdfjs-print-button-label = พิมพ์ +pdfjs-save-button = + .title = บันทึก +pdfjs-save-button-label = บันทึก +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ดาวน์โหลด +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ดาวน์โหลด +pdfjs-bookmark-button = + .title = หน้าปัจจุบัน (ดู URL จากหน้าปัจจุบัน) +pdfjs-bookmark-button-label = หน้าปัจจุบัน + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = เครื่องมือ +pdfjs-tools-button-label = เครื่องมือ +pdfjs-first-page-button = + .title = ไปยังหน้าแรก +pdfjs-first-page-button-label = ไปยังหน้าแรก +pdfjs-last-page-button = + .title = ไปยังหน้าสุดท้าย +pdfjs-last-page-button-label = ไปยังหน้าสุดท้าย +pdfjs-page-rotate-cw-button = + .title = หมุนตามเข็มนาฬิกา +pdfjs-page-rotate-cw-button-label = หมุนตามเข็มนาฬิกา +pdfjs-page-rotate-ccw-button = + .title = หมุนทวนเข็มนาฬิกา +pdfjs-page-rotate-ccw-button-label = หมุนทวนเข็มนาฬิกา +pdfjs-cursor-text-select-tool-button = + .title = เปิดใช้งานเครื่องมือการเลือกข้อความ +pdfjs-cursor-text-select-tool-button-label = เครื่องมือการเลือกข้อความ +pdfjs-cursor-hand-tool-button = + .title = เปิดใช้งานเครื่องมือมือ +pdfjs-cursor-hand-tool-button-label = เครื่องมือมือ +pdfjs-scroll-page-button = + .title = ใช้การเลื่อนหน้า +pdfjs-scroll-page-button-label = การเลื่อนหน้า +pdfjs-scroll-vertical-button = + .title = ใช้การเลื่อนแนวตั้ง +pdfjs-scroll-vertical-button-label = การเลื่อนแนวตั้ง +pdfjs-scroll-horizontal-button = + .title = ใช้การเลื่อนแนวนอน +pdfjs-scroll-horizontal-button-label = การเลื่อนแนวนอน +pdfjs-scroll-wrapped-button = + .title = ใช้การเลื่อนแบบคลุม +pdfjs-scroll-wrapped-button-label = เลื่อนแบบคลุม +pdfjs-spread-none-button = + .title = ไม่ต้องรวมการกระจายหน้า +pdfjs-spread-none-button-label = ไม่กระจาย +pdfjs-spread-odd-button = + .title = รวมการกระจายหน้าเริ่มจากหน้าคี่ +pdfjs-spread-odd-button-label = กระจายอย่างเหลือเศษ +pdfjs-spread-even-button = + .title = รวมการกระจายหน้าเริ่มจากหน้าคู่ +pdfjs-spread-even-button-label = กระจายอย่างเท่าเทียม + +## Document properties dialog + +pdfjs-document-properties-button = + .title = คุณสมบัติเอกสาร… +pdfjs-document-properties-button-label = คุณสมบัติเอกสาร… +pdfjs-document-properties-file-name = ชื่อไฟล์: +pdfjs-document-properties-file-size = ขนาดไฟล์: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } ไบต์) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ไบต์) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ไบต์) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ไบต์) +pdfjs-document-properties-title = ชื่อเรื่อง: +pdfjs-document-properties-author = ผู้สร้าง: +pdfjs-document-properties-subject = ชื่อเรื่อง: +pdfjs-document-properties-keywords = คำสำคัญ: +pdfjs-document-properties-creation-date = วันที่สร้าง: +pdfjs-document-properties-modification-date = วันที่แก้ไข: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = ผู้สร้าง: +pdfjs-document-properties-producer = ผู้ผลิต PDF: +pdfjs-document-properties-version = รุ่น PDF: +pdfjs-document-properties-page-count = จำนวนหน้า: +pdfjs-document-properties-page-size = ขนาดหน้า: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = แนวตั้ง +pdfjs-document-properties-page-size-orientation-landscape = แนวนอน +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = จดหมาย +pdfjs-document-properties-page-size-name-legal = ข้อกฎหมาย + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = มุมมองเว็บแบบรวดเร็ว: +pdfjs-document-properties-linearized-yes = ใช่ +pdfjs-document-properties-linearized-no = ไม่ +pdfjs-document-properties-close-button = ปิด + +## Print + +pdfjs-print-progress-message = กำลังเตรียมเอกสารสำหรับการพิมพ์… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = ยกเลิก +pdfjs-printing-not-supported = คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่ +pdfjs-printing-not-ready = คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = เปิด/ปิดแถบข้าง +pdfjs-toggle-sidebar-notification-button = + .title = เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ/เลเยอร์) +pdfjs-toggle-sidebar-button-label = เปิด/ปิดแถบข้าง +pdfjs-document-outline-button = + .title = แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด) +pdfjs-document-outline-button-label = เค้าร่างเอกสาร +pdfjs-attachments-button = + .title = แสดงไฟล์แนบ +pdfjs-attachments-button-label = ไฟล์แนบ +pdfjs-layers-button = + .title = แสดงเลเยอร์ (คลิกสองครั้งเพื่อรีเซ็ตเลเยอร์ทั้งหมดเป็นสถานะเริ่มต้น) +pdfjs-layers-button-label = เลเยอร์ +pdfjs-thumbs-button = + .title = แสดงภาพขนาดย่อ +pdfjs-thumbs-button-label = ภาพขนาดย่อ +pdfjs-current-outline-item-button = + .title = ค้นหารายการเค้าร่างปัจจุบัน +pdfjs-current-outline-item-button-label = รายการเค้าร่างปัจจุบัน +pdfjs-findbar-button = + .title = ค้นหาในเอกสาร +pdfjs-findbar-button-label = ค้นหา +pdfjs-additional-layers = เลเยอร์เพิ่มเติม + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = หน้า { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = ภาพขนาดย่อของหน้า { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ค้นหา + .placeholder = ค้นหาในเอกสาร… +pdfjs-find-previous-button = + .title = หาตำแหน่งก่อนหน้าของวลี +pdfjs-find-previous-button-label = ก่อนหน้า +pdfjs-find-next-button = + .title = หาตำแหน่งถัดไปของวลี +pdfjs-find-next-button-label = ถัดไป +pdfjs-find-highlight-checkbox = เน้นสีทั้งหมด +pdfjs-find-match-case-checkbox-label = ตัวพิมพ์ใหญ่เล็กตรงกัน +pdfjs-find-match-diacritics-checkbox-label = เครื่องหมายกำกับการออกเสียงตรงกัน +pdfjs-find-entire-word-checkbox-label = ทั้งคำ +pdfjs-find-reached-top = ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง +pdfjs-find-reached-bottom = ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = { $current } จาก { $total } รายการที่ตรงกัน +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = มากกว่า { $limit } รายการที่ตรงกัน +pdfjs-find-not-found = ไม่พบวลี + +## Predefined zoom values + +pdfjs-page-scale-width = ความกว้างหน้า +pdfjs-page-scale-fit = พอดีหน้า +pdfjs-page-scale-auto = ซูมอัตโนมัติ +pdfjs-page-scale-actual = ขนาดจริง +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = หน้า { $page } + +## Loading indicator messages + +pdfjs-loading-error = เกิดข้อผิดพลาดขณะโหลด PDF +pdfjs-invalid-file-error = ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย +pdfjs-missing-file-error = ไฟล์ PDF หายไป +pdfjs-unexpected-response-error = การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด +pdfjs-rendering-error = เกิดข้อผิดพลาดขณะเรนเดอร์หน้า + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [คำอธิบายประกอบ { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = ป้อนรหัสผ่านเพื่อเปิดไฟล์ PDF นี้ +pdfjs-password-invalid = รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง +pdfjs-password-ok-button = ตกลง +pdfjs-password-cancel-button = ยกเลิก +pdfjs-web-fonts-disabled = แบบอักษรเว็บถูกปิดใช้งาน: ไม่สามารถใช้แบบอักษร PDF ฝังตัว + +## Editing + +pdfjs-editor-free-text-button = + .title = ข้อความ +pdfjs-editor-free-text-button-label = ข้อความ +pdfjs-editor-ink-button = + .title = รูปวาด +pdfjs-editor-ink-button-label = รูปวาด +pdfjs-editor-stamp-button = + .title = เพิ่มหรือแก้ไขภาพ +pdfjs-editor-stamp-button-label = เพิ่มหรือแก้ไขภาพ +pdfjs-editor-highlight-button = + .title = เน้น +pdfjs-editor-highlight-button-label = เน้น +pdfjs-highlight-floating-button1 = + .title = เน้นสี + .aria-label = เน้นสี +pdfjs-highlight-floating-button-label = เน้นสี + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = เอาภาพวาดออก +pdfjs-editor-remove-freetext-button = + .title = เอาข้อความออก +pdfjs-editor-remove-stamp-button = + .title = เอาภาพออก +pdfjs-editor-remove-highlight-button = + .title = เอาการเน้นสีออก + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = สี +pdfjs-editor-free-text-size-input = ขนาด +pdfjs-editor-ink-color-input = สี +pdfjs-editor-ink-thickness-input = ความหนา +pdfjs-editor-ink-opacity-input = ความทึบ +pdfjs-editor-stamp-add-image-button = + .title = เพิ่มภาพ +pdfjs-editor-stamp-add-image-button-label = เพิ่มภาพ +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = ความหนา +pdfjs-editor-free-highlight-thickness-title = + .title = เปลี่ยนความหนาเมื่อเน้นรายการอื่นๆ ที่ไม่ใช่ข้อความ +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = ตัวแก้ไขข้อความ + .default-content = เริ่มพิมพ์ได้เลย… +pdfjs-free-text = + .aria-label = ตัวแก้ไขข้อความ +pdfjs-free-text-default-content = เริ่มพิมพ์… +pdfjs-ink = + .aria-label = ตัวแก้ไขรูปวาด +pdfjs-ink-canvas = + .aria-label = ภาพที่ผู้ใช้สร้างขึ้น + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = ข้อความทดแทน +pdfjs-editor-alt-text-edit-button = + .aria-label = แก้ไขข้อความทดแทน +pdfjs-editor-alt-text-edit-button-label = แก้ไขข้อความทดแทน +pdfjs-editor-alt-text-dialog-label = เลือกตัวเลือก +pdfjs-editor-alt-text-dialog-description = ข้อความทดแทนสามารถช่วยเหลือได้เมื่อผู้ใช้มองไม่เห็นภาพ หรือภาพไม่โหลด +pdfjs-editor-alt-text-add-description-label = เพิ่มคำอธิบาย +pdfjs-editor-alt-text-add-description-description = แนะนำให้ใช้ 1-2 ประโยคซึ่งอธิบายหัวเรื่อง ฉาก หรือการกระทำ +pdfjs-editor-alt-text-mark-decorative-label = ทำเครื่องหมายเป็นสิ่งตกแต่ง +pdfjs-editor-alt-text-mark-decorative-description = สิ่งนี้ใช้สำหรับภาพที่เป็นสิ่งประดับ เช่น ขอบ หรือลายน้ำ +pdfjs-editor-alt-text-cancel-button = ยกเลิก +pdfjs-editor-alt-text-save-button = บันทึก +pdfjs-editor-alt-text-decorative-tooltip = ทำเครื่องหมายเป็นสิ่งตกแต่งแล้ว +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = ตัวอย่างเช่น “ชายหนุ่มคนหนึ่งนั่งลงที่โต๊ะเพื่อรับประทานอาหารมื้อหนึ่ง” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = ข้อความทดแทน + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = มุมซ้ายบน — ปรับขนาด +pdfjs-editor-resizer-label-top-middle = ตรงกลางด้านบน — ปรับขนาด +pdfjs-editor-resizer-label-top-right = มุมขวาบน — ปรับขนาด +pdfjs-editor-resizer-label-middle-right = ตรงกลางด้านขวา — ปรับขนาด +pdfjs-editor-resizer-label-bottom-right = มุมขวาล่าง — ปรับขนาด +pdfjs-editor-resizer-label-bottom-middle = ตรงกลางด้านล่าง — ปรับขนาด +pdfjs-editor-resizer-label-bottom-left = มุมซ้ายล่าง — ปรับขนาด +pdfjs-editor-resizer-label-middle-left = ตรงกลางด้านซ้าย — ปรับขนาด +pdfjs-editor-resizer-top-left = + .aria-label = มุมซ้ายบน — ปรับขนาด +pdfjs-editor-resizer-top-middle = + .aria-label = ตรงกลางด้านบน — ปรับขนาด +pdfjs-editor-resizer-top-right = + .aria-label = มุมขวาบน — ปรับขนาด +pdfjs-editor-resizer-middle-right = + .aria-label = ตรงกลางด้านขวา — ปรับขนาด +pdfjs-editor-resizer-bottom-right = + .aria-label = มุมขวาล่าง — ปรับขนาด +pdfjs-editor-resizer-bottom-middle = + .aria-label = ตรงกลางด้านล่าง — ปรับขนาด +pdfjs-editor-resizer-bottom-left = + .aria-label = มุมซ้ายล่าง — ปรับขนาด +pdfjs-editor-resizer-middle-left = + .aria-label = ตรงกลางด้านซ้าย — ปรับขนาด + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = สีเน้น +pdfjs-editor-colorpicker-button = + .title = เปลี่ยนสี +pdfjs-editor-colorpicker-dropdown = + .aria-label = ทางเลือกสี +pdfjs-editor-colorpicker-yellow = + .title = เหลือง +pdfjs-editor-colorpicker-green = + .title = เขียว +pdfjs-editor-colorpicker-blue = + .title = น้ำเงิน +pdfjs-editor-colorpicker-pink = + .title = ชมพู +pdfjs-editor-colorpicker-red = + .title = แดง + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = แสดงทั้งหมด +pdfjs-editor-highlight-show-all-button = + .title = แสดงทั้งหมด + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = แก้ไขข้อความทดแทน (คำอธิบายภาพ) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = เพิ่มข้อความทดแทน (คำอธิบายภาพ) +pdfjs-editor-new-alt-text-textarea = + .placeholder = เขียนคำอธิบายของคุณที่นี่… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = คำอธิบายสั้นๆ สำหรับผู้ที่ไม่สามารถมองเห็นภาพหรือเมื่อภาพไม่โหลด +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ข้อความทดแทนนี้ถูกสร้างขึ้นโดยอัตโนมัติและอาจไม่ถูกต้อง +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = เรียนรู้เพิ่มเติม +pdfjs-editor-new-alt-text-create-automatically-button-label = สร้างข้อความทดแทนโดยอัตโนมัติ +pdfjs-editor-new-alt-text-not-now-button = ไม่ใช่ตอนนี้ +pdfjs-editor-new-alt-text-error-title = ไม่สามารถสร้างข้อความทดแทนโดยอัตโนมัติได้ +pdfjs-editor-new-alt-text-error-description = กรุณาเขียนข้อความทดแทนด้วยตัวเองหรือลองใหม่อีกครั้งในภายหลัง +pdfjs-editor-new-alt-text-error-close-button = ปิด +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = กำลังดาวน์โหลดโมเดล AI สำหรับข้อความทดแทน ({ $downloadedSize } จาก { $totalSize } MB) + .aria-valuetext = กำลังดาวน์โหลดโมเดล AI สำหรับข้อความทดแทน ({ $downloadedSize } จาก { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = เพิ่มข้อความทดแทนแล้ว +pdfjs-editor-new-alt-text-added-button-label = เพิ่มข้อความทดแทนแล้ว +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = ขาดข้อความทดแทน +pdfjs-editor-new-alt-text-missing-button-label = ขาดข้อความทดแทน +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = ตรวจสอบข้อความทดแทน +pdfjs-editor-new-alt-text-to-review-button-label = ตรวจสอบข้อความทดแทน +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = สร้างขึ้นโดยอัตโนมัติ: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = ตั้งค่าข้อความทดแทนภาพ +pdfjs-image-alt-text-settings-button-label = ตั้งค่าข้อความทดแทนภาพ +pdfjs-editor-alt-text-settings-dialog-label = ตั้งค่าข้อความทดแทนภาพ +pdfjs-editor-alt-text-settings-automatic-title = การทดแทนด้วยข้อความอัตโนมัติ +pdfjs-editor-alt-text-settings-create-model-button-label = สร้างข้อความทดแทนอัตโนมัติ +pdfjs-editor-alt-text-settings-create-model-description = แนะนำคำอธิบายเพื่อช่วยเหลือผู้ที่ไม่สามารถมองเห็นภาพหรือเมื่อภาพไม่โหลด +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = โมเดล AI สำหรับข้อความทดแทน ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = ทำงานในเครื่องของคุณเพื่อให้ข้อมูลของคุณเป็นส่วนตัว จำเป็นสำหรับข้อความทดแทนอัตโนมัติ +pdfjs-editor-alt-text-settings-delete-model-button = ลบ +pdfjs-editor-alt-text-settings-download-model-button = ดาวน์โหลด +pdfjs-editor-alt-text-settings-downloading-model-button = กำลังดาวน์โหลด… +pdfjs-editor-alt-text-settings-editor-title = ตัวแก้ไขข้อความทดแทน +pdfjs-editor-alt-text-settings-show-dialog-button-label = แสดงตัวแก้ไขข้อความทดแทนทันทีเมื่อเพิ่มภาพ +pdfjs-editor-alt-text-settings-show-dialog-description = ช่วยให้คุณแน่ใจว่าภาพทั้งหมดของคุณมีข้อความทดแทน +pdfjs-editor-alt-text-settings-close-button = ปิด + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = เอาการเน้นสีออกแล้ว +pdfjs-editor-undo-bar-message-freetext = เอาข้อความออกแล้ว +pdfjs-editor-undo-bar-message-ink = เอาภาพวาดออกแล้ว +pdfjs-editor-undo-bar-message-stamp = เอาภาพออกแล้ว +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = เอาคำอธิบายประกอบ { $count } รายการออกแล้ว +pdfjs-editor-undo-bar-undo-button = + .title = เลิกทำ +pdfjs-editor-undo-bar-undo-button-label = เลิกทำ +pdfjs-editor-undo-bar-close-button = + .title = ปิด +pdfjs-editor-undo-bar-close-button-label = ปิด diff --git a/public/pdfjs/web/locale/tl/viewer.ftl b/public/pdfjs/web/locale/tl/viewer.ftl new file mode 100644 index 0000000..faa0009 --- /dev/null +++ b/public/pdfjs/web/locale/tl/viewer.ftl @@ -0,0 +1,257 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Naunang Pahina +pdfjs-previous-button-label = Nakaraan +pdfjs-next-button = + .title = Sunod na Pahina +pdfjs-next-button-label = Sunod +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Pahina +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = ng { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } ng { $pagesCount }) +pdfjs-zoom-out-button = + .title = Paliitin +pdfjs-zoom-out-button-label = Paliitin +pdfjs-zoom-in-button = + .title = Palakihin +pdfjs-zoom-in-button-label = Palakihin +pdfjs-zoom-select = + .title = Mag-zoom +pdfjs-presentation-mode-button = + .title = Lumipat sa Presentation Mode +pdfjs-presentation-mode-button-label = Presentation Mode +pdfjs-open-file-button = + .title = Magbukas ng file +pdfjs-open-file-button-label = Buksan +pdfjs-print-button = + .title = i-Print +pdfjs-print-button-label = i-Print + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Mga Kagamitan +pdfjs-tools-button-label = Mga Kagamitan +pdfjs-first-page-button = + .title = Pumunta sa Unang Pahina +pdfjs-first-page-button-label = Pumunta sa Unang Pahina +pdfjs-last-page-button = + .title = Pumunta sa Huling Pahina +pdfjs-last-page-button-label = Pumunta sa Huling Pahina +pdfjs-page-rotate-cw-button = + .title = Paikutin Pakanan +pdfjs-page-rotate-cw-button-label = Paikutin Pakanan +pdfjs-page-rotate-ccw-button = + .title = Paikutin Pakaliwa +pdfjs-page-rotate-ccw-button-label = Paikutin Pakaliwa +pdfjs-cursor-text-select-tool-button = + .title = I-enable ang Text Selection Tool +pdfjs-cursor-text-select-tool-button-label = Text Selection Tool +pdfjs-cursor-hand-tool-button = + .title = I-enable ang Hand Tool +pdfjs-cursor-hand-tool-button-label = Hand Tool +pdfjs-scroll-vertical-button = + .title = Gumamit ng Vertical Scrolling +pdfjs-scroll-vertical-button-label = Vertical Scrolling +pdfjs-scroll-horizontal-button = + .title = Gumamit ng Horizontal Scrolling +pdfjs-scroll-horizontal-button-label = Horizontal Scrolling +pdfjs-scroll-wrapped-button = + .title = Gumamit ng Wrapped Scrolling +pdfjs-scroll-wrapped-button-label = Wrapped Scrolling +pdfjs-spread-none-button = + .title = Huwag pagsamahin ang mga page spread +pdfjs-spread-none-button-label = No Spreads +pdfjs-spread-odd-button = + .title = Join page spreads starting with odd-numbered pages +pdfjs-spread-odd-button-label = Mga Odd Spread +pdfjs-spread-even-button = + .title = Pagsamahin ang mga page spread na nagsisimula sa mga even-numbered na pahina +pdfjs-spread-even-button-label = Mga Even Spread + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Mga Katangian ng Dokumento… +pdfjs-document-properties-button-label = Mga Katangian ng Dokumento… +pdfjs-document-properties-file-name = File name: +pdfjs-document-properties-file-size = File size: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Pamagat: +pdfjs-document-properties-author = May-akda: +pdfjs-document-properties-subject = Paksa: +pdfjs-document-properties-keywords = Mga keyword: +pdfjs-document-properties-creation-date = Petsa ng Pagkakagawa: +pdfjs-document-properties-modification-date = Petsa ng Pagkakabago: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Tagalikha: +pdfjs-document-properties-producer = PDF Producer: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Bilang ng Pahina: +pdfjs-document-properties-page-size = Laki ng Pahina: +pdfjs-document-properties-page-size-unit-inches = pulgada +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = patayo +pdfjs-document-properties-page-size-orientation-landscape = pahiga +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Fast Web View: +pdfjs-document-properties-linearized-yes = Oo +pdfjs-document-properties-linearized-no = Hindi +pdfjs-document-properties-close-button = Isara + +## Print + +pdfjs-print-progress-message = Inihahanda ang dokumento para sa pag-print… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Kanselahin +pdfjs-printing-not-supported = Babala: Hindi pa ganap na suportado ang pag-print sa browser na ito. +pdfjs-printing-not-ready = Babala: Hindi ganap na nabuksan ang PDF para sa pag-print. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Ipakita/Itago ang Sidebar +pdfjs-toggle-sidebar-notification-button = + .title = Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga attachment/mga layer) +pdfjs-toggle-sidebar-button-label = Ipakita/Itago ang Sidebar +pdfjs-document-outline-button = + .title = Ipakita ang Document Outline (mag-double-click para i-expand/collapse ang laman) +pdfjs-document-outline-button-label = Balangkas ng Dokumento +pdfjs-attachments-button = + .title = Ipakita ang mga Attachment +pdfjs-attachments-button-label = Mga attachment +pdfjs-layers-button = + .title = Ipakita ang mga Layer (mag-double click para mareset ang lahat ng layer sa orihinal na estado) +pdfjs-layers-button-label = Mga layer +pdfjs-thumbs-button = + .title = Ipakita ang mga Thumbnail +pdfjs-thumbs-button-label = Mga thumbnail +pdfjs-findbar-button = + .title = Hanapin sa Dokumento +pdfjs-findbar-button-label = Hanapin +pdfjs-additional-layers = Mga Karagdagang Layer + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Pahina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Thumbnail ng Pahina { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Hanapin + .placeholder = Hanapin sa dokumento… +pdfjs-find-previous-button = + .title = Hanapin ang nakaraang pangyayari ng parirala +pdfjs-find-previous-button-label = Nakaraan +pdfjs-find-next-button = + .title = Hanapin ang susunod na pangyayari ng parirala +pdfjs-find-next-button-label = Susunod +pdfjs-find-highlight-checkbox = I-highlight lahat +pdfjs-find-match-case-checkbox-label = Itugma ang case +pdfjs-find-entire-word-checkbox-label = Buong salita +pdfjs-find-reached-top = Naabot na ang tuktok ng dokumento, ipinagpatuloy mula sa ilalim +pdfjs-find-reached-bottom = Naabot na ang dulo ng dokumento, ipinagpatuloy mula sa tuktok +pdfjs-find-not-found = Hindi natagpuan ang parirala + +## Predefined zoom values + +pdfjs-page-scale-width = Lapad ng Pahina +pdfjs-page-scale-fit = Pagkasyahin ang Pahina +pdfjs-page-scale-auto = Automatic Zoom +pdfjs-page-scale-actual = Totoong sukat +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Nagkaproblema habang niloload ang PDF. +pdfjs-invalid-file-error = Di-wasto o sira ang PDF file. +pdfjs-missing-file-error = Nawawalang PDF file. +pdfjs-unexpected-response-error = Hindi inaasahang tugon ng server. +pdfjs-rendering-error = Nagkaproblema habang nirerender ang pahina. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = Ipasok ang password upang buksan ang PDF file na ito. +pdfjs-password-invalid = Maling password. Subukan uli. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Kanselahin +pdfjs-web-fonts-disabled = Naka-disable ang mga Web font: hindi kayang gamitin ang mga naka-embed na PDF font. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/tr/viewer.ftl b/public/pdfjs/web/locale/tr/viewer.ftl new file mode 100644 index 0000000..b1b7cbf --- /dev/null +++ b/public/pdfjs/web/locale/tr/viewer.ftl @@ -0,0 +1,515 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Önceki sayfa +pdfjs-previous-button-label = Önceki +pdfjs-next-button = + .title = Sonraki sayfa +pdfjs-next-button-label = Sonraki +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Sayfa +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = Uzaklaştır +pdfjs-zoom-out-button-label = Uzaklaştır +pdfjs-zoom-in-button = + .title = Yakınlaştır +pdfjs-zoom-in-button-label = Yakınlaştır +pdfjs-zoom-select = + .title = Yakınlaştırma +pdfjs-presentation-mode-button = + .title = Sunum moduna geç +pdfjs-presentation-mode-button-label = Sunum modu +pdfjs-open-file-button = + .title = Dosya aç +pdfjs-open-file-button-label = Aç +pdfjs-print-button = + .title = Yazdır +pdfjs-print-button-label = Yazdır +pdfjs-save-button = + .title = Kaydet +pdfjs-save-button-label = Kaydet +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = İndir +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = İndir +pdfjs-bookmark-button = + .title = Geçerli sayfa (geçerli sayfanın adresini görüntüle) +pdfjs-bookmark-button-label = Geçerli sayfa + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Araçlar +pdfjs-tools-button-label = Araçlar +pdfjs-first-page-button = + .title = İlk sayfaya git +pdfjs-first-page-button-label = İlk sayfaya git +pdfjs-last-page-button = + .title = Son sayfaya git +pdfjs-last-page-button-label = Son sayfaya git +pdfjs-page-rotate-cw-button = + .title = Saat yönünde döndür +pdfjs-page-rotate-cw-button-label = Saat yönünde döndür +pdfjs-page-rotate-ccw-button = + .title = Saat yönünün tersine döndür +pdfjs-page-rotate-ccw-button-label = Saat yönünün tersine döndür +pdfjs-cursor-text-select-tool-button = + .title = Metin seçme aracını etkinleştir +pdfjs-cursor-text-select-tool-button-label = Metin seçme aracı +pdfjs-cursor-hand-tool-button = + .title = El aracını etkinleştir +pdfjs-cursor-hand-tool-button-label = El aracı +pdfjs-scroll-page-button = + .title = Sayfa kaydırmayı kullan +pdfjs-scroll-page-button-label = Sayfa kaydırma +pdfjs-scroll-vertical-button = + .title = Dikey kaydırmayı kullan +pdfjs-scroll-vertical-button-label = Dikey kaydırma +pdfjs-scroll-horizontal-button = + .title = Yatay kaydırmayı kullan +pdfjs-scroll-horizontal-button-label = Yatay kaydırma +pdfjs-scroll-wrapped-button = + .title = Yan yana kaydırmayı kullan +pdfjs-scroll-wrapped-button-label = Yan yana kaydırma +pdfjs-spread-none-button = + .title = Yan yana sayfaları birleştirme +pdfjs-spread-none-button-label = Birleştirme +pdfjs-spread-odd-button = + .title = Yan yana sayfaları tek numaralı sayfalardan başlayarak birleştir +pdfjs-spread-odd-button-label = Tek numaralı +pdfjs-spread-even-button = + .title = Yan yana sayfaları çift numaralı sayfalardan başlayarak birleştir +pdfjs-spread-even-button-label = Çift numaralı + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Belge özellikleri… +pdfjs-document-properties-button-label = Belge özellikleri… +pdfjs-document-properties-file-name = Dosya adı: +pdfjs-document-properties-file-size = Dosya boyutu: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bayt) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bayt) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bayt) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bayt) +pdfjs-document-properties-title = Başlık: +pdfjs-document-properties-author = Yazar: +pdfjs-document-properties-subject = Konu: +pdfjs-document-properties-keywords = Anahtar kelimeler: +pdfjs-document-properties-creation-date = Oluşturma tarihi: +pdfjs-document-properties-modification-date = Değiştirme tarihi: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date } { $time } +pdfjs-document-properties-creator = Oluşturan: +pdfjs-document-properties-producer = PDF üreticisi: +pdfjs-document-properties-version = PDF sürümü: +pdfjs-document-properties-page-count = Sayfa sayısı: +pdfjs-document-properties-page-size = Sayfa boyutu: +pdfjs-document-properties-page-size-unit-inches = inç +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = dikey +pdfjs-document-properties-page-size-orientation-landscape = yatay +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Hızlı web görünümü: +pdfjs-document-properties-linearized-yes = Evet +pdfjs-document-properties-linearized-no = Hayır +pdfjs-document-properties-close-button = Kapat + +## Print + +pdfjs-print-progress-message = Belge yazdırılmaya hazırlanıyor… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = %{ $progress } +pdfjs-print-progress-close-button = İptal +pdfjs-printing-not-supported = Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir. +pdfjs-printing-not-ready = Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Kenar çubuğunu aç/kapat +pdfjs-toggle-sidebar-notification-button = + .title = Kenar çubuğunu aç/kapat (Belge ana hat/ekler/katmanlar içeriyor) +pdfjs-toggle-sidebar-button-label = Kenar çubuğunu aç/kapat +pdfjs-document-outline-button = + .title = Belge ana hatlarını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın) +pdfjs-document-outline-button-label = Belge ana hatları +pdfjs-attachments-button = + .title = Ekleri göster +pdfjs-attachments-button-label = Ekler +pdfjs-layers-button = + .title = Katmanları göster (tüm katmanları varsayılan duruma sıfırlamak için çift tıklayın) +pdfjs-layers-button-label = Katmanlar +pdfjs-thumbs-button = + .title = Küçük resimleri göster +pdfjs-thumbs-button-label = Küçük resimler +pdfjs-current-outline-item-button = + .title = Mevcut ana hat öğesini bul +pdfjs-current-outline-item-button-label = Mevcut ana hat öğesi +pdfjs-findbar-button = + .title = Belgede bul +pdfjs-findbar-button-label = Bul +pdfjs-additional-layers = Ek katmanlar + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Sayfa { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page }. sayfanın küçük hâli + +## Find panel button title and messages + +pdfjs-find-input = + .title = Bul + .placeholder = Belgede bul… +pdfjs-find-previous-button = + .title = Önceki eşleşmeyi bul +pdfjs-find-previous-button-label = Önceki +pdfjs-find-next-button = + .title = Sonraki eşleşmeyi bul +pdfjs-find-next-button-label = Sonraki +pdfjs-find-highlight-checkbox = Tümünü vurgula +pdfjs-find-match-case-checkbox-label = Büyük-küçük harfe duyarlı +pdfjs-find-match-diacritics-checkbox-label = Fonetik işaretleri bul +pdfjs-find-entire-word-checkbox-label = Tam sözcükler +pdfjs-find-reached-top = Belgenin başına ulaşıldı, sonundan devam edildi +pdfjs-find-reached-bottom = Belgenin sonuna ulaşıldı, başından devam edildi +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $total } eşleşmeden { $current }. eşleşme + *[other] { $total } eşleşmeden { $current }. eşleşme + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] { $limit } eşleşmeden fazla + *[other] { $limit } eşleşmeden fazla + } +pdfjs-find-not-found = Eşleşme bulunamadı + +## Predefined zoom values + +pdfjs-page-scale-width = Sayfa genişliği +pdfjs-page-scale-fit = Sayfayı sığdır +pdfjs-page-scale-auto = Otomatik yakınlaştır +pdfjs-page-scale-actual = Gerçek boyut +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = %{ $scale } + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Sayfa { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDF yüklenirken bir hata oluştu. +pdfjs-invalid-file-error = Geçersiz veya bozulmuş PDF dosyası. +pdfjs-missing-file-error = PDF dosyası eksik. +pdfjs-unexpected-response-error = Beklenmeyen sunucu yanıtı. +pdfjs-rendering-error = Sayfa yorumlanırken bir hata oluştu. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } işareti] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Bu PDF dosyasını açmak için parolasını yazın. +pdfjs-password-invalid = Geçersiz parola. Lütfen yeniden deneyin. +pdfjs-password-ok-button = Tamam +pdfjs-password-cancel-button = İptal +pdfjs-web-fonts-disabled = Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor. + +## Editing + +pdfjs-editor-free-text-button = + .title = Metin +pdfjs-editor-free-text-button-label = Metin +pdfjs-editor-ink-button = + .title = Çiz +pdfjs-editor-ink-button-label = Çiz +pdfjs-editor-stamp-button = + .title = Resim ekle veya düzenle +pdfjs-editor-stamp-button-label = Resim ekle veya düzenle +pdfjs-editor-highlight-button = + .title = Vurgula +pdfjs-editor-highlight-button-label = Vurgula +pdfjs-highlight-floating-button1 = + .title = Vurgula + .aria-label = Vurgula +pdfjs-highlight-floating-button-label = Vurgula + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Çizimi kaldır +pdfjs-editor-remove-freetext-button = + .title = Metni kaldır +pdfjs-editor-remove-stamp-button = + .title = Resmi kaldır +pdfjs-editor-remove-highlight-button = + .title = Vurgulamayı kaldır + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Renk +pdfjs-editor-free-text-size-input = Boyut +pdfjs-editor-ink-color-input = Renk +pdfjs-editor-ink-thickness-input = Kalınlık +pdfjs-editor-ink-opacity-input = Saydamlık +pdfjs-editor-stamp-add-image-button = + .title = Resim ekle +pdfjs-editor-stamp-add-image-button-label = Resim ekle +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Kalınlık +pdfjs-editor-free-highlight-thickness-title = + .title = Metin dışındaki öğeleri vurgularken kalınlığı değiştir +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Metin düzenleyicisi + .default-content = Yazmaya başlayın… +pdfjs-free-text = + .aria-label = Metin düzenleyicisi +pdfjs-free-text-default-content = Yazmaya başlayın… +pdfjs-ink = + .aria-label = Çizim düzenleyicisi +pdfjs-ink-canvas = + .aria-label = Kullanıcı tarafından oluşturulan resim + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Alternatif metin +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatif metni düzenle +pdfjs-editor-alt-text-edit-button-label = Alternatif metni düzenle +pdfjs-editor-alt-text-dialog-label = Bir seçenek seçin +pdfjs-editor-alt-text-dialog-description = Alternatif metin, insanlar resmi göremediğinde veya resim yüklenmediğinde işe yarar. +pdfjs-editor-alt-text-add-description-label = Açıklama ekle +pdfjs-editor-alt-text-add-description-description = Konuyu, ortamı veya eylemleri tanımlayan bir iki cümle yazmaya çalışın. +pdfjs-editor-alt-text-mark-decorative-label = Dekoratif olarak işaretle +pdfjs-editor-alt-text-mark-decorative-description = Kenarlıklar veya filigranlar gibi dekoratif resimler için kullanılır. +pdfjs-editor-alt-text-cancel-button = Vazgeç +pdfjs-editor-alt-text-save-button = Kaydet +pdfjs-editor-alt-text-decorative-tooltip = Dekoratif olarak işaretlendi +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Örneğin, “Genç bir adam yemek yemek için masaya oturuyor” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatif metin + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Sol üst köşe — yeniden boyutlandır +pdfjs-editor-resizer-label-top-middle = Üst orta — yeniden boyutlandır +pdfjs-editor-resizer-label-top-right = Sağ üst köşe — yeniden boyutlandır +pdfjs-editor-resizer-label-middle-right = Orta sağ — yeniden boyutlandır +pdfjs-editor-resizer-label-bottom-right = Sağ alt köşe — yeniden boyutlandır +pdfjs-editor-resizer-label-bottom-middle = Alt orta — yeniden boyutlandır +pdfjs-editor-resizer-label-bottom-left = Sol alt köşe — yeniden boyutlandır +pdfjs-editor-resizer-label-middle-left = Orta sol — yeniden boyutlandır +pdfjs-editor-resizer-top-left = + .aria-label = Sol üst köşe — yeniden boyutlandır +pdfjs-editor-resizer-top-middle = + .aria-label = Üst orta — yeniden boyutlandır +pdfjs-editor-resizer-top-right = + .aria-label = Sağ üst köşe — yeniden boyutlandır +pdfjs-editor-resizer-middle-right = + .aria-label = Orta sağ — yeniden boyutlandır +pdfjs-editor-resizer-bottom-right = + .aria-label = Sağ alt köşe — yeniden boyutlandır +pdfjs-editor-resizer-bottom-middle = + .aria-label = Alt orta — yeniden boyutlandır +pdfjs-editor-resizer-bottom-left = + .aria-label = Sol alt köşe — yeniden boyutlandır +pdfjs-editor-resizer-middle-left = + .aria-label = Orta sol — yeniden boyutlandır + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Vurgu rengi +pdfjs-editor-colorpicker-button = + .title = Rengi değiştir +pdfjs-editor-colorpicker-dropdown = + .aria-label = Renk seçenekleri +pdfjs-editor-colorpicker-yellow = + .title = Sarı +pdfjs-editor-colorpicker-green = + .title = Yeşil +pdfjs-editor-colorpicker-blue = + .title = Mavi +pdfjs-editor-colorpicker-pink = + .title = Pembe +pdfjs-editor-colorpicker-red = + .title = Kırmızı + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Tümünü göster +pdfjs-editor-highlight-show-all-button = + .title = Tümünü göster + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alt metni düzenle (resim açıklaması) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alt metin ekle (resim açıklaması) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Açıklamanızı buraya yazın… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Görme engelli kişilere gösterilecek veya resmin yüklenemediği durumlarda gösterilecek kısa açıklama. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Bu alt metin otomatik olarak oluşturulmuştur ve hatalı olabilir. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Daha fazla bilgi alın +pdfjs-editor-new-alt-text-create-automatically-button-label = Otomatik olarak alt metin oluştur +pdfjs-editor-new-alt-text-not-now-button = Şimdi değil +pdfjs-editor-new-alt-text-error-title = Alt metin otomatik olarak oluşturulamadı +pdfjs-editor-new-alt-text-error-description = Lütfen kendi alt metninizi yazın veya daha sonra yeniden deneyin. +pdfjs-editor-new-alt-text-error-close-button = Kapat +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alt metin yapay zekâ modeli indiriliyor ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = Alt metin yapay zekâ modeli indiriliyor ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatif metin eklendi +pdfjs-editor-new-alt-text-added-button-label = Alt metin eklendi +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatif metin eksik +pdfjs-editor-new-alt-text-missing-button-label = Alt metin eksik +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatif metni incele +pdfjs-editor-new-alt-text-to-review-button-label = Alt metni incele +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Otomatik olarak oluşturuldu: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Resim alt metni ayarları +pdfjs-image-alt-text-settings-button-label = Resim alt metni ayarları +pdfjs-editor-alt-text-settings-dialog-label = Resim alt metni ayarları +pdfjs-editor-alt-text-settings-automatic-title = Otomatik alt metin +pdfjs-editor-alt-text-settings-create-model-button-label = Otomatik olarak alt metin oluştur +pdfjs-editor-alt-text-settings-create-model-description = Görme engelli kişilere gösterilecek veya resmin yüklenemediği durumlarda gösterilecek açıklamalar önerir. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt metin yapay zekâ modeli ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Verilerinizin gizli kalması için cihazınızda yerel olarak çalışır. Otomatik alt metin için gereklidir. +pdfjs-editor-alt-text-settings-delete-model-button = Sil +pdfjs-editor-alt-text-settings-download-model-button = İndir +pdfjs-editor-alt-text-settings-downloading-model-button = İndiriliyor… +pdfjs-editor-alt-text-settings-editor-title = Alt metin düzenleyicisi +pdfjs-editor-alt-text-settings-show-dialog-button-label = Resim eklerken alt metin düzenleyicisini hemen göster +pdfjs-editor-alt-text-settings-show-dialog-description = Tüm resimlerinizin alt metne sahip olduğundan emin olmanızı sağlar. +pdfjs-editor-alt-text-settings-close-button = Kapat + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Vurgulama silindi +pdfjs-editor-undo-bar-message-freetext = Metin silindi +pdfjs-editor-undo-bar-message-ink = Çizim silindi +pdfjs-editor-undo-bar-message-stamp = Görsel silindi +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } ek açıklama silindi + *[other] { $count } ek açıklama silindi + } +pdfjs-editor-undo-bar-undo-button = + .title = Geri al +pdfjs-editor-undo-bar-undo-button-label = Geri al +pdfjs-editor-undo-bar-close-button = + .title = Kapat +pdfjs-editor-undo-bar-close-button-label = Kapat diff --git a/public/pdfjs/web/locale/trs/viewer.ftl b/public/pdfjs/web/locale/trs/viewer.ftl new file mode 100644 index 0000000..aba3c72 --- /dev/null +++ b/public/pdfjs/web/locale/trs/viewer.ftl @@ -0,0 +1,197 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Pajinâ gunâj rukùu +pdfjs-previous-button-label = Sa gachin +pdfjs-next-button = + .title = Pajinâ 'na' ñaan +pdfjs-next-button-label = Ne' ñaan +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Ñanj +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = si'iaj { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount }) +pdfjs-zoom-out-button = + .title = Nagi'iaj li' +pdfjs-zoom-out-button-label = Nagi'iaj li' +pdfjs-zoom-in-button = + .title = Nagi'iaj niko' +pdfjs-zoom-in-button-label = Nagi'iaj niko' +pdfjs-zoom-select = + .title = dàj nìko ma'an +pdfjs-presentation-mode-button = + .title = Naduno' daj ga ma +pdfjs-presentation-mode-button-label = Daj gà ma +pdfjs-open-file-button = + .title = Na'nïn' chrû ñanj +pdfjs-open-file-button-label = Na'nïn +pdfjs-print-button = + .title = Nari' ña du'ua +pdfjs-print-button-label = Nari' ñadu'ua + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Rasun +pdfjs-tools-button-label = Nej rasùun +pdfjs-first-page-button = + .title = gun' riña pajina asiniin +pdfjs-first-page-button-label = Gun' riña pajina asiniin +pdfjs-last-page-button = + .title = Gun' riña pajina rukù ni'in +pdfjs-last-page-button-label = Gun' riña pajina rukù ni'inj +pdfjs-page-rotate-cw-button = + .title = Tanikaj ne' huat +pdfjs-page-rotate-cw-button-label = Tanikaj ne' huat +pdfjs-page-rotate-ccw-button = + .title = Tanikaj ne' chînt' +pdfjs-page-rotate-ccw-button-label = Tanikaj ne' chint +pdfjs-cursor-text-select-tool-button = + .title = Dugi'iaj sun' sa ganahui texto +pdfjs-cursor-text-select-tool-button-label = Nej rasun arajsun' da' nahui' texto +pdfjs-cursor-hand-tool-button = + .title = Nachrun' nej rasun +pdfjs-cursor-hand-tool-button-label = Sa rajsun ro'o' +pdfjs-scroll-vertical-button = + .title = Garasun' dukuán runūu +pdfjs-scroll-vertical-button-label = Dukuán runūu +pdfjs-scroll-horizontal-button = + .title = Garasun' dukuán nikin' nahui +pdfjs-scroll-horizontal-button-label = Dukuán nikin' nahui +pdfjs-scroll-wrapped-button = + .title = Garasun' sa nachree +pdfjs-scroll-wrapped-button-label = Sa nachree +pdfjs-spread-none-button = + .title = Si nagi'iaj nugun'un' nej pagina hua ninin +pdfjs-spread-none-button-label = Ni'io daj hua pagina +pdfjs-spread-odd-button = + .title = Nagi'iaj nugua'ant nej pajina +pdfjs-spread-odd-button-label = Ni'io' daj hua libro gurin +pdfjs-spread-even-button = + .title = Nakāj dugui' ngà nej pajinâ ayi'ì ngà da' hùi hùi +pdfjs-spread-even-button-label = Nahuin nìko nej + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Nej sa nikāj ñanj… +pdfjs-document-properties-button-label = Nej sa nikāj ñanj… +pdfjs-document-properties-file-name = Si yugui archîbo: +pdfjs-document-properties-file-size = Dàj yachìj archîbo: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Si yugui: +pdfjs-document-properties-author = Sí girirà: +pdfjs-document-properties-subject = Dugui': +pdfjs-document-properties-keywords = Nej nuguan' huìi: +pdfjs-document-properties-creation-date = Gui gurugui' man: +pdfjs-document-properties-modification-date = Nuguan' nahuin nakà: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Guiri ro' +pdfjs-document-properties-producer = Sa ri PDF: +pdfjs-document-properties-version = PDF Version: +pdfjs-document-properties-page-count = Si Guendâ Pâjina: +pdfjs-document-properties-page-size = Dàj yachìj pâjina: +pdfjs-document-properties-page-size-unit-inches = riña +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = nadu'ua +pdfjs-document-properties-page-size-orientation-landscape = dàj huaj +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Da'ngà'a +pdfjs-document-properties-page-size-name-legal = Nuguan' a'nï'ïn + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Nanèt chre ni'iajt riña Web: +pdfjs-document-properties-linearized-yes = Ga'ue +pdfjs-document-properties-linearized-no = Si ga'ue +pdfjs-document-properties-close-button = Narán + +## Print + +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Duyichin' + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Nadunā barrâ nù yi'nïn +pdfjs-toggle-sidebar-button-label = Nadunā barrâ nù yi'nïn +pdfjs-findbar-button-label = Narì' + +## Thumbnails panel item (tooltip and alt text for images) + + +## Find panel button title and messages + +pdfjs-find-previous-button-label = Sa gachîn +pdfjs-find-next-button-label = Ne' ñaan +pdfjs-find-highlight-checkbox = Daran' sa ña'an +pdfjs-find-match-case-checkbox-label = Match case +pdfjs-find-not-found = Nu narì'ij nugua'anj + +## Predefined zoom values + +pdfjs-page-scale-actual = Dàj yàchi akuan' nín +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + + +## Annotations + + +## Password + +pdfjs-password-ok-button = Ga'ue +pdfjs-password-cancel-button = Duyichin' + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/uk/viewer.ftl b/public/pdfjs/web/locale/uk/viewer.ftl new file mode 100644 index 0000000..dd54727 --- /dev/null +++ b/public/pdfjs/web/locale/uk/viewer.ftl @@ -0,0 +1,518 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Попередня сторінка +pdfjs-previous-button-label = Попередня +pdfjs-next-button = + .title = Наступна сторінка +pdfjs-next-button-label = Наступна +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Сторінка +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = із { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } із { $pagesCount }) +pdfjs-zoom-out-button = + .title = Зменшити +pdfjs-zoom-out-button-label = Зменшити +pdfjs-zoom-in-button = + .title = Збільшити +pdfjs-zoom-in-button-label = Збільшити +pdfjs-zoom-select = + .title = Масштаб +pdfjs-presentation-mode-button = + .title = Перейти в режим презентації +pdfjs-presentation-mode-button-label = Режим презентації +pdfjs-open-file-button = + .title = Відкрити файл +pdfjs-open-file-button-label = Відкрити +pdfjs-print-button = + .title = Друк +pdfjs-print-button-label = Друк +pdfjs-save-button = + .title = Зберегти +pdfjs-save-button-label = Зберегти +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Завантажити +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Завантажити +pdfjs-bookmark-button = + .title = Поточна сторінка (перегляд URL-адреси з поточної сторінки) +pdfjs-bookmark-button-label = Поточна сторінка + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Інструменти +pdfjs-tools-button-label = Інструменти +pdfjs-first-page-button = + .title = На першу сторінку +pdfjs-first-page-button-label = На першу сторінку +pdfjs-last-page-button = + .title = На останню сторінку +pdfjs-last-page-button-label = На останню сторінку +pdfjs-page-rotate-cw-button = + .title = Повернути за годинниковою стрілкою +pdfjs-page-rotate-cw-button-label = Повернути за годинниковою стрілкою +pdfjs-page-rotate-ccw-button = + .title = Повернути проти годинникової стрілки +pdfjs-page-rotate-ccw-button-label = Повернути проти годинникової стрілки +pdfjs-cursor-text-select-tool-button = + .title = Увімкнути інструмент вибору тексту +pdfjs-cursor-text-select-tool-button-label = Інструмент вибору тексту +pdfjs-cursor-hand-tool-button = + .title = Увімкнути інструмент "Рука" +pdfjs-cursor-hand-tool-button-label = Інструмент "Рука" +pdfjs-scroll-page-button = + .title = Використовувати прокручування сторінки +pdfjs-scroll-page-button-label = Прокручування сторінки +pdfjs-scroll-vertical-button = + .title = Використовувати вертикальне прокручування +pdfjs-scroll-vertical-button-label = Вертикальне прокручування +pdfjs-scroll-horizontal-button = + .title = Використовувати горизонтальне прокручування +pdfjs-scroll-horizontal-button-label = Горизонтальне прокручування +pdfjs-scroll-wrapped-button = + .title = Використовувати масштабоване прокручування +pdfjs-scroll-wrapped-button-label = Масштабоване прокручування +pdfjs-spread-none-button = + .title = Не використовувати розгорнуті сторінки +pdfjs-spread-none-button-label = Без розгорнутих сторінок +pdfjs-spread-odd-button = + .title = Розгорнуті сторінки починаються з непарних номерів +pdfjs-spread-odd-button-label = Непарні сторінки зліва +pdfjs-spread-even-button = + .title = Розгорнуті сторінки починаються з парних номерів +pdfjs-spread-even-button-label = Парні сторінки зліва + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Властивості документа… +pdfjs-document-properties-button-label = Властивості документа… +pdfjs-document-properties-file-name = Назва файлу: +pdfjs-document-properties-file-size = Розмір файлу: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } кБ ({ $b } байтів) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байтів) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } кБ ({ $size_b } байтів) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байтів) +pdfjs-document-properties-title = Заголовок: +pdfjs-document-properties-author = Автор: +pdfjs-document-properties-subject = Тема: +pdfjs-document-properties-keywords = Ключові слова: +pdfjs-document-properties-creation-date = Дата створення: +pdfjs-document-properties-modification-date = Дата зміни: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Створено: +pdfjs-document-properties-producer = Виробник PDF: +pdfjs-document-properties-version = Версія PDF: +pdfjs-document-properties-page-count = Кількість сторінок: +pdfjs-document-properties-page-size = Розмір сторінки: +pdfjs-document-properties-page-size-unit-inches = дюймів +pdfjs-document-properties-page-size-unit-millimeters = мм +pdfjs-document-properties-page-size-orientation-portrait = книжкова +pdfjs-document-properties-page-size-orientation-landscape = альбомна +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Швидкий перегляд в Інтернеті: +pdfjs-document-properties-linearized-yes = Так +pdfjs-document-properties-linearized-no = Ні +pdfjs-document-properties-close-button = Закрити + +## Print + +pdfjs-print-progress-message = Підготовка документу до друку… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Скасувати +pdfjs-printing-not-supported = Попередження: Цей браузер не повністю підтримує друк. +pdfjs-printing-not-ready = Попередження: PDF не повністю завантажений для друку. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Бічна панель +pdfjs-toggle-sidebar-notification-button = + .title = Перемкнути бічну панель (документ містить ескіз/вкладення/шари) +pdfjs-toggle-sidebar-button-label = Перемкнути бічну панель +pdfjs-document-outline-button = + .title = Показати схему документу (подвійний клік для розгортання/згортання елементів) +pdfjs-document-outline-button-label = Схема документа +pdfjs-attachments-button = + .title = Показати вкладення +pdfjs-attachments-button-label = Вкладення +pdfjs-layers-button = + .title = Показати шари (двічі клацніть, щоб скинути всі шари до типового стану) +pdfjs-layers-button-label = Шари +pdfjs-thumbs-button = + .title = Показати мініатюри +pdfjs-thumbs-button-label = Мініатюри +pdfjs-current-outline-item-button = + .title = Знайти поточний елемент змісту +pdfjs-current-outline-item-button-label = Поточний елемент змісту +pdfjs-findbar-button = + .title = Знайти в документі +pdfjs-findbar-button-label = Знайти +pdfjs-additional-layers = Додаткові шари + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Сторінка { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Ескіз сторінки { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Знайти + .placeholder = Знайти в документі… +pdfjs-find-previous-button = + .title = Знайти попереднє входження фрази +pdfjs-find-previous-button-label = Попереднє +pdfjs-find-next-button = + .title = Знайти наступне входження фрази +pdfjs-find-next-button-label = Наступне +pdfjs-find-highlight-checkbox = Підсвітити все +pdfjs-find-match-case-checkbox-label = З урахуванням регістру +pdfjs-find-match-diacritics-checkbox-label = Відповідність діакритичних знаків +pdfjs-find-entire-word-checkbox-label = Цілі слова +pdfjs-find-reached-top = Досягнуто початку документу, продовжено з кінця +pdfjs-find-reached-bottom = Досягнуто кінця документу, продовжено з початку +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } збіг з { $total } + [few] { $current } збіги з { $total } + *[many] { $current } збігів з { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Понад { $limit } збіг + [few] Понад { $limit } збіги + *[many] Понад { $limit } збігів + } +pdfjs-find-not-found = Фразу не знайдено + +## Predefined zoom values + +pdfjs-page-scale-width = За шириною +pdfjs-page-scale-fit = Вмістити +pdfjs-page-scale-auto = Автомасштаб +pdfjs-page-scale-actual = Дійсний розмір +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Сторінка { $page } + +## Loading indicator messages + +pdfjs-loading-error = Під час завантаження PDF сталася помилка. +pdfjs-invalid-file-error = Недійсний або пошкоджений PDF-файл. +pdfjs-missing-file-error = Відсутній PDF-файл. +pdfjs-unexpected-response-error = Неочікувана відповідь сервера. +pdfjs-rendering-error = Під час виведення сторінки сталася помилка. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type }-анотація] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Введіть пароль для відкриття цього PDF-файлу. +pdfjs-password-invalid = Неправильний пароль. Спробуйте ще раз. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Скасувати +pdfjs-web-fonts-disabled = Вебшрифти вимкнено: неможливо використати вбудовані у PDF шрифти. + +## Editing + +pdfjs-editor-free-text-button = + .title = Текст +pdfjs-editor-free-text-button-label = Текст +pdfjs-editor-ink-button = + .title = Малювати +pdfjs-editor-ink-button-label = Малювати +pdfjs-editor-stamp-button = + .title = Додати чи редагувати зображення +pdfjs-editor-stamp-button-label = Додати чи редагувати зображення +pdfjs-editor-highlight-button = + .title = Підсвітити +pdfjs-editor-highlight-button-label = Підсвітити +pdfjs-highlight-floating-button1 = + .title = Підсвітити + .aria-label = Підсвітити +pdfjs-highlight-floating-button-label = Підсвітити + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Вилучити малюнок +pdfjs-editor-remove-freetext-button = + .title = Вилучити текст +pdfjs-editor-remove-stamp-button = + .title = Вилучити зображення +pdfjs-editor-remove-highlight-button = + .title = Вилучити підсвічування + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Колір +pdfjs-editor-free-text-size-input = Розмір +pdfjs-editor-ink-color-input = Колір +pdfjs-editor-ink-thickness-input = Товщина +pdfjs-editor-ink-opacity-input = Прозорість +pdfjs-editor-stamp-add-image-button = + .title = Додати зображення +pdfjs-editor-stamp-add-image-button-label = Додати зображення +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Товщина +pdfjs-editor-free-highlight-thickness-title = + .title = Змінюйте товщину під час підсвічування елементів, крім тексту +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Текстовий редактор + .default-content = Напишіть щось… +pdfjs-free-text = + .aria-label = Текстовий редактор +pdfjs-free-text-default-content = Почніть вводити… +pdfjs-ink = + .aria-label = Графічний редактор +pdfjs-ink-canvas = + .aria-label = Зображення, створене користувачем + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Альтернативний текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Редагувати альтернативний текст +pdfjs-editor-alt-text-edit-button-label = Змінити альтернативний текст +pdfjs-editor-alt-text-dialog-label = Вибрати варіант +pdfjs-editor-alt-text-dialog-description = Альтернативний текст допомагає, коли зображення не видно або коли воно не завантажується. +pdfjs-editor-alt-text-add-description-label = Додати опис +pdfjs-editor-alt-text-add-description-description = Намагайтеся створити 1-2 речення, які описують тему, обставини або дії. +pdfjs-editor-alt-text-mark-decorative-label = Позначити декоративним +pdfjs-editor-alt-text-mark-decorative-description = Використовується для декоративних зображень, наприклад рамок або водяних знаків. +pdfjs-editor-alt-text-cancel-button = Скасувати +pdfjs-editor-alt-text-save-button = Зберегти +pdfjs-editor-alt-text-decorative-tooltip = Позначено декоративним +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Наприклад, “Молодий чоловік сідає за стіл їсти” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Альтернативний текст + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Верхній лівий кут – зміна розміру +pdfjs-editor-resizer-label-top-middle = Вгорі посередині – зміна розміру +pdfjs-editor-resizer-label-top-right = Верхній правий кут – зміна розміру +pdfjs-editor-resizer-label-middle-right = Праворуч посередині – зміна розміру +pdfjs-editor-resizer-label-bottom-right = Нижній правий кут – зміна розміру +pdfjs-editor-resizer-label-bottom-middle = Внизу посередині – зміна розміру +pdfjs-editor-resizer-label-bottom-left = Нижній лівий кут – зміна розміру +pdfjs-editor-resizer-label-middle-left = Ліворуч посередині – зміна розміру +pdfjs-editor-resizer-top-left = + .aria-label = Верхній лівий кут – зміна розміру +pdfjs-editor-resizer-top-middle = + .aria-label = Вгорі посередині – зміна розміру +pdfjs-editor-resizer-top-right = + .aria-label = Верхній правий кут – зміна розміру +pdfjs-editor-resizer-middle-right = + .aria-label = Праворуч посередині – зміна розміру +pdfjs-editor-resizer-bottom-right = + .aria-label = Нижній правий кут – зміна розміру +pdfjs-editor-resizer-bottom-middle = + .aria-label = Внизу посередині – зміна розміру +pdfjs-editor-resizer-bottom-left = + .aria-label = Нижній лівий кут – зміна розміру +pdfjs-editor-resizer-middle-left = + .aria-label = Ліворуч посередині – зміна розміру + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Колір підсвічування +pdfjs-editor-colorpicker-button = + .title = Змінити колір +pdfjs-editor-colorpicker-dropdown = + .aria-label = Вибір кольору +pdfjs-editor-colorpicker-yellow = + .title = Жовтий +pdfjs-editor-colorpicker-green = + .title = Зелений +pdfjs-editor-colorpicker-blue = + .title = Блакитний +pdfjs-editor-colorpicker-pink = + .title = Рожевий +pdfjs-editor-colorpicker-red = + .title = Червоний + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Показати все +pdfjs-editor-highlight-show-all-button = + .title = Показати все + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Редагувати альтернативний текст (опис зображення) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Додати альтернативний текст (опис зображення) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напишіть свій опис тут… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Короткий опис для людей, які не бачать зображення, або якщо зображення не завантажується. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Цей альтернативний текст створено автоматично, тому він може бути неточним. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Докладніше +pdfjs-editor-new-alt-text-create-automatically-button-label = Автоматично створювати альтернативний текст +pdfjs-editor-new-alt-text-not-now-button = Не зараз +pdfjs-editor-new-alt-text-error-title = Не вдалося автоматично створити альтернативний текст +pdfjs-editor-new-alt-text-error-description = Напишіть власний альтернативний текст або повторіть спробу пізніше. +pdfjs-editor-new-alt-text-error-close-button = Закрити +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Завантаження моделі ШІ для альтернативного тексту ({ $downloadedSize } з { $totalSize } МБ) + .aria-valuetext = Завантаження моделі ШІ для альтернативного тексту ({ $downloadedSize } з { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Альтернативний текст додано +pdfjs-editor-new-alt-text-added-button-label = Альтернативний текст додано +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Відсутній альтернативний текст +pdfjs-editor-new-alt-text-missing-button-label = Відсутній альтернативний текст +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Переглянути альтернативний текст +pdfjs-editor-new-alt-text-to-review-button-label = Переглянути альтернативний текст +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Створено автоматично: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Налаштування альтернативного тексту зображення +pdfjs-image-alt-text-settings-button-label = Налаштування альтернативного тексту зображення +pdfjs-editor-alt-text-settings-dialog-label = Налаштування альтернативного тексту зображення +pdfjs-editor-alt-text-settings-automatic-title = Автоматичний альтернативний текст +pdfjs-editor-alt-text-settings-create-model-button-label = Автоматично створювати альтернативний текст +pdfjs-editor-alt-text-settings-create-model-description = Пропонує описи, щоб допомогти людям, які не бачать зображення, або якщо зображення не завантажується. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Модель ШІ для альтернативного тексту ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Працює локально на вашому пристрої, тому приватність ваших даних захищена. Призначена для автоматичного створення альтернативного тексту. +pdfjs-editor-alt-text-settings-delete-model-button = Видалити +pdfjs-editor-alt-text-settings-download-model-button = Завантажити +pdfjs-editor-alt-text-settings-downloading-model-button = Завантаження… +pdfjs-editor-alt-text-settings-editor-title = Редактор альтернативного тексту +pdfjs-editor-alt-text-settings-show-dialog-button-label = Показувати редактор альтернативного тексту під час додавання зображення +pdfjs-editor-alt-text-settings-show-dialog-description = Допомагає переконатися, що всі ваші зображення мають альтернативний текст. +pdfjs-editor-alt-text-settings-close-button = Закрити + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Підсвічення вилучено +pdfjs-editor-undo-bar-message-freetext = Текст вилучено +pdfjs-editor-undo-bar-message-ink = Малюнок вилучено +pdfjs-editor-undo-bar-message-stamp = Зображення вилучено +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } анотацію вилучено + [few] { $count } анотації вилучено + *[many] { $count } анотацій вилучено + } +pdfjs-editor-undo-bar-undo-button = + .title = Повернути +pdfjs-editor-undo-bar-undo-button-label = Повернути +pdfjs-editor-undo-bar-close-button = + .title = Закрити +pdfjs-editor-undo-bar-close-button-label = Закрити diff --git a/public/pdfjs/web/locale/ur/viewer.ftl b/public/pdfjs/web/locale/ur/viewer.ftl new file mode 100644 index 0000000..c15f157 --- /dev/null +++ b/public/pdfjs/web/locale/ur/viewer.ftl @@ -0,0 +1,248 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = پچھلا صفحہ +pdfjs-previous-button-label = پچھلا +pdfjs-next-button = + .title = اگلا صفحہ +pdfjs-next-button-label = آگے +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = صفحہ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } کا +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } کا { $pagesCount }) +pdfjs-zoom-out-button = + .title = باہر زوم کریں +pdfjs-zoom-out-button-label = باہر زوم کریں +pdfjs-zoom-in-button = + .title = اندر زوم کریں +pdfjs-zoom-in-button-label = اندر زوم کریں +pdfjs-zoom-select = + .title = زوم +pdfjs-presentation-mode-button = + .title = پیشکش موڈ میں چلے جائیں +pdfjs-presentation-mode-button-label = پیشکش موڈ +pdfjs-open-file-button = + .title = مسل کھولیں +pdfjs-open-file-button-label = کھولیں +pdfjs-print-button = + .title = چھاپیں +pdfjs-print-button-label = چھاپیں + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = آلات +pdfjs-tools-button-label = آلات +pdfjs-first-page-button = + .title = پہلے صفحہ پر جائیں +pdfjs-first-page-button-label = پہلے صفحہ پر جائیں +pdfjs-last-page-button = + .title = آخری صفحہ پر جائیں +pdfjs-last-page-button-label = آخری صفحہ پر جائیں +pdfjs-page-rotate-cw-button = + .title = گھڑی وار گھمائیں +pdfjs-page-rotate-cw-button-label = گھڑی وار گھمائیں +pdfjs-page-rotate-ccw-button = + .title = ضد گھڑی وار گھمائیں +pdfjs-page-rotate-ccw-button-label = ضد گھڑی وار گھمائیں +pdfjs-cursor-text-select-tool-button = + .title = متن کے انتخاب کے ٹول کو فعال بناے +pdfjs-cursor-text-select-tool-button-label = متن کے انتخاب کا آلہ +pdfjs-cursor-hand-tool-button = + .title = ہینڈ ٹول کو فعال بناییں +pdfjs-cursor-hand-tool-button-label = ہاتھ کا آلہ +pdfjs-scroll-vertical-button = + .title = عمودی اسکرولنگ کا استعمال کریں +pdfjs-scroll-vertical-button-label = عمودی اسکرولنگ +pdfjs-scroll-horizontal-button = + .title = افقی سکرولنگ کا استعمال کریں +pdfjs-scroll-horizontal-button-label = افقی سکرولنگ +pdfjs-spread-none-button = + .title = صفحہ پھیلانے میں شامل نہ ہوں +pdfjs-spread-none-button-label = کوئی پھیلاؤ نہیں +pdfjs-spread-odd-button-label = تاک پھیلاؤ +pdfjs-spread-even-button-label = جفت پھیلاؤ + +## Document properties dialog + +pdfjs-document-properties-button = + .title = دستاویز خواص… +pdfjs-document-properties-button-label = دستاویز خواص… +pdfjs-document-properties-file-name = نام مسل: +pdfjs-document-properties-file-size = مسل سائز: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = عنوان: +pdfjs-document-properties-author = تخلیق کار: +pdfjs-document-properties-subject = موضوع: +pdfjs-document-properties-keywords = کلیدی الفاظ: +pdfjs-document-properties-creation-date = تخلیق کی تاریخ: +pdfjs-document-properties-modification-date = ترمیم کی تاریخ: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }، { $time } +pdfjs-document-properties-creator = تخلیق کار: +pdfjs-document-properties-producer = PDF پیدا کار: +pdfjs-document-properties-version = PDF ورژن: +pdfjs-document-properties-page-count = صفحہ شمار: +pdfjs-document-properties-page-size = صفہ کی لمبائ: +pdfjs-document-properties-page-size-unit-inches = میں +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = عمودی انداز +pdfjs-document-properties-page-size-orientation-landscape = افقى انداز +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = خط +pdfjs-document-properties-page-size-name-legal = قانونی + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } { $name } { $orientation } + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = تیز ویب دیکھیں: +pdfjs-document-properties-linearized-yes = ہاں +pdfjs-document-properties-linearized-no = نہیں +pdfjs-document-properties-close-button = بند کریں + +## Print + +pdfjs-print-progress-message = چھاپنے کرنے کے لیے دستاویز تیار کیے جا رھے ھیں +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = *{ $progress }%* +pdfjs-print-progress-close-button = منسوخ کریں +pdfjs-printing-not-supported = تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔ +pdfjs-printing-not-ready = تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔ + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = سلائیڈ ٹوگل کریں +pdfjs-toggle-sidebar-button-label = سلائیڈ ٹوگل کریں +pdfjs-document-outline-button = + .title = دستاویز کی سرخیاں دکھایں (تمام اشیاء وسیع / غائب کرنے کے لیے ڈبل کلک کریں) +pdfjs-document-outline-button-label = دستاویز آؤٹ لائن +pdfjs-attachments-button = + .title = منسلکات دکھائیں +pdfjs-attachments-button-label = منسلکات +pdfjs-thumbs-button = + .title = تھمبنیل دکھائیں +pdfjs-thumbs-button-label = مجمل +pdfjs-findbar-button = + .title = دستاویز میں ڈھونڈیں +pdfjs-findbar-button-label = ڈھونڈیں + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = صفحہ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = صفحے کا مجمل { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = ڈھونڈیں + .placeholder = دستاویز… میں ڈھونڈیں +pdfjs-find-previous-button = + .title = فقرے کا پچھلا وقوع ڈھونڈیں +pdfjs-find-previous-button-label = پچھلا +pdfjs-find-next-button = + .title = فقرے کا اگلہ وقوع ڈھونڈیں +pdfjs-find-next-button-label = آگے +pdfjs-find-highlight-checkbox = تمام نمایاں کریں +pdfjs-find-match-case-checkbox-label = حروف مشابہ کریں +pdfjs-find-entire-word-checkbox-label = تمام الفاظ +pdfjs-find-reached-top = صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا +pdfjs-find-reached-bottom = صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا +pdfjs-find-not-found = فقرا نہیں ملا + +## Predefined zoom values + +pdfjs-page-scale-width = صفحہ چوڑائی +pdfjs-page-scale-fit = صفحہ فٹنگ +pdfjs-page-scale-auto = خودکار زوم +pdfjs-page-scale-actual = اصل سائز +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = صفحہ { $page } + +## Loading indicator messages + +pdfjs-loading-error = PDF لوڈ کرتے وقت نقص آ گیا۔ +pdfjs-invalid-file-error = ناجائز یا خراب PDF مسل +pdfjs-missing-file-error = PDF مسل غائب ہے۔ +pdfjs-unexpected-response-error = غیرمتوقع پیش کار جواب +pdfjs-rendering-error = صفحہ بناتے ہوئے نقص آ گیا۔ + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }.{ $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } نوٹ] + +## Password + +pdfjs-password-label = PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں. +pdfjs-password-invalid = ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں. +pdfjs-password-ok-button = ٹھیک ہے +pdfjs-password-cancel-button = منسوخ کریں +pdfjs-web-fonts-disabled = ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔ + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/uz/viewer.ftl b/public/pdfjs/web/locale/uz/viewer.ftl new file mode 100644 index 0000000..fb82f22 --- /dev/null +++ b/public/pdfjs/web/locale/uz/viewer.ftl @@ -0,0 +1,187 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Oldingi sahifa +pdfjs-previous-button-label = Oldingi +pdfjs-next-button = + .title = Keyingi sahifa +pdfjs-next-button-label = Keyingi +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = /{ $pagesCount } +pdfjs-zoom-out-button = + .title = Kichiklashtirish +pdfjs-zoom-out-button-label = Kichiklashtirish +pdfjs-zoom-in-button = + .title = Kattalashtirish +pdfjs-zoom-in-button-label = Kattalashtirish +pdfjs-zoom-select = + .title = Masshtab +pdfjs-presentation-mode-button = + .title = Namoyish usuliga oʻtish +pdfjs-presentation-mode-button-label = Namoyish usuli +pdfjs-open-file-button = + .title = Faylni ochish +pdfjs-open-file-button-label = Ochish +pdfjs-print-button = + .title = Chop qilish +pdfjs-print-button-label = Chop qilish + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Vositalar +pdfjs-tools-button-label = Vositalar +pdfjs-first-page-button = + .title = Birinchi sahifaga oʻtish +pdfjs-first-page-button-label = Birinchi sahifaga oʻtish +pdfjs-last-page-button = + .title = Soʻnggi sahifaga oʻtish +pdfjs-last-page-button-label = Soʻnggi sahifaga oʻtish +pdfjs-page-rotate-cw-button = + .title = Soat yoʻnalishi boʻyicha burish +pdfjs-page-rotate-cw-button-label = Soat yoʻnalishi boʻyicha burish +pdfjs-page-rotate-ccw-button = + .title = Soat yoʻnalishiga qarshi burish +pdfjs-page-rotate-ccw-button-label = Soat yoʻnalishiga qarshi burish + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Hujjat xossalari +pdfjs-document-properties-button-label = Hujjat xossalari +pdfjs-document-properties-file-name = Fayl nomi: +pdfjs-document-properties-file-size = Fayl hajmi: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +pdfjs-document-properties-title = Nomi: +pdfjs-document-properties-author = Muallifi: +pdfjs-document-properties-subject = Mavzusi: +pdfjs-document-properties-keywords = Kalit so‘zlar +pdfjs-document-properties-creation-date = Yaratilgan sanasi: +pdfjs-document-properties-modification-date = O‘zgartirilgan sanasi +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Yaratuvchi: +pdfjs-document-properties-producer = PDF ishlab chiqaruvchi: +pdfjs-document-properties-version = PDF versiyasi: +pdfjs-document-properties-page-count = Sahifa soni: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = Yopish + +## Print + +pdfjs-printing-not-supported = Diqqat: chop qilish bruzer tomonidan toʻliq qoʻllab-quvvatlanmaydi. +pdfjs-printing-not-ready = Diqqat: PDF fayl chop qilish uchun toʻliq yuklanmadi. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Yon panelni yoqib/oʻchirib qoʻyish +pdfjs-toggle-sidebar-button-label = Yon panelni yoqib/oʻchirib qoʻyish +pdfjs-document-outline-button-label = Hujjat tuzilishi +pdfjs-attachments-button = + .title = Ilovalarni ko‘rsatish +pdfjs-attachments-button-label = Ilovalar +pdfjs-thumbs-button = + .title = Nishonchalarni koʻrsatish +pdfjs-thumbs-button-label = Nishoncha +pdfjs-findbar-button = + .title = Hujjat ichidan topish + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = { $page } sahifa +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } sahifa nishonchasi + +## Find panel button title and messages + +pdfjs-find-previous-button = + .title = Soʻzlardagi oldingi hodisani topish +pdfjs-find-previous-button-label = Oldingi +pdfjs-find-next-button = + .title = Iboradagi keyingi hodisani topish +pdfjs-find-next-button-label = Keyingi +pdfjs-find-highlight-checkbox = Barchasini ajratib koʻrsatish +pdfjs-find-match-case-checkbox-label = Katta-kichik harflarni farqlash +pdfjs-find-reached-top = Hujjatning boshigacha yetib keldik, pastdan davom ettiriladi +pdfjs-find-reached-bottom = Hujjatning oxiriga yetib kelindi, yuqoridan davom ettirladi +pdfjs-find-not-found = Soʻzlar topilmadi + +## Predefined zoom values + +pdfjs-page-scale-width = Sahifa eni +pdfjs-page-scale-fit = Sahifani moslashtirish +pdfjs-page-scale-auto = Avtomatik masshtab +pdfjs-page-scale-actual = Haqiqiy hajmi +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = PDF yuklanayotganda xato yuz berdi. +pdfjs-invalid-file-error = Xato yoki buzuq PDF fayli. +pdfjs-missing-file-error = PDF fayl kerak. +pdfjs-unexpected-response-error = Kutilmagan server javobi. +pdfjs-rendering-error = Sahifa renderlanayotganda xato yuz berdi. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] + +## Password + +pdfjs-password-label = PDF faylni ochish uchun parolni kiriting. +pdfjs-password-invalid = Parol - notoʻgʻri. Qaytadan urinib koʻring. +pdfjs-password-ok-button = OK +pdfjs-web-fonts-disabled = Veb shriftlar oʻchirilgan: ichki PDF shriftlardan foydalanib boʻlmmaydi. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/vi/viewer.ftl b/public/pdfjs/web/locale/vi/viewer.ftl new file mode 100644 index 0000000..af1291f --- /dev/null +++ b/public/pdfjs/web/locale/vi/viewer.ftl @@ -0,0 +1,503 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Trang trước +pdfjs-previous-button-label = Trước +pdfjs-next-button = + .title = Trang Sau +pdfjs-next-button-label = Tiếp +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Trang +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = trên { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } trên { $pagesCount }) +pdfjs-zoom-out-button = + .title = Thu nhỏ +pdfjs-zoom-out-button-label = Thu nhỏ +pdfjs-zoom-in-button = + .title = Phóng to +pdfjs-zoom-in-button-label = Phóng to +pdfjs-zoom-select = + .title = Thu phóng +pdfjs-presentation-mode-button = + .title = Chuyển sang chế độ trình chiếu +pdfjs-presentation-mode-button-label = Chế độ trình chiếu +pdfjs-open-file-button = + .title = Mở tập tin +pdfjs-open-file-button-label = Mở tập tin +pdfjs-print-button = + .title = In +pdfjs-print-button-label = In +pdfjs-save-button = + .title = Lưu +pdfjs-save-button-label = Lưu +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Tải xuống +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Tải xuống +pdfjs-bookmark-button = + .title = Trang hiện tại (xem URL từ trang hiện tại) +pdfjs-bookmark-button-label = Trang hiện tại + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Công cụ +pdfjs-tools-button-label = Công cụ +pdfjs-first-page-button = + .title = Về trang đầu +pdfjs-first-page-button-label = Về trang đầu +pdfjs-last-page-button = + .title = Đến trang cuối +pdfjs-last-page-button-label = Đến trang cuối +pdfjs-page-rotate-cw-button = + .title = Xoay theo chiều kim đồng hồ +pdfjs-page-rotate-cw-button-label = Xoay theo chiều kim đồng hồ +pdfjs-page-rotate-ccw-button = + .title = Xoay ngược chiều kim đồng hồ +pdfjs-page-rotate-ccw-button-label = Xoay ngược chiều kim đồng hồ +pdfjs-cursor-text-select-tool-button = + .title = Kích hoạt công cụ chọn vùng văn bản +pdfjs-cursor-text-select-tool-button-label = Công cụ chọn vùng văn bản +pdfjs-cursor-hand-tool-button = + .title = Kích hoạt công cụ con trỏ +pdfjs-cursor-hand-tool-button-label = Công cụ con trỏ +pdfjs-scroll-page-button = + .title = Sử dụng cuộn trang hiện tại +pdfjs-scroll-page-button-label = Cuộn trang hiện tại +pdfjs-scroll-vertical-button = + .title = Sử dụng cuộn dọc +pdfjs-scroll-vertical-button-label = Cuộn dọc +pdfjs-scroll-horizontal-button = + .title = Sử dụng cuộn ngang +pdfjs-scroll-horizontal-button-label = Cuộn ngang +pdfjs-scroll-wrapped-button = + .title = Sử dụng cuộn ngắt dòng +pdfjs-scroll-wrapped-button-label = Cuộn ngắt dòng +pdfjs-spread-none-button = + .title = Không nối rộng trang +pdfjs-spread-none-button-label = Không có phân cách +pdfjs-spread-odd-button = + .title = Nối trang bài bắt đầu với các trang được đánh số lẻ +pdfjs-spread-odd-button-label = Phân cách theo số lẻ +pdfjs-spread-even-button = + .title = Nối trang bài bắt đầu với các trang được đánh số chẵn +pdfjs-spread-even-button-label = Phân cách theo số chẵn + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Thuộc tính của tài liệu… +pdfjs-document-properties-button-label = Thuộc tính của tài liệu… +pdfjs-document-properties-file-name = Tên tập tin: +pdfjs-document-properties-file-size = Kích thước: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +pdfjs-document-properties-title = Tiêu đề: +pdfjs-document-properties-author = Tác giả: +pdfjs-document-properties-subject = Chủ đề: +pdfjs-document-properties-keywords = Từ khóa: +pdfjs-document-properties-creation-date = Ngày tạo: +pdfjs-document-properties-modification-date = Ngày sửa đổi: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Người tạo: +pdfjs-document-properties-producer = Phần mềm tạo PDF: +pdfjs-document-properties-version = Phiên bản PDF: +pdfjs-document-properties-page-count = Tổng số trang: +pdfjs-document-properties-page-size = Kích thước trang: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = khổ dọc +pdfjs-document-properties-page-size-orientation-landscape = khổ ngang +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Thư +pdfjs-document-properties-page-size-name-legal = Pháp lý + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Xem nhanh trên web: +pdfjs-document-properties-linearized-yes = Có +pdfjs-document-properties-linearized-no = Không +pdfjs-document-properties-close-button = Ðóng + +## Print + +pdfjs-print-progress-message = Chuẩn bị trang để in… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Hủy bỏ +pdfjs-printing-not-supported = Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này. +pdfjs-printing-not-ready = Cảnh báo: PDF chưa được tải hết để in. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Bật/Tắt thanh lề +pdfjs-toggle-sidebar-notification-button = + .title = Bật tắt thanh lề (tài liệu bao gồm bản phác thảo/tập tin đính kèm/lớp) +pdfjs-toggle-sidebar-button-label = Bật/Tắt thanh lề +pdfjs-document-outline-button = + .title = Hiển thị tài liệu phác thảo (nhấp đúp vào để mở rộng/thu gọn tất cả các mục) +pdfjs-document-outline-button-label = Bản phác tài liệu +pdfjs-attachments-button = + .title = Hiện nội dung đính kèm +pdfjs-attachments-button-label = Nội dung đính kèm +pdfjs-layers-button = + .title = Hiển thị các lớp (nhấp đúp để đặt lại tất cả các lớp về trạng thái mặc định) +pdfjs-layers-button-label = Lớp +pdfjs-thumbs-button = + .title = Hiển thị ảnh thu nhỏ +pdfjs-thumbs-button-label = Ảnh thu nhỏ +pdfjs-current-outline-item-button = + .title = Tìm mục phác thảo hiện tại +pdfjs-current-outline-item-button-label = Mục phác thảo hiện tại +pdfjs-findbar-button = + .title = Tìm trong tài liệu +pdfjs-findbar-button-label = Tìm +pdfjs-additional-layers = Các lớp bổ sung + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Trang { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Ảnh thu nhỏ của trang { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Tìm + .placeholder = Tìm trong tài liệu… +pdfjs-find-previous-button = + .title = Tìm cụm từ ở phần trước +pdfjs-find-previous-button-label = Trước +pdfjs-find-next-button = + .title = Tìm cụm từ ở phần sau +pdfjs-find-next-button-label = Tiếp +pdfjs-find-highlight-checkbox = Đánh dấu tất cả +pdfjs-find-match-case-checkbox-label = Phân biệt hoa, thường +pdfjs-find-match-diacritics-checkbox-label = Khớp dấu phụ +pdfjs-find-entire-word-checkbox-label = Toàn bộ từ +pdfjs-find-reached-top = Đã đến phần đầu tài liệu, quay trở lại từ cuối +pdfjs-find-reached-bottom = Đã đến phần cuối của tài liệu, quay trở lại từ đầu +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = { $current } trên { $total } kết quả +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = Tìm thấy hơn { $limit } kết quả +pdfjs-find-not-found = Không tìm thấy cụm từ này + +## Predefined zoom values + +pdfjs-page-scale-width = Vừa chiều rộng +pdfjs-page-scale-fit = Vừa chiều cao +pdfjs-page-scale-auto = Tự động chọn kích thước +pdfjs-page-scale-actual = Kích thước thực +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Trang { $page } + +## Loading indicator messages + +pdfjs-loading-error = Lỗi khi tải tài liệu PDF. +pdfjs-invalid-file-error = Tập tin PDF hỏng hoặc không hợp lệ. +pdfjs-missing-file-error = Thiếu tập tin PDF. +pdfjs-unexpected-response-error = Máy chủ có phản hồi lạ. +pdfjs-rendering-error = Lỗi khi hiển thị trang. + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date }, { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Chú thích] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = Nhập mật khẩu để mở tập tin PDF này. +pdfjs-password-invalid = Mật khẩu không đúng. Vui lòng thử lại. +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Hủy bỏ +pdfjs-web-fonts-disabled = Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng. + +## Editing + +pdfjs-editor-free-text-button = + .title = Văn bản +pdfjs-editor-free-text-button-label = Văn bản +pdfjs-editor-ink-button = + .title = Vẽ +pdfjs-editor-ink-button-label = Vẽ +pdfjs-editor-stamp-button = + .title = Thêm hoặc chỉnh sửa hình ảnh +pdfjs-editor-stamp-button-label = Thêm hoặc chỉnh sửa hình ảnh +pdfjs-editor-highlight-button = + .title = Đánh dấu +pdfjs-editor-highlight-button-label = Đánh dấu +pdfjs-highlight-floating-button1 = + .title = Đánh dấu + .aria-label = Đánh dấu +pdfjs-highlight-floating-button-label = Đánh dấu + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Xóa bản vẽ +pdfjs-editor-remove-freetext-button = + .title = Xóa văn bản +pdfjs-editor-remove-stamp-button = + .title = Xóa ảnh +pdfjs-editor-remove-highlight-button = + .title = Xóa phần đánh dấu + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Màu +pdfjs-editor-free-text-size-input = Kích cỡ +pdfjs-editor-ink-color-input = Màu +pdfjs-editor-ink-thickness-input = Độ dày +pdfjs-editor-ink-opacity-input = Độ mờ +pdfjs-editor-stamp-add-image-button = + .title = Thêm hình ảnh +pdfjs-editor-stamp-add-image-button-label = Thêm hình ảnh +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Độ dày +pdfjs-editor-free-highlight-thickness-title = + .title = Thay đổi độ dày khi đánh dấu các mục không phải là văn bản +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Trình chỉnh sửa văn bản + .default-content = Bắt đầu nhập… +pdfjs-free-text = + .aria-label = Trình sửa văn bản +pdfjs-free-text-default-content = Bắt đầu nhập… +pdfjs-ink = + .aria-label = Trình sửa nét vẽ +pdfjs-ink-canvas = + .aria-label = Hình ảnh do người dùng tạo + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = Văn bản thay thế +pdfjs-editor-alt-text-edit-button = + .aria-label = Chỉnh sửa văn bản thay thế +pdfjs-editor-alt-text-edit-button-label = Chỉnh sửa văn bản thay thế +pdfjs-editor-alt-text-dialog-label = Chọn một lựa chọn +pdfjs-editor-alt-text-dialog-description = Văn bản thay thế sẽ hữu ích khi mọi người không thể thấy hình ảnh hoặc khi hình ảnh không tải. +pdfjs-editor-alt-text-add-description-label = Thêm một mô tả +pdfjs-editor-alt-text-add-description-description = Hãy nhắm tới 1-2 câu mô tả chủ đề, bối cảnh hoặc hành động. +pdfjs-editor-alt-text-mark-decorative-label = Đánh dấu là trang trí +pdfjs-editor-alt-text-mark-decorative-description = Điều này được sử dụng cho các hình ảnh trang trí, như đường viền hoặc watermark. +pdfjs-editor-alt-text-cancel-button = Hủy bỏ +pdfjs-editor-alt-text-save-button = Lưu +pdfjs-editor-alt-text-decorative-tooltip = Đã đánh dấu là trang trí +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Ví dụ: “Một thanh niên ngồi xuống bàn để thưởng thức một bữa ăn” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Văn bản thay thế + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = Trên cùng bên trái — thay đổi kích thước +pdfjs-editor-resizer-label-top-middle = Trên cùng ở giữa — thay đổi kích thước +pdfjs-editor-resizer-label-top-right = Trên cùng bên phải — thay đổi kích thước +pdfjs-editor-resizer-label-middle-right = Ở giữa bên phải — thay đổi kích thước +pdfjs-editor-resizer-label-bottom-right = Dưới cùng bên phải — thay đổi kích thước +pdfjs-editor-resizer-label-bottom-middle = Ở giữa dưới cùng — thay đổi kích thước +pdfjs-editor-resizer-label-bottom-left = Góc dưới bên trái — thay đổi kích thước +pdfjs-editor-resizer-label-middle-left = Ở giữa bên trái — thay đổi kích thước +pdfjs-editor-resizer-top-left = + .aria-label = Trên cùng bên trái — thay đổi kích thước +pdfjs-editor-resizer-top-middle = + .aria-label = Trên cùng ở giữa — thay đổi kích thước +pdfjs-editor-resizer-top-right = + .aria-label = Trên cùng bên phải — thay đổi kích thước +pdfjs-editor-resizer-middle-right = + .aria-label = Ở giữa bên phải — thay đổi kích thước +pdfjs-editor-resizer-bottom-right = + .aria-label = Dưới cùng bên phải — thay đổi kích thước +pdfjs-editor-resizer-bottom-middle = + .aria-label = Ở giữa dưới cùng — thay đổi kích thước +pdfjs-editor-resizer-bottom-left = + .aria-label = Góc dưới bên trái — thay đổi kích thước +pdfjs-editor-resizer-middle-left = + .aria-label = Ở giữa bên trái — thay đổi kích thước + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Màu đánh dấu +pdfjs-editor-colorpicker-button = + .title = Thay đổi màu +pdfjs-editor-colorpicker-dropdown = + .aria-label = Lựa chọn màu sắc +pdfjs-editor-colorpicker-yellow = + .title = Vàng +pdfjs-editor-colorpicker-green = + .title = Xanh lục +pdfjs-editor-colorpicker-blue = + .title = Xanh dương +pdfjs-editor-colorpicker-pink = + .title = Hồng +pdfjs-editor-colorpicker-red = + .title = Đỏ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Hiện tất cả +pdfjs-editor-highlight-show-all-button = + .title = Hiện tất cả + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Chỉnh sửa văn bản thay thế (mô tả hình ảnh) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Thêm văn bản thay thế (mô tả hình ảnh) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Viết mô tả của bạn ở đây… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Mô tả ngắn gọn dành cho người không xem được ảnh hoặc khi không thể tải ảnh. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Văn bản thay thế này được tạo tự động và có thể không chính xác. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Tìm hiểu thêm +pdfjs-editor-new-alt-text-create-automatically-button-label = Tạo văn bản thay thế tự động +pdfjs-editor-new-alt-text-not-now-button = Không phải bây giờ +pdfjs-editor-new-alt-text-error-title = Không thể tạo tự động văn bản thay thế +pdfjs-editor-new-alt-text-error-description = Vui lòng viết văn bản thay thế của riêng bạn hoặc thử lại sau. +pdfjs-editor-new-alt-text-error-close-button = Đóng +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Đang tải xuống mô hình AI văn bản thay thế ({ $downloadedSize } trong số { $totalSize } MB) + .aria-valuetext = Đang tải xuống mô hình AI văn bản thay thế ({ $downloadedSize } trong số { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Đã thêm văn bản thay thế +pdfjs-editor-new-alt-text-added-button-label = Đã thêm văn bản thay thế +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Thiếu văn bản thay thế +pdfjs-editor-new-alt-text-missing-button-label = Thiếu văn bản thay thế +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Xem lại văn bản thay thế +pdfjs-editor-new-alt-text-to-review-button-label = Xem lại văn bản thay thế +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Được tạo tự động: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Cài đặt văn bản thay thế của hình ảnh +pdfjs-image-alt-text-settings-button-label = Cài đặt văn bản thay thế của hình ảnh +pdfjs-editor-alt-text-settings-dialog-label = Cài đặt văn bản thay thế của hình ảnh +pdfjs-editor-alt-text-settings-automatic-title = Văn bản thay thế tự động +pdfjs-editor-alt-text-settings-create-model-button-label = Tạo văn bản thay thế tự động +pdfjs-editor-alt-text-settings-create-model-description = Đề xuất mô tả giúp ích cho những người không xem được ảnh hoặc khi không thể tải ảnh. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Mô hình AI văn bản khác ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Chạy cục bộ trên thiết bị của bạn để dữ liệu của bạn luôn ở chế độ riêng tư. Bắt buộc đối với văn bản thay thế tự động. +pdfjs-editor-alt-text-settings-delete-model-button = Xóa +pdfjs-editor-alt-text-settings-download-model-button = Tải xuống +pdfjs-editor-alt-text-settings-downloading-model-button = Đang tải xuống… +pdfjs-editor-alt-text-settings-editor-title = Trình soạn thảo văn bản thay thế +pdfjs-editor-alt-text-settings-show-dialog-button-label = Hiển thị ngay trình soạn thảo văn bản thay thế khi thêm hình ảnh +pdfjs-editor-alt-text-settings-show-dialog-description = Giúp bạn đảm bảo tất cả hình ảnh của bạn đều có văn bản thay thế. +pdfjs-editor-alt-text-settings-close-button = Đóng + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Đã xóa đánh dấu +pdfjs-editor-undo-bar-message-freetext = Đã xóa văn bản +pdfjs-editor-undo-bar-message-ink = Đã xóa bản vẽ +pdfjs-editor-undo-bar-message-stamp = Đã xóa hình ảnh +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = { $count } chú thích đã bị xóa +pdfjs-editor-undo-bar-undo-button = + .title = Hoàn tác +pdfjs-editor-undo-bar-undo-button-label = Hoàn tác +pdfjs-editor-undo-bar-close-button = + .title = Đóng +pdfjs-editor-undo-bar-close-button-label = Đóng diff --git a/public/pdfjs/web/locale/wo/viewer.ftl b/public/pdfjs/web/locale/wo/viewer.ftl new file mode 100644 index 0000000..d66c459 --- /dev/null +++ b/public/pdfjs/web/locale/wo/viewer.ftl @@ -0,0 +1,127 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Xët wi jiitu +pdfjs-previous-button-label = Bi jiitu +pdfjs-next-button = + .title = Xët wi ci topp +pdfjs-next-button-label = Bi ci topp +pdfjs-zoom-out-button = + .title = Wàññi +pdfjs-zoom-out-button-label = Wàññi +pdfjs-zoom-in-button = + .title = Yaatal +pdfjs-zoom-in-button-label = Yaatal +pdfjs-zoom-select = + .title = Yambalaŋ +pdfjs-presentation-mode-button = + .title = Wañarñil ci anamu wone +pdfjs-presentation-mode-button-label = Anamu Wone +pdfjs-open-file-button = + .title = Ubbi benn dencukaay +pdfjs-open-file-button-label = Ubbi +pdfjs-print-button = + .title = Móol +pdfjs-print-button-label = Móol + +## Secondary toolbar and context menu + + +## Document properties dialog + +pdfjs-document-properties-title = Bopp: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + + +## Print + +pdfjs-printing-not-supported = Artu: Joowkat bii nanguwul lool mool. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-thumbs-button = + .title = Wone nataal yu ndaw yi +pdfjs-thumbs-button-label = Nataal yu ndaw yi +pdfjs-findbar-button = + .title = Gis ci biir jukki bi +pdfjs-findbar-button-label = Wut + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Xët { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Wiñet bu xët { $page } + +## Find panel button title and messages + +pdfjs-find-previous-button = + .title = Seet beneen kaddu bu ni mel te jiitu +pdfjs-find-previous-button-label = Bi jiitu +pdfjs-find-next-button = + .title = Seet beneen kaddu bu ni mel +pdfjs-find-next-button-label = Bi ci topp +pdfjs-find-highlight-checkbox = Melaxal lépp +pdfjs-find-match-case-checkbox-label = Sàmm jëmmalin wi +pdfjs-find-reached-top = Jot nañu ndorteel xët wi, kontine dale ko ci suuf +pdfjs-find-reached-bottom = Jot nañu jeexitalu xët wi, kontine ci ndorte +pdfjs-find-not-found = Gisiñu kaddu gi + +## Predefined zoom values + +pdfjs-page-scale-width = Yaatuwaay bu mët +pdfjs-page-scale-fit = Xët lëmm +pdfjs-page-scale-auto = Yambalaŋ ci saa si +pdfjs-page-scale-actual = Dayo bi am + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Am na njumte ci yebum dencukaay PDF bi. +pdfjs-invalid-file-error = Dencukaay PDF bi baaxul walla mu sankar. +pdfjs-rendering-error = Am njumte bu am bi xët bi di wonewu. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [Karmat { $type }] + +## Password + +pdfjs-password-ok-button = OK +pdfjs-password-cancel-button = Neenal + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/xh/viewer.ftl b/public/pdfjs/web/locale/xh/viewer.ftl new file mode 100644 index 0000000..0798887 --- /dev/null +++ b/public/pdfjs/web/locale/xh/viewer.ftl @@ -0,0 +1,212 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = Iphepha langaphambili +pdfjs-previous-button-label = Okwangaphambili +pdfjs-next-button = + .title = Iphepha elilandelayo +pdfjs-next-button-label = Okulandelayo +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = Iphepha +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = kwali- { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } kwali { $pagesCount }) +pdfjs-zoom-out-button = + .title = Bhekelisela Kudana +pdfjs-zoom-out-button-label = Bhekelisela Kudana +pdfjs-zoom-in-button = + .title = Sondeza Kufuphi +pdfjs-zoom-in-button-label = Sondeza Kufuphi +pdfjs-zoom-select = + .title = Yandisa / Nciphisa +pdfjs-presentation-mode-button = + .title = Tshintshela kwimo yonikezelo +pdfjs-presentation-mode-button-label = Imo yonikezelo +pdfjs-open-file-button = + .title = Vula Ifayile +pdfjs-open-file-button-label = Vula +pdfjs-print-button = + .title = Printa +pdfjs-print-button-label = Printa + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = Izixhobo zemiyalelo +pdfjs-tools-button-label = Izixhobo zemiyalelo +pdfjs-first-page-button = + .title = Yiya kwiphepha lokuqala +pdfjs-first-page-button-label = Yiya kwiphepha lokuqala +pdfjs-last-page-button = + .title = Yiya kwiphepha lokugqibela +pdfjs-last-page-button-label = Yiya kwiphepha lokugqibela +pdfjs-page-rotate-cw-button = + .title = Jikelisa ngasekunene +pdfjs-page-rotate-cw-button-label = Jikelisa ngasekunene +pdfjs-page-rotate-ccw-button = + .title = Jikelisa ngasekhohlo +pdfjs-page-rotate-ccw-button-label = Jikelisa ngasekhohlo +pdfjs-cursor-text-select-tool-button = + .title = Vumela iSixhobo sokuKhetha iTeksti +pdfjs-cursor-text-select-tool-button-label = ISixhobo sokuKhetha iTeksti +pdfjs-cursor-hand-tool-button = + .title = Yenza iSixhobo seSandla siSebenze +pdfjs-cursor-hand-tool-button-label = ISixhobo seSandla + +## Document properties dialog + +pdfjs-document-properties-button = + .title = Iipropati zoxwebhu… +pdfjs-document-properties-button-label = Iipropati zoxwebhu… +pdfjs-document-properties-file-name = Igama lefayile: +pdfjs-document-properties-file-size = Isayizi yefayile: +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB (iibhayiti{ $size_b }) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB (iibhayithi{ $size_b }) +pdfjs-document-properties-title = Umxholo: +pdfjs-document-properties-author = Umbhali: +pdfjs-document-properties-subject = Umbandela: +pdfjs-document-properties-keywords = Amagama aphambili: +pdfjs-document-properties-creation-date = Umhla wokwenziwa kwayo: +pdfjs-document-properties-modification-date = Umhla wokulungiswa kwayo: +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = Umntu oyenzileyo: +pdfjs-document-properties-producer = Umvelisi we-PDF: +pdfjs-document-properties-version = Uhlelo lwe-PDF: +pdfjs-document-properties-page-count = Inani lamaphepha: + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + + +## + +pdfjs-document-properties-close-button = Vala + +## Print + +pdfjs-print-progress-message = Ilungisa uxwebhu ukuze iprinte… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = Rhoxisa +pdfjs-printing-not-supported = Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza. +pdfjs-printing-not-ready = Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta. + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = Togola ngebha eseCaleni +pdfjs-toggle-sidebar-button-label = Togola ngebha eseCaleni +pdfjs-document-outline-button = + .title = Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto) +pdfjs-document-outline-button-label = Isishwankathelo soxwebhu +pdfjs-attachments-button = + .title = Bonisa iziqhotyoshelwa +pdfjs-attachments-button-label = Iziqhoboshelo +pdfjs-thumbs-button = + .title = Bonisa ukrobiso kumfanekiso +pdfjs-thumbs-button-label = Ukrobiso kumfanekiso +pdfjs-findbar-button = + .title = Fumana kuXwebhu +pdfjs-findbar-button-label = Fumana + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = Iphepha { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = Ukrobiso kumfanekiso wephepha { $page } + +## Find panel button title and messages + +pdfjs-find-input = + .title = Fumana + .placeholder = Fumana kuXwebhu… +pdfjs-find-previous-button = + .title = Fumanisa isenzeko sangaphambili sebinzana lamagama +pdfjs-find-previous-button-label = Okwangaphambili +pdfjs-find-next-button = + .title = Fumanisa isenzeko esilandelayo sebinzana lamagama +pdfjs-find-next-button-label = Okulandelayo +pdfjs-find-highlight-checkbox = Qaqambisa konke +pdfjs-find-match-case-checkbox-label = Tshatisa ngobukhulu bukanobumba +pdfjs-find-reached-top = Ufike ngaphezulu ephepheni, kusukwa ngezantsi +pdfjs-find-reached-bottom = Ufike ekupheleni kwephepha, kusukwa ngaphezulu +pdfjs-find-not-found = Ibinzana alifunyenwanga + +## Predefined zoom values + +pdfjs-page-scale-width = Ububanzi bephepha +pdfjs-page-scale-fit = Ukulinganiswa kwephepha +pdfjs-page-scale-auto = Ukwandisa/Ukunciphisa Ngokwayo +pdfjs-page-scale-actual = Ubungakanani bokwenene +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + + +## Loading indicator messages + +pdfjs-loading-error = Imposiso yenzekile xa kulayishwa i-PDF. +pdfjs-invalid-file-error = Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo. +pdfjs-missing-file-error = Ifayile ye-PDF edukileyo. +pdfjs-unexpected-response-error = Impendulo yeseva engalindelekanga. +pdfjs-rendering-error = Imposiso yenzekile xa bekunikezelwa iphepha. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Ubhalo-nqaku] + +## Password + +pdfjs-password-label = Faka ipasiwedi ukuze uvule le fayile yePDF. +pdfjs-password-invalid = Ipasiwedi ayisebenzi. Nceda uzame kwakhona. +pdfjs-password-ok-button = KULUNGILE +pdfjs-password-cancel-button = Rhoxisa +pdfjs-web-fonts-disabled = Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo. + +## Editing + + +## Alt-text dialog + + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + diff --git a/public/pdfjs/web/locale/zh-CN/viewer.ftl b/public/pdfjs/web/locale/zh-CN/viewer.ftl new file mode 100644 index 0000000..8fe9a6a --- /dev/null +++ b/public/pdfjs/web/locale/zh-CN/viewer.ftl @@ -0,0 +1,503 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = 上一页 +pdfjs-previous-button-label = 上一页 +pdfjs-next-button = + .title = 下一页 +pdfjs-next-button-label = 下一页 +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = 页面 +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = / { $pagesCount } +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) +pdfjs-zoom-out-button = + .title = 缩小 +pdfjs-zoom-out-button-label = 缩小 +pdfjs-zoom-in-button = + .title = 放大 +pdfjs-zoom-in-button-label = 放大 +pdfjs-zoom-select = + .title = 缩放 +pdfjs-presentation-mode-button = + .title = 切换到演示模式 +pdfjs-presentation-mode-button-label = 演示模式 +pdfjs-open-file-button = + .title = 打开文件 +pdfjs-open-file-button-label = 打开 +pdfjs-print-button = + .title = 打印 +pdfjs-print-button-label = 打印 +pdfjs-save-button = + .title = 保存 +pdfjs-save-button-label = 保存 +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = 下载 +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = 下载 +pdfjs-bookmark-button = + .title = 当前页面(在当前页面查看 URL) +pdfjs-bookmark-button-label = 当前页面 + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = 工具 +pdfjs-tools-button-label = 工具 +pdfjs-first-page-button = + .title = 转到第一页 +pdfjs-first-page-button-label = 转到第一页 +pdfjs-last-page-button = + .title = 转到最后一页 +pdfjs-last-page-button-label = 转到最后一页 +pdfjs-page-rotate-cw-button = + .title = 顺时针旋转 +pdfjs-page-rotate-cw-button-label = 顺时针旋转 +pdfjs-page-rotate-ccw-button = + .title = 逆时针旋转 +pdfjs-page-rotate-ccw-button-label = 逆时针旋转 +pdfjs-cursor-text-select-tool-button = + .title = 启用文本选择工具 +pdfjs-cursor-text-select-tool-button-label = 文本选择工具 +pdfjs-cursor-hand-tool-button = + .title = 启用手形工具 +pdfjs-cursor-hand-tool-button-label = 手形工具 +pdfjs-scroll-page-button = + .title = 使用页面滚动 +pdfjs-scroll-page-button-label = 页面滚动 +pdfjs-scroll-vertical-button = + .title = 使用垂直滚动 +pdfjs-scroll-vertical-button-label = 垂直滚动 +pdfjs-scroll-horizontal-button = + .title = 使用水平滚动 +pdfjs-scroll-horizontal-button-label = 水平滚动 +pdfjs-scroll-wrapped-button = + .title = 使用平铺滚动 +pdfjs-scroll-wrapped-button-label = 平铺滚动 +pdfjs-spread-none-button = + .title = 不加入衔接页 +pdfjs-spread-none-button-label = 单页视图 +pdfjs-spread-odd-button = + .title = 加入衔接页使奇数页作为起始页 +pdfjs-spread-odd-button-label = 双页视图 +pdfjs-spread-even-button = + .title = 加入衔接页使偶数页作为起始页 +pdfjs-spread-even-button-label = 书籍视图 + +## Document properties dialog + +pdfjs-document-properties-button = + .title = 文档属性… +pdfjs-document-properties-button-label = 文档属性… +pdfjs-document-properties-file-name = 文件名: +pdfjs-document-properties-file-size = 文件大小: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB({ $b } 字节) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB({ $b } 字节) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } 字节) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } 字节) +pdfjs-document-properties-title = 标题: +pdfjs-document-properties-author = 作者: +pdfjs-document-properties-subject = 主题: +pdfjs-document-properties-keywords = 关键词: +pdfjs-document-properties-creation-date = 创建日期: +pdfjs-document-properties-modification-date = 修改日期: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date }, { $time } +pdfjs-document-properties-creator = 创建者: +pdfjs-document-properties-producer = PDF 生成器: +pdfjs-document-properties-version = PDF 版本: +pdfjs-document-properties-page-count = 页数: +pdfjs-document-properties-page-size = 页面大小: +pdfjs-document-properties-page-size-unit-inches = 英寸 +pdfjs-document-properties-page-size-unit-millimeters = 毫米 +pdfjs-document-properties-page-size-orientation-portrait = 纵向 +pdfjs-document-properties-page-size-orientation-landscape = 横向 +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit }({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit }({ $name },{ $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = 快速 Web 视图: +pdfjs-document-properties-linearized-yes = 是 +pdfjs-document-properties-linearized-no = 否 +pdfjs-document-properties-close-button = 关闭 + +## Print + +pdfjs-print-progress-message = 正在准备打印文档… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = 取消 +pdfjs-printing-not-supported = 警告:此浏览器尚未完整支持打印功能。 +pdfjs-printing-not-ready = 警告:此 PDF 未完成加载,无法打印。 + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = 切换侧栏 +pdfjs-toggle-sidebar-notification-button = + .title = 切换侧栏(文档所含的大纲/附件/图层) +pdfjs-toggle-sidebar-button-label = 切换侧栏 +pdfjs-document-outline-button = + .title = 显示文档大纲(双击展开/折叠所有项) +pdfjs-document-outline-button-label = 文档大纲 +pdfjs-attachments-button = + .title = 显示附件 +pdfjs-attachments-button-label = 附件 +pdfjs-layers-button = + .title = 显示图层(双击即可将所有图层重置为默认状态) +pdfjs-layers-button-label = 图层 +pdfjs-thumbs-button = + .title = 显示缩略图 +pdfjs-thumbs-button-label = 缩略图 +pdfjs-current-outline-item-button = + .title = 查找当前大纲项目 +pdfjs-current-outline-item-button-label = 当前大纲项目 +pdfjs-findbar-button = + .title = 在文档中查找 +pdfjs-findbar-button-label = 查找 +pdfjs-additional-layers = 其他图层 + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = 第 { $page } 页 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = 页面 { $page } 的缩略图 + +## Find panel button title and messages + +pdfjs-find-input = + .title = 查找 + .placeholder = 在文档中查找… +pdfjs-find-previous-button = + .title = 查找词语上一次出现的位置 +pdfjs-find-previous-button-label = 上一页 +pdfjs-find-next-button = + .title = 查找词语后一次出现的位置 +pdfjs-find-next-button-label = 下一页 +pdfjs-find-highlight-checkbox = 全部高亮显示 +pdfjs-find-match-case-checkbox-label = 区分大小写 +pdfjs-find-match-diacritics-checkbox-label = 匹配变音符号 +pdfjs-find-entire-word-checkbox-label = 全词匹配 +pdfjs-find-reached-top = 到达文档开头,从末尾继续 +pdfjs-find-reached-bottom = 到达文档末尾,从开头继续 +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = 第 { $current } 项,共找到 { $total } 个匹配项 +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = 匹配超过 { $limit } 项 +pdfjs-find-not-found = 找不到指定词语 + +## Predefined zoom values + +pdfjs-page-scale-width = 适合页宽 +pdfjs-page-scale-fit = 适合页面 +pdfjs-page-scale-auto = 自动缩放 +pdfjs-page-scale-actual = 实际大小 +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = 第 { $page } 页 + +## Loading indicator messages + +pdfjs-loading-error = 加载 PDF 时发生错误。 +pdfjs-invalid-file-error = 无效或损坏的 PDF 文件。 +pdfjs-missing-file-error = 缺少 PDF 文件。 +pdfjs-unexpected-response-error = 意外的服务器响应。 +pdfjs-rendering-error = 渲染页面时发生错误。 + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date },{ $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } 注释] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = 输入密码以打开此 PDF 文件。 +pdfjs-password-invalid = 密码无效。请重试。 +pdfjs-password-ok-button = 确定 +pdfjs-password-cancel-button = 取消 +pdfjs-web-fonts-disabled = Web 字体已被禁用:无法使用嵌入的 PDF 字体。 + +## Editing + +pdfjs-editor-free-text-button = + .title = 文本 +pdfjs-editor-free-text-button-label = 文本 +pdfjs-editor-ink-button = + .title = 绘图 +pdfjs-editor-ink-button-label = 绘图 +pdfjs-editor-stamp-button = + .title = 添加或编辑图像 +pdfjs-editor-stamp-button-label = 添加或编辑图像 +pdfjs-editor-highlight-button = + .title = 高亮 +pdfjs-editor-highlight-button-label = 高亮 +pdfjs-highlight-floating-button1 = + .title = 高亮 + .aria-label = 高亮 +pdfjs-highlight-floating-button-label = 高亮 + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = 移除绘图 +pdfjs-editor-remove-freetext-button = + .title = 移除文本 +pdfjs-editor-remove-stamp-button = + .title = 移除图像 +pdfjs-editor-remove-highlight-button = + .title = 移除高亮 + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = 颜色 +pdfjs-editor-free-text-size-input = 字号 +pdfjs-editor-ink-color-input = 颜色 +pdfjs-editor-ink-thickness-input = 粗细 +pdfjs-editor-ink-opacity-input = 不透明度 +pdfjs-editor-stamp-add-image-button = + .title = 添加图像 +pdfjs-editor-stamp-add-image-button-label = 添加图像 +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = 粗细 +pdfjs-editor-free-highlight-thickness-title = + .title = 更改高亮粗细(用于文本以外项目) +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = 文本编辑器 + .default-content = 在此键入… +pdfjs-free-text = + .aria-label = 文本编辑器 +pdfjs-free-text-default-content = 开始输入… +pdfjs-ink = + .aria-label = 绘图编辑器 +pdfjs-ink-canvas = + .aria-label = 用户创建图像 + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = 替换文字 +pdfjs-editor-alt-text-edit-button = + .aria-label = 编辑替换文字 +pdfjs-editor-alt-text-edit-button-label = 编辑替换文字 +pdfjs-editor-alt-text-dialog-label = 选择一项 +pdfjs-editor-alt-text-dialog-description = 替换文字可在用户无法看到或加载图像时,描述其内容。 +pdfjs-editor-alt-text-add-description-label = 添加描述 +pdfjs-editor-alt-text-add-description-description = 用一两个句子,描述主题、背景或动作。 +pdfjs-editor-alt-text-mark-decorative-label = 标记为装饰 +pdfjs-editor-alt-text-mark-decorative-description = 用于装饰的图像,例如边框和水印。 +pdfjs-editor-alt-text-cancel-button = 取消 +pdfjs-editor-alt-text-save-button = 保存 +pdfjs-editor-alt-text-decorative-tooltip = 已标记为装饰 +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = 例如:一个少年坐到桌前,准备吃饭 +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 替换文字 + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = 调整尺寸 - 左上角 +pdfjs-editor-resizer-label-top-middle = 调整尺寸 - 顶部中间 +pdfjs-editor-resizer-label-top-right = 调整尺寸 - 右上角 +pdfjs-editor-resizer-label-middle-right = 调整尺寸 - 右侧中间 +pdfjs-editor-resizer-label-bottom-right = 调整尺寸 - 右下角 +pdfjs-editor-resizer-label-bottom-middle = 调整大小 - 底部中间 +pdfjs-editor-resizer-label-bottom-left = 调整尺寸 - 左下角 +pdfjs-editor-resizer-label-middle-left = 调整尺寸 - 左侧中间 +pdfjs-editor-resizer-top-left = + .aria-label = 调整尺寸 - 左上角 +pdfjs-editor-resizer-top-middle = + .aria-label = 调整尺寸 - 顶部中间 +pdfjs-editor-resizer-top-right = + .aria-label = 调整尺寸 - 右上角 +pdfjs-editor-resizer-middle-right = + .aria-label = 调整尺寸 - 右侧中间 +pdfjs-editor-resizer-bottom-right = + .aria-label = 调整尺寸 - 右下角 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 调整大小 - 底部中间 +pdfjs-editor-resizer-bottom-left = + .aria-label = 调整尺寸 - 左下角 +pdfjs-editor-resizer-middle-left = + .aria-label = 调整尺寸 - 左侧中间 + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = 高亮色 +pdfjs-editor-colorpicker-button = + .title = 更改颜色 +pdfjs-editor-colorpicker-dropdown = + .aria-label = 颜色选择 +pdfjs-editor-colorpicker-yellow = + .title = 黄色 +pdfjs-editor-colorpicker-green = + .title = 绿色 +pdfjs-editor-colorpicker-blue = + .title = 蓝色 +pdfjs-editor-colorpicker-pink = + .title = 粉色 +pdfjs-editor-colorpicker-red = + .title = 红色 + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = 显示全部 +pdfjs-editor-highlight-show-all-button = + .title = 显示全部 + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 编辑替换文字(图像描述) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 添加替换文字(图像描述) +pdfjs-editor-new-alt-text-textarea = + .placeholder = 请在此处撰写描述… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 向无法看到或加载图像的用户提供的简短描述。 +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = 此段替换文字为自动创建,有可能不准确。 +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 详细了解 +pdfjs-editor-new-alt-text-create-automatically-button-label = 自动创建替换文字 +pdfjs-editor-new-alt-text-not-now-button = 暂时不要 +pdfjs-editor-new-alt-text-error-title = 无法自动创建替换文字 +pdfjs-editor-new-alt-text-error-description = 请自行撰写替换文字,或稍后再试。 +pdfjs-editor-new-alt-text-error-close-button = 关闭 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 正在下载提供替换文字的 AI 模型({ $downloadedSize }/{ $totalSize } MB) + .aria-valuetext = 正在下载提供替换文字的 AI 模型({ $downloadedSize }/{ $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 已添加替换文字 +pdfjs-editor-new-alt-text-added-button-label = 已添加替换文字 +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 缺少替换文字 +pdfjs-editor-new-alt-text-missing-button-label = 缺少替换文字 +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 检查替换文字 +pdfjs-editor-new-alt-text-to-review-button-label = 检查替换文字 +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = [自动创建] { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 图像替换文字设置 +pdfjs-image-alt-text-settings-button-label = 图像替换文字设置 +pdfjs-editor-alt-text-settings-dialog-label = 图像替换文字设置 +pdfjs-editor-alt-text-settings-automatic-title = 自动创建替换文字 +pdfjs-editor-alt-text-settings-create-model-button-label = 自动创建替换文字 +pdfjs-editor-alt-text-settings-create-model-description = 向无法看到或加载图像的用户提供描述。 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 提供替换文字的 AI 模型({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = 在您的设备本地运行,可使数据保持私密。自动创建替换文字需要使用此模型。 +pdfjs-editor-alt-text-settings-delete-model-button = 删除 +pdfjs-editor-alt-text-settings-download-model-button = 下载 +pdfjs-editor-alt-text-settings-downloading-model-button = 正在下载… +pdfjs-editor-alt-text-settings-editor-title = 替换文字编辑器 +pdfjs-editor-alt-text-settings-show-dialog-button-label = 添加图像后立即显示替换文字编辑器 +pdfjs-editor-alt-text-settings-show-dialog-description = 帮助确保所有图像均拥有替换文字。 +pdfjs-editor-alt-text-settings-close-button = 关闭 + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 已移除高亮 +pdfjs-editor-undo-bar-message-freetext = 已移除文本 +pdfjs-editor-undo-bar-message-ink = 已移除绘图 +pdfjs-editor-undo-bar-message-stamp = 已移除图像 +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = 已移除 { $count } 条注释 +pdfjs-editor-undo-bar-undo-button = + .title = 撤销 +pdfjs-editor-undo-bar-undo-button-label = 撤销 +pdfjs-editor-undo-bar-close-button = + .title = 关闭 +pdfjs-editor-undo-bar-close-button-label = 关闭 diff --git a/public/pdfjs/web/locale/zh-TW/viewer.ftl b/public/pdfjs/web/locale/zh-TW/viewer.ftl new file mode 100644 index 0000000..bc4b7ef --- /dev/null +++ b/public/pdfjs/web/locale/zh-TW/viewer.ftl @@ -0,0 +1,503 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = 上一頁 +pdfjs-previous-button-label = 上一頁 +pdfjs-next-button = + .title = 下一頁 +pdfjs-next-button-label = 下一頁 +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = 第 +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = 頁,共 { $pagesCount } 頁 +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = (第 { $pageNumber } 頁,共 { $pagesCount } 頁) +pdfjs-zoom-out-button = + .title = 縮小 +pdfjs-zoom-out-button-label = 縮小 +pdfjs-zoom-in-button = + .title = 放大 +pdfjs-zoom-in-button-label = 放大 +pdfjs-zoom-select = + .title = 縮放 +pdfjs-presentation-mode-button = + .title = 切換至簡報模式 +pdfjs-presentation-mode-button-label = 簡報模式 +pdfjs-open-file-button = + .title = 開啟檔案 +pdfjs-open-file-button-label = 開啟 +pdfjs-print-button = + .title = 列印 +pdfjs-print-button-label = 列印 +pdfjs-save-button = + .title = 儲存 +pdfjs-save-button-label = 儲存 +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = 下載 +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = 下載 +pdfjs-bookmark-button = + .title = 目前頁面(含目前檢視頁面的網址) +pdfjs-bookmark-button-label = 目前頁面 + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = 工具 +pdfjs-tools-button-label = 工具 +pdfjs-first-page-button = + .title = 跳到第一頁 +pdfjs-first-page-button-label = 跳到第一頁 +pdfjs-last-page-button = + .title = 跳到最後一頁 +pdfjs-last-page-button-label = 跳到最後一頁 +pdfjs-page-rotate-cw-button = + .title = 順時針旋轉 +pdfjs-page-rotate-cw-button-label = 順時針旋轉 +pdfjs-page-rotate-ccw-button = + .title = 逆時針旋轉 +pdfjs-page-rotate-ccw-button-label = 逆時針旋轉 +pdfjs-cursor-text-select-tool-button = + .title = 開啟文字選擇工具 +pdfjs-cursor-text-select-tool-button-label = 文字選擇工具 +pdfjs-cursor-hand-tool-button = + .title = 開啟頁面移動工具 +pdfjs-cursor-hand-tool-button-label = 頁面移動工具 +pdfjs-scroll-page-button = + .title = 使用單頁捲動版面 +pdfjs-scroll-page-button-label = 單頁捲動 +pdfjs-scroll-vertical-button = + .title = 使用垂直捲動版面 +pdfjs-scroll-vertical-button-label = 垂直捲動 +pdfjs-scroll-horizontal-button = + .title = 使用水平捲動版面 +pdfjs-scroll-horizontal-button-label = 水平捲動 +pdfjs-scroll-wrapped-button = + .title = 使用多頁捲動版面 +pdfjs-scroll-wrapped-button-label = 多頁捲動 +pdfjs-spread-none-button = + .title = 不要進行跨頁顯示 +pdfjs-spread-none-button-label = 不跨頁 +pdfjs-spread-odd-button = + .title = 從奇數頁開始跨頁 +pdfjs-spread-odd-button-label = 奇數跨頁 +pdfjs-spread-even-button = + .title = 從偶數頁開始跨頁 +pdfjs-spread-even-button-label = 偶數跨頁 + +## Document properties dialog + +pdfjs-document-properties-button = + .title = 文件內容… +pdfjs-document-properties-button-label = 文件內容… +pdfjs-document-properties-file-name = 檔案名稱: +pdfjs-document-properties-file-size = 檔案大小: +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB({ $b } 位元組) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB({ $b } 位元組) +# Variables: +# $size_kb (Number) - the PDF file size in kilobytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-kb = { $size_kb } KB({ $size_b } 位元組) +# Variables: +# $size_mb (Number) - the PDF file size in megabytes +# $size_b (Number) - the PDF file size in bytes +pdfjs-document-properties-mb = { $size_mb } MB({ $size_b } 位元組) +pdfjs-document-properties-title = 標題: +pdfjs-document-properties-author = 作者: +pdfjs-document-properties-subject = 主旨: +pdfjs-document-properties-keywords = 關鍵字: +pdfjs-document-properties-creation-date = 建立日期: +pdfjs-document-properties-modification-date = 修改日期: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +# Variables: +# $date (Date) - the creation/modification date of the PDF file +# $time (Time) - the creation/modification time of the PDF file +pdfjs-document-properties-date-string = { $date } { $time } +pdfjs-document-properties-creator = 建立者: +pdfjs-document-properties-producer = PDF 產生器: +pdfjs-document-properties-version = PDF 版本: +pdfjs-document-properties-page-count = 頁數: +pdfjs-document-properties-page-size = 頁面大小: +pdfjs-document-properties-page-size-unit-inches = in +pdfjs-document-properties-page-size-unit-millimeters = mm +pdfjs-document-properties-page-size-orientation-portrait = 垂直 +pdfjs-document-properties-page-size-orientation-landscape = 水平 +pdfjs-document-properties-page-size-name-a-three = A3 +pdfjs-document-properties-page-size-name-a-four = A4 +pdfjs-document-properties-page-size-name-letter = Letter +pdfjs-document-properties-page-size-name-legal = Legal + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit }({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit }({ $name },{ $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = 快速 Web 檢視: +pdfjs-document-properties-linearized-yes = 是 +pdfjs-document-properties-linearized-no = 否 +pdfjs-document-properties-close-button = 關閉 + +## Print + +pdfjs-print-progress-message = 正在準備列印文件… +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = 取消 +pdfjs-printing-not-supported = 警告: 此瀏覽器未完整支援列印功能。 +pdfjs-printing-not-ready = 警告: 此 PDF 未完成下載以供列印。 + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = 切換側邊欄 +pdfjs-toggle-sidebar-notification-button = + .title = 切換側邊欄(包含大綱、附件、圖層的文件) +pdfjs-toggle-sidebar-button-label = 切換側邊欄 +pdfjs-document-outline-button = + .title = 顯示文件大綱(雙擊展開/摺疊所有項目) +pdfjs-document-outline-button-label = 文件大綱 +pdfjs-attachments-button = + .title = 顯示附件 +pdfjs-attachments-button-label = 附件 +pdfjs-layers-button = + .title = 顯示圖層(滑鼠雙擊即可將所有圖層重設為預設狀態) +pdfjs-layers-button-label = 圖層 +pdfjs-thumbs-button = + .title = 顯示縮圖 +pdfjs-thumbs-button-label = 縮圖 +pdfjs-current-outline-item-button = + .title = 尋找目前的大綱項目 +pdfjs-current-outline-item-button-label = 目前的大綱項目 +pdfjs-findbar-button = + .title = 在文件中尋找 +pdfjs-findbar-button-label = 尋找 +pdfjs-additional-layers = 其他圖層 + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = 第 { $page } 頁 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = 第 { $page } 頁的縮圖 + +## Find panel button title and messages + +pdfjs-find-input = + .title = 尋找 + .placeholder = 在文件中搜尋… +pdfjs-find-previous-button = + .title = 尋找文字前次出現的位置 +pdfjs-find-previous-button-label = 上一個 +pdfjs-find-next-button = + .title = 尋找文字下次出現的位置 +pdfjs-find-next-button-label = 下一個 +pdfjs-find-highlight-checkbox = 強調全部 +pdfjs-find-match-case-checkbox-label = 區分大小寫 +pdfjs-find-match-diacritics-checkbox-label = 符合變音符號 +pdfjs-find-entire-word-checkbox-label = 符合整個字 +pdfjs-find-reached-top = 已搜尋至文件頂端,自底端繼續搜尋 +pdfjs-find-reached-bottom = 已搜尋至文件底端,自頂端繼續搜尋 +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = 第 { $current } 筆符合,共符合 { $total } 筆 +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = 符合超過 { $limit } 項 +pdfjs-find-not-found = 找不到指定文字 + +## Predefined zoom values + +pdfjs-page-scale-width = 頁面寬度 +pdfjs-page-scale-fit = 縮放至頁面大小 +pdfjs-page-scale-auto = 自動縮放 +pdfjs-page-scale-actual = 實際大小 +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = 第 { $page } 頁 + +## Loading indicator messages + +pdfjs-loading-error = 載入 PDF 時發生錯誤。 +pdfjs-invalid-file-error = 無效或毀損的 PDF 檔案。 +pdfjs-missing-file-error = 找不到 PDF 檔案。 +pdfjs-unexpected-response-error = 伺服器回應未預期的內容。 +pdfjs-rendering-error = 描繪頁面時發生錯誤。 + +## Annotations + +# Variables: +# $date (Date) - the modification date of the annotation +# $time (Time) - the modification time of the annotation +pdfjs-annotation-date-string = { $date } { $time } +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } 註解] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = 請輸入用來開啟此 PDF 檔案的密碼。 +pdfjs-password-invalid = 密碼不正確,請再試一次。 +pdfjs-password-ok-button = 確定 +pdfjs-password-cancel-button = 取消 +pdfjs-web-fonts-disabled = 已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。 + +## Editing + +pdfjs-editor-free-text-button = + .title = 文字 +pdfjs-editor-free-text-button-label = 文字 +pdfjs-editor-ink-button = + .title = 繪圖 +pdfjs-editor-ink-button-label = 繪圖 +pdfjs-editor-stamp-button = + .title = 新增或編輯圖片 +pdfjs-editor-stamp-button-label = 新增或編輯圖片 +pdfjs-editor-highlight-button = + .title = 強調 +pdfjs-editor-highlight-button-label = 強調 +pdfjs-highlight-floating-button1 = + .title = 強調 + .aria-label = 強調 +pdfjs-highlight-floating-button-label = 強調 + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = 移除繪圖 +pdfjs-editor-remove-freetext-button = + .title = 移除文字 +pdfjs-editor-remove-stamp-button = + .title = 移除圖片 +pdfjs-editor-remove-highlight-button = + .title = 移除強調範圍 + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = 色彩 +pdfjs-editor-free-text-size-input = 大小 +pdfjs-editor-ink-color-input = 色彩 +pdfjs-editor-ink-thickness-input = 線條粗細 +pdfjs-editor-ink-opacity-input = 透​明度 +pdfjs-editor-stamp-add-image-button = + .title = 新增圖片 +pdfjs-editor-stamp-add-image-button-label = 新增圖片 +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = 線條粗細 +pdfjs-editor-free-highlight-thickness-title = + .title = 更改強調文字以外的項目時的線條粗細 +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = 文字編輯器 + .default-content = 請打字… +pdfjs-free-text = + .aria-label = 文本編輯器 +pdfjs-free-text-default-content = 在此打字… +pdfjs-ink = + .aria-label = 圖形編輯器 +pdfjs-ink-canvas = + .aria-label = 使用者建立的圖片 + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = 替代文字 +pdfjs-editor-alt-text-edit-button = + .aria-label = 編輯替代文字 +pdfjs-editor-alt-text-edit-button-label = 編輯替代文字 +pdfjs-editor-alt-text-dialog-label = 挑選一種 +pdfjs-editor-alt-text-dialog-description = 替代文字可協助盲人,或於圖片無法載入時提供說明。 +pdfjs-editor-alt-text-add-description-label = 新增描述 +pdfjs-editor-alt-text-add-description-description = 用 1-2 句文字描述主題、背景或動作。 +pdfjs-editor-alt-text-mark-decorative-label = 標示為裝飾性內容 +pdfjs-editor-alt-text-mark-decorative-description = 這是裝飾性圖片,例如邊框或浮水印。 +pdfjs-editor-alt-text-cancel-button = 取消 +pdfjs-editor-alt-text-save-button = 儲存 +pdfjs-editor-alt-text-decorative-tooltip = 已標示為裝飾性內容 +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = 例如:「有一位年輕男人坐在桌子前面吃飯」 +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 替代文字 + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-label-top-left = 左上角 — 調整大小 +pdfjs-editor-resizer-label-top-middle = 頂部中間 — 調整大小 +pdfjs-editor-resizer-label-top-right = 右上角 — 調整大小 +pdfjs-editor-resizer-label-middle-right = 中間右方 — 調整大小 +pdfjs-editor-resizer-label-bottom-right = 右下角 — 調整大小 +pdfjs-editor-resizer-label-bottom-middle = 底部中間 — 調整大小 +pdfjs-editor-resizer-label-bottom-left = 左下角 — 調整大小 +pdfjs-editor-resizer-label-middle-left = 中間左方 — 調整大小 +pdfjs-editor-resizer-top-left = + .aria-label = 左上角 — 調整大小 +pdfjs-editor-resizer-top-middle = + .aria-label = 頂部中間 — 調整大小 +pdfjs-editor-resizer-top-right = + .aria-label = 右上角 — 調整大小 +pdfjs-editor-resizer-middle-right = + .aria-label = 中間右方 — 調整大小 +pdfjs-editor-resizer-bottom-right = + .aria-label = 右下角 — 調整大小 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 底部中間 — 調整大小 +pdfjs-editor-resizer-bottom-left = + .aria-label = 左下角 — 調整大小 +pdfjs-editor-resizer-middle-left = + .aria-label = 中間左方 — 調整大小 + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = 強調色彩 +pdfjs-editor-colorpicker-button = + .title = 更改色彩 +pdfjs-editor-colorpicker-dropdown = + .aria-label = 色彩選項 +pdfjs-editor-colorpicker-yellow = + .title = 黃色 +pdfjs-editor-colorpicker-green = + .title = 綠色 +pdfjs-editor-colorpicker-blue = + .title = 藍色 +pdfjs-editor-colorpicker-pink = + .title = 粉紅色 +pdfjs-editor-colorpicker-red = + .title = 紅色 + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = 顯示全部 +pdfjs-editor-highlight-show-all-button = + .title = 顯示全部 + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 編輯替代文字(圖片描述) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 新增替代文字(圖片描述) +pdfjs-editor-new-alt-text-textarea = + .placeholder = 在此寫下您的描述文字… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 為看不到圖片的讀者,或圖片無法載入時顯示的簡短描述。 +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = 此替代文字是自動產生的,可能不夠精確。 +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 更多資訊 +pdfjs-editor-new-alt-text-create-automatically-button-label = 自動產生替代文字 +pdfjs-editor-new-alt-text-not-now-button = 暫時不要 +pdfjs-editor-new-alt-text-error-title = 無法自動產生替代文字 +pdfjs-editor-new-alt-text-error-description = 請自行填寫替代文字,或稍後再試一次。 +pdfjs-editor-new-alt-text-error-close-button = 關閉 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +# $percent (Number) - the percentage of the downloaded size. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 正在下載替代文字 AI 模型({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = 正在下載替代文字 AI 模型({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 已新增替代文字 +pdfjs-editor-new-alt-text-added-button-label = 已新增替代文字 +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 缺少替代文字 +pdfjs-editor-new-alt-text-missing-button-label = 缺少替代文字 +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 確認替代文字 +pdfjs-editor-new-alt-text-to-review-button-label = 確認替代文字 +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 自動產生:{ $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 圖片替代文字設定 +pdfjs-image-alt-text-settings-button-label = 圖片替代文字設定 +pdfjs-editor-alt-text-settings-dialog-label = 圖片替代文字設定 +pdfjs-editor-alt-text-settings-automatic-title = 自動化替代文字 +pdfjs-editor-alt-text-settings-create-model-button-label = 自動產生替代文字 +pdfjs-editor-alt-text-settings-create-model-description = 為您建議圖片描述,幫助看不到圖片的讀者,或於圖片無法載入時顯示。 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 替代文字 AI 模型({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = 在您的本機裝置上運作,以確保您的資料隱私。必須下載此模型才可以自動產生替代文字。 +pdfjs-editor-alt-text-settings-delete-model-button = 刪除 +pdfjs-editor-alt-text-settings-download-model-button = 下載 +pdfjs-editor-alt-text-settings-downloading-model-button = 下載中… +pdfjs-editor-alt-text-settings-editor-title = 替代文字編輯器 +pdfjs-editor-alt-text-settings-show-dialog-button-label = 新增圖片後立即顯示替代文字編輯器 +pdfjs-editor-alt-text-settings-show-dialog-description = 幫助您確保所有圖片都有替代文字。 +pdfjs-editor-alt-text-settings-close-button = 關閉 + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 已移除強調 +pdfjs-editor-undo-bar-message-freetext = 已移除文字 +pdfjs-editor-undo-bar-message-ink = 已移除繪圖 +pdfjs-editor-undo-bar-message-stamp = 已移除圖片 +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = 已移除 { $count } 筆註解 +pdfjs-editor-undo-bar-undo-button = + .title = 還原 +pdfjs-editor-undo-bar-undo-button-label = 還原 +pdfjs-editor-undo-bar-close-button = + .title = 關閉 +pdfjs-editor-undo-bar-close-button-label = 關閉 diff --git a/public/pdfjs/web/standard_fonts/FoxitDingbats.pfb b/public/pdfjs/web/standard_fonts/FoxitDingbats.pfb new file mode 100644 index 0000000000000000000000000000000000000000..30d52963e281dcd7e6dd70555340fc987d3568ef GIT binary patch literal 29513 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
IPcH43@#`eg2^qqF8*c|6bOiVYX6pGiH#!l)b zV9$0kvnZ|Bng2R?Y???cCA>0QerSXzrLbx<7doCpRm%r0@M-~<7wyBP;Xo7@O6ys> z4a5<>uAr9h`fwLJY;Q=MuZ)v+mffA38$=@wJ6W2Vm`m+dxibrg_gvVD4ByNRhaK<@ z1fuP*J-mfiD4EFRg)(4P6t|LntN-+17j?Sx@`*eA&WvM$>5=JTD%&K@<|hb63DM%J z`r4ujM=9lO=rFYl?mZ5ljb@;j;sEpx4To60`u5ZLH17zb2yI~DB8T}R=0q+SOr*9k zuk?IN_*VbWwOhq8WmQzZDLk3kh}XR6XHuHRWF9^9IUa^?d@Teb{Ihx}<*F|50T#?{`Ct;aWy}ih7kG*IhvXA3nvB-dJP`w} zLsMWftfyg>knBn$oMp9@je;}IU3+&&`ff{&vQ*NAHfssLA)z=fDm5`?)vrlIFMb_* z{bWh+lFsmSl zu#GhyO(wzu1J?TTk5t5Uwp3QOQoR3E$}21R*G}AM9HgGZ90L9AZit8Nu363B;{0Zu zO}Gyq_8)ozpSAEtPQhLHFS#@NK;&Bf%!iTppS(Er^XFnp<+~C|! ztz5T%>E627_GJ3E6XZT;P+1qhrOw$*@rqV-H6@o^ws{7p$@9$Wbw6&eBf@toQ|P*cb(H#Z=JNLFW_q$ z7k09*^eA?Xtb0ZdR-L)zetNoT_ud`x+c$4ZJT>4J_-QM=DrswehGkv(UGLAo|J>K| zf$L59iRAsysflISMMT1wGI$plKc>MX^d1tVqA}yCpT~4+V8N-=YP2vUREvCe@6^GZ zc4}n3VFDL8SY-q@vm{z#uR&)j2a8&Y^GYg8>YYtaNfqy(|Nf*VBb_Z7t%Alz zTX_xL2UL4|&#en#! zsgRY$2%=PxXeWbG3wtG!Va zGL!Xx?*&dNj4mnwzN0YLk}1vfPE8C-kChy%9IMFe6jdf#qfJ5HMS4Z2qE1xp-H_i| zQeMq5S#&lFzgSWz(o$11vcOD~X-r0=punIO8R)Vl?Z}&`VVwgBfooW(x0Wl)w7G4?663Vp80TT#|sSz6e3d2F_6S71p7A?WpJ278;pYF#uDR2C1uwTk!<(NRnJGaz$&x~ zn>H_C6Iu?-c`qhm9fq^Y{d@4-g=3ua$8Mf_$nVMM-<5tORYYZ(C7Jx#q~utNcP~O% z({%qy!QI(3-+pl?Fx%^*^ZgF)Y z59r|iHWlmc7n8Yo8S^ooN#901Ofba2-vsZ)Pw0CVUO{>6Wbs}gkIgKxC8tD94akTn z|z8w)eZ7kSov-DIzAZKzF)pv2gK=O?tt>{nWE44sZY=NlH25HG~l zeU97YtK<7&d5gPErUDywM*f}${%A2Q=Dk{ho1;KT_BEVoIxBc`VZ&_XIoEgM20zEC zVEV{_B_N#MA$0yc3hSt^-E$K%~FWUogw}s~>^!^z>#*Hp?$z3{c5*ezS(g3 z!eHpxt!omtY;l)7^H+t5)a@ucC(&n)8$mu^P!vF zou~?knQVi)Oolag~-}P>6zz-6#o4cf01kPBtI~KvRK6}EslCS=kCD06TkDHu0A_&;YMG?)Kce_ z#Omn)lDC&|q1Fn8saPcnZ~{MmEMCV;#5DSN97p)*bR+FY;e@Fr@96?qB=xIE0;q zcL&_I;es(YZAYXv)Y90^FGQ}!wSck}lc zHdh>=0;>9>hXhYgJ$QJ3?~R2?$;xaoEs|uUNs~EP8ru@`WK+-JW#|4KyM#M@H^rPe z=jOttKm8O_u>`Kb=l^n%7{$HDa>9(eKtBZ@rypI}3Aya4=*{(LQX-nc!SB2{2@6ic z9Cus6>N6o{VBX0CXJ9oJ_Ygb*MDEN8581|FbaBr&-`qO-{ZPzN{}RgGW{$pMXUi%6 z?QQ+5R&Ch#d0=gDPX?9#JK5V<-`n39w>KavCSX@$LqCNxN<+!yKy&-4p|0euei6yr zcLh66QON$+1n&Pf1@9z;^|%FCc_yq67G2$O23EE3{yBtOV;34vZnPW?y(YMLx_hva zF6}hk?BTyofDh37?yTqdeKCJY@483*M=Oq()2rm@ov9QSE-b#bSwY{0H%Q)p9b4i$ z&s=bvzByFCBfu{{@ZaUnx5r%6F?WAoe4!6l_spXfPuEAj+#w6l-#*qL!Im8gG;zs1 z6?}Ms+A(HsBbtRZ)(818>DQlAVG7>%8k>nGd`zLsW5(k=qPQ1akpV2lt|Jlqw49i4 z*=DJiZ+Ba7m4N2a@`OQfz(M?TFA zADQo(w{I`u3LN=>bQBbKH0kf54`ebth7-9=`1=Pu?|p>_q-$CW`%7(IMZrzZoe?oM zoA6RR>kq8n{gFQeeht%~!*2Ja#>1=fC~oe{YbVdPaRysXx8CCSC${_hryf|VrFbuW zECg_FUwrcH!N%zm7X&WbO(kbUiX;gfNZaVnlzSECpMfbierLih`1A?v#>F36L4Knp zwitr0YpIjkn#O+qnb67rDo{;aWOt~E{wC+i&eYn2+p?ne=;%dO;zjPYz9)jaw|6ZL zObtJjLiZ(9#ct)#`h4g7<%_z$$2}H{E_po~wm=U$0B`bcV5uL$r+5ILXTw3bMm$01 zzgxcmaap_@3ju#W;@v=RUL)a6*!8cB@cPa*@L;;G!DcL81o9vslo3Iy>d@nY8zmRc zo=EQU-z$m@%Ar?7E1X=9;y+^*I4jMyf?v8!7{bqJmgt(!aBciCrXd^GTZfKeSl19kUg&+d-Lz>;Ct;4T>0JK!JJ312a6hs-Y4%C5z)qy_*TKKqDO;z zIw>(s7A~0Of9=WhE4O~aOI_?T^9)cfNjyONMf*o@60F(Xb5lWIfp9XgDq`SFMOR;6 z!totjq}%tqi+KaRk;t9ouGv=XG@AMyFnF=pP2fqw-;0{rr!~!O#`B!}xKE=x$R?+A z;Y0z+D+iA<@P-M%uS6eCKptsm3L1~RLc!-}>fx9@di2q)YbKa>{G=AfeX%wN(R(Sc zA0hX~26!|2T1Er2611f2FBYUdB8u5a^CdCzL$vD!ODrTtZfCf@VikuIBad0G7b4PJ znbzTO!pBF5EVkERl@N|UhF%f#^zd=d(|C&!hKdPvimlVQRPZ!~JA%J+HSRkIKk(AP z7dQr?5;ppC;R)#)Ubk?jh`P6;*1Qiyf$#57ikH! z39TkU466y(B9<4d`G2{Hn9aW2-;eyV=E^+nrKmgmk8xbraF!vy2At(@H-BrJ(mM4^ zcZLnidJl6(uCcoN+b^nbZua?T&6F^X*T{R5g#THCH9z|k2l}^r0t{D*I)kp z{S{yBvgn{doF982=;DzZ`ni|Z{1*25$mBIs=WV>CxzpHl9OuUl==SYctKxV)x-5i( z+fXQCo*BO4c?SAO*XTk5m9e!NmoM~T9(>`12J=wH9>EX19>CYt2{qZ)(f0p%@{DKT zJ~=$jurv)ZcBce*XJS{bL7+3}^*Z{}BiP&ZM=?jI)#|h~ZQ(A#8^6rCx%lEPCZ3ahg)mg0kqd~{^r>85k(lH^3nlK-4127_I`y%$1FF5Ts z68lg)OX_O-ode}3ADw-8;oh}@p5ETx6C9h(U@Q^TH^;19%H1@hiE$CrG(YO-(mId{#@tf z-q!n`a0&8BD4NW|opuMpiI|Lv*pqQDz7MOHu@>TsURWK7mD+0339A!XUd_M~y7d0s z%C8#F4Yc3(bWMkSBrKj_X7#|Ee?9@mapcj97|%k0&B>X77PF?JUh+2deu4AoB?q84 zfHezWG(v9_YdXHDgx+M9mjvDuy2O}cHRgCf>B^hN0uv|^PQv1yx|7Gzu zq1o^W8*DI$a3atrEM5HZiZfH8)3mMVj{AlXYATi5{`lS4jb}O zBFaZ<;uYJgDm&?y0{H14-M*tK4R90iG2^vUW&#LwPWtX zm`(5j;gX(b!4|XwZ9$ueQ*5uLrNZG=BIZ$8>Uk7ikjM{PFf*`Cvjwv_1N^`beF~pp z@D}tb`V9F|*t3O|!Y#H|>r$aE37$z%7vc3cyeWjYo4;)QvKihMF^3m7d3Hb?3BRyj z{)snqkdOtLxPRkB;PARV>}h`z=oc2S(A$J-5G^6$F&pNfCB#2@bII=>FL+FVo%LYu z(z%3JHJ-2@knkBRAtEoZA+q!QwXUlj>uWZ2249GX)%#b+aL{Kg9P5XJCtk3yY4s+7 zp0PSd!84W-y$9?(8a-!u!TT^p2tmydglCnFt|Z)1Cy^LpI_3ECXalFd`<}L6@SL@4 zhkAD5w%gAhKL(E;;OtGeSCet^AfxWsbfrIz;TTyrQOhJe^Gda;A zZKrw1euBO#a0=Awt%P?rf6pn+jw?(P1Rjh(9PA7_nnpj22JYUT1P(fZ@}GYy@b~*7CgjYfA^H{A zpFyj@>j}1IYnb)JF3);6NDh0musJv`g^Tbv@elqr7LAi|y%t!6!-w(AKfKD*73w-l zqTf+=da_g?k=0t%^reK{Qjs7bCM`oqXUU}UH2$8Bk1O_5=1gOzEr+8t7w0t!ifXk+ zGu}vmKU_C(QxX-9u{(W4!C|x)d~nOv@V_G5`acQE|CONp|0F2K5otp4iZvIX4Q*I+;e=h6 zEM61VT(8-9!{cAo<#Ma8Qmnd4Gr8-|3SFk3ig1j|t4F*xSC(rT38S7Hg1cfmCEn^E z8m>DoaCkS?h?Zomc4$LucQq@~sF`C&R-<4NmSsT!o{5(f5%WjBAfXUqiL2(5);Q7(@{L(g)3h5 zjmw6$)sOfrNhrw3zdwyoChygRdRv^ex*EZWeo59*T6iJ)y8ee?$^Hmc@c5s{qTPo{ zSW<-C^ws z>os{exFJ9r!D<<@20{!X9vG;f5ZOm;Rp7JskHr) z^n*#9e<=8nbp3`Dr&HR~s{FhID%wNN3XblJ(RU8>B6vf5{ z+nXq~4L%`xeO3#OWVXmHGWZ9nil|Sn6mz77T~Td<>YtueI%(Hd z*M6d+!kAabzrwD|GexD!RZ<+tlPU!p5Vdo ze3uuAeG00x!y-jViF9~mntWd_XC&xP5@xdi2b&)at4%O%^Y%5h zZoMh!YOg(7ms*ulN(VLWtq5ri>KLmUM9cmnV4;0vB?|>lCtWxgUCW;Icw|i(G29$Q z*4GqP*Egg^#wMl3$3(hYC^n3=noU-V6$hEia%3`v#X|8A@K7M>tSqmpYe|Ss6bTb! zLu(r-ug~-9U5&MIz#H9C=c>mSV|e#k#<(8;#o~3nc0C;V8po@Bf|%^Ok@KXh(N#av z$o5*2*XU}7cbF{=t~%hQaa~tg*m`-BaNQg^$42ktt;&Xx?ig+;7e^YC&-`IIqG2xD zSDZigAiU`V%hvsP>AM$jr1_zwa4cGg;|*4#kC*Mk*5(%rv2B;<34$?@!}=Ir{R*!L zgs@++`940UnWx-4#d6o#e)@9Nt}?*#;huV^|H-m zq4fn3)o3NGS@GN(mcr(H;AwBqDH^*^u`p9558kr;qos@XbfTHCEpCV-VP(t04@kv1 z;yk(INLlp#xv!9iF(*%=%n3Vyd{JObJjZKUwQzVs5uR@AhIe?jSjk%bPsOd3_JWR@ zM}Hg5rMXsFZ@}p-&SXx=(RwUJ0dTBF8?7r2ZANoo>xLh^A3cWI;9JrqD;gWDM!Ymt zPW0ZD({}D$dt(N?AA5$A$x4zeStw7ewg1d-6xV zjbkvFO(woMJzr&`bedd~TA)_ssB>wFlrSp7lnMc!y1rPBS5y|2+9nZ53(H#IG~t^Cc^X|I`UE!N&_9Sjk=xDBXi=K; zv^h8)Nv&!$^7T6WkIFaiG3N@h(LQt}KAA>bSVNdq@_d;fD^rrCrDbZVM4eftRZ^K* zS(&o5nwdTGjx9h-(7v%*CFwXyN|D1?S!6mjWyVo%g$j<|Vm4X@I(@F1#-Y?IzSnYP z8>F><(*~k8W?vgbw>)Wss5Z|&C?>&#?08{q2P57UHL)#G0uB7BF1FUFHF9zI0l*yVSDXL$L^)3$mZ7i))qJ_8V#45E9;N7Ml|!j zleoO#45{3a9-JP*Njs7j9m0<;6j!HGh4M0~Nx{k08RQ0m!C=wpXgqFhg%(bASz&nt zzbCaZwS&rN%4k=fv>7cHWB!1$J+m=`Bkpb#bqgBG3#-d$OQEgIWa8*_7K4G0Gs@Lb z3X`-ag)P;R#Yrf$OX>yPjU}aRbaQcg>7dadwa9Hs zPCjNg*O8qsv2wC)5=#lc)S6$CPniw*W`lu~XRv4~U9Lf;)#&k&29uIgA~DO-_@Z=q zW+sJaSZQt=2d|{|kQzg|KHqA!c^4K~3QGm01@iQKTAyQ)y5BWmNjMsXI#)xfRElgR zKA&)MMY=?ulPXA+7ZplqS-!+3(s4#;6`87*;^~2dK1!AeCL_({~Ir%Cqj6$!~ zQ5u~|pT{>C%{GIX!~1SUNxs#L%d=!<=hHSxfyANyUx5rdeX2!bm3bFt70WcKoK(3q zT|(ukB{H=dGo)5&1RA9&k5(FF7P*m=VUt@*`DI0x!U8JaYQsV2IM9B=tIl7+Z>0zV zIz|tdVB4n;+dfO-S8V(AR}32a9o|hv_0`z+39LJ?J?tR1eNy*lryWe@{4);5ldjh& z?{rFQn$vCjv>iDoIDV|5uRXFR65Bpy{+54jAEDd!nNOHU7L%@H;G@wZkDifDXs6rs z`5Bu&RsWhk5z)z!331r;(WCbNHGNvJ=_3+j)2FPN8u{JrLfnhqE!%fGIW0R4H+ZVq zdt^UsAdComM>@f)KLtJgh;Yq@*`&;zgJWCGRtg(SIcBUlb7YiP`QT530l<9;9(xD< z&-^$z`p)34Q$OQdte=3h_l*DGkAu9g{IK^VgtVoJO(KEc{{4P_#}5n*9X~!~SC&gk z===AqN~_A2>&@%9RJevHV-?=a*VznKllT2)gd|NN7V&o++yCzi6z|fPXZ9c8Ar>p7 z>D03OSby5|Ht(wiL>YTiL2kY(Ut#mUbC-~omMiQ6cM(JTkNMHOFVF1=Jm4obiEU~0 z=PRUUsWDsUoqdr=Wo2)csHG~Y!uyLmgssF_Ud|udf85XSzyUvscdo_{ms@T(*-EH8 z%N0_UBv<0SKAT8o-^kKS^)i#p8w^lR*4XVeHFi;ayvUvGHP~Q5;Uur4quNnXU0soq zkdTs`kRYsbQdkGYk+=@k75ISzKM)G>Lq|0=f{!_o)fJ8iZiV~DC=7_;;`?59yc``R z1kr_PAR}(9zxETni?^-b8+{vFKcivvPggfwi-h;1F8f~m2?r72&@o6MKS9$dNjb%UfK6(8%{zLQ}ut}s^#YD(qeGFqG{iH_zky|(H8gUgp6 zJlJ?;DfUvPCQ-bG^%7xuPEj4-X)P-&qr^`9zTm;-Yxf^)y1bO;nfxS6H*Q!OV~Z(E zqQ$9ciUdKD$W)$2mpSw68~E;w+=WxT>h+SPS2sSWueago(6UrZdICRAks%V{Cw>y_ zm^reNi@Kp}CD&_j9=sLv_r%(hSiy9>nDt{QK2z2o>`a6YW;R9tP*ofE_w4*rRnM`8 zp4=GwXM(Nk#Vi=V5XZm1Ij?^Ye1yh23!Yd1HM4M_K8x$}b-ka;wUjE2O0!s+k)EC= zPctex<>-AeS6-T4no%OQDwRrwC9Nc#gJ;`M#9Z0`-nJ=oluE1n_Lq38l(*Xdr#G$H zVoRnVG6An6>?Ua$IJzLMElP-MQy0DxA)tydD)tD$NmQ@*}Gf z8l2URI+F%}C~clz%jcO!y%eY{w(K%NgR{1=DX}_Qq?D`VwAM;!jd}Q>3(tzPY)UGM zj7dqv1z5Mg6r>wP)@;gOb09CdGNIaZLDSCRS^c5~GMhtQC}^swY^V`dN7GpN9|cOK zMx&tBnmmobfP>h}`Sl6T$f)?l7@;}GAgAOyLYJe+Qwp-UF`4l((aw~n61xdoL7E8j zmbkdIv^9z&S`L=-mcUwIE-&IYC0EBJ#;3;RXmWIN3TLavvz)v@B#2IokBoFCG&oEa zgNe@KYGi~)nTMyIh{_Bc4r=zlC1`Lsn@W^+SpnUtAJSDPaGZ(i4dMJ*XHvP=Ql&|0 z6wBO=Dswj~RR6UNM}AqgFE(xGq5#;nnu~4lfYn?)!QgAJ{Ut)Uc?NFc)e-9?KAY)| zOCOH{vE2{|ad-pSo$xi@$_hkrXbRyXo5`xd3r?d!txVjyJxQg}87MymnY8sRzNa@j z2e;sRxhi_dmo#W~hN|=16O}5A^}kR>p$VUp&huxh4BA{(lK&R`KyReH4v2^SneD@e zJ)sB!NEnBr;A8A}3ddKmFcD3FgNVWh{u1zkR>(qpviuU7-)An9mx0gu)N@1PK3GtZ zb3nt;I^^ z7Hs4lgEjNGFG=3LJzam{t9=u9_>s%cKo-hBtvo%Eoi?GM5rSe)e z?^jogE0Q$o3XFJdQk++zDNRpLl4YqmdG-XGgc^CPfGo(r(fxJniHh@;HC9fk$*ME* zt$xO=EZ?N?CDfAexd*fP5~sXKK@};?I-8Y)yf%|5w$_+dL2G|&zJ)dw+A7P7$_qOx z8cQk*I_>S+Qf-BzR9tClE7jOIRhqc|EP?E!(8!ha%E)zrawSJ8PfwK!q^VY87A@DO z7RYT`_$-4YkOS|asbn7R6}|;hN?K5?Fbm8^y*Z!GH{%Grd@Cp4YA7o#)LP5d;gU$8&AwK$7*t=5ym$`*$`nNazY zsg5Q`sgO|bBvZ>9D#}E}j!~k@dWT&^pcTi-l*-nsiX=k0ofJ7*svIeVavLeOw>rzj z?kizcv(u48Ak%BIzycrKx8j4{R;vM5P^(rdbJSUKIyP;huT;Uo;iOp-fkK^UvKaMc z1@zqjd^V)fjz!RK$HLS(Dv}B94lGPvInG++PhuG=DiVp6>q)t7=ARj*8Kqh))&qvp z42#Src{bjh!^tsQRCpy|Ghvsn*$AwAW?a14YR30WxOnWgP|`9b8sn3LrcYDoXfXlPd&z~rJj8px=+{yAe<8rk8VN!)i6U^^{ZEsLyiwqN_;+L{MuKc4q(DD` z#<0D+JrE!^7z4(*;ciK`dbh3Kd$+7&*|IHnW7As# zq5LF-O*SN(ve|61se7}#_n2qcd;d>lf9sJfjn14o^PQtpzVChCW26^GpQOVKdNl7; zdYMr|%Q>Gw%wjpkIf`T>rQ!)jcNRPJ*xQHaeY2 zC&FW1F1;Q~K0p^3vcd6SKbM}JLVf7A_M~uB+sCD~^y`pCf0N~auQkBkPtVXW0*WNS z&{J|Pg^;Zl*2)EpYIU2ufkd+Fw+^s>*gjdZ2AO&} zfw(OI55mRffE1q_Sv^i#xlO)VLbo-o;B}Q zpWJBs_wi(#fA2wjpQN&}ku(A+^v~Ma4Qsp+XFP^a39<)ZY4r74$%ZwTRXfkWM(_k0 ziI|F-qFv$6bIoHrEb9!WCF9z<@%@BM*4?QDp^a^`C2L}>^}c$d1$(2kdZXdr$C7=s z{v0tgC21U_j6iMr_FhQnl?t6=qOwVFKuc{>CTJ*;rpUu}o%rhAW0MqyFRu&I<*6;ZQU z($Yq?V8;Td$Bq#`pHc6H$*o}em6=9=jkmwjG4yJL-4W*3X`{T;gxNJxv3 zVekixeq!uGw7-ukQ@&MGMySRNQvN=jzAun!vx|F_ z0!9nQSHX}{OyB>j$j12GzaYN58v4GE-k}5MAP{9;P49+&umZhCyI$OeB3r<@<-Cse z<&g_zn-i#^f6fFw*|y6Zja)C0;N_|2qnUoMKTV!Y9UhySU`|eda`gg{h-oE3${vZ@ z7)dGL-$HC&TUuE`?cPN%cz6xb(%hT%+x-q7)#VB*yoAFBXdLQW#Aeu?mVgWQ7<;;$ zq{br(hw$OEU-V?ibnMXiv7s~%(%QihN_~@0>oEJBxZ50sv~j^(;U+?^Fm$S@jr*UZ z8GAOCt$mrE$6v`bsDCwAU805TpWyJL?PFQ|2w-Dg%1)DqFMa%vOEXLtFjxFUYFI7r zp=<`2{NkN&Jg-%e1|v{MyChKwAyam1mDF3c&(e!qHZ%2FMTZwWSlG`U4I*Zhy#k>98;MGEJ(m1`9Uc}HF)LnYKD`K--$l}+6 z!W*Sf)~zsGh1q#ie;arvpM=@-lk_S+%$-{ySO=c&mC!jhwxl3*2gkt$zN!ya`c3_S zAy@%D-}Bh#H;M{AM^AIm`XlA^%MeLhe2!i}gw= z^qU7}(K;yko#klVZu(W2HZ7Wg+t_#*aRFeou@t~NjN%s}LcqVJ`zPfX zyX6l+|6p-~+PKi8KpRli5{n5CfaZvyPZLygzd}KVwUC|rgM`jR>=|=J&y}DI!&3NX zIvDh&y%8IiE=Fdn1#O_KJU{^tdbo5I+F-FDGhJ+pc>8=oE*<=;149{!K4Q+;BV0No zfj|uk{#hN=qz&*HQktv~W8R?f2;*8v4|$m^2=bNM+Pn%M_bEEaFcwBpMyhW$OYPh! zoq-_qlTbE=lBban2nuX8(NKD=LMT*#Kc$M^001_2$G5Z@6&s|QHnoC_f=@vRHWRf= z&8>PV7iFRhQxP3}(x>q9Z15RULT6%|00&oUU?9bBZszBosR5X?FBuY|^KoMwod>&p z32)dlDHPpPxtk)9#z>}#z6QOjdFO&}Ud6Ud+FoouCB5K=rH)|!92Pq4^ z0al&{Qqe0<%lg{K1mhjO{8Y(68~hEFr1(j}IDeu&B~QuYDyG9=(;INT&H&4FUbDH0 z*k`IRHgy78qp7o;cMvb8|4$C^Ac$Et;Q=O36&MqkCsA}e`?D0p0~(KaCV|Fr{q#rE zL^Pz3P%SUL{vs}Ll?@GNj%D1Wv&R~bCk*ifp0K8~ez#8JBKs@7l@nD=QO^*FE%XNc ziHvAi9HXko5BMrFObs|219+;}87C77V}eK|tj=C4<35%d#)ry0d~)?`FE$ZUMJPfI zeEi{ucv5?;vA(&iwTtZHnRspO*7gouqLGM{8jrV&?Dls1bw25kWQdn$#>9=WR-#>@ zXm5=*0=96pc1AYMV|u$iK)VtGv6|!ytbC%Q-PA3lT03{P)Z-|9os&(ave^{BsfnL| zrXbQtuXqVt1dGilo=CFa%YjPO>Fpo-#?La@U*wLAo;oqWES2q*Rgr=>x`YC}Jl8m_ zBH8a9@(&Fi$Lszn&qO6jO-lVo7wn7=h4&551Pl;d&s*(`vcWICkNkko%1k% z?-?Ea65lwvNw#mt3rk!1N}cgypg(z*>4_)KCh)1MY@MI1P}Mf=#+#ybzBV#+uy@Cs z_`Z1E@z#mTb8n73SH`4of3NG3hCJSNLUXvSu4A9-Q3dmLZJlHVR4eH{qo4daBfqrs zleo|5bBac;@4PJUON+jn(4Sf4xHLLAp8CuCwNo`y2d{ja7#kY9$WDbbh*^#u&;{v5 zyD)Zj*j|PWYjUbVn08s7^}mYoFzyx%lAYU$)q4-Vh{44E1jp{P`u%uJC&TWmImcBr5Zy-)a;%}SHAFy3GKupFP)kdN{UVH9kA+9#hb99|3k)cBVlU?ZoKxE+5i7;a z4tbYQL>z3N&ZZ($0|Bp68KKm{m?ld&9cGJ@dhZF26C~bJVY~j;l%~TacPUA?+@n_G zyn1;@ZDn>mH`LwhC*!`Jgge13R%V5$^~6!AucIeUh|pGWMc`0FoiIEt^0I%v8?7tH zOr7S=PP`^`@9{&Yjt`~C9hg00ja6Z%I}Q=k-t6eGW<-@$VS6x9P_z6%uEyT#tswSmnriF4b^fM}SdXGd!>p0M@Hz(g#UmVPjku~(&NM*> zr6=IRB^cxb=Km}X)_(^r`2WWG`R=@}L>RRmi;Tr4rb0{$bhdVa{Zo7|RxI#N_y^D( zS!v|dCmo{iBhu`c=pO_AiA5Kt&Sj<(Cr0fNT~zUjBC3nnM{CihWr^v`xheMb|GiU< zUMa__pdqq%VP#lOGn{XPufpAY_`gfla6enHo!CKdJv707bSmEjeSSQumtj79@K`!C z7Tedr({u@RWMfxri@KTl!4n*lYuJ(Q4GnNzL5DYNgX*-JZN%VAQ+-QqMYBp9@XIN` zLhNfGy1VnvQo7^=4*RcgwWPQy(A2FncN2}BnZD6*b}})mYN6zvav3i0@Su&+Y}&!e zUg$q{C2O)SdDXLby8IZ^5{+4+#PLJg<|&wNGt?=4CWDWAM}1@D@UHCcO?a0Xyr-nK z@X*`mWB)hYw7I2ZU6aMQUdQW@H+Ly?8kvFFpx!w>i1&{k8t}Nfv>s9sic2O5CwRi06c~?v{eK44 z(3bOo5*6OzlDQPnj@@c4-dM(Ktr5=*rM<4CgB)~a`h5dTNWMvJNAoxxQAuxaG}_xM ziFR~IBpuMT{umd|J@Xw}2b1hQ-xr`gi@%?H20iy3{Ty1i6lnV^A434qFY7GDtfI+% z*rM4|EU^z`kB5A|`0N~)vva)d2emO2A8?lOS1bP^_9k59%;9g^0vDLEL?II#JzMPPJhIL6@$b(zUhf+Xy)SnbLSyhuKTzv)UhbMLbR`neZmvDHro(@FU*` zcq=wlH(a@sx2u*j*Go4GrlkqOzf(lA3$W!b!#x@mLBnO*XwG8UBOk>y(3Fi$D_n-ER43ceF$}bZ% zD}_oPrD#z#YnzyFFXLE!S>vE7Yv)?S5nK4znl+?Hw2ge3O3*9}1b7q-6aFUfy)OC~ zJc+^tKgQ(8s`C@GTSkgSBC)Z^wiYkxZ3?!8TA6V3P)g&Y99x`GgQ=pC07zKnP49@u z4N-qU%J{Vj#C7nsLFkuAmH7nF0Chs4O`=jp7{6w5p%K7MaY4L2CFZjE`4*QFkMrwr zu@r7v`gT9KX|sxcd4@@|e$T1FEHarzM#yC*qnt9zqy`zmtMd#}tr(0$$$_|1nI>Tf zQ)RXJ+x8iaO{PYB6W1!UNoDz4fePbk>l*p0aB?6J52VRpzkk4!W$w;#Tv~y!T`1;r z`C@)`9U+#&9lssv_flDJe=rkb7MFR1147gsL-jGhaV$c~FlvmjkE6#v2PGD?cm`15 zY-Pm5(9fb4GX*QH-vvN)4ZVdrW}N|A2Ktw1t1beOnZ@ecKq&NXq~^SH^zb|H9NF{co4d>3e6#!ra4P8~{xhx*b3+Y(5%u^_RriEW z9qfU)>t7m%Jfcxi|A($Ki{kHFC(rkGUl#NvrfSmaY%tqC)tpXTexqlk_xz;wefAF@ z{qWQrb8b1uW_JPA#TyBPLVE zwI`P-jpBzz>_rMp!Lo0L%bxgGx&e_B0WljoliGW)E;6Drlwh7jx&owvn1h zcaJ{CH2O?Fzsuru;a0N)7NGmIZQhoooHW8j-9|wAYfk~8bs=Z-m8Me{Pmdm&Cf#nY z%TI(oN;$>;e&-K%fx1a9A;s-{Ws9C!uaof_@Tvj9_=TgF&U#5($O3(LraRr$N17Za zfJKEpfe6X|{-M9_aN11<2Q?&2)>gGDAf(A$+1aS-pAp#_bx?AUDDA*XrcC+DMDe(%p^Av`SFey7tjEcembR(@_m^!RSOL z80*1@Y6luC_~q3ViG9PZ3mx>2^grrBKcFBl?b-dbJ)_rP@ z8HlJ(8)2Hbdgh(r_)eHptJ211+Y%+p4 z+64|Tk`rYK_n^~j*O-kWvE3=Aq)xe8;RQ$yP@f2+$!yH$Zltb*0Fb~Hj}ysZO|wL$l4!eZjxMS> zxzAarf+){nj?ruKc=6HXr?cURQmRxb)jG04Szn_Au`7yxo-?U@d)FRZq>>6HstD91 z-0BlfD^zS&HpPblTJsg>Kw#VP!+4KB5|8?&QWD|{-FQ>DG6j>`d+3)qR*glg!D|K2 z@6Dfm)h&|-A_0HE2W=rRJmwf-(nXV;ww5YYH6f_?4n+O_sK;f{xhQEo)73}#{TA>~ z71NJ_hh!rR#@9y*-bcUTUz-BG_{zqQ=^;aSP z^A~uj(vs3sJpTF3aP`+e;PJkH1j-}VK7Y6tEjg&^Te@RV@cBVa&#SM9JqN#tpJ{kh z;Hg90;ZOGhmgD)oG;}pSXQ)QLx0=ZvuC&W_ieb$_-oPUC8?n9=RfXAt{C$RKmNE! zJHA4&^6;N$A!P96>>m$*E%1!5ipT#@;}@)0xySJ{Klp43oOStfOW*eG+t0SNUETnB zK6{FRPEVw{)9e?NYunz4&s z!LfaIWt_39sF;2i6o2f)7wJ=a?e-r=eK;(?^w~=&oy1HWTBSqK6+Esk?B2 zQB$;O(`fC<6DN0$j&8ch7%RH4d1U0_pBY~i*(}#8N9ntc2HL+I5-0!jSWxo8)tK`5 zQ|%40FB8h6^j&qYOm|?{rqNw>fum0+hGJi}2adni6TMm%6#Qp{IPvA~KrMaOE0qQd zWcJg~bt9WML-rRh){d6$EImhb}JK4H^c;gDpN#X zdrcJB^;Kd>{B(O@H@a)&+I}_m%6|H;5#{bL+Z)7BC6v3ag4egyFH8&3r&;tTSU3G9 z%buBAKF8*Gbl~o@3+)=GBFqKS)KNgUBd#pi?bXM*w4GkX*dOC~3*$hDFlakL)UdPD zVpmhw=>O)R(?W*cYjV4Bx5W(}Xc|7R8RB>xG#8~{Zq+T+bCHUEpMxM9dmP|I;3|X6 z8BdRK93BWCt5SXC;B>SzZvMs(SBNvbMKrwH)fSK_h3gx% zB>IT{h{G1!yl$(TV9&VSMuV3ULIE{}^eFu(Tn??$dFT|)4J(`)yO8_M6P&o-+Z~hv zhc~rE>tGb`%-iC|2GOEJH?{zK609Go6Qrm_JE3aPu!&UP!&)-utS<&3l~ErV24BWZ6Q^* z#3tsR-@=I*PBr=E5FI>p%MSD+mk@~Lul@zSf;hlaMX$e&Ub#01M61`>H2Ma7y0xmt z#!9?wr26==(TStejoBJMiIx|kC94@ms17Z@d*Z-RpmiS`9XoosW^#9{P$d>oY?@yD z5nB8aLm2PT4iHC2rVk%GFkHT`vTC2kqPBHX^paH!w4!LtH#j(jAFG`xE32(4tIRfz zsY!Z85xwMNhRtPld-0=H6T2bzvYOhmJ>v(C^vC_N9>^Uneu-ZE5~Eir@&H`4u3}Hw zRQ-`d(-Sj3Wzg-Q(2_qeip%{%2sYlqLwBG~=+nk;y=7mUTZ#UQb7JI3&$)2Fd%%^7 zhP>vOC1&xOeRdBMa7|V#?(VX5X*4#Qmb7U!b`8;5S1OcKtyL`tYnmXU-K_;_WhWRBeHYc&i<|eNlF`#TV)^&tu(9bOpDQI zHWHntt}e9!LR6GNYXCXi){}K{IXTgqYsuEQ0NLl%G6yO-BRhM_!&}`guI4D;qllOy zCcnuKBR|t*1^W~9+D@^r(435Br*-td*jOR`+{ zOrX6g(MBkNW6}xubZw`yi)nzlf*#j_mqAZ@)lRit%M^MY%4wn()_`%!IXGw^BGPH2 zE=`3yIO;cq2U&df5LnjO~3z53f+;OpM%%FZ$G&9UIE&4p7ZA| zj9<_kNVMEmxaobys*eiSUSoie(j)Z4^lu9PvVn27u#cYRpquog-+*}0!`}h|?|~;k zP2grxaS1?}K1c6zKnk^hFI7l&0&aa*U-K}L3?;HD3N1j7$2zO&T1HJ*Z{;*`I6OJt zN!6g*s2licPcqti0_|hOQ13uCr3i`w6ulPR?(RX`ni-SbZ|mO1FKjdJ?*i9GU1twO z_=8z!~WrVTcz0I@*-|~)U(n+GN8Tj2jkL7OE7QBD~((GBlJAnux zV4r?PKRt5`{Zvi^Dhkj~#ls*0dDqDNT+a;>aeqZjbwFT-iyA;Cz67xWq$C0=D-KG@ z^$@)xXd&6N7&HtYei=h+0lfAQy%ru1ti~V$^8mUJttX3D0l#`3@T=F|SpTneg}{nI zi(2~Uh6Zl2V*1(Q+z%WC(#^&*=-i`HZA@MuAL4*=j-B?do!KW8jVdzIG zJmK??g~helY&FNH1lndP3`Gxpe1yCFG|2o>`Sv4MFF8cBzM@xMS+@Dv$LX5-=kg3A zIR9HXzpD_qMZhr1(~Ex2(~EBY7ZmDTLGA<4T7SAXe&1Eb+(^;iuXOal))T*ei^%f@ zIX7&+fbRQ}F*j92-}jYJ^vgQN&0JCOP52e&&~FRSFA9#+$DkiLx)W~f9vqQppltUX z24#H)z5Olvj=O1)?kk6;xd3g*gXBVgPXOT$)hFiX5~y|()h6z|>mPsT%q=X`BpCOU z{|POm5cbWUyQzeRF}DzOY;AyonOAeKf&0re{Im*%fpl$jkFB~pPcrE{p=AHeUhI?<-BQ(QK-YO}CXzwV<88|LA1HE|y{0#F@IS$~@JJ39O z`)RTZ4&PmV7Jh9cPTx}s(cAk$nB?ZU-5BC7M)M0FL_huw{mi%*1nhnW)4=iE;(r$Y z4gGjO9K8?BnLio>L;q(1+PwIu!ne@E20-Ba4o8ayemsU)ek%Ozo69hhfaE|~zwL#e$%hM1(zo|LN-x6c-!_5jA-xdNTc5+e zL_`5Pu{co>Gm*fnY#yA;jf5BWwR4NNUHosL$JzMm;zVwe0a;4N>`a1q>QHi-^6_j*` z0Q=j6=sk8EUApl+M+bl{wv@ha6J3r!^UgiLeE;^ft7mva9ez^jl-lKhMFdSxa8aJD z;>D+qja)+HAayGb^xlJiW1svizb^|rg6_KrRrbZ3|Ga!UQcd2L|Yu@kXEtyBndu-lv*a~j-yjSOKnzw!4?s*lk1zi0+F>L*I zc;1Qmtogr#ZQK51{{8b;&wpk9+W95(%V3MP>iPAsL0dQM+~k^{hOOAn!DeeWVNj4U|5;Ov4c3$8EtVZr|t+);3M!4n0~6}()q zv0z)lzJkUAQ9);cvA|joDCjNdFBmD9E;v?jw%}sHdj;1DJ}daP;Fp4%3+FAoZQ-JY z+=bM_`xidE9D52QS)98u7N}0&bL$oKeORa*By!7H(0M(bAF62h&nmbNV*#k`X?W~r zq4mo!7KrKYX8n4AWWnzqzGAJ#?#CX2EYSliFxCs$QjE0>qaR>B_HQ|5v>udp*Rx=7 zS`SA7sJl9kM1B%wo&+=iyaUwlYQ{mjobx4W0`T^4kz9Tjb)2O;K%JHbJDzi}fLQ^YmQYUzuwW31<}9OOfw2lSjka%BTT(}9NCl}r#io`{mFxDPS92Bm^SZ`w6FxK`xc-h}t$91H| zppvPi8Y!2xG;ikKmfq$XTxAf*_}VkE9tWVW$Og*s{!li?-&@v{kCK{<=G(? z=>Q!?(#uYBSYPC|8!RFehXMGzg4~as8{Z+zzu?KrgUM_np#|cnMG-lxtxfoE#tJL9 zD3@cQpE#^Z2mvlSfNjTE(LAVnb-s31pbU$n@Tmbg;tR5ZYM(-(Rx3!B!O|7eL^WU- zBZFl#xx`+HSIV_p87$HK9ILa_0YM0d%|Rt5M*I*Oy;ZnNqVuj(XJ__770n-Q%K>(h zCZa68#3-r8N_zL*3O2IN5VwMs)DDbgk6NQu*r|@0TTx3Ebi!2yEc6hk*A@510!)?x zmU}&fqevQJx!pPl?dS|Ts=caC1wmm}u5Hvjb71D=sj^eH^V`phF0rIEajT;`bI%W7 zpN5W#mHES!5hx7?1j>7#d#BUIYTpv<4+O2=BT0VCFvZ$VRFv#$;8U#Vt*u0OBP@x| z0(&^5>sajZ-4Fs`(VsO5ZzM$XN9Hy_$?m0D?`%WZ-kFLSRs<2ZdbJ(@e3S)5pgh+n zPX=P4jdUZ2MXNaQj-NtZDL&fB;>-=t_1_#WD$b({OV&W{zI^Waph8KU)zKx?h?OkR zXcMCaEF_+5Tr|qc&4)^3Sc_ONCy~?eWU!P9qo!Pt>aS;U!m_B=0e>uxLl^ag;g402 qTg(c9=&m-Z4zPk|v|#n2p&*MMW`LkWF;GB$AXt92V-KooOoRCw8O6!4lEIOmvWnz070C&My{Us%Y5K^~=ic#eF8Ou%x<6 zB(%Is_ujS+qbAO9pSK_|Y#RZ-QF?NklrKnbyPjoKs8c3sV2&ia-v33 zqbQwZ2Q`|?rkp7~B~S*cnR20AsWH@8s)cH$#!;83snlhvjao-tq4rQ$DH(N5k|EhC z*(KR6*+WgDmQZrahPqBoqb5*+)M6@#8c$86Hd4o_cxpPejk-Z?p_WnWDK*uFDyAZ+ z8PsZO4V6c2rgABo+C=T8W>Pn)Thwjp4%M4Vp?;uZC=FFenNdrrS=1`Zii)PfD2@uD zW=r-`2dOlQrcwNneIII0uHQVi9ViltJi z&eSo<0cs&-O|7M*R3a5cB~eo-3o3z%q`atn>N`qHJ(C=y!l^z~FRCZijgnBols9#P z>Oq~Pil`0LQA$ajqI{_5)C=k*^@^HIEuwrWKgyqaP5nrPQUTN(syp=$iZ#CQd>m*C z^+94QnIhRPd1yAyY^&5rf%31E_$Jf?y9 zQ#M8xAUi0#Zy~ctwJ>z*(`ig6_fD%iZDS?uEOv+7UcOoWpU&xB26S1{rKXFh;1vB8 zGZo7e`xKA5_U-E5HMwg}*S2omy2W+-p<79}hHn3K-_||Hvae-;Wr}5afaNW3NTse1}``xO$)i5g$t3y`RJzaVx^}N#)ddYifdKL8MddKxX z)cc7_sT!^FRlQJsP|MT->NV>9>U_1nk8__*eGc>~?9umPeT(r4v^VycO9csJ9wzXg9e*OEo_501v z%+A?vuU&y%O@Fq(bN|Htmj`$cI6vTT`_A?w?Y->p4>TXxci@zPX9jg0G;+}HL01M( z8oY1tD+js5M29sFzejl=MNYaqPp}mKO4=ouc8>SgHVA$+op2LEMtsIs*Y|pSK z!^4N?j_5q%fa6%lcTSz0?444a_Bibw*?(ln$c9n;sOr(&XrIxUqhC7n&Y{k0owJ;; zJHK)M$ECkZn9Bv1_pZ*ayIp@C(`}6Zm_o%4J(%mELND0`Atiq_!BXiiD+tk#WGca& zhGM3QnA1bOVX5ASAxp$PG}-748ivd?`qT3naD%ZN$e}Ik0$@mg0Y(^yc>lzZX+}R< z%fNI~*Jf~mCKqIic`PI+Nwh2u&Wgx~I8 zcXC5nM)__Gi=A6)*`B+s`m@T(AcZ=RlRBE@itAEX=y-Nn!_!7nSDPE3>h@t*Bprgj z%;J12!WtVZ&Nns&SNQq{2m5LoGq}9$?7Y0}l!Sy7(b&grX~+4LQ-#SF)HlywIe&=vJwV58jtvh}C!}T{OW-q;VlzY3 z3j+dulKFmLZT{^nK!C-1OOOjt))s$R`OifwXkeh{kCi|@a=++)m{*Frtg=gb705>w zlg=7)()*Foe8RF9DSSWX*pXq)k?0ICyvw6*&cq zK{lotVivj*8P3}&f^|HN;oi@T0b>}&EEasl|8h|MSJZuSlJuuZudjW$;jCgl3#mz# z%h;aa{DtO}|HXBX!5|{Lm`xl|oX0Tucn5m=*IwT${{$A6pc3}Ky!vW<^D~3;zv=MD zmwwzUuo%sdLBxW42^P)_8SwQmHyI`RYx*!2pWSFRoE7cGHttXn4%9AcD(+o9_~>xs zOF&|P->ymvtzahuqe0aS8z7R5Y#}Z@iS=$LArpKa6Q8jR^tA#Xn5QH2AmpVCTz;L4 z%Q|k#bmE8;(**WS1|2vwN*-Mj`?pGW!6NP@Lpl}zG66=YpSKrOUgOtP(_voIW2dXF zM_2#8f``paUK34DFQUQY>ihTOLd*Gyt>ES9FFWI-&6=nt z{J@cfiRR}s2|o0FW_3nFM!LqEF=?SC0{93L=q12t;YUHLw}N8==?P00^|si!WOYRHfTv>6Wt@$n;N+O+dwjnwfokf-HVMB85b4@=Z^{!2Pe@( zfnHi-1*-)o@P`88KT-=Z!bH*ckwC(W8_o@_8jN7WE4;Tpayvc z*a>_FJfW)uGFSVY*-jqQF}q0T8EgCxZeUlk5;)l+h1n(nz4S5iE;)|^IvwTHiBM5g2qLS>CXOhZC~?D4)o%UTB%%PXew(A!uL`B1*63Wi5-vIaU6EF;Cnln&PcC|YCh0PlDB4^0;w(*EtxbL3Ho!-N^tcs_73Pb+`xzKuRM3?S z^b-~IL8I?NEsPQti@r4i>CX@=@*C+5ztLonw%+LL&tUsE&2Zfy-G^IPAZFqe25ODT z^aF7>zQBGhbTLk6NR7CbCL^`ajJ~LiGMdBy-NUA%^^$*EW^k~x37gI^HBISgsw3Nc zz|1(y)HDs7`gABV7$&~ta`)$6Y*6RtC8wO?Q%~k^IH$f-dZqjjzvuuRyD>I0RJ~^H zv79yh(WKZTp=wXRK<{KUAA*=BNGb)<_Oi4R3OVBX8w!*YIRB1YZ5&v+!!)vp%$Pu2 ziH%0E`lALMP!$fXA;TPqW`aHGLOP9k4>lUb_j>RUV5QzN*8m$0cZAc1o+91A!O}Z! z0?gIAPlo`R@;@-#-T=eM8HR*TL+$K9`rbwNz=ucI#mTE5Ln5q*>U+DpFiHgzKVApb z7L6j5g;hz5SXf}%24#OOzfZDEdRk?qty#QzI}z_WeWB;DQ^@~1N^U|YNu~bX^DEEW z4N~~&ORr#-3?QBGd!R9~qXx{u4lAL=nr#(_W2ZAv|7L=OR-`883*uVgSd!%hK^)qw zY}aq$Dpv>(=#>?XDJ^Pn{teXN+LZRn|2p6Dc9q2FNtj>WY&DrN3b&SxYyPBK zZ~oqX4o<`W=(9fi=LD;Wawd_Ho`E5mCs$~~&T~;!$*pawH#!&r!*u1TYl=)Sd9D6P zJ-*5KFC3SCzO zY3Y%?d_J+7UYEFLW2`zh{@}ql{!r|igVE}=w5>m+@yhz6`ws6re8>U@qblwUQ^9Ex zI1o27axfW8MiRT5go1A2{OZ+9R!5~+tbnf^SiJ-#>NDj7(iJ7djr8@LGn@26>C%|q z&s%_{g5;9`X9VdfD~J}xfHzn$7Z$%Ey)VqNfS!UKvs~}-OGur?jXgh=Kxfs9fICE? zA$o1Q(HG5SAHYqu6b8udT!|lVZMSC%9~HSHO07t0N=y_>o7N{;-W8(tAm}3mkU6^ zlsV~5`k06^9?hVqHdux&PKS7(#ODuiALvZFL!Y?UoA^hYZ?B)En&Y+1R)c-JyA@XW z@wdFtB@+EySd-^B>k7OD!vw*Ju{B!U9hZ*%|+Z1@qKIK7O7Zv4yESfBc@ur#Ag? zXX`Z8NJ6gkTu}DtE_*`cHb8sz*I9fywo7uu%$Mtn{SMCs4_Nt8RJzc1Z*2#gkrO`G=nD z^8R2v)Zd!{2UC30i#b=cCH(|{GW~E|xGHi(d|bLFJwAGCq?)ME-ZzTTg5-S@v@}VN ziMzR{L{b=2-ekAe&^06(%p!n}vlY z-B$9~iu>fSNw8{MH1mrorqP#exP#V0?r&dVivLOptsJN#F?aQpj4*-D6;}c#OU&ka+EH44GkE zhIW4${f9u3v{xC$p+qqx>AoPzMW4t80;JGwBX9qnea;3r{8ouS4w3VSQKswYaA#=uM{p>OC(fcG6! zXqiX`LLz-vPnLM!!g!dJ&}16vVOn}IP>(_DMi$#Tvt{UPL+xKt_sA(z$olQB0yw<= z)0b)JuXE@y0bql#GbRP#V|$4)@p;>x>M^Ce}nw z`hh$&nO1BQV5A=8&63(?xFSeDz$@-f(apU2?Ju_1t=K%!;$Tp~u0S>EV!e2fn{EbJ z{Q6L+DCAvG?YqDh**|kCiEQ$?=rxNq&`vgU9=WV zhoF0?opBP=49gARfRUHsN03?8wluxI_A1Aq+>j1!VgXL645xI+Qg$Ax8_4p?rt}G{ zW)M4=O~WmT3QdrlY=-%0sB0f`zPU{yPt?^lhYnrfH|Xh2E5g=CsD}kVdCnh(-Lii& z5)t1}s=b!430}<~-Lg*Spw{}XU%P}qedlPT7r$CYWErGK0@0{OT@P=| zZ{G8&RZ|RF?&|JxeVh8h-Z_i*@njFN;Sx54&T&_VtSqSc3#c8BJ0?XX{=z|n-JxQV z4+H5b1IB1~sJ8eyf z1{GP*_q(I2w_oV3`$0H*QC(9MpPI=RRndjffw@8I$x|bzE;+ThAe6WE+~T@IKe+jc*PXfyCtmF6ECoAD!Op4}h1dsreCzGBRil{60QOQ{NZcWTV9#YS&=p3|3Q?X2$CD)Q z#1YbW@R@s5aHqAU<UbKDDTL?RoX}%G&BP{E}iiXIoMS}mntcIhRIy?{^Q{_>UP~bpr9X-{EG0#tf7QM2XHJGGCv3LfyD2&%T)jFuD?6UgN{q`4 zQ!nz4a7*B`$-E(Kny}OWzZxt*HN%%n%H*7F9N67vl+|mGUYrBH)S!8bI>8Ja>|dj@ zHusnto5Dj5vD3bmDU*%aqh!z@CUBqL+;{_>Tb&1Q*C?y)wvU?OsCFIF0^QKB?EB@0 zpEYDUwAQEFinM#{Z=GG76I1^yNdd1adL_oeZ0} z$Fau}98|52yt6;ILt|IgDE=@Cf+tKr< z@Yuj1DPeM~rlZ48x=7a4ADPZAl0o;K%r@9`o`P(##2}!y7FJ|aaL?Px7HGzXEdcuA& z16EI_Fp3G^?!7SGi{rdu%9m&|#T(eKW-^8N!vzUKq@TEP=L|8;>ifF-)@*(mvno9_ z)LXqYB)<~FGBPaj%iDiv1s#}VzY4H|z39lm0n_9h!*c^gr;7JvE#L45tsD&bos@zM~LF-)<;$GQv{f*l_|}GWTzJg zWZ@vE%_QANlOFHK0+Wuj#n7$d=_r?+V*(fsre5l1=??@Ium6 zMJ!$|c(GNZ5Z|HrcFdi#xQ0VVtTXf_oiAh)4U9xZgW&5(TJaAkFa}hlvZ5!qkR`?D z3t0t3gNqcRi8;Dkf5Lit7&@6XuXXTU-P0<`j+&3PK&qusVoqE^g?Pg_#0E9k%`{ZQ zHt3o;q1GROj)a@0#tM4eZE}=gp;y!vl{7sQvubu8QF2 zUR}BJ`dm74$;Kris({RZ;s{L!SaDC^V)pkD4Er(?ufZt2WF1%2{ zsWwP#lR(!tNV+D4uHpi2$b+#Tervz``H}B?(yjl*af3B&R`q4qpT0abA$*Qsz`U7( zEd~^zbTnD^VBQYq==S3N!|0QkGvICa?=MB&-}kTF|62mv|L*bfH6(K4#4AQb$VY-D zw}2%#%@?o=+eEOg6WyCKlfXR55-1&*3Gem62IU{=pO13-I;JG<_}b>p7Q|WrYZ;gy z(BFNeLJMYnVs@@3{LrYPCe@{@r*3GJFDRWpZS_gsR}Z65WnlaG<4X^$*k$oqYb|ph z6l%xskWIT8{Ksm|{lwSto~l_3!e)4Q<(IA07`##At-*K6_$Y-8+zTH++A)fF77F4} zRZbTz(1Qm%a)-=f6dQ0~31DfET*2f+XY@$KVGLN#1}R2Fy={gQ4PkE)DNJjBarDep zO{$I#oigUT#p=aDdryY(5hqsZb*i0LxYqrxH-JWiRXiY;SNO9qQ{2cw&Bv&Ri0}_Y zKliaMi={)vbsUCiETZ~sWp;<3JNEzl+{?CX5Zewi9~PdA1%B*2<3d|DZ4(Q;0gD_> zE@F+{;bL;qWWEgj|O?dqHigwnlx!MU6<_R~k zb`~^p*9~F%ZWaEqYoBoE`h~m$xot-^e4E_AY`vU3T)jWIu($5Yqjv=2gp@8e%pz zJjd(Mvc0`i78h?T-&C}|_qYZ01X9WUdhH&1A4AG)=M9)NyB{%|^5AFF4D=8~QLxjY z$B^r20*YY{SI1R8+L4C^RHKX1V5+@dQR@YegIM%uK+;BLR2}?0gNs<5M9K5+#QflXGVVQ#6gbET4YHdpLTK|anN?3*{mCzW`O)QnA|FX9&NC*P5Qo& zTY0BtgP?{!FWaHhcC^CVUGEWE9kL=laT$-W*6CLAmfV+JjHAz0)@4DMZ{ zH^b0oNr_k@ZF1p~JZTKCha9^EX1RPTw9}uNea&<~24p9`JCB<#`}DT$+5FKKk6pBO z;nvV_K6u$S_jC^nLNQww(tk4x$o(Y3_$3oMv$x`)0jw^GW~hY!+a`Sj9vtM8p2W-x z4jV>6&)1hmiSkhl$uM@OukFQv6K>Opq9_)A375PTM@!#^bLB~5moJ{7dFY5ZHiAnN zoN3yC(5((W>6Goy$8+g^p6nEv@_qg4X=T&d)sC}=WF1)n&KQ!r=#a$$xc{vKO=%R1mUo*A zo2CmfzzYGh9hR7Tf830=q)zi4jDz7`- zkgI7vQJi^0^6D)Fu(9 z-;j#mLjz~Dg=zFW8N5K0;{|HNnKIE9u-aM{gQPN~2N-R58&coO`iEQSfhhTw;W1&cXEnLJ4xc*gl-F;6CAvEsIfyUhU_ zr1*u8IY~V8%Skw<_94u%L~PeO21jxFP zKrLFU$7Cj>h%s4$O&nBxK+BRx>}fw^9yhuJg@3k*jbshdcj8vAA_WGak+JVEGJ`Mx zMk6!mtL?uPp9;SqW&&ehA2+OjsT6;;8qH#QKUR$KV@>_{>992Y5sWwi_VnbhqfE_+ zqh3sG`2)IPX0;iLE@AM#o?ZGi1H+6-daYR6Ut4WVl0iLE7w$u+DGV|Dn#!el(_8jd zZfH{fnb!cFd2u{(TJSshN9MFG*wg2S{RdZKjD-EJ)qTY5i8%0*R5TOI{%yY++i&!u zH(hM{4%AumvWzNHC8qeNfEh zFFJkT(V4RCz0YmmlW{iHVqg6%t zrAF|Es;r`|*Dav8f%Ij*KfLYSwn7WA#~kF)4El$YKO8=+`lYq7v9Tf6@03QDLpQJX zY#y$*oj=KW?at&~EBRp_e=@scc0}!7kGjtb%$Y-Tz5HkTA)avwccT{7zZNcW1nD71 zjT7e~PH7O2VziYX#~R2C*oOQM9c_@2Ufwi@#mQbUg?uL?y}fCz40`Kn5=&-w;NdR> ziO>w=4KSoxDp)}my*r#>3Ul+$)~atEoV<}Iddx(-!6Dh9!Yj>fd$b7}as|uAHhQhkssC~v^nQZAD0OUaKvzSa+&xVwXJ@w+ZScd0I;-trV! zYdh>~!*4i+jT>nMW=hYg&lYb<%j47Xves9q+bS!C9Nw=3n2Cx|C#D`glFT2ATeE+O z+Sex@ftl&3Q6R3#74|b#7jHFQR#!D|n8TA(u8Sb1X$<7co(0zpo-r$IiLXZa>=v>1 zktv_PBtJ3AXU@1>ydFj)KrwCt*T5WvRW$TtwvttJ1G5(|{?t1#yJ0l_v)+l>12MEO z^F4{7F_FCsFBUP|@WR^rA8at1w)cL|==IzltPOS@C5lu5J_?dcdeN*^dI=&p!hd!` z%97^8TZ~3+?cQLt$=i=2{SlW0=Fyc;pB~L43}L5v5vlEj7LaKaA*?S8bH#%k6g*$? zknAH$nwXJiHf#tB!AW?}$>g8gBG=2BNRdQliwbZOgB&P(dLgMYRl5TgSnacz#XSLw z@eHQ^Ex2c3F@~`>y4WC`1w&dvEl7&=;HLw3gl#Y1<$Oc-leE$Z9H#x3HFGZu0`X8---@v+f!X6+%Cc8;6CvJmyD15SSObt%+XMXZfp9-&%x zF7A9@-hPB;_Z#T6O$i%Q)N3~!%spS5ed-YZZ9<&IpD}Z6LZA1;AS5Fh7uz6LMZAhW zQjsA2)k+*HkjdgzhOF^5se-ZRXyX>*CQ}6Jmn6bH9b)QNk}UtyiPA=8P)#&f79(bU znHgR}8!sCv4i4!1Ln~%W;*jO=^HG{?9Uz1MkdK_Q)EAcPiLLCzPvvEIRE8-1%&>^$ zs5s5sYFXKLMfpYQ(qk*5{Orbf%;yzB`XI#NG5w~8)+Eb6>)~31vJoC!=73+M^#%uh zU{j4D5WE*)B8-I7SB`NH!Gb0hGGh;7$0^sBuM(5K%nHe+jm_i}2jA<5n#R=IG^Q7( zG1+6#ywd=;5&c3uW-{!=aU1Lb^J@Lq&|b2)nKaqe-&CjR=f*d+68M0a>_>#bei8h@ zo_UZ^GjT~kYFd=$Pyl^eSGN1K`b_q6Uw*x8cS79mIQ4);x2VNu{Dty!1!qt5+i!A9 zV#Ak*s#hoGoH}*tMD6(tX*&=v-l>O#CJ8tSFdg9mM{yKKl)r~m8(!A}`;+&>QSM{? z2!nKpmb3ci+nM85%m`T;xFoRZmPWCmAu3TE*|00g@^X_%3Cfk1Pjcsib&a(0SX7mM zL!%ljKR<&(P3xOhp646tBPtg8(#kVumM+Rf7-Q&YThiV8nD$H<{{&zA5bUInBxOap zt33U!iB)LW(c>#MA!S@#;rjA&)#qpT{w}K85L;&2OKlCu>Mh$^;6Imo0)^_PE}hQY zol|#KeKsdCS)3@iWi7i;B4)BX` zOXLGdn++Sz{w%-;O#bh);e4T?5t&6xWD#c!!N01Z`}<$O63iW*6UE4RtCxoH%JKkFNao+rzm|PLrlNI83~YSdMtQNCLO39#=}?_5`j<{QTJXxl;UG zS45&2;yT`gu=9k$;JqC~GwMsU1eT+LwEAMk`7jF{=OZX@uNqKCRJVylqi5!W%!VBkCl`dWq zxiZv*Yk`d(`kKBiPZ`!3KI%8y-uLrk|oapZ{M`PH| zRTdW2ROc@bjf#y7T(%o=47BqJXr6NEYX=05qHc9xxZVXfRWYrq)9X9t`my zXAxQw5Lz;ge6awL9sG+DG`VOnR|#X0VQImfSaos!d5>AMdYy~7bm>U^k)#8uy^;9W zkJ)^9bLPg(`}ccAoO5$qeQ{M){OR5|_q;g+T~)6FkP@mPI%H-XE6i%LBJTb{+k>+i^(q=iM5+d*&f7*R*^;47&ens5p0q zCrf1CqZm3(MB$rs_syG!D2$KhI+@S{xi|{9HLEX%-aqT4uob3r!gc1_ZjhHFQv{eH zP4*u1QlbJi_WCwiVOhn&^Xi9J7rPB2blTK)d??vC7x{CTm`#K`=q3ZJdkg9!)KZyZ zCvIhabjA6i{4=LlpI)|ndE9bM1zE^VP9kOzM6R;=)$>E^rL1GM8jyQWm#vKqNk@o) zj=5X*9+>0zj_|-B8AKFN&--3!zaoWTxRk_#3)!874!>#@OH?yhXovMXutpzfmx_a+ zooi)gb|A!VWIcD8nXwpatiq3}<`Nbjbkvw`D#felj;p^HV^5|lqQcgACAMORho4EI z6y4EM<|OP#ZY$=+;hsK3XW0O5T0vRXU?q0d6F*qMd_VxPvQm92XG_#RzGV;Hv~Br0 zt$N5L=S5l`@t1DI4I}2upd|Mg%1Iw=&J6Bp>yfnGaf z^1KH+c;gTl?}3b<;bb6U)relB{; z7Ue%LHgG~U6JOtw@Kmk*6{Js^Um+)bV7k*je#x#8NA;?Dc>NEc+~T2{VZ9-Iu6s^dfTk6NAWhf-_B-@Dz+s25qssER z0UCs!a7f(1Ju}fLoR;R|6e*C^)n!={o%q#(GYCw4L*t5P$Pj98e*I$7iRpXz>3hhK zwXalH-X5vaDE~AVRfzuk*ttZWucV_b~vK(7EI*7*&ZS{;JBf(3SUzoA`IG?}wOiq=mFtso~N3$dC(0BVZKjvh# zo=|1T&c+t3$<>eu%*DiKf4BdTs;G2#t_GZKbTAS_&8W!j8>9K?O{uF_saEDD<|S!z zQt4Hj{Z=egMdhqInWBL(;zXZL+_f%UwQ+0Wat)dDiGfLV9HPh!z3xzI)^SzY#S{4& zK%PCFwLUjBL6w%iY_>*mIuR2F+zyaS;3)K#!m|C`Roqm&Xa@#yl)3EjM6u2w`2*yr#Z;$!EfX;E_W{1-yIoJ+Bz|#ZQ8p459h% z^SJU9xbkIYNDi$~B(|(>hR_yRgXXcn{s*118rWj)Bsp%iw;@nVY1MY)(~`UdVKs9I8;PtZ-|AXdqhw;58o3z zpC7-DN7v>b?)9z5U=ErxBGKB+m}@TurdP71AzQiVkfnkVO4=0k^vTdfF8= zn0>6n$(4*O4cp5r|EkPszWhK1QpY-{d2XvC{57Y2>Cy^aPObWSbNmGFITJ_l+dLWN zFL$z6k{Xp^!5u3Y25-q+K_L-ud1 z*ZYIddCLRwJ$PlXd)T5&^Kh5Fjn@;gFYN7pa&PwX!#Ry8iIoxLwUb#eaMh^Uy@89RA28n+rUu5R;Fg+#1f79M;!HvxUdb@kZ|lE1_Zt}z{h z=Tr6P)J54z=*_0(o>+HY-BwqNtOmb>n_{EGg17gMOFeuvmCuQfKM|t#T@;SNvjWNz zVSg2-VXHw}1#TE8oPjK^3XU*W$q~AlxeSMCa<~eb#>jj~nm44Gu(=VWiK~YF537jp zk_RRvP~?+9)glq+UXuP{CH4oq1x_TJfmJa5({nIaLCJH9G|2%0Q=IYRm7cT0(_!OBbiR z#cRBqWQNUUxh3k0r&dII6MleK5RdtM#8>X)F(PvvlI)e$r$r0yIoZKD-t_zNLQ~e= zhZ<$_Bv2!~A}4*kpOZB*Wwn2>*4;xrHTdFP9ucHIGQ}horkLQ$^1qQnor8og(u?$W zV6m7&;v(*SdypeVPhOEt?2+?@0d*2N=YTY=WfAPpcuWf)e&FSm_F^6KOdg1*@O;)l z(g}HTo$y>se{#%~Rc;u^Dw{@{dK_ZHEz3<|>@mdVkQP(rz>@9_9T}#{=6>S)2APRr z*jnX{?Q;(mq;W>efLhj%g(mV>v=*7%vQaTa@`hh^kXwRB*j%9eltrvJobFE;N z9w~$>bUsu>O;7WN7(IdulVKtv(gW#-dgAF_iMj>^QM=(*u{6PI5QFloJV&t}8yP`hI)OGapJ$+3_+|z@5-y9mb2`ht2J=yj@(y9YF68_mv!SEw zaQa$3arf`&`Y3jNl)he1eEmB*ZnHz4AG&{!^tbVZj9!utOKbEMutW;utsqZt{RlWc z;cf#bAlVI%Z}`*ACd%av1|2jc^MeC@T~C&JBU5x5@ux{A%+k*w2uyPmF#}}E`kL$E ztX}%Nm1qycyzR+J2Enukbc3-sq9yO)fQ&pM_i+FbY!mV)q*xgvlN|JYo-in%PQkfk z0J2X8Lg(NlIt5R{U^kB1{-$o8z%yDfs)&CcOzum;_83^wua+ zvc-v+&?UR*Fhd-7$TY{tg#52_CxI2@;`<)ON-D&3Vs`=_WiF+v@kq6RN2GtE{wL`r z876U+OqF;`)<_a1>5@!Ik)&4ADtTlkGwWkE#B8LQzgd)7oY^|FZDxnfPMVdPRhiv1 z``PR(p7T{m?WAL+^Q9ruMCk_UHtAkzzO+i(CVeXXQTm(oZz(aCnk&qe<{EQ5b4PPm z^C{+T=3eIh=1a}P&Ew5Cnr}7VZhpx8g!yUnQu7+~X7d~7kImnh|7QNt{0mLdGP*mh zrtRpVv@<=4o=q>Hed!=Nl#b$v%ilzW+>uf5aF@8e^M@s5DVa7Jx3aZH{{#0%k1SR^ z2#2Yni9|UIk2i3Hn_!~tYvdeJzji=Rwg0={k%DbK{AW}T>V8P}*R*Ws-nBhLHKPz* zhmCO`j($Ds@$)l{f)kw?=rIEnWE|;ZXNPm&`F4Mp_3ULq*>zK%f62JX&TJp5k4oT z2D&1A&(xBx^bl`3xc++%(G`L~AnImVVBF&U+!*M}$S1SISUL1|WUHWu2mb2*_yO2! zp!r|&IA#JAQv=64y34Hj>wQ>8P=r?CI>8SCX8 z#;3#V<)PV=WBzV|7Y2X^2$cUH1G1Yzj@(?Moi|LD-~Qv~<%obPezE||wR2>pVIIYk z)xTKZtC!Ni8=IM=`=kb~YjWm|pzXQ9W701W`=uM9^*{j~Pd|&LE-SO)2 z^Mgn5(`g;xeQvw7jITP@AEZY^k;IdkEHnYc?<6+~YwDLHwzIJPJxY}M-J zm_O4)S3R83%kc-2)`RqN4K(3FfsHabo!<0IDn@vUN4mdwv3px1k;$V^#GgKW;>79G z@h76A^3alm3l~cAE?iiV7aF=EAygwr*ly{)d&l#y@Gzx8Ah|L*9+5_l?^5}{ z=LF=E))s&(QaK)(5(gUaZwHEqFZ~i^XxSZ>vhpC-hn0J?c%-01y5u-b!x;sG+M#Pq z8A&1YkSmMa7!9t(dJL|Sza}R#v^}y>C~+zQT=7J#oO=$PP|%Um@UdB*q7&0}a_&M& z366IKj&(&S4z&?1>!Gc2ag(K7fM){6NCk2y-?0-t2iZ?L{q9lgZVAzD2-hv#`6897(QWW#Rs3gs{_CLE7gb~P>gnE`lQ>=2GF1#G2| zA~&VBe-=mKbAmWa<1dP^pVQNBJLh^n~Eh}HGg4j&yZon99!l$OYs#)8sz^E DiyeX$ literal 0 HcmV?d00001 diff --git a/public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb b/public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb new file mode 100644 index 0000000000000000000000000000000000000000..cf8e24aee5962ebcf7e4d58d932cc3321f3cdd38 GIT binary patch literal 18055 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 aP{6{BWwy2LU5CmZYCDT$C?nq``+oq(ZGoi# literal 0 HcmV?d00001 diff --git a/public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb b/public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb new file mode 100644 index 0000000000000000000000000000000000000000..d2880017c25716417f837a1c26044a0342fa3f9a GIT binary patch literal 19151 zcma*PcU%-n*9O|dP%Sn(Dr2)cqcbMVV#0u+h$4bu7DUBF1`&{)C73`Il^~Kc5+s=s z6$6-a&KUv4w7RGL3cvTBX5a7LfA8*ZXS=&{)rrqJg@n=6U?dVr-`Q@y-W$!`gPolg zE;Ao9%iGh*(to|DyQ5e*MCi!~BPGHp4PmrY=&eaPy6d;)@3RCB_4u9KtD>Koz7C@! zkr3_fz4{IsWiVro)%?Y)ofFGW&I$1Kp6j^Y*W1f-o~4tw|58V1CwEWJ_3M3oy@MRQ z{oOhroVkRW`~Qj<{AUmo&y+J2%ps`!ORe*hS6h&GPTTM z<_L3?NtbMAhB3n>JD3s7NJ$)Xj5*Gnki;`5nNiGWW(oeQGpCs| z%r53EGoG2iOk@n02FXrl5|hPDX3jC^nG4KCW(qTvF=VDOjZ70`#9U%#F_)PuOayb4 z*~468x-i!z36fos-I7Gf9>#=O%V;wLnH$V(W;(N)v1isW#>@;Rn#pDS88c=FbCcQ1 ztY;z_CDWZLV_cazj1RMk$zx)f9ELD4%wEQvxy9UO?l5r0w#(nX4060%tA)NJYqDNMa*O73GpnhxlKY(Q^Rn-VzGi*T_x)eR zYDK8xsN$Y-rSeff!+sw9s``EE&-XX!|DgXDRd>~Dm7gkG)u3usJF0i6v(-n`PX<^I zh!}8az<&nX4=f$jb9y_>n$kZX$Lp+CU9dc&K%OSt@=IaIM?b17^_f+pc zLx&BWIkbAHFl^2+*J0a-eICvYHyhqG{Q2-tBc_k=7;$B!-pGbgV@7$8+BT|s)Rocm zMhA~h99=s`e@yn6CjGJc8}(bpP8hpy?Det#88>0vx^bJw<&J9~-*5by@mD7doe(|Y z#YD}CdK1kj`b>SVtuvMHuhoTpr#@?y%%sbi-`Onq-? zX83K|;%Uj#T8*X|?J#<2^dIA)#`BEV8~YmP8NZo6dV28mx*4(=fio&h7?WADoz0J% z!L3>1s0+IcxbbY=V*)X3_6%Y$nS=OQ+#;4T!UjV3S#iL#bXNpt%|bR9^UxJck5W@2 z+xcNU%#3Va0*jKsbo>V$`9aF*!d5ot1DVdAxJ^Kl^`H|8TxaEWRWOqnv-0FnLqb(- zIgBPXZ1hTd?l3IE?=dTh6MJw!2P#&6Fm$RtR|Te|!<&^C28|~zEZyCqL*}uN3kLiz zFm$JeL^hLy&>#sM6aMDm>w};l^gZPWJ^x34Fo#8fShQF8!ow`k1Uc2bQAu@SunR|R z=paHj{m~I?-2<6KSpJ*c$Q6N%P)(M)P}xfH#hRnH|3r26go6a?4&dl`!HkFV(`p-O z322MM*MYqR?)*04S68~8y?N=}l{)w8sJsLCVH zE4z=p<#Ks-%}vD>m)lgWqD_;z7yg_f3n8$VKL~OH1K7(2KARHMW`lQZQqkFTFJA_e z$v>?8+hJg$<}aM;wNWh#X%YH=l$3s!3ZbCl1D&U?H&jw))wO3}3PT=!JYOH=U8@cp zMB3PThzsRn*OAmH`*H&%olgy^9$i5-8mJCf9|7I0J0I0DIzJF>KL~w4CIsp1{334w zhMM!6N^;|Jl~=AFeUP{1kW;ccF^#l5syqBhz3vwAT{X*bijwvZXnzEwK>yn7b9Es; z)#|_@ZKyJ+mMcYEAEazH=C6$6G>P{egY1NMEqVP;wK^z7yr>8&S7C-XQ7`+#%BML z@vTbQ2L>_jm5-DMxrZg-?z7usE<>F&-Pt@sl)oZI;UhP}_* zDS6%oz1vTJk_PBbD-&iu1N1sf13%ZF|vr z@7%p#FC;?Pdub4u@gLd2d#}z0J!LJB>??28>o1cax4Dkfm2*~>UW-t}1h)1bp{v=1 zjKqRH2eiP0J&f<0*c+9X4!=;IIpgh-rp7tEXODvm8P7)BlQPd08EcfZ=b)LC*r+X7 z$Jyj5yLD4sNPM)`G8Py23dX{~X368v(5L-DJMIBoVsn}a{R?M2oB+#4TG?_Z!3R%m zo-T{oNku{7<-)}{le|q18Kz1)l`f)#sS_Oq5@S$*0&*<5KwSdENSzHw z&td;>cYY~;=W_#mZipQ68InYqi-VYvP}dbvE0t4>Dq3I!bVHKBQG&fss^!mv48(DK zaGZ4{-_Y3xB5Ou(1*qJxPM8-k~sXu!>2A0bCPnZ?n>$=ow`BOOYpFB1Jw@|?}WjodSt zd(4_daMM}jFL3=P&D0f^b#AdK`%L5|69cYeF)9~R)~KWBY%Zi(7}P8=4dJ0otfh~Y z29ah1j+RX3USgF&WHJl)eEGoq!Zoc*P;F1(Dpql{m<<_AK#yHY50aVTTkO{;{bKiL zXYDQ6Td2PSAMwQY?k5ou&8jyI{j+63R)`E2@wZm@sOX{WzSq3Pva=+ba$nnW@ zN#E4B*tXa%!%hnf47dSo*zv&PfTNKIT^gb?!4-`A+{P{5?!_Hv>3TZ35+(i%{E+D- z%DpL_N7tiWx=U9$!k&eFWEgV!6hh*fPJr9{-oC{h7 zbQ@a$n}ZS`DiC!OsV=t7W4Sx@06ZVI`?qKq$G zMVp8z8;Vr7X%=V0Ucr%{A=RyC=>&Rg6&xdUtrho()sNtova-!BLZ24N!p%GsCUe8t zD{u$qb?B3i>?a|>lWSua(A#u|FeZ}g=!1raZ1YD!-g54>->XCvuD8WzMXR`B>{Yk{ z)*U0r2ewV{_T)ZcvnFgd7@NtF1HeHz!#_iPots@;qAbo02`f;`TOxAvA`dDbUcGd! zSZ$0Nd$a#KS7lI0N?Nd5emm3GC&xo+xWvL{6DrYac{=28b6{a1 zj0YL)0_{1?bPQchRn(F$RDDn9q1$~>!w_I<=9>?mK@I5WvFooqP@xnX2h$5-;Xar( zu35*WOCgu~9<}LWgEpZlizZ_!3E6!25!*xD%u+*$!L~->Ubzt zxdJ`xIAQ8d|R_?dUi*gbR5upqS474qw`(5dC{PT3s_ct*&l_ zR(Cud!i6`_2o#c<@c{S#5XdLF=jIar?22<|i9B=T(KF#^mEZvVU^Ilqt81gHLn~BG zP0LT&+7Wq0soRQ7YbD*MPrc~aRr?*XJ=8Cr^0C=FiV}*nK>8jAgYs}$RA`=xX3+oP z;Ub(SNx{4Q{T0JZ=|nol)iWhCP=&j2>eV%IsiS}Q;Gb;Dt;#Acj_+F-pBob)Vr+tMt(v{@`3ve(hjhm9iu+GBRJiIWI4&M0ug2_{0VE+N;EMU3hG; z(l0P0-&+kPN84dI3{!ks1G;oNor1<-FX~CVoVK{{r*d~7Nsz*W5e&Nj?DNr?)2N*G z8!=_>tm?m!B0qxcBTW4$`PB|5zDRfLLfR_S0EK8!zhLiDjVzB0*A%zDFlZHL%<7|s z&t+YC)vRbWIyO{AkK(f8IdN4}SO@|S{t!$h(1*=$j9oQaFLH%i7SJjfwCa5N2cmz< zU&jRSKiHHy5|#eU^{!Ix1E$|EfC{9v-+_r)YU{LR6-N}8t`>bcRudRjp_0E2nMi)H zC%~HwVYj-I40oHXwMsf?v?=Xo@NIruwEEnZ)@U1rowXZfmaQr(T(3&Mg;iw%&BCZ= z$@{P1^+k$9er8inl8~Hw@5f4*_URf(LBq6Ye45%}57kV$p*VWu%$wTEfbcR^_~caX zD7c4mTii+d2AAyhN;-LvF_n*h=KL&1eRkWg*u{z!bKED{IvuEXQ0>1K%0Z1_Y{BKB z30n46()JHT{FK71vHb4T+{A2Ua_W}Nk>OEco5K=QL)9y+iFbK^T)y(oos-WCW2@Jt zs8bFS7?<>}>5Jm0ap9=_s(eUNsrFySx~r)jwo5&h8F?tUA+|3n^Cn&R z8zsLE`=nC|umP0Vaz|ht={UtY&~>R?0T6;t;`9ilU(wb&@&USjINB_Mp|2tLjr4#n z+-EbBe0b~();lR`c0^^}uBtB%C0({`urN>g2g3et+KSBSj;H3GwH`tbtR?&=JV;m+ZQD5N zKzs0@!4`ME%%w*<>#gAOg>`xyC~%ce!bWlj z_dj(q*UD0l4rZpnkmvXzMYOnNxq-r(po(Tmk|;x7uxQydT|flT#I>lN)qti3phGvKgtFR%eC)GFcx z0=>9879AnZ3OI5eKWv%I-DQ8#g}6W)>=`@C(uHrRt9zpQ=?8AGgFMGK9OZ(jdd8cg zZy>hYYQ;Tek#TqU(0+vWLX!C)Xnl}m>cUqMJ-{y|&==exmOMAdQP>b{#!@vMGaJT` zbNDG1KiP9YXzWJXm*8+PL)g#5o5w-l=>ysgotbxnvgIA{IxzK<5op{2sr+ZIE_`OQ zS_tid$I=_SPbE*2ad+4deS-5FK&Q_^U3jjuN^}hOgarvr-9&qf^MMD#HPOA|tvUH; zTrMx3C%$guaMABSOVe}(fAoOS0{5gmp}Sc@Ul^HoopjhCKdn#YN`NKc#dZwu(8I~S z7rK9tJZghoZPEl?!3~*oBPz+xq2gF!urTbvHPSJkT|?KRUtJ_Jmj~N1pkpwB)52lC zorOg(*shAs8c2KnWA095;cb)Jezo5Iq*K)nr`zS>0=pG`MmD>ROk)p$$-a_3W$`6_ zzfe_@_w>=5yk@C#r;+??4>PYQ^KZwmkBWV&~woBO3^StvwIOT4!Cxt58{kCbsk9g(Hu;I zS}9Bt_V7@9HS_~58%%JRtDvKE7>5xi3ER;|K@Fors1~vV)#1^3D;8f-uxS0!8pwsW zz5ZnQ`DGhgcu?5LZ`yyzzFB#p{y^>}b;L*FKi4V7PdRz#wd~#Mgk1#U*tFW@!$%Y^ zJ>QI4XB+J1s;UX{&6um4HO3`wn>u+6$*gP0J+7?C*z6e{AGISw9T!dH)w_H{cDpKR z@0p_w)bkUL+dov^yI5CLgO=Y%Sj#u1*VP_THg2C07^kL{RKM~Ks}=gR=^Xlzfd>mutNC0< z0&`3_+Lzs&S9CC|KDVszD|{WvM*Dl31#Z$ZhCzOZ%M~T%$)yRZlL;66GXwA5?o;Dr zRW@Hadc3uPQ-Nn9E~1N}`@9(j3Owl}*598VJ(N|Va(Ke~`)-KzRIUvxDm;6-wk*B# zfUSZ$cOJFXMSe}STf>dp4OdS(SJ_xvEVEYK+RK*|7Z&AaM1=VI1o#AnrKYRWJ8lf* zApe%c?{_~bD$K$Bm9rL)1WEj8D-UiSp`X|n=XP@$fx=gW!cw;JuofoUHB6leGGV1z zGL?0#U3uTqp2*<99f|wzq0(=iJuJRKgbX(24(Ui`TQBeCAV(}6Cv}G$UPxufEb!ng zNk;}N%M*+wFy@XF#^mvLVzARS^|Nl&(XL=Z*U~9xY+pXat`h}`1Q?;46d2geKdO21 z?CRsA)6SY)cS*X|#}qU?&Idz3EqitqbRx zl$<%DOfL%ztyFI=D2gsr9=m(!)fu%s&F%^b2zOq#Ug__bn&zjLyJc?h%-N(gTVY|d zUM+(K-=wery!mg?urXCuE&5u=qTR1dmoG* z+`TQ?`=;qG9C;>%TVTX{WE_ggQUdb@MXd~U^={Cf)QB#ngJ{5@V<@;6f&A6Q!lUYl zTV&aUx&9_fs=eXG;|~wP5v+b(v@x8vZ1jqVki7+o>V!QBiM#i{1&coBY)l9#2#(wt zq0}2o`;S{(6LPSkDzmUeeGsPcK3g3qvrrkeJ!yaAo%iJhJN#qfJ4r+p^dd+n<&!)T zbc7WC*{1ZIcw|CwK zwMMV){!=dQ_Ig7aVmMFC=BFhMswjU(^?^`^+l_Wko;919JPaoxoq+&B0u4C zsMh0=5>~#0KA`%0Rx|CrblDd7Rq7KcO{t|B_kxuNPw1GBG7wgM<(n@(fbK1&7IrH6 ziAiHj4IHNyy;aF*|KEuc^jC|d@V~S_|KK29_1o9fi^!;7;Qxdpc`DvXK|y!$?^xLJ zKjCB|D+7b)(g(1Kf4(_o-Fn5=s5$<$uPWAl|B};zS|P_S?W|X#j&X9_nX*A0xG%0S zF+Ur+rd&%%)k@gEGii_Fu>S?eBGv86(=XEQmB8>miTSBT1$(tpYO8kEDzjV2%EdcF zmaCTpxh{^i51?K91X3nw9+ie^$pnq3(g!q{uW#I$byj^br>Zfj4$Y%JxxnOH2WduT zYoBTRqmLa`>`lFs4}Dchb(=4)$kobPw{Yi5CF;1^!#ktP)wx@C`EK_Qrd^}0;x}u> zN9~N=rf|$(dU%t{+--$nmuNJFv;S8vkLJ*#q1AjN;mK!#~=q4#tKsDclZoHCUD8ltmGrqJ73Ve~_d7qI$ ze|RFrp9J3G?8?XO?aw~lS$@`d@c602Rj3c4x=m8~Ln_39KJQ>|?J-q3!>szjmk&q- zhYv@Em#c%uk*|mzx`lDuf=QaY^Iiuff^xm+Fth`@{j>n?+qc6PULmW7G)o~wh~}GF zm;Ya`t8_Q&YA_gonh2goW)*ipAY>xO1dU0+qN4t8wU%yn^Ub<<0XAS5It6 zk4jW07GV%(!w|A7xe(i??AsO{9K0nUa`WD#Eozx}ApAl3qZK4+L_surC7KjP(Em=# z^}?&QeLe4ybyHUPS}G?7o~wR%_g-^VWmNbG$)M^Z3SZG2nDPU-Ay*Gk*?w*;OD(7xZ51$W1yc!nvG;ke z0;k)zF4SMH@GM`=|a1=Qb z5cV(;xl+o5oP~98lu#42-A}ZhgoKk1PDr+#1dWq|q)xg8HuAL3KSN+31f!>D1{Tm? z?dOcg69jlgbly>4jBlx&4{Ncbn`QNo{S>rHhJ^Z6%uvR1X^0T%5TG zYnE(SyMK++er1H8t6HA9^5X18rxz1fN1w$@6<&!xX}+q5pLu!3)91GzUpu~fkrF)kuak2fWE*+wl zpBVCT7Rb*v6_wYi!_7wGyK#$p?*Z_-;J<3XQwqRYrPwhET{ za5-PLas~h3|37a<)P1ZA=SIg8v}S@Zn1a8E%Iae$+nZr&v*dd_tobDUF7UkJt%WTx zu=OW&e>?Be7|K!YF|@y`J&(VBuHnYnQjawY7B8Q_(xd!{N+yKB014=T>@oC^!V>`j zXLJDea~PSSfph>5GPW4sda$w#7*z!tRWM2iUGl;6VQ}x)7@;~Sj9AFgjdYD4C;tXr z>DGmuY)~L*!8`~6%K@!pV7U%x{z9EDzj-j4|HdYrAz_(?TXU6OR1a5K3PZ?)1n7MV z)QYF$^Trpc+>&SK)F^Jf-d$5&6tk&DC2x*(B3}@^vqU)%>kyS4vL|GBU-`|v?}$gp z9|jF2#__c0GTKWKZ~Vyf?~PhD(GO#66}FV!=I!jBl<%oZDi-n7e^(j|U8N8#F0*Ur z!nz{r$=wiaq&IX$pt^MicL(sWqP)d$s~t_8-Dxj>{v;8c+oUiQEO=osyEixa=t0F# zgU84c3Tiot+7EqZ2;)9}EU$g4+W3^Xm|2F*P|{xhrz;cGC7<{^WlxGPDX(4hv`kRT z)^ZRd1oH6YNzgZX3*9k;4*3LbJqLb4fgIS2Uck(s&}-23L+AwzK`&ql#u>I!VG>6z zleoL%vFc6e8ORBGLYx@L>KQA>w0eq|VNYjnc!%o*4u|j(F7R++MwJ+mMG$ge$4+cN zFNwQn3?ti~59?c*1m)3 zuYi4*ph`Fsc6eR6mb~ps_0dcB70>2e7)<*O7@@a5)3wq|brKl9@!YAq5As|+;#F32 zT^8G|D>$r@|1_r={N?+{Zrv^Oblt5opS5Oz#hNOlyKwkRQUC+5!oce=P+CyMuj5KW ziyW7Et#wri`il@1Sj5R-?N>>_Zz2sqr{OnYv%iu*1j!x0HVEF*2K*{`i(fGqE(7kz zgCCM3f|K+ioZo@Y7^MDmR1Q|_#)l4kvGyOJ4zb1omM_?Ir#ms8UdlV1f*BZzGMZ&T^|SpM?z-UEXrSk9QbPLZ01@c%Xzu zM?U_@RbPSA_FVRRLZ`E_8;JbzL65b0c1o&`%AKLgVGn0R?=ua%OHZgr2St0(u1eF1 zxv8$|X7mN0y=i)L|Kz#_@v4cYt4GgUT8ny>4t@FVIrzMgWVK5RJ$Q$yB=p(s$j-rD zw~2#Q;$Sa22Xi6C9&2;{9cmcussGTjbEM)EYJ;F?&(4vuJ4XuTAG|q_BRMXOR~eeF z$C0YetH2qKBLBcL7_z*Iny>j60@%~~>!l9Vw1W&WfE}pQ=djI!EqRr3Xg@~7kH>gy zm>J~1O+7!t-qu{P@QVL6KUG=O)o5?@?%n4*&3AFg+V7(>Hz%&=tAo!gF|?%d^q;Hd zh1R+1O-b_)98wh2XO|?aZscCcyQg>BVkqTddj58HwkTrx! z!CJV*gQImpJzexSkyQl>m?d*AofkHMRW5KHdN4n94BVk3J2*O=$nG>k>Lp1d5Dd8z zX(MDT<}#_(Vouf^D0D-r*aqC~&Vs&tl{KaqEud>)$ZweI{V z$B(i*LN`&PpO)ee!hW0S;wxvV3A(|)(98Mi|6AUNubmH9U@;Aag;usOo$3%-H23{8 zhBqPE2Cbr6SWfDnUra7h*5rf*#>7R(MXO!tLUGNIYJzd_DzG4lnTc6hipHSxRBPe# zz)d!)QxHL@x#(Yx@0f?)rA$DZR#JB!49-g-T}b2+I*5Y7<4Z}00o51ZVmjYYtb>N+ zouDUuC(3m_HXk%d2bxGb+aRg!3XGD#-=Hal`|cb)^=BwAM$g+4Ira|xAapYugxuAi zT|tuwHDhJL++M`0MH~CocvNxQ)yGETI= zF;7L(ktSBU0=*={Fd+^>>Nv#GwsCX~ZZ$9nto6i77##jX#CkZ2AL2exHlw1E?g1Pn z=FbRyjt*@TCN-aiQB)7~bmXsL08V=SpB20~%NU$Dh9N;i*g~kGIPsgfReD5zTW}XH zV|0_P06jvxvo!C|JbukMvMs$ZqEQJ}**iJv>c#zJ&FD=sC(P4jy>j{H^u%cNc7`?! zhRqj1PXdiUr9uxx88A1evzu;ghwR^OV$Pk9#%^57cXAzF5W&v+Z$BO`M#|-@lTz29 zC~B3oJ^>!~O1JAGLW;r9+JYM2O1BcHzTRjZ?-eEIK-S~5*>$%H82O_QFsN(_yty29 z!0dbQ3%A}Ia~~$)xnnRnnuD}2qFIFpg=Q5jbO%D|KRKh^+yJZ?Havz6X~ zkwRA(p4r;rL9K{vOJH>%n7_RF60}=%z@$xHzl4*APv^on?}**3&P+deCT_PD;vG3J z37x^l?b~}WzDx^-b-qvA$6hO+%bCoeJ=IZ0U4o}#fWtG^D`AUj7>h40Y=XC|?d+9^ zTr~iZ2z|ato1lS*|FG_K1*(X1aFuj8b}nM?Pieibun|{k&7Q)ji*DJ089SUq_b{YSl@$d)g%TU;O$a4b+8rHnWWwu*V>bWad_9uCG%H#~?q5a;`aq5Ni0YOENWlPZ=_a(bh5>k^D zSDa6nJFE@y^iUlQbJ-W5^z_{9=cnFXKq#i8jJD@iqBO!h6Jggg$y32d`c&A(3r1|# zGtz+>I-P9RBsk)F*ZQG`>mCRrU(b3ETi+ufe2@;}KcT5@K_b$!!fKV*Pn4G*M@)9} zav~z;?=jkc3tsNx9C4BI+ivy_K8uuV{qqj(+nKy8Nqr8ocX6_MVS%*%D__3=mZ1H_ z(@765V<2cE0&e40T|xkEJe7li=|YU9PDHRDjh8l~79DvmN*xp`hU^hoO^!9)%P&)& zP7n1JrB0OE35PQ_;~>cdqcF!2z>+s$Y$`QXAKbiw%Dd$`MB+^F^AZchEK zJa#lI`z)ZmTU#!{?F3_hYgQ%tIdj|h^%bkBf zTD5o??zhBl;2b5qRn z)59#k2OZnSaa2mDjlr7Nq30Y<7%0T~a@39X#9#Lgml2}x*4F+>5{TiI@^idHb40Cr@Ckp_*C7ut~x1H%!hw@CA~y>S+#Fh98$1q74o&SCPbkI~SKnM12*+>5--fy% zor||1;^wDY@+xRr&7;0a!_-3s`~5Mg$Spf^Qc)Fl(P-_O05>;Plr`#}!aaM7k12EV zq60!A{X!zu)Km-_{%;U3U)yN+yZi4+^G}gK9Q_XuvFw4{#1P4-ln(NWG{2wjoW@OH zW%d_W1_CAtS=@$Gok^Lg=XmJLZdpr~uu)40Okq>wEEpN*2*JB~a+ohCWQiH+cV9?wMS|*DY^C z3_sK7__?T4N{q&ux4{B+LRD;KaM|f2eO5Qvu0t5Cz|B5=zLJih(*{rr$5f9jA2kff z<1r=Di6lkr2@6volS$_r272vI@l`E7!AIsM6y+#dzg_!SUbrnLMRJ7kaH@EwvU=-USlWj^0vOa*cN@SbOKv_1as9H`dO#vR-F}D59ZQZVPTw{MpWX z=Gfo6(pcYk*tgc&a&dUM!8wWlT=Sq z_~TVaE*~xOUCNozGF}LRg`rnELg*qQxYFTMxsJ)vQxRlwYlWG(Lk{g|61ed&k9DKd zZ80Bx`xSeSY7*KHWpd}F zm25#%%*v62Bka&J9`x?v8%TI(@>VDMJHnOo_HeoH&@y-@jIrl(-p$}PuR-_skh^^z z0>0zvKs?YsBOVz+?{nw(l%7%tPz^$(A(Mae{O-5*TuWPwfhfY(nA;w?f{csE(2tLj zPw0+np@NwX^KdKD8p*qK=yx6ziucBKlv!#V5wt|*MTekKdEgP*TT+@>qHH=H>M)LK zgbWW?4@XSjqcX7WamDFl`C(Po^H$m0i5_(e{D9GtPwf~f(9QPzh}im<;~+K zPE~p2uQGF9?V{dIXYf{A>G*k6shId=)j#K69mu(;DglKH7hy@ZdAV)(QZ8PVdE_H# zWPMIo7lPb{lL<|Db}VQ<01YV`zolZX#-mLf9l+9XTCwYJyW4Cly2l4@#7el{zYpxa!&Xx!qR5~p(aRD16p5zlj1D` z9ExLMX=n2e4Y4;Z>{$#NmWpFlLFr1)8B0h1zim-kV9O!@ZE1^Tlh{s^wG!7b1hlbC zoS-&#V}OlL1;P=Ll5tk}Q@oLT2uBDm3?W_^^+im%9*qQTiwbBIIe+8&rB}+rUD3Yr z>h=TV+RihBOlK~2T%bxrD&Bx@N*59Sjm6BS6aQeOrtTd^PU_%89rQnmkrOYTDt_tV z6s$37Vg!pjBPV*8>tliNz*1FRHYTMb}GV63;z`bbRf5(1i@Hc4Rl zl~-4#uv}>5*Bo*?ee2@IYscIxR$4AxHeYoml`ksDEzU{X9J(pc&pR;UK$c1t+WhlL zE?AEGqyrkQ5ZEq%UK)y&np8^ykDdu>z~pgY%0bdHv3zEdnv&F2`zsX3zV6FEc04?w zTqXY;y~-A^99b^lFi$YuWo@=S>cyd}hKzz9KKHk(5AFC6yIkQqW9yPRs|zwWsnRYZ zZWj6)&Fh(xmiOR^0m5?#x1$uD4|;ahm_W(Up1@eRV(8*eKfZ-csv%)V&Ie#->X4`B z-o3D{nz~OtG-=`9D#h6kJM)j6^b0Lj#jGK%C}n119y})NrMa!nUZWgNHGQcxUOf`J zZn(WwRk7nu;yQ)LJU<(YAPVl*`1uVJ6)NSyfr#1G8+F)Ob%B&*bu+s?6@ptQ{&;=d0Wd}lhk{%2#kt< zeX&I$Kl8@2#$canV3PH|YQ_1s_=01n{6fl9G4{4xHOyTg<~bg4S(Rh2985W1+BIH1 z6lCuAx2kZz64xl)=K3x*v#Ct>Q^{YZTtQfLPOIS1BDwwpGQLZT=ZLmX^T(1`2e)R0 zXQ~gSoIBH~h%b&P@Xw;2VA^Nrj@^lh)XapvDlle4CXw%m)mYFS@npi3z^UG;0a?Ln z+d#K<_KFQzZnd5&m_=12Gh)|{SVc@&{B{+cBPQVwVd3}%o~l7YV)kuEha$H;<-k4_ zjKln-ecN`$#wa$e-x3<9l8q094lt8I5p0y=&qLlTXYIY4jrC2HUKI=GEU{azqEkC? z$~r8p#$-WsLdC2*L$Hwi{3ZRV`-_F^Lg|59q+=fDxLeqAS%{fNp&Dog{}xcaiVxBe zqzF?YBcY$z_bK3FCMxBRi(V3WOMrXADkWW=KwU8zDo!!r-Z&J9T`;_a|GiuFp0c)n zn*&y>oM}IPXT#%H_cE5Qn`ypcv8nUxD+g4v-)xYiTyU3`uja3L3LAb;u&f}me_@5P z7MO^j!oar4?eY@{EBH_6!XmauN2-sV%RO~R0q%&MZ(-#pwq?X;q${pnnad4CC?Pa1 zbXTa_D29_CK`b|3f5k)*LO@76wFMMGlArL7zr#ADaXZ4|A|n+eTElL=ZZ0o=s@naL zgs-LD*3MQg4a_M_+jU^~0d*~sGwj7-k}wFSAcI+NsvwA6(LwJYyocfsSKmt>w8Ecu z=~i1lXaa#p=zohrz&<2A^Y}Wnr^X=sEJqQl+w~zJUXq zbb=gZ_g}@QO7sopb@~R+(KmP+VN5z~Mc*K-$>z8AZ-e>uq~i~5<~P-s#U4_=x_RlY zI-xM8AS6>OBPF-0R3Sf7x1nP3+Vw%cPO75CM1Crxy2L+QD`$Vv z;Y!6BhidcXEBz5}D6=A2hYsggD-UFE2}w}9yKmm0vSY(%ksEC7fsjBqcOM6J9J|gv zGs7Jv_ZAU~S%6T?0sgTc$;-++D%$9RSFC3Jf!g#$Z8W`tnP z?o^VQn0%x`nRjrj_ok@eO(AN`uOEhXa?7+f#D@?as)f(|bJms4CtLmF0z(v2ZhOBx z(@;`$TqR!@y`I2qF`d(hy$xRxSVRQqDT}_TJa>cRD#!WCWub-n`x8h^_YjF-CW?U9K&BFdB$;G#= zX53r$EA36E(H>&L7h2fDh_ixXF$WCx7h+bnm=e2z za$<&T(SKiy{upDQ8p2TW82iLHLT8_*)C&8|#yr`OyxZ?IJHOKs~sKj4;D%*(`j8P7P{;EMRWSWxf_E zo_?mqIJ;(u`*7)jq@@j3V^aJ{AymwYpASRO)-oADd;DXLmRA2i+Pp9wncEndJ9Gvn z0J88B^2HSFF^J-gL01})8JNb>7c?9Bu2oprD!KO=GCoP~!6JTC=>XIc-t9v)Q`%HqOV?4$wIOOtDJuhgTC@|o$%N0nE96Xw_~#Ui@b5sx;a|GACgCNEC95UQ5>H98q*~G_!P~GJx*GZ# zMjB=sD>T+<_-X`cgli;e)M=d4xTbMi&5%|~&q=RKA4#7}UrSr0-=u={kEVtut0~je)l_K?)6~~A(43|@Q*(}{ zrREaNm6|S^{+gRL<24gClQj=$W^3kamTDf=tkZ1JY|^~0c~|qX=5x*0n(sARH2>E8 zAHt9>q#Nl)bcvD-AbMmZ8A~RT>0~ZhMC^z?aV8$boA{Fu5=mmnHWClJ#1#H-nT@uT8G0&RAr4rJpNJ+cM=xb8bx?gpA4W6&J;p;-N+87(&C%4J zjv0W1N36d4R3$@!xr}C#ZGLe9L5eY#ZJ;~wtrcKVtvU}`WDezo{p=WL|LAn_kXhd#BA=rVtZ?F+)$36$jKj%)7dA`0XC8$&mQAhk zhJk7an&Dcu+%W{UJMwU9@!a%qywj;I*i7L%Z>Ms2J9P?P!o?#HZ>DlHIPLXIEj=uh zF3xF%7v5)GXsp>1cTg=;eb48=wq5-N(&}Zl1Mouiq@`mDUf_=4Jzto}K7(XJCmCS$ zi`AoF3Cy?RWMre6v6y1qBj#k)c6CNGf3f00^=0MN$6oU=BZ$Yp0nlgF-)MMPHiKoW z#cL65rpDT0s?O^?Ow|c}HkO<8Z~D%7uJc;`no!OUZ&-2Vcr_aTl7u#!-As_h2eQcp z`x{CXU*g8y!C*T5OPdWIN3iq*(YEByionqH{{lmY5g77Y%4zfS>z2Q3|9ZFelHHjp z!$z1)Qa#_x*VWcusw?#Mv|Zw}#=*OwNTt2AS?Jj;(OzXo?# zTVe~<+8b?beO9mc%P+wl`S1WHPk0Zi584>u#G%_+?eOF|5OmcZM0@_4gBMgV_bUid>yS1{cuBILw6k z%Nw=%Km*jrTR3xU`Ly%;PHqeyJ77;N=K10eZa;zHtTxmTaWgTY3`xn6%@zajj#$e$ zg2UAc+y`xm;L;-1#!IMr%}5cD+^miF)c^XRO-5no*h2?Lv^#oYcNi=dJjJO$pV&*O1P+B#H$sSnv!drEE-7e-yC6Q_wC{ zH{uOvtUHGdnGnxuJ72}rH+_PCpJbM{4IhMt$0Kav7bL;;At4N>vqmEEi9OLhIK*cx M96+?GEz$me0Iy=aZvX%Q literal 0 HcmV?d00001 diff --git a/public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb b/public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb new file mode 100644 index 0000000000000000000000000000000000000000..d71697d4b638737a5545dd0cb28cba8f613e4eec GIT binary patch literal 18746 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 literal 0 HcmV?d00001 diff --git a/public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb b/public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb new file mode 100644 index 0000000000000000000000000000000000000000..ff7c6ddecf6b689d93823c4c2a8c41e6e058de46 GIT binary patch literal 19395 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

P;)}P^QP$iApGA;)G#3)rKJ$ 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