long-screen 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js ADDED
@@ -0,0 +1,37 @@
1
+ /* @ts-self-types="./index.d.ts" */
2
+ function we(a){let e=0,t=new Map,s=new Map;return a.onmessage=i=>{let n=i.data;if("id"in n&&!("event"in n)){let r=t.get(n.id);r&&(t.delete(n.id),"error"in n?r.reject(new Error(n.error)):r.resolve(n.result));return}s.get(n.event)?.forEach(r=>r(n))},{call(i,...n){return new Promise((r,o)=>{let l=++e;t.set(l,{resolve:r,reject:o}),a.postMessage({id:l,type:i,payload:n[0]??{}})})},on(i,n){let r=s.get(i);r||s.set(i,r=[]),r.push(n)},rejectPending(i){for(let n of t.values())n.reject(i);t.clear()}}}var ae="long-screen-package-";var Se={analysisSize:640,memoryMB:128,tileSize:512,regions:[],temporalPolicy:"stable",decoder:"precise",compatibilityFPS:60,framing:"context",compute:"auto"};function xe(a=globalThis.crypto){if(typeof a?.randomUUID=="function")return a.randomUUID();if(typeof a?.getRandomValues!="function")throw new Error("SECURE_RANDOM_UNAVAILABLE: This browser does not provide crypto.getRandomValues.");let e=a.getRandomValues(new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,s=>s.toString(16).padStart(2,"0")).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}var Te={language:{label:"\u754C\u9762\u8BED\u8A00",saveFailed:"\u65E0\u6CD5\u4FDD\u5B58\u8BED\u8A00\u8BBE\u7F6E\uFF1A\u6D4F\u89C8\u5668\u7981\u6B62\u4E86\u672C\u5730\u5B58\u50A8\u3002"},page:{title:"Long Screen \u2014 \u628A\u5F55\u5C4F\u62FC\u6210\u4E00\u6574\u5F20\u5927\u622A\u56FE",description:"\u628A\u4E00\u6BB5\u5F55\u5C4F\u62FC\u6210\u4E00\u6574\u5F20\u539F\u5C3A\u5BF8\u5927\u622A\u56FE\uFF1A\u6EDA\u52A8\u3001\u5E73\u79FB\u3001\u659C\u7740\u8D70\u3001\u505C\u987F\u3001\u7ED5\u56DE\u53BB\u90FD\u884C\uFF0C\u4E0D\u53EA\u662F\u4E0A\u4E0B\u6EDA\u52A8\u3002\u56FA\u5B9A\u7684\u7A97\u53E3\u8FB9\u6846\u548C\u72B6\u6001\u680F\u4E5F\u4F1A\u8FD8\u539F\u3002\u5168\u7A0B\u5728\u6D4F\u89C8\u5668\u672C\u5730\u5B8C\u6210\uFF0C\u4E0D\u4E0A\u4F20\u3002",closeLabel:"\u5173\u95ED",header:{brandLabel:"Long Screen \u9996\u9875",slogan:"\u4EFB\u610F\u8DEF\u5F84 \xB7 \u4E00\u6574\u5F20\u5927\u622A\u56FE",privacy:"\u672C\u5730\u5904\u7406\uFF0C\u4E0D\u4E0A\u4F20",helpLabel:"\u5E2E\u52A9\u4E0E\u80FD\u529B\u8BF4\u660E",star:"\u5728 GitHub \u70B9\u661F",starLabel:"\u5728 GitHub \u70B9\u661F\uFF08\u65B0\u6807\u7B7E\u9875\u6253\u5F00\uFF09",install:"\u5B89\u88C5\u5230\u672C\u5730",installTitle:"\u628A Long Screen \u88C5\u5230\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF08PWA\uFF09\uFF1A\u50CF App \u4E00\u6837\u6253\u5F00\uFF0C\u65AD\u7F51\u4E5F\u80FD\u7528"},install:{title:"\u5B89\u88C5\u5230\u672C\u5730",intro:"Long Screen \u53EF\u4EE5\u88C5\u6210 PWA\uFF08\u7F51\u9875\u5E94\u7528\uFF09\uFF1A\u4ECE\u4E3B\u5C4F\u5E55\u6216\u7A0B\u5E8F\u575E\u6253\u5F00\uFF0C\u6709\u81EA\u5DF1\u7684\u7A97\u53E3\uFF0C\u6CA1\u7F51\u4E5F\u80FD\u7528\u3002\u5F55\u5C4F\u7167\u6837\u53EA\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u5904\u7406\u3002",iosShare:"\u70B9\u6D4F\u89C8\u5668\u7684\u5206\u4EAB\u6309\u94AE\u3002Safari \u7684\u5728\u5E95\u90E8\u5DE5\u5177\u680F\uFF0C\u6216\u6536\u5728\u300C\u22EF\u300D\u91CC\u3002",iosAdd:"\u5F80\u4E0B\u627E\u5230\u300C\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55\u300D\u3002",iosConfirm:"\u70B9\u300C\u6DFB\u52A0\u300D\u3002",iosInApp:"\u5982\u679C\u7F51\u9875\u662F\u5728\u5FAE\u4FE1\u3001LINE \u8FD9\u7C7B App \u91CC\u6253\u5F00\u7684\uFF0C\u5148\u6362\u5230 Safari \u518D\u88C5\u3002",macFile:"\u5728\u5C4F\u5E55\u9876\u90E8\u7684\u83DC\u5355\u680F\u9009\u300C\u6587\u4EF6\u300D\u2192\u300C\u6DFB\u52A0\u5230\u7A0B\u5E8F\u575E\u300D\u3002",macConfirm:"\u70B9\u300C\u6DFB\u52A0\u300D\u3002",offline:"\u88C5\u597D\u540E\u5148\u8054\u7F51\u6253\u5F00\u4E00\u6B21\uFF0C\u4E4B\u540E\u65AD\u7F51\u4E5F\u80FD\u7528\u3002"},hero:{heading:'\u628A\u4E00\u6BB5\u5F55\u5C4F\uFF0C<br>\u62FC\u6210<span class="hl">\u4E00\u6574\u5F20\u5927\u622A\u56FE</span>\u3002',intro:"\u5BF9\u7740\u7F51\u9875\u3001App\u3001\u5730\u56FE\u6216\u8BBE\u8BA1\u7A3F\u5F55\u5C4F\uFF0C\u6EDA\u52A8\u3001\u5E73\u79FB\u3001\u659C\u7740\u8D70\u3001\u7ED5\u56DE\u53BB\u90FD\u884C\u3002\u5F55\u5C4F\u91CC\u51FA\u73B0\u8FC7\u7684\u753B\u9762\u4F1A\u88AB\u62FC\u56DE\u539F\u4F4D\uFF0C\u5F97\u5230\u4E00\u5F20\u539F\u5C3A\u5BF8 PNG\uFF0C\u56FA\u5B9A\u7684\u7A97\u53E3\u8FB9\u6846\u548C\u72B6\u6001\u680F\u4E5F\u4F1A\u8FD8\u539F\u3002\u5168\u7A0B\u5728\u6D4F\u89C8\u5668\u672C\u5730\u5B8C\u6210\uFF0C\u4E0D\u4E0A\u4F20\u3002",demoLead:"\u60F3\u5148\u770B\u770B\u6548\u679C\uFF1F",demoChip:"\u653E\u4E00\u6BB5\u793A\u4F8B\u5F55\u5C4F"},steps:{ariaLabel:"\u600E\u4E48\u7528",recordTitle:"\u5F55\u4E00\u6BB5",recordBody:"\u5728\u7F51\u9875\u3001App \u6216\u5730\u56FE\u4E0A\u5F55\u5C4F\uFF0C\u968F\u4FBF\u600E\u4E48\u79FB\u52A8\u90FD\u884C\u3002",feedTitle:"\u5582\u8FDB\u53BB",feedBody:"\u628A\u89C6\u9891\u62D6\u5230\u6253\u5370\u673A\u7684\u5C4F\u5E55\u4E0A\uFF0C\u6309\u300C\u8FD0\u884C\u300D\u3002",takeTitle:"\u62FF\u6574\u5F20",takeBody:"\u62FF\u8D70\u4E00\u6574\u5F20\u539F\u5C3A\u5BF8\u5927\u622A\u56FE\uFF1B\u6CA1\u62CD\u5230\u7684\u5730\u65B9\u7559\u7A7A\u3002"},press:{ariaLabel:"\u6253\u5370\u673A",build:"\u7248\u672C"},screen:{dropTitle:"\u628A\u5F55\u5C4F\u62D6\u5230\u8FD9\u91CC",dropHint:"\u6216\u70B9\u4E00\u4E0B\u9009\u62E9\u6587\u4EF6 \xB7 MP4 \xB7 MOV \xB7 WebM"},observe:{dropTitle:"\u8FD8\u6CA1\u653E\u5F55\u5C4F",dropSubtitle:"MP4 \xB7 MOV \xB7 WebM \xB7 \u53EA\u5728\u672C\u673A\u5904\u7406"},controls:{print:"\u8FD0\u884C",progress:"\u8FDB\u5EA6",knobs:"\u8BBE\u7F6E",clear:"\u6E05\u7A7A",clearTitle:"\u6E05\u7A7A\u6253\u5370\u673A\uFF1A\u53D6\u51FA\u5F55\u5C4F\uFF0C\u6E05\u6389\u8FD9\u6B21\u7684\u7ED3\u679C\u548C\u8BB0\u5F55"},tray:{ariaLabel:"\u5927\u622A\u56FE\u9884\u89C8",idleTitle:"\u4F60\u7684\u5927\u622A\u56FE\u4F1A\u4ECE\u8FD9\u91CC\u51FA\u6765",story1:"\u5F55\u5C4F\u5728\u9875\u9762\u4E0A\u968F\u4FBF\u901B\u2026",story2:"\u770B\u8FC7\u7684\u6BCF\u4E00\u5757\u90FD\u88AB\u62FC\u56DE\u539F\u4F4D",story3:"\u5F97\u5230\u4E00\u6574\u5F20\u5927\u622A\u56FE\uFF01",story4:"\u624B\u673A\u4E0A\u5F80\u4E0B\u6ED1\uFF0C\u5F55\u4E00\u6BB5\u2026",story5:"\u4E00\u5C4F\u4E00\u5C4F\u63A5\u8D77\u6765\uFF0C\u72B6\u6001\u680F\u53EA\u7559\u4E00\u4EFD",story6:"\u7ECF\u5178\u957F\u622A\u56FE\uFF0C\u5F53\u7136\u4E5F\u884C\uFF01"},reconstruct:{heading:"\u8FD0\u884C\u8BBE\u7F6E",sub:"\u9ED8\u8BA4\u5C31\u5F88\u597D\uFF1B\u60F3\u7EC6\u8C03\u65F6\u518D\u6765\u62E7\u3002",policyLabel:"\u9875\u9762\u524D\u540E\u4E0D\u4E00\u6837\u65F6",policyStable:"\u4FDD\u7559\u8F83\u7A33\u5B9A\u7684\u753B\u9762",policyLatest:"\u7528\u8F83\u65B0\u7684\u753B\u9762",framingLabel:"\u7A97\u53E3\u5916\u6846",framingContext:"\u4FDD\u7559\u5916\u6846\u548C\u56FA\u5B9A\u754C\u9762",framingRegion:"\u53EA\u8981\u5185\u5BB9\u533A\u57DF\uFF08\u542B\u7559\u767D\uFF09",regionsLabel:"\u5355\u72EC\u6EDA\u52A8\u7684\u533A\u57DF",regionsAuto:"\u81EA\u52A8\u8BC6\u522B \u2197",advancedSummary:"\u66F4\u591A\u65CB\u94AE <span>\uFF0B</span>",analysisSizeLabel:"\u5206\u6790\u7528\u7684\u957F\u8FB9",memoryLabel:"\u74E6\u7247\u7F13\u5B58\u4E0A\u9650",computeLabel:"\u5206\u6790\u52A0\u901F",computeAuto:"\u81EA\u52A8 \xB7 \u5B9E\u6D4B\u540E\u9009 WebGPU \u6216 CPU",computeWebgpu:"WebGPU \u5206\u6790 \xB7 CPU \u914D\u51C6",computeCpu:"\u4EC5 CPU",computeHint:"GPU \u8D1F\u8D23\u628A\u89E3\u7801\u51FA\u7684\u6BCF\u4E00\u5E27\u8F6C\u6210\u50CF\u7D20\u3001\u7F29\u51FA\u5206\u6790\u5C0F\u56FE\uFF1B\u5339\u914D\u548C\u62FC\u63A5\u4ECD\u5728 CPU \u4E0A\u3002\u81EA\u52A8\u6A21\u5F0F\u4F1A\u5148\u5B9E\u6D4B\uFF0CGPU \u4E0D\u66F4\u5FEB\u5C31\u4E0D\u7528\u5B83\u3002",decoderLabel:"\u89E3\u7801\u65B9\u5F0F",decoderPrecise:"\u9010\u5E27 \xB7 WebCodecs",decoderCompatibility:"\u8FD1\u4F3C \xB7 \u539F\u751F seek",decoderHint:"\u5206\u6790\u7F29\u56FE\u4E0D\u6539\u53D8\u8F93\u51FA\u50CF\u7D20\u3002\u74E6\u7247\u7F13\u5B58\u53EA\u653E\u62FC\u597D\u7684\u56FE\u5757\uFF0C\u653E\u4E0D\u4E0B\u4E00\u5E27\u8981\u753B\u7684\u56FE\u5757\u65F6\u4F1A\u81EA\u5DF1\u52A0\u5927\uFF0C\u6240\u4EE5\u51E0\u4E4E\u4E0D\u5F71\u54CD\u901F\u5EA6\uFF1B\u6D4F\u89C8\u5668\u3001\u89E3\u7801\u5668\u3001GPU \u548C\u8BA1\u7B97\u6838\u5FC3\u7528\u7684\u5185\u5B58\u4E0D\u7B97\u5728\u91CC\u9762\u3002\u517C\u5BB9 seek \u6A21\u5F0F\u53EF\u80FD\u6F0F\u6389\u77ED\u6682\u5185\u5BB9\u3002",pauseBtn:"\u6682\u505C",stopBtn:"\u505C\u6B62\u5E76\u4FDD\u5B58",footerNote:"\u4E0D\u4E0A\u4F20 \xB7 \u65E0\u4E91\u7AEF\u63A8\u7406 \xB7 \u65E0\u5916\u90E8\u6A21\u578B"},canvas:{ariaLabel:"\u5927\u622A\u56FE",selectAriaLabel:"\u9009\u62E9\u753B\u5E03",waitingOption:"\u8FD8\u6CA1\u6709\u7ED3\u679C",qualityMask:"\u663E\u793A\u62FC\u63A5\u8D28\u91CF",fitTitle:"\u7F29\u653E\u5230\u80FD\u770B\u5230\u6574\u5F20\u56FE",fitBtn:"\u770B\u5168\u56FE",nativeTitle:"\u539F\u5C3A\u5BF8",viewerAriaLabel:"\u5927\u622A\u56FE\uFF0C\u53EF\u4EE5\u62D6\u52A8\u548C\u7F29\u653E",zoomOutLabel:"\u7F29\u5C0F",zoomInLabel:"\u653E\u5927",expandLabel:"\u653E\u5927\u67E5\u770B",emptyTitle:"\u6B63\u5728\u62FC\u2026",emptyBody:"\u6BCF\u4E00\u5E27\u90FD\u5728\u627E\u81EA\u5DF1\u5728\u6574\u5F20\u56FE\u91CC\u7684\u4F4D\u7F6E\u3002",statusReady:"\u51C6\u5907\u597D\u4E86",progressMessageDefault:"\u653E\u5F55\u5C4F \u2192 \u6309\u8FD0\u884C \u2192 \u62FF\u6574\u5F20",lodLabel:"\u68CB\u76D8\u683C = \u6CA1\u770B\u5230\u7684\u5730\u65B9"},understand:{noteBtn:"\u65E5\u5FD7",heading:"\u8FD0\u884C\u65E5\u5FD7",desc:"\u6253\u5370\u673A\u6BCF\u4E00\u6B65\u600E\u4E48\u5224\u65AD\u7684\u3001\u770B\u5230\u4E86\u4EC0\u4E48\u53D8\u5316\u3001\u9047\u5230\u4E86\u4EC0\u4E48\u95EE\u9898\uFF0C\u90FD\u8BB0\u5728\u8FD9\u91CC\u3002",framesLabel:"\u5DF2\u5408\u6210\u5E27",canvasesLabel:"\u72EC\u7ACB\u753B\u5E03",coverageBody:"\u900F\u660E \u2260 \u767D\u8272\u9875\u9762<br><small>\u900F\u660E\u7684\u5730\u65B9\u662F\u5F55\u5C4F\u6CA1\u62CD\u5230\u7684\uFF0C\u4E0D\u4F1A\u51ED\u7A7A\u8865\u5185\u5BB9\u3002</small>",diagnosticsHeading:"\u8BCA\u65AD\u8BB0\u5F55",filterAriaLabel:"\u8BCA\u65AD\u8FC7\u6EE4",filterAll:"\u5168\u90E8",filterIssues:"\u8B66\u544A / \u9519\u8BEF",diagnosticsAriaLabel:"\u5904\u7406\u8BCA\u65AD",diagnosticsEmpty:"\u6BCF\u4E00\u5E27\u653E\u5728\u54EA\u513F\u3001\u9875\u9762\u6709\u4EC0\u4E48\u53D8\u5316\u3001<br>\u5904\u7406\u65F6\u9047\u5230\u7684\u95EE\u9898\uFF0C\u90FD\u4F1A\u8BB0\u5728\u8FD9\u91CC\u3002",moreDiagnostics:"\u52A0\u8F7D\u66F4\u591A\u8BCA\u65AD",reportLead:"\u7ED3\u679C\u4E0D\u5BF9\uFF0C\u6216\u8005\u51FA\u9519\u4E86\uFF1F",reportBtn:"\u53BB GitHub \u62A5\u544A\u95EE\u9898",reportNote:"\u4F1A\u9884\u586B\u6D4F\u89C8\u5668\u4FE1\u606F\u548C\u8FD9\u91CC\u7684\u8B66\u544A\u4EE3\u7801\uFF0C\u4E0D\u542B\u5F55\u5C4F\u3001\u753B\u9762\u548C\u6587\u4EF6\u540D\uFF1B\u63D0\u4EA4\u524D\u4F60\u53EF\u4EE5\u5148\u770B\u3001\u5148\u6539\u3002"},export:{downloadPng:"\u4E0B\u8F7D\u5927\u622A\u56FE \xB7 PNG <span>\u2193</span>",copyPng:"\u590D\u5236\u5927\u622A\u56FE",pngNote:"\u4E00\u6574\u5F20\u539F\u5C3A\u5BF8 PNG\uFF0C\u4E0D\u7F29\u5C0F\u3001\u4E0D\u5206\u9875\u3002",advancedSummary:"\u66F4\u591A\u5BFC\u51FA\u65B9\u5F0F",exportProject:"\u5BFC\u51FA\u5B8C\u6574\u9879\u76EE \xB7 ZIP",projectNote:"\u539F\u5C3A\u5BF8\u74E6\u7247 + \u79BB\u7EBF\u67E5\u770B\u5668 + \u8986\u76D6/\u8D28\u91CF\u6570\u636E + \u5B8C\u6574\u8BCA\u65AD\uFF0C\u4F9B\u5B58\u6863\u6216\u6392\u67E5\u3002",exportSheets:"\u5206\u9875\u5BFC\u51FA \xB7 \u591A\u5F20 PNG\uFF08ZIP\uFF09",sheetsNote:"\u8D85\u957F\u753B\u5E03\u6309\u517C\u5BB9\u5C3A\u5BF8\u62C6\u6210\u591A\u5F20\u539F\u5C3A\u5BF8 PNG\uFF0C\u9875\u95F4\u91CD\u53E0 32px\uFF0C\u9644\u4E16\u754C\u5750\u6807\u6E05\u5355\uFF1B\u4E0D\u7F29\u5C0F\u3002",starNudge:"\u597D\u7528\u7684\u8BDD\uFF0C\u53BB GitHub \u7ED9\u6211\u4EEC\u70B9\u4E2A\u661F"},help:{title:"\u4F7F\u7528\u8BF4\u660E",pixelsHeading:"\u54EA\u4E9B\u50CF\u7D20\u88AB\u4FDD\u7559\uFF1F",pixelsBody:"\u7CBE\u786E\u6A21\u5F0F\u9010\u5E27\u89E3\u7801\u3002\u6240\u6709\u5B8C\u6210\u5904\u7406\u7684\u89C2\u5BDF\u90FD\u6709\u65F6\u95F4\u6233\u548C\u5408\u6210\u8BB0\u5F55\u3002\u5206\u6790\u53EF\u4EE5\u7F29\u56FE\uFF0C\u6700\u7EC8\u5408\u6210\u4E0E\u5BFC\u51FA\u4FDD\u6301\u539F\u59CB\u50CF\u7D20\u5C3A\u5EA6\u3002",frameHeading:"\u5916\u6846\u4E0E\u81EA\u7136\u7559\u767D",frameBody:"\u9ED8\u8BA4\u4FDD\u7559\u6574\u4E2A\u6372\u52A8\u533A\u57DF\u7684\u80CC\u666F\u3001\u8FB9\u8DDD\u548C\u7559\u767D\uFF0C\u4E0D\u88C1\u5230\u6587\u5B57\u8FB9\u754C\u3002\u5E26\u5916\u6846\u89C6\u56FE\u989D\u5916\u4FDD\u7559\u4E00\u5E27\u53C2\u8003\u754C\u9762\uFF1A\u4FA7\u680F\u6587\u5B57\u3001\u5DE5\u5177\u56FE\u793A\u4EE5\u539F\u5C3A\u5BF8\u51FA\u73B0\u4E00\u6B21\uFF0C\u6269\u5C55\u5904\u4EC5\u7EED\u63A5\u88C5\u9970\u80CC\u666F\uFF0C\u4E0D\u5C5E\u4E8E\u91CD\u5EFA\u8BC1\u636E\u3002\u539F\u59CB\u5185\u5BB9\u5C42\u59CB\u7EC8\u5355\u72EC\u4FDD\u7559\u3002\u5176\u4ED6\u72EC\u7ACB pane \u4E0D\u4F1A\u88AB\u5047\u88C5\u62FC\u6210\u540C\u4E00\u8F68\u8FF9\u3002",scopeHeading:"\u8FD9\u91CC\u4E0D\u662F\u201C\u4E07\u80FD\u9875\u9762\u7406\u89E3\u201D",scopeBody:"\u8FD0\u52A8\u5206\u5C42\u3001\u91CD\u590D\u7EB9\u7406\u6D88\u6B67\u548C\u52A8\u6001\u533A\u57DF\u5F52\u5C5E\u90FD\u662F\u89C6\u89C9\u63A8\u65AD\u3002\u6BD4\u4F8B\u53D8\u5316\u3001\u65E0\u91CD\u53E0\u6216\u4E0D\u80FD\u5171\u5B58\u7684\u5E03\u5C40\u53EF\u80FD\u6210\u4E3A\u72EC\u7ACB\u7247\u6BB5\uFF1B\u8FD9\u4E9B\u7247\u6BB5\u4E4B\u95F4\u4E0D\u88AB\u5BA3\u79F0\u5DF2\u7ECF\u5BF9\u9F50\u3002\u7F6E\u4FE1\u5EA6\u4E0D\u662F\u7ECF\u8FC7\u6821\u51C6\u7684\u6B63\u786E\u6982\u7387\u3002",storageHeading:"\u957F\u5F55\u5C4F\u4E0E\u5B58\u50A8",storageBody:"\u91C7\u7528\u4E09\u6B21\u89E3\u7801\u626B\u63CF\uFF0C\u4EE5\u78C1\u76D8\u7A7A\u95F4\u548C\u8BA1\u7B97\u65F6\u95F4\u6362\u53D6\u6709\u9650\u5185\u5B58\u3002\u6D4F\u89C8\u5668\u53EA\u66FF\u4F60\u4FDD\u7559\u6700\u8FD1\u4E00\u6B21\u7684\u7ED3\u679C\uFF0C\u6700\u591A 24 \u5C0F\u65F6\uFF1A\u5237\u65B0\u6216\u4E0D\u5C0F\u5FC3\u5173\u6389\u9875\u9762\u540E\u518D\u6253\u5F00\uFF0C\u5B83\u4F1A\u81EA\u52A8\u56DE\u6765\uFF1B\u8DD1\u5230\u4E00\u534A\u88AB\u4E2D\u65AD\u7684\uFF0C\u4F1A\u56DE\u6765\u5DF2\u4FDD\u5B58\u7684\u90E8\u5206\uFF08\u4E0D\u80FD\u4ECE\u4E2D\u65AD\u5904\u7EED\u8DD1\uFF09\u3002\u518D\u8FD0\u884C\u4E00\u6B21\u6216\u6309\u300C\u6E05\u7A7A\u300D\u4F1A\u5220\u6389\u5B83\uFF1B\u8D85\u8FC7 24 \u5C0F\u65F6\u7684\uFF0C\u4F1A\u5728\u4E0B\u6B21\u6253\u5F00\u9875\u9762\u65F6\u5220\u6389\u3002\u60F3\u957F\u671F\u4FDD\u7559\u8BF7\u4E0B\u8F7D\u3002",browserHeading:"\u6D4F\u89C8\u5668\u4E0E\u683C\u5F0F",browserBody:"\u9700\u8981 IndexedDB\u3001OffscreenCanvas\u3001CompressionStream\u3002\u672C\u673A\u5F00\u53D1\u53EF\u76F4\u63A5\u7528 HTTP localhost\uFF0C\u65E0\u9700\u8BC1\u4E66\uFF1B\u624B\u673A\u8BBF\u95EE\u5C40\u57DF\u7F51 HTTP \u65F6\u53EF\u9009\u62E9\u8FD1\u4F3C seek \u6D4B\u8BD5\uFF0C\u4F46\u53EF\u80FD\u6F0F\u5E27\u3002\u6D4F\u89C8\u5668\u901A\u5E38\u53EA\u5728 localhost \u6216 HTTPS \u5F00\u653E WebCodecs \u7CBE\u786E\u89E3\u7801\u4E0E\u78C1\u76D8\u5BFC\u51FA\u63A5\u53E3\uFF0C\u8FD9\u4E0E\u4E0A\u4F20\u65E0\u5173\u3002\u7CBE\u786E\u89E3\u7801\u8FD8\u9700\u8981\u8BBE\u5907\u652F\u6301\u76F8\u5E94 codec\uFF1BMP4/MOV/WebM \u5BB9\u5668\u4E0D\u7B49\u4E8E\u8BBE\u5907\u80FD\u89E3\u7801\u5176\u6240\u6709\u7F16\u7801\u3002",tipsHeading:"\u600E\u4E48\u5F97\u5230\u66F4\u597D\u7684\u7ED3\u679C\uFF1F",tipsBody:"\u4FDD\u7559\u8DB3\u591F\u91CD\u53E0\uFF1B\u9047\u5230\u4F4E\u7EB9\u7406\u533A\u57DF\u7A0D\u6162\u79FB\u52A8\u3002\u591A\u4E2A pane \u6216\u60AC\u6D6E\u5C42\u8BC6\u522B\u4E0D\u51C6\u65F6\uFF0C\u7528\u201C\u5355\u72EC\u6EDA\u52A8\u7684\u533A\u57DF\u201D\u624B\u52A8\u753B\u51FA\u6765\u518D\u5904\u7406\u3002\u6240\u6709\u8BCA\u65AD\u53EF\u4ECE\u5B8C\u6574\u9879\u76EE\u5BFC\u51FA\u3002",feedbackHeading:"\u53CD\u9988\u4E0E\u6E90\u7801",feedbackBody:'Long Screen \u662F MIT \u534F\u8BAE\u7684\u5F00\u6E90\u9879\u76EE\uFF0C\u6E90\u7801\u5728 <a href="https://github.com/t41372/long-screen" target="_blank" rel="noopener">GitHub</a>\u3002\u9047\u5230 bug \u6216\u7ED3\u679C\u4E0D\u5BF9\uFF0C\u6B22\u8FCE<a class="report-link" href="https://github.com/t41372/long-screen/issues/new" target="_blank" rel="noopener">\u63D0\u4E00\u4E2A issue</a>\uFF0C\u4F1A\u9884\u586B\u6D4F\u89C8\u5668\u4FE1\u606F\u548C\u65E5\u5FD7\u91CC\u7684\u8B66\u544A\u4EE3\u7801\u3002\u89C9\u5F97\u597D\u7528\u7684\u8BDD\uFF0C\u7ED9\u9879\u76EE\u70B9\u4E2A\u661F\u5BF9\u6211\u4EEC\u5E2E\u52A9\u5F88\u5927\u3002',toolsHeading:"\u7F51\u9875\u4E4B\u5916",toolsBody:'\u8FD9\u4E2A\u7F51\u9875\u80CC\u540E\u7684\u5F15\u64CE\u4E5F\u80FD\u5355\u72EC\u62FF\u6765\u7528\uFF1A\u6709<a href="https://github.com/t41372/long-screen#command-line" target="_blank" rel="noopener">\u547D\u4EE4\u884C\u5DE5\u5177</a>\u3001<a href="https://github.com/t41372/long-screen#rust-library" target="_blank" rel="noopener">Rust \u5E93</a>\u548C <a href="https://github.com/t41372/long-screen#python-package" target="_blank" rel="noopener">Python \u5305</a>\uFF0C\u4E5F\u6709\u7ED9\u5176\u4ED6\u7F51\u9875\u8C03\u7528\u7684 <a href="https://github.com/t41372/long-screen#typescript-package" target="_blank" rel="noopener">TypeScript \u5305</a>\uFF0C\u540C\u6837\u53EA\u5728\u672C\u673A\u5904\u7406\u5F55\u5C4F\u3002\u5B89\u88C5\u548C\u7528\u6CD5\u89C1 README\u3002',licenseHeading:"\u5F00\u6E90\u6388\u6743",licenseBody:'Long Screen \u81EA\u8EAB\u7684\u4EE3\u7801\u7528 MIT \u534F\u8BAE\uFF1A\u53EF\u4EE5\u514D\u8D39\u4F7F\u7528\u3001\u590D\u5236\u3001\u4FEE\u6539\u3001\u518D\u53D1\u5E03\uFF0C\u4E5F\u53EF\u4EE5\u5546\u7528\u6216\u653E\u8FDB\u95ED\u6E90\u4EA7\u54C1\uFF0C\u53EA\u8981\u5728\u526F\u672C\u91CC\u4FDD\u7559\u7248\u6743\u58F0\u660E\u548C<a href="https://github.com/t41372/long-screen/blob/main/LICENSE" target="_blank" rel="noopener">\u534F\u8BAE\u539F\u6587</a>\uFF1B\u8F6F\u4EF6\u6309\u73B0\u72B6\u63D0\u4F9B\uFF0C\u4E0D\u9644\u5E26\u4EFB\u4F55\u62C5\u4FDD\u3002Wasm \u6838\u5FC3\u4E0E\u524D\u7AEF\u8D44\u6E90\u4E2D\u6253\u5305\u7684\u7B2C\u4E09\u65B9\u4F9D\u8D56\u53CA\u5176\u8BB8\u53EF\uFF0C\u4EE5\u53CA\u9875\u9762\u4E0A Rust\u3001WebAssembly\u3001GitHub \u6807\u5FD7\u7684\u51FA\u5904\u4E0E\u6388\u6743\uFF0C\u89C1 <a href="./THIRD_PARTY_NOTICES.txt" target="_blank" rel="noopener">\u5F00\u6E90\u6388\u6743\u8BF4\u660E</a>\uFF08\u6784\u5EFA\u65F6\u751F\u6210\uFF09\u3002'},regions:{title:"\u6307\u5B9A\u5355\u72EC\u6EDA\u52A8\u7684\u533A\u57DF",hint:"\u5728\u753B\u9762\u4E0A\u62D6\u51FA\u77E9\u5F62\u3002\u6BCF\u4E2A\u201C\u5185\u5BB9\u201D\u533A\u57DF\u72EC\u7ACB\u91CD\u5EFA\u3002\u672A\u6846\u9009\u533A\u57DF\u4F1A\u660E\u786E\u4FDD\u7559\u4E3A\u5355\u72EC\u7684\u4F4E\u7F6E\u4FE1\u89C2\u5BDF\u5C42\uFF1B\u201C\u5FFD\u7565\u201D\u533A\u57DF\u662F\u4E3B\u52A8\u6392\u9664\u3002",kindMoving:"\u5185\u5BB9 \xB7 \u72EC\u7ACB\u6EDA\u52A8",kindFixed:"\u56FA\u5B9A\u754C\u9762",kindIgnore:"\u5FFD\u7565 \xB7 \u4E3B\u52A8\u6392\u9664",clearBtn:"\u6062\u590D\u81EA\u52A8\u8BC6\u522B",saveBtn:"\u4F7F\u7528\u8FD9\u4E9B\u533A\u57DF"},source:{title:"\u5F55\u5C4F\u539F\u753B\u9762"},crop:{button:"\u88C1\u5207",groupLabel:"\u88C1\u5207\u8303\u56F4",left:"\u8DDD\u5DE6",top:"\u8DDD\u4E0A",width:"\u5BBD",height:"\u9AD8",full:"\u6574\u5F20",cancel:"\u53D6\u6D88",apply:"\u88C1\u597D\u4E86"},footer:{stackLead:"\u6838\u5FC3\u7528",stackMid:"\u5199\u6210\uFF0C\u7F16\u8BD1\u6210",stackTail:"\u5728\u4F60\u7684\u6D4F\u89C8\u5668\u91CC\u8FD0\u884C\u3002",stackMore:"\u754C\u9762 TypeScript \xB7 \u6784\u5EFA\u4E0E\u6D4B\u8BD5 Deno",linksLabel:"\u9879\u76EE\u94FE\u63A5",source:"GitHub \u6E90\u7801",report:"\u62A5\u544A\u95EE\u9898",notices:"\u5F00\u6E90\u6388\u6743\u8BF4\u660E",trademarks:"Rust\u3001WebAssembly\u3001TypeScript\u3001Deno \u548C GitHub \u7684\u540D\u79F0\u4E0E\u6807\u5FD7\u5F52\u5404\u81EA\u6240\u6709\u8005\uFF1B\u8FD9\u91CC\u53EA\u8BF4\u660E\u672C\u9879\u76EE\u7528\u5230\u4E86\u5B83\u4EEC\uFF0C\u4E0D\u4EE3\u8868\u5B83\u4EEC\u8BA4\u53EF\u672C\u9879\u76EE\u3002"}},deviceCheck:{title:"\u8BBE\u5907\u68C0\u67E5",intro:`\u6D4B\u91CF\u672C\u673A\u6D4F\u89C8\u5668\u63D0\u4F9B\u7684\u80FD\u529B\uFF08\u8DE8\u6E90\u9694\u79BB / \u7EBF\u7A0B\u3001WebGPU \u9002\u914D\u5668\uFF09\u548C GPU \u8DEF\u5F84\u7684\u5B9E\u9645\u5F00\u9500\uFF1A\u4E00\u5E27\u539F\u751F RGBA \u7684\u4E0A\u4F20\u4E0E\u8BFB\u56DE\u3001
3
+ \u5206\u6790\u964D\u91C7\u6837\u5728 GPU \u4E0E Rust \u6838\u5FC3\u4E0A\u7684\u8017\u65F6\u53CA\u9010\u5B57\u8282\u4E00\u81F4\u6027\u3002\u53EF\u9009\uFF1A\u9009\u4E00\u6BB5\u5F55\u5C4F\uFF0C\u5206\u522B\u4EE5 CPU \u4E0E\u5F3A\u5236 WebGPU \u8DD1\u5B8C\u6574\u6D41\u7A0B\u5E76\u6BD4\u8F83\u74E6\u7247\u6307\u7EB9\u3002
4
+ \u6240\u6709\u5904\u7406\u90FD\u5728\u672C\u673A\u5B8C\u6210\uFF0C\u4E0D\u4E0A\u4F20\u4EFB\u4F55\u5185\u5BB9\uFF1B\u5F55\u5C4F\u7684\u8FD0\u884C\u6570\u636E\u5728\u6BD4\u8F83\u540E\u5220\u9664\u3002WebGPU \u53EA\u5728\u5B89\u5168\u4E0A\u4E0B\u6587\uFF08localhost \u6216 HTTPS\uFF09\u4E2D\u53EF\u7528\u3002`,recordingLabel:"\u5F55\u5C4F\uFF08\u53EF\u9009\uFF09\uFF1A",runBtn:"\u5F00\u59CB\u68C0\u67E5",loadingReport:"\u52A0\u8F7D\u6838\u5FC3\u2026"}};var Le={ui:{phase:{scanning:"\u9010\u5E27\u770B\u5F55\u5C4F",solving:"\u7ED9\u6BCF\u4E00\u5E27\u627E\u4F4D\u7F6E",optimizing:"\u6821\u6B63\u7D2F\u79EF\u8BEF\u5DEE",rendering:"\u6309\u539F\u5C3A\u5BF8\u62FC\u56FE",revealing:"\u53BB\u6389\u6D6E\u5728\u9875\u9762\u4E0A\u7684\u4E1C\u897F",framing:"\u8FD8\u539F\u7A97\u53E3\u5916\u6846",pyramid:"\u751F\u6210\u9884\u89C8",complete:"\u62FC\u597D\u4E86",partial:"\u90E8\u5206\u7ED3\u679C\u5DF2\u4FDD\u5B58",error:"\u51FA\u9519\u4E86"},count:{frames_one:"{{frames}} \u5E27",frames_other:"{{frames}} \u5E27",framesUnknown:"? \u5E27",regions_one:"{{count}} \u4E2A\u6307\u5B9A\u533A\u57DF \u2197",regions_other:"{{count}} \u4E2A\u6307\u5B9A\u533A\u57DF \u2197"},dom:{noCompressionStream:"\u5F53\u524D\u6D4F\u89C8\u5668\u7F3A\u5C11 CompressionStream\uFF1B\u6BCF\u5F20\u539F\u5C3A\u5BF8\u74E6\u7247\u90FD\u9760\u5B83\u7F16\u7801\u4E3A PNG\uFF0C\u65E0\u6CD5\u5F00\u59CB\u91CD\u5EFA\u3002"},canvases:{badgePresentation:"\u5E26\u5916\u6846 \xB7 \u5EF6\u4F38\u51FA\u6765\u7684\u80CC\u666F\u4E0D\u662F\u5F55\u5230\u7684",badgeFixed:"\u56FA\u5B9A\u754C\u9762",badgeMoving:"\u5185\u5BB9",badge_one:"{{kind}} \xB7 {{count}} \u5757\u539F\u5C3A\u5BF8\u74E6\u7247{{fragment}}",badge_other:"{{kind}} \xB7 {{count}} \u5757\u539F\u5C3A\u5BF8\u74E6\u7247{{fragment}}",fragmentNote:" \xB7 \u51E0\u4E2A\u7247\u6BB5\u4E4B\u95F4\u4E0D\u4FDD\u8BC1\u5BF9\u9F50"},diagnostics:{occurrenceSuffix:"\uFF08\u672C\u7C7B\u4E8B\u4EF6\u7D2F\u8BA1 {{count}} \u6B21\uFF09",locateAction:"\u5B9A\u4F4D\u53D7\u5F71\u54CD\u533A\u57DF / \u67E5\u770B\u6765\u6E90 \u2197",viewSourceAction:"\u67E5\u770B\u539F\u59CB\u65F6\u523B \u2197",emptyFiltered:"\u5F53\u524D\u8FC7\u6EE4\u6761\u4EF6\u4E0B\u6CA1\u6709\u8BB0\u5F55\u3002",emptyDefault:"\u6BCF\u4E00\u5E27\u653E\u5728\u54EA\u513F\u3001\u9875\u9762\u6709\u4EC0\u4E48\u53D8\u5316\u3001\u5904\u7406\u65F6\u9047\u5230\u7684\u95EE\u9898\uFF0C\u90FD\u4F1A\u8BB0\u5728\u8FD9\u91CC\u3002",noOriginalVideo:"\u539F\u59CB\u89C6\u9891\u672A\u5305\u542B\u5728\u9879\u76EE\u4E2D\u3002\u8BF7\u91CD\u65B0\u9009\u62E9\u5BF9\u5E94\u5F55\u5C4F\uFF0C\u518D\u901A\u8FC7\u65F6\u95F4\u6233\u67E5\u770B\uFF1B\u5408\u6210\u7ED3\u679C\u4ECD\u4FDD\u5B58\u5728\u672C\u5730\u3002",hashMismatch:"\u6240\u9009\u6587\u4EF6\u540D\u79F0\u4E0E\u5927\u5C0F\u76F8\u7B26\uFF0C\u4F46\u5185\u5BB9\u54C8\u5E0C\u4E0E\u672C\u9879\u76EE\u6700\u521D\u5904\u7406\u7684\u5F55\u5C4F\u4E0D\u4E00\u81F4\uFF0C\u62D2\u7EDD\u4F5C\u4E3A\u6E90\u65F6\u523B\u8BC1\u636E\u663E\u793A\u3002\u8BF7\u91CD\u65B0\u9009\u62E9\u6B63\u786E\u7684\u5F55\u5C4F\u6587\u4EF6\u3002",sourceCaption:"\u6E90\u5E27 {{frame}} \xB7 {{time}} \u79D2 \xB7 {{message}}"},export:{imageSuffix:"-\u5927\u622A\u56FE",savePickerFallback:"\u76F4\u63A5\u4FDD\u5B58\u4E0D\u53EF\u7528\uFF0C\u6539\u7528\u6D4F\u89C8\u5668\u4E0B\u8F7D\uFF1A{{error}}",saveRowLabel:"\u4FDD\u5B58 {{name}} \xB7 {{size}}",shareLabel:"\u5206\u4EAB / \u5B58\u5230\u7167\u7247",shareFailed:"\u5206\u4EAB\u5931\u8D25\uFF1A{{error}}",cleanupLabel:"\u4FDD\u5B58\u540E\u6E05\u7406\u4E34\u65F6\u526F\u672C",exportErrorAction:"\u6CA1\u6709\u628A\u672A\u5B8C\u6210\u7684\u5BFC\u51FA\u6807\u8BB0\u4E3A\u6210\u529F\u3002\u5DF2\u63D0\u4EA4\u7684\u9879\u76EE\u74E6\u7247\u4ECD\u5728\u672C\u673A\u3002",clipboardUnsupported:"\u8FD9\u4E2A\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u590D\u5236\u56FE\u7247\uFF0C\u8BF7\u7528\u201C\u4E0B\u8F7D\u5927\u622A\u56FE\u201D\u3002",copyNoImage:"\u6CA1\u6709\u751F\u6210\u56FE\u7247",copyFailedCtor:"\u590D\u5236\u5931\u8D25\uFF1A{{error}}\u3002\u8BF7\u6539\u7528\u201C\u4E0B\u8F7D\u5927\u622A\u56FE\u201D\u3002",copySuccess:"\u5DF2\u590D\u5236 {{width}} \xD7 {{height}} \u7684\u5927\u622A\u56FE\uFF0C\u53EF\u4EE5\u76F4\u63A5\u7C98\u8D34\u3002",copyFailed:"\u590D\u5236\u5931\u8D25\uFF1A{{error}}\u3002\u56FE\u7247\u53EF\u80FD\u8D85\u51FA\u7CFB\u7EDF\u526A\u8D34\u677F\u7684\u9650\u5236\uFF0C\u8BF7\u6539\u7528\u201C\u4E0B\u8F7D\u5927\u622A\u56FE\u201D\u3002"},crop:{buttonCropped:"\u88C1\u5207 \xB7 {{width}} \xD7 {{height}}",applied:"\u597D\u4E86\uFF0C\u4E4B\u540E\u4E0B\u8F7D\u3001\u590D\u5236\u548C\u5206\u9875\u5BFC\u51FA\u90FD\u53EA\u53D6\u8FD9\u4E00\u5757\uFF08{{width}} \xD7 {{height}}\uFF09\u3002\u5B8C\u6574\u9879\u76EE ZIP \u4E0D\u53D7\u5F71\u54CD\u3002",removed:"\u5DF2\u53D6\u6D88\u88C1\u5207\uFF0C\u5BFC\u51FA\u53C8\u662F\u6574\u5F20\u3002"},main:{offscreenMissing:"\u5F53\u524D\u6D4F\u89C8\u5668\u7F3A\u5C11 OffscreenCanvas\uFF1B\u65E0\u6CD5\u8FD0\u884C\u6E32\u67D3 Worker\u3002",webcodecsMissingToast:"\u5F53\u524D\u6D4F\u89C8\u5668\u6CA1\u6709 WebCodecs\u3002\u9700\u8981\u660E\u786E\u9009\u62E9\u53EF\u80FD\u6F0F\u5E27\u7684\u517C\u5BB9 seek \u6A21\u5F0F\u3002",privateStorageToast:"\u9690\u79C1\u6D4F\u89C8\uFF1A\u9879\u76EE\u53EA\u4FDD\u5B58\u5728\u8FD9\u4E2A\u7A97\u53E3\u7684\u5185\u5B58\u91CC\uFF0C\u5173\u95ED\u7A97\u53E3\u540E\u5373\u6D88\u5931\uFF1B\u9700\u8981\u4FDD\u7559\u8BF7\u5728\u5173\u95ED\u524D\u5BFC\u51FA\u3002",noOpfsNoPicker:"\u5F53\u524D\u6D4F\u89C8\u5668\u65E2\u6CA1\u6709 OPFS \u4E5F\u6CA1\u6709\u6587\u4EF6\u4FDD\u5B58\u5BF9\u8BDD\u6846\uFF1B\u5BFC\u51FA\u4F1A\u5728\u5185\u5B58\u4E2D\u751F\u6210\uFF08\u4E0A\u9650 {{mb}} MB\uFF09\u3002",dbOpenFailed:"\u65E0\u6CD5\u6253\u5F00\u672C\u5730\u6570\u636E\u5E93\uFF1A{{error}}",workerErrorToast:"Worker \u9519\u8BEF\uFF1A{{message}}",workerMessageUndecodable:"Worker \u6D88\u606F\u65E0\u6CD5\u89E3\u7801\u3002\u8BF7\u4FDD\u7559\u73B0\u6709\u7ED3\u679C\u5E76\u91CD\u65B0\u52A0\u8F7D\u3002",interruptedPhaseWhere:"\u300C{{phase}}\u300D\u7B2C {{frames}} \u5E27",interruptedStartPhase:"\u5F00\u59CB\u9636\u6BB5",interruptedHiddenSome:"\u9875\u9762\u5728\u540E\u53F0\u7EA6 {{seconds}} \u79D2{{stillHidden}}",interruptedStillHidden:"\uFF08\u4E2D\u65AD\u65F6\u4ECD\u5728\u540E\u53F0\uFF09",interruptedHiddenNone:"\u9875\u9762\u4E00\u76F4\u5728\u524D\u53F0",interruptedDiagnosticMessage:"\u4E0A\u4E00\u6B21\u91CD\u5EFA\u5728{{where}}\u4E2D\u65AD\uFF0C\u9875\u9762\u6CA1\u6709\u6536\u5230\u7ED3\u675F\u4FE1\u53F7\uFF08\u6D4F\u89C8\u5668\u56DE\u6536\u6216\u5D29\u6E83\u4E86\u8FD9\u4E2A\u9875\u9762\uFF09\u3002\u5DF2\u8FD0\u884C {{elapsed}} \u79D2\uFF0C\u6838\u5FC3\u5185\u5B58 {{memory}} MB\uFF0C{{hidden}}\uFF0C\u5E27\u8F6C\u6362\uFF1A{{conversion}}\uFF0C{{cores}} \u6838{{isolation}}\u3002",interruptedDiagnosticAction:"Safari \u4F1A\u5728\u9875\u9762\u8F6C\u5165\u540E\u53F0\u65F6\u4EE5\u4F4E\u5F97\u591A\u7684\u5185\u5B58\u4E0A\u9650\u56DE\u6536\u5B83\uFF1A\u957F\u65F6\u95F4\u5904\u7406\u8BF7\u4FDD\u6301\u8BE5\u6807\u7B7E\u9875\u5728\u524D\u53F0\u3002\u5B8C\u6574\u8BB0\u5F55\u5DF2\u5199\u5165\u6D4F\u89C8\u5668\u63A7\u5236\u53F0\u3002",interruptedNotIsolated:"\uFF08\u672A\u8DE8\u6E90\u9694\u79BB\uFF0C\u5355\u7EBF\u7A0B\uFF09",interruptedToast:"\u4E0A\u4E00\u6B21\u91CD\u5EFA\u5728{{where}}\u4E2D\u65AD\uFF08{{hidden}}\uFF09\u3002\u8BE6\u60C5\u89C1\u8BCA\u65AD\u3002",unknownValue:"\u672A\u77E5"},run:{pausedStatus:"\u5DF2\u6682\u505C \xB7 \u53EF\u4EE5\u7EE7\u7EED",resumedStatus:"\u7EE7\u7EED\u5904\u7406",pauseLabel:"\u6682\u505C",resumeLabel:"\u7EE7\u7EED",stopToast:"\u6B63\u5728\u7ED3\u675F\u5F53\u524D\u9636\u6BB5\uFF0C\u5E76\u5C3D\u53EF\u80FD\u5408\u6210\u3001\u4FDD\u5B58\u5DF2\u5904\u7406\u7684\u89C2\u5BDF\u3002",preparingStatus:"\u51C6\u5907\u8BFB\u53D6\u5F55\u5C4F",preparingMessage:"\u6B63\u5728\u8BFB\u53D6\u89C6\u9891\u4FE1\u606F\uFF0C\u68C0\u67E5\u6D4F\u89C8\u5668\u80FD\u4E0D\u80FD\u89E3\u7801\u3001\u672C\u5730\u7A7A\u95F4\u591F\u4E0D\u591F\u3002",compatibilityNeedsNative:"\u517C\u5BB9\u6A21\u5F0F\u9700\u8981\u6D4F\u89C8\u5668\u539F\u751F\u64AD\u653E\u5668\u80FD\u591F\u8BFB\u53D6\u8FD9\u6BB5\u89C6\u9891\u3002",webcodecsHttpBlocked:"\u6D4F\u89C8\u5668\u5728\u5F53\u524D HTTP \u5730\u5740\u672A\u5F00\u653E WebCodecs\u3002\u53EF\u9009\u62E9\u201C\u8FD1\u4F3C \xB7 \u539F\u751F seek\u201D\u7EE7\u7EED\u672C\u5730\u6D4B\u8BD5\uFF1B\u7CBE\u786E\u9010\u5E27\u89E3\u7801\u9700\u8981 localhost \u6216 HTTPS\u3002\u89C6\u9891\u4E0D\u4F1A\u4E0A\u4F20\u3002",webcodecsMissing:"\u5F53\u524D\u6D4F\u89C8\u5668\u6CA1\u6709 WebCodecs\u3002\u8BF7\u66F4\u65B0 Safari / iOS\uFF0C\u6216\u660E\u786E\u9009\u62E9\u53EF\u80FD\u6F0F\u5E27\u7684\u517C\u5BB9 seek \u6A21\u5F0F\u3002",startFailedStatus:"\u6CA1\u80FD\u5F00\u59CB",restoredMessage:"\u8FD9\u662F\u4E0A\u6B21\u7684\u7ED3\u679C\u3002\u8D85\u8FC7 24 \u5C0F\u65F6\u7684\uFF0C\u4E0B\u6B21\u6253\u5F00\u9875\u9762\u65F6\u4F1A\u5220\u6389\u3002",interruptedStatus:"\u4E0A\u6B21\u6CA1\u8DD1\u5B8C",interruptedMessage:"\u8FD9\u662F\u4E2D\u65AD\u524D\u5DF2\u4FDD\u5B58\u7684\u90E8\u5206\u3002\u8981\u5B8C\u6574\u7ED3\u679C\uFF0C\u8BF7\u91CD\u65B0\u653E\u5165\u5F55\u5C4F\u518D\u8FD0\u884C\u4E00\u6B21\u3002",waitingCanvasOption:"\u8FD8\u6CA1\u6709\u7ED3\u679C"},source:{busyToast:"\u8BF7\u5148\u5B8C\u6210\u6216\u4FDD\u5B58\u5F53\u524D\u5904\u7406\u90E8\u5206\u3002",subtitleReading:"{{size}} \xB7 \u4E0D\u4F1A\u4E0A\u4F20 \xB7 \u6B63\u5728\u8BFB\u53D6\u89C6\u9891",subtitleDetailed:"{{width}} \xD7 {{height}} \xB7 {{duration}} \xB7 {{frames}} \xB7 {{codec}} \xB7 {{size}}",subtitleNativeOnly:"{{width}} \xD7 {{height}} \xB7 {{duration}} \xB7 {{size}} \xB7 \u4EC5\u539F\u751F\u64AD\u653E\u5668\u53EF\u8BFB",subtitleUnavailable:"{{size}} \xB7 \u9010\u5E27\u89E3\u7801\u4E0E\u539F\u751F\u9884\u89C8\u90FD\u4E0D\u53EF\u7528",probeFailedMessage:"\u9010\u5E27\u89E3\u7801\u63A2\u6D4B\u5931\u8D25\uFF1A{{error}}",probeFailedAction:"\u5C06\u5C1D\u8BD5\u6D4F\u89C8\u5668\u539F\u751F\u64AD\u653E\u5668\u8BFB\u53D6\u5143\u6570\u636E\u3002\u82E5\u4ECD\u8981\u5904\u7406\uFF0C\u8BF7\u5728\u89E3\u7801\u65B9\u5F0F\u4E2D\u9009\u62E9\u201C\u8FD1\u4F3C \xB7 \u539F\u751F seek\u201D\u3002",rejectedVideo:"\u201C{{name}}\u201D\u662F {{kind}}\uFF0C\u6D4F\u89C8\u5668\u65E0\u6CD5\u9010\u5E27\u8BFB\u53D6\u8FD9\u79CD\u683C\u5F0F\uFF0C\u6CA1\u6709\u6253\u5F00\u3002\u8BF7\u5728\u5F55\u5C4F\u8F6F\u4EF6\u91CC\u6539\u4E3A\u8F93\u51FA MP4\uFF0C\u6216\u5148\u7528 HandBrake / ffmpeg \u8F6C\u6210 MP4\u3002",rejectedOther:"\u201C{{name}}\u201D\u4E0D\u662F\u89C6\u9891\uFF08{{kind}}\uFF09\uFF0C\u6CA1\u6709\u6253\u5F00\u3002\u8BF7\u9009\u62E9\u4E00\u6BB5\u6EDA\u52A8\u9875\u9762\u7684\u5C4F\u5E55\u5F55\u5F71\uFF1AMP4\u3001MOV\u3001WebM \u6216 MKV\u3002Windows \u53EF\u7528\u201C\u622A\u56FE\u5DE5\u5177\u201D\u7684\u5F55\u5236\u529F\u80FD\u6216 Xbox Game Bar\uFF08Win+Alt+R\uFF09\uFF0CMac \u7528 \u2318\u21E75\uFF0C\u624B\u673A\u7528\u7CFB\u7EDF\u81EA\u5E26\u7684\u5C4F\u5E55\u5F55\u5236\u3002",unreadableToast:"\u8BFB\u4E0D\u4E86\u8FD9\u6BB5\u89C6\u9891\uFF08{{reason}}\uFF09\u3002\u8BF7\u786E\u8BA4\u5F55\u5236\u5DF2\u6B63\u5E38\u7ED3\u675F\u3001\u6587\u4EF6\u590D\u5236\u6216\u4E0B\u8F7D\u5B8C\u6574\uFF1B\u4ECD\u4E0D\u884C\u65F6\u6362\u6210 H.264 \u7F16\u7801\u7684 MP4 \u518D\u8BD5\u3002\u9010\u5E27\u89E3\u7801\u5931\u8D25\u7684\u539F\u56E0\u89C1\u8BCA\u65AD\u8BB0\u5F55\u3002",kind:{empty:"\u7A7A\u6587\u4EF6",heif:"HEIC/AVIF \u56FE\u7247",avi:"AVI \u89C6\u9891",webp:"WebP \u56FE\u7247",wav:"WAV \u97F3\u9891",riff:"RIFF \u6587\u4EF6",wmv:"WMV/ASF \u89C6\u9891",flv:"FLV \u89C6\u9891",mpegps:"MPEG-PS \u89C6\u9891",ogg:"Ogg \u5A92\u4F53",gif:"GIF \u52A8\u56FE",png:"PNG \u56FE\u7247",jpeg:"JPEG \u56FE\u7247",pdf:"PDF \u6587\u6863",zip:"ZIP \u538B\u7F29\u5305\u6216 Office \u6587\u6863",mp3:"MP3 \u97F3\u9891",text:"\u6587\u672C\u6587\u4EF6",mpegts:"MPEG-TS \u89C6\u9891",unknown:"\u65E0\u6CD5\u8BC6\u522B\u7684\u6587\u4EF6"}},demo:{fileName:"\u793A\u4F8B\u5F55\u5C4F.mp4",loadFailed:"\u793A\u4F8B\u5F55\u5C4F\u6CA1\u80FD\u52A0\u8F7D\uFF1A{{error}}"},feedback:{issueBody:`**\u53D1\u751F\u4E86\u4EC0\u4E48\uFF1F**
5
+
6
+
7
+ **\u672C\u6765\u671F\u671B\u600E\u6837\uFF1F**
8
+
9
+
10
+ **\u5F55\u5C4F\u60C5\u51B5**\uFF08\u5F55\u7684\u662F\u4EC0\u4E48\u9875\u9762\u3001\u600E\u4E48\u79FB\u52A8\u3001\u5927\u6982\u591A\u957F\uFF1B\u53EF\u4EE5\u9644\u622A\u56FE\uFF0C\u6CE8\u610F\u906E\u4F4F\u9690\u79C1\uFF09
11
+
12
+
13
+ ---
14
+ \u4EE5\u4E0B\u7531 Long Screen \u81EA\u52A8\u586B\u5199\uFF0C\u53EF\u4EE5\u5220\u6539\uFF1A
15
+ - \u6D4F\u89C8\u5668\uFF1A{{browser}}
16
+ - \u6253\u5F00\u65B9\u5F0F\uFF1A{{page}}
17
+ - \u591A\u7EBF\u7A0B\u6838\u5FC3\uFF08\u8DE8\u6E90\u9694\u79BB\uFF09\uFF1A{{threads}}
18
+ - \u65E5\u5FD7\u91CC\u7684\u8B66\u544A\uFF1A{{warnings}}
19
+ `,portable:"\u4FBF\u643A\u7248\uFF08\u672C\u5730\u6587\u4EF6\uFF09",yes:"\u662F",no:"\u5426",none:"\u65E0"},viewer:{previewLevel:"\u9884\u89C8 L{{level}}\uFF08\u5BFC\u51FA\u4ECD\u662F\u539F\u5C3A\u5BF8\uFF09",nativeLevel:"\u539F\u5C3A\u5BF8 L0",qualityHint:" \xB7 \u653E\u5927\u770B\u62FC\u63A5\u8D28\u91CF",unobservedHint:" \xB7 \u84DD\u8272 = \u6CA1\u62CD\u5230",provisionalHint:" \xB7 \u7D2B\u8272 = \u4E00\u95EA\u800C\u8FC7\u7684\u6D6E\u5C42"}},names:{fixed:"\u56FA\u5B9A\u754C\u9762",divider:"\u56FA\u5B9A\u5206\u9694\u754C\u9762",contentCanvas:"\u5185\u5BB9\u753B\u5E03 {{n}}",unassigned:"\u672A\u6307\u5B9A\u533A\u57DF \xB7 \u5C4F\u5E55\u5750\u6807\u89C2\u5BDF",contentRegion:"\u5185\u5BB9\u533A\u57DF {{n}}",ignored:"\u4E3B\u52A8\u5FFD\u7565",fragment:"\u672A\u5B9A\u4F4D\u7247\u6BB5 {{n}}",framed:"\u4FDD\u7559\u5916\u6846"}};var Pe={diag:{MODEL_ASSUMPTIONS:{message:"\u91CD\u5EFA\u91C7\u7528\u5206\u5C42\u5E73\u79FB\u753B\u5E03\u4E0E\u51E0\u4F55\u56DE\u73AF\u7EA6\u675F\u3002\u81EA\u52A8\u906E\u7F69\u548C\u52A8\u6001\u533A\u57DF\u5C5E\u4E8E\u542F\u53D1\u5F0F\u63A8\u65AD\uFF1B\u7F6E\u4FE1\u5206\u6570\u4E0D\u662F\u7ECF\u8FC7\u6821\u51C6\u7684\u6B63\u786E\u6982\u7387\u3002\u4E16\u754C\u4E00\u81F4\u6027\u6BD4\u8F83\u6309\u672C\u7247\u6E90\u58F0\u660E\u7684\u89E3\u7801\u566A\u58F0 \xB1{{noise}} \u7EA7\u6267\u884C{{margin}}\u3002",marginLossy:"\uFF08\u538B\u7F29\u89C6\u9891\u7684\u632F\u94C3/\u8272\u5EA6\u91CD\u5EFA\u4F59\u91CF\uFF09",marginLossless:"\uFF08\u65E0\u635F\u7247\u6E90\uFF0C\u9010\u50CF\u7D20\u7CBE\u786E\u6BD4\u8F83\uFF09",action:"\u6BD4\u4F8B\u6216\u7ED3\u6784\u65E0\u6CD5\u5171\u5B58\u65F6\u4F1A\u4FDD\u7559\u72EC\u7ACB\u7247\u6BB5\uFF0C\u4E0D\u628A\u4E0D\u76F8\u5BB9\u7684\u72B6\u6001\u5F3A\u884C\u62FC\u63A5\u3002"},APPROXIMATE_DECODER:{message:"\u5DF2\u660E\u786E\u542F\u7528 {{fps}} Hz \u539F\u751F seek \u517C\u5BB9\u6A21\u5F0F\u3002\u4E0D\u80FD\u4FDD\u8BC1\u91C7\u5230\u89C6\u9891\u7684\u6BCF\u4E00\u5E27\uFF0C\u77ED\u6682\u5185\u5BB9\u53EF\u80FD\u7F3A\u5931\u3002",action:"\u9700\u8981\u9010\u5E27\u8986\u76D6\u4FDD\u8BC1\u65F6\uFF0C\u4F7F\u7528 WebCodecs \u652F\u6301\u7684 H.264\u3001VP9 \u7B49\u8F93\u5165\u3002"},ANALYSIS_PYRAMID:{message:"\u8FD0\u52A8\u5206\u6790\u7684\u957F\u8FB9\u4E0A\u9650\u4E3A {{size}}px\uFF1B\u539F\u5206\u8FA8\u7387\u50CF\u7D20\u7528\u4E8E\u7CBE\u4FEE\u548C\u6700\u7EC8\u5408\u6210\uFF0C\u8F93\u51FA\u6CA1\u6709\u8DDF\u968F\u964D\u91C7\u6837\u3002"},FRAME_MEMORY_PRESSURE:{message:"\u5355\u5E27\u539F\u59CB\u50CF\u7D20\u53CA\u53C2\u8003\u5E27\u5360\u7528\u5DF2\u63A5\u8FD1\u6240\u9009\u7F13\u5B58\u9884\u7B97\u3002\u89E3\u7801\u5668/GPU \u81EA\u8EAB\u5185\u5B58\u4E0D\u53D7 JavaScript \u7F13\u5B58\u9884\u7B97\u63A7\u5236\u3002",action:"\u4E0D\u4F1A\u9759\u9ED8\u964D\u4F4E\u8F93\u51FA\u5206\u8FA8\u7387\uFF1B\u5185\u5B58\u4E0D\u8DB3\u65F6\u4FDD\u7559\u5DF2\u63D0\u4EA4\u6570\u636E\u5E76\u62A5\u544A\u5931\u8D25\u3002"},RUN_FAILURE:{action:"\u5DF2\u7ECF\u63D0\u4EA4\u5230\u672C\u5730\u5B58\u50A8\u7684\u74E6\u7247\u4ECD\u53EF\u67E5\u770B\u548C\u5BFC\u51FA\uFF1B\u6CA1\u6709\u628A\u5931\u8D25\u6807\u8BB0\u6210\u6210\u529F\u3002"},PERSISTENCE_ERROR:{action:"\u5B58\u50A8\u5199\u5165\u4E5F\u5931\u8D25\uFF1B\u4EC5\u5148\u524D\u6210\u529F\u63D0\u4EA4\u7684\u6570\u636E\u53EF\u6062\u590D\u3002"},MEMORY_BUDGET_RAISED:{message:"\u74E6\u7247\u7F13\u5B58\u4ECE\u9884\u7B97\u5141\u8BB8\u7684 {{from}} \u5757\u63D0\u9AD8\u5230 {{to}} \u5757\uFF08\u7EA6 {{mb}} MB\uFF09\uFF0C\u4EE5\u5BB9\u7EB3\u4E00\u5E27\u89E6\u53CA\u7684\u5168\u90E8\u74E6\u7247\u3002",action:"\u5C0F\u4E8E\u5355\u5E27\u8986\u76D6\u8303\u56F4\u7684\u7F13\u5B58\u4F1A\u8BA9\u6BCF\u4E00\u5E27\u90FD\u5B8C\u6574\u5730\u91CD\u65B0\u89E3\u7801\u4E0E\u7F16\u7801\u6240\u6709\u74E6\u7247\uFF1B\u5982\u9700\u66F4\u4F4E\u5185\u5B58\uFF0C\u8BF7\u964D\u4F4E\u5F55\u5C4F\u5206\u8FA8\u7387\u3002"},NONFINITE_POSE:{message:"\u5B9A\u4F4D\u8BA1\u7B97\u4EA7\u751F\u65E0\u6548\u6570\u503C\u3002\u5DF2\u9694\u79BB\u6B64\u89C2\u5BDF\uFF0C\u672A\u5C06\u65E0\u6548\u5750\u6807\u5199\u5165\u753B\u5E03\u3002"},MISSING_PLAN:{message:"\u6E32\u67D3\u9636\u6BB5\u7F3A\u5C11 plan/{{index}}\uFF1B\u5DF2\u505C\u6B62\u5728\u5DF2\u63D0\u4EA4\u7684\u6E32\u67D3\u524D\u7F00\u3002",action:"\u68C0\u67E5\u672C\u5730\u5B58\u50A8\u5B8C\u6574\u6027\uFF1B\u7F3A\u5931\u7684\u6C42\u89E3\u8BA1\u5212\u4E0D\u4F1A\u88AB\u9759\u9ED8\u5F53\u4F5C\u7A7A\u89C2\u5BDF\u3002"},prefixOnly:{base:{scan:"\u4EC5\u5BF9\u5DF2\u7ECF\u89E3\u7801\u7684\u524D {{frames}} \u5E27\u7EE7\u7EED\u5B9A\u4F4D\u548C\u5408\u6210",solve:"\u4EC5\u5BF9\u5DF2\u7ECF\u6C42\u89E3\u7684\u524D {{frames}} \u5E27\u7EE7\u7EED\u6E32\u67D3",render:"\u4EC5\u5BF9\u5DF2\u7ECF\u6E32\u67D3\u7684\u524D {{frames}} \u5E27\u4FDD\u7559\u7ED3\u679C"},suffixPersistence:"\uFF1B\u5B58\u50A8\u5199\u5165\u5DF2\u505C\u6B62\u3002",suffixDefault:"\u3002"},PRESENTATION_TOO_SPARSE:{action:"\u8BE5\u753B\u5E03\u7684\u5E26\u5916\u6846\u5448\u73B0\u88AB\u8DF3\u8FC7\uFF1B\u9875\u9762\u5750\u6807\u4E0B\u7684\u6838\u5FC3\u91CD\u5EFA\u4E0D\u53D7\u5F71\u54CD\u3002"},PRESENTATION_FRAME:{message:"\u5E26\u5916\u6846\u89C6\u56FE\u4E0E\u539F\u59CB\u4E8C\u7EF4\u5185\u5BB9\u5206\u522B\u4FDD\u7559\u3002\u5916\u6846\u6765\u81EA\u53C2\u8003\u5E27\uFF0C\u5EF6\u957F\u90E8\u5206\u4EC5\u4E3A\u88C5\u9970\u80CC\u666F\uFF0C\u4E0D\u7B97\u4F5C\u5DF2\u89C2\u5BDF\u5185\u5BB9\uFF1B\u4E0D\u4F1A\u62C9\u4F38\u6216\u590D\u5236\u5DE5\u5177\u680F\u56FE\u6807\u3002\u5176\u4ED6 pane \u5728\u5916\u6846\u4E2D\u53EA\u662F\u53C2\u8003\u5FEB\u7167\u3002"},PRESENTATION_STAGE_FAILED:{action:"\u5E26\u5916\u6846\u5448\u73B0\u9636\u6BB5\u5931\u8D25\uFF1B\u9875\u9762\u5750\u6807\u4E0B\u7684\u6838\u5FC3\u91CD\u5EFA\u7ED3\u679C\u548C\u72B6\u6001\u4E0D\u53D7\u5F71\u54CD\u3002"},PYRAMID_FAILED:{action:"\u9884\u89C8\u91D1\u5B57\u5854\u6784\u5EFA\u5931\u8D25\uFF1B\u539F\u5C3A\u5BF8\u74E6\u7247\u4E0D\u53D7\u5F71\u54CD\uFF0C\u4ECD\u53EF\u6B63\u5E38\u67E5\u770B\u548C\u5BFC\u51FA\u3002"},PASS_FRAME_COUNT_MISMATCH:{message:"{{pass}} \u9636\u6BB5\u53EA\u5B8C\u6210 {{actual}}/{{expected}} \u5E27\uFF1B\u7ED3\u679C\u88AB\u6807\u8BB0\u4E3A partial\u3002",action:"\u5DF2\u4FDD\u7559\u6210\u529F\u63D0\u4EA4\u7684\u524D\u7F00\uFF1B\u7F3A\u5931\u7684\u5E27\u4E0D\u4F1A\u88AB\u9759\u9ED8\u5F53\u4F5C\u5DF2\u5904\u7406\u3002"},FRAME_CONVERSION:{message:"\u89E3\u7801\u540E\u7684\u6BCF\u4E00\u5E27\u8FD9\u6837\u8F6C\u6210\u50CF\u7D20\uFF1A{{method}}\u3002"},HDR_UNCHECKED:{message:"\u8FD9\u662F {{transfer}} \u683C\u5F0F\u7684 HDR \u5F55\u5C4F\uFF0C\u4F46\u5728\u8FD9\u4E2A\u6D4F\u89C8\u5668\u91CC\u6CA1\u6CD5\u6838\u5BF9\u989C\u8272\u6362\u7B97\uFF0C\u62FC\u51FA\u6765\u7684\u56FE\u989C\u8272\u53EF\u80FD\u504F\u6697\u6216\u53D1\u7070\u3002",action:"\u7528\u6700\u65B0\u7248\u7684 Chrome \u6216 Safari \u518D\u62FC\u4E00\u6B21\u3002"},HDR_ABOVE_WHITE:{message:"\u8FD9\u6BB5 HDR \u5F55\u5C4F\u7684\u7B2C\u4E00\u5E27\u6709 {{percent}}% \u7684\u50CF\u7D20\u6BD4\u666E\u901A\u767D\u8272\u8FD8\u4EAE\uFF0C\u90FD\u6309\u767D\u8272\u5904\u7406\u4E86\u3002\u8981\u662F\u62FC\u51FA\u6765\u7684\u56FE\u770B\u7740\u8FC7\u66DD\uFF0C\u591A\u534A\u662F\u5F55\u5C4F\u8F6F\u4EF6\u628A\u666E\u901A\u5185\u5BB9\u7684\u767D\u8272\u653E\u5728\u4E86\u66F4\u9AD8\u7684\u4EAE\u5EA6\u3002",action:"\u5728\u5F55\u5C4F\u8F6F\u4EF6\u91CC\u628A SDR \u767D\u8272\u4EAE\u5EA6\u8C03\u56DE 100 \u5C3C\u7279\uFF0C\u6216\u8005\u5173\u6389 HDR \u5F55\u5236\u3002"},SLOW_CONVERSION:{message:"\u8FD9\u4E2A\u6D4F\u89C8\u5668\u628A\u8FD9\u6BB5\u5F55\u5C4F\u7684\u6BCF\u4E00\u5E27\u8F6C\u6210\u50CF\u7D20\u8981\u5927\u7EA6 {{ms}} \u6BEB\u79D2\uFF0C\u6574\u6B21\u62FC\u56FE\u5149\u662F\u8F6C\u6362\u5C31\u8981\u5927\u7EA6 {{minutes}} \u5206\u949F\u3002",action:"\u6362\u7528\u6700\u65B0\u7248\u7684 Chrome \u6216 Safari \u4F1A\u5FEB\u5F88\u591A\uFF0C\u4E5F\u53EF\u4EE5\u5148\u628A\u5F55\u5C4F\u8F6C\u6210 H.264\u3002"},REVEAL_SKIPPED:{message:"\u8FD9\u6B21\u62FC\u51FA\u7684\u753B\u5E03\u592A\u591A\u6216\u592A\u5927\uFF1A\u6E05\u7406\u6D6E\u5C42\uFF08\u5149\u6807\u3001\u60AC\u6D6E\u6309\u94AE\u3001\u6EDA\u52A8\u6761\uFF09\u8FD8\u8981\u5927\u7EA6 {{need}} MB \u5185\u5B58\uFF0C\u5DF2\u7ECF\u4E0D\u591F\u4E86\uFF0C\u6240\u4EE5\u8FD9\u4E00\u6B65\u8DF3\u8FC7\u4E86\uFF0C\u76F4\u63A5\u7528\u62FC\u51FA\u6765\u7684\u50CF\u7D20\u3002",action:"\u5176\u4F59\u7ED3\u679C\u4E0D\u53D7\u5F71\u54CD\u3002\u753B\u5E03\u8FD9\u4E48\u591A\uFF0C\u901A\u5E38\u662F\u5F55\u5C4F\u91CC\u6709\u4E9B\u6BB5\u843D\u6CA1\u80FD\u548C\u524D\u540E\u8FDE\u4E0A\uFF1B\u628A\u5F55\u5C4F\u526A\u77ED\u4E00\u4E9B\u518D\u62FC\uFF0C\u6216\u6362\u4E00\u53F0\u5185\u5B58\u5927\u7684\u7535\u8111\u3002"},COMPUTE_BACKEND:{message:"{{backend}} \u2014 {{reason}}\u3002Rust \u6838\u5FC3\uFF1A{{variant}} \u6784\u5EFA\uFF0C{{threads}} \u4E2A\u8BA1\u7B97\u7EBF\u7A0B\uFF08{{coreReason}}\uFF09\u3002"},PRESENTATION_REFERENCE_FAILED:{action:"\u5E26\u5916\u6846\u5448\u73B0\u5C06\u88AB\u8DF3\u8FC7\uFF1B\u9875\u9762\u5750\u6807\u4E0B\u7684\u6838\u5FC3\u91CD\u5EFA\u4E0D\u53D7\u5F71\u54CD\u3002"},LOW_TEXTURE_UNOBSERVABLE:{message:"\u753B\u9762\u7F3A\u4E4F\u53EF\u8FA8\u8BA4\u7EB9\u7406\u3002\u5B8C\u5168\u76F8\u540C\u7684\u7A7A\u767D\u5E27\u65E2\u53EF\u80FD\u662F\u6682\u505C\uFF0C\u4E5F\u53EF\u80FD\u662F\u5728\u7A7A\u767D\u533A\u57DF\u79FB\u52A8\uFF1B\u50CF\u7D20\u672C\u8EAB\u65E0\u6CD5\u533A\u5206\u3002",action:"\u589E\u52A0\u6709\u533A\u5206\u5EA6\u7684\u53EF\u89C1\u5185\u5BB9\u6216\u5F55\u5236\u66F4\u591A\u91CD\u53E0\u3002\u96F6\u4F4D\u79FB\u53EA\u662F best guess\u3002"},UNRESOLVED_MOTION:{message:"\u8FD9\u4E00\u89C2\u5BDF\u7F3A\u5C11\u53EF\u9760\u7684\u89C6\u89C9\u5BF9\u9F50\u4F9D\u636E\u3002\u5B9A\u4F4D\u9636\u6BB5\u5C06\u5C1D\u8BD5\u5386\u53F2\u91CD\u5B9A\u4F4D\uFF1B\u4ECD\u65E0\u6CD5\u5B9A\u4F4D\u65F6\u4FDD\u7559\u72EC\u7ACB\u7247\u6BB5\u3002"},AMBIGUOUS_PATTERN:{message:"\u68C0\u6D4B\u5230\u5177\u6709\u591A\u79CD\u5408\u7406\u5339\u914D\u7684\u91CD\u590D\u7EB9\u7406\uFF1B\u8FDE\u7EED\u6027\u53EA\u662F\u5B9A\u4F4D\u5148\u9A8C\uFF0C\u4E0D\u662F\u5DF2\u8BC1\u5B9E\u7684\u552F\u4E00\u4F4D\u7F6E\u3002"},TEMPORAL_UNDERSAMPLING:{message:"\u6B64\u5E27\u6301\u7EED\u65F6\u95F4\u8F83\u957F\uFF1B\u9AD8\u901F\u79FB\u52A8\u671F\u95F4\u53EF\u80FD\u5B58\u5728\u4ECE\u672A\u88AB\u91C7\u96C6\u5230\u7684\u533A\u57DF\u3002"},MANUAL_UNASSIGNED:{message:"\u624B\u52A8\u533A\u57DF\u672A\u8986\u76D6\u7684\u90E8\u5206\u88AB\u4FDD\u7559\u4E3A\u72EC\u7ACB\u7684\u4F4E\u7F6E\u4FE1\u5C4F\u5E55\u5750\u6807\u89C2\u5BDF\u5C42\uFF0C\u6CA1\u6709\u5BA3\u79F0\u8FD9\u4E9B\u50CF\u7D20\u5DF2\u6062\u590D\u5230\u9875\u9762\u5750\u6807\u3002"},EXPLICITLY_EXCLUDED_REGION:{message:"\u6309\u624B\u52A8\u8BBE\u7F6E\u6392\u9664\u4E86\u201C\u5FFD\u7565\u201D\u533A\u57DF\u3002\u8BE5\u533A\u57DF\u4E0D\u4F1A\u8D21\u732E\u5230\u91CD\u5EFA\u7ED3\u679C\uFF0C\u8FD9\u4E0D\u662F\u81EA\u52A8\u4E22\u5E27\u3002"},MANUAL_REGION_PRIORITY:{message:"\u624B\u52A8\u533A\u57DF\u91CD\u53E0\u65F6\uFF0C\u540E\u7ED8\u5236\u533A\u57DF\u4F18\u5148\uFF1B\u5FFD\u7565\u533A\u57DF\u59CB\u7EC8\u6392\u9664\u3002\u5176\u4F59\u50CF\u7D20\u4FDD\u7559\u5728\u672A\u6307\u5B9A\u89C2\u5BDF\u5C42\u3002"},AUTOMATIC_LAYER_MASK:{message:"\u81EA\u52A8\u5212\u5206\u51FA {{moving}} \u4E2A\u5185\u5BB9\u533A\u57DF\u548C {{fixed}} \u4E2A\u56FA\u5B9A\u754C\u9762\u533A\u57DF\u3002\u8FB9\u754C\u6765\u81EA\u50CF\u7D20\u8FD0\u52A8\u7EDF\u8BA1\uFF0C\u800C\u4E0D\u662F DOM\u3002",action:"\u82E5\u906E\u7F69\u5F52\u5C5E\u4E0D\u5408\u7406\uFF0C\u53EF\u5728\u201C\u533A\u57DF\u201D\u91CC\u753B\u51FA\u7CBE\u786E\u6EDA\u52A8\u533A\u540E\u91CD\u65B0\u5904\u7406\u3002"},MULTIPLE_SCROLL_LAYERS:{message:"\u591A\u4E2A\u72EC\u7ACB\u6EDA\u52A8\u533A\u5C06\u5206\u522B\u5EFA\u7ACB\u753B\u5E03\uFF0C\u4E0D\u5F3A\u5236\u5171\u4EAB\u4E00\u4E2A scroll offset\u3002"},TEMPORAL_OR_ALIGNMENT_CONFLICT:{message:"\u672C\u5E27\u5BF9\u9F50\u540E\u7684\u91CD\u53E0\u533A\u57DF\u5171\u6709 {{conflicts}} \u4E2A\u660E\u663E\u4E0D\u540C\u7684\u50CF\u7D20\uFF1B\u6B64\u533A\u57DF\u662F\u5176\u4E2D\u4E00\u4E2A\u51B2\u7A81\u5206\u91CF\u3002\u53EF\u80FD\u662F\u52A8\u753B\u3001\u5185\u5BB9\u66F4\u65B0\u3001\u91CD\u6392\u6216\u914D\u51C6\u6B8B\u5DEE\u3002",actionStable:"\u5DF2\u5C3D\u91CF\u51BB\u7ED3\u5355\u4E00\u65F6\u523B\u7684\u5B8C\u6574\u51B2\u7A81\u533A\u57DF\uFF1B\u67E5\u770B\u6A59\u8272\u8BCA\u65AD\u548C\u539F\u89C6\u9891\u65F6\u95F4\u70B9\u3002",actionRolling:"\u4EC5\u5728\u5B8C\u6574\u53EF\u89C1\u65F6\u7528\u540C\u4E00\u5E27\u66F4\u65B0\u6574\u5757\u51B2\u7A81\u533A\u57DF\uFF1B\u5E76\u975E\u5168\u9875\u9762\u540C\u4E00\u65F6\u523B\u3002"},INCOMPLETE_TEMPORAL_PATCH:{message:"\u8FD9\u4E2A\u53D8\u5316\u533A\u57DF\u4ECE\u672A\u5B8C\u6574\u5730\u51FA\u73B0\u5728\u4E00\u4E2A\u53EF\u7528\u89C6\u53E3\u4E2D\uFF1B\u65E0\u6CD5\u4FDD\u8BC1\u5176\u6240\u6709\u50CF\u7D20\u6765\u81EA\u540C\u4E00\u65F6\u523B\u3002",action:"\u4FDD\u7559\u5DF2\u89C2\u5BDF\u5185\u5BB9\u548C\u660E\u786E\u51B2\u7A81\u6807\u8BB0\uFF0C\u6CA1\u6709\u586B\u9020\u672A\u89C2\u5BDF\u90E8\u5206\u3002"},MISSING_SCAN_RECORD:{message:"\u6C42\u89E3\u9636\u6BB5\u7F3A\u5C11 scan/{{index}}\uFF1B\u5DF2\u505C\u6B62\u5728\u5DF2\u63D0\u4EA4\u7684\u6C42\u89E3\u524D\u7F00\u3002",action:"\u68C0\u67E5\u672C\u5730\u5B58\u50A8\u5B8C\u6574\u6027\uFF1B\u7F3A\u5931\u7684\u626B\u63CF\u8BB0\u5F55\u4E0D\u4F1A\u88AB\u5F53\u4F5C\u96F6\u4F4D\u79FB\u3002"},GRAPH_RESIDUAL:{message:"\u4F4D\u7F6E\u56FE\u6700\u5927\u6B8B\u5DEE\u4ECD\u6709 {{residual}} \u539F\u50CF\u7D20\uFF1B\u76F8\u5173\u63A5\u7F1D\u53EF\u80FD\u5B58\u5728\u51E0\u4F55\u4E0D\u4E00\u81F4\u3002",action:"\u68C0\u67E5\u56DE\u73AF\u9644\u8FD1\u7684\u6587\u5B57\u4E0E\u91CD\u590D\u7EB9\u7406\u3002\u8BE5\u6B8B\u5DEE\u6CA1\u6709\u88AB\u9690\u85CF\u3002"},PARTIAL_CONTENT_CHANGE:{message:"\u7EA6 {{percent}}% \u7684\u7EB9\u7406\u533A\u5757\u4E0E\u6574\u4F53\u4F4D\u79FB\u4E0D\u4E00\u81F4\uFF08\u52A8\u753B\u3001\u89C6\u9891\u3001\u61D2\u52A0\u8F7D\u6216\u91CD\u6392\uFF09\uFF1B\u4F4D\u79FB\u7531\u4E00\u81F4\u533A\u5757\u51B3\u5B9A\uFF0C\u51B2\u7A81\u533A\u57DF\u5728\u5408\u6210\u65F6\u5355\u72EC\u5904\u7406\u3002"},THIN_OVERLAP_STEP:{message:"\u4E24\u5E27\u4E4B\u95F4\u79FB\u52A8\u5F88\u5FEB\uFF0C\u53EA\u5269\u5F88\u5C0F\u7684\u91CD\u53E0\u53EF\u4F9B\u5BF9\u9F50\u3002\u4F4D\u79FB\u53D6\u81EA\u8FD9\u4E00\u5C0F\u5757\u8BC1\u636E\uFF1B\u5728\u5468\u671F\u6027\u6392\u7248\u4E2D\uFF0C\u76F8\u90BB\u5468\u671F\u540C\u6837\u80FD\u89E3\u91CA\u8FD9\u4E9B\u50CF\u7D20\u3002",action:"\u82E5\u4E4B\u540E\u7684\u56DE\u8BBF\u7ED9\u51FA\u66F4\u5F3A\u7684\u8BC1\u636E\uFF0C\u8FD9\u6BB5\u8F68\u8FF9\u4F1A\u88AB\u6574\u4F53\u6539\u6B63\u5E76\u8BB0\u5F55\u3002"},LOW_CONFIDENCE_PLACEMENT:{messageAmbiguous:"\u91CD\u590D\u7EB9\u7406\u4F7F\u591A\u4E2A\u4F4D\u79FB\u90FD\u80FD\u89E3\u91CA\u50CF\u7D20\uFF1B\u91C7\u7528\u4E0E\u8FD0\u52A8\u8FDE\u7EED\u6027\u6700\u4E00\u81F4\u7684\u89E3\uFF0C\u8FD9\u662F best guess \u800C\u975E\u552F\u4E00\u6B63\u786E\u5BF9\u9F50\u3002",messageLowConfidence:"\u8FD9\u4E00\u533A\u57DF\u91C7\u7528\u4E86\u4F4E\u7F6E\u4FE1\u5EA6\u7684\u4F4D\u7F6E\u63A8\u65AD\uFF1B\u76F8\u5173\u50CF\u7D20\u4F1A\u5728\u8D28\u91CF\u906E\u7F69\u4E2D\u6807\u8BB0\u3002",messageStatic:"\u4E24\u5E27\u51E0\u4E4E\u76F8\u540C\u4F46\u7F3A\u5C11\u53EF\u9A8C\u8BC1\u7684\u7279\u5F81\u5BF9\u5E94\uFF1B\u6309\u6682\u505C\uFF08\u96F6\u4F4D\u79FB\uFF09\u5904\u7406\uFF0C\u8FD9\u662F best guess\u3002",action:"\u8FDE\u7EED\u8F68\u8FF9\u548C\u5DF2\u6709\u951A\u70B9\u7528\u4E8E best guess\uFF0C\u4E0D\u4EE3\u8868\u552F\u4E00\u6B63\u786E\u5BF9\u9F50\u3002"},UNOBSERVABLE_FRAME:{message:"\u8FD9\u4E00\u5E27\u5728\u8BE5\u533A\u57DF\u6CA1\u6709\u53EF\u8FA8\u8BA4\u7EB9\u7406\uFF1A\u7A7A\u767D\u5E27\u65E2\u53EF\u80FD\u662F\u6682\u505C\uFF0C\u4E5F\u53EF\u80FD\u662F\u5728\u7A7A\u767D\u533A\u57DF\u79FB\u52A8\uFF0C\u50CF\u7D20\u672C\u8EAB\u65E0\u6CD5\u533A\u5206\u3002\u5B83\u4E0D\u4F1A\u88AB\u753B\u5230\u4EFB\u4F55\u4F4D\u7F6E\u3002",action:"\u82E5\u7A7A\u767D\u4E4B\u540E\u7684\u5185\u5BB9\u65E0\u6CD5\u4E0E\u4E4B\u524D\u7684\u89C2\u5BDF\u91CD\u53E0\uFF0C\u5C06\u4FDD\u7559\u4E3A\u72EC\u7ACB\u7247\u6BB5\uFF0C\u800C\u4E0D\u662F\u731C\u6D4B\u4E2D\u95F4\u8DDD\u79BB\u3002"},RELOCALIZED:{message:"\u901A\u8FC7\u5386\u53F2\u89C6\u89C9\u951A\u70B9\u91CD\u65B0\u5B9A\u4F4D\u5230\u5DF2\u89C2\u5BDF\u753B\u5E03\uFF0C\u672A\u628A\u56DE\u8BBF\u5185\u5BB9\u8FFD\u52A0\u6210\u957F\u56FE\u3002"},SCALE_CHANGE_FRAGMENT:{message:"\u68C0\u6D4B\u5230\u7EA6 {{scale}}\xD7 \u7684\u6BD4\u4F8B/\u5E03\u5C40\u53D8\u6362\uFF0C\u5DF2\u6309\u539F\u50CF\u7D20\u4FDD\u7559\u72EC\u7ACB\u7247\u6BB5\uFF1B\u6CA1\u6709\u5077\u5077\u7F29\u653E\u6DF7\u5408\u3002",action:"\u8DE8\u7247\u6BB5\u5173\u7CFB\u5C1A\u672A\u8BC1\u5B9E\uFF1B\u540E\u7EED\u56DE\u8BBF\u82E5\u80FD\u53EF\u9760\u5339\u914D\uFF0C\u7247\u6BB5\u4F1A\u88AB\u6574\u4F53\u63A5\u56DE\u3002\u91CD\u65B0\u5F55\u5236\u65F6\u589E\u52A0\u91CD\u53E0\uFF0C\u6216\u7528\u533A\u57DF\u8BBE\u7F6E\u9694\u79BB\u53D8\u5316\u7EC4\u4EF6\u3002"},UNPLACED_FRAGMENT:{message:"\u65E0\u6CD5\u786E\u8BA4\u4E0E\u539F\u753B\u5E03\u7684\u76F8\u5BF9\u4F4D\u7F6E\uFF0C\u5DF2\u4FDD\u7559\u72EC\u7ACB\u53EF\u5BFC\u51FA\u7247\u6BB5\u3002\u4E24\u4E2A\u7247\u6BB5\u4E4B\u95F4\u53EF\u80FD\u91CD\u53E0\uFF0C\u4E5F\u53EF\u80FD\u5B58\u5728\u771F\u5B9E\u7F3A\u53E3\u3002",action:"\u8DE8\u7247\u6BB5\u5173\u7CFB\u5C1A\u672A\u8BC1\u5B9E\uFF1B\u540E\u7EED\u56DE\u8BBF\u82E5\u80FD\u53EF\u9760\u5339\u914D\uFF0C\u7247\u6BB5\u4F1A\u88AB\u6574\u4F53\u63A5\u56DE\u3002\u91CD\u65B0\u5F55\u5236\u65F6\u589E\u52A0\u91CD\u53E0\uFF0C\u6216\u7528\u533A\u57DF\u8BBE\u7F6E\u9694\u79BB\u53D8\u5316\u7EC4\u4EF6\u3002"},STICKY_OCCLUSION:{message:"\u9876\u7AEF\u7EB9\u7406\u652F\u6301\u5C4F\u5E55\u56FA\u5B9A\u800C\u975E\u9875\u9762\u4F4D\u79FB\uFF1B\u672C\u6B21\u89C2\u5BDF\u7684\u56FA\u5B9A\u906E\u6321\u4E0D\u5199\u5165\u79FB\u52A8\u753B\u5E03\u3002\u539F\u59CB\u53C2\u8003\u754C\u9762\u4FDD\u7559\u5728\u5916\u6846\u5448\u73B0\u4E2D\u3002"},FRAGMENT_ATTACHED:{message:"\u56DE\u8BBF\u8BC1\u636E\u628A\u4E00\u4E2A\u72EC\u7ACB\u7247\u6BB5\u6574\u4F53\u63A5\u56DE\u4E86\u5DF2\u6709\u753B\u5E03\uFF1B\u7247\u6BB5\u5185\u7684\u76F8\u5BF9\u8F68\u8FF9\u4FDD\u6301\u4E0D\u53D8\u3002"},TRAJECTORY_CORRECTED:{message:"\u4E0A\u4E00\u6B65\u53EA\u6709\u5F88\u5C0F\u7684\u91CD\u53E0\uFF0C\u672C\u5E27\u4E0E\u5DF2\u89C2\u5BDF\u5185\u5BB9\u7684\u5339\u914D\u76F8\u5DEE {{discrepancy}}px \u4E14\u8BC1\u636E\u66F4\u5F3A\uFF1B\u5DF2\u6309\u8FD9\u4E00\u5339\u914D\u6539\u6B63\u5F53\u524D\u4F4D\u7F6E\u3002",action:"\u88AB\u6539\u6B63\u7684\u662F\u672C\u5E27\u53CA\u4E4B\u540E\u7684\u8F68\u8FF9\uFF1B\u6B64\u524D\u5199\u5165\u7684\u50CF\u7D20\u4FDD\u6301\u539F\u6837\uFF0C\u53EF\u80FD\u4E0E\u6539\u6B63\u540E\u7684\u5750\u6807\u5B58\u5728\u63A5\u7F1D\u3002"},LOOP_CLOSURE:{message:"\u53D1\u73B0\u53EF\u9760\u7684\u5386\u53F2\u91CD\u8BBF\uFF0C\u5DF2\u52A0\u5165\u5168\u5C40\u4F4D\u7F6E\u7EA6\u675F\uFF1B\u6700\u7EC8\u5408\u6210\u4F7F\u7528\u6821\u6B63\u540E\u7684\u8F68\u8FF9\u3002"},INCONSISTENT_LOOP_REJECTED:{message:"\u5386\u53F2\u5339\u914D\u4E0E\u8FDE\u7EED\u8F68\u8FF9\u76F8\u5DEE {{discrepancy}}px\uFF1B\u8BC1\u636E\u51B2\u7A81\uFF0C\u672A\u5F3A\u52A0\u4E3A\u56DE\u73AF\u3002"},AMBIGUOUS_LOOP:{message:"\u5386\u53F2\u68C0\u7D22\u6709\u591A\u4E2A\u63A5\u8FD1\u7684\u5408\u7406\u4F4D\u7F6E\uFF1B\u6CA1\u6709\u628A\u4E0D\u786E\u5B9A\u56DE\u73AF\u5F53\u4F5C\u786C\u7EA6\u675F\u3002"}},progress:{runPartial:"\u5DF2\u4FDD\u5B58\u62FC\u597D\u7684\u90E8\u5206\uFF0C\u7ED3\u679C\u6807\u8BB0\u4E3A\u4E0D\u5B8C\u6574\u3002",runComplete:"\u62FC\u597D\u4E86\u3002\u68CB\u76D8\u683C\u662F\u6CA1\u62CD\u5230\u7684\u5730\u65B9\uFF0C\u7EC6\u8282\u89C1\u65E5\u5FD7\u3002",render:"\u6309\u539F\u5C3A\u5BF8\u628A\u62CD\u5230\u7684\u753B\u9762\u62FC\u8D77\u6765\uFF0C\u6CA1\u62CD\u5230\u7684\u5730\u65B9\u7559\u7A7A\u3002",reveal:{learn:"\u518D\u770B\u4E00\u904D\u5F55\u5C4F\uFF0C\u627E\u51FA\u4E00\u76F4\u6D6E\u5728\u9875\u9762\u4E0A\u7684\u6309\u94AE\u3001\u8F93\u5165\u680F\u548C\u6EDA\u52A8\u6761\u3002",agree:"\u6838\u5BF9\u6BCF\u4E00\u5757\u9875\u9762\u5728\u4E0D\u540C\u65F6\u523B\u662F\u4EC0\u4E48\u6837\u5B50\uFF0C\u6CA1\u88AB\u6321\u4F4F\u7684\u90A3\u6B21\u8BF4\u4E86\u7B97\u3002",relearn:"\u7528\u6838\u5BF9\u8FC7\u7684\u9875\u9762\uFF0C\u628A\u6D6E\u5728\u4E0A\u9762\u7684\u4E1C\u897F\u518D\u8BA4\u4E00\u904D\u3002",write:"\u628A\u88AB\u6321\u4F4F\u6216\u62FC\u9519\u7684\u5730\u65B9\u6362\u6210\u5E72\u51C0\u7684\u90A3\u4E00\u5E27\u3002"},framingStart:"\u8FD8\u539F\u7A97\u53E3\u5916\u6846\uFF1A\u53EA\u5EF6\u4F38\u80CC\u666F\uFF0C\u4E0D\u62C9\u4F38\u4FA7\u680F\u6587\u5B57\uFF0C\u4E5F\u4E0D\u91CD\u590D\u56FE\u6807\u3002",pyramidBuild:"\u6B63\u5728\u751F\u6210\u9884\u89C8\uFF0C\u5BFC\u51FA\u7684\u539F\u5C3A\u5BF8\u56FE\u4E0D\u53D7\u5F71\u54CD\u3002",scanFrame:"\u4E00\u5E27\u4E00\u5E27\u770B\u5F55\u5C4F\uFF0C\u627E\u51FA\u54EA\u4E9B\u533A\u57DF\u5728\u52A8\u3002",duplicateReuse:"\u8FD9\u4E00\u5E27\u548C\u524D\u9762\u5B8C\u5168\u4E00\u6837\uFF0C\u76F4\u63A5\u6CBF\u7528\u4F4D\u7F6E\u3002",solveFrame:"\u7ED9\u6BCF\u4E00\u5E27\u627E\u51C6\u4F4D\u7F6E\uFF0C\u5E76\u548C\u770B\u8FC7\u7684\u5730\u65B9\u5BF9\u4E0A\u3002",optimizing:"\u56DE\u5934\u6821\u6B63\u6574\u4F53\u4F4D\u7F6E\uFF0C\u6D88\u9664\u7D2F\u79EF\u8BEF\u5DEE\u3002"},media:{UNSUPPORTED_CODEC:"UNSUPPORTED_CODEC: \u8FD9\u4E2A\u6D4F\u89C8\u5668\u89E3\u4E0D\u4E86\u8FD9\u6BB5\u5F55\u5C4F\u7684\u7F16\u7801\uFF08{{codec}}\uFF09\u3002{{advice}}",UNSUPPORTED_ADVICE:{hevc:"iPhone \u548C Mac \u7684\u5F55\u5C4F\u591A\u662F HEVC\uFF0C\u53EA\u6709\u90E8\u5206\u6D4F\u89C8\u5668\u80FD\u89E3\uFF1A\u8BF7\u6539\u7528 Safari\uFF0C\u6216\u8005\u5E26\u786C\u4EF6\u89E3\u7801\u7684 Chrome\u3001Edge\u3002",prores:"ProRes \u6CA1\u6709\u6D4F\u89C8\u5668\u80FD\u89E3\uFF0C\u8BF7\u5148\u5BFC\u51FA\u6210 H.264 \u6216 HEVC\u3002",h264:"\u8FD9\u79CD H.264\uFF084:4:4 \u6216 10 \u4F4D\uFF09\u53EA\u6709 Chrome \u80FD\u89E3\uFF1A\u8BF7\u6539\u7528 Chrome\uFF0C\u6216\u8005\u5BFC\u51FA\u6210\u666E\u901A\u7684 H.264\u3002",av1:"AV1 \u8981\u8F83\u65B0\u7684\u6D4F\u89C8\u5668\u6216\u786C\u4EF6\u624D\u80FD\u89E3\uFF1A\u8BF7\u6539\u7528\u6700\u65B0\u7248\u7684 Chrome\uFF0C\u6216\u8005\u5BFC\u51FA\u6210 H.264\u3002",other:"\u8BF7\u6539\u7528\u6700\u65B0\u7248\u7684 Chrome \u6216 Safari\uFF0C\u6216\u8005\u5148\u628A\u5F55\u5C4F\u8F6C\u6210 H.264\u3002"},PIXEL_ASPECT_RATIO:"\u8BE5\u5F55\u5C4F\u58F0\u660E\u50CF\u7D20\u957F\u5BBD\u6BD4\u4E3A {{num}}:{{den}}\uFF1B\u4FDD\u7559\u539F\u59CB\u5B58\u50A8\u50CF\u7D20\uFF0C\u4E0D\u505A\u7F29\u653E\uFF0C\u663E\u793A\u6BD4\u4F8B\u53EF\u80FD\u4E0D\u540C\u3002",CONTAINER_SIZE_MISMATCH:"\u5BB9\u5668\u58F0\u660E {{codedWidth}}\xD7{{codedHeight}}\uFF0C\u7801\u6D41\u5B9E\u9645\u4E3A {{bitstreamWidth}}\xD7{{bitstreamHeight}}\uFF1B\u4EE5\u7801\u6D41\u5C3A\u5BF8\u4E3A\u51C6\u3002",NON_SQUARE_PIXELS:"\u8BE5\u5F55\u5C4F\u58F0\u660E\u975E\u65B9\u5F62\u50CF\u7D20\u957F\u5BBD\u6BD4\uFF08\u663E\u793A\u5C3A\u5BF8 {{displayWidth}}\xD7{{displayHeight}}\uFF0C\u5B58\u50A8\u5C3A\u5BF8 {{bitstreamWidth}}\xD7{{bitstreamHeight}}\uFF09\uFF1B\u4FDD\u7559\u539F\u59CB\u5B58\u50A8\u50CF\u7D20\uFF0C\u4E0D\u505A\u7F29\u653E\u3002",NEGATIVE_TIMESTAMP_SKIPPED:"\u89E3\u7801\u5668\u8F93\u51FA\u4E86\u4F4D\u4E8E\u7F16\u8F91\u5217\u8868\u8D77\u70B9\u4E4B\u524D\uFF08\u8D1F\u65F6\u95F4\u6233\uFF09\u7684\u5E27\uFF1B\u6309\u5BB9\u5668\u8BED\u4E49\u4E0D\u5C55\u793A\u8FD9\u4E9B\u5E27\u3002",NONMONOTONIC_TIMESTAMP:"\u5BB9\u5668\u65F6\u95F4\u6233\u51FA\u73B0\u5012\u9000\uFF1B\u5DF2\u6309\u89E3\u7801\u5668\u7684\u5C55\u793A\u987A\u5E8F\u7EE7\u7EED\u5904\u7406\uFF0C\u672A\u4E22\u5F03\u89C2\u5BDF\u3002",NONSTANDARD_SIGNED_CTTS_V0:"NONSTANDARD_SIGNED_CTTS_V0: \u8BE5\u89C6\u9891\u8F68\u9053\u7684 ctts box \u662F version 0\uFF0C\u4F46\u5305\u542B\u8D1F\u7684\u5408\u6210\u65F6\u95F4\u504F\u79FB\uFF1BISO 14496-12 \u4EC5\u5728 version 1 \u4E2D\u5B9A\u4E49\u8D1F\u504F\u79FB\u3002\u8FD9\u4E9B\u504F\u79FB\u6309\u6709\u7B26\u53F7\u5904\u7406\uFF08QuickTime/ReplayKit \u7684\u5E38\u89C1\u5199\u6CD5\uFF09\uFF0C\u672A\u88AB\u5F53\u4F5C\u5F02\u5E38\u5927\u7684\u6B63\u504F\u79FB\u3002",TRUNCATED_RECORDING:"TRUNCATED_RECORDING: \u6587\u4EF6\u5728 {{box}} box \u4E2D\u9014\u7ED3\u675F\uFF1A\u8BE5 box \u58F0\u660E\u5230\u7B2C {{declaredEnd}} \u5B57\u8282\uFF0C\u6587\u4EF6\u53EA\u6709 {{size}} \u5B57\u8282\u3002\u5F55\u5236\u53EF\u80FD\u6CA1\u6709\u6B63\u5E38\u7ED3\u675F\uFF0C\u6216\u6587\u4EF6\u5728\u590D\u5236/\u4F20\u8F93\u4E2D\u88AB\u622A\u65AD\uFF1B\u622A\u65AD\u5904\u4E4B\u540E\u7684\u5E27\u65E0\u6CD5\u89E3\u7801\uFF0C\u626B\u63CF\u5230\u7684\u5E27\u4F1A\u5C11\u4E8E\u5143\u6570\u636E\u4E2D\u7684\u5E27\u6570\uFF0C\u7ED3\u679C\u5C06\u6807\u8BB0\u4E3A partial\u3002"},exports:{tilesProgress:"\u5BFC\u51FA\u539F\u56FE\u4E0E\u9884\u89C8\u74E6\u7247 {{n}}",zipFinalize:"\u5199\u5165 ZIP64 \u76EE\u5F55\u5E76\u63D0\u4EA4\u6587\u4EF6",projectDone:{message:"\u5DF2\u5BFC\u51FA\u539F\u5C3A\u5BF8\u74E6\u7247\u3001\u79BB\u7EBF\u67E5\u770B\u5668\u3001\u8986\u76D6\u4E0E\u8D28\u91CF\u6570\u636E\u3001\u6E90\u5E27\u8BB0\u5F55\u548C\u5B8C\u6574\u8BCA\u65AD\u3002"},encodingSingle:"\u65E0\u7F29\u653E\u7F16\u7801 {{row}} / {{total}} \u884C",canvasDone:{message:"\u5DF2\u5BFC\u51FA {{width}} \xD7 {{height}} \u539F\u5C3A\u5BF8 PNG\uFF0C\u7F3A\u53E3\u4FDD\u6301\u900F\u660E\u3002"},encodingSheet:"\u5DF2\u7F16\u7801 {{count}} \u5F20\u539F\u5C3A\u5BF8\u5206\u9875\u56FE\u7247",sheetsDone:{messagePaged:"\u5DF2\u6309\u5206\u9875\u5BFC\u51FA\u4E3A {{count}} \u5F20\u539F\u5C3A\u5BF8\u56FE\u7247\uFF1B\u76F8\u90BB\u9875\u6700\u591A\u91CD\u53E0 {{overlap}}px\uFF0C\u5750\u6807\u89C1 manifest\u3002",messageOversize:"\u753B\u5E03\u8D85\u8FC7\u5355\u5F20\u517C\u5BB9\u5C3A\u5BF8\uFF0C\u5DF2\u660E\u786E\u6539\u4E3A {{count}} \u5F20\u539F\u5C3A\u5BF8\u56FE\u7247\uFF1B\u76F8\u90BB\u9875\u6700\u591A\u91CD\u53E0 {{overlap}}px\uFF0C\u5750\u6807\u89C1 manifest\u3002"}},offline:{title:"\u79BB\u7EBF\u753B\u5E03",fit:"\u9002\u5E94",tip:"\u672C\u5730\u539F\u5C3A\u5BF8\u74E6\u7247 \xB7 \u62D6\u52A8 / \u6EDA\u8F6E\u7F29\u653E",previewLevel:"\u663E\u793A\u9884\u89C8\u5C42 {{level}}\uFF0C\u653E\u5927\u53EF\u89C1\u539F\u50CF\u7D20",nativeTiles:"\u663E\u793A\u539F\u5C3A\u5BF8\u74E6\u7247",footer:"\u68CB\u76D8\u533A\u57DF\u672A\u88AB\u89C2\u5BDF / \u65E0\u74E6\u7247\uFF1B\u7F6E\u4FE1\u5EA6\u4E0D\u662F\u6B63\u786E\u6982\u7387\u3002\u67E5\u770B diagnostics.jsonl \u4E0E observations.jsonl\u3002"}};var X={...Te,...Le,...Pe};var f=a=>typeof a=="string",z=()=>{let a,e,t=new Promise((s,i)=>{a=s,e=i});return t.resolve=a,t.reject=e,t},re=a=>a==null?"":String(a),qe=(a,e,t)=>{a.forEach(s=>{e[s]&&(t[s]=e[s])})},Ze=/###/g,Ee=a=>a&&a.includes("###")?a.replace(Ze,"."):a,Re=a=>!a||f(a),W=(a,e,t)=>{let s=f(e)?e.split("."):e,i=0;for(;i<s.length-1;){if(Re(a))return{};let n=Ee(s[i]);!a[n]&&t&&(a[n]=new t),Object.prototype.hasOwnProperty.call(a,n)?a=a[n]:a={},++i}return Re(a)?{}:{obj:a,k:Ee(s[i])}},Ce=(a,e,t)=>{let{obj:s,k:i}=W(a,e,Object);if(s!==void 0||e.length===1){s[i]=t;return}let n=e[e.length-1],r=e.slice(0,e.length-1),o=W(a,r,Object);for(;o.obj===void 0&&r.length;)n=`${r[r.length-1]}.${n}`,r=r.slice(0,r.length-1),o=W(a,r,Object),o?.obj&&typeof o.obj[`${o.k}.${n}`]<"u"&&(o.obj=void 0);o.obj[`${o.k}.${n}`]=t},Xe=(a,e,t,s)=>{let{obj:i,k:n}=W(a,e,Object);i[n]=i[n]||[],i[n].push(t)},ee=(a,e)=>{let{obj:t,k:s}=W(a,e);if(t&&Object.prototype.hasOwnProperty.call(t,s))return t[s]},Qe=(a,e,t)=>{let s=ee(a,t);return s!==void 0?s:ee(e,t)},_e=(a,e,t)=>{for(let s in e)s!=="__proto__"&&s!=="constructor"&&(Object.prototype.hasOwnProperty.call(a,s)?f(a[s])||a[s]instanceof String||f(e[s])||e[s]instanceof String?t&&(a[s]=e[s]):_e(a[s],e[s],t):a[s]=e[s]);return a},N=a=>a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),et={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"},tt=a=>f(a)?a.replace(/[&<>"'\/]/g,e=>et[e]):a,ce=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let s=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,s),this.regExpQueue.push(e),s}},st=[" ",",","?","!",";"],it=new ce(20),nt=(a,e,t)=>{e=e||"",t=t||"";let s=st.filter(r=>!e.includes(r)&&!t.includes(r));if(s.length===0)return!0;let i=it.getRegExp(`(${s.map(r=>r==="?"?"\\?":r).join("|")})`),n=!i.test(a);if(!n){let r=a.indexOf(t);r>0&&!i.test(a.substring(0,r))&&(n=!0)}return n},de=(a,e,t=".")=>{if(!a)return;if(a[e])return Object.prototype.hasOwnProperty.call(a,e)?a[e]:void 0;let s=e.split(t),i=a;for(let n=0;n<s.length;){if(!i||typeof i!="object")return;let r,o="";for(let l=n;l<s.length;++l)if(l!==n&&(o+=t),o+=s[l],r=i[o],r!==void 0){if(["string","number","boolean"].includes(typeof r)&&l<s.length-1)continue;n+=l-n+1;break}i=r}return i},K=a=>a?.replace(/_/g,"-"),at={type:"logger",log(a){this.output("log",a)},warn(a){this.output("warn",a)},error(a){this.output("error",a)},output(a,e){console?.[a]?.apply?.(console,e)}},he=class a{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||"i18next:",this.logger=e||at,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,t,s,i){return i&&!this.debug?null:(e=e.map(n=>f(n)?n.replace(/[\r\n\x00-\x1F\x7F]/g," "):n),f(e[0])&&(e[0]=`${s}${this.prefix} ${e[0]}`),this.logger[t](e))}create(e){return new a(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new a(this.logger,e)}},A=new he,U=class{constructor(){this.observers={}}on(e,t){return e.split(" ").forEach(s=>{this.observers[s]||(this.observers[s]=new Map);let i=this.observers[s].get(t)||0;this.observers[s].set(t,i+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}once(e,t){let s=(...i)=>{t(...i),this.off(e,s)};return this.on(e,s),this}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([i,n])=>{for(let r=0;r<n;r++)i(...t)}),this.observers["*"]&&Array.from(this.observers["*"].entries()).forEach(([i,n])=>{for(let r=0;r<n;r++)i(e,...t)})}},te=class extends U{constructor(e,t={ns:["translation"],defaultNS:"translation"}){super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){let t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,t,s,i={}){let n=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,r=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure,o;e.includes(".")?o=e.split("."):(o=[e,t],s&&(Array.isArray(s)?o.push(...s):f(s)&&n?o.push(...s.split(n)):o.push(s)));let l=ee(this.data,o);return!l&&!t&&!s&&e.includes(".")&&(e=o[0],t=o[1],s=o.slice(2).join(".")),l||!r||!f(s)?l:de(this.data?.[e]?.[t],s,n)}addResource(e,t,s,i,n={silent:!1}){let r=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,o=[e,t];s&&(o=o.concat(r?s.split(r):s)),e.includes(".")&&(o=e.split("."),i=t,t=o[1]),this.addNamespaces(t),Ce(this.data,o,i),n.silent||this.emit("added",e,t,s,i)}addResources(e,t,s,i={silent:!1}){for(let n in s)(f(s[n])||Array.isArray(s[n]))&&this.addResource(e,t,n,s[n],{silent:!0});i.silent||this.emit("added",e,t,s)}addResourceBundle(e,t,s,i,n,r={silent:!1,skipCopy:!1}){let o=[e,t];e.includes(".")&&(o=e.split("."),i=s,s=t,t=o[1]),this.addNamespaces(t);let l=ee(this.data,o)||{};r.skipCopy||(s=JSON.parse(JSON.stringify(s))),i?_e(l,s,n):l={...l,...s},Ce(this.data,o,l),r.silent||this.emit("added",e,t,s)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit("removed",e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||(t=this.options.defaultNS),this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(i=>t[i]&&Object.keys(t[i]).length>0)}toJSON(){return this.data}},De={processors:{},addPostProcessor(a){this.processors[a.name]=a},handle(a,e,t,s,i){return a.forEach(n=>{e=this.processors[n]?.process(e,t,s,i)??e}),e}},Fe=Symbol("i18next/PATH_KEY");function rt(){let a=[],e=Object.create(null),t;return e.get=(s,i)=>(t?.revoke?.(),i===Fe?a:(a.push(i),t=Proxy.revocable(s,e),t.proxy)),Proxy.revocable(Object.create(null),e).proxy}function H(a,e){let{[Fe]:t}=a(rt()),s=e?.keySeparator??".",i=e?.nsSeparator??":",n=e?.enableSelector==="strict";if(t.length>1&&i){let r=e?.ns,o=n?Array.isArray(r)?r:r?[r]:null:Array.isArray(r)?r:null;if(o&&(n?o:o.length>1?o.slice(1):[]).includes(t[0]))return`${t[0]}${i}${t.slice(1).join(s)}`}return t.join(s)}var oe=a=>!f(a)&&typeof a!="boolean"&&typeof a!="number",se=class a extends U{constructor(e,t={}){super(),qe(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=A.create("translator"),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let s={...t};if(e==null)return!1;let i=this.resolve(e,s);if(i?.res===void 0)return!1;let n=oe(i.res);return!(s.returnObjects===!1&&n)}extractFromKey(e,t){let s=t.nsSeparator!==void 0?t.nsSeparator:this.options.nsSeparator;s===void 0&&(s=":");let i=t.keySeparator!==void 0?t.keySeparator:this.options.keySeparator,n=t.ns||this.options.defaultNS||[],r=s&&e.includes(s),o=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!nt(e,s,i);if(r&&!o){let l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:f(n)?[n]:n};let c=e.split(s);(s!==i||s===i&&this.options.ns.includes(c[0]))&&(n=c.shift()),e=c.join(i)}return{key:e,namespaces:f(n)?[n]:n}}translate(e,t,s){let i=typeof t=="object"?{...t}:t;if(typeof i!="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i=="object"&&(i={...i}),i||(i={}),e==null)return"";typeof e=="function"&&(e=H(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]),e=e.map(L=>typeof L=="function"?H(L,{...this.options,...i}):String(L));let n=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,r=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:o,namespaces:l}=this.extractFromKey(e[e.length-1],i),c=l[l.length-1],d=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");let h=i.lng||this.language,u=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(h?.toLowerCase()==="cimode")return u?n?{res:`${c}${d}${o}`,usedKey:o,exactUsedKey:o,usedLng:h,usedNS:c,usedParams:this.getUsedParamsDetails(i)}:`${c}${d}${o}`:n?{res:o,usedKey:o,exactUsedKey:o,usedLng:h,usedNS:c,usedParams:this.getUsedParamsDetails(i)}:o;let p=this.resolve(e,i),g=p?.res,y=p?.usedKey||o,m=p?.exactUsedKey||o,v=["[object Number]","[object Function]","[object RegExp]"],w=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,R=!this.i18nFormat||this.i18nFormat.handleAsObject,S=i.count!==void 0&&!f(i.count),T=a.hasDefaultValue(i),M=S?this.pluralResolver.getSuffix(h,i.count,i):"",_=i.ordinal&&S?this.pluralResolver.getSuffix(h,i.count,{ordinal:!1}):"",B=S&&!i.ordinal&&i.count===0,b=B&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${M}`]||i[`defaultValue${_}`]||i.defaultValue,P=g;R&&!g&&T&&(P=b);let D=oe(P),q=Object.prototype.toString.apply(P);if(R&&P&&D&&!v.includes(q)&&!(f(w)&&Array.isArray(P))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");let L=this.options.returnedObjectHandler?this.options.returnedObjectHandler(y,P,{...i,ns:l}):`key '${o} (${this.language})' returned an object instead of string.`;return n?(p.res=L,p.usedParams=this.getUsedParamsDetails(i),p):L}if(r){let L=Array.isArray(P),C=L?[]:{},be=L?m:y;for(let k in P)if(Object.prototype.hasOwnProperty.call(P,k)){let O=`${be}${r}${k}`;T&&!g?C[k]=this.translate(O,{...i,defaultValue:oe(b)?b[k]:void 0,joinArrays:!1,ns:l}):C[k]=this.translate(O,{...i,joinArrays:!1,ns:l}),C[k]===O&&(C[k]=P[k])}g=C}}else if(R&&f(w)&&Array.isArray(g))g=g.join(w),g&&(g=this.extendTranslation(g,e,i,s));else{let L=!1,C=!1;!this.isValidLookup(g)&&T&&(L=!0,g=b),this.isValidLookup(g)||(C=!0,g=o);let k=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&C?void 0:g,O=T&&b!==g&&this.options.updateMissing;if(C||L||O){if(this.logger.log(O?"updateKey":"missingKey",h,c,S&&!O?`${o}${this.pluralResolver.getSuffix(h,i.count,i)}`:o,O?b:g),r){let E=this.resolve(o,{...i,keySeparator:!1});E&&E.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let G=[],Z=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Z&&Z[0])for(let E=0;E<Z.length;E++)G.push(Z[E]);else this.options.saveMissingTo==="all"?G=this.languageUtils.toResolveHierarchy(i.lng||this.language):G.push(i.lng||this.language);let ye=(E,F,V)=>{let ve=T&&V!==g?V:k;this.options.missingKeyHandler?this.options.missingKeyHandler(E,c,F,ve,O,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(E,c,F,ve,O,i),this.emit("missingKey",E,c,F,g)};this.options.saveMissing&&(this.options.saveMissingPlurals&&S?G.forEach(E=>{let F=this.pluralResolver.getSuffixes(E,i);B&&i[`defaultValue${this.options.pluralSeparator}zero`]&&!F.includes(`${this.options.pluralSeparator}zero`)&&F.push(`${this.options.pluralSeparator}zero`),F.forEach(V=>{ye([E],o+V,i[`defaultValue${V}`]||b)})}):ye(G,o,b))}g=this.extendTranslation(g,e,i,p,s),C&&g===o&&this.options.appendNamespaceToMissingKey&&(g=`${c}${d}${o}`),(C||L)&&this.options.parseMissingKeyHandler&&(g=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${c}${d}${o}`:o,L?g:void 0,i))}return n?(p.res=g,p.usedParams=this.getUsedParamsDetails(i),p):g}extendTranslation(e,t,s,i,n){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...s},s.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!s.skipInterpolation){s.interpolation&&this.interpolator.init({...s,interpolation:{...this.options.interpolation,...s.interpolation}});let l=f(e)&&(s?.interpolation?.skipOnVariables!==void 0?s.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables),c;if(l){let h=e.match(this.interpolator.nestingRegexp);c=h&&h.length}let d=s.replace&&!f(s.replace)?s.replace:s;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,s.lng||this.language||i.usedLng,s),l){let h=e.match(this.interpolator.nestingRegexp),u=h&&h.length;c<u&&(s.nest=!1)}!s.lng&&i&&i.res&&(s.lng=this.language||i.usedLng),s.nest!==!1&&(e=this.interpolator.nest(e,(...h)=>n?.[0]===h[0]&&!s.context?(this.logger.warn(`It seems you are nesting recursively key: ${h[0]} in key: ${t[0]}`),null):this.translate(...h,t),s)),s.interpolation&&this.interpolator.reset()}let r=s.postProcess||this.options.postProcess,o=f(r)?[r]:r;return e!=null&&o?.length&&s.applyPostProcessor!==!1&&(e=De.handle(o,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(s)},...s}:s,this)),e}resolve(e,t={}){let s,i,n,r,o;return f(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(l=>typeof l=="function"?H(l,{...this.options,...t}):l)),e.forEach(l=>{if(this.isValidLookup(s))return;let c=this.extractFromKey(l,t),d=c.key;i=d;let h=c.namespaces;this.options.fallbackNS&&(h=h.concat(this.options.fallbackNS));let u=t.count!==void 0&&!f(t.count),p=u&&!t.ordinal&&t.count===0,g=t.context!==void 0&&(f(t.context)||typeof t.context=="number")&&t.context!=="",y=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);h.forEach(m=>{this.isValidLookup(s)||(o=m,!this.checkedLoadedFor[`${y[0]}-${m}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&(this.checkedLoadedFor[`${y[0]}-${m}`]=!0,this.logger.warn(`key "${i}" for languages "${y.join(", ")}" won't get resolved as namespace "${o}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),y.forEach(v=>{if(this.isValidLookup(s))return;r=v;let w=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(w,d,v,m,t);else{let S;u&&(S=this.pluralResolver.getSuffix(v,t.count,t));let T=`${this.options.pluralSeparator}zero`,M=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(u&&(t.ordinal&&S.startsWith(M)&&w.push(d+S.replace(M,this.options.pluralSeparator)),w.push(d+S),p&&w.push(d+T)),g){let _=`${d}${this.options.contextSeparator||"_"}${t.context}`;w.push(_),u&&(t.ordinal&&S.startsWith(M)&&w.push(_+S.replace(M,this.options.pluralSeparator)),w.push(_+S),p&&w.push(_+T))}}let R;for(;R=w.pop();)this.isValidLookup(s)||(n=R,s=this.getResource(v,m,R,t))}))})}),{res:s,usedKey:i,exactUsedKey:n,usedLng:r,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,t,s,i={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,s,i):this.resourceStore.getResource(e,t,s,i)}getUsedParamsDetails(e={}){let t=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],s=e.replace&&!f(e.replace),i=s?e.replace:e;if(s&&typeof e.count<"u"&&(i={...i,count:e.count}),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!s){i={...i};for(let n of t)delete i[n]}return i}static hasDefaultValue(e){let t="defaultValue";for(let s in e)if(Object.prototype.hasOwnProperty.call(e,s)&&s.startsWith(t)&&e[s]!==void 0)return!0;return!1}},ie=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=A.create("languageUtils"),this.resolveHierarchyCache={}}clearCache(){this.resolveHierarchyCache={}}getScriptPartFromCode(e){if(e=K(e),!e||!e.includes("-"))return null;let t=e.split("-");return t.length===2||(t.pop(),t[t.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(t.join("-"))}getLanguagePartFromCode(e){if(e=K(e),!e||!e.includes("-"))return e;let t=e.split("-");return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(f(e)&&e.includes("-")){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(s=>{if(t)return;let i=this.formatLanguageCode(s);(!this.options.supportedLngs||this.isSupportedCode(i))&&(t=i)}),!t&&this.options.supportedLngs&&e.forEach(s=>{if(t)return;let i=this.getScriptPartFromCode(s);if(this.isSupportedCode(i))return t=i;let n=this.getLanguagePartFromCode(s);if(this.isSupportedCode(n))return t=n;t=this.options.supportedLngs.find(r=>r===n?!0:!r.includes("-")&&!n.includes("-")?!1:!!(r.includes("-")&&!n.includes("-")&&r.slice(0,r.indexOf("-"))===n||r.startsWith(n)&&n.length>1))}),t||(t=this.getFallbackCodes(this.options.fallbackLng)[0]),t}getFallbackCodes(e,t){if(!e)return[];if(typeof e=="function"&&(e=e(t)),f(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let s=e[t];return s||(s=e[this.getScriptPartFromCode(t)]),s||(s=e[this.formatLanguageCode(t)]),s||(s=e[this.getLanguagePartFromCode(t)]),s||(s=e.default),s||[]}toResolveHierarchy(e,t){let s=this.options.fallbackLng,i=Array.isArray(s)?s.join("|"):s;i!==this._cachedFallbackLng&&(this.resolveHierarchyCache={},this._cachedFallbackLng=i);let n=t===void 0||t===!1||f(t),r=t===void 0&&typeof this.options.fallbackLng=="function",o=f(e)&&n&&!r,l=null;if(o){let u;t===void 0?u="undefined":t===!1?u="boolean:false":u=`string:${t}`,l=`${e.length}:${e}|${u}`}if(l!==null){let u=this.resolveHierarchyCache[l];if(u!==void 0)return u.slice()}let c=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),d=[],h=u=>{u&&(this.isSupportedCode(u)?d.push(u):this.logger.warn(`rejecting language code not found in supportedLngs: ${u}`))};return f(e)&&(e.includes("-")||e.includes("_"))?(this.options.load!=="languageOnly"&&h(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&h(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&h(this.getLanguagePartFromCode(e))):f(e)&&h(this.formatLanguageCode(e)),c.forEach(u=>{d.includes(u)||h(this.formatLanguageCode(u))}),l!==null?(this.resolveHierarchyCache[l]=d,d.slice()):d}},ke={zero:0,one:1,two:2,few:3,many:4,other:5},Oe={select:a=>a===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})},ue=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=A.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let s=K(e==="dev"?"en":e),i=t.ordinal?"ordinal":"cardinal",n=JSON.stringify({cleanedCode:s,type:i});if(n in this.pluralRulesCache)return this.pluralRulesCache[n];let r;try{r=new Intl.PluralRules(s,{type:i})}catch{if(typeof Intl>"u")return this.logger.error("No Intl support, please use an Intl polyfill!"),Oe;if(!e.match(/-|_/))return Oe;let l=this.languageUtils.getLanguagePartFromCode(e);r=this.getRule(l,t)}return this.pluralRulesCache[n]=r,r}needsPlural(e,t={}){let s=this.getRule(e,t);return s||(s=this.getRule("dev",t)),s?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,s={}){return this.getSuffixes(e,s).map(i=>`${t}${i}`)}getSuffixes(e,t={}){let s=this.getRule(e,t);return s||(s=this.getRule("dev",t)),s?s.resolvedOptions().pluralCategories.sort((i,n)=>ke[i]-ke[n]).map(i=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:""}${i}`):[]}getSuffix(e,t,s={}){let i=this.getRule(e,s);return i?`${this.options.prepend}${s.ordinal?`ordinal${this.options.prepend}`:""}${i.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",t,s))}},Ae=(a,e,t,s=".",i=!0)=>{let n=Qe(a,e,t);return!n&&i&&f(t)&&(n=de(a,t,s),n===void 0&&(n=de(e,t,s))),n},Ne=a=>a.replace(/\$/g,"$$$$"),ne=class{constructor(e={}){this.logger=A.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(t=>t),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});let{escape:t,escapeValue:s,useRawValueToEscape:i,prefix:n,prefixEscaped:r,suffix:o,suffixEscaped:l,formatSeparator:c,unescapeSuffix:d,unescapePrefix:h,nestingPrefix:u,nestingPrefixEscaped:p,nestingSuffix:g,nestingSuffixEscaped:y,nestingOptionsSeparator:m,maxReplaces:v,alwaysFormat:w}=e.interpolation;this.escape=t!==void 0?t:tt,this.escapeValue=s!==void 0?s:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=n?N(n):r||"{{",this.suffix=o?N(o):l||"}}",this.formatSeparator=c||",",this.unescapePrefix=d?"":h?N(h):"-",this.unescapeSuffix=this.unescapePrefix?"":d?N(d):"",this.nestingPrefix=u?N(u):p||N("$t("),this.nestingSuffix=g?N(g):y||N(")"),this.nestingOptionsSeparator=m||",",this.maxReplaces=v||1e3,this.alwaysFormat=w!==void 0?w:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(t,s)=>t?.source===s?(t.lastIndex=0,t):new RegExp(s,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,s,i){let n,r,o,l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=p=>{if(!p.includes(this.formatSeparator)){let v=Ae(t,l,p,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(v,void 0,s,{...i,...t,interpolationkey:p}):v}let g=p.split(this.formatSeparator),y=g.shift().trim(),m=g.join(this.formatSeparator).trim();return this.format(Ae(t,l,y,this.options.keySeparator,this.options.ignoreJSONStructure),m,s,{...i,...t,interpolationkey:y})};this.resetRegExp(),!this.escapeValue&&typeof e=="string"&&/\$t\([^)]*\{[^}]*\{\{/.test(e)&&this.logger.warn("nesting options string contains interpolated variables with escapeValue: false \u2014 if any of those values are attacker-controlled they can inject additional nesting options (e.g. redirect lng/ns). Sanitise untrusted input before passing it to t(), or keep escapeValue: true.");let d=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,h=i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:p=>p},{regex:this.regexp,safeValue:p=>this.escapeValue?this.escape(p):p}].forEach(p=>{for(o=0;n=p.regex.exec(e);){let g=n[1].trim();if(r=c(g),r===void 0)if(typeof d=="function"){let m=d(e,n,i);r=f(m)?m:""}else if(i&&Object.prototype.hasOwnProperty.call(i,g))r="";else if(h){r=n[0];continue}else this.logger.warn(`missed to pass in variable ${g} for interpolating ${e}`),r="";else!f(r)&&!this.useRawValueToEscape&&(r=re(r));let y=p.safeValue(r);if(e=e.replace(n[0],Ne(y)),h?(p.regex.lastIndex+=y.length,p.regex.lastIndex-=n[0].length):p.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,t,s={}){let i,n,r,o=(l,c)=>{let d=this.nestingOptionsSeparator;if(!l.includes(d))return l;let h=l.split(new RegExp(`${N(d)}[ ]*{`)),u=`{${h[1]}`;l=h[0],u=this.interpolate(u,r);let p=u.match(/'/g),g=u.match(/"/g);((p?.length??0)%2===0&&!g||(g?.length??0)%2!==0)&&(u=u.replace(/'/g,'"'));try{r=JSON.parse(u),c&&(r={...c,...r})}catch(y){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,y),`${l}${d}${u}`}return r.defaultValue&&r.defaultValue.includes(this.prefix)&&delete r.defaultValue,l};for(;i=this.nestingRegexp.exec(e);){let l=[];r={...s},r=r.replace&&!f(r.replace)?r.replace:r,r.applyPostProcessor=!1,delete r.defaultValue;let c=/{.*}/s.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(c!==-1&&(l=i[1].slice(c).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),i[1]=i[1].slice(0,c)),n=t(o.call(this,i[1].trim(),r),r),n&&i[0]===e&&!f(n))return n;f(n)||(n=re(n)),n||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),n=""),l.length&&(n=l.reduce((d,h)=>this.format(d,h,s.lng,{...s,interpolationkey:i[1].trim()}),n.trim())),e=e.replace(i[0],Ne(re(n))),this.regexp.lastIndex=0}return e}},ot=a=>{let e=a.toLowerCase().trim(),t={};if(a.includes("(")){let s=a.split("(");e=s[0].toLowerCase().trim();let i=s[1].slice(0,-1);e==="currency"&&!i.includes(":")?t.currency||(t.currency=i.trim()):e==="relativetime"&&!i.includes(":")?t.range||(t.range=i.trim()):i.split(";").forEach(r=>{if(r){let[o,...l]=r.split(":"),c=l.join(":").trim().replace(/^'+|'+$/g,""),d=o.trim();t[d]||(t[d]=c),c==="false"&&(t[d]=!1),c==="true"&&(t[d]=!0),isNaN(c)||(t[d]=parseInt(c,10))}})}return{formatName:e,formatOptions:t}},Ie=a=>{let e={};return(t,s,i)=>{let n=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(n={...n,[i.interpolationkey]:void 0});let r=s+JSON.stringify(n),o=e[r];return o||(o=a(K(s),i),e[r]=o),o(t)}},lt=a=>(e,t,s)=>a(K(t),s)(e),pe=class{constructor(e={}){this.logger=A.create("formatter"),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||",";let s=t.cacheInBuiltFormats?Ie:lt;this.formats={number:s((i,n)=>{let r=new Intl.NumberFormat(i,{...n});return o=>r.format(o)}),currency:s((i,n)=>{let r=new Intl.NumberFormat(i,{...n,style:"currency"});return o=>r.format(o)}),datetime:s((i,n)=>{let r=new Intl.DateTimeFormat(i,{...n});return o=>r.format(o)}),relativetime:s((i,n)=>{let r=new Intl.RelativeTimeFormat(i,{...n});return o=>r.format(o,n.range||"day")}),list:s((i,n)=>{let r=new Intl.ListFormat(i,{...n});return o=>r.format(o)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=Ie(t)}format(e,t,s,i={}){if(!t||e==null)return e;let n=t.split(this.formatSeparator),r=[];for(let l=0;l<n.length;l++){let c=n[l];for(;c.indexOf("(")>-1&&!c.includes(")")&&l+1<n.length;)c=`${c}${this.formatSeparator}${n[++l]}`;r.push(c)}return r.reduce((l,c)=>{let{formatName:d,formatOptions:h}=ot(c);if(this.formats[d]){let u=l;try{let p=i?.formatParams?.[i.interpolationkey]||{},g=p.locale||p.lng||i.locale||i.lng||s;u=this.formats[d](l,g,{...h,...i,...p})}catch(p){this.logger.warn(p)}return u}else this.logger.warn(`there was no format function for ${d}`);return l},e)}},ct=(a,e)=>{a.pending[e]!==void 0&&(delete a.pending[e],a.pendingCount--)},ge=class extends U{constructor(e,t,s,i={}){super(),this.backend=e,this.store=t,this.services=s,this.languageUtils=s.languageUtils,this.options=i,this.logger=A.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(s,i.backend,i)}queueLoad(e,t,s,i){let n={},r={},o={},l={};return e.forEach(c=>{let d=!0;t.forEach(h=>{let u=`${c}|${h}`;!s.reload&&this.store.hasResourceBundle(c,h)?this.state[u]=2:this.state[u]<0||(this.state[u]===1?r[u]===void 0&&(r[u]=!0):(this.state[u]=1,d=!1,r[u]===void 0&&(r[u]=!0),n[u]===void 0&&(n[u]=!0),l[h]===void 0&&(l[h]=!0)))}),d||(o[c]=!0)}),(Object.keys(n).length||Object.keys(r).length)&&this.queue.push({pending:r,pendingCount:Object.keys(r).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(n),pending:Object.keys(r),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(l)}}loaded(e,t,s){let i=e.split("|"),n=i[0],r=i[1];t&&this.emit("failedLoading",n,r,t),!t&&s&&this.store.addResourceBundle(n,r,s,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&s&&(this.state[e]=0);let o={};this.queue.forEach(l=>{Xe(l.loaded,[n],r),ct(l,e),t&&l.errors.push(t),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(c=>{o[c]||(o[c]={});let d=l.loaded[c];d.length&&d.forEach(h=>{o[c][h]===void 0&&(o[c][h]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",o),this.queue=this.queue.filter(l=>!l.done)}read(e,t,s,i=0,n=this.retryTimeout,r){if(!e.length)return r(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:s,tried:i,wait:n,callback:r});return}this.readingCalls++;let o=(c,d)=>{if(this.readingCalls--,this.waitingReads.length>0){let h=this.waitingReads.shift();this.read(h.lng,h.ns,h.fcName,h.tried,h.wait,h.callback)}if(c&&d&&i<this.maxRetries){setTimeout(()=>{this.read(e,t,s,i+1,n*2,r)},n);return}r(c,d)},l=this.backend[s].bind(this.backend);if(l.length===2){try{let c=l(e,t);c&&typeof c.then=="function"?c.then(d=>o(null,d)).catch(o):o(null,c)}catch(c){o(c)}return}return l(e,t,o)}prepareLoading(e,t,s={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();f(e)&&(e=this.languageUtils.toResolveHierarchy(e)),f(t)&&(t=[t]);let n=this.queueLoad(e,t,s,i);if(!n.toLoad.length)return n.pending.length||i(),null;n.toLoad.forEach(r=>{this.loadOne(r)})}load(e,t,s){this.prepareLoading(e,t,{},s)}reload(e,t,s){this.prepareLoading(e,t,{reload:!0},s)}loadOne(e,t=""){let s=e.split("|"),i=s[0],n=s[1];this.read(i,n,"read",void 0,void 0,(r,o)=>{r&&this.logger.warn(`${t}loading namespace ${n} for language ${i} failed`,r),!r&&o&&this.logger.log(`${t}loaded namespace ${n} for language ${i}`,o),this.loaded(e,r,o)})}saveMissing(e,t,s,i,n,r={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${s}" as the namespace "${t}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(s==null||s==="")){if(this.backend?.create){let l={...r,isUpdate:n},c=this.backend.create.bind(this.backend);if(c.length<6)try{let d;c.length===5?d=c(e,t,s,i,l):d=c(e,t,s,i),d&&typeof d.then=="function"?d.then(h=>o(null,h)).catch(o):o(null,d)}catch(d){o(d)}else c(e,t,s,i,o,l)}!e||!e[0]||this.store.addResource(e[0],t,s,i)}}},le=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",enableSelector:!1,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:a=>{let e={};if(typeof a[1]=="object"&&(e=a[1]),f(a[1])&&(e.defaultValue=a[1]),f(a[2])&&(e.tDescription=a[2]),typeof a[2]=="object"||typeof a[3]=="object"){let t=a[3]||a[2];Object.keys(t).forEach(s=>{e[s]=t[s]})}return e},interpolation:{escapeValue:!0,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),Me=a=>(f(a.ns)&&(a.ns=[a.ns]),f(a.fallbackLng)&&(a.fallbackLng=[a.fallbackLng]),f(a.fallbackNS)&&(a.fallbackNS=[a.fallbackNS]),a.supportedLngs&&!a.supportedLngs.includes("cimode")&&(a.supportedLngs=a.supportedLngs.concat(["cimode"])),a),Q=()=>{},dt=a=>{Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(t=>{typeof a[t]=="function"&&(a[t]=a[t].bind(a))})},fe=class a extends U{constructor(e={},t){if(super(),this.options=Me(e),this.services={},this.logger=A,this.modules={external:[]},dt(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e=="function"&&(t=e,e={}),e.defaultNS==null&&e.ns&&(f(e.ns)?e.defaultNS=e.ns:e.ns.includes("translation")||(e.defaultNS=e.ns[0]));let s=le();this.options={...s,...this.options,...Me(e)},this.options.interpolation={...s.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=s.overloadTranslationOptionHandler);let i=c=>c?typeof c=="function"?new c:c:null;if(!this.options.isClone){this.modules.logger?A.init(i(this.modules.logger),this.options):A.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:c=pe;let d=new ie(this.options);this.store=new te(this.options.resources,this.options);let h=this.services;h.logger=A,h.resourceStore=this.store,h.languageUtils=d,h.pluralResolver=new ue(d,{prepend:this.options.pluralSeparator}),c&&(h.formatter=i(c),h.formatter.init&&h.formatter.init(h,this.options),this.options.interpolation.format=h.formatter.format.bind(h.formatter)),h.interpolator=new ne(this.options),h.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},h.backendConnector=new ge(i(this.modules.backend),h.resourceStore,h,this.options),h.backendConnector.on("*",(u,...p)=>{this.emit(u,...p)}),this.modules.languageDetector&&(h.languageDetector=i(this.modules.languageDetector),h.languageDetector.init&&h.languageDetector.init(h,this.options.detection,this.options)),this.modules.i18nFormat&&(h.i18nFormat=i(this.modules.i18nFormat),h.i18nFormat.init&&h.i18nFormat.init(this)),this.translator=new se(this.services,this.options),this.translator.on("*",(u,...p)=>{this.emit(u,...p)}),this.modules.external.forEach(u=>{u.init&&u.init(this)})}if(this.format=this.options.interpolation.format,t||(t=Q),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=(...d)=>this.store[c](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=(...d)=>(this.store[c](...d),this)});let o=z(),l=()=>{let c=(d,h)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),o.resolve(h),t(d,h)};if((this.languages||this.isLanguageChangingTo)&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initAsync?l():setTimeout(l,0),o}loadResources(e,t=Q){let s=t,i=f(e)?e:this.language;if(typeof e=="function"&&(s=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return s();let n=[],r=o=>{if(!o||o==="cimode")return;this.services.languageUtils.toResolveHierarchy(o).forEach(c=>{c!=="cimode"&&(n.includes(c)||n.push(c))})};i?r(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>r(l)),this.options.preload?.forEach?.(o=>r(o)),this.services.backendConnector.load(n,this.options.ns,o=>{!o&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),s(o)})}else s(null)}reloadResources(e,t,s){let i=z();return typeof e=="function"&&(s=e,e=void 0),typeof t=="function"&&(s=t,t=void 0),e||(e=this.languages),t||(t=this.options.ns),s||(s=Q),this.services.backendConnector.reload(e,t,n=>{i.resolve(),s(n)}),i}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&De.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!["cimode","dev"].includes(e)){for(let t=0;t<this.languages.length;t++){let s=this.languages[t];if(!["cimode","dev"].includes(s)&&this.store.hasLanguageSomeTranslations(s)){this.resolvedLanguage=s;break}}!this.resolvedLanguage&&!this.languages.includes(e)&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;let s=z();this.emit("languageChanging",e);let i=o=>{this.language=o,this.languages=this.services.languageUtils.toResolveHierarchy(o),this.resolvedLanguage=void 0,this.setResolvedLanguage(o)},n=(o,l)=>{l?this.isLanguageChangingTo===e&&(i(l),this.translator.changeLanguage(l),this.isLanguageChangingTo=void 0,this.emit("languageChanged",l),this.logger.log("languageChanged",l)):this.isLanguageChangingTo=void 0,s.resolve((...c)=>this.t(...c)),t&&t(o,(...c)=>this.t(...c))},r=o=>{!e&&!o&&this.services.languageDetector&&(o=[]);let l=f(o)?o:o&&o[0],c=this.store.hasLanguageSomeTranslations(l)?l:this.services.languageUtils.getBestMatchFromCodes(f(o)?[o]:o);c&&(this.language||i(c),this.translator.language||this.translator.changeLanguage(c),this.services.languageDetector?.cacheUserLanguage?.(c)),this.loadResources(c,d=>{n(d,c)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?r(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(r):this.services.languageDetector.detect(r):r(e),s}getFixedT(e,t,s,i){let n=i?.scopeNs,r=(o,l,...c)=>{let d;typeof l!="object"?d=this.options.overloadTranslationOptionHandler([o,l].concat(c)):d={...l},d.lng=d.lng||r.lng,d.lngs=d.lngs||r.lngs;let h=d.ns!==void 0&&d.ns!==null;d.ns=d.ns||r.ns,d.keyPrefix!==""&&(d.keyPrefix=d.keyPrefix||s||r.keyPrefix);let u={...this.options,...d};Array.isArray(n)&&!h&&(u.ns=n),typeof d.keyPrefix=="function"&&(d.keyPrefix=H(d.keyPrefix,u));let p=this.options.keySeparator||".",g;return d.keyPrefix&&Array.isArray(o)?g=o.map(y=>(typeof y=="function"&&(y=H(y,u)),`${d.keyPrefix}${p}${y}`)):(typeof o=="function"&&(o=H(o,u)),g=d.keyPrefix?`${d.keyPrefix}${p}${o}`:o),this.t(g,d)};return f(e)?r.lng=e:r.lngs=e,r.ns=t,r.keyPrefix=s,r}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;let s=t.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,n=this.languages[this.languages.length-1];if(s.toLowerCase()==="cimode")return!0;let r=(o,l)=>{let c=this.services.backendConnector.state[`${o}|${l}`];return c===-1||c===0||c===2};if(t.precheck){let o=t.precheck(this,r);if(o!==void 0)return o}return!!(this.hasResourceBundle(s,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||r(s,e)&&(!i||r(n,e)))}loadNamespaces(e,t){let s=z();return this.options.ns?(f(e)&&(e=[e]),e.forEach(i=>{this.options.ns.includes(i)||this.options.ns.push(i)}),this.loadResources(i=>{s.resolve(),t&&t(i)}),s):(t&&t(),Promise.resolve())}loadLanguages(e,t){let s=z();f(e)&&(e=[e]);let i=this.options.preload||[],n=e.filter(r=>!i.includes(r)&&this.services.languageUtils.isSupportedCode(r));return n.length?(this.options.preload=i.concat(n),this.loadResources(r=>{s.resolve(),t&&t(r)}),s):(t&&t(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{let i=new Intl.Locale(e);if(i&&i.getTextInfo){let n=i.getTextInfo();if(n&&n.direction)return n.direction}}catch{}let t=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],s=this.services?.languageUtils||new ie(le());return e.toLowerCase().indexOf("-latn")>1?"ltr":t.includes(s.getLanguagePartFromCode(e))||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},t){let s=new a(e,t);return s.createInstance=a.createInstance,s}cloneInstance(e={},t=Q){let s=e.forkResourceStore;s&&delete e.forkResourceStore;let i={...this.options,...e,isClone:!0},n=new a(i);if((e.debug!==void 0||e.prefix!==void 0)&&(n.logger=n.logger.clone(e)),["store","services","language"].forEach(o=>{n[o]=this[o]}),n.services={...this.services},n.services.utils={hasLoadedNamespace:n.hasLoadedNamespace.bind(n)},s){let o=Object.keys(this.store.data).reduce((l,c)=>(l[c]={...this.store.data[c]},l[c]=Object.keys(l[c]).reduce((d,h)=>(d[h]={...l[c][h]},d),l[c]),l),{});n.store=new te(o,i),n.services.resourceStore=n.store}if(e.interpolation){let l={...le().interpolation,...this.options.interpolation,...e.interpolation},c={...i,interpolation:l};n.services.interpolator=new ne(c)}return n.translator=new se(n.services,i),n.translator.on("*",(o,...l)=>{n.emit(o,...l)}),n.init(i,t),n.translator.options=i,n.translator.backendConnector.services.utils={hasLoadedNamespace:n.hasLoadedNamespace.bind(n)},n}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}},x=fe.createInstance(),It=x.createInstance,Mt=x.dir,_t=x.init,Dt=x.loadResources,Ft=x.reloadResources,Ht=x.use,Ut=x.changeLanguage,$t=x.getFixedT,jt=x.t,Bt=x.exists,Gt=x.setDefaultNamespace,Vt=x.hasLoadedNamespace,zt=x.loadNamespaces,Wt=x.loadLanguages;var He={language:{label:"Interface language",saveFailed:"Could not save the language setting: this browser blocks local storage."},page:{title:"Long Screen \u2014 One big screenshot from a screen recording",description:"Turn a screen recording into one full-size big screenshot: scroll, pan, go diagonal, pause or circle back \u2014 not just scrolling down. Fixed window frames and status bars are restored. It all runs locally in your browser; nothing is uploaded.",closeLabel:"Close",header:{brandLabel:"Long Screen home",slogan:"ANY PATH \xB7 ONE BIG SCREENSHOT",privacy:"Pixels never leave this device",helpLabel:"Help and capabilities",star:"Star on GitHub",starLabel:"Star on GitHub (opens in a new tab)",install:"Install app",installTitle:"Install Long Screen on this device (PWA): it opens like an app and works offline"},install:{title:"Install on this device",intro:"Long Screen can be installed as a PWA (web app): it opens from your Home Screen or Dock in its own window and works without a connection. Recordings are still processed only on this device.",iosShare:"Tap the Share button in your browser. In Safari it sits in the bottom toolbar or under \u22EF.",iosAdd:"Scroll down to Add to Home Screen.",iosConfirm:"Tap Add.",iosInApp:"If this page opened inside another app, such as WeChat or LINE, switch to Safari first.",macFile:"In the menu bar at the top of the screen, choose File \u2192 Add to Dock.",macConfirm:"Click Add.",offline:"After installing, open it once while online; from then on it works offline."},hero:{heading:'Turn a screen recording<br>into <span class="hl">one big screenshot</span>.',intro:"Record your screen while you move around a web page, app, map or design \u2014 scroll, pan, go diagonal, circle back. Everything the recording showed is put back in place as one full-size PNG, with fixed window frames and status bars restored. It all runs in your browser; nothing is uploaded.",demoLead:" Want to see it first?",demoChip:"Play a sample recording"},steps:{ariaLabel:"How it works",recordTitle:"Record",recordBody:"Record the screen while you move around a page, app or map, any way you like.",feedTitle:"Feed it",feedBody:"Drop the video on the printer's screen and press Run.",takeTitle:"Take it whole",takeBody:"Take one full-size screenshot; anything never filmed stays empty."},press:{ariaLabel:"The printer",build:"Build"},screen:{dropTitle:"Drop a recording here",dropHint:"or click to choose a file \xB7 MP4 \xB7 MOV \xB7 WebM"},observe:{dropTitle:"No recording yet",dropSubtitle:"MP4 \xB7 MOV \xB7 WebM \xB7 stays on this device"},controls:{print:"Run",progress:"Progress",knobs:"Settings",clear:"Clear",clearTitle:"Clear the printer: take the recording out and clear this result and its log"},tray:{ariaLabel:"Big screenshot preview",idleTitle:"Your big screenshot comes out here",story1:"The recording wanders around the page\u2026",story2:"Every part it saw goes back in place",story3:"Out comes one big screenshot!",story4:"Scroll down on a phone and record\u2026",story5:"Stitched screen by screen, one status bar",story6:"The classic long screenshot works too!"},reconstruct:{heading:"Run settings",sub:"The defaults work; turn these only to fine-tune.",policyLabel:"Conflicts",policyStable:"Keep stable view",policyLatest:"Prefer newer view",framingLabel:"Frame",framingContext:"Keep frame \xB7 reference UI",framingRegion:"Content and margins only",regionsLabel:"Motion regions",regionsAuto:"Auto-detected \u2197",advancedSummary:"More knobs <span>\uFF0B</span>",analysisSizeLabel:"Analysis long edge",memoryLabel:"Tile cache limit",computeLabel:"Acceleration",computeAuto:"Auto \xB7 WebGPU / CPU",computeWebgpu:"WebGPU \xB7 CPU align",computeCpu:"CPU only",computeHint:"The GPU turns every decoded frame into pixels and shrinks the analysis thumbnails; matching and compositing still run on the CPU. Auto measures both ways first and only uses the GPU when it is faster.",decoderLabel:"Decoding",decoderPrecise:"Exact \xB7 WebCodecs",decoderCompatibility:"Approximate \xB7 native seek",decoderHint:"Analysis thumbnails do not change the output pixels. The tile cache only holds finished tiles and grows on its own when one frame paints more than fits, so it hardly changes the speed; memory the browser, decoder, GPU and core use is not counted in it. \u201CApproximate \xB7 native seek\u201D may miss brief content.",pauseBtn:"Pause",stopBtn:"Stop & save",footerNote:"No upload \xB7 no cloud inference \xB7 no external models"},canvas:{ariaLabel:"Reconstructed canvas",selectAriaLabel:"Choose reconstructed canvas",waitingOption:"Waiting for observation",qualityMask:"Quality mask",fitTitle:"Fit to window",fitBtn:"Fit",nativeTitle:"Native size",viewerAriaLabel:"Draggable and zoomable sparse 2D canvas",zoomOutLabel:"Zoom out",zoomInLabel:"Zoom in",expandLabel:"Spread it out",emptyTitle:"Stitching\u2026",emptyBody:"Every frame is finding its place in the whole picture.",statusReady:"Ready",progressMessageDefault:"Insert a recording \u2192 press Run \u2192 take it whole",lodLabel:"Checkerboard = never seen"},understand:{noteBtn:"Log",heading:"Run log",desc:"Why the printer placed each piece, what changed on the page and what went wrong \u2014 all recorded here.",framesLabel:"frames composited",canvasesLabel:"independent canvases",coverageBody:"Transparent \u2260 a white page <br><small>Marks space that was never observed; nothing is invented to fill it.</small>",diagnosticsHeading:"Diagnostics",filterAriaLabel:"Filter diagnostics",filterAll:"All",filterIssues:"Warnings / errors",diagnosticsAriaLabel:"Processing diagnostics",diagnosticsEmpty:"Localization evidence, page changes, <br>inferences and processing errors will appear here.",moreDiagnostics:"Load more diagnostics",reportLead:"Wrong result, or something broke?",reportBtn:"Report it on GitHub",reportNote:"The report comes pre-filled with your browser details and the warning codes from this log. It never includes the recording, its pictures or the file name, and you can read and edit it before you submit."},export:{downloadPng:"Take the screenshot \xB7 PNG <span>\u2193</span>",copyPng:"Copy screenshot",pngNote:"One full-size PNG \u2014 not scaled down, not split into pages.",advancedSummary:"Other ways to take it",exportProject:"Export full project \xB7 ZIP",projectNote:"Native-size tiles + offline viewer + coverage/quality data + full diagnostics, for archiving or troubleshooting.",exportSheets:"Paged export \xB7 multiple PNGs (ZIP)",sheetsNote:"Splits an oversized canvas into multiple native-size PNGs at a compatible size, with a 32px overlap between pages and a world-coordinate manifest; nothing is shrunk.",starNudge:"Found it useful? Star us on GitHub"},help:{title:"A canvas with a source",pixelsHeading:"Which pixels are kept?",pixelsBody:"Frame-accurate mode decodes frame by frame. Every completed observation has a timestamp and a compositing record. Analysis can be downscaled; final compositing and export keep the original pixel scale.",frameHeading:"Frame and natural margins",frameBody:"By default the whole scrollable area's background, margins and whitespace are kept, with no cropping to text bounds. The framed view additionally keeps one frame of reference UI: sidebar text and toolbar icons appear once at native size, and extended areas simply continue the decorative background \u2014 they are not reconstruction evidence. The original content layer is always kept separately. Other independent panes are never made to look like they share the same track.",scopeHeading:"This is not \u201Cuniversal page understanding\u201D",scopeBody:"Motion layering, repeated-texture disambiguation and dynamic-region attribution are all visual inference. Scale changes, non-overlapping or incompatible layouts may become independent fragments; these fragments are never claimed to be aligned with each other. Confidence is not a calibrated probability of correctness.",storageHeading:"Long recordings and storage",storageBody:"A three-pass decode scan trades disk space and compute time for limited memory. The browser keeps only your latest result, for up to 24 hours: after a reload or an accidentally closed page it comes back on its own, and a run cut off halfway comes back with what it had saved (it cannot resume from there). Running again or pressing Clear deletes it, and once it is over 24 hours old it is deleted the next time the page opens. Download what you want to keep.",browserHeading:"Browser and formats",browserBody:"Requires IndexedDB, OffscreenCanvas and CompressionStream. Local development can use HTTP localhost directly, no certificate needed; a phone opening a LAN HTTP address can test with \u201CApproximate \xB7 native seek\u201D, but it may miss frames. Browsers generally only open WebCodecs frame-accurate decoding and disk export APIs on localhost or HTTPS \u2014 this has nothing to do with uploading. Frame-accurate decoding also needs device support for the specific codec; an MP4/MOV/WebM container does not mean the device can decode everything inside it.",tipsHeading:"How do I get better results?",tipsBody:"Keep enough overlap; move a little slower over low-texture areas. When multiple panes or floating layers are not identified correctly, draw them by hand under \u201CMotion regions\u201D before processing. All diagnostics can be exported from the full project.",feedbackHeading:"Feedback and source code",feedbackBody:'Long Screen is open source under the MIT license; the code is on <a href="https://github.com/t41372/long-screen" target="_blank" rel="noopener">GitHub</a>. If you hit a bug or get a wrong result, please <a class="report-link" href="https://github.com/t41372/long-screen/issues/new" target="_blank" rel="noopener">open an issue</a>; it comes pre-filled with your browser details and the warning codes from the run log. If you find it useful, a star on the project helps us a lot.',toolsHeading:"Beyond this page",toolsBody:'The engine behind this page also works on its own: as a <a href="https://github.com/t41372/long-screen#command-line" target="_blank" rel="noopener">command line</a>, a <a href="https://github.com/t41372/long-screen#rust-library" target="_blank" rel="noopener">Rust library</a> and a <a href="https://github.com/t41372/long-screen#python-package" target="_blank" rel="noopener">Python package</a>, and as a <a href="https://github.com/t41372/long-screen#typescript-package" target="_blank" rel="noopener">TypeScript package</a> for other web pages. They too process recordings only on your own machine. The README explains how to install and use each.',licenseHeading:"Open-source licenses",licenseBody:`Long Screen's own code is under the MIT license: you may use, copy, modify and redistribute it for free, sell it or ship it inside closed-source products, as long as copies keep the copyright notice and the <a href="https://github.com/t41372/long-screen/blob/main/LICENSE" target="_blank" rel="noopener">license text</a>. It comes as is, with no warranty. The third-party dependencies bundled into the Wasm core and front-end assets and their licenses, as well as the sources and licenses of the Rust, WebAssembly and GitHub logos on this page, are listed in the <a href="./THIRD_PARTY_NOTICES.txt" target="_blank" rel="noopener">open-source notices</a> (generated at build time).`},regions:{title:"Set independent motion regions",hint:"Drag a rectangle over the frame. Each \u201Ccontent\u201D region is reconstructed independently. Regions left unmarked stay as a separate, explicitly low-confidence observation layer; \u201Cignore\u201D regions are actively excluded.",kindMoving:"Content \xB7 scrolls independently",kindFixed:"Fixed UI",kindIgnore:"Ignore \xB7 actively excluded",clearBtn:"Restore auto-detection",saveBtn:"Use these regions"},source:{title:"Original observation"},crop:{button:"Crop",groupLabel:"Crop area",left:"Left",top:"Top",width:"Width",height:"Height",full:"Whole print",cancel:"Cancel",apply:"Apply crop"},footer:{stackLead:"The core is written in",stackMid:"and compiled to",stackTail:"to run right in your browser.",stackMore:"Interface in TypeScript \xB7 built and tested with Deno",linksLabel:"Project links",source:"Source on GitHub",report:"Report a bug",notices:"Open-source notices",trademarks:"Rust, WebAssembly, TypeScript, Deno and GitHub names and logos belong to their owners. They are shown only to say what this project uses, not to suggest that any of them endorses it."}},deviceCheck:{title:"Device check",intro:`Measures what this browser and device offer (cross-origin isolation / threads, WebGPU adapter) and the real cost of the GPU path:
20
+ uploading and reading back one native RGBA frame, and the time and byte-for-byte consistency of analysis downscaling on the GPU versus the Rust core.
21
+ Optional: choose a recording to run the full pipeline on both CPU and forced WebGPU and compare tile fingerprints.
22
+ All processing happens on this device; nothing is uploaded. A chosen recording's run data is deleted after comparing. WebGPU is only available in a secure context (localhost or HTTPS).`,recordingLabel:"Recording (optional):",runBtn:"Run check",loadingReport:"Loading core\u2026"}};var Ue={ui:{phase:{scanning:"Frame-by-frame observation and motion layering",solving:"Global localization and native-pixel refinement",optimizing:"Correcting loop closure and cumulative drift",rendering:"Compositing the native-size sparse canvas",revealing:"Removing what floats over the page",framing:"Keeping the frame and original aspect ratio",pyramid:"Building a zoomable preview",complete:"Complete \xB7 check diagnostics",partial:"Partial results saved",error:"Processing hit an error"},count:{frames_one:"{{frames}} frame",frames_other:"{{frames}} frames",framesUnknown:"? frames",regions_one:"{{count}} custom region \u2197",regions_other:"{{count}} custom regions \u2197"},dom:{noCompressionStream:"This browser is missing CompressionStream, which encodes every native-size tile to PNG; reconstruction cannot start."},canvases:{badgePresentation:"Framed presentation \xB7 extended background is not observation evidence",badgeFixed:"Fixed / observation layer",badgeMoving:"2D content layer",badge_one:"{{kind}} \xB7 {{count}} native-size tile{{fragment}}",badge_other:"{{kind}} \xB7 {{count}} native-size tiles{{fragment}}",fragmentNote:" \xB7 fragments are not confirmed to align"},diagnostics:{occurrenceSuffix:" ({{count}} occurrences of this kind)",locateAction:"Locate affected area / view source \u2197",viewSourceAction:"View original moment \u2197",emptyFiltered:"No records under this filter.",emptyDefault:"Localization evidence, page changes, inferences and processing errors will appear here.",noOriginalVideo:"The original video is not included in the project. Choose the matching recording again to view by timestamp; the composited result is still saved locally.",hashMismatch:"The chosen file matches by name and size, but its content hash does not match the recording this project was built from, so it is refused as source-moment evidence. Please choose the correct recording file.",sourceCaption:"Source frame {{frame}} \xB7 {{time}}s \xB7 {{message}}"},export:{imageSuffix:"-screenshot",savePickerFallback:"Direct save is unavailable; using the browser download instead: {{error}}",saveRowLabel:"Save {{name}} \xB7 {{size}}",shareLabel:"Share / save to Photos",shareFailed:"Share failed: {{error}}",cleanupLabel:"Clean up temporary copy after saving",exportErrorAction:"An unfinished export was not marked as successful. Project tiles already committed are still on this device.",clipboardUnsupported:"This browser cannot copy images; use \u201CTake the screenshot\u201D instead.",copyNoImage:"No image was generated",copyFailedCtor:"Copy failed: {{error}}. Use \u201CTake the screenshot\u201D instead.",copySuccess:"Copied a {{width}} \xD7 {{height}} long image; paste it directly.",copyFailed:"Copy failed: {{error}}. The image may exceed the system clipboard limit; use \u201CTake the screenshot\u201D instead."},crop:{buttonCropped:"Crop \xB7 {{width}} \xD7 {{height}}",applied:"Done. Downloads, copies and paged exports now take only this part ({{width}} \xD7 {{height}}). The full project ZIP is not cropped.",removed:"Crop removed; exports take the whole print again."},main:{offscreenMissing:"This browser is missing OffscreenCanvas; the render worker cannot run.",webcodecsMissingToast:"This browser has no WebCodecs. Choose \u201CApproximate \xB7 native seek\u201D explicitly; it may miss frames.",privateStorageToast:"Private browsing: the project is only kept in this window's memory and disappears when the window closes; export before closing to keep it.",noOpfsNoPicker:"This browser has neither OPFS nor a file-save dialog; export will be generated in memory (up to {{mb}} MB).",dbOpenFailed:"Could not open the local database: {{error}}",workerErrorToast:"Worker error: {{message}}",workerMessageUndecodable:"A worker message could not be decoded. Keep the existing results and reload.",interruptedPhaseWhere:"\u201C{{phase}}\u201D, frame {{frames}}",interruptedStartPhase:"the starting phase",interruptedHiddenSome:"the page was in the background for about {{seconds}}s{{stillHidden}}",interruptedStillHidden:" (still in the background at the time of interruption)",interruptedHiddenNone:"the page stayed in the foreground the whole time",interruptedDiagnosticMessage:"The previous reconstruction was interrupted in {{where}}; the page never received a completion signal (the browser evicted or crashed the page). It had run for {{elapsed}}s, core memory {{memory}} MB, {{hidden}}, frame conversion: {{conversion}}, CPU cores: {{cores}}{{isolation}}.",interruptedDiagnosticAction:"Safari evicts a page at a much lower memory limit once it goes to the background: keep this tab in the foreground for long-running processing. The full record was written to the browser console.",interruptedNotIsolated:" (not cross-origin isolated, single-threaded)",interruptedToast:"The previous reconstruction was interrupted in {{where}} ({{hidden}}). See diagnostics for details.",unknownValue:"unknown"},run:{pausedStatus:"Paused \xB7 memory state retained",resumedStatus:"Resuming",pauseLabel:"Pause",resumeLabel:"Resume",stopToast:"Ending the current phase and compositing and saving as much of the observation as possible.",preparingStatus:"Preparing frame-accurate decoding",preparingMessage:"Reading the container and checking codec support and local storage.",compatibilityNeedsNative:"\u201CApproximate \xB7 native seek\u201D needs the browser's native player to be able to read this video.",webcodecsHttpBlocked:"The browser does not open WebCodecs on this HTTP address. You can choose \u201CApproximate \xB7 native seek\u201D to keep testing locally; frame-accurate decoding needs localhost or HTTPS. The video is not uploaded.",webcodecsMissing:"This browser has no WebCodecs. Update Safari / iOS, or explicitly choose \u201CApproximate \xB7 native seek\u201D, which may miss frames.",startFailedStatus:"Could not start reconstruction",restoredMessage:"This is your last result. Once it is over 24 hours old, it is deleted the next time the page opens.",interruptedStatus:"The last run did not finish",interruptedMessage:"This is what was saved before it stopped. For the full result, put the recording back in and run it again.",waitingCanvasOption:"Waiting for canvas to reconstruct"},source:{busyToast:"Finish or save the current run first.",subtitleReading:"{{size}} \xB7 not uploaded \xB7 reading container and first frame",subtitleDetailed:"{{width}} \xD7 {{height}} \xB7 {{duration}} \xB7 {{frames}} \xB7 {{codec}} \xB7 {{size}}",subtitleNativeOnly:"{{width}} \xD7 {{height}} \xB7 {{duration}} \xB7 {{size}} \xB7 readable by the native player only",subtitleUnavailable:"{{size}} \xB7 neither frame-accurate decoding nor native preview is available",probeFailedMessage:"Frame-accurate decode probing failed: {{error}}",probeFailedAction:"Will try the browser's native player to read metadata. To keep processing, choose \u201CApproximate \xB7 native seek\u201D for decoding.",rejectedVideo:"\u201C{{name}}\u201D is {{kind}}, a format the browser cannot read frame by frame, so it was not opened. Set your screen recorder to save MP4, or convert the file to MP4 first with HandBrake or ffmpeg.",rejectedOther:"\u201C{{name}}\u201D is not a video ({{kind}}), so it was not opened. Choose a screen recording of a scrolling page: MP4, MOV, WebM or MKV. On Windows, record with the Snipping Tool or Xbox Game Bar (Win+Alt+R); on a Mac, press \u2318\u21E75; on a phone, use its built-in screen recording.",unreadableToast:"This video cannot be read ({{reason}}). Check that the recording finished properly and that the file was copied or downloaded completely; if it still fails, try an H.264 MP4. The diagnostics say why frame-accurate decoding failed.",kind:{empty:"an empty file",heif:"a HEIC/AVIF image",avi:"an AVI video",webp:"a WebP image",wav:"a WAV audio file",riff:"a RIFF file",wmv:"a WMV/ASF video",flv:"an FLV video",mpegps:"an MPEG-PS video",ogg:"an Ogg media file",gif:"a GIF animation",png:"a PNG image",jpeg:"a JPEG image",pdf:"a PDF document",zip:"a ZIP archive or Office document",mp3:"an MP3 audio file",text:"a text file",mpegts:"an MPEG-TS video",unknown:"an unrecognised file"}},demo:{fileName:"sample-recording.mp4",loadFailed:"The sample recording could not be loaded: {{error}}"},feedback:{issueBody:`**What happened?**
23
+
24
+
25
+ **What did you expect?**
26
+
27
+
28
+ **About the recording** (what page, how you moved, roughly how long; a screenshot helps, but hide anything private)
29
+
30
+
31
+ ---
32
+ Filled in by Long Screen, edit or delete as you like:
33
+ - Browser: {{browser}}
34
+ - Opened from: {{page}}
35
+ - Multithreaded core (cross-origin isolated): {{threads}}
36
+ - Warnings in the run log: {{warnings}}
37
+ `,portable:"portable build (local file)",yes:"yes",no:"no",none:"none"},viewer:{previewLevel:"Preview L{{level}} (native size unchanged)",nativeLevel:"Native pixels L0",qualityHint:" \xB7 zoom in to see the quality mask",unobservedHint:" \xB7 blue = no observation evidence",provisionalHint:" \xB7 purple = transient / overlay content"}},names:{fixed:"Fixed UI",divider:"Fixed divider",contentCanvas:"Content canvas {{n}}",unassigned:"Unassigned area \xB7 screen-space observations",contentRegion:"Content region {{n}}",ignored:"Ignored",fragment:"unplaced fragment {{n}}",framed:"framed"}};var $e={diag:{MODEL_ASSUMPTIONS:{message:"Reconstruction uses layered panning canvases with geometric loop-closure constraints. Automatic masking and dynamic-region detection are heuristic inference; confidence scores are not calibrated correctness probabilities. World-consistency comparisons run at this source\u2019s declared decode noise of \xB1{{noise}} levels{{margin}}.",marginLossy:" (headroom for compressed-video ringing/chroma reconstruction)",marginLossless:" (lossless source, exact pixel-for-pixel comparison)",action:"When scale or structure cannot coexist, an independent fragment is kept rather than forcing incompatible states together."},APPROXIMATE_DECODER:{message:"\u201CApproximate \xB7 native seek\u201D at {{fps}} Hz was explicitly enabled. Not every frame of the video is guaranteed to be captured; brief content may be missing.",action:"When frame-by-frame coverage must be guaranteed, use a WebCodecs-supported input such as H.264 or VP9."},ANALYSIS_PYRAMID:{message:"Motion analysis caps the long edge at {{size}}px; native-resolution pixels are used for refinement and final compositing, so the output does not follow the downsample."},FRAME_MEMORY_PRESSURE:{message:"One native frame plus its reference frames are close to the selected cache budget. Codec/GPU memory itself is not controlled by the JavaScript cache budget.",action:"Output resolution is never silently reduced; on memory pressure, already-committed data is kept and the failure is reported."},RUN_FAILURE:{action:"Tiles already committed to local storage remain viewable and exportable; the failure was not marked as a success."},PERSISTENCE_ERROR:{action:"The storage write also failed; only data committed earlier can be recovered."},MEMORY_BUDGET_RAISED:{message:"The tile cache was raised from the {{from}} tiles the budget allowed to {{to}} tiles (about {{mb}} MB), to hold every tile one frame touches.",action:"A cache smaller than one frame\u2019s coverage would force every frame to fully re-decode and re-encode all its tiles; lower the recording resolution for a smaller memory footprint."},NONFINITE_POSE:{message:"Placement computation produced a non-finite value. This observation was isolated; the invalid coordinates were not written to the canvas."},MISSING_PLAN:{message:"The render stage is missing plan/{{index}}; stopped at the already-committed render prefix.",action:"Check local storage integrity; a missing solve plan is never silently treated as an empty observation."},prefixOnly:{base:{scan:"Continuing placement and compositing with only the frames decoded so far ({{frames}})",solve:"Continuing rendering with only the frames solved so far ({{frames}})",render:"Keeping results only for the frames rendered so far ({{frames}})"},suffixPersistence:"; the storage write has stopped.",suffixDefault:"."},PRESENTATION_TOO_SPARSE:{action:"This canvas\u2019s framed presentation was skipped; the core reconstruction in page coordinates is unaffected."},PRESENTATION_FRAME:{message:"The framed view and the original 2D content are kept separately. The frame comes from a reference frame; the extended portion is decorative background only and does not count as observed content \u2014 toolbar icons are never stretched or duplicated. Other panes inside the frame are reference snapshots only."},PRESENTATION_STAGE_FAILED:{action:"The framed-presentation stage failed; the core reconstruction result and status in page coordinates are unaffected."},PYRAMID_FAILED:{action:"Preview pyramid construction failed; native-size tiles are unaffected and remain viewable and exportable."},PASS_FRAME_COUNT_MISMATCH:{message:"The {{pass}} stage only completed {{actual}}/{{expected}} frames; the result was marked partial.",action:"The successfully committed prefix was kept; missing frames are never silently treated as processed."},FRAME_CONVERSION:{message:"Each decoded frame is turned into pixels by: {{method}}."},HDR_UNCHECKED:{message:"This is an HDR recording ({{transfer}}), but this browser offers no way to check the colour conversion, so the print may come out dark or washed out.",action:"Run it again in an up-to-date Chrome or Safari."},HDR_ABOVE_WHITE:{message:"In the first frame of this HDR recording, {{percent}}% of the pixels are brighter than ordinary white and were taken as white. If the print looks overexposed, the recorder most likely placed ordinary white at a higher brightness.",action:"Set the recorder\u2019s SDR white back to 100 nits, or turn HDR recording off."},SLOW_CONVERSION:{message:"This browser takes about {{ms}} ms to turn each frame of this recording into pixels, so converting alone will take about {{minutes}} min.",action:"An up-to-date Chrome or Safari is much faster; converting the recording to H.264 first also helps."},REVEAL_SKIPPED:{message:"This print has too many or too large canvases: cleaning overlays (cursor, floating buttons, scrollbars) would need about {{need}} MB more memory than is left, so that step was skipped and the stitched pixels kept.",action:"The rest of the result is unaffected. So many canvases usually means parts of the recording could not be joined to what came before; a shorter recording, or a computer with more memory, helps."},COMPUTE_BACKEND:{message:"{{backend}} \u2014 {{reason}}. Rust core: {{variant}} build, compute threads: {{threads}} ({{coreReason}})."},PRESENTATION_REFERENCE_FAILED:{action:"The framed presentation will be skipped; the core reconstruction in page coordinates is unaffected."},LOW_TEXTURE_UNOBSERVABLE:{message:"The frame lacks recognizable texture. An identical blank frame could equally be a pause or motion over a blank area; the pixels alone cannot distinguish them.",action:"Add distinguishable visible content or record more overlap. Zero displacement here is only a best guess."},UNRESOLVED_MOTION:{message:"This observation lacks a reliable visual-alignment basis. The solve stage will attempt historical relocalization; an independent fragment is kept if it still cannot be placed."},AMBIGUOUS_PATTERN:{message:"A repeating texture with several equally plausible matches was detected; continuity is only a placement prior, not a proven, unique position."},TEMPORAL_UNDERSAMPLING:{message:"This frame spans an unusually long duration; areas may exist that were never captured during fast motion."},MANUAL_UNASSIGNED:{message:"The part not covered by manual regions is kept as an independent, low-confidence screen-space observation layer; these pixels are not claimed to have been recovered into page coordinates."},EXPLICITLY_EXCLUDED_REGION:{message:"An \u201Cignore\u201D region was excluded as set manually. That region contributes nothing to the reconstruction; this is not frames being dropped automatically."},MANUAL_REGION_PRIORITY:{message:"Where manual regions overlap, the later-drawn region takes priority; ignored regions are always excluded. Remaining pixels are kept in the unassigned observation layer."},AUTOMATIC_LAYER_MASK:{message:"Automatically split into {{moving}} content region(s) and {{fixed}} fixed-UI region(s). Boundaries come from pixel-motion statistics, not the DOM.",action:"If a mask\u2019s assignment looks wrong, draw a precise scroll region under \u201CMotion regions\u201D and reprocess."},MULTIPLE_SCROLL_LAYERS:{message:"Multiple independent scroll regions will each get their own canvas; they are not forced to share one scroll offset."},TEMPORAL_OR_ALIGNMENT_CONFLICT:{message:"After aligning this frame, the overlap area has {{conflicts}} noticeably different pixels in total; this region is one conflicting component within it. Possible causes: animation, content updates, reflow, or registration residual.",actionStable:"The complete conflicting region was frozen to a single moment where possible; check the orange diagnostics and the original video timestamp.",actionRolling:"The whole conflicting region is updated with the same frame only when fully visible; it is not the same moment across the whole page."},INCOMPLETE_TEMPORAL_PATCH:{message:"This changed region never appeared complete within one usable viewport; not all of its pixels are guaranteed to come from the same moment.",action:"Observed content and explicit conflict marking are kept; unobserved parts were not invented."},MISSING_SCAN_RECORD:{message:"The solve stage is missing scan/{{index}}; stopped at the already-committed solve prefix.",action:"Check local storage integrity; a missing scan record is never treated as zero displacement."},GRAPH_RESIDUAL:{message:"The pose graph\u2019s maximum residual is still {{residual}} native pixels; nearby seams may show geometric inconsistency.",action:"Check text and repeating textures near the loop closure. This residual was not hidden."},PARTIAL_CONTENT_CHANGE:{message:"About {{percent}}% of texture blocks disagree with the overall displacement (animation, video, lazy loading, or reflow); the displacement is decided by the consistent blocks, and the conflicting region is handled separately at compositing time."},THIN_OVERLAP_STEP:{message:"The frames moved quickly against each other, leaving only a small overlap to align on. The displacement is drawn from this small piece of evidence; in a periodically repeating layout, an adjacent period could equally explain these pixels.",action:"If a later revisit provides stronger evidence, this whole trajectory segment will be corrected and recorded."},LOW_CONFIDENCE_PLACEMENT:{messageAmbiguous:"A repeating texture lets several displacements explain the pixels; the solution most consistent with motion continuity was used \u2014 a best guess, not the only correct alignment.",messageLowConfidence:"This region used a low-confidence placement estimate; the affected pixels are flagged in the quality mask.",messageStatic:"The two frames are nearly identical but lack a verifiable feature correspondence; treated as a pause (zero displacement) \u2014 a best guess.",action:"The continuous trajectory and any existing anchor were used for a best guess; this is not asserted to be the only correct alignment."},UNOBSERVABLE_FRAME:{message:"This frame has no recognizable texture in this region: a blank frame could equally be a pause or motion over a blank area, and pixels alone cannot distinguish them. It is not painted anywhere.",action:"If the content after the blank cannot overlap with the prior observation, it is kept as an independent fragment rather than guessing the distance in between."},RELOCALIZED:{message:"Relocalized onto an already-observed canvas via a historical visual anchor; the revisited content was not appended as new long-image extent."},SCALE_CHANGE_FRAGMENT:{message:"Detected an approximately {{scale}}\xD7 scale/layout transform; kept as an independent fragment at native pixels \u2014 no scaling was quietly blended in.",action:"The relationship across fragments is not yet confirmed; if a later revisit matches reliably, the fragment will be reattached as a whole. Re-record with more overlap, or isolate the changing component with a manual region."},UNPLACED_FRAGMENT:{message:"Could not confirm the position relative to the original canvas; kept as an independent, separately exportable fragment. The two fragments may overlap, or a genuine gap may exist between them.",action:"The relationship across fragments is not yet confirmed; if a later revisit matches reliably, the fragment will be reattached as a whole. Re-record with more overlap, or isolate the changing component with a manual region."},STICKY_OCCLUSION:{message:"Texture at the top of the frame indicates screen-fixed UI rather than page movement; this observation\u2019s fixed occlusion is not written into the moving canvas. The original reference UI is kept in the framed presentation."},FRAGMENT_ATTACHED:{message:"Revisit evidence reattached an independent fragment onto an existing canvas as a whole; the relative trajectory within the fragment is unchanged."},TRAJECTORY_CORRECTED:{message:"The previous step had only a small overlap; this frame\u2019s match against already-observed content differs by {{discrepancy}}px and the evidence is stronger \u2014 the current position was corrected to this match.",action:"What was corrected is this frame and the trajectory after it; pixels written earlier are unchanged and may show a seam against the corrected coordinates."},LOOP_CLOSURE:{message:"A reliable historical revisit was found and added as a global position constraint; final compositing uses the corrected trajectory."},INCONSISTENT_LOOP_REJECTED:{message:"The historical match differs from the continuous trajectory by {{discrepancy}}px; the evidence conflicts, so it was not imposed as a loop closure."},AMBIGUOUS_LOOP:{message:"Historical retrieval returned several nearly equally plausible positions; an uncertain loop closure was not imposed as a hard constraint."}},progress:{runPartial:"An explicitly marked partial reconstruction was saved.",runComplete:"Reconstruction complete; check the diagnostics and unobserved areas.",render:"Compositing native-size tiles from observed evidence; gaps stay transparent.",reveal:{learn:"Watching the recording again to find buttons, input bars and scrollbars that float over the page.",agree:"Checking how each part of the page looked over time; an unobstructed view wins.",relearn:"Finding the floating elements again against the checked page.",write:"Replacing covered or mismatched areas with the clean frame."},framingStart:"Preserving the original frame; only the background is extended, without stretching sidebar text or duplicating icons.",pyramidBuild:"Building the on-disk preview pyramid; native-size tiles are unchanged.",scanFrame:"Extracting geometric evidence frame by frame, learning independent motion regions.",duplicateReuse:"An identical observation reused the previous placement; the source frame and timestamp are retained.",solveFrame:"Native-pixel refinement, historical relocalization, and 2D loop-closure constraints.",optimizing:"Optimizing the on-disk pose graph, correcting loop-closure drift."},media:{UNSUPPORTED_CODEC:"UNSUPPORTED_CODEC: this browser cannot decode this recording\u2019s codec ({{codec}}). {{advice}}",UNSUPPORTED_ADVICE:{hevc:"iPhone and Mac recordings are usually HEVC, which only some browsers decode: use Safari, or Chrome or Edge with hardware decoding.",prores:"No browser decodes ProRes; export the recording as H.264 or HEVC first.",h264:"Only Chrome decodes this kind of H.264 (4:4:4 or 10-bit): use Chrome, or export it as ordinary H.264.",av1:"AV1 needs a recent browser or hardware: use an up-to-date Chrome, or export the recording as H.264.",other:"Use an up-to-date Chrome or Safari, or convert the recording to H.264 first."},PIXEL_ASPECT_RATIO:"The recording declares a {{num}}:{{den}} pixel aspect ratio; stored pixels are kept unscaled, so the display aspect may differ.",CONTAINER_SIZE_MISMATCH:"The container declared {{codedWidth}}\xD7{{codedHeight}}, but the bitstream is actually {{bitstreamWidth}}\xD7{{bitstreamHeight}}; the bitstream size is authoritative.",NON_SQUARE_PIXELS:"This recording declares a non-square pixel aspect ratio (display size {{displayWidth}}\xD7{{displayHeight}}, storage size {{bitstreamWidth}}\xD7{{bitstreamHeight}}); the original stored pixels are kept, unscaled.",NEGATIVE_TIMESTAMP_SKIPPED:"The decoder produced a frame before the edit list\u2019s start point (a negative timestamp); such frames are not shown, per container semantics.",NONMONOTONIC_TIMESTAMP:"A container timestamp went backwards; processing continued in the decoder\u2019s presentation order, and no observation was discarded.",NONSTANDARD_SIGNED_CTTS_V0:"NONSTANDARD_SIGNED_CTTS_V0: This video track\u2019s ctts box is version 0 but contains negative composition-time offsets; ISO 14496-12 only defines negative offsets in version 1. These offsets are treated as signed (a common QuickTime/ReplayKit convention), not as unusually large positive offsets.",TRUNCATED_RECORDING:"TRUNCATED_RECORDING: The file ends inside its {{box}} box: the box declares that it ends at byte {{declaredEnd}}, but the file has only {{size}} bytes. The recording may not have finished properly, or the file was cut off while being copied or transferred; frames after the cut cannot be decoded, so the scan finds fewer frames than the metadata lists and the result will be marked partial."},exports:{tilesProgress:"Exporting native and preview tiles {{n}}",zipFinalize:"Writing the ZIP64 directory and committing the file",projectDone:{message:"Exported native-size tiles, the offline viewer, coverage and quality data, source-frame records, and the full diagnostics."},encodingSingle:"Encoding row {{row}} / {{total}} at native scale",canvasDone:{message:"Exported a {{width}} \xD7 {{height}} native-size PNG; gaps stay transparent."},encodingSheet:"Encoded {{count}} native-size sheet image(s)",sheetsDone:{messagePaged:"Exported as {{count}} native-size sheet image(s); adjacent sheets overlap by up to {{overlap}}px, with coordinates in the manifest.",messageOversize:"The canvas exceeded the single-image compatible size, so it was explicitly exported as {{count}} native-size sheet image(s) instead; adjacent sheets overlap by up to {{overlap}}px, with coordinates in the manifest."}},offline:{title:"Offline canvas",fit:"Fit",tip:"Local native-size tiles \xB7 drag / scroll to zoom",previewLevel:"Showing preview level {{level}}; zoom in to see native pixels",nativeTiles:"Showing native-size tiles",footer:"Checkerboard areas are unobserved / have no tiles; confidence is not a correctness probability. See diagnostics.jsonl and observations.jsonl."}};var je={...He,...Ue,...$e};var Be=["zh","en"],Y="zh";var $=x.createInstance();$.init({lng:Y,fallbackLng:Y,supportedLngs:[...Be],resources:{zh:{translation:X},en:{translation:je}},initAsync:!1,interpolation:{escapeValue:!1}});var j=$.t.bind($);var ht=a=>Be.includes(a),Ge=()=>ht($.language)?$.language:Y;function Ve(a){$.changeLanguage(a)}var J=" \xB7 ",I=X.names,me=a=>new RegExp(`^${a.replace("{{n}}","(\\d+)")}$`),ut=me(I.contentCanvas),pt=me(I.contentRegion),gt=me(I.fragment);var ft=new Map([[I.fixed,"names.fixed"],[I.divider,"names.divider"],[I.unassigned,"names.unassigned"],[I.ignored,"names.ignored"]]);function mt(a){let e=ft.get(a);if(e)return j(e);let t=ut.exec(a);if(t)return j("names.contentCanvas",{n:t[1]});let s=pt.exec(a);return s?j("names.contentRegion",{n:s[1]}):a}function ze(a){if(Ge()===Y)return a;let e=[],t=a;t.endsWith(J+I.framed)&&(t=t.slice(0,-(J+I.framed).length),e.unshift(j("names.framed")));let s=t.lastIndexOf(J),i=s>=0?gt.exec(t.slice(s+J.length)):null;return i&&(t=t.slice(0,s),e.unshift(j("names.fragment",{n:i[1]}))),[mt(t),...e].join(J)}var Ye="long-screen-package:";function gs(a,e={}){let t=e.locale==="zh"?"zh":"en",s={...Se,...e.settings,decoder:"precise",regions:[]},i=a instanceof File?a:new File([a],"video",{type:a.type}),n,r=!1,o=!1,l=()=>{},c=new Promise((m,v)=>l=v);c.catch(()=>{});let d=()=>{},h=new Promise(m=>d=m),u,p=(m,v)=>Promise.race([u.call(m,v),c]),g=async(m,v)=>{await Promise.race([h,c]),o&&await p(m,v)};return{result:(async()=>{let m=ae+xe(),v=await wt(Ye+m);try{if(await St(),r)throw Ke();n=new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),n.postMessage({type:"locale",locale:t}),n.postMessage({type:"storage",name:m}),u=we(n);let w=new Promise((b,P)=>{u.on("finished",D=>b(D.data)),u.on("fatal",D=>P(new Error(D.error))),n.onerror=D=>{D.preventDefault();let q=new Error(D.message||"The Long Screen worker failed to start.");u.rejectPending(q),P(q)}});w.catch(()=>{});let R={phase:"scanning",fraction:0,frames:0,time:0,message:""};u.on("progress",b=>{R=bt(b.data),e.onProgress?.(R)}),u.on("diagnostic",b=>e.onDiagnostic?.(b.data)),u.on("export-progress",b=>e.onProgress?.({...R,phase:"export",fraction:b.data.fraction,message:b.data.message})),u.on("frame-request",b=>n.postMessage({type:"frame-response",id:b.id,error:"No page-side video element."}));let S=await p("start",{file:i,settings:s});o=!0,d();let T=await Promise.race([w,c]).finally(()=>o=!1),M=await We(b=>p("canvases",{projectId:S.id,after:b})),_=await We(b=>p("diagnostics",{projectId:S.id,after:b})),B=[];for(let b of yt(M,s))B.push(await vt(p,S.id,b,t));return{status:T.status==="complete"?"complete":T.status==="error"?"error":"partial",...T.error?{error:T.error}:{},frames:T.renderedFrames,prints:B,diagnostics:_}}finally{o=!1,d(),await Je(m),n?.terminate(),v()}})(),pause:()=>g("pause",{paused:!0}),resume:()=>g("pause",{paused:!1}),stop:()=>g("stop",{}),cancel(){if(r)return;r=!0;let m=Ke();n?.terminate(),u?.rejectPending(m),l(m)}}}function bt(a){return{phase:a.phase,fraction:a.fraction,frames:a.frames,...a.total===void 0?{}:{total:a.total},time:a.time,message:a.message}}function yt(a,e){let t=s=>s.kind==="presentation"?e.framing==="context"?-1:0:s.kind==="fixed"?1:0;return a.filter(s=>s.tileCount>0&&!s.attachedTo&&Number.isFinite(s.bounds.width)&&Number.isFinite(s.bounds.height)).sort((s,i)=>t(s)-t(i)||i.observedPixels-s.observedPixels)}async function vt(a,e,t,s){let i=await a("export",{projectId:e,canvasId:t.id,format:"png",layout:"single"});if(!i.blob)throw new Error(`The worker returned no PNG for ${t.id}.`);let n=i.blob;return i.temporary&&(n=new Blob([await i.blob.arrayBuffer()],{type:"image/png"}),await a("cleanup-export",{key:i.temporary})),Ve(s),{id:t.id,name:t.name,label:ze(t.name),kind:t.kind,fragment:t.fragment,width:Math.round(t.bounds.width),height:Math.round(t.bounds.height),bounds:{...t.bounds},observedPixels:t.observedPixels,png:n}}async function We(a){let e=[],t;for(;;){let s=await a(t);if(e.push(...s.map(i=>i.value)),s.length<100)return e;t=s[s.length-1].key}}async function wt(a){if(!navigator.locks)return()=>{};let e=()=>{},t=new Promise(s=>e=s);return await new Promise(s=>{navigator.locks.request(a,()=>(s(),t))}),e}async function St(){if(!navigator.locks||!indexedDB.databases)return;let[a,e]=await Promise.all([indexedDB.databases(),navigator.locks.query()]),t=new Set((e.held??[]).map(s=>s.name));await Promise.all(a.map(s=>s.name).filter(s=>!!s&&s.startsWith(ae)&&!t.has(Ye+s)).map(Je))}function Je(a){return new Promise(e=>{let t=indexedDB.deleteDatabase(a);t.onsuccess=t.onerror=t.onblocked=()=>e()})}function Ke(){return new DOMException("The reconstruction was cancelled.","AbortError")}export{gs as reconstruct};
package/package.json CHANGED
@@ -1,6 +1,45 @@
1
1
  {
2
2
  "name": "long-screen",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Turn a screen recording into one big screenshot, in the browser: Long Screen’s reconstruction engine (Rust/WebAssembly in a Worker) for your own page.",
5
+ "keywords": [
6
+ "screen-recording",
7
+ "screenshot",
8
+ "stitching",
9
+ "panorama",
10
+ "webassembly",
11
+ "webcodecs",
12
+ "worker"
13
+ ],
14
+ "homepage": "https://long-screen.yi-ting.com",
15
+ "bugs": "https://github.com/t41372/long-screen/issues",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/t41372/long-screen.git"
19
+ },
20
+ "license": "MIT",
21
+ "author": "Yi-Ting Chiu",
22
+ "type": "module",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./index.d.ts",
26
+ "default": "./index.js"
27
+ },
28
+ "./package.json": "./package.json"
29
+ },
30
+ "types": "./index.d.ts",
31
+ "files": [
32
+ "LICENSE",
33
+ "README.md",
34
+ "THIRD_PARTY_NOTICES.txt",
35
+ "convert-worker.js",
36
+ "core-helper.js",
37
+ "core.simd.wasm",
38
+ "core.threads.wasm",
39
+ "core.wasm",
40
+ "index.d.ts",
41
+ "index.js",
42
+ "worker.js"
43
+ ],
44
+ "sideEffects": false
45
+ }