@mearl/native-host 3.0.0 → 3.0.1
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/dist/index.js +7 -7
- package/dist/node-capabilities.js +1 -1
- package/dist/provider-app-resources.d.ts +2 -3
- package/package.json +10 -10
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __mearlCreateRequire } from 'node:module'; const require = __mearlCreateRequire(import.meta.url);
|
|
3
|
-
var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res,err)=>function(){if(err)throw err[0];try{return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res}catch(e){throw err=[e],e}};var __commonJS=(cb,mod)=>function(){try{return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports}catch(e){throw mod=0,e}};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));import{join}from"node:path";import{homedir}from"node:os";import{createHash}from"node:crypto";function hashKey(key){return createHash("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.json`)}function keyedLogFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.log`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join(homedir(),".mearl")}});import{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat5=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat5.lastIndexOf(")"),fields7=stat5.slice(end+2).trim().split(/\s+/),group=Number(fields7[2]),threads=Number(fields7[17]);if(end<0||!/^[A-Za-z]$/.test(fields7[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields7[19]??""))throw new Error("Invalid Linux process stat");return{state:fields7[0],group,threads,identity:fields7[19]}}function linuxProcessExited({state,threads}){return threads<=1&&(state==="Z"||state==="X"||state==="x")}function processIdentity(pid){if(!(!Number.isSafeInteger(pid)||pid<1))try{if(process.platform==="linux")return linuxProcessStat(pid).identity;let result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CreationDate.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3,windowsHide:!0}):spawnSync("ps",["-p",String(pid),"-o","lstart="],{encoding:"utf8",timeout:2e3});return result.status===0&&result.stdout.trim()||void 0}catch{return}}function isProcessOwnerAlive(owner){if(!isAlive(owner.pid))return!1;if(typeof owner.processIdentity!="string")return!0;let current=processIdentity(owner.pid);return current===void 0||current===owner.processIdentity}function isAlive(pid){if(!Number.isSafeInteger(pid)||!pid||pid<=0)return!1;try{if(process.kill(pid,0),process.platform==="linux")try{return!linuxProcessExited(linuxProcessStat(pid))}catch{return!0}return!0}catch(error){return error.code==="EPERM"}}function isProcessGroupAlive(group){if(!Number.isSafeInteger(group)||group<1)return!1;if(process.platform==="win32")return!0;let probe=()=>{try{return process.kill(-group,0),!0}catch(error){return error.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members=new Set;try{for(let name of readdirSync("/proc"))if(/^\d+$/.test(name))try{let stat5=linuxProcessStat(Number(name));if(stat5.group!==group)continue;if(!linuxProcessExited(stat5))return;members.add(`${name}:${stat5.identity}`)}catch(error){if(!["ENOENT","ESRCH"].includes(error.code??""))return}return members}catch{return}},first=exitedMembers();if(!first)return!0;let second=exitedMembers();return second?first.size&&first.size===second.size&&[...first].every(pid=>second.has(pid))?!1:probe()!==!1:!0}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync as readFileSync2,writeFileSync,renameSync,rmSync,readdirSync as readdirSync2}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file){try{if(!existsSync(file))return null;let parsed=JSON.parse(readFileSync2(file,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file){rmSync(file,{force:!0})}function writeRecordUnlocked(file,record4){let tmp=`${file}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record4),{mode:384}),renameSync(tmp,file)}catch(error){try{rmSync(tmp,{force:!0})}catch{}throw error}}function removeStaleLock(lockDir){let ownerFile=join2(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file,operation){ensureDir(dirname(file));let lockDir=`${file}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error){if(error.code!=="EEXIST")throw error;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file}`,{cause:error});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file}`,{cause:error});pauseForLock();continue}throw error}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file,record4){withRecordLock(file,()=>writeRecordUnlocked(file,record4))}function claimRecord(file,record4){return withRecordLock(file,()=>{let candidate=`${file}.${process.pid}.${randomUUID()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file),!0}catch(error){if(error.code==="EEXIST")return!1;throw error}finally{rmSync(candidate,{force:!0})}})}function readRecord(file){return readRecordUnlocked(file)}function removeRecord(file){try{withRecordLock(file,()=>removeRecordUnlocked(file))}catch{}}function removeRecordIfPid(file,pid){try{return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function writeRecordIfPid(file,pid,record4){return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(writeRecordUnlocked(file,record4),!0))}function removeInvalidRecord(file){try{return withRecordLock(file,()=>!existsSync(file)||readRecordUnlocked(file)?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file of listRecordFiles(dir)){let rec=readRecord(file);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file,rec.pid):removeInvalidRecord(file)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});var require_constants=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports,module){"use strict";var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}});var require_debug=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports,module){"use strict";var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module.exports=debug}});var require_re=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports,module){"use strict";var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports=module.exports={};var re=exports.re=[],safeRe=exports.safeRe=[],src=exports.src=[],safeSrc=exports.safeSrc=[],t=exports.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0)};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}});var require_parse_options=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports,module){"use strict";var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module.exports=parseOptions}});var require_identifiers=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports,module){"use strict";var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{if(typeof a=="number"&&typeof b=="number")return a===b?0:a<b?-1:1;let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module.exports={compareIdentifiers,rcompareIdentifiers}}});var require_semver=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports,module){"use strict";var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),isPrereleaseIdentifier=(prerelease,identifier2)=>{let identifiers=identifier2.split(".");if(identifiers.length>prerelease.length)return!1;for(let i=0;i<identifiers.length;i++)if(compareIdentifiers(prerelease[i],identifiers[i])!==0)return!1;return!0},SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id3=>{if(/^[0-9]+$/.test(id3)){let num=+id3;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id3}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options)}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.major<other.major?-1:this.major>other.major?1:this.minor<other.minor?-1:this.minor>other.minor?1:this.patch<other.patch?-1:this.patch>other.patch?1:0}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return-1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier2,identifierBase){if(release.startsWith("pre")){if(!identifier2&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier2){let match=`-${identifier2}`.match(this.options.loose?re[t.PRERELEASELOOSE]:re[t.PRERELEASE]);if(!match||match[1]!==identifier2)throw new Error(`invalid identifier: ${identifier2}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier2,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier2,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier2===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base)}}if(identifier2){let prerelease=[identifier2,base];if(identifierBase===!1&&(prerelease=[identifier2]),isPrereleaseIdentifier(this.prerelease,identifier2)){let prereleaseBase=this.prerelease[identifier2.split(".").length];isNaN(prereleaseBase)&&(this.prerelease=prerelease)}else this.prerelease=prerelease}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module.exports=SemVer}});var require_parse=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse2}});var require_valid=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports,module){"use strict";var parse2=require_parse(),valid7=(version2,options)=>{let v=parse2(version2,options);return v?v.version:null};module.exports=valid7}});var require_clean=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports,module){"use strict";var parse2=require_parse(),clean=(version2,options)=>{let s=parse2(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module.exports=clean}});var require_inc=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/inc.js"(exports,module){"use strict";var SemVer=require_semver(),inc=(version2,release,options,identifier2,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier2,identifier2=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier2,identifierBase).version}catch{return null}};module.exports=inc}});var require_diff=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/diff.js"(exports,module){"use strict";var parse2=require_parse(),diff=(version1,version2)=>{let v1=parse2(version1,null,!0),v2=parse2(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return"major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module.exports=diff}});var require_major=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/major.js"(exports,module){"use strict";var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module.exports=major}});var require_minor=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/minor.js"(exports,module){"use strict";var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module.exports=minor}});var require_patch=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/patch.js"(exports,module){"use strict";var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module.exports=patch}});var require_prerelease=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/prerelease.js"(exports,module){"use strict";var parse2=require_parse(),prerelease=(version2,options)=>{let parsed=parse2(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module.exports=prerelease}});var require_compare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports,module){"use strict";var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module.exports=compare}});var require_rcompare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rcompare.js"(exports,module){"use strict";var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module.exports=rcompare}});var require_compare_loose=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-loose.js"(exports,module){"use strict";var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module.exports=compareLoose}});var require_compare_build=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-build.js"(exports,module){"use strict";var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module.exports=compareBuild}});var require_sort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/sort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module.exports=sort}});var require_rsort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rsort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module.exports=rsort}});var require_gt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports,module){"use strict";var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module.exports=gt}});var require_lt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports,module){"use strict";var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module.exports=lt}});var require_eq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports,module){"use strict";var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module.exports=eq}});var require_neq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports,module){"use strict";var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module.exports=neq}});var require_gte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports,module){"use strict";var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module.exports=gte}});var require_lte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports,module){"use strict";var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module.exports=lte}});var require_cmp=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports,module){"use strict";var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module.exports=cmp}});var require_coerce=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/coerce.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else{let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse2(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module.exports=coerce}});var require_truncate=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/truncate.js"(exports,module){"use strict";var parse2=require_parse(),constants7=require_constants(),SemVer=require_semver(),truncate=(version2,truncation,options)=>{if(!constants7.RELEASE_TYPES.includes(truncation))return null;let clonedVersion=cloneInputVersion(version2,options);return clonedVersion&&doTruncation(clonedVersion,truncation)},cloneInputVersion=(version2,options)=>{let versionStringToParse=version2 instanceof SemVer?version2.version:version2;return parse2(versionStringToParse,options)},doTruncation=(version2,truncation)=>{if(isPrerelease(truncation))return version2.version;switch(version2.prerelease=[],truncation){case"major":version2.minor=0,version2.patch=0;break;case"minor":version2.patch=0;break}return version2.format()},isPrerelease=type=>type.startsWith("pre");module.exports=truncate}});var require_lrucache=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports,module){"use strict";var LRUCache=class{constructor(){this.max=1e3,this.map=new Map}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey)}this.map.set(key,value)}return this}};module.exports=LRUCache}});var require_range=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports,module){"use strict";var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range2,options){if(options=parseOptions(options),range2 instanceof _Range)return range2.loose===!!options.loose&&range2.includePrerelease===!!options.includePrerelease?range2:new _Range(range2.raw,options);if(range2 instanceof Comparator)return this.raw=range2.value,this.set=[[range2]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range2.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range2){range2=range2.replace(BUILDSTRIPRE,"");let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range2,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range2=range2.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range2),range2=range2.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range2),range2=range2.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range2),range2=range2.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range2);let rangeList=range2.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return[comp];rangeMap.set(comp.value,comp)}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range2,options){if(!(range2 instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range2.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return!1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return!0;return!1}};module.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,src,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),BUILDSTRIPRE=new RegExp(src[t.BUILD],"g"),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(comp=comp.replace(re[t.BUILD],""),debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id3=>!id3||id3.toLowerCase()==="x"||id3==="*",invalidXRangeOrder=(M,m,p)=>isX(M)&&!isX(m)||isX(m)&&p&&!isX(p),replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{if(debug("xRange",comp,ret,gtlt,M,m,p,pr),invalidXRangeOrder(M,m,p))return comp;let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return!1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return!0}return!1}return!0}}});var require_comparator=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports,module){"use strict";var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this)}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return!0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range()}});var require_satisfies=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports,module){"use strict";var Range=require_range(),satisfies9=(version2,range2,options)=>{try{range2=new Range(range2,options)}catch{return!1}return range2.test(version2)};module.exports=satisfies9}});var require_to_comparators=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/to-comparators.js"(exports,module){"use strict";var Range=require_range(),toComparators=(range2,options)=>new Range(range2,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module.exports=toComparators}});var require_max_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/max-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range2,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options))}),max};module.exports=maxSatisfying}});var require_min_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range2,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options))}),min};module.exports=minSatisfying}});var require_min_version=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range2,loose)=>{range2=new Range(range2,loose);let minver=new SemVer("0.0.0");if(range2.test(minver)||(minver=new SemVer("0.0.0-0"),range2.test(minver)))return minver;minver=null;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin)}return minver&&range2.test(minver)?minver:null};module.exports=minVersion}});var require_valid2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports,module){"use strict";var Range=require_range(),validRange5=(range2,options)=>{try{return new Range(range2,options).range||"*"}catch{return null}};module.exports=validRange5}});var require_outside=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/outside.js"(exports,module){"use strict";var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies9=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range2,hilo,options)=>{version2=new SemVer(version2,options),range2=new Range(range2,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies9(version2,range2,options))return!1;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator)}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&<efn(version2,low.semver))return!1;if(low.operator===ecomp&<fn(version2,low.semver))return!1}return!0};module.exports=outside}});var require_gtr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/gtr.js"(exports,module){"use strict";var outside=require_outside(),gtr=(version2,range2,options)=>outside(version2,range2,">",options);module.exports=gtr}});var require_ltr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/ltr.js"(exports,module){"use strict";var outside=require_outside(),ltr=(version2,range2,options)=>outside(version2,range2,"<",options);module.exports=ltr}});var require_intersects=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/intersects.js"(exports,module){"use strict";var Range=require_range(),intersects2=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module.exports=intersects2}});var require_simplify=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/simplify.js"(exports,module){"use strict";var satisfies9=require_satisfies(),compare=require_compare();module.exports=(versions,range2,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies9(version2,range2,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range2.raw=="string"?range2.raw:String(range2);return simplified.length<original.length?simplified:range2}}});var require_subset=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/subset.js"(exports,module){"use strict";var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies9=require_satisfies(),compare=require_compare(),subset2=(sub,dom,options={})=>{if(sub===dom)return!0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return!1}return!0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return!0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return!0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return!0;dom=minimumVersion}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&<){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies9(eq,String(gt),options)||lt&&!satisfies9(eq,String(lt),options))return null;for(let c of dom)if(!satisfies9(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return!1}else if(gt.operator===">="&&!c.test(gt.semver))return!1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return!1}else if(lt.operator==="<="&&!c.test(lt.semver))return!1}if(!c.operator&&(lt||gt)&>ltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module.exports=subset2}});var require_semver2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports,module){"use strict";var internalRe=require_re(),constants7=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse2=require_parse(),valid7=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),truncate=require_truncate(),Comparator=require_comparator(),Range=require_range(),satisfies9=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange5=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects2=require_intersects(),simplifyRange=require_simplify(),subset2=require_subset();module.exports={parse:parse2,valid:valid7,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,truncate,Comparator,Range,satisfies:satisfies9,toComparators,maxSatisfying,minSatisfying,minVersion,validRange:validRange5,outside,gtr,ltr,intersects:intersects2,simplifyRange,subset:subset2,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants7.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants7.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});function record(value,allowed){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("Invalid installation configuration");return value}function httpsUrl(value){if(typeof value!="string"||value.length>4096)throw new Error("Invalid installation URL");let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||url.hash)throw new Error("Invalid installation URL");return url}function parseInstallationConfig(value,publicOrigin){let input2=record(value,["schemaVersion","guide","presets"]);if(input2.schemaVersion!==1)throw new Error("Invalid installation schema");let result={schemaVersion:1};if(input2.guide!==void 0){let guide=record(input2.guide,["url","registry"]),url=httpsUrl(guide.url),registry2=httpsUrl(guide.registry);if(url.origin===publicOrigin||registry2.origin===publicOrigin||registry2.search||!registry2.pathname.endsWith("/"))throw new Error("Invalid registry URL");result.guide={url:url.href,registry:registry2.href}}if(input2.presets!==void 0){if(!result.guide||!input2.presets||typeof input2.presets!="object"||Array.isArray(input2.presets))throw new Error("A preset catalog requires its guide");let entries=Object.entries(input2.presets);if(entries.length>32)throw new Error("Installation catalog exceeds 32 presets");result.presets=Object.fromEntries(entries.map(([id3,value2])=>{if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3))throw new Error("Invalid installation preset ID");let entry=record(value2,["label","source","origins"]);if(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120||/[\u0000-\u001f\u007f]/.test(entry.label))throw new Error("Invalid preset label");let source=httpsUrl(entry.source).href;if(!Array.isArray(entry.origins)||entry.origins.length>64)throw new Error("Expected preset permission origins");let origins=[...new Set([`${new URL(source).origin}/*`,...entry.origins.map(validateInstallationOrigin)])];if(origins.length>64)throw new Error("Installation permission origins exceed 64 scopes");return[id3,{label:entry.label,source,origins}]}))}return result}function validateInstallationOrigin(value){if(typeof value!="string"||value.length>4096||!/^(https?|\*):\/\//.test(value)||!value.endsWith("/*"))throw new Error("Invalid installation permission origin");let scheme=value.slice(0,value.indexOf(":")),wildcard=/^(?:https?|\*):\/\/\*\./.test(value),normalized=value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"),url=new URL(normalized);if(url.username||url.password||url.hash||url.hostname.includes("*")||url.pathname!=="/*"||url.search||!url.hostname||wildcard&&!url.hostname.includes("."))throw new Error("Invalid installation permission origin");return`${scheme}://${wildcard?"*.":""}${url.host}/*`}function matchesInstallationOrigin(scope,target){let value=validateInstallationOrigin(scope),scheme=value.slice(0,value.indexOf(":"));if(scheme==="*"?!["http:","https:"].includes(target.protocol):`${scheme}:`!==target.protocol)return!1;let wildcard=/^(?:https?|\*):\/\/\*\./.test(value),origin=new URL(value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"));return(!origin.port||origin.port===target.port)&&(target.hostname===origin.hostname||wildcard&&target.hostname.endsWith(`.${origin.hostname}`))}async function readInstallationJson(response,maxBytes){if(!Number.isSafeInteger(maxBytes)||maxBytes<1||maxBytes>INSTALLATION_CONFIG_MAX_BYTES)throw new Error("Invalid installation response size limit");let reader=response.body?.getReader();if(!reader)throw new Error("Missing installation response");let chunks=[],length=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(length+=value.byteLength,length>maxBytes)throw new Error("Installation response is too large");chunks.push(value)}}finally{await reader.cancel().catch(()=>{}),reader.releaseLock()}let bytes=new Uint8Array(length),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.length;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}async function loadInstallationConfig(url,publicOrigin,signal){let response=await fetch(url,{cache:"no-store",credentials:"omit",redirect:"error",signal});if(!response.ok||!response.headers.get("content-type")?.includes("application/json"))throw new Error("Installation configuration unavailable");return parseInstallationConfig(await readInstallationJson(response,INSTALLATION_CONFIG_MAX_BYTES),publicOrigin)}function trustedInstallationPreset(config,id3,source){return id3&&source&&Object.hasOwn(config.presets??{},id3)&&config.presets[id3].source===source?config.presets[id3]:void 0}function installationOriginCovered(origin,scopes){let target=validateInstallationOrigin(origin),wildcard=/^(?:https?|\*):\/\/\*\./.test(target),schemes=target.startsWith("*:")?["http:","https:"]:[target.slice(0,target.indexOf(":")+1)];return scopes.some(scope=>{let candidate=validateInstallationOrigin(scope);if(wildcard&&!/^(?:https?|\*):\/\/\*\./.test(candidate))return!1;let base=target.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1");return schemes.every(scheme=>{let url=new URL(base);return url.protocol=scheme,matchesInstallationOrigin(candidate,url)})})}var INSTALLATION_CONFIG_MAX_BYTES,PRESET_UPDATE_INTERVAL_MS,PRESET_UPDATE_RETRY_MS,init_installation=__esm({"../preset/dist/installation.js"(){"use strict";INSTALLATION_CONFIG_MAX_BYTES=65536;PRESET_UPDATE_INTERVAL_MS=720*6e4,PRESET_UPDATE_RETRY_MS=60*6e4}});function invalid(path29,reason){throw new PresetError("PRESET_INVALID",`${path29}: ${reason}`)}function isJsonObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&(Object.getPrototypeOf(value)===Object.prototype||Object.getPrototypeOf(value)===null)}function object(value,path29){isJsonObject(value)||invalid(path29,"expected a plain object");for(let key of Object.keys(value))unsafeKeys.has(key)&&invalid(path29,`unsafe key ${key}`)}function fields(value,path29,names){object(value,path29);for(let key of Object.keys(value))names.includes(key)||invalid(`${path29}.${key}`,"unknown field")}function text(value,path29){(typeof value!="string"||!value.trim()||value!==value.trim())&&invalid(path29,"expected a non-empty trimmed string")}function id(value,path29){(typeof value!="string"||!componentId.test(value))&&invalid(path29,"invalid ID")}function range(value,path29){text(value,path29),(0,import_semver.validRange)(value)===null&&invalid(path29,"invalid version range")}function stringArray(value,path29){Array.isArray(value)||invalid(path29,"expected an array");for(let[index,item]of value.entries())text(item,`${path29}[${index}]`);new Set(value).size!==value.length&&invalid(path29,"duplicate values")}function json(value,path29,depth=0){return depth>32&&invalid(path29,"JSON nesting exceeds 32 levels"),value===null||typeof value=="string"||typeof value=="boolean"||typeof value=="number"&&Number.isFinite(value)?value:Array.isArray(value)?Array.from(value,(item,index)=>json(item,`${path29}[${index}]`,depth+1)):(object(value,path29),Object.fromEntries(Object.entries(value).map(([key,item])=>[key,json(item,`${path29}.${key}`,depth+1)])))}function clonePresetDefaults(value){return object(value,"defaults"),json(value,"defaults")}function component(value,path29,kind){if(fields(value,path29,["source","version","enabled","targets","dependsOn","migrateFrom"]),"source"in value&&text(value.source,`${path29}.source`),"version"in value&&range(value.version,`${path29}.version`),"migrateFrom"in value&&(kind!=="skills"&&invalid(`${path29}.migrateFrom`,"only Skills support source migration"),stringArray(value.migrateFrom,`${path29}.migrateFrom`),value.migrateFrom.length>16&&invalid(`${path29}.migrateFrom`,"exceeds 16 sources")),"enabled"in value&&typeof value.enabled!="boolean"&&invalid(`${path29}.enabled`,"expected a boolean"),"targets"in value&&(stringArray(value.targets,`${path29}.targets`),(value.targets.length===0||value.targets.some(item=>item!=="browser"&&item!=="node"))&&invalid(`${path29}.targets`,"expected browser and/or node")),"dependsOn"in value){stringArray(value.dependsOn,`${path29}.dependsOn`);for(let item of value.dependsOn)id(item,`${path29}.dependsOn`)}return json(value,path29)}function validatePreset(value){fields(value,"preset",["schemaVersion","id","version","extends","requires","packages","skills","providers","appProfiles","defaults","permissions"]),value.schemaVersion!==1&&invalid("schemaVersion","only version 1 is supported"),id(value.id,"id"),text(value.version,"version"),(0,import_semver.valid)(value.version)!==value.version&&invalid("version","expected an exact semantic version");let result={schemaVersion:1,id:value.id,version:value.version};"extends"in value&&(fields(value.extends,"extends",["source","version"]),text(value.extends.source,"extends.source"),"version"in value.extends&&range(value.extends.version,"extends.version"),result.extends={source:value.extends.source,...value.extends.version===void 0?{}:{version:value.extends.version}}),"requires"in value&&(fields(value.requires,"requires",["mearlApi"]),"mearlApi"in value.requires&&range(value.requires.mearlApi,"requires.mearlApi"),result.requires={...value.requires.mearlApi===void 0?{}:{mearlApi:value.requires.mearlApi}});for(let kind of["packages","skills","providers"]){if(!(kind in value))continue;let declarations=value[kind];object(declarations,kind),result[kind]=Object.fromEntries(Object.entries(declarations).map(([key,item])=>(id(key,`${kind}.${key}`),[key,component(item,`${kind}.${key}`,kind)])))}if("appProfiles"in value&&(object(value.appProfiles,"appProfiles"),result.appProfiles=Object.fromEntries(Object.entries(value.appProfiles).map(([key,target])=>(id(key,`appProfiles.${key}`),text(target,`appProfiles.${key}`),[key,target])))),"defaults"in value&&(result.defaults=clonePresetDefaults(value.defaults)),"permissions"in value){fields(value.permissions,"permissions",["origins"]),"origins"in value.permissions&&stringArray(value.permissions.origins,"permissions.origins");let origins=value.permissions.origins??[];origins.length>64&&invalid("permissions.origins","exceeds 64 scopes"),result.permissions={origins:[...new Set(origins.map((origin,index)=>{try{return validateInstallationOrigin(origin)}catch{return invalid(`permissions.origins[${index}]`,"expected an explicit HTTP host scope")}}))]}}return JSON.stringify(result).length>262144&&invalid("preset","manifest exceeds 256 Ki UTF-16 code units"),result}var import_semver,PresetError,unsafeKeys,componentId,init_manifest=__esm({"../preset/dist/manifest.js"(){"use strict";init_installation();import_semver=__toESM(require_semver2(),1),PresetError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="PresetError"}},unsafeKeys=new Set(["__proto__","constructor","prototype"]),componentId=/^[a-z][a-z0-9-]{0,79}$/}});function invalid2(message){throw new BundleError("BUNDLE_INVALID",message)}function fields2(value,names){(!isJsonObject(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid2("Invalid request UI structure")}function validateBrowserUiText(value){fields2(value,["en","zh_CN"]),(typeof value.en!="string"||!value.en.trim()||Object.values(value).some(entry=>typeof entry!="string"||entry.length>1024||!entry.trim()))&&invalid2("Request UI text requires bounded translations")}var init_requestUi=__esm({"../preset/dist/requestUi.js"(){"use strict";init_bundle();init_manifest()}});function parseNetworkRoutePlan(input2){if(!input2||typeof input2!="object"||Array.isArray(input2)||Object.keys(input2).join(",")!=="routes")throw new Error("Invalid network route plan");let routes=input2.routes;if(!Array.isArray(routes)||routes.length>32)throw new Error("Invalid network routes");let sources=new Set,ids=new Set,hostname=value=>typeof value=="string"&&value.length<=253&&value.includes(".")&&value.split(".").every(label=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label));for(let route of routes){if(!route||typeof route!="object"||Array.isArray(route)||Object.keys(route).some(key=>!["id","fromHost","toHost"].includes(key))||route.id!==void 0&&(typeof route.id!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,79}$/.test(route.id))||!hostname(route.fromHost)||!hostname(route.toHost)||route.fromHost===route.toHost||sources.has(route.fromHost)||route.id!==void 0&&ids.has(route.id))throw new Error("Invalid or ambiguous network route");sources.add(route.fromHost),route.id&&ids.add(route.id)}if(routes.reduce((size,route)=>size+route.toHost.length,0)>1024)throw new Error("Network route plan is too large");let plan={routes:routes.map(({id:id3,fromHost,toHost})=>({...id3?{id:id3}:{},fromHost,toHost}))};if(JSON.stringify(plan).length>12288)throw new Error("Network route header is too large");return plan}var init_networkRoutes=__esm({"../preset/dist/networkRoutes.js"(){"use strict"}});function fields3(value,names){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))throw new BundleError("BUNDLE_INVALID","Invalid browser control")}function validateBrowserControl(input2){if(fields3(input2,["schemaVersion","id","kind","label","description","defaultValue","aliases","messages","options"]),input2.schemaVersion!==1||input2.kind!=="segmented"||typeof input2.id!="string"||!id2.test(input2.id)||typeof input2.defaultValue!="string"||!id2.test(input2.defaultValue))throw new BundleError("BUNDLE_INVALID","Invalid segmented control");if(validateBrowserUiText(input2.label),validateBrowserUiText(input2.description),fields3(input2.messages,["changed","failed"]),validateBrowserUiText(input2.messages.changed),validateBrowserUiText(input2.messages.failed),input2.aliases!==void 0&&(!Array.isArray(input2.aliases)||input2.aliases.length>8||new Set(input2.aliases).size!==input2.aliases.length||input2.aliases.some(alias=>typeof alias!="string"||!id2.test(alias))))throw new BundleError("BUNDLE_INVALID","Invalid browser control aliases");if(!Array.isArray(input2.options)||input2.options.length<2||input2.options.length>8)throw new BundleError("BUNDLE_INVALID","Invalid browser control options");let values=new Set,options=input2.options.map(option=>{if(fields3(option,["value","label","networkRoutes"]),typeof option.value!="string"||!id2.test(option.value)||values.has(option.value))throw new BundleError("BUNDLE_INVALID","Invalid browser control option");values.add(option.value),validateBrowserUiText(option.label);try{return{value:option.value,label:structuredClone(option.label),networkRoutes:parseNetworkRoutePlan(option.networkRoutes)}}catch{throw new BundleError("BUNDLE_INVALID","Invalid control network route plan")}});if(!values.has(input2.defaultValue)||options.find(option=>option.value===input2.defaultValue).networkRoutes.routes.length)throw new BundleError("BUNDLE_INVALID","The default option must clear network routes");if(new TextEncoder().encode(JSON.stringify(input2)).byteLength>65536)throw new BundleError("BUNDLE_QUOTA","Browser control exceeds 64 KiB");return{schemaVersion:1,id:input2.id,kind:"segmented",label:structuredClone(input2.label),description:structuredClone(input2.description),defaultValue:input2.defaultValue,messages:structuredClone(input2.messages),options,...input2.aliases?{aliases:[...input2.aliases]}:{}}}function selectBrowserControl(bundles){let selected;for(let bundle of bundles){let resource=bundle.manifest.contributions?.browserControls;if(resource){if(selected)throw new BundleError("BUNDLE_CONFLICT","Browser network control has multiple providers");selected={bundleId:bundle.manifest.id,revision:bundle.revision,definition:validateBrowserControl(readBundleJson(bundle,resource))}}}return selected}var id2,init_browserControls=__esm({"../preset/dist/browserControls.js"(){"use strict";init_bundle();init_requestUi();init_networkRoutes();id2=/^[a-z][a-zA-Z0-9_.-]{0,79}$/}});function invalid3(message){throw new BundleError("BUNDLE_INVALID",message)}function fields4(value,names){(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid3("Unexpected manifest structure")}function path(value){(!/^[a-zA-Z0-9_][a-zA-Z0-9_./-]{0,255}$/.test(value)||value.split("/").some(segment=>!segment||segment==="."||segment===".."))&&invalid3("Resource paths must stay inside the bundle directory")}function bundleSourceUrl(source){try{let url=new URL(source);return(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)&&invalid3("Invalid bundle source"),url.hash="",url.href}catch{invalid3("Expected an absolute HTTP(S)/file bundle source without credentials")}}function validateBundleManifest(value,mearlApiVersion){let json3;try{json3=clonePresetDefaults(value)}catch{invalid3("Expected a JSON manifest")}if(fields4(json3,["schemaVersion","id","version","requires","defaults","resources","contributions"]),json3.defaults!==void 0&&(json3.defaults=clonePresetDefaults(json3.defaults)),(json3.schemaVersion!==1||typeof json3.id!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(json3.id))&&invalid3("Invalid bundle identity"),(typeof json3.version!="string"||(0,import_semver2.valid)(json3.version)!==json3.version)&&invalid3("Expected an exact bundle version"),(0,import_semver2.valid)(mearlApiVersion)!==mearlApiVersion&&invalid3("Expected an exact host API version"),json3.requires!==void 0){fields4(json3.requires,["mearlApi"]);let requirement=json3.requires.mearlApi;if((typeof requirement!="string"||!requirement.trim()||(0,import_semver2.validRange)(requirement)===null)&&invalid3("Invalid host API requirement"),!(0,import_semver2.satisfies)(mearlApiVersion,requirement))throw new BundleError("BUNDLE_INCOMPATIBLE",`Requires host API ${requirement}`)}(!json3.resources||typeof json3.resources!="object"||Array.isArray(json3.resources))&&invalid3("Expected a resource map");let resources=Object.entries(json3.resources);(!resources.length||resources.length>64)&&invalid3("A bundle requires 1–64 resources");let total=0;for(let[name,resource]of resources)if(path(name),fields4(resource,["sha256","byteLength"]),(typeof resource.sha256!="string"||!/^[a-f0-9]{64}$/.test(resource.sha256)||typeof resource.byteLength!="number"||!Number.isSafeInteger(resource.byteLength)||resource.byteLength<0)&&invalid3("Invalid resource metadata"),total+=resource.byteLength,total>MAX_BUNDLE_BYTES)throw new BundleError("BUNDLE_QUOTA","Bundle resources exceed 16 MiB");if(json3.contributions!==void 0){fields4(json3.contributions,["appProfiles","pageRuntimes","nodeRuntimes","browserRuntimes","extension","requestUi","browserViews","browserControls"]);let extension=json3.contributions.extension;if(extension!==void 0&&(typeof extension!="string"||!Object.hasOwn(json3.resources,extension))&&invalid3("Extension contributions must reference a declared resource"),typeof extension=="string"&&json3.resources[extension].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Extension contributions exceed 64 KiB");let controls=json3.contributions.browserControls;if(controls!==void 0&&(typeof controls!="string"||!Object.hasOwn(json3.resources,controls))&&invalid3("Browser controls must reference a declared resource"),typeof controls=="string"&&json3.resources[controls].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser controls exceed 64 KiB");if(json3.contributions.requestUi!==void 0&&(typeof json3.contributions.requestUi!="string"||!Object.hasOwn(json3.resources,json3.contributions.requestUi))&&invalid3("Request UI must reference a declared resource"),typeof json3.contributions.requestUi=="string"&&json3.resources[json3.contributions.requestUi].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Request UI exceeds 64 KiB");if(json3.contributions.browserViews!==void 0){fields4(json3.contributions.browserViews,["requestImport","requestCases","captureLauncher","captureController"]);for(let resource of Object.values(json3.contributions.browserViews))if((typeof resource!="string"||!Object.hasOwn(json3.resources,resource))&&invalid3("Browser views must reference declared resources"),json3.resources[resource].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser view definition exceeds 64 KiB")}let profiles=json3.contributions.appProfiles===void 0?[]:json3.contributions.appProfiles;(!Array.isArray(profiles)||profiles.some(name=>typeof name!="string"||!Object.hasOwn(json3.resources,name))||new Set(profiles).size!==profiles.length)&&invalid3("App profiles must reference distinct declared resources");let runtimes=json3.contributions.pageRuntimes;if(runtimes!==void 0){(!runtimes||typeof runtimes!="object"||Array.isArray(runtimes)||Object.entries(runtimes).some(([id3,name])=>!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof name!="string"||!Object.hasOwn(json3.resources,name)))&&invalid3("Page runtimes must reference declared resources");for(let name of Object.values(runtimes))if(json3.resources[name].byteLength>MAX_PAGE_RUNTIME_BYTES)throw new BundleError("BUNDLE_QUOTA","Page runtime exceeds 2 MiB")}for(let kind of["nodeRuntimes","browserRuntimes"]){let runtimes2=json3.contributions[kind],label=kind==="nodeRuntimes"?"Node":"Browser";if(runtimes2!==void 0){(!runtimes2||typeof runtimes2!="object"||Array.isArray(runtimes2)||Object.keys(runtimes2).length>16)&&invalid3(`Invalid ${label} runtime declarations`);for(let[host,declaration]of Object.entries(runtimes2))/^[a-z][a-z0-9-]{0,79}$/.test(host)||invalid3(`Invalid ${label} runtime host`),fields4(declaration,["entry","bindings"]),(typeof declaration.entry!="string"||!Object.hasOwn(json3.resources,declaration.entry)||!declaration.entry.endsWith(".cjs"))&&invalid3(`${label} runtime entry must reference a declared CommonJS resource`),(!declaration.bindings||typeof declaration.bindings!="object"||Array.isArray(declaration.bindings)||Object.keys(declaration.bindings).length>256||Object.entries(declaration.bindings).some(([hook,handler])=>!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(hook)||typeof handler!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(handler)))&&invalid3(`Invalid ${label} runtime bindings`)}}}if(new TextEncoder().encode(JSON.stringify(json3)).byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");return json3}async function bundleDigest(bytes){let digest4=await crypto.subtle.digest("SHA-256",Uint8Array.from(bytes).buffer);return Array.from(new Uint8Array(digest4),byte=>byte.toString(16).padStart(2,"0")).join("")}async function manifestRevision(source,manifest){return bundleDigest(new TextEncoder().encode(JSON.stringify({source,manifest})))}function readBundleJson(bundle,name){Object.hasOwn(bundle.resources,name)||invalid3("Bundle resource is unavailable");try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bundle.resources[name]))}catch{invalid3("Expected a UTF-8 JSON resource")}}async function prepareBundle(source,options){options.signal?.throwIfAborted(),source=bundleSourceUrl(source),options.version!==void 0&&(!options.version.trim()||(0,import_semver2.validRange)(options.version)===null)&&invalid3("Invalid requested bundle version");let bytes=Uint8Array.from(await options.load(source,{maxBytes:MAX_BUNDLE_MANIFEST_BYTES,signal:options.signal}));if(options.signal?.throwIfAborted(),bytes.byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");let value;try{value=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}catch{invalid3("Expected a UTF-8 JSON manifest")}let manifest=validateBundleManifest(value,options.mearlApiVersion);if(options.expectedId!==void 0&&manifest.id!==options.expectedId&&invalid3("Bundle identity does not match the requested package"),options.version&&!(0,import_semver2.satisfies)(manifest.version,options.version))throw new BundleError("BUNDLE_INCOMPATIBLE","Bundle version does not satisfy the requested range");let resources={};for(let[name,expected]of Object.entries(manifest.resources)){options.signal?.throwIfAborted();let resource=Uint8Array.from(await options.load(new URL(name,source).href,{maxBytes:expected.byteLength,signal:options.signal}));if(options.signal?.throwIfAborted(),resource.byteLength!==expected.byteLength||await bundleDigest(resource)!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Resource integrity check failed: ${name}`);resources[name]=resource}options.signal?.throwIfAborted();let prepared={source,manifest,revision:await manifestRevision(source,manifest),resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}async function verifyBundle(bundle,mearlApiVersion){let source=bundleSourceUrl(bundle.source),manifest=validateBundleManifest(bundle.manifest,mearlApiVersion),revision3=bundle.revision;(!bundle.resources||typeof bundle.resources!="object"||Object.keys(bundle.resources).length!==Object.keys(manifest.resources).length)&&invalid3("Stored resource set does not match the manifest");let resources={};for(let[name,expected]of Object.entries(manifest.resources)){let original=bundle.resources[name];if(!(original instanceof Uint8Array))throw new BundleError("BUNDLE_INTEGRITY","Stored resource is not a byte buffer");let bytes=Uint8Array.from(original);if(bytes.byteLength!==expected.byteLength)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);resources[name]=bytes}if(await manifestRevision(source,manifest)!==revision3)throw new BundleError("BUNDLE_INTEGRITY","Stored manifest revision does not match");for(let[name,expected]of Object.entries(manifest.resources))if(await bundleDigest(resources[name])!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);let prepared={source,manifest,revision:revision3,resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}var import_semver2,MAX_BUNDLE_BYTES,MAX_BUNDLE_MANIFEST_BYTES,MAX_BROWSER_STORAGE_BYTES,MAX_PAGE_RUNTIME_BYTES,MAX_REQUEST_UI_BYTES,BundleError,init_bundle=__esm({"../preset/dist/bundle.js"(){"use strict";import_semver2=__toESM(require_semver2(),1);init_manifest();init_browserControls();MAX_BUNDLE_BYTES=16*1024*1024,MAX_BUNDLE_MANIFEST_BYTES=64*1024,MAX_BROWSER_STORAGE_BYTES=64*1024*1024,MAX_PAGE_RUNTIME_BYTES=2*1024*1024,MAX_REQUEST_UI_BYTES=64*1024,BundleError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="BundleError"}}}});var init_extensionContributions=__esm({"../preset/dist/extensionContributions.js"(){"use strict";init_bundle();init_manifest();init_requestUi()}});function createBundleFetchLoader(options={}){return async(source,{maxBytes,signal})=>{let response=await(options.fetch??fetch)(source,{credentials:options.credentials??"omit",redirect:"error",cache:"no-store",signal});if(!response.ok||response.redirected)throw new BundleError("BUNDLE_INVALID","Bundle download failed or redirected");if(!response.body)return new Uint8Array;let reader=response.body.getReader(),chunks=[],total=0;try{for(;;){signal?.throwIfAborted();let{done,value}=await reader.read();if(done)break;if(total+=value.byteLength,total>maxBytes)throw new BundleError("BUNDLE_QUOTA","Download exceeds its declared size limit");chunks.push(value.slice())}}catch(error){throw await reader.cancel().catch(()=>{}),error}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}}var init_bundleFetch=__esm({"../preset/dist/bundleFetch.js"(){"use strict";init_bundle()}});var init_profileSource=__esm({"../preset/dist/profileSource.js"(){"use strict";init_bundle();init_bundleFetch()}});function parseToolboxCatalogs(input2){if(input2===void 0)return{};function invalid6(){throw new PresetError("PRESET_INVALID","Invalid extension.toolCatalogs configuration")}return(!isJsonObject(input2)||Object.keys(input2).length>16)&&invalid6(),Object.fromEntries(Object.entries(input2).map(([id3,entry])=>{(!/^[a-z][a-z0-9-]{0,63}$/.test(id3)||id3==="official"||!isJsonObject(entry)||Object.keys(entry).some(key=>!["url","label","enabled"].includes(key)))&&invalid6(),entry.enabled!==void 0&&typeof entry.enabled!="boolean"&&invalid6(),entry.label!==void 0&&(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120)&&invalid6();let url;if(entry.url!==void 0){(typeof entry.url!="string"||entry.url.length>2048)&&invalid6();try{let parsed=new URL(entry.url);(parsed.username||parsed.password||parsed.hash||!(parsed.protocol==="https:"||parsed.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(parsed.hostname)))&&invalid6(),url=parsed.href}catch{invalid6()}}else entry.enabled!==!1&&invalid6();return[id3,{...url?{url}:{},...entry.label!==void 0?{label:entry.label}:{},...entry.enabled!==void 0?{enabled:entry.enabled}:{}}]}))}var init_toolboxCatalogs=__esm({"../preset/dist/toolboxCatalogs.js"(){"use strict";init_manifest()}});function parseSetupManagement(value){if(value===void 0)return;let invalid6=()=>{throw new PresetError("PRESET_INVALID","Invalid defaults.management.setup declaration")};if(!isJsonObject(value)||Object.keys(value).some(key=>key!=="setup")||!isJsonObject(value.setup))return invalid6();let setup=value.setup;if(Object.keys(setup).some(key=>!["package","version","registry","runtime"].includes(key))||typeof setup.package!="string"||setup.package.length>214||!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(setup.package)||typeof setup.version!="string"||setup.version.length>64||!((0,import_semver3.valid)(setup.version)===setup.version||/^[a-z][a-z0-9.-]*$/.test(setup.version)))return invalid6();if(setup.registry!==void 0){if(typeof setup.registry!="string"||setup.registry.length>2048||!/^https:\/\/[a-zA-Z0-9./:_-]+$/.test(setup.registry))return invalid6();try{let url=new URL(setup.registry);if(!url.hostname||url.username||url.password||url.search||url.hash)return invalid6()}catch{return invalid6()}}return setup.runtime!==void 0&&(typeof setup.runtime!="string"||setup.runtime.length>128||!(0,import_semver3.validRange)(setup.runtime))?invalid6():{...setup}}function setupManagementCommand(setup){return`npx${setup.registry?` --registry=${setup.registry}`:""} ${setup.package}@${setup.version}`}function setupRuntimeCompatible(setup,version2,targetLine){return!setup.runtime||(0,import_semver3.satisfies)(version2,setup.runtime,{includePrerelease:!0})&&(!targetLine||(0,import_semver3.subset)(targetLine,setup.runtime,{includePrerelease:!0}))}var import_semver3,init_management=__esm({"../preset/dist/management.js"(){"use strict";import_semver3=__toESM(require_semver2(),1);init_manifest()}});function mergePresetDefaults(base,overrides2){let result=clonePresetDefaults(base);for(let[key,value]of Object.entries(clonePresetDefaults(overrides2)))result[key]=isJsonObject(value)&&isJsonObject(result[key])?mergePresetDefaults(result[key],value):value;return result}function sourceUrl(source,parent){try{let url=parent?new URL(source,parent):new URL(source);if(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)throw new Error("unsupported source");return url.hash="",url.href}catch{throw new PresetError("PRESET_INVALID","Expected an absolute HTTP(S)/file source URL without embedded credentials")}}function componentSource(kind,source,parent){if(kind==="packages")return sourceUrl(source,parent);if(source.length>8192||/^[\s-]/.test(source)||/[\0-\x1f\x7f]/.test(source))throw new PresetError("PRESET_INVALID","Invalid component install source");if(/^[a-z][a-z0-9+.-]*:\/\//i.test(source))try{if(new URL(source).password)throw new Error("embedded credentials")}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}if(/^(?:https?:|file:|\.{1,2}\/|\/)/i.test(source))try{let url=new URL(source,parent);if(url.username||url.password)throw new Error("embedded credentials");return url.href}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}return source}function validateDependencies(kind,entries){let active=new Set,done=new Set,visit=id3=>{if(done.has(id3))return;if(active.has(id3))throw new PresetError("PRESET_DEPENDENCY",`${kind}: dependency cycle at ${id3}`);let entry=entries[id3];if(!entry||entry.enabled===!1)throw new PresetError("PRESET_DEPENDENCY",`${kind}: missing or disabled dependency ${id3}`);if(!entry.source)throw new PresetError("PRESET_INVALID",`${kind}.${id3}: enabled component requires a source`);active.add(id3);for(let dependency of entry.dependsOn??[])visit(dependency);active.delete(id3),done.add(id3)};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3)}async function resolvePreset(source,options){if((0,import_semver4.valid)(options.mearlApiVersion)!==options.mearlApiVersion)throw new PresetError("PRESET_INVALID","mearlApiVersion requires an exact semantic version");let active=new Set,load=async url=>{if(options.signal?.throwIfAborted(),active.has(url))throw new PresetError("PRESET_CYCLE",`Inheritance cycle at ${url}`);if(active.size>=32)throw new PresetError("PRESET_INVALID","Inheritance exceeds 32 presets");active.add(url);let manifest=validatePreset(await options.load(url));if(options.signal?.throwIfAborted(),manifest.requires?.mearlApi&&!(0,import_semver4.satisfies)(options.mearlApiVersion,manifest.requires.mearlApi))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires Mearl API ${manifest.requires.mearlApi}`);let parent;if(manifest.extends&&(parent=await load(sourceUrl(manifest.extends.source,url)),manifest.extends.version&&!(0,import_semver4.satisfies)(parent.version,manifest.extends.version)))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires parent ${manifest.extends.version}; received ${parent.version}`);let result2={id:manifest.id,version:manifest.version,chain:[...parent?.chain??[],{source:url,id:manifest.id,version:manifest.version}],packages:{...parent?.packages},skills:{...parent?.skills},providers:{...parent?.providers},appProfiles:{...parent?.appProfiles,...manifest.appProfiles},defaults:mergePresetDefaults(parent?.defaults??{},manifest.defaults??{}),permissions:{origins:[...new Set([...parent?.permissions.origins??[],...manifest.permissions?.origins??[]])]}};for(let kind of kinds)for(let[id3,patch]of Object.entries(manifest[kind]??{}))result2[kind][id3]={...result2[kind][id3],...patch,...patch.source===void 0?{}:{source:componentSource(kind,patch.source,url)},...patch.migrateFrom===void 0?{}:{migrateFrom:patch.migrateFrom.map(source2=>componentSource(kind,source2,url))},declaredBy:url};return active.delete(url),result2},result=await load(sourceUrl(source));parseSetupManagement(result.defaults.management);let extension=result.defaults.extension;isJsonObject(extension)&&parseToolboxCatalogs(extension.toolCatalogs);for(let kind of kinds)validateDependencies(kind,result[kind]);return options.signal?.throwIfAborted(),result}var import_semver4,kinds,init_resolve=__esm({"../preset/dist/resolve.js"(){"use strict";init_toolboxCatalogs();init_management();import_semver4=__toESM(require_semver2(),1);init_manifest();kinds=["packages","skills","providers"]}});async function presetSnapshotRevision(value){return bundleDigest(new TextEncoder().encode(JSON.stringify(value)))}function selectPresetPackages(preset,runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).some(runtime=>runtimes.includes(runtime)));if(entries.length>64)throw new BundleError("BUNDLE_QUOTA","A preset can activate at most 64 packages");return entries}function presetPackages(preset,runtimes){for(let runtime of runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).includes(runtime)),ids=new Set(entries.map(([id3])=>id3));for(let[id3,entry]of entries)if(entry.dependsOn?.some(dependency=>!ids.has(dependency)))throw new BundleError("BUNDLE_INCOMPATIBLE",`${runtime==="browser"?"Browser":"Node"} package ${id3} requires a package unavailable in ${runtime}`);if(runtime==="browser"){for(let target of Object.values(preset.appProfiles))if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(target)||!ids.has(target.split("/")[0]))throw new BundleError("BUNDLE_INVALID","App implementations must belong to an enabled browser package")}}return selectPresetPackages(preset,runtimes)}function bundleTargets(bundle){let contributions=bundle.manifest.contributions,targets=[];return contributions&&(Object.keys(contributions.browserRuntimes??{}).length||Object.keys(contributions.pageRuntimes??{}).length||contributions.appProfiles?.length||contributions.extension||contributions.requestUi||contributions.browserViews||contributions.browserControls)&&targets.push("browser"),Object.keys(contributions?.nodeRuntimes??{}).length&&targets.push("node"),targets.length?targets:["browser","node"]}function applyPackageTargets(preset,targets){let enabled=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1);if(enabled.length!==Object.keys(targets).length)throw new BundleError("BUNDLE_INTEGRITY","Package target selection does not match the preset");let packages={...preset.packages};for(let[id3,entry]of enabled){let selected=targets[id3];if(!Array.isArray(selected)||!selected.length||selected.length>2||new Set(selected).size!==selected.length||selected.some(target=>target!=="browser"&&target!=="node")||entry.targets&&JSON.stringify(entry.targets)!==JSON.stringify(selected))throw new BundleError("BUNDLE_INTEGRITY","Invalid package target selection");packages[id3]={...entry,targets:[...selected]}}return{...preset,packages}}function verifyPackageTargets(preset,bundles){for(let bundle of bundles){let available=bundleTargets(bundle);if(preset.packages[bundle.manifest.id]?.targets?.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target")}}async function preparePresetPackages(source,options,runtimes){source=bundleSourceUrl(source);let remaining=options.maxDownloadBytes??MAX_BROWSER_STORAGE_BYTES;if(!Number.isSafeInteger(remaining)||remaining<=0||remaining>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Invalid preset download budget");let load=async(url,request)=>{if(remaining<=0)throw new BundleError("BUNDLE_QUOTA","Preset downloads exceed the shared budget");let limit=Math.min(request.maxBytes,remaining),bytes=await options.load(url,{...request,maxBytes:limit});if(bytes.byteLength>limit)throw new BundleError("BUNDLE_QUOTA","Preset download exceeds its size limit");return remaining-=bytes.byteLength,bytes},manifests={},preset=await resolvePreset(source,{mearlApiVersion:options.mearlApiVersion,signal:options.signal,load:async url=>{let bytes=Uint8Array.from(await load(url,{maxBytes:262144,signal:options.signal})),manifest;try{manifest=validatePreset(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)))}catch(error){throw new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid preset manifest")}return manifests[url]=manifest,manifest}}),entries=Object.values(preset.packages).every(entry=>entry.enabled===!1||!!entry.targets?.length)?presetPackages(preset,runtimes):selectPresetPackages(preset,runtimes),bundles=[],pending=[],packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets??[]]));for(let[id3,entry]of entries){let manifestSource=bundleSourceUrl(entry.source),bytes=Uint8Array.from(await load(manifestSource,{maxBytes:MAX_BUNDLE_MANIFEST_BYTES,signal:options.signal})),manifest;try{manifest=validateBundleManifest(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)),options.mearlApiVersion)}catch(error){throw error instanceof BundleError?error:new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid package manifest")}if(manifest.id!==id3)throw new BundleError("BUNDLE_INVALID","Package identity does not match the preset");if(entry.version&&!(0,import_semver5.satisfies)(manifest.version,entry.version))throw new BundleError("BUNDLE_INCOMPATIBLE","Package version does not satisfy the preset");let available=bundleTargets({manifest}),targets=entry.targets??available;if(targets.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target");packageTargets[id3]=targets,pending.push({id:id3,entry,source:manifestSource,bytes})}preset=applyPackageTargets(preset,packageTargets);let selected=new Set(presetPackages(preset,runtimes).map(([id3])=>id3));for(let candidate of pending)selected.has(candidate.id)&&bundles.push(await prepareBundle(candidate.source,{...options,load:(url,request)=>url===candidate.source?Promise.resolve(candidate.bytes):load(url,request),expectedId:candidate.id,version:candidate.entry.version}));return verifyPackageTargets(preset,bundles),options.signal?.throwIfAborted(),{source,manifests,preset,bundles:bundles.filter(bundle=>selected.has(bundle.manifest.id)),packageTargets}}async function verifyPresetGraph(value,mearlApiVersion,runtimes,full){let json3=clonePresetDefaults(value),allowed=["source","manifests","bundleRevisions","packageTargets","revision",...full?["schemaVersion"]:[]];if(Object.keys(json3).some(key=>!allowed.includes(key))||full&&json3.schemaVersion!==1||typeof json3.source!="string"||typeof json3.revision!="string"||!/^[a-f0-9]{64}$/.test(json3.revision))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset identity");let source=bundleSourceUrl(json3.source),manifests=clonePresetDefaults(json3.manifests);if(Object.keys(manifests).length>32)throw new BundleError("BUNDLE_QUOTA","Stored preset inheritance exceeds 32 manifests");let bundleRevisions=clonePresetDefaults(json3.bundleRevisions);if(Object.keys(bundleRevisions).length>64||Object.values(bundleRevisions).some(revision3=>typeof revision3!="string"||!/^[a-f0-9]{64}$/.test(revision3)))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored package revisions");let validated={};for(let[url,manifest]of Object.entries(manifests)){if(url!==bundleSourceUrl(url))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset source");validated[url]=validatePreset(manifest)}let packageTargets=clonePresetDefaults(json3.packageTargets),data={...full?{schemaVersion:1}:{},source,manifests:validated,bundleRevisions,packageTargets};if(await presetSnapshotRevision(data)!==json3.revision)throw new BundleError("BUNDLE_INTEGRITY","Stored preset revision does not match");let preset=await resolvePreset(source,{mearlApiVersion,load:async url=>{if(!Object.hasOwn(validated,url))throw new BundleError("BUNDLE_INTEGRITY","Stored parent preset is missing");return validated[url]}});preset=applyPackageTargets(preset,packageTargets);let entries=presetPackages(preset,runtimes);if(preset.chain.length!==Object.keys(validated).length||entries.length!==Object.keys(bundleRevisions).length||entries.some(([id3])=>!Object.hasOwn(bundleRevisions,id3)))throw new BundleError("BUNDLE_INTEGRITY","Stored preset package graph does not match");return{snapshot:{...data,revision:json3.revision},preset}}var import_semver5,init_prepare=__esm({"../preset/dist/prepare.js"(){"use strict";init_bundle();import_semver5=__toESM(require_semver2(),1);init_manifest();init_resolve()}});function presetRequiresBrowser(preset){return Object.values(preset.packages).some(entry=>entry.enabled!==!1&&entry.targets?.includes("browser"))||Object.keys(preset.appProfiles).length>0||Object.keys(preset.defaults).some(key=>key==="simulation"||key==="extension"||key==="services")}async function browserPresetSnapshot(source,manifests,preset,bundles){let ids=new Set(presetPackages(preset,["browser"]).map(([id3])=>id3)),selected=bundles.filter(bundle=>ids.has(bundle.manifest.id));selectBrowserControl(selected);let packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets])),data={source,manifests,bundleRevisions:Object.fromEntries(selected.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets};return{snapshot:{...data,revision:await presetSnapshotRevision(data)},preset,bundles:selected}}async function verifyBrowserPreset(value,mearlApiVersion){return verifyPresetGraph(value,mearlApiVersion,["browser"],!1)}var import_semver6,init_browserPreset=__esm({"../preset/dist/browserPreset.js"(){"use strict";init_browserControls();init_bundle();import_semver6=__toESM(require_semver2(),1);init_prepare()}});var init_bundleStore=__esm({"../preset/dist/bundleStore.js"(){"use strict";init_bundle();init_browserPreset();init_resolve()}});async function preparePreset(source,options){let prepared=await preparePresetPackages(source,options,["browser","node"]),data={schemaVersion:1,source:prepared.source,manifests:prepared.manifests,bundleRevisions:Object.fromEntries(prepared.bundles.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets:prepared.packageTargets},snapshot={...data,revision:await presetSnapshotRevision(data)},browser=await browserPresetSnapshot(prepared.source,prepared.manifests,prepared.preset,prepared.bundles);return options.signal?.throwIfAborted(),{snapshot,preset:prepared.preset,bundles:prepared.bundles,browser}}async function verifyPreset(value,mearlApiVersion){let result=await verifyPresetGraph(value,mearlApiVersion,["browser","node"],!0);return{...result,snapshot:result.snapshot}}async function verifyPreparedPreset(value,mearlApiVersion){if(!Array.isArray(value.bundles)||value.bundles.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package count exceeds 64");let total=0;for(let bundle of value.bundles){if(!bundle?.resources||typeof bundle.resources!="object"||Array.isArray(bundle.resources))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");let resources=Object.values(bundle.resources);if(resources.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package resource count exceeds 64");for(let bytes of resources){if(!(bytes instanceof Uint8Array))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");if(total+=bytes.byteLength,total>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Preset packages exceed the storage budget")}}let[graph,bundles]=await Promise.all([verifyPreset(value.snapshot,mearlApiVersion),Promise.all(value.bundles.map(bundle=>verifyBundle(bundle,mearlApiVersion)))]),{snapshot,preset}=graph;if(verifyPackageTargets(preset,bundles),bundles.length!==Object.keys(snapshot.bundleRevisions).length||new Set(bundles.map(bundle=>bundle.manifest.id)).size!==bundles.length||bundles.some(bundle=>{let entry=preset.packages[bundle.manifest.id];return snapshot.bundleRevisions[bundle.manifest.id]!==bundle.revision||entry?.source!==bundle.source||entry.version&&!(0,import_semver7.satisfies)(bundle.manifest.version,entry.version)}))throw new BundleError("BUNDLE_INTEGRITY","Preset installation requires every exact package");return{snapshot,preset,bundles,browser:await browserPresetSnapshot(snapshot.source,snapshot.manifests,preset,bundles)}}var import_semver7,init_preset=__esm({"../preset/dist/preset.js"(){"use strict";init_browserPreset();init_prepare();import_semver7=__toESM(require_semver2(),1);init_bundle()}});function installPageRuntimeHost(){let root=window;if(root.__mearlPageRuntimeHost__)return root.__mearlPageRuntimeHost__;let installers=new Map,pending=new Map,host={install(config,fallback){let binding=config.pageRuntime;if(!binding){fallback?.(config);return}let installer=installers.get(binding.sha256);if(installer){installer(config);return}let waiting=pending.get(binding.sha256)??[];waiting.push(config),pending.set(binding.sha256,waiting)},register(sha2562,installer){if(typeof installer!="function")throw new Error("A page runtime must export an install function");if(installers.has(sha2562))return;installers.set(sha2562,installer);let waiting=pending.get(sha2562)??[];pending.delete(sha2562);for(let config of waiting)installer(config)}};return Object.defineProperty(root,"__mearlPageRuntimeHost__",{configurable:!0,value:host}),host}function buildPageRuntimeRegistrationSource(binding,source,installerGlobal){if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(binding.id)||!/^[a-f0-9]{64}$/.test(binding.sha256)||!source.trim())throw new Error("Invalid page runtime binding");return`;(() => { const host=(${installPageRuntimeHost.toString()})(); const module={exports:{}};
|
|
3
|
+
var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res,err)=>function(){if(err)throw err[0];try{return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res}catch(e){throw err=[e],e}};var __commonJS=(cb,mod)=>function(){try{return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports}catch(e){throw mod=0,e}};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));import{join}from"node:path";import{homedir}from"node:os";import{createHash}from"node:crypto";function hashKey(key){return createHash("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.json`)}function keyedLogFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.log`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join(homedir(),".mearl")}});import{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat5=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat5.lastIndexOf(")"),fields7=stat5.slice(end+2).trim().split(/\s+/),group=Number(fields7[2]),threads=Number(fields7[17]);if(end<0||!/^[A-Za-z]$/.test(fields7[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields7[19]??""))throw new Error("Invalid Linux process stat");return{state:fields7[0],group,threads,identity:fields7[19]}}function linuxProcessExited({state,threads}){return threads<=1&&(state==="Z"||state==="X"||state==="x")}function processIdentity(pid){if(!(!Number.isSafeInteger(pid)||pid<1))try{if(process.platform==="linux")return linuxProcessStat(pid).identity;let result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CreationDate.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3,windowsHide:!0}):spawnSync("ps",["-p",String(pid),"-o","lstart="],{encoding:"utf8",timeout:2e3});return result.status===0&&result.stdout.trim()||void 0}catch{return}}function isProcessOwnerAlive(owner){if(!isAlive(owner.pid))return!1;if(typeof owner.processIdentity!="string")return!0;let current=processIdentity(owner.pid);return current===void 0||current===owner.processIdentity}function isAlive(pid){if(!Number.isSafeInteger(pid)||!pid||pid<=0)return!1;try{if(process.kill(pid,0),process.platform==="linux")try{return!linuxProcessExited(linuxProcessStat(pid))}catch{return!0}return!0}catch(error){return error.code==="EPERM"}}function isProcessGroupAlive(group){if(!Number.isSafeInteger(group)||group<1)return!1;if(process.platform==="win32")return!0;let probe=()=>{try{return process.kill(-group,0),!0}catch(error){return error.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members=new Set;try{for(let name of readdirSync("/proc"))if(/^\d+$/.test(name))try{let stat5=linuxProcessStat(Number(name));if(stat5.group!==group)continue;if(!linuxProcessExited(stat5))return;members.add(`${name}:${stat5.identity}`)}catch(error){if(!["ENOENT","ESRCH"].includes(error.code??""))return}return members}catch{return}},first=exitedMembers();if(!first)return!0;let second=exitedMembers();return second?first.size&&first.size===second.size&&[...first].every(pid=>second.has(pid))?!1:probe()!==!1:!0}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync as readFileSync2,writeFileSync,renameSync,rmSync,readdirSync as readdirSync2}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file){try{if(!existsSync(file))return null;let parsed=JSON.parse(readFileSync2(file,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file){rmSync(file,{force:!0})}function writeRecordUnlocked(file,record4){let tmp=`${file}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record4),{mode:384}),renameSync(tmp,file)}catch(error){try{rmSync(tmp,{force:!0})}catch{}throw error}}function removeStaleLock(lockDir){let ownerFile=join2(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file,operation){ensureDir(dirname(file));let lockDir=`${file}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error){if(error.code!=="EEXIST")throw error;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file}`,{cause:error});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file}`,{cause:error});pauseForLock();continue}throw error}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file,record4){withRecordLock(file,()=>writeRecordUnlocked(file,record4))}function claimRecord(file,record4){return withRecordLock(file,()=>{let candidate=`${file}.${process.pid}.${randomUUID()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file),!0}catch(error){if(error.code==="EEXIST")return!1;throw error}finally{rmSync(candidate,{force:!0})}})}function readRecord(file){return readRecordUnlocked(file)}function removeRecord(file){try{withRecordLock(file,()=>removeRecordUnlocked(file))}catch{}}function removeRecordIfPid(file,pid){try{return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function writeRecordIfPid(file,pid,record4){return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(writeRecordUnlocked(file,record4),!0))}function removeInvalidRecord(file){try{return withRecordLock(file,()=>!existsSync(file)||readRecordUnlocked(file)?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file of listRecordFiles(dir)){let rec=readRecord(file);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file,rec.pid):removeInvalidRecord(file)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});var require_lrucache=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports,module){"use strict";var LRUCache=class{constructor(){this.max=1e3,this.map=new Map}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey)}this.map.set(key,value)}return this}};module.exports=LRUCache}});var require_parse_options=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports,module){"use strict";var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module.exports=parseOptions}});var require_constants=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports,module){"use strict";var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}});var require_debug=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports,module){"use strict";var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module.exports=debug}});var require_re=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports,module){"use strict";var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports=module.exports={};var re=exports.re=[],safeRe=exports.safeRe=[],src=exports.src=[],safeSrc=exports.safeSrc=[],t=exports.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0)};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}});var require_identifiers=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports,module){"use strict";var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{if(typeof a=="number"&&typeof b=="number")return a===b?0:a<b?-1:1;let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module.exports={compareIdentifiers,rcompareIdentifiers}}});var require_semver=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports,module){"use strict";var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),isPrereleaseIdentifier=(prerelease,identifier2)=>{let identifiers=identifier2.split(".");if(identifiers.length>prerelease.length)return!1;for(let i=0;i<identifiers.length;i++)if(compareIdentifiers(prerelease[i],identifiers[i])!==0)return!1;return!0},SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id3=>{if(/^[0-9]+$/.test(id3)){let num=+id3;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id3}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options)}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.major<other.major?-1:this.major>other.major?1:this.minor<other.minor?-1:this.minor>other.minor?1:this.patch<other.patch?-1:this.patch>other.patch?1:0}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return-1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier2,identifierBase){if(release.startsWith("pre")){if(!identifier2&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier2){let match=`-${identifier2}`.match(this.options.loose?re[t.PRERELEASELOOSE]:re[t.PRERELEASE]);if(!match||match[1]!==identifier2)throw new Error(`invalid identifier: ${identifier2}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier2,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier2,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier2===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base)}}if(identifier2){let prerelease=[identifier2,base];if(identifierBase===!1&&(prerelease=[identifier2]),isPrereleaseIdentifier(this.prerelease,identifier2)){let prereleaseBase=this.prerelease[identifier2.split(".").length];isNaN(prereleaseBase)&&(this.prerelease=prerelease)}else this.prerelease=prerelease}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module.exports=SemVer}});var require_compare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports,module){"use strict";var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module.exports=compare}});var require_eq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports,module){"use strict";var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module.exports=eq}});var require_neq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports,module){"use strict";var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module.exports=neq}});var require_gt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports,module){"use strict";var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module.exports=gt}});var require_gte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports,module){"use strict";var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module.exports=gte}});var require_lt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports,module){"use strict";var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module.exports=lt}});var require_lte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports,module){"use strict";var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module.exports=lte}});var require_cmp=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports,module){"use strict";var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module.exports=cmp}});var require_comparator=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports,module){"use strict";var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this)}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return!0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range()}});var require_range=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports,module){"use strict";var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range2,options){if(options=parseOptions(options),range2 instanceof _Range)return range2.loose===!!options.loose&&range2.includePrerelease===!!options.includePrerelease?range2:new _Range(range2.raw,options);if(range2 instanceof Comparator)return this.raw=range2.value,this.set=[[range2]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range2.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range2){range2=range2.replace(BUILDSTRIPRE,"");let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range2,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range2=range2.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range2),range2=range2.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range2),range2=range2.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range2),range2=range2.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range2);let rangeList=range2.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return[comp];rangeMap.set(comp.value,comp)}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range2,options){if(!(range2 instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range2.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return!1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return!0;return!1}};module.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,src,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),BUILDSTRIPRE=new RegExp(src[t.BUILD],"g"),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(comp=comp.replace(re[t.BUILD],""),debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id3=>!id3||id3.toLowerCase()==="x"||id3==="*",invalidXRangeOrder=(M,m,p)=>isX(M)&&!isX(m)||isX(m)&&p&&!isX(p),replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{if(debug("xRange",comp,ret,gtlt,M,m,p,pr),invalidXRangeOrder(M,m,p))return comp;let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return!1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return!0}return!1}return!0}}});var require_satisfies=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports,module){"use strict";var Range=require_range(),satisfies9=(version2,range2,options)=>{try{range2=new Range(range2,options)}catch{return!1}return range2.test(version2)};module.exports=satisfies9}});var require_parse=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse2}});var require_valid=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports,module){"use strict";var parse2=require_parse(),valid7=(version2,options)=>{let v=parse2(version2,options);return v?v.version:null};module.exports=valid7}});var require_valid2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports,module){"use strict";var Range=require_range(),validRange5=(range2,options)=>{try{return new Range(range2,options).range||"*"}catch{return null}};module.exports=validRange5}});function record(value,allowed){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("Invalid installation configuration");return value}function httpsUrl(value){if(typeof value!="string"||value.length>4096)throw new Error("Invalid installation URL");let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||url.hash)throw new Error("Invalid installation URL");return url}function parseInstallationConfig(value,publicOrigin){let input2=record(value,["schemaVersion","guide","presets"]);if(input2.schemaVersion!==1)throw new Error("Invalid installation schema");let result={schemaVersion:1};if(input2.guide!==void 0){let guide=record(input2.guide,["url","registry"]),url=httpsUrl(guide.url),registry2=httpsUrl(guide.registry);if(url.origin===publicOrigin||registry2.origin===publicOrigin||registry2.search||!registry2.pathname.endsWith("/"))throw new Error("Invalid registry URL");result.guide={url:url.href,registry:registry2.href}}if(input2.presets!==void 0){if(!result.guide||!input2.presets||typeof input2.presets!="object"||Array.isArray(input2.presets))throw new Error("A preset catalog requires its guide");let entries=Object.entries(input2.presets);if(entries.length>32)throw new Error("Installation catalog exceeds 32 presets");result.presets=Object.fromEntries(entries.map(([id3,value2])=>{if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3))throw new Error("Invalid installation preset ID");let entry=record(value2,["label","source","origins"]);if(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120||/[\u0000-\u001f\u007f]/.test(entry.label))throw new Error("Invalid preset label");let source=httpsUrl(entry.source).href;if(!Array.isArray(entry.origins)||entry.origins.length>64)throw new Error("Expected preset permission origins");let origins=[...new Set([`${new URL(source).origin}/*`,...entry.origins.map(validateInstallationOrigin)])];if(origins.length>64)throw new Error("Installation permission origins exceed 64 scopes");return[id3,{label:entry.label,source,origins}]}))}return result}function validateInstallationOrigin(value){if(typeof value!="string"||value.length>4096||!/^(https?|\*):\/\//.test(value)||!value.endsWith("/*"))throw new Error("Invalid installation permission origin");let scheme=value.slice(0,value.indexOf(":")),wildcard=/^(?:https?|\*):\/\/\*\./.test(value),normalized=value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"),url=new URL(normalized);if(url.username||url.password||url.hash||url.hostname.includes("*")||url.pathname!=="/*"||url.search||!url.hostname||wildcard&&!url.hostname.includes("."))throw new Error("Invalid installation permission origin");return`${scheme}://${wildcard?"*.":""}${url.host}/*`}function matchesInstallationOrigin(scope,target){let value=validateInstallationOrigin(scope),scheme=value.slice(0,value.indexOf(":"));if(scheme==="*"?!["http:","https:"].includes(target.protocol):`${scheme}:`!==target.protocol)return!1;let wildcard=/^(?:https?|\*):\/\/\*\./.test(value),origin=new URL(value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"));return(!origin.port||origin.port===target.port)&&(target.hostname===origin.hostname||wildcard&&target.hostname.endsWith(`.${origin.hostname}`))}async function readInstallationJson(response,maxBytes){if(!Number.isSafeInteger(maxBytes)||maxBytes<1||maxBytes>INSTALLATION_CONFIG_MAX_BYTES)throw new Error("Invalid installation response size limit");let reader=response.body?.getReader();if(!reader)throw new Error("Missing installation response");let chunks=[],length=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(length+=value.byteLength,length>maxBytes)throw new Error("Installation response is too large");chunks.push(value)}}finally{await reader.cancel().catch(()=>{}),reader.releaseLock()}let bytes=new Uint8Array(length),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.length;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}async function loadInstallationConfig(url,publicOrigin,signal){let response=await fetch(url,{cache:"no-store",credentials:"omit",redirect:"error",signal});if(!response.ok||!response.headers.get("content-type")?.includes("application/json"))throw new Error("Installation configuration unavailable");return parseInstallationConfig(await readInstallationJson(response,INSTALLATION_CONFIG_MAX_BYTES),publicOrigin)}function trustedInstallationPreset(config,id3,source){return id3&&source&&Object.hasOwn(config.presets??{},id3)&&config.presets[id3].source===source?config.presets[id3]:void 0}function installationOriginCovered(origin,scopes){let target=validateInstallationOrigin(origin),wildcard=/^(?:https?|\*):\/\/\*\./.test(target),schemes=target.startsWith("*:")?["http:","https:"]:[target.slice(0,target.indexOf(":")+1)];return scopes.some(scope=>{let candidate=validateInstallationOrigin(scope);if(wildcard&&!/^(?:https?|\*):\/\/\*\./.test(candidate))return!1;let base=target.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1");return schemes.every(scheme=>{let url=new URL(base);return url.protocol=scheme,matchesInstallationOrigin(candidate,url)})})}var INSTALLATION_CONFIG_MAX_BYTES,PRESET_UPDATE_INTERVAL_MS,PRESET_UPDATE_RETRY_MS,init_installation=__esm({"../preset/dist/installation.js"(){"use strict";INSTALLATION_CONFIG_MAX_BYTES=65536;PRESET_UPDATE_INTERVAL_MS=720*6e4,PRESET_UPDATE_RETRY_MS=60*6e4}});function invalid(path29,reason){throw new PresetError("PRESET_INVALID",`${path29}: ${reason}`)}function isJsonObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&(Object.getPrototypeOf(value)===Object.prototype||Object.getPrototypeOf(value)===null)}function object(value,path29){isJsonObject(value)||invalid(path29,"expected a plain object");for(let key of Object.keys(value))unsafeKeys.has(key)&&invalid(path29,`unsafe key ${key}`)}function fields(value,path29,names){object(value,path29);for(let key of Object.keys(value))names.includes(key)||invalid(`${path29}.${key}`,"unknown field")}function text(value,path29){(typeof value!="string"||!value.trim()||value!==value.trim())&&invalid(path29,"expected a non-empty trimmed string")}function id(value,path29){(typeof value!="string"||!componentId.test(value))&&invalid(path29,"invalid ID")}function range(value,path29){text(value,path29),(0,import_valid2.default)(value)===null&&invalid(path29,"invalid version range")}function stringArray(value,path29){Array.isArray(value)||invalid(path29,"expected an array");for(let[index,item]of value.entries())text(item,`${path29}[${index}]`);new Set(value).size!==value.length&&invalid(path29,"duplicate values")}function json(value,path29,depth=0){return depth>32&&invalid(path29,"JSON nesting exceeds 32 levels"),value===null||typeof value=="string"||typeof value=="boolean"||typeof value=="number"&&Number.isFinite(value)?value:Array.isArray(value)?Array.from(value,(item,index)=>json(item,`${path29}[${index}]`,depth+1)):(object(value,path29),Object.fromEntries(Object.entries(value).map(([key,item])=>[key,json(item,`${path29}.${key}`,depth+1)])))}function clonePresetDefaults(value){return object(value,"defaults"),json(value,"defaults")}function component(value,path29,kind){if(fields(value,path29,["source","version","enabled","targets","dependsOn","migrateFrom"]),"source"in value&&text(value.source,`${path29}.source`),"version"in value&&range(value.version,`${path29}.version`),"migrateFrom"in value&&(kind!=="skills"&&invalid(`${path29}.migrateFrom`,"only Skills support source migration"),stringArray(value.migrateFrom,`${path29}.migrateFrom`),value.migrateFrom.length>16&&invalid(`${path29}.migrateFrom`,"exceeds 16 sources")),"enabled"in value&&typeof value.enabled!="boolean"&&invalid(`${path29}.enabled`,"expected a boolean"),"targets"in value&&(stringArray(value.targets,`${path29}.targets`),(value.targets.length===0||value.targets.some(item=>item!=="browser"&&item!=="node"))&&invalid(`${path29}.targets`,"expected browser and/or node")),"dependsOn"in value){stringArray(value.dependsOn,`${path29}.dependsOn`);for(let item of value.dependsOn)id(item,`${path29}.dependsOn`)}return json(value,path29)}function validatePreset(value){fields(value,"preset",["schemaVersion","id","version","extends","requires","packages","skills","providers","appProfiles","defaults","permissions"]),value.schemaVersion!==1&&invalid("schemaVersion","only version 1 is supported"),id(value.id,"id"),text(value.version,"version"),(0,import_valid.default)(value.version)!==value.version&&invalid("version","expected an exact semantic version");let result={schemaVersion:1,id:value.id,version:value.version};"extends"in value&&(fields(value.extends,"extends",["source","version"]),text(value.extends.source,"extends.source"),"version"in value.extends&&range(value.extends.version,"extends.version"),result.extends={source:value.extends.source,...value.extends.version===void 0?{}:{version:value.extends.version}}),"requires"in value&&(fields(value.requires,"requires",["mearlApi"]),"mearlApi"in value.requires&&range(value.requires.mearlApi,"requires.mearlApi"),result.requires={...value.requires.mearlApi===void 0?{}:{mearlApi:value.requires.mearlApi}});for(let kind of["packages","skills","providers"]){if(!(kind in value))continue;let declarations=value[kind];object(declarations,kind),result[kind]=Object.fromEntries(Object.entries(declarations).map(([key,item])=>(id(key,`${kind}.${key}`),[key,component(item,`${kind}.${key}`,kind)])))}if("appProfiles"in value&&(object(value.appProfiles,"appProfiles"),result.appProfiles=Object.fromEntries(Object.entries(value.appProfiles).map(([key,target])=>(id(key,`appProfiles.${key}`),text(target,`appProfiles.${key}`),[key,target])))),"defaults"in value&&(result.defaults=clonePresetDefaults(value.defaults)),"permissions"in value){fields(value.permissions,"permissions",["origins"]),"origins"in value.permissions&&stringArray(value.permissions.origins,"permissions.origins");let origins=value.permissions.origins??[];origins.length>64&&invalid("permissions.origins","exceeds 64 scopes"),result.permissions={origins:[...new Set(origins.map((origin,index)=>{try{return validateInstallationOrigin(origin)}catch{return invalid(`permissions.origins[${index}]`,"expected an explicit HTTP host scope")}}))]}}return JSON.stringify(result).length>262144&&invalid("preset","manifest exceeds 256 Ki UTF-16 code units"),result}var import_valid,import_valid2,PresetError,unsafeKeys,componentId,init_manifest=__esm({"../preset/dist/manifest.js"(){"use strict";init_installation();import_valid=__toESM(require_valid(),1),import_valid2=__toESM(require_valid2(),1),PresetError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="PresetError"}},unsafeKeys=new Set(["__proto__","constructor","prototype"]),componentId=/^[a-z][a-z0-9-]{0,79}$/}});function invalid2(message){throw new BundleError("BUNDLE_INVALID",message)}function fields2(value,names){(!isJsonObject(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid2("Invalid request UI structure")}function validateBrowserUiText(value){fields2(value,["en","zh_CN"]),(typeof value.en!="string"||!value.en.trim()||Object.values(value).some(entry=>typeof entry!="string"||entry.length>1024||!entry.trim()))&&invalid2("Request UI text requires bounded translations")}var init_requestUi=__esm({"../preset/dist/requestUi.js"(){"use strict";init_bundle();init_manifest()}});function parseNetworkRoutePlan(input2){if(!input2||typeof input2!="object"||Array.isArray(input2)||Object.keys(input2).join(",")!=="routes")throw new Error("Invalid network route plan");let routes=input2.routes;if(!Array.isArray(routes)||routes.length>32)throw new Error("Invalid network routes");let sources=new Set,ids=new Set,hostname=value=>typeof value=="string"&&value.length<=253&&value.includes(".")&&value.split(".").every(label=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label));for(let route of routes){if(!route||typeof route!="object"||Array.isArray(route)||Object.keys(route).some(key=>!["id","fromHost","toHost"].includes(key))||route.id!==void 0&&(typeof route.id!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,79}$/.test(route.id))||!hostname(route.fromHost)||!hostname(route.toHost)||route.fromHost===route.toHost||sources.has(route.fromHost)||route.id!==void 0&&ids.has(route.id))throw new Error("Invalid or ambiguous network route");sources.add(route.fromHost),route.id&&ids.add(route.id)}if(routes.reduce((size,route)=>size+route.toHost.length,0)>1024)throw new Error("Network route plan is too large");let plan={routes:routes.map(({id:id3,fromHost,toHost})=>({...id3?{id:id3}:{},fromHost,toHost}))};if(JSON.stringify(plan).length>12288)throw new Error("Network route header is too large");return plan}var init_networkRoutes=__esm({"../preset/dist/networkRoutes.js"(){"use strict"}});function fields3(value,names){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))throw new BundleError("BUNDLE_INVALID","Invalid browser control")}function validateBrowserControl(input2){if(fields3(input2,["schemaVersion","id","kind","label","description","defaultValue","aliases","messages","options"]),input2.schemaVersion!==1||input2.kind!=="segmented"||typeof input2.id!="string"||!id2.test(input2.id)||typeof input2.defaultValue!="string"||!id2.test(input2.defaultValue))throw new BundleError("BUNDLE_INVALID","Invalid segmented control");if(validateBrowserUiText(input2.label),validateBrowserUiText(input2.description),fields3(input2.messages,["changed","failed"]),validateBrowserUiText(input2.messages.changed),validateBrowserUiText(input2.messages.failed),input2.aliases!==void 0&&(!Array.isArray(input2.aliases)||input2.aliases.length>8||new Set(input2.aliases).size!==input2.aliases.length||input2.aliases.some(alias=>typeof alias!="string"||!id2.test(alias))))throw new BundleError("BUNDLE_INVALID","Invalid browser control aliases");if(!Array.isArray(input2.options)||input2.options.length<2||input2.options.length>8)throw new BundleError("BUNDLE_INVALID","Invalid browser control options");let values=new Set,options=input2.options.map(option=>{if(fields3(option,["value","label","networkRoutes"]),typeof option.value!="string"||!id2.test(option.value)||values.has(option.value))throw new BundleError("BUNDLE_INVALID","Invalid browser control option");values.add(option.value),validateBrowserUiText(option.label);try{return{value:option.value,label:structuredClone(option.label),networkRoutes:parseNetworkRoutePlan(option.networkRoutes)}}catch{throw new BundleError("BUNDLE_INVALID","Invalid control network route plan")}});if(!values.has(input2.defaultValue)||options.find(option=>option.value===input2.defaultValue).networkRoutes.routes.length)throw new BundleError("BUNDLE_INVALID","The default option must clear network routes");if(new TextEncoder().encode(JSON.stringify(input2)).byteLength>65536)throw new BundleError("BUNDLE_QUOTA","Browser control exceeds 64 KiB");return{schemaVersion:1,id:input2.id,kind:"segmented",label:structuredClone(input2.label),description:structuredClone(input2.description),defaultValue:input2.defaultValue,messages:structuredClone(input2.messages),options,...input2.aliases?{aliases:[...input2.aliases]}:{}}}function selectBrowserControl(bundles){let selected;for(let bundle of bundles){let resource=bundle.manifest.contributions?.browserControls;if(resource){if(selected)throw new BundleError("BUNDLE_CONFLICT","Browser network control has multiple providers");selected={bundleId:bundle.manifest.id,revision:bundle.revision,definition:validateBrowserControl(readBundleJson(bundle,resource))}}}return selected}var id2,init_browserControls=__esm({"../preset/dist/browserControls.js"(){"use strict";init_bundle();init_requestUi();init_networkRoutes();id2=/^[a-z][a-zA-Z0-9_.-]{0,79}$/}});function invalid3(message){throw new BundleError("BUNDLE_INVALID",message)}function fields4(value,names){(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid3("Unexpected manifest structure")}function path(value){(!/^[a-zA-Z0-9_][a-zA-Z0-9_./-]{0,255}$/.test(value)||value.split("/").some(segment=>!segment||segment==="."||segment===".."))&&invalid3("Resource paths must stay inside the bundle directory")}function bundleSourceUrl(source){try{let url=new URL(source);return(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)&&invalid3("Invalid bundle source"),url.hash="",url.href}catch{invalid3("Expected an absolute HTTP(S)/file bundle source without credentials")}}function validateBundleManifest(value,mearlApiVersion){let json3;try{json3=clonePresetDefaults(value)}catch{invalid3("Expected a JSON manifest")}if(fields4(json3,["schemaVersion","id","version","requires","defaults","resources","contributions"]),json3.defaults!==void 0&&(json3.defaults=clonePresetDefaults(json3.defaults)),(json3.schemaVersion!==1||typeof json3.id!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(json3.id))&&invalid3("Invalid bundle identity"),(typeof json3.version!="string"||(0,import_valid3.default)(json3.version)!==json3.version)&&invalid3("Expected an exact bundle version"),(0,import_valid3.default)(mearlApiVersion)!==mearlApiVersion&&invalid3("Expected an exact host API version"),json3.requires!==void 0){fields4(json3.requires,["mearlApi"]);let requirement=json3.requires.mearlApi;if((typeof requirement!="string"||!requirement.trim()||(0,import_valid4.default)(requirement)===null)&&invalid3("Invalid host API requirement"),!(0,import_satisfies.default)(mearlApiVersion,requirement))throw new BundleError("BUNDLE_INCOMPATIBLE",`Requires host API ${requirement}`)}(!json3.resources||typeof json3.resources!="object"||Array.isArray(json3.resources))&&invalid3("Expected a resource map");let resources=Object.entries(json3.resources);(!resources.length||resources.length>64)&&invalid3("A bundle requires 1–64 resources");let total=0;for(let[name,resource]of resources)if(path(name),fields4(resource,["sha256","byteLength"]),(typeof resource.sha256!="string"||!/^[a-f0-9]{64}$/.test(resource.sha256)||typeof resource.byteLength!="number"||!Number.isSafeInteger(resource.byteLength)||resource.byteLength<0)&&invalid3("Invalid resource metadata"),total+=resource.byteLength,total>MAX_BUNDLE_BYTES)throw new BundleError("BUNDLE_QUOTA","Bundle resources exceed 16 MiB");if(json3.contributions!==void 0){fields4(json3.contributions,["appProfiles","pageRuntimes","nodeRuntimes","browserRuntimes","extension","requestUi","browserViews","browserControls"]);let extension=json3.contributions.extension;if(extension!==void 0&&(typeof extension!="string"||!Object.hasOwn(json3.resources,extension))&&invalid3("Extension contributions must reference a declared resource"),typeof extension=="string"&&json3.resources[extension].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Extension contributions exceed 64 KiB");let controls=json3.contributions.browserControls;if(controls!==void 0&&(typeof controls!="string"||!Object.hasOwn(json3.resources,controls))&&invalid3("Browser controls must reference a declared resource"),typeof controls=="string"&&json3.resources[controls].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser controls exceed 64 KiB");if(json3.contributions.requestUi!==void 0&&(typeof json3.contributions.requestUi!="string"||!Object.hasOwn(json3.resources,json3.contributions.requestUi))&&invalid3("Request UI must reference a declared resource"),typeof json3.contributions.requestUi=="string"&&json3.resources[json3.contributions.requestUi].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Request UI exceeds 64 KiB");if(json3.contributions.browserViews!==void 0){fields4(json3.contributions.browserViews,["requestImport","requestCases","captureLauncher","captureController"]);for(let resource of Object.values(json3.contributions.browserViews))if((typeof resource!="string"||!Object.hasOwn(json3.resources,resource))&&invalid3("Browser views must reference declared resources"),json3.resources[resource].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser view definition exceeds 64 KiB")}let profiles=json3.contributions.appProfiles===void 0?[]:json3.contributions.appProfiles;(!Array.isArray(profiles)||profiles.some(name=>typeof name!="string"||!Object.hasOwn(json3.resources,name))||new Set(profiles).size!==profiles.length)&&invalid3("App profiles must reference distinct declared resources");let runtimes=json3.contributions.pageRuntimes;if(runtimes!==void 0){(!runtimes||typeof runtimes!="object"||Array.isArray(runtimes)||Object.entries(runtimes).some(([id3,name])=>!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof name!="string"||!Object.hasOwn(json3.resources,name)))&&invalid3("Page runtimes must reference declared resources");for(let name of Object.values(runtimes))if(json3.resources[name].byteLength>MAX_PAGE_RUNTIME_BYTES)throw new BundleError("BUNDLE_QUOTA","Page runtime exceeds 2 MiB")}for(let kind of["nodeRuntimes","browserRuntimes"]){let runtimes2=json3.contributions[kind],label=kind==="nodeRuntimes"?"Node":"Browser";if(runtimes2!==void 0){(!runtimes2||typeof runtimes2!="object"||Array.isArray(runtimes2)||Object.keys(runtimes2).length>16)&&invalid3(`Invalid ${label} runtime declarations`);for(let[host,declaration]of Object.entries(runtimes2))/^[a-z][a-z0-9-]{0,79}$/.test(host)||invalid3(`Invalid ${label} runtime host`),fields4(declaration,["entry","bindings"]),(typeof declaration.entry!="string"||!Object.hasOwn(json3.resources,declaration.entry)||!declaration.entry.endsWith(".cjs"))&&invalid3(`${label} runtime entry must reference a declared CommonJS resource`),(!declaration.bindings||typeof declaration.bindings!="object"||Array.isArray(declaration.bindings)||Object.keys(declaration.bindings).length>256||Object.entries(declaration.bindings).some(([hook,handler])=>!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(hook)||typeof handler!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(handler)))&&invalid3(`Invalid ${label} runtime bindings`)}}}if(new TextEncoder().encode(JSON.stringify(json3)).byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");return json3}async function bundleDigest(bytes){let buffer=bytes.buffer,data=buffer instanceof ArrayBuffer&&!("resizable"in buffer&&buffer.resizable)?new Uint8Array(buffer,bytes.byteOffset,bytes.byteLength):Uint8Array.from(bytes),digest4=await crypto.subtle.digest("SHA-256",data);return Array.from(new Uint8Array(digest4),byte=>byte.toString(16).padStart(2,"0")).join("")}async function manifestRevision(source,manifest){return bundleDigest(new TextEncoder().encode(JSON.stringify({source,manifest})))}function readBundleJson(bundle,name){Object.hasOwn(bundle.resources,name)||invalid3("Bundle resource is unavailable");try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bundle.resources[name]))}catch{invalid3("Expected a UTF-8 JSON resource")}}async function loadBundleResources(source,manifest,options){let resources={};for(let[name,expected]of Object.entries(manifest.resources)){options.signal?.throwIfAborted();let resource=Uint8Array.from(await options.load(new URL(name,source).href,{maxBytes:expected.byteLength,signal:options.signal}));if(options.signal?.throwIfAborted(),resource.byteLength!==expected.byteLength||await bundleDigest(resource)!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Resource integrity check failed: ${name}`);resources[name]=resource}options.signal?.throwIfAborted();let prepared={source,manifest,revision:await manifestRevision(source,manifest),resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}async function verifyBundle(bundle,mearlApiVersion){let source=bundleSourceUrl(bundle.source),manifest=validateBundleManifest(bundle.manifest,mearlApiVersion),revision3=bundle.revision;(!bundle.resources||typeof bundle.resources!="object"||Object.keys(bundle.resources).length!==Object.keys(manifest.resources).length)&&invalid3("Stored resource set does not match the manifest");let resources={};for(let[name,expected]of Object.entries(manifest.resources)){let original=bundle.resources[name];if(!(original instanceof Uint8Array))throw new BundleError("BUNDLE_INTEGRITY","Stored resource is not a byte buffer");let bytes=Uint8Array.from(original);if(bytes.byteLength!==expected.byteLength)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);resources[name]=bytes}if(await manifestRevision(source,manifest)!==revision3)throw new BundleError("BUNDLE_INTEGRITY","Stored manifest revision does not match");for(let[name,expected]of Object.entries(manifest.resources))if(await bundleDigest(resources[name])!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);let prepared={source,manifest,revision:revision3,resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}var import_satisfies,import_valid3,import_valid4,MAX_BUNDLE_BYTES,MAX_BUNDLE_MANIFEST_BYTES,MAX_BROWSER_STORAGE_BYTES,MAX_PAGE_RUNTIME_BYTES,MAX_REQUEST_UI_BYTES,BundleError,init_bundle=__esm({"../preset/dist/bundle.js"(){"use strict";import_satisfies=__toESM(require_satisfies(),1),import_valid3=__toESM(require_valid(),1),import_valid4=__toESM(require_valid2(),1);init_manifest();init_browserControls();MAX_BUNDLE_BYTES=16*1024*1024,MAX_BUNDLE_MANIFEST_BYTES=64*1024,MAX_BROWSER_STORAGE_BYTES=64*1024*1024,MAX_PAGE_RUNTIME_BYTES=2*1024*1024,MAX_REQUEST_UI_BYTES=64*1024,BundleError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="BundleError"}}}});var init_extensionContributions=__esm({"../preset/dist/extensionContributions.js"(){"use strict";init_bundle();init_manifest();init_requestUi()}});function createBundleFetchLoader(options={}){return async(source,{maxBytes,signal})=>{let response=await(options.fetch??fetch)(source,{credentials:options.credentials??"omit",redirect:"error",cache:"no-store",signal});if(!response.ok||response.redirected)throw new BundleError("BUNDLE_INVALID","Bundle download failed or redirected");if(!response.body)return new Uint8Array;let reader=response.body.getReader(),chunks=[],total=0;try{for(;;){signal?.throwIfAborted();let{done,value}=await reader.read();if(done)break;if(total+=value.byteLength,total>maxBytes)throw new BundleError("BUNDLE_QUOTA","Download exceeds its declared size limit");chunks.push(value.slice())}}catch(error){throw await reader.cancel().catch(()=>{}),error}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}}var init_bundleFetch=__esm({"../preset/dist/bundleFetch.js"(){"use strict";init_bundle()}});var init_profileSource=__esm({"../preset/dist/profileSource.js"(){"use strict";init_bundle();init_bundleFetch()}});function parseToolboxCatalogs(input2){if(input2===void 0)return{};function invalid6(){throw new PresetError("PRESET_INVALID","Invalid extension.toolCatalogs configuration")}return(!isJsonObject(input2)||Object.keys(input2).length>16)&&invalid6(),Object.fromEntries(Object.entries(input2).map(([id3,entry])=>{(!/^[a-z][a-z0-9-]{0,63}$/.test(id3)||id3==="official"||!isJsonObject(entry)||Object.keys(entry).some(key=>!["url","label","enabled"].includes(key)))&&invalid6(),entry.enabled!==void 0&&typeof entry.enabled!="boolean"&&invalid6(),entry.label!==void 0&&(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120)&&invalid6();let url;if(entry.url!==void 0){(typeof entry.url!="string"||entry.url.length>2048)&&invalid6();try{let parsed=new URL(entry.url);(parsed.username||parsed.password||parsed.hash||!(parsed.protocol==="https:"||parsed.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(parsed.hostname)))&&invalid6(),url=parsed.href}catch{invalid6()}}else entry.enabled!==!1&&invalid6();return[id3,{...url?{url}:{},...entry.label!==void 0?{label:entry.label}:{},...entry.enabled!==void 0?{enabled:entry.enabled}:{}}]}))}var init_toolboxCatalogs=__esm({"../preset/dist/toolboxCatalogs.js"(){"use strict";init_manifest()}});var require_subset=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/subset.js"(exports,module){"use strict";var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies9=require_satisfies(),compare=require_compare(),subset2=(sub,dom,options={})=>{if(sub===dom)return!0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return!1}return!0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return!0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return!0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return!0;dom=minimumVersion}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&<){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies9(eq,String(gt),options)||lt&&!satisfies9(eq,String(lt),options))return null;for(let c of dom)if(!satisfies9(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return!1}else if(gt.operator===">="&&!c.test(gt.semver))return!1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return!1}else if(lt.operator==="<="&&!c.test(lt.semver))return!1}if(!c.operator&&(lt||gt)&>ltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module.exports=subset2}});function parseSetupManagement(value){if(value===void 0)return;let invalid6=()=>{throw new PresetError("PRESET_INVALID","Invalid defaults.management.setup declaration")};if(!isJsonObject(value)||Object.keys(value).some(key=>key!=="setup")||!isJsonObject(value.setup))return invalid6();let setup=value.setup;if(Object.keys(setup).some(key=>!["package","version","registry","runtime"].includes(key))||typeof setup.package!="string"||setup.package.length>214||!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(setup.package)||typeof setup.version!="string"||setup.version.length>64||!((0,import_valid5.default)(setup.version)===setup.version||/^[a-z][a-z0-9.-]*$/.test(setup.version)))return invalid6();if(setup.registry!==void 0){if(typeof setup.registry!="string"||setup.registry.length>2048||!/^https:\/\/[a-zA-Z0-9./:_-]+$/.test(setup.registry))return invalid6();try{let url=new URL(setup.registry);if(!url.hostname||url.username||url.password||url.search||url.hash)return invalid6()}catch{return invalid6()}}return setup.runtime!==void 0&&(typeof setup.runtime!="string"||setup.runtime.length>128||!(0,import_valid6.default)(setup.runtime))?invalid6():{...setup}}function setupManagementCommand(setup){return`npx${setup.registry?` --registry=${setup.registry}`:""} ${setup.package}@${setup.version}`}function setupRuntimeCompatible(setup,version2,targetLine){return!setup.runtime||(0,import_satisfies2.default)(version2,setup.runtime,{includePrerelease:!0})&&(!targetLine||(0,import_subset.default)(targetLine,setup.runtime,{includePrerelease:!0}))}var import_satisfies2,import_valid5,import_subset,import_valid6,init_management=__esm({"../preset/dist/management.js"(){"use strict";import_satisfies2=__toESM(require_satisfies(),1),import_valid5=__toESM(require_valid(),1),import_subset=__toESM(require_subset(),1),import_valid6=__toESM(require_valid2(),1);init_manifest()}});function mergePresetDefaults(base,overrides2){let result=clonePresetDefaults(base);for(let[key,value]of Object.entries(clonePresetDefaults(overrides2)))result[key]=isJsonObject(value)&&isJsonObject(result[key])?mergePresetDefaults(result[key],value):value;return result}function sourceUrl(source,parent){try{let url=parent?new URL(source,parent):new URL(source);if(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)throw new Error("unsupported source");return url.hash="",url.href}catch{throw new PresetError("PRESET_INVALID","Expected an absolute HTTP(S)/file source URL without embedded credentials")}}function componentSource(kind,source,parent){if(kind==="packages")return sourceUrl(source,parent);if(source.length>8192||/^[\s-]/.test(source)||/[\0-\x1f\x7f]/.test(source))throw new PresetError("PRESET_INVALID","Invalid component install source");if(/^[a-z][a-z0-9+.-]*:\/\//i.test(source))try{if(new URL(source).password)throw new Error("embedded credentials")}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}if(/^(?:https?:|file:|\.{1,2}\/|\/)/i.test(source))try{let url=new URL(source,parent);if(url.username||url.password)throw new Error("embedded credentials");return url.href}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}return source}function validateDependencies(kind,entries){let active=new Set,done=new Set,visit=id3=>{if(done.has(id3))return;if(active.has(id3))throw new PresetError("PRESET_DEPENDENCY",`${kind}: dependency cycle at ${id3}`);let entry=entries[id3];if(!entry||entry.enabled===!1)throw new PresetError("PRESET_DEPENDENCY",`${kind}: missing or disabled dependency ${id3}`);if(!entry.source)throw new PresetError("PRESET_INVALID",`${kind}.${id3}: enabled component requires a source`);active.add(id3);for(let dependency of entry.dependsOn??[])visit(dependency);active.delete(id3),done.add(id3)};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3)}async function resolvePreset(source,options){if((0,import_valid7.default)(options.mearlApiVersion)!==options.mearlApiVersion)throw new PresetError("PRESET_INVALID","mearlApiVersion requires an exact semantic version");let active=new Set,load=async url=>{if(options.signal?.throwIfAborted(),active.has(url))throw new PresetError("PRESET_CYCLE",`Inheritance cycle at ${url}`);if(active.size>=32)throw new PresetError("PRESET_INVALID","Inheritance exceeds 32 presets");active.add(url);let manifest=validatePreset(await options.load(url));if(options.signal?.throwIfAborted(),manifest.requires?.mearlApi&&!(0,import_satisfies3.default)(options.mearlApiVersion,manifest.requires.mearlApi))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires Mearl API ${manifest.requires.mearlApi}`);let parent;if(manifest.extends&&(parent=await load(sourceUrl(manifest.extends.source,url)),manifest.extends.version&&!(0,import_satisfies3.default)(parent.version,manifest.extends.version)))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires parent ${manifest.extends.version}; received ${parent.version}`);let result2={id:manifest.id,version:manifest.version,chain:[...parent?.chain??[],{source:url,id:manifest.id,version:manifest.version}],packages:{...parent?.packages},skills:{...parent?.skills},providers:{...parent?.providers},appProfiles:{...parent?.appProfiles,...manifest.appProfiles},defaults:mergePresetDefaults(parent?.defaults??{},manifest.defaults??{}),permissions:{origins:[...new Set([...parent?.permissions.origins??[],...manifest.permissions?.origins??[]])]}};for(let kind of kinds)for(let[id3,patch]of Object.entries(manifest[kind]??{}))result2[kind][id3]={...result2[kind][id3],...patch,...patch.source===void 0?{}:{source:componentSource(kind,patch.source,url)},...patch.migrateFrom===void 0?{}:{migrateFrom:patch.migrateFrom.map(source2=>componentSource(kind,source2,url))},declaredBy:url};return active.delete(url),result2},result=await load(sourceUrl(source));parseSetupManagement(result.defaults.management);let extension=result.defaults.extension;isJsonObject(extension)&&parseToolboxCatalogs(extension.toolCatalogs);for(let kind of kinds)validateDependencies(kind,result[kind]);return options.signal?.throwIfAborted(),result}var import_satisfies3,import_valid7,kinds,init_resolve=__esm({"../preset/dist/resolve.js"(){"use strict";init_toolboxCatalogs();init_management();import_satisfies3=__toESM(require_satisfies(),1),import_valid7=__toESM(require_valid(),1);init_manifest();kinds=["packages","skills","providers"]}});async function presetSnapshotRevision(value){return bundleDigest(new TextEncoder().encode(JSON.stringify(value)))}function selectPresetPackages(preset,runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).some(runtime=>runtimes.includes(runtime)));if(entries.length>64)throw new BundleError("BUNDLE_QUOTA","A preset can activate at most 64 packages");return entries}function presetPackages(preset,runtimes){for(let runtime of runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).includes(runtime)),ids=new Set(entries.map(([id3])=>id3));for(let[id3,entry]of entries)if(entry.dependsOn?.some(dependency=>!ids.has(dependency)))throw new BundleError("BUNDLE_INCOMPATIBLE",`${runtime==="browser"?"Browser":"Node"} package ${id3} requires a package unavailable in ${runtime}`);if(runtime==="browser"){for(let target of Object.values(preset.appProfiles))if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(target)||!ids.has(target.split("/")[0]))throw new BundleError("BUNDLE_INVALID","App implementations must belong to an enabled browser package")}}return selectPresetPackages(preset,runtimes)}function bundleTargets(bundle){let contributions=bundle.manifest.contributions,targets=[];return contributions&&(Object.keys(contributions.browserRuntimes??{}).length||Object.keys(contributions.pageRuntimes??{}).length||contributions.appProfiles?.length||contributions.extension||contributions.requestUi||contributions.browserViews||contributions.browserControls)&&targets.push("browser"),Object.keys(contributions?.nodeRuntimes??{}).length&&targets.push("node"),targets.length?targets:["browser","node"]}function applyPackageTargets(preset,targets){let enabled=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1);if(enabled.length!==Object.keys(targets).length)throw new BundleError("BUNDLE_INTEGRITY","Package target selection does not match the preset");let packages={...preset.packages};for(let[id3,entry]of enabled){let selected=targets[id3];if(!Array.isArray(selected)||!selected.length||selected.length>2||new Set(selected).size!==selected.length||selected.some(target=>target!=="browser"&&target!=="node")||entry.targets&&JSON.stringify(entry.targets)!==JSON.stringify(selected))throw new BundleError("BUNDLE_INTEGRITY","Invalid package target selection");packages[id3]={...entry,targets:[...selected]}}return{...preset,packages}}function verifyPackageTargets(preset,bundles){for(let bundle of bundles){let available=bundleTargets(bundle);if(preset.packages[bundle.manifest.id]?.targets?.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target")}}async function preparePresetPackages(source,options,runtimes){source=bundleSourceUrl(source);let remaining=options.maxDownloadBytes??MAX_BROWSER_STORAGE_BYTES;if(!Number.isSafeInteger(remaining)||remaining<=0||remaining>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Invalid preset download budget");let load=async(url,request)=>{if(remaining<=0)throw new BundleError("BUNDLE_QUOTA","Preset downloads exceed the shared budget");let limit=Math.min(request.maxBytes,remaining),bytes=await options.load(url,{...request,maxBytes:limit});if(bytes.byteLength>limit)throw new BundleError("BUNDLE_QUOTA","Preset download exceeds its size limit");return remaining-=bytes.byteLength,bytes},manifests={},preset=await resolvePreset(source,{mearlApiVersion:options.mearlApiVersion,signal:options.signal,load:async url=>{let bytes=Uint8Array.from(await load(url,{maxBytes:262144,signal:options.signal})),manifest;try{manifest=validatePreset(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)))}catch(error){throw new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid preset manifest")}return manifests[url]=manifest,manifest}}),entries=Object.values(preset.packages).every(entry=>entry.enabled===!1||!!entry.targets?.length)?presetPackages(preset,runtimes):selectPresetPackages(preset,runtimes),bundles=[],pending=[],packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets??[]]));for(let[id3,entry]of entries){let manifestSource=bundleSourceUrl(entry.source),bytes=Uint8Array.from(await load(manifestSource,{maxBytes:MAX_BUNDLE_MANIFEST_BYTES,signal:options.signal})),manifest;try{manifest=validateBundleManifest(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)),options.mearlApiVersion)}catch(error){throw error instanceof BundleError?error:new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid package manifest")}if(manifest.id!==id3)throw new BundleError("BUNDLE_INVALID","Package identity does not match the preset");if(entry.version&&!(0,import_satisfies4.default)(manifest.version,entry.version))throw new BundleError("BUNDLE_INCOMPATIBLE","Package version does not satisfy the preset");let available=bundleTargets({manifest}),targets=entry.targets??available;if(targets.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target");packageTargets[id3]=targets,pending.push({source:manifestSource,manifest,bytes})}preset=applyPackageTargets(preset,packageTargets);let selected=new Set(presetPackages(preset,runtimes).map(([id3])=>id3));for(let{source:manifestSource,manifest,bytes}of pending)selected.has(manifest.id)&&bundles.push(await loadBundleResources(manifestSource,manifest,{load:(url,request)=>url===manifestSource?Promise.resolve(bytes):load(url,request),signal:options.signal}));return options.signal?.throwIfAborted(),{source,manifests,preset,bundles,packageTargets}}async function verifyPresetGraph(value,mearlApiVersion,runtimes,full){let json3=clonePresetDefaults(value),allowed=["source","manifests","bundleRevisions","packageTargets","revision",...full?["schemaVersion"]:[]];if(Object.keys(json3).some(key=>!allowed.includes(key))||full&&json3.schemaVersion!==1||typeof json3.source!="string"||typeof json3.revision!="string"||!/^[a-f0-9]{64}$/.test(json3.revision))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset identity");let source=bundleSourceUrl(json3.source),manifests=clonePresetDefaults(json3.manifests);if(Object.keys(manifests).length>32)throw new BundleError("BUNDLE_QUOTA","Stored preset inheritance exceeds 32 manifests");let bundleRevisions=clonePresetDefaults(json3.bundleRevisions);if(Object.keys(bundleRevisions).length>64||Object.values(bundleRevisions).some(revision3=>typeof revision3!="string"||!/^[a-f0-9]{64}$/.test(revision3)))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored package revisions");let validated={};for(let[url,manifest]of Object.entries(manifests)){if(url!==bundleSourceUrl(url))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset source");validated[url]=validatePreset(manifest)}let packageTargets=clonePresetDefaults(json3.packageTargets),data={...full?{schemaVersion:1}:{},source,manifests:validated,bundleRevisions,packageTargets};if(await presetSnapshotRevision(data)!==json3.revision)throw new BundleError("BUNDLE_INTEGRITY","Stored preset revision does not match");let preset=await resolvePreset(source,{mearlApiVersion,load:async url=>{if(!Object.hasOwn(validated,url))throw new BundleError("BUNDLE_INTEGRITY","Stored parent preset is missing");return validated[url]}});preset=applyPackageTargets(preset,packageTargets);let entries=presetPackages(preset,runtimes);if(preset.chain.length!==Object.keys(validated).length||entries.length!==Object.keys(bundleRevisions).length||entries.some(([id3])=>!Object.hasOwn(bundleRevisions,id3)))throw new BundleError("BUNDLE_INTEGRITY","Stored preset package graph does not match");return{snapshot:{...data,revision:json3.revision},preset}}var import_satisfies4,init_prepare=__esm({"../preset/dist/prepare.js"(){"use strict";init_bundle();import_satisfies4=__toESM(require_satisfies(),1);init_manifest();init_resolve()}});function presetRequiresBrowser(preset){return Object.values(preset.packages).some(entry=>entry.enabled!==!1&&entry.targets?.includes("browser"))||Object.keys(preset.appProfiles).length>0||Object.keys(preset.defaults).some(key=>key==="simulation"||key==="extension"||key==="services")}async function browserPresetSnapshot(source,manifests,preset,bundles){let ids=new Set(presetPackages(preset,["browser"]).map(([id3])=>id3)),selected=bundles.filter(bundle=>ids.has(bundle.manifest.id));selectBrowserControl(selected);let packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets])),data={source,manifests,bundleRevisions:Object.fromEntries(selected.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets};return{snapshot:{...data,revision:await presetSnapshotRevision(data)},preset,bundles:selected}}async function verifyBrowserPreset(value,mearlApiVersion){return verifyPresetGraph(value,mearlApiVersion,["browser"],!1)}var import_satisfies5,init_browserPreset=__esm({"../preset/dist/browserPreset.js"(){"use strict";init_browserControls();init_bundle();import_satisfies5=__toESM(require_satisfies(),1);init_prepare()}});var init_bundleStore=__esm({"../preset/dist/bundleStore.js"(){"use strict";init_bundle();init_browserPreset();init_resolve()}});async function preparePreset(source,options){let prepared=await preparePresetPackages(source,options,["browser","node"]),data={schemaVersion:1,source:prepared.source,manifests:prepared.manifests,bundleRevisions:Object.fromEntries(prepared.bundles.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets:prepared.packageTargets},snapshot={...data,revision:await presetSnapshotRevision(data)},browser=await browserPresetSnapshot(prepared.source,prepared.manifests,prepared.preset,prepared.bundles);return options.signal?.throwIfAborted(),{snapshot,preset:prepared.preset,bundles:prepared.bundles,browser}}async function verifyPreset(value,mearlApiVersion){let result=await verifyPresetGraph(value,mearlApiVersion,["browser","node"],!0);return{...result,snapshot:result.snapshot}}async function verifyPreparedPreset(value,mearlApiVersion){if(!Array.isArray(value.bundles)||value.bundles.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package count exceeds 64");let total=0;for(let bundle of value.bundles){if(!bundle?.resources||typeof bundle.resources!="object"||Array.isArray(bundle.resources))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");let resources=Object.values(bundle.resources);if(resources.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package resource count exceeds 64");for(let bytes of resources){if(!(bytes instanceof Uint8Array))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");if(total+=bytes.byteLength,total>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Preset packages exceed the storage budget")}}let[graph,bundles]=await Promise.all([verifyPreset(value.snapshot,mearlApiVersion),Promise.all(value.bundles.map(bundle=>verifyBundle(bundle,mearlApiVersion)))]),{snapshot,preset}=graph;if(verifyPackageTargets(preset,bundles),bundles.length!==Object.keys(snapshot.bundleRevisions).length||new Set(bundles.map(bundle=>bundle.manifest.id)).size!==bundles.length||bundles.some(bundle=>{let entry=preset.packages[bundle.manifest.id];return snapshot.bundleRevisions[bundle.manifest.id]!==bundle.revision||entry?.source!==bundle.source||entry.version&&!(0,import_satisfies6.default)(bundle.manifest.version,entry.version)}))throw new BundleError("BUNDLE_INTEGRITY","Preset installation requires every exact package");return{snapshot,preset,bundles,browser:await browserPresetSnapshot(snapshot.source,snapshot.manifests,preset,bundles)}}var import_satisfies6,init_preset=__esm({"../preset/dist/preset.js"(){"use strict";init_browserPreset();init_prepare();import_satisfies6=__toESM(require_satisfies(),1);init_bundle()}});function installPageRuntimeHost(){let root=window;if(root.__mearlPageRuntimeHost__)return root.__mearlPageRuntimeHost__;let installers=new Map,pending=new Map,host={install(config,fallback){let binding=config.pageRuntime;if(!binding){fallback?.(config);return}let installer=installers.get(binding.sha256);if(installer){installer(config);return}let waiting=pending.get(binding.sha256)??[];waiting.push(config),pending.set(binding.sha256,waiting)},register(sha2562,installer){if(typeof installer!="function")throw new Error("A page runtime must export an install function");if(installers.has(sha2562))return;installers.set(sha2562,installer);let waiting=pending.get(sha2562)??[];pending.delete(sha2562);for(let config of waiting)installer(config)}};return Object.defineProperty(root,"__mearlPageRuntimeHost__",{configurable:!0,value:host}),host}function buildPageRuntimeRegistrationSource(binding,source,installerGlobal){if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(binding.id)||!/^[a-f0-9]{64}$/.test(binding.sha256)||!source.trim())throw new Error("Invalid page runtime binding");return`;(() => { const host=(${installPageRuntimeHost.toString()})(); const module={exports:{}};
|
|
4
4
|
(function(module,exports){
|
|
5
5
|
${source}
|
|
6
6
|
})(module,module.exports);
|
|
@@ -39,7 +39,7 @@ ${truncated}...`}function extractFields(data,fields7){if(fields7.length>100)thro
|
|
|
39
39
|
`,usable=Math.max(0,maxChars-marker.length),headBudget=Math.ceil(usable*.7),tailBudget=Math.max(0,usable-headBudget),headCut=snapshot.lastIndexOf(`
|
|
40
40
|
`,headBudget),tailStartCandidate=Math.max(0,snapshot.length-tailBudget),tailCut=snapshot.indexOf(`
|
|
41
41
|
`,tailStartCandidate),head=snapshot.slice(0,headCut>0?headCut:headBudget),tail=snapshot.slice(tailCut>=0?tailCut+1:tailStartCandidate);snapshot=head+marker+tail,truncated=!0}return{snapshot,truncated,outputNodeCount:snapshot?snapshot.split(`
|
|
42
|
-
`).filter(line=>!line.startsWith("... [")).length:0}}var SKIP_ROLES,ALWAYS_SKIP_ROLES,INTERACTIVE_ROLES,CHECKABLE_AX_ROLES,init_axSnapshot=__esm({"../browser-core/dist/axSnapshot.js"(){"use strict";SKIP_ROLES=new Set(["none","generic","InlineTextBox","LineBreak","paragraph","Section","LabelText"]),ALWAYS_SKIP_ROLES=new Set(["InlineTextBox","LineBreak","graphics-symbol","graphics-document"]),INTERACTIVE_ROLES=new Set(["button","checkbox","combobox","gridcell","link","listbox","menuitem","menuitemcheckbox","menuitemradio","option","radio","scrollbar","searchbox","slider","spinbutton","switch","tab","textbox","treeitem"]);CHECKABLE_AX_ROLES=new Set(["checkbox","menuitemcheckbox","menuitemradio","radio","switch"])}});function resolvePageObservationWaitOptions(options={}){let quietMs=Math.min(Math.max(options.quietMs??100,20),2e3),firstChangeTimeoutMs=Math.min(Math.max(options.firstChangeTimeoutMs??500,quietMs),1e4);return{quietMs,firstChangeTimeoutMs,timeoutMs:Math.min(Math.max(options.timeoutMs??3e3,firstChangeTimeoutMs),3e4)}}function shouldWaitForPotentialNavigation(action,observation){return action!=="page_click"&&action!=="page_press"?!1:observation.mode!=="delta"||observation.settledBy!=="quiet"?!0:!((observation.effects?.notifications?.length??0)>0||(observation.effects?.interactives?.length??0)>0||observation.effects?.focus!==void 0)&&(observation.mutationCount??0)<=1}function isPotentialNavigationRequest(resourceType,url=""){let normalizedType=resourceType.toLowerCase();return normalizedType==="xhr"||normalizedType==="fetch"}function resolveNavigationWaitOptions(options={}){let timeoutMs=Math.min(Math.max(options.navigationTimeoutMs??15e3,1e3),3e4),networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),maximumContentDelay=Math.max(0,timeoutMs-networkIdleMs-250),requestedContentDelay=options.contentReadyAfterMs??Math.min(5e3,timeoutMs/2);return{graceMs:Math.min(Math.max(options.navigationGraceMs??1e3,0),5e3),timeoutMs,networkIdleMs,contentReadyAfterMs:Math.min(Math.max(requestedContentDelay,0),maximumContentDelay)}}function samplePageReadinessInPage(quietMs=500){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey],now=performance.now();if(!state||state.document!==document){state={document,lastMutation:now,observer:new MutationObserver(()=>{state.lastMutation=performance.now()})};let root=document.body??document.documentElement;root&&state.observer.observe(root,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:["aria-busy","data-loading","class","hidden","style"]}),pageGlobal[globalKey]=state}let isVisible=element=>{let style=getComputedStyle(element);if(style.display==="none"||style.visibility==="hidden"||style.opacity==="0")return!1;let rect=element.getBoundingClientRect();return rect.width>0&&rect.height>0},visibleCount=(selector,limit)=>{let count=0;for(let element of Array.from(document.querySelectorAll(selector)))if(isVisible(element)&&(count+=1,count>=limit))break;return count},textLength=(document.body?.innerText??"").replace(/\s+/g,"").length,interactiveCount=visibleCount('a[href],button,input,select,textarea,[role="button"],[role="link"],[tabindex]',20),skeletonVisible=visibleCount('[aria-busy="true"],[data-loading="true"],[class*="skeleton" i],[class*="shimmer" i]',1)>0,quietFor=Math.max(0,now-state.lastMutation),meaningful=textLength>=80||interactiveCount>=3;return{ready:document.readyState==="complete"&&meaningful&&!skeletonVisible&&quietFor>=quietMs,meaningful,skeletonVisible,quietFor:Math.round(quietFor*1e3)/1e3,textLength,interactiveCount}}function disposePageReadinessObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),delete pageGlobal[globalKey])}function installPageObserverInPage(maxBatches=50){let globalKey="__MEARL_PAGE_OBSERVER__",pageGlobal=globalThis,existing=pageGlobal[globalKey];if(existing&&existing.schemaVersion===7&&existing.document===document&&existing.version>=0)return existing.captureBaseline?.(),{version:existing.version,url:location.href,title:document.title,focus:existing.selectorFor(document.activeElement)};existing?.observer?.disconnect?.();let interactiveSelector=["a[href]","button","input","select","textarea","summary",'[contenteditable="true"]',"[tabindex]",'[role="button"]','[role="link"]','[role="tab"]','[role="menuitem"]','[role="option"]','[role="checkbox"]','[role="radio"]','[role="switch"]','[role="combobox"]','[role="textbox"]'].join(","),notificationSelector=['[role="alert"]','[role="status"]','[aria-live]:not([aria-live="off"])','[class*="toast" i]','[class*="snackbar" i]'].join(","),recordBudget=160,signalLimit=12,notificationLimit=8,textLimit=8,lifecycleNodeIds=new WeakMap,notificationVisibility=new WeakMap,nextLifecycleNodeId=1,escapeCss=value=>pageGlobal.CSS&&typeof pageGlobal.CSS.escape=="function"?pageGlobal.CSS.escape(value):value.replace(/[^a-zA-Z0-9_-]/g,character=>`\\${character}`),escapeAttribute=value=>value.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),isInternal=input2=>!!(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest("[data-mearl-overlay], #__mearl_click_style"),isVisible=element=>{if(element.closest('[hidden], [aria-hidden="true"]'))return!1;try{let current=element;for(;current;){let style=getComputedStyle(current);if(style.display==="none"||style.visibility==="hidden"||style.visibility==="collapse"||style.opacity==="0")return!1;current=current.parentElement}return!0}catch{return!0}},selectorFor=input2=>{if(!input2||input2===document.documentElement||input2===document.body)return;if(input2.id)return`#${escapeCss(input2.id)}`;let tag=input2.tagName.toLowerCase();for(let attribute of["data-testid","data-test","name","aria-label"]){let value=input2.getAttribute(attribute);if(value&&value.length<=80){let candidate=`${tag}[${attribute}="${escapeAttribute(value)}"]`;try{if(!input2.isConnected||document.querySelectorAll(candidate).length===1)return candidate}catch{}}}let path29=[],current=input2;for(;current&¤t!==document.documentElement&&path29.length<6;){let parent=current.parentElement,currentTag=current.tagName.toLowerCase();if(!parent){path29.unshift(currentTag);break}let siblings=Array.from(parent.children).filter(item=>item.tagName===current.tagName),position=siblings.indexOf(current)+1;path29.unshift(siblings.length>1?`${currentTag}:nth-of-type(${position})`:currentTag);let candidate=path29.join(" > ");if(input2.isConnected)try{if(document.querySelectorAll(candidate).length===1)return candidate}catch{}current=parent}return path29.join(" > ")||void 0},inferredRole=element=>{let explicit=element.getAttribute("role");if(explicit)return explicit;let tag=element.tagName.toLowerCase();if(tag==="a")return"link";if(tag==="button"||tag==="summary")return"button";if(tag==="select")return"combobox";if(tag==="textarea")return"textbox";if(tag!=="input")return;let type=(element.getAttribute("type")||"text").toLowerCase();return type==="checkbox"?"checkbox":type==="radio"?"radio":type==="button"||type==="submit"||type==="reset"?"button":"textbox"},ariaBoolean=(element,name)=>{let value=element.getAttribute(name);if(value==="true")return!0;if(value==="false")return!1},describe=element=>{if(!element||isInternal(element))return null;let selector=selectorFor(element);if(!selector)return null;let tag=element.tagName.toLowerCase(),role=inferredRole(element),inputType=tag==="input"?(element.getAttribute("type")||"text").toLowerCase():"",isPassword=tag==="input"&&inputType==="password",name=(element.getAttribute("aria-label")||element.getAttribute("alt")||element.getAttribute("title")||element.getAttribute("placeholder")||(isPassword?"":element.textContent||"")).replace(/\s+/g," ").trim().slice(0,160),value=!isPassword&&(tag==="input"||tag==="textarea"||tag==="select")?String(element.value??"").slice(0,160):"",checked=tag==="input"&&(inputType==="checkbox"||inputType==="radio")?element.checked:ariaBoolean(element,"aria-checked"),disabled=element.hasAttribute("disabled")||ariaBoolean(element,"aria-disabled")===!0,expanded=ariaBoolean(element,"aria-expanded");return{selector,tag,...role?{role}:{},...name?{name}:{},...value?{value}:{},...document.activeElement===element?{focused:!0}:{},...checked!==void 0?{checked}:{},...disabled?{disabled:!0}:{},...expanded!==void 0?{expanded}:{}}},isInteractive=element=>{try{return element.matches(interactiveSelector)}catch{return!1}},isNotification=element=>{try{return element.matches(notificationSelector)}catch{return!1}},nearestNotification=input2=>(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest(notificationSelector)??null,notificationId=element=>{let id3=lifecycleNodeIds.get(element);return id3===void 0&&(id3=nextLifecycleNodeId,nextLifecycleNodeId+=1,lifecycleNodeIds.set(element,id3)),id3},candidates=(root,selector)=>{if(root.nodeType!==Node.ELEMENT_NODE)return[];let element=root,result=[];try{element.matches(selector)&&result.push(element);for(let descendant of Array.from(element.querySelectorAll(selector)))if(result.push(descendant),result.length>=signalLimit)break}catch{}return result},collectUnclassifiedTexts=(root,budget)=>{let texts=[],visit=node=>{if(budget.visited>=recordBudget){budget.truncated=!0;return}if(isInternal(node))return;if(budget.visited+=1,node.nodeType===Node.TEXT_NODE){let parent=node.parentElement,text3=node.textContent?.replace(/\s+/g," ").trim();text3&&parent&&isVisible(parent)&&texts.push(text3.slice(0,512));return}if(node.nodeType!==Node.ELEMENT_NODE)return;let element=node;if(!(isInteractive(element)||isNotification(element)))for(let child of Array.from(node.childNodes))visit(child)};return visit(root),texts},readPlainText=element=>{try{if(!element.isConnected||isInternal(element)||!isVisible(element)||element.closest(`${interactiveSelector},${notificationSelector},script,style,template,noscript`)||element.childNodes.length>1||element.firstChild&&element.firstChild.nodeType!==Node.TEXT_NODE)return null;let style=getComputedStyle(element),textSecurity=style.getPropertyValue("-webkit-text-security");if(textSecurity&&textSecurity!=="none")return null;let text3=(element.textContent||"").replace(/\s+/g," ").trim();if(text3.length>160)return null;let left=0,top=0,right=innerWidth,bottom=innerHeight,clippingOverflow=["hidden","clip","scroll","auto"];for(let ancestor=element;ancestor;ancestor=ancestor.parentElement){let ancestorStyle=ancestor===element?style:getComputedStyle(ancestor),clipsX=clippingOverflow.includes(ancestorStyle.overflowX),clipsY=clippingOverflow.includes(ancestorStyle.overflowY);if(!clipsX&&!clipsY)continue;let box=ancestor.getBoundingClientRect();clipsX&&(left=Math.max(left,box.left),right=Math.min(right,box.right)),clipsY&&(top=Math.max(top,box.top),bottom=Math.min(bottom,box.bottom))}let range2=document.createRange();range2.selectNodeContents(element);let rects=text3?Array.from(range2.getClientRects()):[element.getBoundingClientRect()];if(rects.length===0||rects.length>8)return null;for(let rect of rects){if(rect.width<=0||rect.height<=0||rect.left<left||rect.top<top||rect.right>right||rect.bottom>bottom)return null;let hit=document.elementFromPoint((rect.left+rect.right)/2,(rect.top+rect.bottom)/2);if(!hit||!element.contains(hit)&&!(style.pointerEvents==="none"&&hit.contains(element)))return null}let selector=selectorFor(element);if(!selector||selector.length>512)return null;let matches=document.querySelectorAll(selector);return matches.length!==1||matches[0]!==element?null:{selector,text:text3}}catch{return null}},captureInteractiveBaseline=()=>{let baseline=new Map,visited=0;for(let element of Array.from(document.querySelectorAll(interactiveSelector))){if(visited>=recordBudget)break;if(visited+=1,!isVisible(element))continue;let node=describe(element);node&&baseline.set(node.selector,node)}return baseline},sameInteractiveState=(left,right)=>left.tag===right.tag&&left.role===right.role&&left.name===right.name&&left.value===right.value&&left.checked===right.checked&&left.disabled===right.disabled&&left.expanded===right.expanded,compactUnchangedRecreation=(effect,baseline)=>{if(effect.change!=="appeared"&&effect.change!=="recreated")return effect;let previous=baseline?.get(effect.node.selector);return!previous||!sameInteractiveState(previous,effect.node)?effect:{change:"recreated",node:{selector:effect.node.selector,tag:effect.node.tag,...effect.node.role?{role:effect.node.role}:{},...effect.node.name?{name:effect.node.name}:{}}}};for(let notification of Array.from(document.querySelectorAll(notificationSelector)))notificationVisibility.set(notification,isVisible(notification)),notificationId(notification);let state={schemaVersion:7,document,version:0,batches:[],lastChangeAt:performance.now(),listeners:new Set,selectorFor};state.captureBaseline=()=>{state.baselineVersion=state.version,state.baseline=captureInteractiveBaseline()},state.captureBaseline();let observer=new MutationObserver(records=>{let notifications=[],interactives=[],texts=new Map,mutationCount=0,structuralMutationCount=0,unclassifiedStructuralMutationCount=0,unclassifiedNonTextMutationCount=0,overflow=records.length>recordBudget,processedNodes=0,removedInteractiveCounts=new Map,addedTextCounts=new Map,removedTextCounts=new Map,unclassifiedTraversalBudget={visited:0,truncated:!1},addTextCounts=(counts,texts2)=>{for(let text3 of texts2)counts.set(text3,(counts.get(text3)??0)+1)},interactiveSemanticKey=node=>[node.tag,node.role||"",node.name||""].join("\0");for(let record4 of records.slice(0,recordBudget))if(!(record4.type!=="childList"||isInternal(record4.target))){for(let removedNode of Array.from(record4.removedNodes))if(!isInternal(removedNode))for(let interactive of candidates(removedNode,interactiveSelector)){let node=describe(interactive);if(!node||!node.role&&!node.name)continue;let key=interactiveSemanticKey(node);removedInteractiveCounts.set(key,(removedInteractiveCounts.get(key)??0)+1)}}let pushNotification=(element,phase)=>{let node=describe(element);return!node||notifications.length>=notificationLimit*3?!1:(notifications.push({nodeId:notificationId(element),phase,node,at:performance.now()}),!0)},pushInteractive=(element,change)=>{if(interactives.length>=signalLimit||!isVisible(element))return!1;let node=describe(element);if(!node)return!1;let resolvedChange=change;if(change==="appeared"){let key=interactiveSemanticKey(node),removedCount=removedInteractiveCounts.get(key)??0;removedCount>0&&(resolvedChange="recreated",removedCount===1?removedInteractiveCounts.delete(key):removedInteractiveCounts.set(key,removedCount-1))}return interactives.push({change:resolvedChange,node}),!0},pushTextUpdate=input2=>{let notification=nearestNotification(input2),element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element?.isConnected||!isVisible(element))return!1;let target=notification??element.closest(interactiveSelector);if(!target?.isConnected||!isVisible(target))return!1;let text3=target.textContent?.replace(/\s+/g," ").trim();return!text3||text3.length>160||describe(target)?.name!==text3?!1:notification?pushNotification(target,"updated"):pushInteractive(target,"updated")},pushPlainTextUpdate=input2=>{let element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element)return!1;if(texts.has(element))return!0;if(texts.size>=textLimit)return overflow=!0,!1;let effect=readPlainText(element);return effect?(texts.set(element,effect),!0):!1};for(let record4 of records.slice(0,recordBudget)){if(isInternal(record4.target))continue;if(record4.type==="childList"){let addedNodes=Array.from(record4.addedNodes).filter(node=>!isInternal(node)),removedNodes=Array.from(record4.removedNodes).filter(node=>!isInternal(node));if(addedNodes.length===0&&removedNodes.length===0||(mutationCount+=1,structuralMutationCount+=1,[...addedNodes,...removedNodes].every(node=>node.nodeType===Node.TEXT_NODE)&&(pushTextUpdate(record4.target)||pushPlainTextUpdate(record4.target))))continue;let classified=!1;for(let node of addedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))isVisible(notification3)&&(notificationVisibility.set(notification3,!0),classified=pushNotification(notification3,"appeared")||classified);for(let interactive of candidates(node,interactiveSelector))classified=pushInteractive(interactive,"appeared")||classified}for(let node of removedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))notificationVisibility.set(notification3,!1),classified=pushNotification(notification3,"disappeared")||classified}let notification2=nearestNotification(record4.target);notification2&&isVisible(notification2)&&(classified=pushNotification(notification2,"updated")||classified);let addedTexts=addedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget)),removedTexts=removedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget));unclassifiedTraversalBudget.truncated&&(overflow=!0),!classified&&addedTexts.length===0&&removedTexts.length===0&&(unclassifiedNonTextMutationCount+=1),addTextCounts(addedTextCounts,addedTexts),addTextCounts(removedTextCounts,removedTexts);continue}if(record4.type==="characterData"){mutationCount+=1,structuralMutationCount+=1,!pushTextUpdate(record4.target)&&!pushPlainTextUpdate(record4.target)&&(unclassifiedStructuralMutationCount+=1);continue}mutationCount+=1;let target=record4.target,notification=isNotification(target)?target:nearestNotification(target);if(notification){let visible=isVisible(notification),previous=notificationVisibility.get(notification);notificationVisibility.set(notification,visible),previous===!0&&!visible?pushNotification(notification,"disappeared"):previous===!1&&visible?pushNotification(notification,"appeared"):visible&&pushNotification(notification,"updated")}if(isInteractive(target)&&pushInteractive(target,"updated"),["hidden","aria-hidden","style","class"].includes(record4.attributeName||"")&&isVisible(target))for(let interactive of candidates(target,interactiveSelector))pushInteractive(interactive,"appeared")}let textKeys=new Set([...addedTextCounts.keys(),...removedTextCounts.keys()]);for(let text3 of textKeys)unclassifiedStructuralMutationCount+=Math.abs((addedTextCounts.get(text3)??0)-(removedTextCounts.get(text3)??0));if(unclassifiedStructuralMutationCount+=unclassifiedNonTextMutationCount,mutationCount!==0){state.version+=1,state.lastChangeAt=performance.now(),state.batches.push({version:state.version,mutationCount,structuralMutationCount,unclassifiedStructuralMutationCount,notifications,interactives,texts:Array.from(texts,([element,effect])=>({element,effect})),overflow}),state.batches.length>Math.max(10,maxBatches)&&state.batches.shift();for(let listener of Array.from(state.listeners))listener()}});return observer.observe(document.documentElement||document,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["role","aria-live","aria-hidden","hidden","style","class","disabled","aria-disabled","aria-expanded","aria-selected","aria-checked","value"]}),state.waitSince=(checkpoint,checkpointFocus,quietMs,firstChangeTimeoutMs,timeoutMs)=>{let startedAt=performance.now(),visualSettleDeadline=startedAt+Math.min(timeoutMs,750);return new Promise(resolve16=>{let completed=!1,quietTimer,firstChangeTimer,hardTimer,remainingVisualAnimationMs=()=>{let remainingBudget=visualSettleDeadline-performance.now();if(remainingBudget<=0||typeof document.getAnimations!="function")return 0;let maximumRemaining=0;try{for(let animation of document.getAnimations()){if(animation.playState!=="running"&&!animation.pending)continue;let target=animation.effect?.target;if(target instanceof Element&&target.closest("[data-mearl-overlay]"))continue;let timing=animation.effect?.getComputedTiming?.();if(timing?.iterations===1/0)continue;let currentTime=Number(animation.currentTime),endTime=Number(timing?.endTime),remaining=Number.isFinite(currentTime)&&Number.isFinite(endTime)?Math.max(0,endTime-currentTime):50;maximumRemaining=Math.max(maximumRemaining,remaining)}}catch{return 0}return Math.min(maximumRemaining,remainingBudget)},finish=settledBy=>{if(completed)return;if(settledBy==="quiet"){let animationDelay=remainingVisualAnimationMs();if(animationDelay>0){quietTimer&&clearTimeout(quietTimer),quietTimer=setTimeout(()=>finish("quiet"),Math.max(16,animationDelay));return}}completed=!0,quietTimer&&clearTimeout(quietTimer),firstChangeTimer&&clearTimeout(firstChangeTimer),hardTimer&&clearTimeout(hardTimer),state.listeners.delete(onChange);let available=state.batches.filter(batch=>batch.version>checkpoint),oldestVersion=state.batches[0]?.version??state.version,batchOverflow=available.length>0&&checkpoint<oldestVersion-1||available.some(batch=>batch.overflow),mutationCount=available.reduce((total,batch)=>total+batch.mutationCount,0),structuralMutationCount=available.reduce((total,batch)=>total+batch.structuralMutationCount,0),unclassifiedStructuralMutationCount=available.reduce((total,batch)=>total+(batch.unclassifiedStructuralMutationCount??batch.structuralMutationCount),0),latestInteractives=new Map;for(let effect of available.flatMap(batch=>batch.interactives))latestInteractives.set(effect.node.selector,effect);let baseline=state.baselineVersion===checkpoint?state.baseline:void 0,interactives=Array.from(latestInteractives.values()).map(effect=>compactUnchangedRecreation(effect,baseline)).slice(-signalLimit),latestTexts=new Map;for(let batch of available)for(let entry of batch.texts??[])latestTexts.set(entry.element,entry.effect);let texts=[],incompleteText=latestTexts.size>textLimit;for(let[element,effect]of latestTexts){let current=readPlainText(element);if(!element.isConnected)try{let matches=document.querySelectorAll(effect.selector);matches.length===1&&(current=readPlainText(matches[0]))}catch{}if(!current||current.selector!==effect.selector||current.text!==effect.text){incompleteText=!0;continue}texts.length<textLimit&&texts.push(current)}let notificationStates=new Map;for(let event of available.flatMap(batch=>batch.notifications)){let entry=notificationStates.get(event.nodeId)??{lastAt:event.at},phase=event.phase;entry[phase]=event,phase==="updated"&&entry.appeared&&(entry.appeared={...entry.appeared,node:event.node}),entry.lastAt=event.at,notificationStates.set(event.nodeId,entry)}let roundTime=value=>Math.round(value*1e3)/1e3,notifications=Array.from(notificationStates.values()).sort((left,right)=>left.lastAt-right.lastAt).map(entry=>{if(entry.appeared&&entry.disappeared){let appearedAt=Math.max(0,entry.appeared.at-startedAt),disappearedAt=Math.max(appearedAt,entry.disappeared.at-startedAt);return{change:"transient",node:entry.disappeared.node.name?entry.disappeared.node:entry.appeared.node,appearedAt:roundTime(appearedAt),disappearedAt:roundTime(disappearedAt),duration:roundTime(Math.max(0,entry.disappeared.at-entry.appeared.at))}}return entry.disappeared?{change:"disappeared",node:entry.disappeared.node}:entry.appeared?{change:"appeared",node:entry.appeared.node}:{change:"updated",node:entry.updated.node}}).slice(-notificationLimit),currentFocus=document.activeElement,currentFocusSelector=selectorFor(currentFocus),focus=currentFocusSelector&¤tFocusSelector!==checkpointFocus?describe(currentFocus):null,distinctInteractives=focus?interactives.filter(effect=>effect.node.selector!==focus.selector):interactives,overflow=batchOverflow||latestInteractives.size>signalLimit||notificationStates.size>notificationLimit||latestTexts.size>textLimit,snapshotReasons=[];settledBy==="timeout"&&snapshotReasons.push("observation-timeout"),overflow&&snapshotReasons.push("observation-overflow"),(structuralMutationCount>0&&unclassifiedStructuralMutationCount>0||incompleteText)&&snapshotReasons.push("unclassified-structure"),resolve16({mode:"delta",scope:"main-document",checkpoint,version:state.version,elapsed:roundTime(performance.now()-startedAt),settledBy,url:location.href,title:document.title,changed:mutationCount>0||!!focus,effects:{notifications,interactives:distinctInteractives,...texts.length>0?{texts}:{},...focus?{focus}:{}},mutationCount,overflow,fullSnapshotRecommended:snapshotReasons.length>0,snapshotReasons})},scheduleQuiet=()=>{quietTimer&&clearTimeout(quietTimer);let remaining=Math.max(0,quietMs-(performance.now()-state.lastChangeAt));quietTimer=setTimeout(()=>finish("quiet"),remaining)},onChange=()=>{state.version<=checkpoint||(firstChangeTimer&&clearTimeout(firstChangeTimer),scheduleQuiet())};timeoutMs<=0?finish(state.version>checkpoint?"quiet":"no-change"):(hardTimer=setTimeout(()=>finish("timeout"),timeoutMs),state.listeners.add(onChange),state.version>checkpoint?scheduleQuiet():firstChangeTimer=setTimeout(()=>finish("no-change"),firstChangeTimeoutMs))})},state.observer=observer,pageGlobal[globalKey]=state,{version:state.version,url:location.href,title:document.title,focus:selectorFor(document.activeElement)}}function disposePageObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_PAGE_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),state.listeners?.clear?.(),delete pageGlobal[globalKey])}var init_pageObserver=__esm({"../browser-core/dist/pageObserver.js"(){"use strict"}});function createNavigationSettlementTracker(options){let startedAt=performance.now(),trackNetwork=options.trackNetwork===!0,networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),contentReadyAfterMs=Math.min(Math.max(options.contentReadyAfterMs??5e3,0),2e4),networkAvailable=trackNetwork&&options.networkAvailable!==!1,started=!1,documentComplete=!1,documentCompletedAt=0,disposed=!1,completed,latestUrl=options.urlBefore,latestTitle="",lastNetworkActivity=0,networkActivityObserved=!1,networkIdleTimer,contentTimer,contentPollInFlight=!1,latestContentSample,pendingRequests2=new Set,startWaiters=new Set,resultWaiters=new Set,pollTimers=new Set,updatePage=(url,title)=>{url&&(latestUrl=url),title&&(latestTitle=title)},notifyStarted=()=>{if(!started){started=!0;for(let waiter of startWaiters)waiter(!0);startWaiters.clear()}},finish=(loaded,ready,settledBy)=>{if(!(completed||disposed)){networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer),completed={mode:"navigation",urlBefore:options.urlBefore,urlAfter:latestUrl,title:latestTitle,elapsed:Math.round((performance.now()-startedAt)*1e3)/1e3,loaded,ready,settledBy,pendingRequests:pendingRequests2.size,...latestContentSample?{content:latestContentSample}:{},fullSnapshotRecommended:!0,snapshotReasons:["navigation"]};for(let waiter of resultWaiters)waiter(completed);resultWaiters.clear()}},scheduleReadinessCheck=(delayMs,mode)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||(contentTimer&&clearTimeout(contentTimer),contentTimer=setTimeout(async()=>{if(contentTimer=void 0,completed||disposed||contentPollInFlight)return;if(mode==="content-stable"&&pendingRequests2.size===0){scheduleNetworkCompletion();return}if(mode==="network-idle"&&pendingRequests2.size>0){scheduleContentCompletion();return}let elapsed=performance.now()-startedAt;if(mode==="content-stable"&&elapsed<contentReadyAfterMs){scheduleReadinessCheck(contentReadyAfterMs-elapsed,mode);return}contentPollInFlight=!0;try{if(latestContentSample=await options.sampleContent?.(),latestContentSample?.ready){finish(!0,!0,pendingRequests2.size>0?"content-stable":"network-idle");return}}catch{latestContentSample=void 0}finally{contentPollInFlight=!1}if(pendingRequests2.size===0&&(!latestContentSample||!latestContentSample.meaningful&&!latestContentSample.skeletonVisible)){finish(!0,!0,"network-idle");return}scheduleReadinessCheck(200,pendingRequests2.size>0?"content-stable":"network-idle")},Math.max(0,delayMs)))},scheduleNetworkCompletion=()=>{if(completed||disposed||!started||!documentComplete)return;if(!trackNetwork||!networkAvailable){finish(!0,!0,"load");return}if(networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,pendingRequests2.size>0)return;let quietSince=Math.max(documentCompletedAt,lastNetworkActivity),remaining=networkIdleMs-(performance.now()-quietSince);if(remaining<=0){options.sampleContent?scheduleReadinessCheck(0,"network-idle"):finish(!0,!0,"network-idle");return}networkIdleTimer=setTimeout(scheduleNetworkCompletion,remaining)},scheduleContentCompletion=(delayMs=0)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||pendingRequests2.size===0||scheduleReadinessCheck(delayMs,"content-stable")};return{hasStarted:()=>started,hasNetworkActivity:()=>networkActivityObserved,updatePage,markStarted:(url,title)=>{updatePage(url,title),notifyStarted()},markDocumentComplete:(url,title)=>{updatePage(url,title),notifyStarted(),documentComplete=!0,documentCompletedAt=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion()},requestStarted:requestId=>{!trackNetwork||disposed||(pendingRequests2.add(requestId),networkActivityObserved=!0,lastNetworkActivity=performance.now(),networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,scheduleContentCompletion())},requestFinished:requestId=>{pendingRequests2.delete(requestId)&&(lastNetworkActivity=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion())},setNetworkAvailable:available=>{networkAvailable=trackNetwork&&available,networkAvailable||(pendingRequests2.clear(),lastNetworkActivity=0,scheduleNetworkCompletion())},waitForStart:timeoutMs=>started?Promise.resolve(!0):timeoutMs<=0||disposed?Promise.resolve(!1):new Promise(resolve16=>{let initialDeadline=performance.now()+timeoutMs,hardDeadline=initialDeadline+4e3,timer,waiter=didStart=>{clearTimeout(timer),startWaiters.delete(waiter),resolve16(didStart)},check=()=>{if(started){waiter(!0);return}let now=performance.now(),networkBusy=networkAvailable&&(pendingRequests2.size>0||networkActivityObserved&&now-lastNetworkActivity<750);if(disposed||now>=hardDeadline||now>=initialDeadline&&!networkBusy){waiter(!1);return}timer=setTimeout(check,50)};startWaiters.add(waiter),check()}),waitForNetworkIdle:timeoutMs=>{let waitStartedAt=performance.now();return new Promise(resolve16=>{let finishWait=(ready,settledBy)=>{resolve16({ready,settledBy,pendingRequests:pendingRequests2.size,elapsed:Math.round((performance.now()-waitStartedAt)*1e3)/1e3})},check=()=>{if(disposed||!networkAvailable){finishWait(!1,"unavailable");return}let now=performance.now();if(pendingRequests2.size===0&&networkActivityObserved&&now-lastNetworkActivity>=networkIdleMs){finishWait(!0,"network-idle");return}if(now-waitStartedAt>=timeoutMs){finishWait(!1,"timeout");return}let timer=setTimeout(()=>{pollTimers.delete(timer),check()},50);pollTimers.add(timer)};check()})},waitForResult:timeoutMs=>completed?Promise.resolve(completed):new Promise(resolve16=>{let waiter=result=>{clearTimeout(timer),resultWaiters.delete(waiter),resolve16(result)},timer=setTimeout(()=>{resultWaiters.delete(waiter),finish(documentComplete,!1,"timeout"),completed&&resolve16(completed)},timeoutMs);resultWaiters.add(waiter)}),dispose:()=>{disposed=!0,networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer);for(let timer of pollTimers)clearTimeout(timer);pollTimers.clear();for(let waiter of startWaiters)waiter(!1);startWaiters.clear()}}}var init_navigationTracker=__esm({"../browser-core/dist/navigationTracker.js"(){"use strict"}});function isPageActionPreconditionError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="precondition"}function isPageActionDispatchUncertainError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="dispatch-uncertain"}function withPageActionDispatchAttempt(error,attempt){return isPageActionDispatchUncertainError(error)?new PageActionDispatchUncertainError(error.message,{cause:error,attempt:{...error.pageActionAttempt??{},...attempt}}):error}async function dispatchPairedPageInputCommands(sendPress,sendRelease){let settle=async send=>{try{return await send(),{status:"fulfilled",value:void 0}}catch(reason){return{status:"rejected",reason}}},pressResultPromise=settle(sendPress);await new Promise(resolve16=>setTimeout(resolve16,0));let releaseResultPromise=settle(sendRelease),[pressResult,releaseResult]=await Promise.all([pressResultPromise,releaseResultPromise]),failure=pressResult.status==="rejected"?pressResult.reason:releaseResult.status==="rejected"?releaseResult.reason:void 0;if(failure===void 0)return;let describeStatus=result=>result.status==="fulfilled"?"acknowledged":isPageActionDispatchUncertainError(result.reason)?"uncertain":"failed";throw withPageActionDispatchAttempt(failure,{inputSequence:{press:describeStatus(pressResult),release:describeStatus(releaseResult)}})}function asPageActionPreconditionError(error){return isPageActionPreconditionError(error)?error:new PageActionPreconditionError(error instanceof Error?error.message:String(error),{cause:error})}function checkPageActionPrecondition(check){try{return check()}catch(error){throw asPageActionPreconditionError(error)}}function describePageActionFailure(error){return{error:error instanceof Error?error.message:String(error),...isPageActionPreconditionError(error)||isPageActionDispatchUncertainError(error)?{stage:error.pageActionFailureStage}:{},...isPageActionDispatchUncertainError(error)&&error.pageActionAttempt?{attempt:error.pageActionAttempt}:{}}}function isPageActAction(action){return PAGE_ACT_ACTIONS.includes(action)}function shouldObservePageAction(action,data){if(!isPageActAction(action))return!1;let diagnosticsSetting=data?.diagnostics,diagnosticsEnabled=diagnosticsSetting===!0||diagnosticsSetting!==null&&typeof diagnosticsSetting=="object"&&!Array.isArray(diagnosticsSetting);return action==="page_eval"?!!(diagnosticsEnabled||data?.observe&&typeof data.observe=="object"&&!Array.isArray(data.observe)):data?.observe!==!1||diagnosticsEnabled}function splitObservedActionPayload(action,data){let{observe,diagnostics,...actionData}=data??{},setting=diagnostics,resolvedDiagnostics=setting===!1?void 0:setting===!0?DEFAULT_PAGE_DIAGNOSTICS:setting&&typeof setting=="object"&&!Array.isArray(setting)?setting:void 0;return observe===!1?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:action==="page_eval"&&(!observe||typeof observe!="object")?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:{actionData,observe:observe&&typeof observe=="object"&&!Array.isArray(observe)?observe:{},diagnostics:resolvedDiagnostics}}function unavailableObservation(checkpoint,error){return{mode:"unavailable",checkpoint:checkpoint.version,urlBefore:checkpoint.url,error:error instanceof Error?error.message:String(error),fullSnapshotRecommended:!0,snapshotReasons:["observer-unavailable"]}}function addSnapshotReason(observation,reason){if(observation.mode==="navigation")return observation;let reasons=new Set([...observation.snapshotReasons??[],reason]);return{...observation,fullSnapshotRecommended:!0,snapshotReasons:Array.from(reasons)}}function isNavigationInterruptedActionFailure(failure){return!failure||failure.stage==="precondition"?!1:/Detached while handling command|Execution context was destroyed|Cannot find context with specified id|Inspected target navigated or closed/i.test(failure.error)}function compactObservationResponse(observation,checkpoint){if(observation.mode!=="delta")return observation;let{url,title,...compact}=observation;return{...compact,...url!==checkpoint.url?{url}:{},...title!==checkpoint.title?{title}:{}}}async function runPageAct(input2,dependencies){let{action,actionData={},observe={}}=input2;if(!PAGE_ACT_ACTIONS.includes(action))throw new Error(`observed page action must be one of: ${PAGE_ACT_ACTIONS.join(", ")}`);if(!actionData||typeof actionData!="object"||Array.isArray(actionData))throw new Error("actionData must be an object");let typedAction=action,dialogs=dependencies.dialogs,guarded=work=>dialogs?dialogs.command(work):work(),dialogResult=(failure,data)=>({action:{name:typedAction,success:!failure,...data!==void 0?{data}:{},...failure},...dialogs?.info()?{dialog:dialogs.info()}:{}}),checkpoint;try{checkpoint=await guarded(()=>dependencies.startObservation())}catch(error){if(!dialogs?.pending)throw error;return dialogResult({...describePageActionFailure(error),stage:"precondition"})}let navigationOptions=resolveNavigationWaitOptions(observe),sourceTabId=typeof actionData.tabId=="number"&&Number.isInteger(actionData.tabId)?actionData.tabId:void 0,navigationObserver=await dependencies.startNavigationObserver({urlBefore:checkpoint.url,trackNetwork:!0,networkIdleMs:navigationOptions.networkIdleMs,contentReadyAfterMs:navigationOptions.contentReadyAfterMs,trackOpenedTabs:typedAction==="page_click"||typedAction==="page_press"||typedAction==="page_eval",sourceTabId}).catch(()=>null),actionResult,actionFailure;try{actionResult=await dependencies.executeAction(typedAction,actionData)}catch(error){actionFailure=describePageActionFailure(error)}let dispose=()=>Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]);if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);if(actionFailure?.stage==="precondition")return await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]),{action:{name:typedAction,success:!1,error:actionFailure.error,stage:actionFailure.stage}};let observation;try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);let navigationInterruptedAction=isNavigationInterruptedActionFailure(actionFailure);navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0);try{if(dependencies.detectNavigation&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&shouldWaitForPotentialNavigation(typedAction,observation)){let detectedNavigation=await dependencies.detectNavigation(checkpoint,navigationOptions.graceMs).catch(()=>null);detectedNavigation&&(observation=detectedNavigation,navigationInterruptedAction&&(actionFailure=void 0))}if(navigationObserver&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&(navigationObserver.hasStarted()||shouldWaitForPotentialNavigation(typedAction,observation))&&(navigationObserver.hasStarted()||await guarded(()=>navigationObserver.waitForStart(navigationOptions.graceMs)))&&(observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs))),navigationObserver&&(actionFailure===void 0||navigationInterruptedAction)&&observation.mode!=="navigation"&&navigationObserver.hasNetworkActivity()){let network=await guarded(()=>navigationObserver.waitForNetworkIdle(navigationOptions.timeoutMs));if(navigationObserver.hasStarted())observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs));else{try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}observation.mode!=="navigation"&&(observation.network=network,network.ready||(observation=addSnapshotReason(observation,"network-pending")))}}if(navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0),dependencies.finalizeObservation)try{observation=await guarded(()=>dependencies.finalizeObservation(observation))}catch{}if(navigationObserver){let openedTabs=await guarded(()=>navigationObserver.getOpenedTabs(navigationOptions.timeoutMs)).catch(()=>[]);openedTabs.length>0&&(observation={...observation,openedTabs})}}catch(error){if(!dialogs?.pending)throw error;return dialogResult(actionFailure,actionResult)}finally{await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())])}return dialogs?.pending?dialogResult(actionFailure,actionResult):{action:{name:typedAction,success:actionFailure===void 0,...actionResult!==void 0?{data:actionResult}:{},...actionFailure||{}},observation:compactObservationResponse(observation,checkpoint)}}var DEFAULT_PAGE_DIAGNOSTICS,PageActionPreconditionError,PageActionDispatchUncertainError,init_pageAct=__esm({"../browser-core/dist/pageAct.js"(){"use strict";init_pageObserver();init_browserActionProtocol();DEFAULT_PAGE_DIAGNOSTICS={logs:!0,requests:!0},PageActionPreconditionError=class extends Error{pageActionFailureStage="precondition";constructor(message,options){super(message,options),this.name="PageActionPreconditionError"}},PageActionDispatchUncertainError=class extends Error{pageActionFailureStage="dispatch-uncertain";pageActionAttempt;constructor(message,options){super(message,options),this.name="PageActionDispatchUncertainError",this.pageActionAttempt=options?.attempt}}}});function pageDialogSnapshot(dialogs,mode="full",maxChars=25e3){let dialog=dialogs.info(maxChars);return dialog?{snapshot:`[native ${dialog.type} dialog]`,mode,elementCount:0,outputNodeCount:0,dialog}:void 0}var PageDialogInterruptedError,PageDialogState,init_pageDialog=__esm({"../browser-core/dist/pageDialog.js"(){"use strict";init_pageAct();PageDialogInterruptedError=class extends Error{pageActionFailureStage;code="DIALOG_PENDING";dialog;details;constructor(dialog,pageActionFailureStage="dispatch-uncertain"){super(dialog?`DIALOG_PENDING: native ${dialog.type} dialog ${dialog.id}. Read it with page_snapshot, then use page_press with dialogId and Enter/Escape.`:"DIALOG_PENDING: a previous page operation was interrupted; observe the page before continuing."),this.pageActionFailureStage=pageActionFailureStage,this.name="PageDialogInterruptedError",this.dialog=dialog,this.details={...dialog?{dialog}:{}}}},PageDialogState=class{epoch=0;prefix=crypto.randomUUID();current;defaultPromptTruncated=!1;work=new Set;listeners=new Set;handling;onIdle;get pending(){return this.current!==void 0}get busy(){return this.work.size>0||this.handling!==void 0}info(maxChars=240){if(!this.current)return;let limit=Number.isFinite(maxChars)?Math.max(0,Math.min(maxChars,1e5)):240,{message,defaultPrompt,...rest}=this.current;return{...rest,message:message.slice(0,limit),...defaultPrompt?{defaultPrompt:defaultPrompt.slice(0,limit)}:{},...message.length>limit||(defaultPrompt?.length??0)>limit?{truncated:!0}:{}}}opened(event){if(["alert","confirm","prompt","beforeunload"].includes(String(event.type))){this.defaultPromptTruncated=typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536,this.current={id:`${this.prefix}:${++this.epoch}`,type:event.type,message:typeof event.message=="string"?event.message.slice(0,65536):"",...typeof event.defaultPrompt=="string"&&event.defaultPrompt?{defaultPrompt:event.defaultPrompt.slice(0,65536)}:{},...typeof event.message=="string"&&event.message.length>65536||typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536?{truncated:!0}:{}};for(let listener of this.listeners)listener()}}closed(){this.current=void 0,this.notifyIdle()}invalidate(){this.epoch+=1,this.current=void 0;for(let listener of this.listeners)listener();this.notifyIdle()}assertCanDispatch(){if(this.pending||[...this.work].some(entry=>entry.epoch!==this.epoch))throw new PageDialogInterruptedError(this.info(),"precondition")}execute(work,interrupt=!0){this.assertCanDispatch();let entry={epoch:this.epoch};this.work.add(entry);let started=!1,release=()=>{this.work.delete(entry),this.notifyIdle()},start=()=>(started=!0,Promise.resolve().then(()=>(this.assertCanDispatch(),work())).finally(release));return(interrupt?this.race(start):start()).finally(()=>{started||release()})}command(work){return this.assertCanDispatch(),this.race(work)}race(work){if(this.pending)return Promise.reject(new PageDialogInterruptedError(this.info()));let epoch2=this.epoch;return new Promise((resolve16,reject)=>{let changed=()=>{epoch2!==this.epoch&&(this.listeners.delete(changed),reject(new PageDialogInterruptedError(this.info())))};this.listeners.add(changed);let result;try{result=work()}catch(error){this.listeners.delete(changed),reject(error);return}Promise.resolve(result).then(value=>{this.listeners.delete(changed),resolve16(value)},error=>{this.listeners.delete(changed),reject(error)})})}async press(input2,send){let dialog=this.current;if(!input2.dialogId||dialog?.id!==input2.dialogId)throw new Error("page_press: dialogId is stale or no native dialog is open. Run page_snapshot.");if(this.handling)throw new Error("page_press: this native dialog is already being handled.");if(!["Enter","Escape"].includes(input2.key)||input2.selector!==void 0||input2.modifiers?.length||input2.pressMode&&input2.pressMode!=="auto")throw new Error("page_press: dialogId requires Enter/Escape without selector, modifiers, or an explicit pressMode.");if(input2.promptText!==void 0&&(typeof input2.promptText!="string"||dialog.type!=="prompt"||input2.key!=="Enter"))throw new Error("page_press: promptText is only valid when accepting a native prompt.");let acceptsPrompt=dialog.type==="prompt"&&input2.key==="Enter";if(acceptsPrompt&&input2.promptText===void 0&&this.defaultPromptTruncated)throw new Error("page_press: the native prompt default was truncated. Specify promptText explicitly.");this.handling=dialog.id;try{return await send({accept:input2.key==="Enter",...acceptsPrompt?{promptText:input2.promptText??dialog.defaultPrompt??""}:{}}),{pressed:!0,key:input2.key,dispatchMode:"native-dialog"}}catch(error){throw new PageActionDispatchUncertainError("page_press: native dialog handling was not acknowledged. Read page_snapshot before trying again.",{cause:error})}finally{this.handling=void 0,this.notifyIdle()}}notifyIdle(){!this.pending&&!this.busy&&this.onIdle?.()}}}});var BackendNodeRefRegistry,init_backendNodeRefs=__esm({"../browser-core/dist/backendNodeRefs.js"(){"use strict";BackendNodeRefRegistry=class{maxDeltaRefs;nextRefId=0;nextMutationId=0;documentGeneration=0;entries=new Map;refsByBackendNodeId=new Map;deltaRefOrder=[];constructor(maxDeltaRefs=512){if(this.maxDeltaRefs=maxDeltaRefs,!Number.isInteger(maxDeltaRefs)||maxDeltaRefs<1)throw new Error("maxDeltaRefs must be a positive integer")}resolve(ref){return this.entries.get(ref)?.entry}registerDelta(entry){return this.registerDeltaForDocument(entry,this.documentGeneration)}beginDelta(){let documentGeneration=this.documentGeneration;return{register:entry=>this.registerDeltaForDocument(entry,documentGeneration)}}registerDeltaForDocument(entry,documentGeneration){this.assertDocumentGeneration(documentGeneration);let mutationId=this.allocateMutationId(),existingRef=this.refsByBackendNodeId.get(entry.backendNodeId);if(existingRef&&this.entries.has(existingRef))return this.entries.set(existingRef,{entry,mutationId}),existingRef;let ref=this.allocateRef();return this.entries.set(ref,{entry,mutationId}),this.refsByBackendNodeId.set(entry.backendNodeId,ref),this.deltaRefOrder.push(ref),this.evictOverflowingDeltaRefs(),ref}beginSnapshot(){let documentGeneration=this.documentGeneration,startedAtMutationId=this.nextMutationId,committed=!1,candidates=new Map;return{register:entry=>{if(committed)throw new Error("snapshot ref allocator has already been committed");let ref=this.allocateRef();return candidates.set(ref,entry),ref},commit:outputRefs=>{if(committed)throw new Error("snapshot ref allocator has already been committed");committed=!0,this.assertDocumentGeneration(documentGeneration);let entries=new Map,refsByBackendNodeId=new Map,snapshotMutationId=this.allocateMutationId();for(let[ref,entry]of candidates)outputRefs.has(ref)&&(entries.set(ref,{entry,mutationId:snapshotMutationId}),refsByBackendNodeId.set(entry.backendNodeId,ref));for(let[ref,record4]of this.entries)record4.mutationId<=startedAtMutationId||(entries.set(ref,record4),refsByBackendNodeId.set(record4.entry.backendNodeId,ref));this.entries=entries,this.refsByBackendNodeId=refsByBackendNodeId,this.deltaRefOrder=this.deltaRefOrder.filter(ref=>entries.has(ref))}}}delete(ref){let record4=this.entries.get(ref);if(!record4)return;this.entries.delete(ref),this.refsByBackendNodeId.get(record4.entry.backendNodeId)===ref&&this.refsByBackendNodeId.delete(record4.entry.backendNodeId);let deltaIndex=this.deltaRefOrder.indexOf(ref);deltaIndex>=0&&this.deltaRefOrder.splice(deltaIndex,1)}clearDocument(){this.documentGeneration+=1,this.entries.clear(),this.refsByBackendNodeId.clear(),this.deltaRefOrder=[]}get size(){return this.entries.size}allocateRef(){return this.nextRefId+=1,`@e${this.nextRefId}`}allocateMutationId(){return this.nextMutationId+=1,this.nextMutationId}assertDocumentGeneration(documentGeneration){if(documentGeneration!==this.documentGeneration)throw new Error("page document changed while refs were being collected")}evictOverflowingDeltaRefs(){for(;this.deltaRefOrder.length>this.maxDeltaRefs;){let ref=this.deltaRefOrder.shift();ref&&this.delete(ref)}}}}});async function resolveUniqueBackendNodeIds(sendCommand,selectors){if(selectors.length===0)return new Map;nextObjectGroupId+=1;let objectGroup=`mearl-page-effect-refs-${nextObjectGroupId}`,expression=`(${function(values){return values.map(selector=>{try{let matches=document.querySelectorAll(selector);return matches.length===1?matches[0]:null}catch{return null}})}.toString()})(${JSON.stringify(selectors)})`;try{let evaluated=await sendCommand("Runtime.evaluate",{expression,returnByValue:!1,objectGroup});if(evaluated.exceptionDetails)return new Map;let arrayObjectId=evaluated.result?.objectId;if(!arrayObjectId)return new Map;let properties=await sendCommand("Runtime.getProperties",{objectId:arrayObjectId,ownProperties:!0,accessorPropertiesOnly:!1,generatePreview:!1}),valuesByIndex=new Map;for(let property of properties.result??[]){let index=Number(property.name),objectId=property.value?.objectId;!Number.isInteger(index)||index<0||!objectId||valuesByIndex.set(index,objectId)}let resolvedPairs=await Promise.all(selectors.map(async(selector,index)=>{let objectId=valuesByIndex.get(index);if(!objectId)return null;try{let backendNodeId=(await sendCommand("DOM.describeNode",{objectId})).node?.backendNodeId;return typeof backendNodeId=="number"?[selector,backendNodeId]:null}catch{return null}}));return new Map(resolvedPairs.filter(pair=>pair!==null))}finally{await sendCommand("Runtime.releaseObjectGroup",{objectGroup}).catch(()=>{})}}async function enrichPageChangeSetWithRefs(observation,registry2,resolveBackendNodeIds,createEntry){let candidates=[...observation.effects.interactives.map(effect=>effect.node),...observation.effects.focus?[observation.effects.focus]:[]],selectors=Array.from(new Set(candidates.filter(node=>!node.ref).map(node=>node.selector)));if(selectors.length===0)return observation;let deltaRefs=registry2.beginDelta(),backendNodeIds=await resolveBackendNodeIds(selectors);if(backendNodeIds.size===0)return observation;let enrichNode=node=>{if(node.ref)return node;let backendNodeId=backendNodeIds.get(node.selector);return backendNodeId===void 0?node:{...node,ref:deltaRefs.register(createEntry(node,backendNodeId))}};return{...observation,effects:{...observation.effects,interactives:observation.effects.interactives.map(effect=>({...effect,node:enrichNode(effect.node)})),...observation.effects.focus?{focus:enrichNode(observation.effects.focus)}:{}}}}var nextObjectGroupId,init_pageEffectRefs=__esm({"../browser-core/dist/pageEffectRefs.js"(){"use strict";nextObjectGroupId=0}});function boundedNumber(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolvePageWaitInput(input2){let hasTime=input2.time!==void 0,selector=typeof input2.selector=="string"?input2.selector.trim():"",text3=typeof input2.text=="string"?input2.text.trim():"",condition=typeof input2.condition=="string"?input2.condition.trim():"";if([hasTime&&"time",selector&&"selector",text3&&"text",condition&&"condition"].filter(Boolean).length!==1)throw new Error('page_wait requires exactly one of "time", "selector", "text", or "condition".');let timeout=boundedNumber(input2.timeout,1e4,1,3e5),interval=boundedNumber(input2.interval,200,50,5e3);if(input2.state!==void 0&&!selector)throw new Error('page_wait "state" is only supported with "selector".');if(input2.exact!==void 0&&!text3)throw new Error('page_wait "exact" is only supported with "text".');if(input2.state!==void 0&&!["attached","detached","visible","hidden"].includes(input2.state))throw new Error("page_wait state must be one of attached, detached, visible, hidden.");if(hasTime){let rawTime=input2.time;if(!Number.isFinite(Number(rawTime))||Number(rawTime)<0)throw new Error("page_wait time must be a non-negative number.");return{mode:"time",time:boundedNumber(rawTime,0,0,6e4),timeout,interval}}if(selector){if(validatePageElementSelector(selector,"page_wait"),selector.startsWith("@")||selector==="$0")throw new Error("page_wait selector must be native CSS because snapshot refs and $0 are point-in-time targets.");return{mode:"selector",selector,state:input2.state??"attached",timeout,interval}}return text3?{mode:"text",text:text3,exact:input2.exact??!1,timeout,interval}:{mode:"condition",condition,timeout,interval}}function buildPageWaitExpression(options){return options.mode==="condition"?options.condition:options.mode==="selector"?`(() => {
|
|
42
|
+
`).filter(line=>!line.startsWith("... [")).length:0}}var SKIP_ROLES,ALWAYS_SKIP_ROLES,INTERACTIVE_ROLES,CHECKABLE_AX_ROLES,init_axSnapshot=__esm({"../browser-core/dist/axSnapshot.js"(){"use strict";SKIP_ROLES=new Set(["none","generic","InlineTextBox","LineBreak","paragraph","Section","LabelText"]),ALWAYS_SKIP_ROLES=new Set(["InlineTextBox","LineBreak","graphics-symbol","graphics-document"]),INTERACTIVE_ROLES=new Set(["button","checkbox","combobox","gridcell","link","listbox","menuitem","menuitemcheckbox","menuitemradio","option","radio","scrollbar","searchbox","slider","spinbutton","switch","tab","textbox","treeitem"]);CHECKABLE_AX_ROLES=new Set(["checkbox","menuitemcheckbox","menuitemradio","radio","switch"])}});function resolvePageObservationWaitOptions(options={}){let quietMs=Math.min(Math.max(options.quietMs??100,20),2e3),firstChangeTimeoutMs=Math.min(Math.max(options.firstChangeTimeoutMs??500,quietMs),1e4);return{quietMs,firstChangeTimeoutMs,timeoutMs:Math.min(Math.max(options.timeoutMs??3e3,firstChangeTimeoutMs),3e4)}}function shouldWaitForPotentialNavigation(action,observation){return action!=="page_click"&&action!=="page_press"?!1:observation.mode!=="delta"||observation.settledBy!=="quiet"?!0:!((observation.effects?.notifications?.length??0)>0||(observation.effects?.interactives?.length??0)>0||observation.effects?.focus!==void 0)&&(observation.mutationCount??0)<=1}function isPotentialNavigationRequest(resourceType,_url=""){let normalizedType=resourceType.toLowerCase();return normalizedType==="xhr"||normalizedType==="fetch"}function resolveNavigationWaitOptions(options={}){let timeoutMs=Math.min(Math.max(options.navigationTimeoutMs??15e3,1e3),3e4),networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),maximumContentDelay=Math.max(0,timeoutMs-networkIdleMs-250),requestedContentDelay=options.contentReadyAfterMs??Math.min(5e3,timeoutMs/2);return{graceMs:Math.min(Math.max(options.navigationGraceMs??1e3,0),5e3),timeoutMs,networkIdleMs,contentReadyAfterMs:Math.min(Math.max(requestedContentDelay,0),maximumContentDelay)}}function samplePageReadinessInPage(quietMs=500){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey],now=performance.now();if(!state||state.document!==document){state={document,lastMutation:now,observer:new MutationObserver(()=>{state.lastMutation=performance.now()})};let root=document.body??document.documentElement;root&&state.observer.observe(root,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:["aria-busy","data-loading","class","hidden","style"]}),pageGlobal[globalKey]=state}let isVisible=element=>{let style=getComputedStyle(element);if(style.display==="none"||style.visibility==="hidden"||style.opacity==="0")return!1;let rect=element.getBoundingClientRect();return rect.width>0&&rect.height>0},visibleCount=(selector,limit)=>{let count=0;for(let element of Array.from(document.querySelectorAll(selector)))if(isVisible(element)&&(count+=1,count>=limit))break;return count},textLength=(document.body?.innerText??"").replace(/\s+/g,"").length,interactiveCount=visibleCount('a[href],button,input,select,textarea,[role="button"],[role="link"],[tabindex]',20),skeletonVisible=visibleCount('[aria-busy="true"],[data-loading="true"],[class*="skeleton" i],[class*="shimmer" i]',1)>0,quietFor=Math.max(0,now-state.lastMutation),meaningful=textLength>=80||interactiveCount>=3;return{ready:document.readyState==="complete"&&meaningful&&!skeletonVisible&&quietFor>=quietMs,meaningful,skeletonVisible,quietFor:Math.round(quietFor*1e3)/1e3,textLength,interactiveCount}}function disposePageReadinessObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),delete pageGlobal[globalKey])}function installPageObserverInPage(maxBatches=50){let globalKey="__MEARL_PAGE_OBSERVER__",pageGlobal=globalThis,existing=pageGlobal[globalKey];if(existing&&existing.schemaVersion===7&&existing.document===document&&existing.version>=0)return existing.captureBaseline?.(),{version:existing.version,url:location.href,title:document.title,focus:existing.selectorFor(document.activeElement)};existing?.observer?.disconnect?.();let interactiveSelector=["a[href]","button","input","select","textarea","summary",'[contenteditable="true"]',"[tabindex]",'[role="button"]','[role="link"]','[role="tab"]','[role="menuitem"]','[role="option"]','[role="checkbox"]','[role="radio"]','[role="switch"]','[role="combobox"]','[role="textbox"]'].join(","),notificationSelector=['[role="alert"]','[role="status"]','[aria-live]:not([aria-live="off"])','[class*="toast" i]','[class*="snackbar" i]'].join(","),recordBudget=160,signalLimit=12,notificationLimit=8,textLimit=8,lifecycleNodeIds=new WeakMap,notificationVisibility=new WeakMap,nextLifecycleNodeId=1,escapeCss=value=>pageGlobal.CSS&&typeof pageGlobal.CSS.escape=="function"?pageGlobal.CSS.escape(value):value.replace(/[^a-zA-Z0-9_-]/g,character=>`\\${character}`),escapeAttribute=value=>value.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),isInternal=input2=>!!(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest("[data-mearl-overlay], #__mearl_click_style"),isVisible=element=>{if(element.closest('[hidden], [aria-hidden="true"]'))return!1;try{let current=element;for(;current;){let style=getComputedStyle(current);if(style.display==="none"||style.visibility==="hidden"||style.visibility==="collapse"||style.opacity==="0")return!1;current=current.parentElement}return!0}catch{return!0}},selectorFor=input2=>{if(!input2||input2===document.documentElement||input2===document.body)return;if(input2.id)return`#${escapeCss(input2.id)}`;let tag=input2.tagName.toLowerCase();for(let attribute of["data-testid","data-test","name","aria-label"]){let value=input2.getAttribute(attribute);if(value&&value.length<=80){let candidate=`${tag}[${attribute}="${escapeAttribute(value)}"]`;try{if(!input2.isConnected||document.querySelectorAll(candidate).length===1)return candidate}catch{}}}let path29=[],current=input2;for(;current&¤t!==document.documentElement&&path29.length<6;){let parent=current.parentElement,currentTag=current.tagName.toLowerCase();if(!parent){path29.unshift(currentTag);break}let siblings=Array.from(parent.children).filter(item=>item.tagName===current.tagName),position=siblings.indexOf(current)+1;path29.unshift(siblings.length>1?`${currentTag}:nth-of-type(${position})`:currentTag);let candidate=path29.join(" > ");if(input2.isConnected)try{if(document.querySelectorAll(candidate).length===1)return candidate}catch{}current=parent}return path29.join(" > ")||void 0},inferredRole=element=>{let explicit=element.getAttribute("role");if(explicit)return explicit;let tag=element.tagName.toLowerCase();if(tag==="a")return"link";if(tag==="button"||tag==="summary")return"button";if(tag==="select")return"combobox";if(tag==="textarea")return"textbox";if(tag!=="input")return;let type=(element.getAttribute("type")||"text").toLowerCase();return type==="checkbox"?"checkbox":type==="radio"?"radio":type==="button"||type==="submit"||type==="reset"?"button":"textbox"},ariaBoolean=(element,name)=>{let value=element.getAttribute(name);if(value==="true")return!0;if(value==="false")return!1},describe=element=>{if(!element||isInternal(element))return null;let selector=selectorFor(element);if(!selector)return null;let tag=element.tagName.toLowerCase(),role=inferredRole(element),inputType=tag==="input"?(element.getAttribute("type")||"text").toLowerCase():"",isPassword=tag==="input"&&inputType==="password",name=(element.getAttribute("aria-label")||element.getAttribute("alt")||element.getAttribute("title")||element.getAttribute("placeholder")||(isPassword?"":element.textContent||"")).replace(/\s+/g," ").trim().slice(0,160),value=!isPassword&&(tag==="input"||tag==="textarea"||tag==="select")?String(element.value??"").slice(0,160):"",checked=tag==="input"&&(inputType==="checkbox"||inputType==="radio")?element.checked:ariaBoolean(element,"aria-checked"),disabled=element.hasAttribute("disabled")||ariaBoolean(element,"aria-disabled")===!0,expanded=ariaBoolean(element,"aria-expanded");return{selector,tag,...role?{role}:{},...name?{name}:{},...value?{value}:{},...document.activeElement===element?{focused:!0}:{},...checked!==void 0?{checked}:{},...disabled?{disabled:!0}:{},...expanded!==void 0?{expanded}:{}}},isInteractive=element=>{try{return element.matches(interactiveSelector)}catch{return!1}},isNotification=element=>{try{return element.matches(notificationSelector)}catch{return!1}},nearestNotification=input2=>(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest(notificationSelector)??null,notificationId=element=>{let id3=lifecycleNodeIds.get(element);return id3===void 0&&(id3=nextLifecycleNodeId,nextLifecycleNodeId+=1,lifecycleNodeIds.set(element,id3)),id3},candidates=(root,selector)=>{if(root.nodeType!==Node.ELEMENT_NODE)return[];let element=root,result=[];try{element.matches(selector)&&result.push(element);for(let descendant of Array.from(element.querySelectorAll(selector)))if(result.push(descendant),result.length>=signalLimit)break}catch{}return result},collectUnclassifiedTexts=(root,budget)=>{let texts=[],visit=node=>{if(budget.visited>=recordBudget){budget.truncated=!0;return}if(isInternal(node))return;if(budget.visited+=1,node.nodeType===Node.TEXT_NODE){let parent=node.parentElement,text3=node.textContent?.replace(/\s+/g," ").trim();text3&&parent&&isVisible(parent)&&texts.push(text3.slice(0,512));return}if(node.nodeType!==Node.ELEMENT_NODE)return;let element=node;if(!(isInteractive(element)||isNotification(element)))for(let child of Array.from(node.childNodes))visit(child)};return visit(root),texts},readPlainText=element=>{try{if(!element.isConnected||isInternal(element)||!isVisible(element)||element.closest(`${interactiveSelector},${notificationSelector},script,style,template,noscript`)||element.childNodes.length>1||element.firstChild&&element.firstChild.nodeType!==Node.TEXT_NODE)return null;let style=getComputedStyle(element),textSecurity=style.getPropertyValue("-webkit-text-security");if(textSecurity&&textSecurity!=="none")return null;let text3=(element.textContent||"").replace(/\s+/g," ").trim();if(text3.length>160)return null;let left=0,top=0,right=innerWidth,bottom=innerHeight,clippingOverflow=["hidden","clip","scroll","auto"];for(let ancestor=element;ancestor;ancestor=ancestor.parentElement){let ancestorStyle=ancestor===element?style:getComputedStyle(ancestor),clipsX=clippingOverflow.includes(ancestorStyle.overflowX),clipsY=clippingOverflow.includes(ancestorStyle.overflowY);if(!clipsX&&!clipsY)continue;let box=ancestor.getBoundingClientRect();clipsX&&(left=Math.max(left,box.left),right=Math.min(right,box.right)),clipsY&&(top=Math.max(top,box.top),bottom=Math.min(bottom,box.bottom))}let range2=document.createRange();range2.selectNodeContents(element);let rects=text3?Array.from(range2.getClientRects()):[element.getBoundingClientRect()];if(rects.length===0||rects.length>8)return null;for(let rect of rects){if(rect.width<=0||rect.height<=0||rect.left<left||rect.top<top||rect.right>right||rect.bottom>bottom)return null;let hit=document.elementFromPoint((rect.left+rect.right)/2,(rect.top+rect.bottom)/2);if(!hit||!element.contains(hit)&&!(style.pointerEvents==="none"&&hit.contains(element)))return null}let selector=selectorFor(element);if(!selector||selector.length>512)return null;let matches=document.querySelectorAll(selector);return matches.length!==1||matches[0]!==element?null:{selector,text:text3}}catch{return null}},captureInteractiveBaseline=()=>{let baseline=new Map,visited=0;for(let element of Array.from(document.querySelectorAll(interactiveSelector))){if(visited>=recordBudget)break;if(visited+=1,!isVisible(element))continue;let node=describe(element);node&&baseline.set(node.selector,node)}return baseline},sameInteractiveState=(left,right)=>left.tag===right.tag&&left.role===right.role&&left.name===right.name&&left.value===right.value&&left.checked===right.checked&&left.disabled===right.disabled&&left.expanded===right.expanded,compactUnchangedRecreation=(effect,baseline)=>{if(effect.change!=="appeared"&&effect.change!=="recreated")return effect;let previous=baseline?.get(effect.node.selector);return!previous||!sameInteractiveState(previous,effect.node)?effect:{change:"recreated",node:{selector:effect.node.selector,tag:effect.node.tag,...effect.node.role?{role:effect.node.role}:{},...effect.node.name?{name:effect.node.name}:{}}}};for(let notification of Array.from(document.querySelectorAll(notificationSelector)))notificationVisibility.set(notification,isVisible(notification)),notificationId(notification);let state={schemaVersion:7,document,version:0,batches:[],lastChangeAt:performance.now(),listeners:new Set,selectorFor};state.captureBaseline=()=>{state.baselineVersion=state.version,state.baseline=captureInteractiveBaseline()},state.captureBaseline();let observer=new MutationObserver(records=>{let notifications=[],interactives=[],texts=new Map,mutationCount=0,structuralMutationCount=0,unclassifiedStructuralMutationCount=0,unclassifiedNonTextMutationCount=0,overflow=records.length>recordBudget,processedNodes=0,removedInteractiveCounts=new Map,addedTextCounts=new Map,removedTextCounts=new Map,unclassifiedTraversalBudget={visited:0,truncated:!1},addTextCounts=(counts,texts2)=>{for(let text3 of texts2)counts.set(text3,(counts.get(text3)??0)+1)},interactiveSemanticKey=node=>[node.tag,node.role||"",node.name||""].join("\0");for(let record4 of records.slice(0,recordBudget))if(!(record4.type!=="childList"||isInternal(record4.target))){for(let removedNode of Array.from(record4.removedNodes))if(!isInternal(removedNode))for(let interactive of candidates(removedNode,interactiveSelector)){let node=describe(interactive);if(!node||!node.role&&!node.name)continue;let key=interactiveSemanticKey(node);removedInteractiveCounts.set(key,(removedInteractiveCounts.get(key)??0)+1)}}let pushNotification=(element,phase)=>{let node=describe(element);return!node||notifications.length>=notificationLimit*3?!1:(notifications.push({nodeId:notificationId(element),phase,node,at:performance.now()}),!0)},pushInteractive=(element,change)=>{if(interactives.length>=signalLimit||!isVisible(element))return!1;let node=describe(element);if(!node)return!1;let resolvedChange=change;if(change==="appeared"){let key=interactiveSemanticKey(node),removedCount=removedInteractiveCounts.get(key)??0;removedCount>0&&(resolvedChange="recreated",removedCount===1?removedInteractiveCounts.delete(key):removedInteractiveCounts.set(key,removedCount-1))}return interactives.push({change:resolvedChange,node}),!0},pushTextUpdate=input2=>{let notification=nearestNotification(input2),element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element?.isConnected||!isVisible(element))return!1;let target=notification??element.closest(interactiveSelector);if(!target?.isConnected||!isVisible(target))return!1;let text3=target.textContent?.replace(/\s+/g," ").trim();return!text3||text3.length>160||describe(target)?.name!==text3?!1:notification?pushNotification(target,"updated"):pushInteractive(target,"updated")},pushPlainTextUpdate=input2=>{let element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element)return!1;if(texts.has(element))return!0;if(texts.size>=textLimit)return overflow=!0,!1;let effect=readPlainText(element);return effect?(texts.set(element,effect),!0):!1};for(let record4 of records.slice(0,recordBudget)){if(isInternal(record4.target))continue;if(record4.type==="childList"){let addedNodes=Array.from(record4.addedNodes).filter(node=>!isInternal(node)),removedNodes=Array.from(record4.removedNodes).filter(node=>!isInternal(node));if(addedNodes.length===0&&removedNodes.length===0||(mutationCount+=1,structuralMutationCount+=1,[...addedNodes,...removedNodes].every(node=>node.nodeType===Node.TEXT_NODE)&&(pushTextUpdate(record4.target)||pushPlainTextUpdate(record4.target))))continue;let classified=!1;for(let node of addedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))isVisible(notification3)&&(notificationVisibility.set(notification3,!0),classified=pushNotification(notification3,"appeared")||classified);for(let interactive of candidates(node,interactiveSelector))classified=pushInteractive(interactive,"appeared")||classified}for(let node of removedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))notificationVisibility.set(notification3,!1),classified=pushNotification(notification3,"disappeared")||classified}let notification2=nearestNotification(record4.target);notification2&&isVisible(notification2)&&(classified=pushNotification(notification2,"updated")||classified);let addedTexts=addedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget)),removedTexts=removedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget));unclassifiedTraversalBudget.truncated&&(overflow=!0),!classified&&addedTexts.length===0&&removedTexts.length===0&&(unclassifiedNonTextMutationCount+=1),addTextCounts(addedTextCounts,addedTexts),addTextCounts(removedTextCounts,removedTexts);continue}if(record4.type==="characterData"){mutationCount+=1,structuralMutationCount+=1,!pushTextUpdate(record4.target)&&!pushPlainTextUpdate(record4.target)&&(unclassifiedStructuralMutationCount+=1);continue}mutationCount+=1;let target=record4.target,notification=isNotification(target)?target:nearestNotification(target);if(notification){let visible=isVisible(notification),previous=notificationVisibility.get(notification);notificationVisibility.set(notification,visible),previous===!0&&!visible?pushNotification(notification,"disappeared"):previous===!1&&visible?pushNotification(notification,"appeared"):visible&&pushNotification(notification,"updated")}if(isInteractive(target)&&pushInteractive(target,"updated"),["hidden","aria-hidden","style","class"].includes(record4.attributeName||"")&&isVisible(target))for(let interactive of candidates(target,interactiveSelector))pushInteractive(interactive,"appeared")}let textKeys=new Set([...addedTextCounts.keys(),...removedTextCounts.keys()]);for(let text3 of textKeys)unclassifiedStructuralMutationCount+=Math.abs((addedTextCounts.get(text3)??0)-(removedTextCounts.get(text3)??0));if(unclassifiedStructuralMutationCount+=unclassifiedNonTextMutationCount,mutationCount!==0){state.version+=1,state.lastChangeAt=performance.now(),state.batches.push({version:state.version,mutationCount,structuralMutationCount,unclassifiedStructuralMutationCount,notifications,interactives,texts:Array.from(texts,([element,effect])=>({element,effect})),overflow}),state.batches.length>Math.max(10,maxBatches)&&state.batches.shift();for(let listener of Array.from(state.listeners))listener()}});return observer.observe(document.documentElement||document,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["role","aria-live","aria-hidden","hidden","style","class","disabled","aria-disabled","aria-expanded","aria-selected","aria-checked","value"]}),state.waitSince=(checkpoint,checkpointFocus,quietMs,firstChangeTimeoutMs,timeoutMs)=>{let startedAt=performance.now(),visualSettleDeadline=startedAt+Math.min(timeoutMs,750);return new Promise(resolve16=>{let completed=!1,quietTimer,firstChangeTimer,hardTimer,remainingVisualAnimationMs=()=>{let remainingBudget=visualSettleDeadline-performance.now();if(remainingBudget<=0||typeof document.getAnimations!="function")return 0;let maximumRemaining=0;try{for(let animation of document.getAnimations()){if(animation.playState!=="running"&&!animation.pending)continue;let target=animation.effect?.target;if(target instanceof Element&&target.closest("[data-mearl-overlay]"))continue;let timing=animation.effect?.getComputedTiming?.();if(timing?.iterations===1/0)continue;let currentTime=Number(animation.currentTime),endTime=Number(timing?.endTime),remaining=Number.isFinite(currentTime)&&Number.isFinite(endTime)?Math.max(0,endTime-currentTime):50;maximumRemaining=Math.max(maximumRemaining,remaining)}}catch{return 0}return Math.min(maximumRemaining,remainingBudget)},finish=settledBy=>{if(completed)return;if(settledBy==="quiet"){let animationDelay=remainingVisualAnimationMs();if(animationDelay>0){quietTimer&&clearTimeout(quietTimer),quietTimer=setTimeout(()=>finish("quiet"),Math.max(16,animationDelay));return}}completed=!0,quietTimer&&clearTimeout(quietTimer),firstChangeTimer&&clearTimeout(firstChangeTimer),hardTimer&&clearTimeout(hardTimer),state.listeners.delete(onChange);let available=state.batches.filter(batch=>batch.version>checkpoint),oldestVersion=state.batches[0]?.version??state.version,batchOverflow=available.length>0&&checkpoint<oldestVersion-1||available.some(batch=>batch.overflow),mutationCount=available.reduce((total,batch)=>total+batch.mutationCount,0),structuralMutationCount=available.reduce((total,batch)=>total+batch.structuralMutationCount,0),unclassifiedStructuralMutationCount=available.reduce((total,batch)=>total+(batch.unclassifiedStructuralMutationCount??batch.structuralMutationCount),0),latestInteractives=new Map;for(let effect of available.flatMap(batch=>batch.interactives))latestInteractives.set(effect.node.selector,effect);let baseline=state.baselineVersion===checkpoint?state.baseline:void 0,interactives=Array.from(latestInteractives.values()).map(effect=>compactUnchangedRecreation(effect,baseline)).slice(-signalLimit),latestTexts=new Map;for(let batch of available)for(let entry of batch.texts??[])latestTexts.set(entry.element,entry.effect);let texts=[],incompleteText=latestTexts.size>textLimit;for(let[element,effect]of latestTexts){let current=readPlainText(element);if(!element.isConnected)try{let matches=document.querySelectorAll(effect.selector);matches.length===1&&(current=readPlainText(matches[0]))}catch{}if(!current||current.selector!==effect.selector||current.text!==effect.text){incompleteText=!0;continue}texts.length<textLimit&&texts.push(current)}let notificationStates=new Map;for(let event of available.flatMap(batch=>batch.notifications)){let entry=notificationStates.get(event.nodeId)??{lastAt:event.at},phase=event.phase;entry[phase]=event,phase==="updated"&&entry.appeared&&(entry.appeared={...entry.appeared,node:event.node}),entry.lastAt=event.at,notificationStates.set(event.nodeId,entry)}let roundTime=value=>Math.round(value*1e3)/1e3,notifications=Array.from(notificationStates.values()).sort((left,right)=>left.lastAt-right.lastAt).map(entry=>{if(entry.appeared&&entry.disappeared){let appearedAt=Math.max(0,entry.appeared.at-startedAt),disappearedAt=Math.max(appearedAt,entry.disappeared.at-startedAt);return{change:"transient",node:entry.disappeared.node.name?entry.disappeared.node:entry.appeared.node,appearedAt:roundTime(appearedAt),disappearedAt:roundTime(disappearedAt),duration:roundTime(Math.max(0,entry.disappeared.at-entry.appeared.at))}}return entry.disappeared?{change:"disappeared",node:entry.disappeared.node}:entry.appeared?{change:"appeared",node:entry.appeared.node}:{change:"updated",node:entry.updated.node}}).slice(-notificationLimit),currentFocus=document.activeElement,currentFocusSelector=selectorFor(currentFocus),focus=currentFocusSelector&¤tFocusSelector!==checkpointFocus?describe(currentFocus):null,distinctInteractives=focus?interactives.filter(effect=>effect.node.selector!==focus.selector):interactives,overflow=batchOverflow||latestInteractives.size>signalLimit||notificationStates.size>notificationLimit||latestTexts.size>textLimit,snapshotReasons=[];settledBy==="timeout"&&snapshotReasons.push("observation-timeout"),overflow&&snapshotReasons.push("observation-overflow"),(structuralMutationCount>0&&unclassifiedStructuralMutationCount>0||incompleteText)&&snapshotReasons.push("unclassified-structure"),resolve16({mode:"delta",scope:"main-document",checkpoint,version:state.version,elapsed:roundTime(performance.now()-startedAt),settledBy,url:location.href,title:document.title,changed:mutationCount>0||!!focus,effects:{notifications,interactives:distinctInteractives,...texts.length>0?{texts}:{},...focus?{focus}:{}},mutationCount,overflow,fullSnapshotRecommended:snapshotReasons.length>0,snapshotReasons})},scheduleQuiet=()=>{quietTimer&&clearTimeout(quietTimer);let remaining=Math.max(0,quietMs-(performance.now()-state.lastChangeAt));quietTimer=setTimeout(()=>finish("quiet"),remaining)},onChange=()=>{state.version<=checkpoint||(firstChangeTimer&&clearTimeout(firstChangeTimer),scheduleQuiet())};timeoutMs<=0?finish(state.version>checkpoint?"quiet":"no-change"):(hardTimer=setTimeout(()=>finish("timeout"),timeoutMs),state.listeners.add(onChange),state.version>checkpoint?scheduleQuiet():firstChangeTimer=setTimeout(()=>finish("no-change"),firstChangeTimeoutMs))})},state.observer=observer,pageGlobal[globalKey]=state,{version:state.version,url:location.href,title:document.title,focus:selectorFor(document.activeElement)}}function disposePageObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_PAGE_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),state.listeners?.clear?.(),delete pageGlobal[globalKey])}var init_pageObserver=__esm({"../browser-core/dist/pageObserver.js"(){"use strict"}});function createNavigationSettlementTracker(options){let startedAt=performance.now(),trackNetwork=options.trackNetwork===!0,networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),contentReadyAfterMs=Math.min(Math.max(options.contentReadyAfterMs??5e3,0),2e4),networkAvailable=trackNetwork&&options.networkAvailable!==!1,started=!1,documentComplete=!1,documentCompletedAt=0,disposed=!1,completed,latestUrl=options.urlBefore,latestTitle="",lastNetworkActivity=0,networkActivityObserved=!1,networkIdleTimer,contentTimer,contentPollInFlight=!1,latestContentSample,pendingRequests2=new Set,startWaiters=new Set,resultWaiters=new Set,pollTimers=new Set,updatePage=(url,title)=>{url&&(latestUrl=url),title&&(latestTitle=title)},notifyStarted=()=>{if(!started){started=!0;for(let waiter of startWaiters)waiter(!0);startWaiters.clear()}},finish=(loaded,ready,settledBy)=>{if(!(completed||disposed)){networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer),completed={mode:"navigation",urlBefore:options.urlBefore,urlAfter:latestUrl,title:latestTitle,elapsed:Math.round((performance.now()-startedAt)*1e3)/1e3,loaded,ready,settledBy,pendingRequests:pendingRequests2.size,...latestContentSample?{content:latestContentSample}:{},fullSnapshotRecommended:!0,snapshotReasons:["navigation"]};for(let waiter of resultWaiters)waiter(completed);resultWaiters.clear()}},scheduleReadinessCheck=(delayMs,mode)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||(contentTimer&&clearTimeout(contentTimer),contentTimer=setTimeout(async()=>{if(contentTimer=void 0,completed||disposed||contentPollInFlight)return;if(mode==="content-stable"&&pendingRequests2.size===0){scheduleNetworkCompletion();return}if(mode==="network-idle"&&pendingRequests2.size>0){scheduleContentCompletion();return}let elapsed=performance.now()-startedAt;if(mode==="content-stable"&&elapsed<contentReadyAfterMs){scheduleReadinessCheck(contentReadyAfterMs-elapsed,mode);return}contentPollInFlight=!0;try{if(latestContentSample=await options.sampleContent?.(),latestContentSample?.ready){finish(!0,!0,pendingRequests2.size>0?"content-stable":"network-idle");return}}catch{latestContentSample=void 0}finally{contentPollInFlight=!1}if(pendingRequests2.size===0&&(!latestContentSample||!latestContentSample.meaningful&&!latestContentSample.skeletonVisible)){finish(!0,!0,"network-idle");return}scheduleReadinessCheck(200,pendingRequests2.size>0?"content-stable":"network-idle")},Math.max(0,delayMs)))},scheduleNetworkCompletion=()=>{if(completed||disposed||!started||!documentComplete)return;if(!trackNetwork||!networkAvailable){finish(!0,!0,"load");return}if(networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,pendingRequests2.size>0)return;let quietSince=Math.max(documentCompletedAt,lastNetworkActivity),remaining=networkIdleMs-(performance.now()-quietSince);if(remaining<=0){options.sampleContent?scheduleReadinessCheck(0,"network-idle"):finish(!0,!0,"network-idle");return}networkIdleTimer=setTimeout(scheduleNetworkCompletion,remaining)},scheduleContentCompletion=(delayMs=0)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||pendingRequests2.size===0||scheduleReadinessCheck(delayMs,"content-stable")};return{hasStarted:()=>started,hasNetworkActivity:()=>networkActivityObserved,updatePage,markStarted:(url,title)=>{updatePage(url,title),notifyStarted()},markDocumentComplete:(url,title)=>{updatePage(url,title),notifyStarted(),documentComplete=!0,documentCompletedAt=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion()},requestStarted:requestId=>{!trackNetwork||disposed||(pendingRequests2.add(requestId),networkActivityObserved=!0,lastNetworkActivity=performance.now(),networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,scheduleContentCompletion())},requestFinished:requestId=>{pendingRequests2.delete(requestId)&&(lastNetworkActivity=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion())},setNetworkAvailable:available=>{networkAvailable=trackNetwork&&available,networkAvailable||(pendingRequests2.clear(),lastNetworkActivity=0,scheduleNetworkCompletion())},waitForStart:timeoutMs=>started?Promise.resolve(!0):timeoutMs<=0||disposed?Promise.resolve(!1):new Promise(resolve16=>{let initialDeadline=performance.now()+timeoutMs,hardDeadline=initialDeadline+4e3,timer,waiter=didStart=>{clearTimeout(timer),startWaiters.delete(waiter),resolve16(didStart)},check=()=>{if(started){waiter(!0);return}let now=performance.now(),networkBusy=networkAvailable&&(pendingRequests2.size>0||networkActivityObserved&&now-lastNetworkActivity<750);if(disposed||now>=hardDeadline||now>=initialDeadline&&!networkBusy){waiter(!1);return}timer=setTimeout(check,50)};startWaiters.add(waiter),check()}),waitForNetworkIdle:timeoutMs=>{let waitStartedAt=performance.now();return new Promise(resolve16=>{let finishWait=(ready,settledBy)=>{resolve16({ready,settledBy,pendingRequests:pendingRequests2.size,elapsed:Math.round((performance.now()-waitStartedAt)*1e3)/1e3})},check=()=>{if(disposed||!networkAvailable){finishWait(!1,"unavailable");return}let now=performance.now();if(pendingRequests2.size===0&&networkActivityObserved&&now-lastNetworkActivity>=networkIdleMs){finishWait(!0,"network-idle");return}if(now-waitStartedAt>=timeoutMs){finishWait(!1,"timeout");return}let timer=setTimeout(()=>{pollTimers.delete(timer),check()},50);pollTimers.add(timer)};check()})},waitForResult:timeoutMs=>completed?Promise.resolve(completed):new Promise(resolve16=>{let waiter=result=>{clearTimeout(timer),resultWaiters.delete(waiter),resolve16(result)},timer=setTimeout(()=>{resultWaiters.delete(waiter),finish(documentComplete,!1,"timeout"),completed&&resolve16(completed)},timeoutMs);resultWaiters.add(waiter)}),dispose:()=>{disposed=!0,networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer);for(let timer of pollTimers)clearTimeout(timer);pollTimers.clear();for(let waiter of startWaiters)waiter(!1);startWaiters.clear()}}}var init_navigationTracker=__esm({"../browser-core/dist/navigationTracker.js"(){"use strict"}});function isPageActionPreconditionError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="precondition"}function isPageActionDispatchUncertainError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="dispatch-uncertain"}function withPageActionDispatchAttempt(error,attempt){return isPageActionDispatchUncertainError(error)?new PageActionDispatchUncertainError(error.message,{cause:error,attempt:{...error.pageActionAttempt??{},...attempt}}):error}async function dispatchPairedPageInputCommands(sendPress,sendRelease){let settle=async send=>{try{return await send(),{status:"fulfilled",value:void 0}}catch(reason){return{status:"rejected",reason}}},pressResultPromise=settle(sendPress);await new Promise(resolve16=>setTimeout(resolve16,0));let releaseResultPromise=settle(sendRelease),[pressResult,releaseResult]=await Promise.all([pressResultPromise,releaseResultPromise]),failure=pressResult.status==="rejected"?pressResult.reason:releaseResult.status==="rejected"?releaseResult.reason:void 0;if(failure===void 0)return;let describeStatus=result=>result.status==="fulfilled"?"acknowledged":isPageActionDispatchUncertainError(result.reason)?"uncertain":"failed";throw withPageActionDispatchAttempt(failure,{inputSequence:{press:describeStatus(pressResult),release:describeStatus(releaseResult)}})}function asPageActionPreconditionError(error){return isPageActionPreconditionError(error)?error:new PageActionPreconditionError(error instanceof Error?error.message:String(error),{cause:error})}function checkPageActionPrecondition(check){try{return check()}catch(error){throw asPageActionPreconditionError(error)}}function describePageActionFailure(error){return{error:error instanceof Error?error.message:String(error),...isPageActionPreconditionError(error)||isPageActionDispatchUncertainError(error)?{stage:error.pageActionFailureStage}:{},...isPageActionDispatchUncertainError(error)&&error.pageActionAttempt?{attempt:error.pageActionAttempt}:{}}}function isPageActAction(action){return PAGE_ACT_ACTIONS.includes(action)}function shouldObservePageAction(action,data){if(!isPageActAction(action))return!1;let diagnosticsSetting=data?.diagnostics,diagnosticsEnabled=diagnosticsSetting===!0||diagnosticsSetting!==null&&typeof diagnosticsSetting=="object"&&!Array.isArray(diagnosticsSetting);return action==="page_eval"?!!(diagnosticsEnabled||data?.observe&&typeof data.observe=="object"&&!Array.isArray(data.observe)):data?.observe!==!1||diagnosticsEnabled}function splitObservedActionPayload(action,data){let{observe,diagnostics,...actionData}=data??{},setting=diagnostics,resolvedDiagnostics=setting===!1?void 0:setting===!0?DEFAULT_PAGE_DIAGNOSTICS:setting&&typeof setting=="object"&&!Array.isArray(setting)?setting:void 0;return observe===!1?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:action==="page_eval"&&(!observe||typeof observe!="object")?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:{actionData,observe:observe&&typeof observe=="object"&&!Array.isArray(observe)?observe:{},diagnostics:resolvedDiagnostics}}function unavailableObservation(checkpoint,error){return{mode:"unavailable",checkpoint:checkpoint.version,urlBefore:checkpoint.url,error:error instanceof Error?error.message:String(error),fullSnapshotRecommended:!0,snapshotReasons:["observer-unavailable"]}}function addSnapshotReason(observation,reason){if(observation.mode==="navigation")return observation;let reasons=new Set([...observation.snapshotReasons??[],reason]);return{...observation,fullSnapshotRecommended:!0,snapshotReasons:Array.from(reasons)}}function isNavigationInterruptedActionFailure(failure){return!failure||failure.stage==="precondition"?!1:/Detached while handling command|Execution context was destroyed|Cannot find context with specified id|Inspected target navigated or closed/i.test(failure.error)}function compactObservationResponse(observation,checkpoint){if(observation.mode!=="delta")return observation;let{url,title,...compact}=observation;return{...compact,...url!==checkpoint.url?{url}:{},...title!==checkpoint.title?{title}:{}}}async function runPageAct(input2,dependencies){let{action,actionData={},observe={}}=input2;if(!PAGE_ACT_ACTIONS.includes(action))throw new Error(`observed page action must be one of: ${PAGE_ACT_ACTIONS.join(", ")}`);if(!actionData||typeof actionData!="object"||Array.isArray(actionData))throw new Error("actionData must be an object");let typedAction=action,dialogs=dependencies.dialogs,guarded=work=>dialogs?dialogs.command(work):work(),dialogResult=(failure,data)=>({action:{name:typedAction,success:!failure,...data!==void 0?{data}:{},...failure},...dialogs?.info()?{dialog:dialogs.info()}:{}}),checkpoint;try{checkpoint=await guarded(()=>dependencies.startObservation())}catch(error){if(!dialogs?.pending)throw error;return dialogResult({...describePageActionFailure(error),stage:"precondition"})}let navigationOptions=resolveNavigationWaitOptions(observe),sourceTabId=typeof actionData.tabId=="number"&&Number.isInteger(actionData.tabId)?actionData.tabId:void 0,navigationObserver=await dependencies.startNavigationObserver({urlBefore:checkpoint.url,trackNetwork:!0,networkIdleMs:navigationOptions.networkIdleMs,contentReadyAfterMs:navigationOptions.contentReadyAfterMs,trackOpenedTabs:typedAction==="page_click"||typedAction==="page_press"||typedAction==="page_eval",sourceTabId}).catch(()=>null),actionResult,actionFailure;try{actionResult=await dependencies.executeAction(typedAction,actionData)}catch(error){actionFailure=describePageActionFailure(error)}let dispose=()=>Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]);if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);if(actionFailure?.stage==="precondition")return await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]),{action:{name:typedAction,success:!1,error:actionFailure.error,stage:actionFailure.stage}};let observation;try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);let navigationInterruptedAction=isNavigationInterruptedActionFailure(actionFailure);navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0);try{if(dependencies.detectNavigation&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&shouldWaitForPotentialNavigation(typedAction,observation)){let detectedNavigation=await dependencies.detectNavigation(checkpoint,navigationOptions.graceMs).catch(()=>null);detectedNavigation&&(observation=detectedNavigation,navigationInterruptedAction&&(actionFailure=void 0))}if(navigationObserver&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&(navigationObserver.hasStarted()||shouldWaitForPotentialNavigation(typedAction,observation))&&(navigationObserver.hasStarted()||await guarded(()=>navigationObserver.waitForStart(navigationOptions.graceMs)))&&(observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs))),navigationObserver&&(actionFailure===void 0||navigationInterruptedAction)&&observation.mode!=="navigation"&&navigationObserver.hasNetworkActivity()){let network=await guarded(()=>navigationObserver.waitForNetworkIdle(navigationOptions.timeoutMs));if(navigationObserver.hasStarted())observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs));else{try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}observation.mode!=="navigation"&&(observation.network=network,network.ready||(observation=addSnapshotReason(observation,"network-pending")))}}if(navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0),dependencies.finalizeObservation)try{observation=await guarded(()=>dependencies.finalizeObservation(observation))}catch{}if(navigationObserver){let openedTabs=await guarded(()=>navigationObserver.getOpenedTabs(navigationOptions.timeoutMs)).catch(()=>[]);openedTabs.length>0&&(observation={...observation,openedTabs})}}catch(error){if(!dialogs?.pending)throw error;return dialogResult(actionFailure,actionResult)}finally{await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())])}return dialogs?.pending?dialogResult(actionFailure,actionResult):{action:{name:typedAction,success:actionFailure===void 0,...actionResult!==void 0?{data:actionResult}:{},...actionFailure||{}},observation:compactObservationResponse(observation,checkpoint)}}var DEFAULT_PAGE_DIAGNOSTICS,PageActionPreconditionError,PageActionDispatchUncertainError,init_pageAct=__esm({"../browser-core/dist/pageAct.js"(){"use strict";init_pageObserver();init_browserActionProtocol();DEFAULT_PAGE_DIAGNOSTICS={logs:!0,requests:!0},PageActionPreconditionError=class extends Error{pageActionFailureStage="precondition";constructor(message,options){super(message,options),this.name="PageActionPreconditionError"}},PageActionDispatchUncertainError=class extends Error{pageActionFailureStage="dispatch-uncertain";pageActionAttempt;constructor(message,options){super(message,options),this.name="PageActionDispatchUncertainError",this.pageActionAttempt=options?.attempt}}}});function pageDialogSnapshot(dialogs,mode="full",maxChars=25e3){let dialog=dialogs.info(maxChars);return dialog?{snapshot:`[native ${dialog.type} dialog]`,mode,elementCount:0,outputNodeCount:0,dialog}:void 0}var PageDialogInterruptedError,PageDialogState,init_pageDialog=__esm({"../browser-core/dist/pageDialog.js"(){"use strict";init_pageAct();PageDialogInterruptedError=class extends Error{pageActionFailureStage;code="DIALOG_PENDING";dialog;details;constructor(dialog,pageActionFailureStage="dispatch-uncertain"){super(dialog?`DIALOG_PENDING: native ${dialog.type} dialog ${dialog.id}. Read it with page_snapshot, then use page_press with dialogId and Enter/Escape.`:"DIALOG_PENDING: a previous page operation was interrupted; observe the page before continuing."),this.pageActionFailureStage=pageActionFailureStage,this.name="PageDialogInterruptedError",this.dialog=dialog,this.details={...dialog?{dialog}:{}}}},PageDialogState=class{epoch=0;prefix=crypto.randomUUID();current;defaultPromptTruncated=!1;work=new Set;listeners=new Set;handling;onIdle;get pending(){return this.current!==void 0}get busy(){return this.work.size>0||this.handling!==void 0}info(maxChars=240){if(!this.current)return;let limit=Number.isFinite(maxChars)?Math.max(0,Math.min(maxChars,1e5)):240,{message,defaultPrompt,...rest}=this.current;return{...rest,message:message.slice(0,limit),...defaultPrompt?{defaultPrompt:defaultPrompt.slice(0,limit)}:{},...message.length>limit||(defaultPrompt?.length??0)>limit?{truncated:!0}:{}}}opened(event){if(["alert","confirm","prompt","beforeunload"].includes(String(event.type))){this.defaultPromptTruncated=typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536,this.current={id:`${this.prefix}:${++this.epoch}`,type:event.type,message:typeof event.message=="string"?event.message.slice(0,65536):"",...typeof event.defaultPrompt=="string"&&event.defaultPrompt?{defaultPrompt:event.defaultPrompt.slice(0,65536)}:{},...typeof event.message=="string"&&event.message.length>65536||typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536?{truncated:!0}:{}};for(let listener of this.listeners)listener()}}closed(){this.current=void 0,this.notifyIdle()}invalidate(){this.epoch+=1,this.current=void 0;for(let listener of this.listeners)listener();this.notifyIdle()}assertCanDispatch(){if(this.pending||[...this.work].some(entry=>entry.epoch!==this.epoch))throw new PageDialogInterruptedError(this.info(),"precondition")}execute(work,interrupt=!0){this.assertCanDispatch();let entry={epoch:this.epoch};this.work.add(entry);let started=!1,release=()=>{this.work.delete(entry),this.notifyIdle()},start=()=>(started=!0,Promise.resolve().then(()=>(this.assertCanDispatch(),work())).finally(release));return(interrupt?this.race(start):start()).finally(()=>{started||release()})}command(work){return this.assertCanDispatch(),this.race(work)}race(work){if(this.pending)return Promise.reject(new PageDialogInterruptedError(this.info()));let epoch2=this.epoch;return new Promise((resolve16,reject)=>{let changed=()=>{epoch2!==this.epoch&&(this.listeners.delete(changed),reject(new PageDialogInterruptedError(this.info())))};this.listeners.add(changed);let result;try{result=work()}catch(error){this.listeners.delete(changed),reject(error);return}Promise.resolve(result).then(value=>{this.listeners.delete(changed),resolve16(value)},error=>{this.listeners.delete(changed),reject(error)})})}async press(input2,send){let dialog=this.current;if(!input2.dialogId||dialog?.id!==input2.dialogId)throw new Error("page_press: dialogId is stale or no native dialog is open. Run page_snapshot.");if(this.handling)throw new Error("page_press: this native dialog is already being handled.");if(!["Enter","Escape"].includes(input2.key)||input2.selector!==void 0||input2.modifiers?.length||input2.pressMode&&input2.pressMode!=="auto")throw new Error("page_press: dialogId requires Enter/Escape without selector, modifiers, or an explicit pressMode.");if(input2.promptText!==void 0&&(typeof input2.promptText!="string"||dialog.type!=="prompt"||input2.key!=="Enter"))throw new Error("page_press: promptText is only valid when accepting a native prompt.");let acceptsPrompt=dialog.type==="prompt"&&input2.key==="Enter";if(acceptsPrompt&&input2.promptText===void 0&&this.defaultPromptTruncated)throw new Error("page_press: the native prompt default was truncated. Specify promptText explicitly.");this.handling=dialog.id;try{return await send({accept:input2.key==="Enter",...acceptsPrompt?{promptText:input2.promptText??dialog.defaultPrompt??""}:{}}),{pressed:!0,key:input2.key,dispatchMode:"native-dialog"}}catch(error){throw new PageActionDispatchUncertainError("page_press: native dialog handling was not acknowledged. Read page_snapshot before trying again.",{cause:error})}finally{this.handling=void 0,this.notifyIdle()}}notifyIdle(){!this.pending&&!this.busy&&this.onIdle?.()}}}});var BackendNodeRefRegistry,init_backendNodeRefs=__esm({"../browser-core/dist/backendNodeRefs.js"(){"use strict";BackendNodeRefRegistry=class{maxDeltaRefs;nextRefId=0;nextMutationId=0;documentGeneration=0;entries=new Map;refsByBackendNodeId=new Map;deltaRefOrder=[];constructor(maxDeltaRefs=512){if(this.maxDeltaRefs=maxDeltaRefs,!Number.isInteger(maxDeltaRefs)||maxDeltaRefs<1)throw new Error("maxDeltaRefs must be a positive integer")}resolve(ref){return this.entries.get(ref)?.entry}registerDelta(entry){return this.registerDeltaForDocument(entry,this.documentGeneration)}beginDelta(){let documentGeneration=this.documentGeneration;return{register:entry=>this.registerDeltaForDocument(entry,documentGeneration)}}registerDeltaForDocument(entry,documentGeneration){this.assertDocumentGeneration(documentGeneration);let mutationId=this.allocateMutationId(),existingRef=this.refsByBackendNodeId.get(entry.backendNodeId);if(existingRef&&this.entries.has(existingRef))return this.entries.set(existingRef,{entry,mutationId}),existingRef;let ref=this.allocateRef();return this.entries.set(ref,{entry,mutationId}),this.refsByBackendNodeId.set(entry.backendNodeId,ref),this.deltaRefOrder.push(ref),this.evictOverflowingDeltaRefs(),ref}beginSnapshot(){let documentGeneration=this.documentGeneration,startedAtMutationId=this.nextMutationId,committed=!1,candidates=new Map;return{register:entry=>{if(committed)throw new Error("snapshot ref allocator has already been committed");let ref=this.allocateRef();return candidates.set(ref,entry),ref},commit:outputRefs=>{if(committed)throw new Error("snapshot ref allocator has already been committed");committed=!0,this.assertDocumentGeneration(documentGeneration);let entries=new Map,refsByBackendNodeId=new Map,snapshotMutationId=this.allocateMutationId();for(let[ref,entry]of candidates)outputRefs.has(ref)&&(entries.set(ref,{entry,mutationId:snapshotMutationId}),refsByBackendNodeId.set(entry.backendNodeId,ref));for(let[ref,record4]of this.entries)record4.mutationId<=startedAtMutationId||(entries.set(ref,record4),refsByBackendNodeId.set(record4.entry.backendNodeId,ref));this.entries=entries,this.refsByBackendNodeId=refsByBackendNodeId,this.deltaRefOrder=this.deltaRefOrder.filter(ref=>entries.has(ref))}}}delete(ref){let record4=this.entries.get(ref);if(!record4)return;this.entries.delete(ref),this.refsByBackendNodeId.get(record4.entry.backendNodeId)===ref&&this.refsByBackendNodeId.delete(record4.entry.backendNodeId);let deltaIndex=this.deltaRefOrder.indexOf(ref);deltaIndex>=0&&this.deltaRefOrder.splice(deltaIndex,1)}clearDocument(){this.documentGeneration+=1,this.entries.clear(),this.refsByBackendNodeId.clear(),this.deltaRefOrder=[]}get size(){return this.entries.size}allocateRef(){return this.nextRefId+=1,`@e${this.nextRefId}`}allocateMutationId(){return this.nextMutationId+=1,this.nextMutationId}assertDocumentGeneration(documentGeneration){if(documentGeneration!==this.documentGeneration)throw new Error("page document changed while refs were being collected")}evictOverflowingDeltaRefs(){for(;this.deltaRefOrder.length>this.maxDeltaRefs;){let ref=this.deltaRefOrder.shift();ref&&this.delete(ref)}}}}});async function resolveUniqueBackendNodeIds(sendCommand,selectors){if(selectors.length===0)return new Map;nextObjectGroupId+=1;let objectGroup=`mearl-page-effect-refs-${nextObjectGroupId}`,expression=`(${function(values){return values.map(selector=>{try{let matches=document.querySelectorAll(selector);return matches.length===1?matches[0]:null}catch{return null}})}.toString()})(${JSON.stringify(selectors)})`;try{let evaluated=await sendCommand("Runtime.evaluate",{expression,returnByValue:!1,objectGroup});if(evaluated.exceptionDetails)return new Map;let arrayObjectId=evaluated.result?.objectId;if(!arrayObjectId)return new Map;let properties=await sendCommand("Runtime.getProperties",{objectId:arrayObjectId,ownProperties:!0,accessorPropertiesOnly:!1,generatePreview:!1}),valuesByIndex=new Map;for(let property of properties.result??[]){let index=Number(property.name),objectId=property.value?.objectId;!Number.isInteger(index)||index<0||!objectId||valuesByIndex.set(index,objectId)}let resolvedPairs=await Promise.all(selectors.map(async(selector,index)=>{let objectId=valuesByIndex.get(index);if(!objectId)return null;try{let backendNodeId=(await sendCommand("DOM.describeNode",{objectId})).node?.backendNodeId;return typeof backendNodeId=="number"?[selector,backendNodeId]:null}catch{return null}}));return new Map(resolvedPairs.filter(pair=>pair!==null))}finally{await sendCommand("Runtime.releaseObjectGroup",{objectGroup}).catch(()=>{})}}async function enrichPageChangeSetWithRefs(observation,registry2,resolveBackendNodeIds,createEntry){let candidates=[...observation.effects.interactives.map(effect=>effect.node),...observation.effects.focus?[observation.effects.focus]:[]],selectors=Array.from(new Set(candidates.filter(node=>!node.ref).map(node=>node.selector)));if(selectors.length===0)return observation;let deltaRefs=registry2.beginDelta(),backendNodeIds=await resolveBackendNodeIds(selectors);if(backendNodeIds.size===0)return observation;let enrichNode=node=>{if(node.ref)return node;let backendNodeId=backendNodeIds.get(node.selector);return backendNodeId===void 0?node:{...node,ref:deltaRefs.register(createEntry(node,backendNodeId))}};return{...observation,effects:{...observation.effects,interactives:observation.effects.interactives.map(effect=>({...effect,node:enrichNode(effect.node)})),...observation.effects.focus?{focus:enrichNode(observation.effects.focus)}:{}}}}var nextObjectGroupId,init_pageEffectRefs=__esm({"../browser-core/dist/pageEffectRefs.js"(){"use strict";nextObjectGroupId=0}});function boundedNumber(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolvePageWaitInput(input2){let hasTime=input2.time!==void 0,selector=typeof input2.selector=="string"?input2.selector.trim():"",text3=typeof input2.text=="string"?input2.text.trim():"",condition=typeof input2.condition=="string"?input2.condition.trim():"";if([hasTime&&"time",selector&&"selector",text3&&"text",condition&&"condition"].filter(Boolean).length!==1)throw new Error('page_wait requires exactly one of "time", "selector", "text", or "condition".');let timeout=boundedNumber(input2.timeout,1e4,1,3e5),interval=boundedNumber(input2.interval,200,50,5e3);if(input2.state!==void 0&&!selector)throw new Error('page_wait "state" is only supported with "selector".');if(input2.exact!==void 0&&!text3)throw new Error('page_wait "exact" is only supported with "text".');if(input2.state!==void 0&&!["attached","detached","visible","hidden"].includes(input2.state))throw new Error("page_wait state must be one of attached, detached, visible, hidden.");if(hasTime){let rawTime=input2.time;if(!Number.isFinite(Number(rawTime))||Number(rawTime)<0)throw new Error("page_wait time must be a non-negative number.");return{mode:"time",time:boundedNumber(rawTime,0,0,6e4),timeout,interval}}if(selector){if(validatePageElementSelector(selector,"page_wait"),selector.startsWith("@")||selector==="$0")throw new Error("page_wait selector must be native CSS because snapshot refs and $0 are point-in-time targets.");return{mode:"selector",selector,state:input2.state??"attached",timeout,interval}}return text3?{mode:"text",text:text3,exact:input2.exact??!1,timeout,interval}:{mode:"condition",condition,timeout,interval}}function buildPageWaitExpression(options){return options.mode==="condition"?options.condition:options.mode==="selector"?`(() => {
|
|
43
43
|
const selector = ${JSON.stringify(options.selector)};
|
|
44
44
|
const state = ${JSON.stringify(options.state)};
|
|
45
45
|
let element;
|
|
@@ -1084,14 +1084,14 @@ ${location2}`}let examples=selected.flatMap(({examples:examples2})=>examples2);r
|
|
|
1084
1084
|
`))!==-1;){let line=this.messageBuffer.slice(0,newlineIndex);if(this.messageBuffer=this.messageBuffer.slice(newlineIndex+1),!!line.trim())try{let message=JSON.parse(line);isHeartbeatMessage(message)||this.handleResponse(message)}catch{}}}handleResponse(response){let pending=this.pendingRequests.get(response.id);pending&&(this.pendingRequests.delete(response.id),clearTimeout(pending.timer),response.versionWarning&&console.warn(response.versionWarning),response.success?pending.resolve(response.data):pending.reject(new Error(response.error||"Unknown error from cloud-server")))}async requestRemote(action,data,timeoutSec,browser,connector,controlSessionId){await this.ensureConnected();let ws=this.ws;if(!ws||ws.readyState!==WebSocket.OPEN)throw new Error("Connection is not open");let id3=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`,message={id:id3,action,data,timeoutSec};browser&&(message.browser=browser),connector&&(message.connector=connector),controlSessionId&&(message.controlSessionId=controlSessionId);let serialized=`${JSON.stringify(message)}
|
|
1085
1085
|
`,bytes=Buffer.byteLength(serialized,"utf8");if(bytes>10485760)throw new Error(`Cloud request exceeds ${10485760} byte message limit (${bytes} bytes)`);return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{this.pendingRequests.delete(id3),reject(new Error(`Request timeout after ${timeoutSec}s`))},timeoutSec*1e3+RESPONSE_GRACE_MS);this.pendingRequests.set(id3,{resolve:resolve16,reject,timer}),ws.send(serialized)})}rejectAllPending(error){for(let pending of this.pendingRequests.values())clearTimeout(pending.timer),pending.reject(error);this.pendingRequests.clear()}}}});function parseReleaseVersion(value){if(typeof value!="string")return null;let match=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/.exec(value);if(!match)return null;let parts=[Number(match[1]),Number(match[2]),Number(match[3]),Number(match[4]??0)];return parts.every(Number.isSafeInteger)?[...parts.slice(0,3),match[4]===void 0?1:0,parts[3]]:null}function isNewerRelease(latest,installed){let latestParts=parseReleaseVersion(latest),installedParts=parseReleaseVersion(installed);if(!latestParts||!installedParts)return!1;for(let index=0;index<latestParts.length;index++)if(latestParts[index]!==installedParts[index])return latestParts[index]>installedParts[index];return!1}async function fetchLatestVersion(component2){let source=component2==="extension"?process.env.MEARL_EXTENSION_CONFIG_URL||UPDATE_SOURCES.extension:UPDATE_SOURCES[component2],response=await fetch(source,{signal:AbortSignal.timeout(1500)});if(!response.ok)throw new Error(`HTTP ${response.status}`);let payload=await response.json(),version2=component2==="extension"?payload.latestVersion??payload.version:payload.version;if(!parseReleaseVersion(version2))throw new Error("Invalid release version");return version2}function formatError(error){return error instanceof Error?error.message:String(error)}function browserAccessLabel(access){return access.label||access.kind}async function getBrowserAccess(client,browser,capability,timeoutSec){let result=await client.invoke("get_browser_access_url",{},{timeoutSec,browser:browser.browserId});if(!result.browserAccess?.url)throw new Error("Browser host did not return an access URL");if(capability&&result.browserAccess.kind!==capability.kind)throw new Error("Browser host returned an unexpected access URL type");return result.browserAccess}function redactServerUrl(serverUrl){try{let parsed=new URL(serverUrl);for(let key of parsed.searchParams.keys())key.toLowerCase().includes("token")&&parsed.searchParams.set(key,"redacted");return parsed.toString()}catch{return serverUrl.replace(/([?&][^=&\s]*token[^=&\s]*=)[^&\s]*/gi,"$1redacted")}}function browserMatches2(browser,selector){let normalized=normalizeBrowserSelector(selector);return browser.browserId.toLowerCase()===normalized||browser.originalBrowserId?.toLowerCase()===normalized||browser.name.toLowerCase()===normalized||browser.originalName?.toLowerCase()===normalized}function findBrowsers2(browsers,selector){let exact=browsers.filter(browser=>browserMatches2(browser,selector));if(exact.length>0)return exact;let normalized=normalizeBrowserSelector(selector);return browsers.filter(browser=>browser.browserId.toLowerCase().includes(normalized)||browser.originalBrowserId?.toLowerCase().includes(normalized)||browser.name.toLowerCase().includes(normalized)||browser.originalName?.toLowerCase().includes(normalized))}function shortBrowserId(browserId){let parts=browserId.split(":"),raw=decodeURIComponent(parts.at(-1)??browserId);return raw.length>12?`${raw.slice(0,8)}…`:raw}function formatBrowser(browser,isDefault){let transport=browser.transport==="cdp"?" [CDP]":browser.transport==="extension"?" [Extension]":browser.transport==="provider"?` [Provider: ${browser.provider?.name||browser.provider?.id||"external"}]`:"",type=browser.type==="managed"?" [Managed]":"";return` ${isDefault?"★":" "} ${browser.name} [${shortBrowserId(browser.browserId)}]${type}${transport}`}function formatConnector(connector){let id3=connector.connectorId.length>12?`${connector.connectorId.slice(0,8)}…`:connector.connectorId,version2=connector.version?` [v${connector.version}]`:"";return` ${connector.name} [${id3}]${version2}`}function printSection(writeLine,title,items){writeLine(title);for(let item of items){let marker=item.status==="ok"?"✅":item.status==="warning"?"⚠️ ":"❌";writeLine(` ${marker} ${item.label}`);for(let detail of item.details??[])writeLine(` ${detail}`)}writeLine("")}async function runUnifiedCheck(options,dependencies={}){let timeoutSec=options.timeoutSec??5,writeLine=dependencies.writeLine??(line=>console.error(line)),writeJson=dependencies.writeJson??(json3=>process.stdout.write(`${json3}
|
|
1086
1086
|
`)),client=(dependencies.createClient??(clientOptions=>new UnifiedClient(clientOptions)))({...options.serverUrl?{serverUrl:options.serverUrl}:{},connectTimeoutSec:timeoutSec,requestTimeoutSec:timeoutSec}),latestVersions=options.checkUpdates?Promise.allSettled(Object.keys(UPDATE_SOURCES).map(component2=>(dependencies.fetchLatestVersion??fetchLatestVersion)(component2))):null,environment=[{status:"ok",label:`Unified client v${options.clientVersion}`}],connectors=[],browserList=null;try{if(options.local)environment.push({status:"ok",label:options.transport==="cdp"?"Browser scope: this machine (forced CDP)":"Browser scope: this machine"});else if(options.serverUrl){let source=options.serverUrlSource?` (${options.serverUrlSource})`:"";try{let connectorList=await client.invoke("connector_list",{},{timeoutSec});connectors=Array.isArray(connectorList?.connectors)?connectorList.connectors:[],environment.push({status:"ok",label:`Cloud server${source}`,details:[redactServerUrl(options.serverUrl),`${connectors.length} connector${connectors.length===1?"":"s"} connected`]})}catch(error){environment.push({status:"error",label:`Cloud server or connector discovery failed${source}`,details:[formatError(error),redactServerUrl(options.serverUrl),"On the Agent machine, run `mearl-cloud-server status` to verify the server and current connection command. Use `mearl check --local` to isolate this machine."]})}}else environment.push({status:"ok",label:"Local mode (no cloud-server configuration)"});let inventoryOptions={timeoutSec,...options.local?{local:!0}:{},...options.transport?{transport:options.transport}:{},...!options.local&&options.connector?{connector:options.connector}:{}};try{options.serverUrl&&!options.local&&environment.some(item=>item.status==="error")?browserList=await client.invoke("browser_list",{},{timeoutSec,local:!0}):browserList=await client.invoke("browser_list",{},inventoryOptions),environment.push({status:"ok",label:"Browser inventory"}),browserList.warnings?.length&&environment.push({status:"warning",label:"Some browser sources could not be inspected",details:browserList.warnings})}catch(error){environment.push({status:"error",label:"Browser inventory failed",details:[formatError(error)]})}let connected=(browserList?.browsers??[]).filter(browser=>browser.status==="connected"&&(options.transport!=="cdp"||browser.transport==="cdp"));if((options.local||!options.serverUrl)&&options.transport!=="cdp"&&!connected.some(browser=>browser.transport==="extension")){let diagnostics=(dependencies.inspectNativeHostInstallation??inspectNativeHostInstallation)();environment.push(...diagnostics.map(item=>({status:"warning",...item})))}let targets=connected;if(options.browser){let matches=findBrowsers2(connected,options.browser);matches.length===0?(environment.push({status:"error",label:`Browser "${options.browser}" is not connected`,details:["Run `mearl browser_list` and use an exact global browserId."]}),targets=[]):matches.length>1?(environment.push({status:"error",label:`Browser selector "${options.browser}" is ambiguous`,details:matches.map(browser=>browser.browserId)}),targets=[]):targets=matches}!options.browser&&connected.length===0&&browserList&&environment.push({status:"error",label:options.transport==="cdp"?"No connected CDP browser":"No connected browser",details:[options.transport==="cdp"?"Enable a local CDP endpoint (see `mearl-native-host --help`) and run `mearl browser_list --cdp` to inspect discovery.":"Open Chrome with the Mearl extension, start a managed browser, or connect a browser host.",...!options.local&&connectors.length>0?["Connectors are connected but expose no ready browser. On the browser machine, run `mearl check --local`; use `mearl connector_list` for versions and heartbeat details."]:[]]});let browserChecks=[];await Promise.all(targets.map(async browser=>{try{options.transport==="cdp"&&await client.invoke("tab_list",{},{timeoutSec,browser:browser.browserId,transport:"cdp"});let versions=await client.invoke("get_versions",{},{timeoutSec,browser:browser.browserId,...options.transport?{transport:options.transport}:{}}),publicVersions={...versions.nativeHost?{nativeHost:versions.nativeHost}:{},...versions.extension!==void 0?{extension:versions.extension}:{},...versions.browser!==void 0?{browser:versions.browser}:{},...versions.provider?{provider:versions.provider}:{}},details=[versions.nativeHost?`native-host v${versions.nativeHost}`:null,versions.extension?`extension v${versions.extension}`:null,versions.browser?`Chrome ${versions.browser}`:null,versions.provider?`${versions.provider.name} v${versions.provider.version} (protocol v${versions.provider.protocolVersion})`:null].filter(value=>value!==null),capabilities=options.browser?versions.capabilities:void 0;capabilities&&details.push(`capabilities (${capabilities.actions.length}): ${capabilities.actions.join(", ")||"none"}`,`screenshot: ${capabilities.screenshot}`);let extensionInstallation;options.local&&browser.transport==="extension"&&typeof versions.extensionId=="string"&&typeof versions.extension=="string"&&(typeof versions.setupManagedPath=="string"||versions.setupManagedPath===null)&&(extensionInstallation={extensionId:versions.extensionId,setupManagedPath:versions.setupManagedPath});let browserAccess,accessUrlWarning,browserAccessCapability=versions.browserAccess,providerAccess=browser.operations?.includes("access")===!0;if((providerAccess||browserAccessCapability)&&options.browser)try{browserAccess=await getBrowserAccess(client,browser,providerAccess?void 0:browserAccessCapability,timeoutSec),details.push(`Browser access URL (${browserAccessLabel(browserAccess)}; sensitive): ${browserAccess.url}`)}catch(error){accessUrlWarning=formatError(error),details.push(`Browser access URL unavailable: ${accessUrlWarning}`)}browserChecks.push({...browserAccess?{browserAccess}:{},browser,...capabilities?{capabilities}:{},...extensionInstallation?{extensionInstallation}:{},item:{status:accessUrlWarning?"warning":"ok",label:accessUrlWarning?"Browser command path ready; browser access URL unavailable":options.transport==="cdp"?"CDP command path":"Browser command path",details},versions:publicVersions,...accessUrlWarning?{warnings:[accessUrlWarning]}:{}})}catch(error){let message=formatError(error);browserChecks.push({browser,...message.includes("Unknown action")?{warnings:["Update @mearl/native-host for complete diagnostics."]}:{errors:[message]},item:message.includes("Unknown action")?{status:"warning",label:"Browser is reachable but runtime version details are unavailable",details:["Update @mearl/native-host for complete diagnostics."]}:{status:"error",label:"Browser command path failed",details:[message]}})}}));let updates;if(latestVersions){let latestResults=await latestVersions,components=Object.keys(UPDATE_SOURCES),installed=new Map,addInstalled=(component2,version2)=>{if(!version2)return;let versions=installed.get(component2)??new Set;versions.add(version2),installed.set(component2,versions)};addInstalled("client",options.clientVersion);for(let check of browserChecks)addInstalled("native-host",check.versions?.nativeHost),addInstalled("extension",check.versions?.extension);for(let connector of connectors)addInstalled("cloud-connector",connector.version);updates=components.flatMap((component2,index)=>{let result=latestResults[index];return[...installed.get(component2)??[]].map(version2=>({component:component2,installed:version2,...result.status==="fulfilled"?{latest:result.value}:{},status:result.status==="rejected"||!parseReleaseVersion(version2)||!parseReleaseVersion(result.value)?"unavailable":isNewerRelease(result.value,version2)?"available":"current"}))});let available=updates.filter(update=>update.status==="available"),unavailable=updates.filter(update=>update.status==="unavailable"),packageUpdateAvailable=available.some(update=>update.component==="client"||update.component==="native-host"),extensionUpdateAvailable=available.some(update=>update.component==="extension"),connectorUpdateAvailable=available.some(update=>update.component==="cloud-connector");environment.push({status:available.length||unavailable.length?"warning":"ok",label:available.length?`${available.length} Mearl update${available.length===1?"":"s"} available`:unavailable.length?"Mearl update check incomplete":"Mearl packages are current",details:[...available.map(update=>`${update.component}: ${update.installed} → ${update.latest}`),...packageUpdateAvailable?["Update on the affected machine: npx @mearl/setup update"]:[],...extensionUpdateAvailable?["Update a setup-managed extension: npx @mearl/setup extension"]:[],...connectorUpdateAvailable?["Update cloud-connector with its package manager on the connector machine."]:[],...unavailable.map(update=>`${update.component}: latest version unavailable`)]})}let hasError=environment.some(item=>item.status==="error")||browserChecks.some(check=>check.item.status==="error"),listedBrowsers=browserList?.browsers??[];if(options.json){let result={browsers:listedBrowsers.map(browser=>{let check=browserChecks.find(item=>item.browser.browserId===browser.browserId),browserIdentity={...browser};return delete browserIdentity.extensionVersion,delete browserIdentity.nativeHostVersion,{...browserIdentity,selected:targets.some(target=>target.browserId===browser.browserId),...check?.browserAccess?{browserAccess:check.browserAccess}:{},...check?.capabilities?{capabilities:check.capabilities}:{},...check?.item?{check:{label:check.item.label,status:check.item.status,...check.errors?{errors:check.errors}:{},...check.warnings?{warnings:check.warnings}:{}}}:{},...check?.extensionInstallation?{extensionInstallation:check.extensionInstallation}:{},...check?.versions?{versions:check.versions}:{}}}),clientVersion:options.clientVersion,connectors,environment,ok:!hasError,...updates?{updates}:{}};return writeJson(JSON.stringify(result,null,2)),result}if(writeLine(""),printSection(writeLine,"Environment",environment),connectors.length>0){writeLine("Cloud connectors");for(let connector of connectors)writeLine(formatConnector(connector));writeLine("")}if(listedBrowsers.length>0){writeLine("Browsers");for(let browser of listedBrowsers){writeLine(formatBrowser(browser,browser.browserId===browserList?.defaultBrowserId));let check=browserChecks.find(item=>item.browser.browserId===browser.browserId);if(check){let marker=check.item.status==="ok"?"✅":check.item.status==="warning"?"⚠️ ":"❌";writeLine(` ${marker} ${check.item.label}`);for(let detail of check.item.details??[])writeLine(` ${detail}`)}else browser.status!=="connected"&&writeLine(` ⚪ ${browser.status}`)}writeLine("")}return hasError?(writeLine("⚠️ Mearl checks failed. See the browser or source details above."),!1):(writeLine(options.browser?"🎉 Selected browser is ready!":`🎉 All ${targets.length} connected browser${targets.length===1?"":"s"} are ready!`),!0)}finally{client.disconnect()}}var UPDATE_SOURCES,init_check=__esm({"../client/dist/check.js"(){"use strict";init_nativeHost();init_unified();UPDATE_SOURCES={client:"https://registry.npmjs.org/@mearl%2Fclient/latest","native-host":"https://registry.npmjs.org/@mearl%2Fnative-host/latest","cloud-connector":"https://registry.npmjs.org/@mearl%2Fcloud-connector/latest",extension:"https://github.com/mearlhq/mearl/releases/latest/download/config.json"}}});var require_constants2=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/constants.js"(exports,module){module.exports={LOCHDR:30,LOCSIG:67324752,LOCVER:4,LOCFLG:6,LOCHOW:8,LOCTIM:10,LOCCRC:14,LOCSIZ:18,LOCLEN:22,LOCNAM:26,LOCEXT:28,EXTSIG:134695760,EXTHDR:16,EXTCRC:4,EXTSIZ:8,EXTLEN:12,CENHDR:46,CENSIG:33639248,CENVEM:4,CENVER:6,CENFLG:8,CENHOW:10,CENTIM:12,CENCRC:16,CENSIZ:20,CENLEN:24,CENNAM:28,CENEXT:30,CENCOM:32,CENDSK:34,CENATT:36,CENATX:38,CENOFF:42,ENDHDR:22,ENDSIG:101010256,ENDSUB:8,ENDTOT:10,ENDSIZ:12,ENDOFF:16,ENDCOM:20,END64HDR:20,END64SIG:117853008,END64START:4,END64OFF:8,END64NUMDISKS:16,ZIP64SIG:101075792,ZIP64HDR:56,ZIP64LEAD:12,ZIP64SIZE:4,ZIP64VEM:12,ZIP64VER:14,ZIP64DSK:16,ZIP64DSKDIR:20,ZIP64SUB:24,ZIP64TOT:32,ZIP64SIZB:40,ZIP64OFF:48,ZIP64EXTRA:56,STORED:0,SHRUNK:1,REDUCED1:2,REDUCED2:3,REDUCED3:4,REDUCED4:5,IMPLODED:6,DEFLATED:8,ENHANCED_DEFLATED:9,PKWARE:10,BZIP2:12,LZMA:14,IBM_TERSE:18,IBM_LZ77:19,AES_ENCRYPT:99,FLG_ENC:1,FLG_COMP1:2,FLG_COMP2:4,FLG_DESC:8,FLG_ENH:16,FLG_PATCH:32,FLG_STR:64,FLG_EFS:2048,FLG_MSK:4096,FILE:2,BUFFER:1,NONE:0,EF_ID:0,EF_SIZE:2,ID_ZIP64:1,ID_AVINFO:7,ID_PFS:8,ID_OS2:9,ID_NTFS:10,ID_OPENVMS:12,ID_UNIX:13,ID_FORK:14,ID_PATCH:15,ID_X509_PKCS7:20,ID_X509_CERTID_F:21,ID_X509_CERTID_C:22,ID_STRONGENC:23,ID_RECORD_MGT:24,ID_X509_PKCS7_RL:25,ID_IBM1:101,ID_IBM2:102,ID_POSZIP:18064,EF_ZIP64_OR_32:4294967295,EF_ZIP64_OR_16:65535,EF_ZIP64_SUNCOMP:0,EF_ZIP64_SCOMP:8,EF_ZIP64_RHO:16,EF_ZIP64_DSN:24}}});var require_errors=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/errors.js"(exports){var errors={INVALID_LOC:"Invalid LOC header (bad signature)",INVALID_CEN:"Invalid CEN header (bad signature)",INVALID_END:"Invalid END header (bad signature)",DESCRIPTOR_NOT_EXIST:"No descriptor present",DESCRIPTOR_UNKNOWN:"Unknown descriptor format",DESCRIPTOR_FAULTY:"Descriptor data is malformed",NO_DATA:"Nothing to decompress",BAD_CRC:"CRC32 checksum failed {0}",MAX_OUTPUT_EXCEEDED:"Decompressed data exceeds the declared uncompressed size",FILE_IN_THE_WAY:"There is a file in the way: {0}",UNKNOWN_METHOD:"Invalid/unsupported compression method",AVAIL_DATA:"inflate::Available inflate data did not terminate",INVALID_DISTANCE:"inflate::Invalid literal/length or distance code in fixed or dynamic block",TO_MANY_CODES:"inflate::Dynamic block code description: too many length or distance codes",INVALID_REPEAT_LEN:"inflate::Dynamic block code description: repeat more than specified lengths",INVALID_REPEAT_FIRST:"inflate::Dynamic block code description: repeat lengths with no first length",INCOMPLETE_CODES:"inflate::Dynamic block code description: code lengths codes incomplete",INVALID_DYN_DISTANCE:"inflate::Dynamic block code description: invalid distance code lengths",INVALID_CODES_LEN:"inflate::Dynamic block code description: invalid literal/length code lengths",INVALID_STORE_BLOCK:"inflate::Stored block length did not match one's complement",INVALID_BLOCK_TYPE:"inflate::Invalid block type (type == 3)",CANT_EXTRACT_FILE:"Could not extract the file",CANT_OVERRIDE:"Target file already exists",DISK_ENTRY_TOO_LARGE:"Number of disk entries is too large",NO_ZIP:"No zip file was loaded",NO_ENTRY:"Entry doesn't exist",DUPLICATE_ENTRY:"Duplicate entry name {0}",DIRECTORY_CONTENT_ERROR:"A directory cannot have content",FILE_NOT_FOUND:'File not found: "{0}"',NOT_IMPLEMENTED:"Not implemented",INVALID_FILENAME:"Invalid filename",INVALID_FORMAT:"Invalid or unsupported zip format. No END header found",ZIP64_VALUE_TOO_LARGE:"Zip64 value exceeds the maximum safe integer",INVALID_PASS_PARAM:"Incompatible password parameter",WRONG_PASSWORD:"Wrong Password",COMMENT_TOO_LONG:"Comment is too long",EXTRA_FIELD_PARSE_ERROR:"Extra field parsing error"};function E(message){return function(...args){return args.length&&(message=message.replace(/\{(\d)\}/g,(_,n)=>args[n]||"")),new Error("ADM-ZIP: "+message)}}for(let msg of Object.keys(errors))exports[msg]=E(errors[msg])}});var require_utils=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/utils.js"(exports,module){var fsystem=__require("fs"),pth=__require("path"),Constants=require_constants2(),Errors=require_errors(),isWin=typeof process=="object"&&process.platform==="win32",is_Obj=obj=>typeof obj=="object"&&obj!==null,crcTable=new Uint32Array(256).map((t,c)=>{for(let k=0;k<8;k++)(c&1)!==0?c=3988292384^c>>>1:c>>>=1;return c>>>0});function Utils(opts){this.sep=pth.sep,this.fs=fsystem,is_Obj(opts)&&is_Obj(opts.fs)&&typeof opts.fs.statSync=="function"&&(this.fs=opts.fs)}module.exports=Utils;Utils.prototype.makeDir=function(folder){let self=this;function mkdirSync14(fpath){let resolvedPath=fpath.split(self.sep)[0];fpath.split(self.sep).forEach(function(name){if(!(!name||name.substr(-1,1)===":")){resolvedPath+=self.sep+name;var stat5;try{stat5=self.fs.statSync(resolvedPath)}catch(e){if(e.message&&e.message.startsWith("ENOENT"))self.fs.mkdirSync(resolvedPath);else throw e}if(stat5&&stat5.isFile())throw Errors.FILE_IN_THE_WAY(`"${resolvedPath}"`)}})}mkdirSync14(folder)};Utils.prototype.writeFileTo=function(path29,content,overwrite,attr){let self=this;if(self.fs.existsSync(path29)){if(!overwrite)return!1;var stat5=self.fs.statSync(path29);if(stat5.isDirectory())return!1}var folder=pth.dirname(path29);self.fs.existsSync(folder)||self.makeDir(folder);var fd;try{fd=self.fs.openSync(path29,"w",438)}catch{self.fs.chmodSync(path29,438),fd=self.fs.openSync(path29,"w",438)}if(fd)try{self.fs.writeSync(fd,content,0,content.length,0)}finally{self.fs.closeSync(fd)}return self.fs.chmodSync(path29,attr||438),!0};Utils.prototype.writeFileToAsync=function(path29,content,overwrite,attr,callback){typeof attr=="function"&&(callback=attr,attr=void 0);let self=this;self.fs.exists(path29,function(exist){if(exist&&!overwrite)return callback(!1);self.fs.stat(path29,function(err,stat5){if(exist&&stat5&&stat5.isDirectory())return callback(!1);var folder=pth.dirname(path29);self.fs.exists(folder,function(exists){if(!exists)try{self.makeDir(folder)}catch{return callback(!1)}let writeToFd=function(fd){self.fs.write(fd,content,0,content.length,0,function(writeErr){self.fs.close(fd,function(){if(writeErr)return callback(!1);self.fs.chmod(path29,attr||438,function(){callback(!0)})})})};self.fs.open(path29,"w",438,function(err2,fd){err2?self.fs.chmod(path29,438,function(){self.fs.open(path29,"w",438,function(retryErr,fd2){if(retryErr||!fd2)return callback(!1);writeToFd(fd2)})}):fd?writeToFd(fd):callback(!1)})})})})};Utils.prototype.assertPathSafe=function(root,target){let self=this;if(typeof self.fs.lstatSync!="function")return;let resolvedRoot=pth.resolve(root),resolvedTarget=pth.resolve(target);if(resolvedTarget===resolvedRoot)return;let rel=pth.relative(resolvedRoot,resolvedTarget);if(!rel||rel===".."||rel.startsWith(".."+pth.sep)||pth.isAbsolute(rel))return;let cur=resolvedRoot;for(let part of rel.split(pth.sep)){if(!part||part===".")continue;cur=pth.join(cur,part);let stat5;try{stat5=self.fs.lstatSync(cur)}catch{break}if(stat5.isSymbolicLink())throw Errors.FILE_IN_THE_WAY(`"${cur}"`)}};Utils.prototype.findFiles=function(path29){let self=this,canLstat=typeof self.fs.lstatSync=="function",rootReal=self.fs.realpathSync(path29);function escapesRoot(p){if(!canLstat||!self.fs.lstatSync(p).isSymbolicLink())return!1;let real;try{real=self.fs.realpathSync(p)}catch{return!0}return!(real===rootReal||real.startsWith(rootReal+pth.sep))}function findSync(dir,pattern2,recursive,visited){typeof pattern2=="boolean"&&(recursive=pattern2,pattern2=void 0);let files=[];return self.fs.readdirSync(dir).forEach(function(file){let path30=pth.join(dir,file);if(escapesRoot(path30))return;let stat5=self.fs.statSync(path30);if((!pattern2||pattern2.test(path30))&&files.push(pth.normalize(path30)+(stat5.isDirectory()?self.sep:"")),stat5.isDirectory()&&recursive){let realDir=self.fs.realpathSync(path30);visited.has(realDir)||(visited.add(realDir),files=files.concat(findSync(path30,pattern2,recursive,visited)))}}),files}return findSync(path29,void 0,!0,new Set([rootReal]))};Utils.prototype.findFilesAsync=function(dir,cb){let self=this,results=[],finished=!1,finish=function(err){finished||(finished=!0,cb(err,err?void 0:results))},canLstat=typeof self.fs.lstat=="function",rootReal=null,escapesRoot=function(file,cb2){if(!canLstat)return cb2(null,!1);self.fs.lstat(file,function(err,lst){if(err)return cb2(err);if(!lst||!lst.isSymbolicLink())return cb2(null,!1);self.fs.realpath(file,function(err2,real){if(err2)return cb2(null,!0);cb2(null,!(real===rootReal||real.startsWith(rootReal+pth.sep)))})})},walk=function(dir2,visited,done){self.fs.readdir(dir2,function(err,list){if(err)return done(err);let pending=list.length;if(!pending)return done();list.forEach(function(name){let file=pth.join(dir2,name);escapesRoot(file,function(err2,escapes){if(err2)return done(err2);if(escapes){--pending||done();return}self.fs.stat(file,function(err3,stat5){if(err3)return done(err3);if(!stat5){--pending||done();return}if(results.push(pth.normalize(file)+(stat5.isDirectory()?self.sep:"")),!stat5.isDirectory()){--pending||done();return}self.fs.realpath(file,function(err4,realDir){if(err4)return done(err4);if(visited.has(realDir)){--pending||done();return}visited.add(realDir),walk(file,visited,function(err5){if(err5)return done(err5);--pending||done()})})})})})})};self.fs.realpath(dir,function(err,realDir){if(err)return finish(err);rootReal=realDir,walk(dir,new Set([realDir]),finish)})};Utils.prototype.getAttributes=function(){};Utils.prototype.setAttributes=function(){};Utils.crc32update=function(crc,byte){return crcTable[(crc^byte)&255]^crc>>>8};Utils.crc32=function(buf){typeof buf=="string"&&(buf=Buffer.from(buf,"utf8"));let len=buf.length,crc=-1;for(let off=0;off<len;)crc=Utils.crc32update(crc,buf[off++]);return~crc>>>0};Utils.methodToString=function(method){switch(method){case Constants.STORED:return"STORED ("+method+")";case Constants.DEFLATED:return"DEFLATED ("+method+")";default:return"UNSUPPORTED ("+method+")"}};Utils.canonical=function(path29){if(!path29)return"";let safeSuffix=pth.posix.normalize("/"+path29.split("\\").join("/"));return pth.join(".",safeSuffix)};Utils.zipnamefix=function(path29){if(!path29)return"";let safeSuffix=pth.posix.normalize("/"+path29.split("\\").join("/"));return pth.posix.join(".",safeSuffix)};Utils.findLast=function(arr,callback){if(!Array.isArray(arr))throw new TypeError("arr is not array");let len=arr.length>>>0;for(let i=len-1;i>=0;i--)if(callback(arr[i],i,arr))return arr[i]};Utils.sanitize=function(prefix,name){prefix=pth.resolve(pth.normalize(prefix));for(var parts=name.split("/"),i=0,l=parts.length;i<l;i++){var path29=pth.normalize(pth.join(prefix,parts.slice(i,l).join(pth.sep)));if(path29===prefix||path29.startsWith(prefix+pth.sep))return path29}return pth.normalize(pth.join(prefix,pth.basename(name)))};Utils.toBuffer=function(input2,encoder){return Buffer.isBuffer(input2)?input2:input2 instanceof Uint8Array?Buffer.from(input2):typeof input2=="string"?encoder(input2):Buffer.alloc(0)};Utils.readBigUInt64LE=function(buffer,index){let lo=buffer.readUInt32LE(index),value=buffer.readUInt32LE(index+4)*4294967296+lo;if(value>Number.MAX_SAFE_INTEGER)throw Errors.ZIP64_VALUE_TOO_LARGE();return value};Utils.writeBigUInt64LE=function(buffer,value,index){let lo=value>>>0,hi=Math.floor(value/4294967296)>>>0;buffer.writeUInt32LE(lo,index),buffer.writeUInt32LE(hi,index+4)};Utils.fromDOS2Date=function(val){return new Date((val>>25&127)+1980,Math.max((val>>21&15)-1,0),Math.max(val>>16&31,1),val>>11&31,val>>5&63,(val&31)<<1)};Utils.fromDate2DOS=function(val){let date=0,time=0;return val.getFullYear()>1979&&(date=(val.getFullYear()-1980&127)<<9|val.getMonth()+1<<5|val.getDate(),time=val.getHours()<<11|val.getMinutes()<<5|val.getSeconds()>>1),date<<16|time};Utils.isWin=isWin;Utils.crcTable=crcTable}});var require_fattr=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/fattr.js"(exports,module){var pth=__require("path");module.exports=function(path29,{fs:fs22}){var _path=path29||"",_obj=newAttr(),_stat=null;function newAttr(){return{directory:!1,readonly:!1,hidden:!1,executable:!1,mtime:0,atime:0}}return _path&&fs22.existsSync(_path)?(_stat=fs22.statSync(_path),_obj.directory=_stat.isDirectory(),_obj.mtime=_stat.mtime,_obj.atime=_stat.atime,_obj.executable=(73&_stat.mode)!==0,_obj.readonly=(128&_stat.mode)===0,_obj.hidden=pth.basename(_path)[0]==="."):console.warn("Invalid path: "+_path),{get directory(){return _obj.directory},get readOnly(){return _obj.readonly},get hidden(){return _obj.hidden},get mtime(){return _obj.mtime},get atime(){return _obj.atime},get executable(){return _obj.executable},decodeAttributes:function(){},encodeAttributes:function(){},toJSON:function(){return{path:_path,isDirectory:_obj.directory,isReadOnly:_obj.readonly,isHidden:_obj.hidden,isExecutable:_obj.executable,mTime:_obj.mtime,aTime:_obj.atime}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_decoder=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/decoder.js"(exports,module){module.exports={efs:!0,encode:data=>Buffer.from(data,"utf8"),decode:data=>data.toString("utf8")}}});var require_util=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/index.js"(exports,module){module.exports=require_utils();module.exports.Constants=require_constants2();module.exports.Errors=require_errors();module.exports.FileAttr=require_fattr();module.exports.decoder=require_decoder()}});var require_entryHeader=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/headers/entryHeader.js"(exports,module){var Utils=require_util(),Constants=Utils.Constants;module.exports=function(){var _verMade=20,_version=10,_flags=0,_method=0,_time=0,_crc=0,_compressedSize=0,_size=0,_fnameLen=0,_extraLen=0,_comLen=0,_diskStart=0,_inattr=0,_attr=0,_offset=0;_verMade|=Utils.isWin?2560:768,_flags|=Constants.FLG_EFS;let _localHeader={extraLen:0},uint32=val=>Math.max(0,val)>>>0,uint16=val=>Math.max(0,val)&65535,uint8=val=>Math.max(0,val)&255;return _time=Utils.fromDate2DOS(new Date),{get made(){return _verMade},set made(val){_verMade=val},get version(){return _version},set version(val){_version=val},get flags(){return _flags},set flags(val){_flags=val},get flags_efs(){return(_flags&Constants.FLG_EFS)>0},set flags_efs(val){val?_flags|=Constants.FLG_EFS:_flags&=~Constants.FLG_EFS},get flags_desc(){return(_flags&Constants.FLG_DESC)>0},set flags_desc(val){val?_flags|=Constants.FLG_DESC:_flags&=~Constants.FLG_DESC},get method(){return _method},set method(val){switch(val){case Constants.STORED:this.version=10;break;case Constants.DEFLATED:default:this.version=20}_method=val},get time(){return Utils.fromDOS2Date(this.timeval)},set time(val){val=new Date(val),this.timeval=Utils.fromDate2DOS(val)},get timeval(){return _time},set timeval(val){_time=uint32(val)},get timeHighByte(){return uint8(_time>>>8)},get crc(){return _crc},set crc(val){_crc=uint32(val)},get compressedSize(){return _compressedSize},set compressedSize(val){_compressedSize=uint32(val)},get size(){return _size},set size(val){_size=uint32(val)},get fileNameLength(){return _fnameLen},set fileNameLength(val){_fnameLen=val},get extraLength(){return _extraLen},set extraLength(val){_extraLen=val},get extraLocalLength(){return _localHeader.extraLen},set extraLocalLength(val){_localHeader.extraLen=val},get commentLength(){return _comLen},set commentLength(val){_comLen=val},get diskNumStart(){return _diskStart},set diskNumStart(val){_diskStart=uint32(val)},get inAttr(){return _inattr},set inAttr(val){_inattr=uint32(val)},get attr(){return _attr},set attr(val){_attr=uint32(val)},get fileAttr(){return(_attr||0)>>16&511},get offset(){return _offset},set offset(val){_offset=uint32(val)},get encrypted(){return(_flags&Constants.FLG_ENC)===Constants.FLG_ENC},get centralHeaderSize(){return Constants.CENHDR+_fnameLen+_extraLen+_comLen},get realDataOffset(){return _offset+Constants.LOCHDR+_localHeader.fnameLen+_localHeader.extraLen},get localHeader(){return _localHeader},loadLocalHeaderFromBinary:function(input2){if(_offset<0||_offset+Constants.LOCHDR>input2.length)throw Utils.Errors.INVALID_LOC();var data=input2.slice(_offset,_offset+Constants.LOCHDR);if(data.readUInt32LE(0)!==Constants.LOCSIG)throw Utils.Errors.INVALID_LOC();_localHeader.version=data.readUInt16LE(Constants.LOCVER),_localHeader.flags=data.readUInt16LE(Constants.LOCFLG),_localHeader.flags_desc=(_localHeader.flags&Constants.FLG_DESC)>0,_localHeader.method=data.readUInt16LE(Constants.LOCHOW),_localHeader.time=data.readUInt32LE(Constants.LOCTIM),_localHeader.crc=data.readUInt32LE(Constants.LOCCRC),_localHeader.compressedSize=data.readUInt32LE(Constants.LOCSIZ),_localHeader.size=data.readUInt32LE(Constants.LOCLEN),_localHeader.fnameLen=data.readUInt16LE(Constants.LOCNAM),_localHeader.extraLen=data.readUInt16LE(Constants.LOCEXT);let extraStart=_offset+Constants.LOCHDR+_localHeader.fnameLen,extraEnd=extraStart+_localHeader.extraLen;return input2.slice(extraStart,extraEnd)},loadFromBinary:function(data){if(data.length!==Constants.CENHDR||data.readUInt32LE(0)!==Constants.CENSIG)throw Utils.Errors.INVALID_CEN();_verMade=data.readUInt16LE(Constants.CENVEM),_version=data.readUInt16LE(Constants.CENVER),_flags=data.readUInt16LE(Constants.CENFLG),_method=data.readUInt16LE(Constants.CENHOW),_time=data.readUInt32LE(Constants.CENTIM),_crc=data.readUInt32LE(Constants.CENCRC),_compressedSize=data.readUInt32LE(Constants.CENSIZ),_size=data.readUInt32LE(Constants.CENLEN),_fnameLen=data.readUInt16LE(Constants.CENNAM),_extraLen=data.readUInt16LE(Constants.CENEXT),_comLen=data.readUInt16LE(Constants.CENCOM),_diskStart=data.readUInt16LE(Constants.CENDSK),_inattr=data.readUInt16LE(Constants.CENATT),_attr=data.readUInt32LE(Constants.CENATX),_offset=data.readUInt32LE(Constants.CENOFF)},localHeaderToBinary:function(){var data=Buffer.alloc(Constants.LOCHDR);return data.writeUInt32LE(Constants.LOCSIG,0),data.writeUInt16LE(_version,Constants.LOCVER),data.writeUInt16LE(_flags&~Constants.FLG_DESC,Constants.LOCFLG),data.writeUInt16LE(_method,Constants.LOCHOW),data.writeUInt32LE(_time,Constants.LOCTIM),data.writeUInt32LE(_crc,Constants.LOCCRC),data.writeUInt32LE(_compressedSize,Constants.LOCSIZ),data.writeUInt32LE(_size,Constants.LOCLEN),data.writeUInt16LE(_fnameLen,Constants.LOCNAM),data.writeUInt16LE(_localHeader.extraLen,Constants.LOCEXT),data},centralHeaderToBinary:function(){var data=Buffer.alloc(Constants.CENHDR+_fnameLen+_extraLen+_comLen);return data.writeUInt32LE(Constants.CENSIG,0),data.writeUInt16LE(_verMade,Constants.CENVEM),data.writeUInt16LE(_version,Constants.CENVER),data.writeUInt16LE(_flags&~Constants.FLG_DESC,Constants.CENFLG),data.writeUInt16LE(_method,Constants.CENHOW),data.writeUInt32LE(_time,Constants.CENTIM),data.writeUInt32LE(_crc,Constants.CENCRC),data.writeUInt32LE(_compressedSize,Constants.CENSIZ),data.writeUInt32LE(_size,Constants.CENLEN),data.writeUInt16LE(_fnameLen,Constants.CENNAM),data.writeUInt16LE(_extraLen,Constants.CENEXT),data.writeUInt16LE(_comLen,Constants.CENCOM),data.writeUInt16LE(_diskStart,Constants.CENDSK),data.writeUInt16LE(_inattr,Constants.CENATT),data.writeUInt32LE(_attr,Constants.CENATX),data.writeUInt32LE(_offset,Constants.CENOFF),data},toJSON:function(){let bytes=function(nr){return nr+" bytes"};return{made:_verMade,version:_version,flags:_flags,method:Utils.methodToString(_method),time:this.time,crc:"0x"+_crc.toString(16).toUpperCase(),compressedSize:bytes(_compressedSize),size:bytes(_size),fileNameLength:bytes(_fnameLen),extraLength:bytes(_extraLen),commentLength:bytes(_comLen),diskNumStart:_diskStart,inAttr:_inattr,attr:_attr,offset:_offset,centralHeaderSize:bytes(Constants.CENHDR+_fnameLen+_extraLen+_comLen)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_mainHeader=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/headers/mainHeader.js"(exports,module){var Utils=require_util(),Constants=Utils.Constants;module.exports=function(){var _volumeEntries=0,_totalEntries=0,_size=0,_offset=0,_commentLength=0;let needsZip64=()=>_volumeEntries>Constants.EF_ZIP64_OR_16||_totalEntries>Constants.EF_ZIP64_OR_16||_size>Constants.EF_ZIP64_OR_32||_offset>Constants.EF_ZIP64_OR_32;return{get diskEntries(){return _volumeEntries},set diskEntries(val){_volumeEntries=_totalEntries=val},get totalEntries(){return _totalEntries},set totalEntries(val){_totalEntries=_volumeEntries=val},get size(){return _size},set size(val){_size=val},get offset(){return _offset},set offset(val){_offset=val},get commentLength(){return _commentLength},set commentLength(val){_commentLength=val},get mainHeaderSize(){return(needsZip64()?Constants.ZIP64HDR+Constants.END64HDR:0)+Constants.ENDHDR+_commentLength},loadFromBinary:function(data){if((data.length!==Constants.ENDHDR||data.readUInt32LE(0)!==Constants.ENDSIG)&&(data.length<Constants.ZIP64HDR||data.readUInt32LE(0)!==Constants.ZIP64SIG))throw Utils.Errors.INVALID_END();data.readUInt32LE(0)===Constants.ENDSIG?(_volumeEntries=data.readUInt16LE(Constants.ENDSUB),_totalEntries=data.readUInt16LE(Constants.ENDTOT),_size=data.readUInt32LE(Constants.ENDSIZ),_offset=data.readUInt32LE(Constants.ENDOFF),_commentLength=data.readUInt16LE(Constants.ENDCOM)):(_volumeEntries=Utils.readBigUInt64LE(data,Constants.ZIP64SUB),_totalEntries=Utils.readBigUInt64LE(data,Constants.ZIP64TOT),_size=Utils.readBigUInt64LE(data,Constants.ZIP64SIZB),_offset=Utils.readBigUInt64LE(data,Constants.ZIP64OFF),_commentLength=0)},toBinary:function(){if(!needsZip64()){var b=Buffer.alloc(Constants.ENDHDR+_commentLength);return b.writeUInt32LE(Constants.ENDSIG,0),b.writeUInt32LE(0,4),b.writeUInt16LE(_volumeEntries,Constants.ENDSUB),b.writeUInt16LE(_totalEntries,Constants.ENDTOT),b.writeUInt32LE(_size,Constants.ENDSIZ),b.writeUInt32LE(_offset,Constants.ENDOFF),b.writeUInt16LE(_commentLength,Constants.ENDCOM),b.fill(" ",Constants.ENDHDR),b}var b=Buffer.alloc(this.mainHeaderSize);let offset=0;b.writeUInt32LE(Constants.ZIP64SIG,offset),Utils.writeBigUInt64LE(b,Constants.ZIP64HDR-Constants.ZIP64LEAD,offset+Constants.ZIP64SIZE),b.writeUInt16LE(45,offset+Constants.ZIP64VEM),b.writeUInt16LE(45,offset+Constants.ZIP64VER),b.writeUInt32LE(0,offset+Constants.ZIP64DSK),b.writeUInt32LE(0,offset+Constants.ZIP64DSKDIR),Utils.writeBigUInt64LE(b,_volumeEntries,offset+Constants.ZIP64SUB),Utils.writeBigUInt64LE(b,_totalEntries,offset+Constants.ZIP64TOT),Utils.writeBigUInt64LE(b,_size,offset+Constants.ZIP64SIZB),Utils.writeBigUInt64LE(b,_offset,offset+Constants.ZIP64OFF);let zip64EndOffset=_offset+_size;return offset+=Constants.ZIP64HDR,b.writeUInt32LE(Constants.END64SIG,offset),b.writeUInt32LE(0,offset+Constants.END64START),Utils.writeBigUInt64LE(b,zip64EndOffset,offset+Constants.END64OFF),b.writeUInt32LE(1,offset+Constants.END64NUMDISKS),offset+=Constants.END64HDR,b.writeUInt32LE(Constants.ENDSIG,offset),b.writeUInt32LE(0,offset+4),b.writeUInt16LE(Math.min(_volumeEntries,Constants.EF_ZIP64_OR_16),offset+Constants.ENDSUB),b.writeUInt16LE(Math.min(_totalEntries,Constants.EF_ZIP64_OR_16),offset+Constants.ENDTOT),b.writeUInt32LE(Math.min(_size,Constants.EF_ZIP64_OR_32),offset+Constants.ENDSIZ),b.writeUInt32LE(Math.min(_offset,Constants.EF_ZIP64_OR_32),offset+Constants.ENDOFF),b.writeUInt16LE(_commentLength,offset+Constants.ENDCOM),b.fill(" ",offset+Constants.ENDHDR),b},toJSON:function(){let offset=function(nr,len){let offs=nr.toString(16).toUpperCase();for(;offs.length<len;)offs="0"+offs;return"0x"+offs};return{diskEntries:_volumeEntries,totalEntries:_totalEntries,size:_size+" bytes",offset:offset(_offset,4),commentLength:_commentLength}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_headers=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/headers/index.js"(exports){exports.EntryHeader=require_entryHeader();exports.MainHeader=require_mainHeader()}});var require_deflater=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/deflater.js"(exports,module){module.exports=function(inbuf){var zlib=__require("zlib"),opts={chunkSize:(parseInt(inbuf.length/1024)+1)*1024};return{deflate:function(){return zlib.deflateRawSync(inbuf,opts)},deflateAsync:function(callback){var tmp=zlib.createDeflateRaw(opts),parts=[],total=0;tmp.on("data",function(data){parts.push(data),total+=data.length}),tmp.on("end",function(){var buf=Buffer.alloc(total),written=0;buf.fill(0);for(var i=0;i<parts.length;i++){var part=parts[i];part.copy(buf,written),written+=part.length}callback&&callback(buf)}),tmp.end(inbuf)}}}}});var require_inflater=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/inflater.js"(exports,module){var version2=+(process?.versions?.node??"").split(".")[0]||0,Errors=require_errors();module.exports=function(inbuf,expectedLength){var zlib=__require("zlib");let maxOutputLength=expectedLength>0?expectedLength:1,option=version2>=15?{maxOutputLength}:{};return{inflate:function(){return zlib.inflateRawSync(inbuf,option)},inflateAsync:function(callback){var tmp=zlib.createInflateRaw(option),parts=[],total=0,done=!1;let fail2=function(err){done||(done=!0,tmp.destroy(),callback&&callback(Buffer.alloc(0),err))};tmp.on("error",function(err){fail2(err)}),tmp.on("data",function(data){if(!done){if(total+=data.length,total>maxOutputLength)return fail2(Errors.MAX_OUTPUT_EXCEEDED());parts.push(data)}}),tmp.on("end",function(){if(!done){done=!0;var buf=Buffer.alloc(total),written=0;buf.fill(0);for(var i=0;i<parts.length;i++){var part=parts[i];part.copy(buf,written),written+=part.length}callback&&callback(buf)}}),tmp.end(inbuf)}}}}});var require_zipcrypto=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/zipcrypto.js"(exports,module){"use strict";var{randomFillSync}=__require("crypto"),Errors=require_errors(),crctable=new Uint32Array(256).map((t,crc)=>{for(let j=0;j<8;j++)(crc&1)!==0?crc=crc>>>1^3988292384:crc>>>=1;return crc>>>0}),uMul=(a,b)=>Math.imul(a,b)>>>0,crc32update=(pCrc32,bval)=>crctable[(pCrc32^bval)&255]^pCrc32>>>8,genSalt=()=>typeof randomFillSync=="function"?randomFillSync(Buffer.alloc(12)):genSalt.node();genSalt.node=()=>{let salt=Buffer.alloc(12),len=salt.length;for(let i=0;i<len;i++)salt[i]=Math.random()*256&255;return salt};var config={genSalt};function Initkeys(pw){let pass=Buffer.isBuffer(pw)?pw:Buffer.from(pw);this.keys=new Uint32Array([305419896,591751049,878082192]);for(let i=0;i<pass.length;i++)this.updateKeys(pass[i])}Initkeys.prototype.updateKeys=function(byteValue){let keys=this.keys;return keys[0]=crc32update(keys[0],byteValue),keys[1]+=keys[0]&255,keys[1]=uMul(keys[1],134775813)+1,keys[2]=crc32update(keys[2],keys[1]>>>24),byteValue};Initkeys.prototype.next=function(){let k=(this.keys[2]|2)>>>0;return uMul(k,k^1)>>8&255};function make_decrypter(pwd){let keys=new Initkeys(pwd);return function(data){let result=Buffer.alloc(data.length),pos=0;for(let c of data)result[pos++]=keys.updateKeys(c^keys.next());return result}}function make_encrypter(pwd){let keys=new Initkeys(pwd);return function(data,result,pos=0){result||(result=Buffer.alloc(data.length));for(let c of data){let k=keys.next();result[pos++]=c^k,keys.updateKeys(c)}return result}}function decrypt(data,header,pwd){if(!data||!Buffer.isBuffer(data)||data.length<12)return Buffer.alloc(0);let decrypter=make_decrypter(pwd),salt=decrypter(data.slice(0,12)),verifyByte=(header.flags&8)===8?header.timeHighByte:header.crc>>>24;if(salt[11]!==verifyByte)throw Errors.WRONG_PASSWORD();return decrypter(data.slice(12))}function _salter(data){Buffer.isBuffer(data)&&data.length>=12?config.genSalt=function(){return data.slice(0,12)}:data==="node"?config.genSalt=genSalt.node:config.genSalt=genSalt}function encrypt(data,header,pwd,oldlike=!1){data==null&&(data=Buffer.alloc(0)),Buffer.isBuffer(data)||(data=Buffer.from(data.toString()));let encrypter=make_encrypter(pwd),salt=config.genSalt();salt[11]=header.crc>>>24&255,oldlike&&(salt[10]=header.crc>>>16&255);let result=Buffer.alloc(data.length+12);return encrypter(salt,result),encrypter(data,result,12)}module.exports={decrypt,encrypt,_salter}}});var require_methods=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/index.js"(exports){exports.Deflater=require_deflater();exports.Inflater=require_inflater();exports.ZipCrypto=require_zipcrypto()}});var require_zipEntry=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/zipEntry.js"(exports,module){var Utils=require_util(),Headers=require_headers(),Constants=Utils.Constants,Methods=require_methods();module.exports=function(options,input2){var _centralHeader=new Headers.EntryHeader,_entryName=Buffer.alloc(0),_comment=Buffer.alloc(0),_isDirectory=!1,uncompressedData=null,_extra=Buffer.alloc(0),_extralocal=Buffer.alloc(0),_efs=!0;let opts=options,decoder=typeof opts.decoder=="object"?opts.decoder:Utils.decoder;_efs=decoder.hasOwnProperty("efs")?decoder.efs:!1;function getCompressedDataFromZip(){if(!input2||!(input2 instanceof Uint8Array))return Buffer.alloc(0);_extralocal=_centralHeader.loadLocalHeaderFromBinary(input2);let dataOffset=_centralHeader.realDataOffset,dataEnd=dataOffset+_centralHeader.compressedSize;if(dataOffset<0||dataEnd<dataOffset||dataEnd>input2.length)throw Utils.Errors.INVALID_LOC();return input2.slice(dataOffset,dataEnd)}function crc32OK(data){let expectedCrc=_centralHeader.flags_desc||_centralHeader.localHeader.flags_desc?_centralHeader.crc:_centralHeader.localHeader.crc;return Utils.crc32(data)===expectedCrc}function decompress(async,callback,pass){if(typeof callback>"u"&&typeof async=="string"&&(pass=async,async=void 0),_isDirectory)return async&&callback&&callback(Buffer.alloc(0),Utils.Errors.DIRECTORY_CONTENT_ERROR()),Buffer.alloc(0);var compressedData;try{if(compressedData=getCompressedDataFromZip(),compressedData.length===0)return async&&callback&&callback(compressedData),compressedData;if(_centralHeader.encrypted){if(typeof pass!="string"&&!Buffer.isBuffer(pass))throw Utils.Errors.INVALID_PASS_PARAM();compressedData=Methods.ZipCrypto.decrypt(compressedData,_centralHeader,pass)}}catch(err){if(async&&callback)return callback(Buffer.alloc(0),err),Buffer.alloc(0);throw err}var data;switch(_centralHeader.method){case Utils.Constants.STORED:if(data=Buffer.alloc(compressedData.length),compressedData.copy(data),crc32OK(data))return async&&callback&&callback(data),data;throw async&&callback&&callback(data,Utils.Errors.BAD_CRC()),Utils.Errors.BAD_CRC();case Utils.Constants.DEFLATED:var inflater=new Methods.Inflater(compressedData,_centralHeader.size);if(async)inflater.inflateAsync(function(result,err){callback&&(err?callback(Buffer.alloc(0),err):crc32OK(result)?callback(result):callback(result,Utils.Errors.BAD_CRC()))});else{if(data=inflater.inflate(),!crc32OK(data))throw Utils.Errors.BAD_CRC(`"${decoder.decode(_entryName)}"`);return data}break;default:throw async&&callback&&callback(Buffer.alloc(0),Utils.Errors.UNKNOWN_METHOD()),Utils.Errors.UNKNOWN_METHOD()}}function compress(async,callback){if((!uncompressedData||!uncompressedData.length)&&Buffer.isBuffer(input2))return async&&callback&&callback(getCompressedDataFromZip()),getCompressedDataFromZip();if(uncompressedData.length&&!_isDirectory){var compressedData;switch(_centralHeader.method){case Utils.Constants.STORED:return _centralHeader.compressedSize=_centralHeader.size,compressedData=Buffer.alloc(uncompressedData.length),uncompressedData.copy(compressedData),async&&callback&&callback(compressedData),compressedData;default:case Utils.Constants.DEFLATED:var deflater=new Methods.Deflater(uncompressedData);if(async)deflater.deflateAsync(function(data){compressedData=Buffer.alloc(data.length),_centralHeader.compressedSize=data.length,data.copy(compressedData),callback&&callback(compressedData)});else{var deflated=deflater.deflate();return _centralHeader.compressedSize=deflated.length,deflated}deflater=null;break}}else if(async&&callback)callback(Buffer.alloc(0));else return Buffer.alloc(0)}function readUInt64LE(buffer,offset){return Utils.readBigUInt64LE(buffer,offset)}function parseExtra(data){try{for(var offset=0,signature,size,part;offset+4<data.length;)signature=data.readUInt16LE(offset),offset+=2,size=data.readUInt16LE(offset),offset+=2,part=data.slice(offset,offset+size),offset+=size,Constants.ID_ZIP64===signature&&parseZip64ExtendedInformation(part)}catch{throw Utils.Errors.EXTRA_FIELD_PARSE_ERROR()}}function parseZip64ExtendedInformation(data){var size,compressedSize,offset,diskNumStart;data.length>=Constants.EF_ZIP64_SCOMP&&(size=readUInt64LE(data,Constants.EF_ZIP64_SUNCOMP),_centralHeader.size===Constants.EF_ZIP64_OR_32&&(_centralHeader.size=size)),data.length>=Constants.EF_ZIP64_RHO&&(compressedSize=readUInt64LE(data,Constants.EF_ZIP64_SCOMP),_centralHeader.compressedSize===Constants.EF_ZIP64_OR_32&&(_centralHeader.compressedSize=compressedSize)),data.length>=Constants.EF_ZIP64_DSN&&(offset=readUInt64LE(data,Constants.EF_ZIP64_RHO),_centralHeader.offset===Constants.EF_ZIP64_OR_32&&(_centralHeader.offset=offset)),data.length>=Constants.EF_ZIP64_DSN+4&&(diskNumStart=data.readUInt32LE(Constants.EF_ZIP64_DSN),_centralHeader.diskNumStart===Constants.EF_ZIP64_OR_16&&(_centralHeader.diskNumStart=diskNumStart))}return{get entryName(){return decoder.decode(_entryName)},get rawEntryName(){return _entryName},set entryName(val){_entryName=Utils.toBuffer(val,decoder.encode);var lastChar=_entryName[_entryName.length-1];_isDirectory=lastChar===47||lastChar===92,_centralHeader.fileNameLength=_entryName.length},get efs(){return typeof _efs=="function"?_efs(this.entryName):_efs},get extra(){return _extra},set extra(val){_extra=val,_centralHeader.extraLength=val.length,parseExtra(val)},get comment(){return decoder.decode(_comment)},set comment(val){if(_comment=Utils.toBuffer(val,decoder.encode),_centralHeader.commentLength=_comment.length,_comment.length>65535)throw Utils.Errors.COMMENT_TOO_LONG()},get name(){let n=decoder.decode(_entryName);return _isDirectory?n.replace(/[/\\]$/,"").split("/").pop():n.split("/").pop()},get isDirectory(){return _isDirectory},getCompressedData:function(){return compress(!1,null)},getCompressedDataAsync:function(callback){compress(!0,callback)},setData:function(value){uncompressedData=Utils.toBuffer(value,Utils.decoder.encode),!_isDirectory&&uncompressedData.length?(_centralHeader.size=uncompressedData.length,_centralHeader.method=Utils.Constants.DEFLATED,_centralHeader.crc=Utils.crc32(value),_centralHeader.changed=!0):_centralHeader.method=Utils.Constants.STORED},getData:function(pass){return _centralHeader.changed?uncompressedData:decompress(!1,null,pass)},getDataAsync:function(callback,pass){_centralHeader.changed?callback(uncompressedData):decompress(!0,callback,pass)},set attr(attr){_centralHeader.attr=attr},get attr(){return _centralHeader.attr},set header(data){_centralHeader.loadFromBinary(data)},get header(){return _centralHeader},packCentralHeader:function(){_centralHeader.flags_efs=this.efs,_centralHeader.extraLength=_extra.length;var header=_centralHeader.centralHeaderToBinary(),addpos=Utils.Constants.CENHDR;return _entryName.copy(header,addpos),addpos+=_entryName.length,_extra.copy(header,addpos),addpos+=_centralHeader.extraLength,_comment.copy(header,addpos),header},packLocalHeader:function(){let addpos=0;_centralHeader.flags_efs=this.efs,_centralHeader.extraLocalLength=_extralocal.length;let localHeaderBuf=_centralHeader.localHeaderToBinary(),localHeader=Buffer.alloc(localHeaderBuf.length+_entryName.length+_centralHeader.extraLocalLength);return localHeaderBuf.copy(localHeader,addpos),addpos+=localHeaderBuf.length,_entryName.copy(localHeader,addpos),addpos+=_entryName.length,_extralocal.copy(localHeader,addpos),addpos+=_extralocal.length,localHeader},toJSON:function(){let bytes=function(nr){return"<"+(nr&&nr.length+" bytes buffer"||"null")+">"};return{entryName:this.entryName,name:this.name,comment:this.comment,isDirectory:this.isDirectory,header:_centralHeader.toJSON(),compressedData:bytes(input2),data:bytes(uncompressedData)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_zipFile=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/zipFile.js"(exports,module){var ZipEntry=require_zipEntry(),Headers=require_headers(),Utils=require_util();module.exports=function(inBuffer,options){var entryList=[],entryTable=Object.create(null),_comment=Buffer.alloc(0),mainHeader=new Headers.MainHeader,loadedEntries=!1,password=null;let temporary=new Set,opts=options,{noSort,decoder}=opts;inBuffer?readMainHeader(opts.readEntries):loadedEntries=!0;function makeTemporaryFolders(){let foldersList=new Set;for(let elem of Object.keys(entryTable)){let elements=elem.split("/");if(elements.pop(),!!elements.length)for(let i=0;i<elements.length;i++){let sub=elements.slice(0,i+1).join("/")+"/";foldersList.add(sub)}}for(let elem of foldersList)if(!(elem in entryTable)){let tempfolder=new ZipEntry(opts);tempfolder.entryName=elem,tempfolder.attr=16,tempfolder.temporary=!0,entryList.push(tempfolder),entryTable[tempfolder.entryName]=tempfolder,temporary.add(tempfolder)}}function readEntries(){if(loadedEntries=!0,entryTable=Object.create(null),mainHeader.diskEntries>(inBuffer.length-mainHeader.offset)/Utils.Constants.CENHDR)throw Utils.Errors.DISK_ENTRY_TOO_LARGE();entryList=new Array(mainHeader.diskEntries);for(var index=mainHeader.offset,i=0;i<entryList.length;i++){var tmp=index,entry=new ZipEntry(opts,inBuffer);if(entry.header=inBuffer.slice(tmp,tmp+=Utils.Constants.CENHDR),entry.entryName=inBuffer.slice(tmp,tmp+=entry.header.fileNameLength),entry.header.extraLength&&(entry.extra=inBuffer.slice(tmp,tmp+=entry.header.extraLength)),entry.header.commentLength&&(entry.comment=inBuffer.slice(tmp,tmp+entry.header.commentLength)),index+=entry.header.centralHeaderSize,entry.entryName in entryTable)throw Utils.Errors.DUPLICATE_ENTRY(`"${entry.entryName}"`);entryList[i]=entry,entryTable[entry.entryName]=entry}temporary.clear(),makeTemporaryFolders()}function readMainHeader(readNow){var i=inBuffer.length-Utils.Constants.ENDHDR,max=Math.max(0,i-65535),n=max,endStart=inBuffer.length,endOffset=-1,commentEnd=0;for(typeof opts.trailingSpace=="boolean"&&opts.trailingSpace&&(max=0),i;i>=n;i--)if(inBuffer[i]===80){if(inBuffer.readUInt32LE(i)===Utils.Constants.ENDSIG){endOffset=i,commentEnd=i,endStart=i+Utils.Constants.ENDHDR,n=i-Utils.Constants.END64HDR;continue}if(inBuffer.readUInt32LE(i)===Utils.Constants.END64SIG){n=max;continue}if(inBuffer.readUInt32LE(i)===Utils.Constants.ZIP64SIG){endOffset=i,endStart=i+Utils.readBigUInt64LE(inBuffer,i+Utils.Constants.ZIP64SIZE)+Utils.Constants.ZIP64LEAD;break}}if(endOffset==-1)throw Utils.Errors.INVALID_FORMAT();mainHeader.loadFromBinary(inBuffer.slice(endOffset,endStart)),mainHeader.commentLength&&(_comment=inBuffer.slice(commentEnd+Utils.Constants.ENDHDR)),readNow&&readEntries()}function sortEntries(){entryList.length>1&&!noSort&&(entryList=entryList.map(entry=>({entry,key:entry.entryName.toLowerCase()})).sort((a,b)=>a.key.localeCompare(b.key)).map(pair=>pair.entry))}return{get entries(){return loadedEntries||readEntries(),entryList.filter(e=>!temporary.has(e))},get comment(){return decoder.decode(_comment)},set comment(val){_comment=Utils.toBuffer(val,decoder.encode),mainHeader.commentLength=_comment.length},getEntryCount:function(){return loadedEntries?entryList.length:mainHeader.diskEntries},forEach:function(callback){this.entries.forEach(callback)},getEntry:function(entryName){return loadedEntries||readEntries(),entryTable[entryName]||null},setEntry:function(entry){loadedEntries||readEntries(),entryList.push(entry),entryTable[entry.entryName]=entry,mainHeader.totalEntries=entryList.length},deleteFile:function(entryName,withsubfolders=!0){loadedEntries||readEntries();let entry=entryTable[entryName];this.getEntryChildren(entry,withsubfolders).map(child=>child.entryName).forEach(this.deleteEntry)},deleteEntry:function(entryName){loadedEntries||readEntries();let entry=entryTable[entryName],index=entryList.indexOf(entry);index>=0&&(entryList.splice(index,1),delete entryTable[entryName],mainHeader.totalEntries=entryList.length)},getEntryChildren:function(entry,subfolders=!0){if(loadedEntries||readEntries(),typeof entry=="object")if(entry.isDirectory&&subfolders){let list=[],name=entry.entryName;for(let zipEntry of entryList)zipEntry.entryName.startsWith(name)&&list.push(zipEntry);return list}else return[entry];return[]},getChildCount:function(entry){if(entry&&entry.isDirectory){let list=this.getEntryChildren(entry);return list.includes(entry)?list.length-1:list.length}return 0},compressToBuffer:function(){loadedEntries||readEntries(),sortEntries();let dataBlock=[],headerBlocks=[],totalSize=0,dindex=0;mainHeader.size=0,mainHeader.offset=0;let totalEntries=0;for(let entry of this.entries){let compressedData=entry.getCompressedData();entry.header.offset=dindex;let localHeader=entry.packLocalHeader(),dataLength=localHeader.length+compressedData.length;dindex+=dataLength,dataBlock.push(localHeader),dataBlock.push(compressedData);let centralHeader=entry.packCentralHeader();headerBlocks.push(centralHeader),mainHeader.size+=centralHeader.length,totalSize+=dataLength+centralHeader.length,totalEntries++}totalSize+=mainHeader.mainHeaderSize,mainHeader.offset=dindex,mainHeader.totalEntries=totalEntries,dindex=0;let outBuffer=Buffer.alloc(totalSize);for(let content of dataBlock)content.copy(outBuffer,dindex),dindex+=content.length;for(let content of headerBlocks)content.copy(outBuffer,dindex),dindex+=content.length;let mh=mainHeader.toBinary();return _comment&&_comment.copy(mh,mh.length-_comment.length),mh.copy(outBuffer,dindex),inBuffer=outBuffer,loadedEntries=!1,outBuffer},toAsyncBuffer:function(onSuccess,onFail,onItemStart,onItemEnd){try{loadedEntries||readEntries(),sortEntries();let dataBlock=[],centralHeaders=[],totalSize=0,dindex=0,totalEntries=0;mainHeader.size=0,mainHeader.offset=0;let compress2Buffer=function(entryLists){if(entryLists.length>0){let entry=entryLists.shift(),name=entry.entryName+entry.extra.toString();onItemStart&&onItemStart(name),entry.getCompressedDataAsync(function(compressedData){onItemEnd&&onItemEnd(name),entry.header.offset=dindex;let localHeader=entry.packLocalHeader(),dataLength=localHeader.length+compressedData.length;dindex+=dataLength,dataBlock.push(localHeader),dataBlock.push(compressedData);let centalHeader=entry.packCentralHeader();centralHeaders.push(centalHeader),mainHeader.size+=centalHeader.length,totalSize+=dataLength+centalHeader.length,totalEntries++,compress2Buffer(entryLists)})}else{totalSize+=mainHeader.mainHeaderSize,mainHeader.offset=dindex,mainHeader.totalEntries=totalEntries,dindex=0;let outBuffer=Buffer.alloc(totalSize);dataBlock.forEach(function(content){content.copy(outBuffer,dindex),dindex+=content.length}),centralHeaders.forEach(function(content){content.copy(outBuffer,dindex),dindex+=content.length});let mh=mainHeader.toBinary();_comment&&_comment.copy(mh,mh.length-_comment.length),mh.copy(outBuffer,dindex),inBuffer=outBuffer,loadedEntries=!1,onSuccess(outBuffer)}};compress2Buffer(Array.from(this.entries))}catch(e){onFail(e)}}}}}});var require_adm_zip=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/adm-zip.js"(exports,module){var Utils=require_util(),pth=__require("path"),ZipEntry=require_zipEntry(),ZipFile=require_zipFile(),get_Bool=(...val)=>Utils.findLast(val,c=>typeof c=="boolean"),get_Str=(...val)=>Utils.findLast(val,c=>typeof c=="string"),get_Fun=(...val)=>Utils.findLast(val,c=>typeof c=="function"),defaultOptions={noSort:!1,readEntries:!1,method:Utils.Constants.NONE,fs:null};module.exports=function(input2,options){let inBuffer=null,opts=Object.assign(Object.create(null),defaultOptions);input2&&typeof input2=="object"&&(input2 instanceof Uint8Array||(Object.assign(opts,input2),input2=opts.input?opts.input:void 0,opts.input&&delete opts.input),Buffer.isBuffer(input2)&&(inBuffer=input2,opts.method=Utils.Constants.BUFFER,input2=void 0)),Object.assign(opts,options);let filetools=new Utils(opts),applyDirAttributes=dirEntries=>{dirEntries.filter(d=>d.attr).sort((a,b)=>b.path.length-a.path.length).forEach(d=>filetools.fs.chmodSync(d.path,d.attr))};if((typeof opts.decoder!="object"||typeof opts.decoder.encode!="function"||typeof opts.decoder.decode!="function")&&(opts.decoder=Utils.decoder),input2&&typeof input2=="string")if(filetools.fs.existsSync(input2))opts.method=Utils.Constants.FILE,opts.filename=input2,inBuffer=filetools.fs.readFileSync(input2);else throw Utils.Errors.INVALID_FILENAME();let _zip=new ZipFile(inBuffer,opts),{canonical,sanitize,zipnamefix}=Utils;function getEntry(entry){if(entry&&_zip){var item;if(typeof entry=="string"&&(item=_zip.getEntry(pth.posix.normalize(entry))),typeof entry=="object"&&typeof entry.entryName<"u"&&typeof entry.header<"u"&&(item=_zip.getEntry(entry.entryName)),item)return item}return null}function fixPath(zipPath){let{join:join31,normalize,sep:sep5}=pth.posix;return join31(pth.isAbsolute(zipPath)?"/":".",normalize(sep5+zipPath.split("\\").join(sep5)+sep5))}function filenameFilter(filterfn){return filterfn instanceof RegExp?(function(rx){return function(filename){return rx.test(filename)}})(filterfn):typeof filterfn!="function"?()=>!0:filterfn}let relativePath=(local,entry)=>{let lastChar=entry.slice(-1);return lastChar=lastChar===filetools.sep?filetools.sep:"",pth.relative(local,entry)+lastChar};return{readFile:function(entry,pass){var item=getEntry(entry);return item&&item.getData(pass)||null},childCount:function(entry){let item=getEntry(entry);if(item)return _zip.getChildCount(item)},readFileAsync:function(entry,callback){var item=getEntry(entry);item?item.getDataAsync(callback):callback(null,"getEntry failed for:"+entry)},readAsText:function(entry,encoding){var item=getEntry(entry);if(item){var data=item.getData();if(data&&data.length)return data.toString(encoding||"utf8")}return""},readAsTextAsync:function(entry,callback,encoding){var item=getEntry(entry);item?item.getDataAsync(function(data,err){if(err){callback(data,err);return}data&&data.length?callback(data.toString(encoding||"utf8")):callback("")}):callback("")},deleteFile:function(entry,withsubfolders=!0){var item=getEntry(entry);item&&_zip.deleteFile(item.entryName,withsubfolders)},deleteEntry:function(entry){var item=getEntry(entry);item&&_zip.deleteEntry(item.entryName)},addZipComment:function(comment){_zip.comment=comment},getZipComment:function(){return _zip.comment||""},addZipEntryComment:function(entry,comment){var item=getEntry(entry);item&&(item.comment=comment)},getZipEntryComment:function(entry){var item=getEntry(entry);return item&&item.comment||""},updateFile:function(entry,content){var item=getEntry(entry);item&&item.setData(content)},addLocalFile:function(localPath,zipPath,zipName,comment){if(filetools.fs.existsSync(localPath)){zipPath=zipPath?fixPath(zipPath):"";let p=pth.win32.basename(pth.win32.normalize(localPath));zipPath+=zipName||p;let _attr=filetools.fs.statSync(localPath),data=_attr.isFile()?filetools.fs.readFileSync(localPath):Buffer.alloc(0);_attr.isDirectory()&&(zipPath+=filetools.sep),this.addFile(zipPath,data,comment,_attr)}else throw Utils.Errors.FILE_NOT_FOUND(localPath)},addLocalFileAsync:function(options2,callback){options2=typeof options2=="object"?options2:{localPath:options2};let localPath=pth.resolve(options2.localPath),{comment}=options2,{zipPath,zipName}=options2,self=this;filetools.fs.stat(localPath,function(err,stats){if(err)return callback(err,!1);zipPath=zipPath?fixPath(zipPath):"";let p=pth.win32.basename(pth.win32.normalize(localPath));if(zipPath+=zipName||p,stats.isFile())filetools.fs.readFile(localPath,function(err2,data){return err2?callback(err2,!1):(self.addFile(zipPath,data,comment,stats),setImmediate(callback,void 0,!0))});else if(stats.isDirectory())return zipPath+=filetools.sep,self.addFile(zipPath,Buffer.alloc(0),comment,stats),setImmediate(callback,void 0,!0)})},addLocalFolder:function(localPath,zipPath,filter){if(filter=filenameFilter(filter),zipPath=zipPath?fixPath(zipPath):"",localPath=pth.normalize(localPath),filetools.fs.existsSync(localPath)){let items=filetools.findFiles(localPath),self=this;if(items.length)for(let filepath of items){let p=pth.join(zipPath,relativePath(localPath,filepath));filter(p)&&self.addLocalFile(filepath,pth.dirname(p))}}else throw Utils.Errors.FILE_NOT_FOUND(localPath)},addLocalFolderAsync:function(localPath,callback,zipPath,filter){filter=filenameFilter(filter),zipPath=zipPath?fixPath(zipPath):"",localPath=pth.normalize(localPath);var self=this;filetools.fs.open(localPath,"r",function(err){if(err&&err.code==="ENOENT")callback(void 0,Utils.Errors.FILE_NOT_FOUND(localPath));else if(err)callback(void 0,err);else{var items=filetools.findFiles(localPath),i=-1,next=function(){if(i+=1,i<items.length){var filepath=items[i],p=relativePath(localPath,filepath).split("\\").join("/");p=p.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,""),filter(p)?filetools.fs.stat(filepath,function(er0,stats){er0&&callback(void 0,er0),stats.isFile()?filetools.fs.readFile(filepath,function(er1,data){er1?callback(void 0,er1):(self.addFile(zipPath+p,data,"",stats),next())}):(self.addFile(zipPath+p+"/",Buffer.alloc(0),"",stats),next())}):process.nextTick(()=>{next()})}else callback(!0,void 0)};next()}})},addLocalFolderAsync2:function(options2,callback){let self=this;options2=typeof options2=="object"?options2:{localPath:options2};let localPath=pth.resolve(options2.localPath),{zipPath,filter,namefix}=options2;filter instanceof RegExp?filter=(function(rx){return function(filename){return rx.test(filename)}})(filter):typeof filter!="function"&&(filter=function(){return!0}),zipPath=zipPath?fixPath(zipPath):"",namefix==="latin1"&&(namefix=str=>str.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,"")),typeof namefix!="function"&&(namefix=str=>str);let relPathFix=entry=>pth.join(zipPath,namefix(relativePath(localPath,entry))),fileNameFix=entry=>pth.win32.basename(pth.win32.normalize(namefix(entry)));filetools.fs.open(localPath,"r",function(err){err&&err.code==="ENOENT"?callback(Utils.Errors.FILE_NOT_FOUND(localPath),!1):err?callback(err,!1):filetools.findFilesAsync(localPath,function(err2,fileEntries){if(err2)return callback(err2,!1);if(fileEntries=fileEntries.filter(dir=>filter(relPathFix(dir))),!fileEntries.length)return callback(void 0,!0);setImmediate(fileEntries.reverse().reduce(function(next,entry){return function(err3,done){if(err3||done===!1)return setImmediate(next,err3,!1);self.addLocalFileAsync({localPath:entry,zipPath:pth.dirname(relPathFix(entry)),zipName:fileNameFix(entry)},next)}},callback))})})},addLocalFolderPromise:function(localPath,props){return new Promise((resolve16,reject)=>{this.addLocalFolderAsync2(Object.assign({localPath},props),(err,done)=>{if(err)return reject(err);done&&resolve16(this)})})},addFile:function(entryName,content,comment,attr){entryName=zipnamefix(entryName);let entry=getEntry(entryName),update=entry!=null;update||(entry=new ZipEntry(opts),entry.entryName=entryName),entry.comment=comment||"";let isStat=typeof attr=="object"&&attr instanceof filetools.fs.Stats;isStat&&(entry.header.time=attr.mtime);var fileattr=entry.isDirectory?16:0;let unix=entry.isDirectory?16384:32768;return isStat?unix|=4095&attr.mode:typeof attr=="number"?unix|=4095&attr:unix|=entry.isDirectory?493:420,fileattr=(fileattr|unix<<16)>>>0,entry.attr=fileattr,entry.setData(content),update||_zip.setEntry(entry),entry},getEntries:function(password){return _zip.password=password,_zip?_zip.entries:[]},getEntry:function(name){return getEntry(name)},getEntryCount:function(){return _zip.getEntryCount()},forEach:function(callback){return _zip.forEach(callback)},extractEntryTo:function(entry,targetPath,maintainEntryPath,overwrite,keepOriginalPermission,outFileName){overwrite=get_Bool(!1,overwrite),keepOriginalPermission=get_Bool(!1,keepOriginalPermission),maintainEntryPath=get_Bool(!0,maintainEntryPath),outFileName=get_Str(keepOriginalPermission,outFileName);var item=getEntry(entry);if(!item)throw Utils.Errors.NO_ENTRY();var entryName=canonical(item.entryName),target=sanitize(targetPath,outFileName&&!item.isDirectory?canonical(outFileName):maintainEntryPath?entryName:pth.basename(entryName));if(item.isDirectory){var children=_zip.getEntryChildren(item);return children.forEach(function(child){if(child.isDirectory)return;var content2=child.getData();if(!content2)throw Utils.Errors.CANT_EXTRACT_FILE();var name=canonical(maintainEntryPath?child.entryName:child.entryName.substring(item.entryName.length)),childName=sanitize(targetPath,name);filetools.assertPathSafe(targetPath,childName);let fileAttr2=keepOriginalPermission?child.header.fileAttr:void 0;filetools.writeFileTo(childName,content2,overwrite,fileAttr2)}),!0}var content=item.getData(_zip.password);if(!content)throw Utils.Errors.CANT_EXTRACT_FILE();if(filetools.assertPathSafe(targetPath,target),filetools.fs.existsSync(target)&&!overwrite)throw Utils.Errors.CANT_OVERRIDE();let fileAttr=keepOriginalPermission?entry.header.fileAttr:void 0;return filetools.writeFileTo(target,content,overwrite,fileAttr),!0},test:function(pass){if(!_zip)return!1;for(var entry of _zip.entries)try{if(entry.isDirectory)continue;var content=entry.getData(pass);if(!content)return!1}catch{return!1}return!0},extractAllTo:function(targetPath,overwrite,keepOriginalPermission,pass){if(keepOriginalPermission=get_Bool(!1,keepOriginalPermission),pass=get_Str(keepOriginalPermission,pass),overwrite=get_Bool(!1,overwrite),!_zip)throw Utils.Errors.NO_ZIP();let dirEntries=[];_zip.entries.forEach(function(entry){var entryName=sanitize(targetPath,canonical(entry.entryName));if(filetools.assertPathSafe(targetPath,entryName),entry.isDirectory){filetools.makeDir(entryName),keepOriginalPermission&&dirEntries.push({path:entryName,attr:entry.header.fileAttr});return}var content=entry.getData(pass);if(!content)throw Utils.Errors.CANT_EXTRACT_FILE();let fileAttr=keepOriginalPermission?entry.header.fileAttr:void 0;filetools.writeFileTo(entryName,content,overwrite,fileAttr);try{filetools.fs.utimesSync(entryName,entry.header.time,entry.header.time)}catch{}}),applyDirAttributes(dirEntries)},extractAllToAsync:function(targetPath,overwrite,keepOriginalPermission,callback){if(callback=get_Fun(overwrite,keepOriginalPermission,callback),keepOriginalPermission=get_Bool(!1,keepOriginalPermission),overwrite=get_Bool(!1,overwrite),!callback)return new Promise((resolve16,reject)=>{this.extractAllToAsync(targetPath,overwrite,keepOriginalPermission,function(err){err?reject(err):resolve16(this)})});if(!_zip){callback(Utils.Errors.NO_ZIP());return}targetPath=pth.resolve(targetPath);let getPath=entry=>sanitize(targetPath,pth.normalize(canonical(entry.entryName))),getError=(msg,file)=>new Error(msg+': "'+file+'"'),dirEntries=[],fileEntries=[];_zip.entries.forEach(e=>{e.isDirectory?dirEntries.push(e):fileEntries.push(e)});let deferredDirAttr=[];for(let entry of dirEntries){let dirPath=getPath(entry),dirAttr=keepOriginalPermission?entry.header.fileAttr:void 0;try{filetools.assertPathSafe(targetPath,dirPath),filetools.makeDir(dirPath)}catch{callback(getError("Unable to create folder",dirPath));continue}dirAttr&&deferredDirAttr.push({path:dirPath,attr:dirAttr});try{filetools.fs.utimesSync(dirPath,entry.header.time,entry.header.time)}catch{}}let done=err=>{if(!err)try{applyDirAttributes(deferredDirAttr)}catch(er){return callback(getError("Unable to set folder permissions",er.path||""))}callback(err)};fileEntries.reverse().reduce(function(next,entry){return function(err){if(err)next(err);else{let entryName=pth.normalize(canonical(entry.entryName)),filePath=sanitize(targetPath,entryName);try{filetools.assertPathSafe(targetPath,filePath)}catch(er){return next(er)}entry.getDataAsync(function(content,err_1){if(err_1)next(err_1);else if(!content)next(Utils.Errors.CANT_EXTRACT_FILE());else{let fileAttr=keepOriginalPermission?entry.header.fileAttr:void 0;filetools.writeFileToAsync(filePath,content,overwrite,fileAttr,function(succ){if(!succ)return next(getError("Unable to write file",filePath));filetools.fs.utimes(filePath,entry.header.time,entry.header.time,function(){next()})})}})}}},done)()},writeZip:function(targetFileName,callback){if(arguments.length===1&&typeof targetFileName=="function"&&(callback=targetFileName,targetFileName=""),!targetFileName&&opts.filename&&(targetFileName=opts.filename),!!targetFileName){var zipData=_zip.compressToBuffer();if(zipData){var ok=filetools.writeFileTo(targetFileName,zipData,!0);typeof callback=="function"&&callback(ok?null:new Error("failed"),"")}}},writeZipPromise:function(targetFileName,props){let{overwrite,perm}=Object.assign({overwrite:!0},props);return new Promise((resolve16,reject)=>{!targetFileName&&opts.filename&&(targetFileName=opts.filename),targetFileName||reject("ADM-ZIP: ZIP File Name Missing"),this.toBufferPromise().then(zipData=>{let ret=done=>done?resolve16(done):reject("ADM-ZIP: Wasn't able to write zip file");filetools.writeFileToAsync(targetFileName,zipData,overwrite,perm,ret)},reject)})},toBufferPromise:function(){return new Promise((resolve16,reject)=>{_zip.toAsyncBuffer(resolve16,reject)})},toBuffer:function(onSuccess,onFail,onItemStart,onItemEnd){return typeof onSuccess=="function"?(_zip.toAsyncBuffer(onSuccess,onFail,onItemStart,onItemEnd),null):_zip.compressToBuffer()}}}}});function parseComponent(value){let component2=Number(value);return Number.isSafeInteger(component2)&&component2<=65535?component2:null}function parseMearlReleaseVersion(value){if(typeof value!="string"||value.length>64)return null;let match=RELEASE_VERSION_PATTERN.exec(value);if(!match)return null;let major=parseComponent(match[1]),minor=parseComponent(match[2]),patch=parseComponent(match[3]),beta=match[4]===void 0?void 0:parseComponent(match[4]);return major===null||minor===null||patch===null||beta===null?null:{raw:value,major,minor,patch,channel:beta===void 0?"stable":"beta",...beta===void 0?{}:{beta}}}function isMearlReleaseVersion(value){return parseMearlReleaseVersion(value)!==null}function parseMearlReleaseLine(value){if(typeof value!="string"||value.length>64)return null;let match=RELEASE_LINE_PATTERN.exec(value);if(!match)return null;let major=parseComponent(match[1]),minor=parseComponent(match[2]);return major===null||minor===null?null:{raw:value,major,minor}}function isMearlReleaseLine(value){return parseMearlReleaseLine(value)!==null}function mearlReleaseLineForVersion(version2){let parsed=parseMearlReleaseVersion(version2);if(!parsed)throw new Error("A valid Mearl release version is required");return`${parsed.major}.${parsed.minor}.x`}function isMearlReleaseVersionInLine(version2,releaseLine){let parsedVersion=parseMearlReleaseVersion(version2),parsedLine=parseMearlReleaseLine(releaseLine);return parsedVersion!==null&&parsedLine!==null&&parsedVersion.major===parsedLine.major&&parsedVersion.minor===parsedLine.minor}function compareMearlReleaseLines(leftVersion,rightVersion){let left=parseMearlReleaseVersion(leftVersion),right=parseMearlReleaseVersion(rightVersion);if(!left||!right)throw new Error("Mearl release-line comparison requires valid release versions");for(let key of["major","minor"]){if(left[key]<right[key])return-1;if(left[key]>right[key])return 1}return 0}function compareMearlReleaseVersions(leftVersion,rightVersion){let left=parseMearlReleaseVersion(leftVersion),right=parseMearlReleaseVersion(rightVersion);if(!left||!right)throw new Error("Mearl release comparison requires valid release versions");for(let key of["major","minor","patch"]){if(left[key]<right[key])return-1;if(left[key]>right[key])return 1}if(left.channel!==right.channel)return left.channel==="stable"?1:-1;let leftBeta=left.beta??0,rightBeta=right.beta??0;return leftBeta<rightBeta?-1:leftBeta>rightBeta?1:0}function mearlPackageSelector(setupVersion,targetLine){return targetLine||(parseMearlReleaseVersion(setupVersion)?.channel==="beta"?setupVersion:"latest")}var RELEASE_VERSION_PATTERN,RELEASE_LINE_PATTERN,init_version=__esm({"../setup/dist/version.js"(){"use strict";RELEASE_VERSION_PATTERN=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/,RELEASE_LINE_PATTERN=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.x$/}});import fs7 from"node:fs";import os4 from"node:os";import path8 from"node:path";import{createHash as createHash14,randomUUID as randomUUID19}from"node:crypto";import WebSocket2 from"ws";function isUnsupportedCdpMethodError(message){return/Method not (?:available|found)|wasn't found|unknown method/i.test(message)}function resolveChromeUserDataDirectory(platform=process.platform,home=os4.homedir(),env=process.env){return platform==="darwin"?path8.join(home,"Library","Application Support","Google","Chrome"):platform==="win32"?path8.join(env.LOCALAPPDATA??home,"Google","Chrome","User Data"):path8.join(home,".config","google-chrome")}function resolveMearlExtensionDirectory(home=os4.homedir()){return path8.join(home,".mearl",MEARL_EXTENSION_DIRECTORY_NAME)}function findLatestExtensionVersion(html){return Array.from(html.matchAll(ARCHIVE_PATTERN),match=>match[1]).filter(isMearlReleaseVersion).sort(compareMearlReleaseVersions).at(-1)??null}function extensionArchiveUrl(version2){if(!isMearlReleaseVersion(version2))throw new Error(`Invalid Mearl browser extension version: ${version2}`);return`https://github.com/mearlhq/mearl/releases/download/v${version2}/mearl-chrome-v${version2}.zip`}function validateExtensionRelease(release){if(!isMearlReleaseVersion(release.version))throw new Error("Remote extension config has an invalid latestVersion");let configSource=process.env.MEARL_EXTENSION_CONFIG_URL,expectedArchiveUrl=configSource&&configSource!==MEARL_EXTENSION_REMOTE_CONFIG_URL?new URL(`mearl-chrome-v${release.version}.zip`,configSource).toString():extensionArchiveUrl(release.version),archiveUrl;try{archiveUrl=new URL(release.archiveUrl).toString()}catch{throw new Error("Remote extension config has an invalid downloadUrl")}if(archiveUrl!==expectedArchiveUrl)throw new Error("Remote extension downloadUrl does not match latestVersion");if(release.sha256!==void 0&&!SHA256_PATTERN.test(release.sha256))throw new Error("Remote extension config has an invalid downloadSha256");return{archiveUrl,...release.sha256?{sha256:release.sha256.toLowerCase()}:{},version:release.version}}async function fetchBrowserExtensionRelease(fetchImpl=fetch){let response=await fetchImpl(process.env.MEARL_EXTENSION_CONFIG_URL||MEARL_EXTENSION_REMOTE_CONFIG_URL,{cache:"no-store"});if(!response.ok)throw new Error(`Extension config returned HTTP ${response.status}`);let config=await response.json();return validateExtensionRelease({archiveUrl:typeof config.downloadUrl=="string"?config.downloadUrl:"",...typeof config.downloadSha256=="string"?{sha256:config.downloadSha256}:{},version:typeof config.latestVersion=="string"?config.latestVersion:""})}function readDevToolsActivePort(userDataDirectory){try{let content=fs7.readFileSync(path8.join(userDataDirectory,"DevToolsActivePort"),"utf8").trim(),[portValue,browserWsPath="/devtools/browser"]=content.split(/\r?\n/).map(value=>value.trim()),port=Number(portValue);return!Number.isInteger(port)||port<=0||port>65535||!browserWsPath.startsWith("/")?null:{port,browserWsPath}}catch{return null}}function rawDataToString(data){return Array.isArray(data)?Buffer.concat(data).toString("utf8"):Buffer.isBuffer(data)?data.toString("utf8"):Buffer.from(data).toString("utf8")}function sameExtensionPath(left,right){let normalizedLeft=path8.normalize(path8.resolve(left)),normalizedRight=path8.normalize(path8.resolve(right));return process.platform==="win32"?normalizedLeft.toLowerCase()===normalizedRight.toLowerCase():normalizedLeft===normalizedRight}function isSetupManagedInstallation(installed,targetDirectory){return installed.location==="UNPACKED"&&sameExtensionPath(installed.path,targetDirectory)}function setupMarkerPath(directory){return path8.join(directory,MEARL_EXTENSION_SETUP_MARKER)}function hasSetupMarker(targetDirectory){try{let marker=JSON.parse(fs7.readFileSync(setupMarkerPath(targetDirectory),"utf8"));return marker.schemaVersion===1&&marker.extensionId===MEARL_EXTENSION_ID&&typeof marker.path=="string"&&sameExtensionPath(marker.path,targetDirectory)}catch{return!1}}async function writeSetupMarker(directory,targetDirectory){let marker={extensionId:MEARL_EXTENSION_ID,path:path8.resolve(targetDirectory),schemaVersion:1};await fs7.promises.writeFile(setupMarkerPath(directory),`${JSON.stringify(marker,null,2)}
|
|
1087
|
-
`,{mode:384})}function browserCdpEndpoint(chromeUserDataDirectory){let activePort=readDevToolsActivePort(chromeUserDataDirectory);if(!activePort)throw new Error("Chrome remote debugging is not enabled");return`ws://127.0.0.1:${activePort.port}${activePort.browserWsPath}`}async function inspectInstallationWithConnection(connection){let target=await connection.send("Target.createTarget",{background:!0,url:"chrome://extensions-internals"});try{let attached=await connection.send("Target.attachToTarget",{flatten:!0,targetId:target.targetId}),text3=(await connection.send("Runtime.evaluate",{awaitPromise:!0,expression:"document.readyState === 'complete' ? document.body.innerText : new Promise(resolve => addEventListener('load', () => resolve(document.body.innerText), {once:true}))",returnByValue:!0},attached.sessionId)).result?.value;if(typeof text3!="string")throw new Error("chrome://extensions-internals did not return extension inventory");let installed=JSON.parse(text3).find(extension=>extension.id===MEARL_EXTENSION_ID);if(!installed)return null;if(typeof installed.location!="string"||typeof installed.name!="string"||typeof installed.path!="string"||typeof installed.version!="string")throw new Error("Chrome returned incomplete Mearl extension metadata");let version2=installed.version;try{let manifest=JSON.parse(fs7.readFileSync(path8.join(installed.path,"manifest.json"),"utf8"));manifest.version===installed.version&&(version2=readExtensionReleaseVersion(manifest)??version2)}catch{}return{id:MEARL_EXTENSION_ID,location:installed.location,name:installed.name,path:installed.path,version:version2}}finally{typeof target.targetId=="string"&&await connection.send("Target.closeTarget",{targetId:target.targetId}).catch(()=>{})}}async function loadUnpackedWithConnection(connection,extensionDirectory){let loaded=await connection.send("Extensions.loadUnpacked",{path:path8.resolve(extensionDirectory)});if(loaded.id!==MEARL_EXTENSION_ID)throw new Error(`Extensions.loadUnpacked returned unexpected extension ID: ${String(loaded.id)}`);let inventory=await connection.send("Extensions.getExtensions");if(!(Array.isArray(inventory.extensions)?inventory.extensions.find(candidate=>candidate?.id===loaded.id):null)?.enabled)throw new Error("Chrome loaded the extension but did not report it as enabled");return{extensionId:loaded.id}}async function connectBrowserExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));return{close:()=>connection.close(),inspectInstallation:()=>inspectInstallationWithConnection(connection),loadUnpacked:extensionDirectory=>loadUnpackedWithConnection(connection,extensionDirectory)}}async function loadUnpackedViaCdp(extensionDirectory,chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await loadUnpackedWithConnection(connection,extensionDirectory)}finally{connection.close()}}async function inspectMearlExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await inspectInstallationWithConnection(connection)}finally{connection.close()}}async function inspectSetupManagedExtension(targetDirectory){return(await runUnifiedCheck({clientVersion:CLIENT_VERSION,json:!0,local:!0,timeoutSec:5},{writeJson:()=>{}})).browsers.filter(browser=>browser.status==="connected"&&browser.transport==="extension"&&browser.extensionInstallation?.extensionId===MEARL_EXTENSION_ID&&typeof browser.extensionInstallation.setupManagedPath=="string"&&sameExtensionPath(browser.extensionInstallation.setupManagedPath,targetDirectory)).map(browser=>browser.browserId)}async function reloadInstalledExtension(browserIds){if(browserIds.length===0)throw new Error("No setup-managed Mearl extension was found");let failures=[],reloaded=0;for(let browserId of browserIds)try{await invoke("__extension_reload",{},{browser:browserId,timeoutSec:5}),reloaded+=1}catch(error){failures.push(error instanceof Error?error.message:String(error))}if(reloaded===0)throw new Error(`Failed to reload the connected extension: ${failures.join("; ")}`)}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID19()}`,targetExists=fs7.existsSync(targetDirectory);try{targetExists&&await fs7.promises.rename(targetDirectory,backupDirectory),await fs7.promises.rename(stagingDirectory,targetDirectory)}catch(error){throw!fs7.existsSync(targetDirectory)&&fs7.existsSync(backupDirectory)&&await fs7.promises.rename(backupDirectory,targetDirectory),error}targetExists&&await fs7.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path8.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs7.readFileSync(manifestPath,"utf8"))}catch(error){throw new Error(`Downloaded extension has no valid manifest.json: ${error instanceof Error?error.message:error}`,{cause:error})}if(parsed.manifest_version!==3||typeof parsed.name!="string"||typeof parsed.key!="string"||parsed.key.length===0)throw new Error("Downloaded archive is not a valid Manifest V3 extension");if(!readExtensionReleaseVersion(parsed))throw new Error("Downloaded extension manifest has an invalid version");return parsed}async function extractExtensionArchive(archivePath,destination){let archive=new import_adm_zip.default(archivePath);for(let entry of archive.getEntries()){let name=entry.entryName,type=entry.header.attr>>>16&61440;if(name.includes("\\")||name.includes("\0")||path8.posix.isAbsolute(name)||path8.win32.isAbsolute(name)||name.split("/").some(part=>part===".."||part===".")||type!==0&&type!==32768&&type!==16384)throw new Error("Extension archive contains an unsafe entry")}await archive.extractAllToAsync(destination,!1)}async function downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive,{managed=!0}={}){let release=validateExtensionRelease(releaseInput),parentDirectory=path8.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID19()}`,archivePath=path8.join(parentDirectory,`.mearl-extension-${randomUUID19()}.zip`);await fs7.promises.mkdir(parentDirectory,{recursive:!0});try{let response=await fetchImpl(release.archiveUrl,{redirect:"follow"});if(!response.ok)throw new Error(`Extension archive returned HTTP ${response.status}: ${release.archiveUrl}`);if(Number(response.headers.get("content-length")??0)>MAX_ARCHIVE_BYTES)throw new Error(`Extension archive exceeds ${MAX_ARCHIVE_BYTES} bytes`);let archive=Buffer.from(await response.arrayBuffer());if(archive.length===0||archive.length>MAX_ARCHIVE_BYTES)throw new Error("Extension archive is empty or too large");if(release.sha256&&createHash14("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs7.promises.writeFile(archivePath,archive,{mode:384}),await fs7.promises.mkdir(stagingDirectory,{recursive:!0}),await extractArchive(archivePath,stagingDirectory);let manifest=readExtensionManifest(stagingDirectory);if(readExtensionReleaseVersion(manifest)!==release.version)throw new Error(`Extension archive version ${String(manifest.version)} does not match ${release.version}`);return managed&&await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs7.promises.rm(archivePath,{force:!0}),await fs7.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path8.resolve(options.targetDirectory);if(!hasSetupMarker(targetDirectory))throw new Error("The running extension is not managed by Mearl setup");let fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??extractExtensionArchive;return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}async function installMearlBrowserExtension(options={},dependencies={}){let connectCdp=dependencies.connectCdp??connectBrowserExtensionViaCdp,fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??extractExtensionArchive,loadUnpacked=dependencies.loadUnpacked??loadUnpackedViaCdp,inspectInstallation=dependencies.inspectInstallation??inspectMearlExtensionViaCdp,inspectInstalled=dependencies.inspectInstalled??inspectSetupManagedExtension,reloadInstalled=dependencies.reloadInstalled??reloadInstalledExtension,sleep2=dependencies.sleep??(milliseconds=>new Promise(resolve16=>setTimeout(resolve16,milliseconds))),writeLine=options.writeLine??(line=>console.error(line)),targetDirectory=path8.resolve(options.targetDirectory??resolveMearlExtensionDirectory()),release=options.release?validateExtensionRelease(options.release):await fetchBrowserExtensionRelease(fetchImpl),chromeUserDataDirectory=options.chromeUserDataDirectory??resolveChromeUserDataDirectory(),waitForCdpMs=Math.max(0,options.waitForCdpMs??0),useSharedCdpSession=!dependencies.inspectInstallation&&!dependencies.loadUnpacked,setupManagedBrowserIds=[];if(hasSetupMarker(targetDirectory))try{setupManagedBrowserIds=await inspectInstalled(targetDirectory)}catch{}let setupManagedAtStart=setupManagedBrowserIds.length>0,cdpSession2,inspectOnce=async()=>{if(!useSharedCdpSession)return options.force?null:inspectInstallation(chromeUserDataDirectory);let candidate=await connectCdp(chromeUserDataDirectory);try{let installed=options.force?null:await candidate.inspectInstallation();return cdpSession2?.close(),cdpSession2=candidate,installed}catch(error){throw candidate.close(),error}},waitForCdpInspection=async()=>{let deadline=Date.now()+waitForCdpMs,lastFailure,lastNoticeAt=0;do try{let installed=await inspectOnce();if(installed&&!isSetupManagedInstallation(installed,targetDirectory)&&!options.force)throw new BrowserExtensionConflictError(installed);return}catch(error){if(error instanceof BrowserExtensionConflictError)throw error;let message=error instanceof Error?error.message:String(error);if(lastFailure=message,waitForCdpMs===0||isUnsupportedCdpMethodError(message))break;lastNoticeAt===0?(writeLine("Waiting for Chrome remote debugging before checking the installed extension..."),writeLine("Open chrome://inspect/#remote-debugging, enable remote debugging, and approve the connection."),lastNoticeAt=Date.now()):Date.now()-lastNoticeAt>=15e3&&(writeLine("Still waiting for Chrome remote debugging..."),lastNoticeAt=Date.now()),await sleep2(Math.min(1e3,Math.max(0,deadline-Date.now())))}while(Date.now()<deadline);return lastFailure};try{if(!setupManagedAtStart){let cdpError=await waitForCdpInspection();if(cdpError)return{filesUpdated:!1,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError}}if(await downloadAndReplaceExtension(release,targetDirectory,fetchImpl,extractArchive),setupManagedAtStart)try{return await reloadInstalled(setupManagedBrowserIds),{activation:"native-host",extensionId:MEARL_EXTENSION_ID,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(reloadError){let cdpError=await waitForCdpInspection();if(cdpError){let reloadMessage=reloadError instanceof Error?reloadError.message:String(reloadError);return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:`Native Host reload failed: ${reloadMessage}; CDP fallback failed: ${cdpError}`}}}try{return{activation:"cdp",extensionId:(cdpSession2?await cdpSession2.loadUnpacked(targetDirectory):await loadUnpacked(targetDirectory,chromeUserDataDirectory)).extensionId,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(error){return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:error instanceof Error?error.message:String(error)}}}finally{cdpSession2?.close()}}var import_adm_zip,MEARL_EXTENSION_DOWNLOAD_PAGE,MEARL_EXTENSION_REMOTE_CONFIG_URL,MEARL_EXTENSION_DIRECTORY_NAME,MEARL_EXTENSION_ID,MEARL_EXTENSION_SETUP_MARKER,ARCHIVE_PATTERN,MAX_ARCHIVE_BYTES,SHA256_PATTERN,BrowserExtensionConflictError,CdpConnection,init_browserExtension=__esm({"../setup/dist/browserExtension.js"(){"use strict";init_setupVersion();init_dist2();init_check();init_local();import_adm_zip=__toESM(require_adm_zip(),1);init_version();MEARL_EXTENSION_DOWNLOAD_PAGE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/tag/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl/releases/latest",MEARL_EXTENSION_REMOTE_CONFIG_URL=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/download/v${SETUP_VERSION}/config.json`:"https://github.com/mearlhq/mearl/releases/latest/download/config.json",MEARL_EXTENSION_DIRECTORY_NAME="chrome-extension",MEARL_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",MEARL_EXTENSION_SETUP_MARKER=".mearl-setup.json",ARCHIVE_PATTERN=/mearl-chrome-v(\d+\.\d+\.\d+(?:-beta\.\d+)?)\.zip/g,MAX_ARCHIVE_BYTES=64*1024*1024,SHA256_PATTERN=/^[a-f\d]{64}$/i,BrowserExtensionConflictError=class extends Error{installed;constructor(installed){super(`Mearl extension ${installed.id} is already installed from ${installed.location} at ${installed.path||"(managed location)"}. Re-run with --force to replace it.`),this.installed=installed,this.name="BrowserExtensionConflictError"}};CdpConnection=class _CdpConnection{socket;closed=!1;nextId=1;pending=new Map;constructor(socket){this.socket=socket,socket.on("message",data=>this.handleMessage(data)),socket.on("close",()=>this.close(new Error("CDP WebSocket closed before responding"))),socket.on("error",error=>this.close(error))}static connect(endpoint){return new Promise((resolve16,reject)=>{let socket=new WebSocket2(endpoint,{handshakeTimeout:5e3,maxPayload:8388608,perMessageDeflate:!1}),settled=!1,finish=error=>{settled||(settled=!0,error?(socket.terminate(),reject(error)):resolve16(new _CdpConnection(socket)))};socket.once("open",()=>finish()),socket.once("error",error=>finish(error)),socket.once("unexpected-response",(_request,response)=>{response.resume(),finish(new Error(`CDP WebSocket returned HTTP ${response.statusCode??0}`))})})}send(method,params={},sessionId,timeoutMs=1e4){return new Promise((resolve16,reject)=>{let id3=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id3),reject(new Error(`CDP command timed out: ${method}`))},timeoutMs);this.pending.set(id3,{reject,resolve:resolve16,timer}),this.socket.send(JSON.stringify({id:id3,method,params,...sessionId?{sessionId}:{}}),error=>{if(!error)return;let pending=this.pending.get(id3);pending&&(clearTimeout(pending.timer),this.pending.delete(id3),pending.reject(error))})})}close(error=new Error("CDP connection closed")){if(!this.closed){this.closed=!0;for(let pending of this.pending.values())clearTimeout(pending.timer),pending.reject(error);this.pending.clear(),this.socket.terminate()}}handleMessage(data){try{let message=JSON.parse(rawDataToString(data));if(message.id===void 0)return;let pending=this.pending.get(message.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(message.id),message.error?pending.reject(new Error(message.error.message??"CDP command failed")):pending.resolve(message.result??{})}catch{}}}}});var init_plugin2=__esm({"../client/dist/plugin.js"(){"use strict";init_plugin();init_skillManifest()}});import{readFileSync as readFileSync14,statSync as statSync12}from"node:fs";import{homedir as homedir6}from"node:os";import{isAbsolute as isAbsolute6,join as join21,resolve as resolve8}from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";function lockFile(scope,cwd,options){let env=options.env??process.env;return scope==="project"?join21(cwd,"skills-lock.json"):env.XDG_STATE_HOME?join21(env.XDG_STATE_HOME,"skills",".skill-lock.json"):join21(options.homeDirectory??homedir6(),".agents",".skill-lock.json")}function readTrackedSkillSources(scope,cwd,options={}){let file=lockFile(scope,cwd,options),text3;try{if(statSync12(file).size>4*1024*1024)throw new Error("Skill source lock exceeds 4 MiB");text3=readFileSync14(file,"utf8")}catch(error){if(error.code==="ENOENT")return[];throw error}let lock=JSON.parse(text3);if(!lock||!lock.skills||typeof lock.skills!="object"||Array.isArray(lock.skills))throw new Error("Invalid Skills source lock");return Object.entries(lock.skills).flatMap(([name,entry])=>{if(!entry||typeof entry!="object"||entry.sourceType==="node_modules")return[];if(!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid tracked Skill name");let source=typeof entry.sourceUrl=="string"?entry.sourceUrl:entry.source;if(typeof source!="string"||!source.trim())return[];if(source.length>4096||/[\0\r\n]/.test(source))throw new Error("Invalid tracked Skill source");let expectedHash=scope==="global"?entry.skillFolderHash:entry.computedHash;return[{name,source,scope,...typeof entry.sourceType=="string"?{sourceType:entry.sourceType}:{},...typeof entry.ref=="string"?{ref:entry.ref}:{},...typeof entry.skillPath=="string"?{skillPath:entry.skillPath}:{},...typeof expectedHash=="string"&&expectedHash?{expectedHash}:{},hashKind:scope==="global"&&typeof expectedHash=="string"&&/^[a-f0-9]{40}$/.test(expectedHash)?"git-tree":"folder"}]})}function isPublicSkillSource(source){return source.sourceType===void 0||["github","gitlab","git","local","well-known"].includes(source.sourceType)}function gitSource(source,ref){if(/^[\w.-]+\/[\w.-]+$/.test(source))return{repository:`https://github.com/${source}.git`,...ref?{ref}:{}};if(/^[\w.-]+@[\w.-]+:[^\s]+$/.test(source))return{repository:source,...ref?{ref}:{}};let url=new URL(source);if(!["https:","http:","ssh:","git:","file:"].includes(url.protocol)||url.password||url.username&&url.protocol!=="ssh:"||url.search||url.hash)throw new Error("Skill source is not a supported Git repository");if(url.hostname==="github.com"&&!url.port){let parts=url.pathname.split("/").filter(Boolean);if(parts.length>=2)return{repository:`https://github.com/${parts[0]}/${parts[1].replace(/\.git$/,"")}.git`,...ref||["tree","blob"].includes(parts[2])&&parts[3]?{ref:ref||decodeURIComponent(parts[3])}:{},...["tree","blob"].includes(parts[2])&&parts.length>4?{subdirectory:decodeURIComponent(parts.slice(4).join("/")).replace(/\/SKILL\.md$/,"")}:{}}}return{repository:url.href,...ref?{ref}:{}}}function matchesTrackedSkillSource(requested,tracked,normalize=source=>source){let location2=(source,ref,sourceType)=>{let value=normalize(source,sourceType);if(typeof value!="string"||!value||value.length>8192||/[\0\r\n]/.test(value))throw new Error("Invalid normalized Skill source");let hash2=value.indexOf("#"),fragment=hash2<0?void 0:value.slice(hash2+1),plain=hash2<0?value:value.slice(0,hash2),parsed=isAbsolute6(plain)?{repository:plain,ref:ref??fragment}:gitSource(plain,ref??fragment),repository=parsed.repository;if(repository.startsWith("file:")&&(repository=fileURLToPath3(repository)),isAbsolute6(repository))repository=resolve8(repository);else{let ssh=repository.match(/^[\w.-]+@([\w.-]+):(.+)$/),url=new URL(ssh?`ssh://${ssh[1]}/${ssh[2]}`:repository);repository=`${url.hostname.toLowerCase()}${url.port?":"+url.port:""}/${url.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/,"")}`}return{...parsed,repository,ref:parsed.ref||void 0}};try{let expected=location2(requested),actual=location2(tracked.source,tracked.ref,tracked.sourceType);if(expected.repository!==actual.repository||expected.ref!==actual.ref)return!1;if(!expected.subdirectory)return!0;let path29=(tracked.skillPath??actual.subdirectory??"").replace(/(?:^|\/)SKILL\.md$/,"").replace(/\/+$/,"");return path29===expected.subdirectory||path29.startsWith(expected.subdirectory+"/")}catch{return normalize(requested)===normalize(tracked.source,tracked.sourceType)&&!tracked.ref}}var init_skillSourceReceipts=__esm({"../setup/dist/skillSourceReceipts.js"(){"use strict"}});import{createHash as createHash15}from"node:crypto";import{mkdtemp,readFile,readdir,realpath,rm as rm2,stat as stat2}from"node:fs/promises";import{lstatSync as lstatSync4,realpathSync as realpathSync3,renameSync as renameSync12}from"node:fs";import{execFileSync as execFileSync2}from"node:child_process";import{homedir as homedir7,tmpdir as tmpdir3}from"node:os";import{basename as basename3,dirname as dirname8,isAbsolute as isAbsolute7,join as join22,relative as relative4,resolve as resolve9,sep as sep3}from"node:path";import{existsSync as existsSync8}from"node:fs";function skillName(text3){return text3.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1].match(/^name:\s*["']?([^"'\r\n]+?)["']?\s*$/m)?.[1]?.trim()}async function findSkillDirectory(root,name,skillPath){if(skillPath){let directory=resolve9(root,skillPath.replace(/(?:^|\/)SKILL\.md$/,"")),resolvedRoot=await realpath(root),candidate=await realpath(directory);if(candidate!==resolvedRoot&&!candidate.startsWith(resolvedRoot+sep3))throw new Error("Skill source path escapes its repository");if(skillName(await readFile(join22(candidate,"SKILL.md"),"utf8"))===name)return candidate}let matches=[],scanned=0,visit=async(directory,depth)=>{if(++scanned>1e4||depth>32)throw new Error("Skill source discovery exceeds its limit");let entries=await readdir(directory,{withFileTypes:!0});entries.find(entry=>entry.name==="SKILL.md"&&entry.isFile())&&skillName(await readFile(join22(directory,"SKILL.md"),"utf8"))===name&&matches.push(directory);for(let entry of entries)entry.isDirectory()&&![".git","node_modules"].includes(entry.name)&&await visit(join22(directory,entry.name),depth+1)};if(await visit(root,0),matches.length!==1)throw new Error(`Cannot uniquely locate Skill source: ${name}`);return matches[0]}async function hashSkillDirectory(directory,ignoreRuntimeFiles=!1){let files=[],total=0,visit=async current=>{for(let entry of await readdir(current,{withFileTypes:!0})){if([".git","node_modules"].includes(entry.name)||ignoreRuntimeFiles&&["__pycache__",".DS_Store"].includes(entry.name))continue;let file=join22(current,entry.name);if(entry.isDirectory())await visit(file);else if(entry.isFile()){let info=await stat2(file);if(total+=info.size,total>64*1024*1024||files.length>=1e4)throw new Error("Skill source exceeds the comparison limit");files.push({path:relative4(directory,file).split(sep3).join("/").replace(ignoreRuntimeFiles?/^SKILL\.md\.mearl-disabled$/:/$^/,"SKILL.md"),bytes:await readFile(file)})}}};await visit(directory);let hash2=createHash15("sha256");for(let file of files.sort((a,b)=>a.path.localeCompare(b.path)))hash2.update(file.path),hash2.update(file.bytes);return hash2.digest("hex")}async function checkTrackedSkillUpdates(options={}){let sources=[...readTrackedSkillSources("global",void 0,options),...options.cwd?readTrackedSkillSources("project",options.cwd,options):[]];if(sources.some(source=>!isPublicSkillSource(source)))throw new Error("Installed Skills require an external manager. Enable its preset.");if(sources.length>500)throw new Error("Too many tracked Skills to inspect at once");let temporary=await mkdtemp(join22(tmpdir3(),"mearl-skill-sources-")),checkouts=new Map,runner=options.runCommand??runCommand,updates=[];try{for(let source of sources){let local=isAbsolute7(source.source)?source.source:void 0,location2=local?{repository:local}:gitSource(source.source,source.ref),key=JSON.stringify(location2),checkout=checkouts.get(key);if(!checkout){let target=join22(temporary,String(checkouts.size));checkout=local?Promise.resolve(local):(async()=>{if((await runner("git",["clone","--depth","1","--filter=blob:none",...location2.ref?["--branch",location2.ref]:[],"--",location2.repository,target],{capture:!0,env:{...options.env??process.env,GIT_TERMINAL_PROMPT:"0"},timeoutMs:12e4})).code!==0)throw new Error(`Unable to inspect Skill source: ${source.name}`);return target})(),checkouts.set(key,checkout)}let root=await realpath(await checkout),directory=await findSkillDirectory(root,source.name,source.skillPath??location2.subdirectory),changed;if(source.expectedHash&&source.hashKind==="git-tree"&&!local){let folder=relative4(root,directory).split(sep3).join("/"),result=await runner("git",["rev-parse",`HEAD${folder?":"+folder:"^{tree}"}`],{cwd:root,capture:!0,timeoutMs:3e4});if(result.code!==0||!/^[a-f\d]{40,64}$/.test(result.stdout.trim()))throw new Error(`Unable to compare Skill revision: ${source.name}`);changed=result.stdout.trim()!==source.expectedHash}else if(source.expectedHash&&source.hashKind==="folder")changed=await hashSkillDirectory(directory)!==source.expectedHash;else{let installed=join22(source.scope==="global"?options.homeDirectory??homedir7():options.cwd,".agents","skills",source.name);changed=await hashSkillDirectory(directory,!0)!==await hashSkillDirectory(installed,!0)}changed&&updates.push({name:source.name,source:source.source,scope:source.scope})}return updates}finally{await rm2(temporary,{recursive:!0,force:!0})}}function readLinkedSkillSource(directory,name){try{if(!lstatSync4(directory).isSymbolicLink())return;let actual=realpathSync3(directory),git=(...args)=>execFileSync2("git",["--no-optional-locks","-c","core.fsmonitor=false","-C",actual,...args],{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:2e3,maxBuffer:16384}).trim(),root=git("rev-parse","--show-toplevel"),folder=relative4(root,actual);if(folder===".."||folder.startsWith(".."+sep3)||isAbsolute7(folder))return;let skillPath=(folder?folder.split(sep3).join("/")+"/":"")+"SKILL.md";if(git("ls-files","--full-name","--error-unmatch","--","SKILL.md")!==skillPath)return;let source=git("config","--get","remote.origin.url");return!source||source.length>4096||/[\0\r\n]/.test(source)?void 0:(isAbsolute7(source)||gitSource(source),{name,source,scope:"global",skillPath,sourceType:"git",hashKind:"folder"})}catch{return}}async function preserveSkillDisabled(directory,operation){let disabled=getSkillEnabled(directory)===!1;try{return await operation()}finally{disabled&&existsSync8(join22(directory,"SKILL.md"))&&renameSync12(join22(directory,"SKILL.md"),join22(directory,DISABLED_SKILL_MANIFEST))}}function canonicalPath(path29){let absolute=resolve9(path29);try{return realpathSync3(absolute)}catch{let parent=dirname8(absolute);return parent===absolute?absolute:join22(canonicalPath(parent),basename3(absolute))}}function hasOnlySetupRegistrations(directory){let contains=(root,entry)=>{let path29=relative4(root,entry);return path29!==""&&path29!==".."&&!path29.startsWith(".."+sep3)&&!isAbsolute7(path29)},registrations=listPluginNames().flatMap(name=>findPluginRegistration(name)??[]).filter(registration=>contains(resolve9(directory),resolve9(registration.entry))||contains(canonicalPath(directory),canonicalPath(registration.entry)));return registrations.length>0&®istrations.every(registration=>registration.managedBy===OFFICIAL_PLUGIN_MANAGER)}function inspectGlobalSkill(source,name,version2,options={}){if(!source.trim()||!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid Skill identity");let directory=join22(options.homeDirectory??homedir7(),".agents","skills",name);if(existsSync8(join22(directory,"SKILL.md"))&&existsSync8(join22(directory,DISABLED_SKILL_MANIFEST)))return{state:"conflict",reason:"SKILL_MANIFEST_CONFLICT"};let receipt=(options.readSources??readTrackedSkillSources)("global",void 0,{homeDirectory:options.homeDirectory}).find(entry2=>entry2.name===name),tracked=receipt??(/(?:#|\/(?:tree|blob)\/)/.test(source)?void 0:readLinkedSkillSource(directory,name));if(tracked&&(!options.externalManager&&!isPublicSkillSource(tracked)||!matchesTrackedSkillSource(source,tracked,options.normalizeSource))){let metadata2=readInstalledSkillMetadata(directory);return receipt&&(options.externalManager||isPublicSkillSource(receipt))&&metadata2?.name===name&&options.migrateFrom?.some(previous=>matchesTrackedSkillSource(previous,receipt,options.normalizeSource))&&hasOnlySetupRegistrations(directory)?{state:"migration",reason:"SKILL_SOURCE_MIGRATION_REQUIRED"}:{state:"conflict",reason:"SKILL_SOURCE_CONFLICT"}}let metadata=readInstalledSkillMetadata(directory);if(!metadata)return{state:"missing",reason:"SKILL_NOT_INSTALLED"};if(!tracked)return{state:"conflict",reason:"SKILL_SOURCE_UNKNOWN"};if(metadata.name!==name)return{state:"conflict",reason:"SKILL_MANIFEST_IDENTITY"};if(version2&&(!metadata.version||!(0,import_semver8.valid)(metadata.version)||!(0,import_semver8.satisfies)(metadata.version,version2)))return{state:"version",reason:"SKILL_VERSION_REQUIRED"};let entry=findPluginDirectoryEntry(directory),names=listPluginNames().filter(name2=>{let registered=findPluginRegistration(name2)?.entry;return registered!==void 0&&resolve9(dirname8(dirname8(registered)))===resolve9(directory)}),managedNames=names.filter(name2=>findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER),requiredNames=managedNames.length?managedNames:names;return entry&&(requiredNames.length!==1||!requiredNames.some(name2=>{let registration=findPluginRegistration(name2);return resolve9(registration.entry)===resolve9(entry)&&!pluginRegistrationNeedsRefresh(registration,!0)}))?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:!entry&&names.length?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:{state:"ready"}}var import_semver8,init_skillSources=__esm({"../setup/dist/skillSources.js"(){"use strict";init_dist();import_semver8=__toESM(require_semver2(),1);init_plugin2();init_skillSourceReceipts();init_skillSourceReceipts()}});import path9 from"node:path";import{homedir as homedir8}from"node:os";function stripAnsi(value){return value.replace(ANSI_ESCAPE_PATTERN,"")}function resolveSkillsExecutable(options={}){let candidate=(options.env??process.env).MEARL_SKILLS_PATH,exists=options.existsSync??(file=>isExecutable(file,options.platform??process.platform));return candidate&&exists(candidate)?candidate:null}function resolveSkillsInvocation(options={}){let env=options.env??process.env,executable=resolveSkillsExecutable(options);if(executable)return{command:executable,argsPrefix:[],env:prependNodePath(prependCommandPath(executable,env))};let processExecPath=options.processExecPath??process.execPath,npx=findExecutable("npx",{env,existsSync:options.existsSync,platform:options.platform,extraDirectories:[path9.dirname(processExecPath)]});return npx?{command:npx,argsPrefix:["-y",SKILLS_CLI_PACKAGE],env:npmExecEnvironment(prependNodePath(prependCommandPath(npx,env),processExecPath))}:null}async function captureSkillsCli(options={}){let env=options.env??process.env,runner=options.runCommand??runCommand,directory=env.MEARL_CAPABILITY_DIR||path9.join(homedir8(),".mearl","capabilities"),current=await new PresetInstallationStore({directory}).current({verifyResources:!1}),registry2=new NodeCapabilityRegistry({env:Object.freeze({...env}),runCommand:runner},directory,{hooks:["skills.manager"]});if(await registry2.refresh(),current.activation?.revision!==registry2.revision||current.activation?.installationRevision!==registry2.installationRevision)throw new Error("SKILL_MANAGER_CHANGED");let readSources=(scope,cwd)=>readTrackedSkillSources(scope,cwd,{env}),selection2=current.rawHash?{path:path9.resolve(directory,"active-node.json"),sha256:current.rawHash}:void 0,managedSkills=Object.fromEntries(Object.entries(current.preset?.skills??{}).filter(([,entry])=>entry.enabled!==!1)),backend=registry2.get("skills.manager")?.();if(backend!==void 0){if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(!backend||typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||typeof backend.cli!="function")throw new Error("The selected Skill manager requires a preset update for CLI operations");return{id:backend.id,managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,externalManager:!0,normalizeSource:backend.normalizeSource,readSources:backend.readSources??readSources}),run:async(args,settings)=>{let result=await backend.cli([...args],settings);if(!result||!Number.isInteger(result.code)||typeof result.stdout!="string"||typeof result.stderr!="string")throw new Error("Invalid Skill manager CLI result");return result}}}let invocation2=resolveSkillsInvocation(options);if(invocation2)return{id:"skills",managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,readSources}),run:(args,settings)=>runner(invocation2.command,[...invocation2.argsPrefix,...args],{...settings,env:invocation2.env})}}function parseInstalledSkills(output2){let value=JSON.parse(stripAnsi(output2).trim());if(!Array.isArray(value)||value.some(item=>!item||typeof item.name!="string"||typeof item.path!="string"||!["global","project"].includes(item.scope)))throw new Error("Skills returned an invalid skill list");return value}function parseGlobalMearlSkillPaths(output2){let parsed=parseInstalledSkills(output2);return[...new Set(parsed.flatMap(skill=>skill.name==="mearl"&&skill.scope==="global"&&typeof skill.path=="string"&&skill.path.trim()?[skill.path.trim()]:[]))]}async function runGlobalMearlSkillOperation(operation,options={}){let runner=options.runCommand??runCommand,writeLine=options.writeLine??(line=>console.error(line)),cli;try{cli=await captureSkillsCli({...options,runCommand:runner})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}if(!cli)return writeLine("Skill: skills and npx are both unavailable."),!1;if(operation!=="uninstall"&&cli.managedSkills.mearl){let owned=cli.managedSkills.mearl,status;try{status=cli.inspectGlobal(owned.source,"mearl",owned.version)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}return status.state!=="ready"?(writeLine(`Skill: preset-managed Mearl requires preset apply/update (${status.reason}).`),!1):(writeLine("Skill: retained the Mearl Skill managed by the selected preset."),!0)}let run=async(args2,capture)=>{try{return await cli.run(args2,{capture,timeoutMs:COMMAND_TIMEOUT_MS})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),null}},listMearlPaths=async()=>{let listed=await run(["list","--global","--json"],!0);if(!listed)return null;if(listed.code!==0){writeLine(`Skill: unable to list global skills (exit ${listed.code}).`);let detail2=stripAnsi(listed.stderr||listed.stdout).trim();return detail2&&writeLine(detail2),null}try{return parseGlobalMearlSkillPaths(listed.stdout)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}.`),null}};if(operation==="install"){let installed=await run(["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global",...options.yes?["--yes"]:[]],!1);if(!installed)return!1;if(installed.code!==0)return writeLine(`Skill: install failed (exit ${installed.code}).`),!1;let installedPaths=await listMearlPaths();return!installedPaths||installedPaths.length===0?(writeLine("Skill: installation finished without a tracked global mearl skill."),!1):(writeLine("Skill: installed."),!0)}let paths=await listMearlPaths();if(!paths)return!1;if(paths.length===0)return writeLine("Skill: no tracked global mearl skill found; skipped."),!0;writeLine("Skill installation:"),paths.forEach(skillPath=>writeLine(` ${skillPath}`));let result=await run(operation==="update"?["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global","--yes"]:["remove","mearl","--global","--yes"],!0);if(!result)return!1;if(result.code!==0)return writeLine(`Skill: ${operation} failed (exit ${result.code}).`),!1;let detail=stripAnsi(`${result.stdout}
|
|
1088
|
-
${result.stderr}`).trim();if(detail&&writeLine(detail),/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail)||operation==="update"&&!/\bInstalled [1-9]\d* skills?\b/.test(detail))return writeLine(`Skill: ${operation} failed.`),!1;let remainingPaths=await listMearlPaths();return!remainingPaths||(operation==="uninstall"?remainingPaths.length!==0:remainingPaths.length===0)?(writeLine(`Skill: ${operation} did not reach the expected installation state.`),!1):(writeLine(`Skill: ${operation==="update"?"updated":"uninstalled"}.`),!0)}var SKILLS_CLI_PACKAGE,MEARL_SKILL_SOURCE,COMMAND_TIMEOUT_MS,ANSI_ESCAPE_PATTERN,init_skills=__esm({"../setup/dist/skills.js"(){"use strict";init_setupVersion();init_node_capabilities();init_skillSources();init_presetStore();init_dist();SKILLS_CLI_PACKAGE="skills
|
|
1087
|
+
`,{mode:384})}function browserCdpEndpoint(chromeUserDataDirectory){let activePort=readDevToolsActivePort(chromeUserDataDirectory);if(!activePort)throw new Error("Chrome remote debugging is not enabled");return`ws://127.0.0.1:${activePort.port}${activePort.browserWsPath}`}async function inspectInstallationWithConnection(connection){let target=await connection.send("Target.createTarget",{background:!0,url:"chrome://extensions-internals"});try{let attached=await connection.send("Target.attachToTarget",{flatten:!0,targetId:target.targetId}),text3=(await connection.send("Runtime.evaluate",{awaitPromise:!0,expression:"document.readyState === 'complete' ? document.body.innerText : new Promise(resolve => addEventListener('load', () => resolve(document.body.innerText), {once:true}))",returnByValue:!0},attached.sessionId)).result?.value;if(typeof text3!="string")throw new Error("chrome://extensions-internals did not return extension inventory");let installed=JSON.parse(text3).find(extension=>extension.id===MEARL_EXTENSION_ID);if(!installed)return null;if(typeof installed.location!="string"||typeof installed.name!="string"||typeof installed.path!="string"||typeof installed.version!="string")throw new Error("Chrome returned incomplete Mearl extension metadata");let version2=installed.version;try{let manifest=JSON.parse(fs7.readFileSync(path8.join(installed.path,"manifest.json"),"utf8"));manifest.version===installed.version&&(version2=readExtensionReleaseVersion(manifest)??version2)}catch{}return{id:MEARL_EXTENSION_ID,location:installed.location,name:installed.name,path:installed.path,version:version2}}finally{typeof target.targetId=="string"&&await connection.send("Target.closeTarget",{targetId:target.targetId}).catch(()=>{})}}async function loadUnpackedWithConnection(connection,extensionDirectory){let loaded=await connection.send("Extensions.loadUnpacked",{path:path8.resolve(extensionDirectory)});if(loaded.id!==MEARL_EXTENSION_ID)throw new Error(`Extensions.loadUnpacked returned unexpected extension ID: ${String(loaded.id)}`);let inventory=await connection.send("Extensions.getExtensions");if(!(Array.isArray(inventory.extensions)?inventory.extensions.find(candidate=>candidate?.id===loaded.id):null)?.enabled)throw new Error("Chrome loaded the extension but did not report it as enabled");return{extensionId:loaded.id}}async function connectBrowserExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));return{close:()=>connection.close(),inspectInstallation:()=>inspectInstallationWithConnection(connection),loadUnpacked:extensionDirectory=>loadUnpackedWithConnection(connection,extensionDirectory)}}async function loadUnpackedViaCdp(extensionDirectory,chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await loadUnpackedWithConnection(connection,extensionDirectory)}finally{connection.close()}}async function inspectMearlExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await inspectInstallationWithConnection(connection)}finally{connection.close()}}async function inspectSetupManagedExtension(targetDirectory){return(await runUnifiedCheck({clientVersion:CLIENT_VERSION,json:!0,local:!0,timeoutSec:5},{writeJson:()=>{}})).browsers.filter(browser=>browser.status==="connected"&&browser.transport==="extension"&&browser.extensionInstallation?.extensionId===MEARL_EXTENSION_ID&&typeof browser.extensionInstallation.setupManagedPath=="string"&&sameExtensionPath(browser.extensionInstallation.setupManagedPath,targetDirectory)).map(browser=>browser.browserId)}async function reloadInstalledExtension(browserIds){if(browserIds.length===0)throw new Error("No setup-managed Mearl extension was found");let failures=[],reloaded=0;for(let browserId of browserIds)try{await invoke("__extension_reload",{},{browser:browserId,timeoutSec:5}),reloaded+=1}catch(error){failures.push(error instanceof Error?error.message:String(error))}if(reloaded===0)throw new Error(`Failed to reload the connected extension: ${failures.join("; ")}`)}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID19()}`,targetExists=fs7.existsSync(targetDirectory);try{targetExists&&await fs7.promises.rename(targetDirectory,backupDirectory),await fs7.promises.rename(stagingDirectory,targetDirectory)}catch(error){throw!fs7.existsSync(targetDirectory)&&fs7.existsSync(backupDirectory)&&await fs7.promises.rename(backupDirectory,targetDirectory),error}targetExists&&await fs7.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path8.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs7.readFileSync(manifestPath,"utf8"))}catch(error){throw new Error(`Downloaded extension has no valid manifest.json: ${error instanceof Error?error.message:error}`,{cause:error})}if(parsed.manifest_version!==3||typeof parsed.name!="string"||typeof parsed.key!="string"||parsed.key.length===0)throw new Error("Downloaded archive is not a valid Manifest V3 extension");if(!readExtensionReleaseVersion(parsed))throw new Error("Downloaded extension manifest has an invalid version");return parsed}async function extractExtensionArchive(archivePath,destination){let archive=new import_adm_zip.default(archivePath);for(let entry of archive.getEntries()){let name=entry.entryName,type=entry.header.attr>>>16&61440;if(name.includes("\\")||name.includes("\0")||path8.posix.isAbsolute(name)||path8.win32.isAbsolute(name)||name.split("/").some(part=>part===".."||part===".")||type!==0&&type!==32768&&type!==16384)throw new Error("Extension archive contains an unsafe entry")}await archive.extractAllToAsync(destination,!1)}async function downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive,{managed=!0}={}){let release=validateExtensionRelease(releaseInput),parentDirectory=path8.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID19()}`,archivePath=path8.join(parentDirectory,`.mearl-extension-${randomUUID19()}.zip`);await fs7.promises.mkdir(parentDirectory,{recursive:!0});try{let response=await fetchImpl(release.archiveUrl,{redirect:"follow"});if(!response.ok)throw new Error(`Extension archive returned HTTP ${response.status}: ${release.archiveUrl}`);if(Number(response.headers.get("content-length")??0)>MAX_ARCHIVE_BYTES)throw new Error(`Extension archive exceeds ${MAX_ARCHIVE_BYTES} bytes`);let archive=Buffer.from(await response.arrayBuffer());if(archive.length===0||archive.length>MAX_ARCHIVE_BYTES)throw new Error("Extension archive is empty or too large");if(release.sha256&&createHash14("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs7.promises.writeFile(archivePath,archive,{mode:384}),await fs7.promises.mkdir(stagingDirectory,{recursive:!0}),await extractArchive(archivePath,stagingDirectory);let manifest=readExtensionManifest(stagingDirectory);if(readExtensionReleaseVersion(manifest)!==release.version)throw new Error(`Extension archive version ${String(manifest.version)} does not match ${release.version}`);return managed&&await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs7.promises.rm(archivePath,{force:!0}),await fs7.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path8.resolve(options.targetDirectory);if(!hasSetupMarker(targetDirectory))throw new Error("The running extension is not managed by Mearl setup");let fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??extractExtensionArchive;return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}async function installMearlBrowserExtension(options={},dependencies={}){let connectCdp=dependencies.connectCdp??connectBrowserExtensionViaCdp,fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??extractExtensionArchive,loadUnpacked=dependencies.loadUnpacked??loadUnpackedViaCdp,inspectInstallation=dependencies.inspectInstallation??inspectMearlExtensionViaCdp,inspectInstalled=dependencies.inspectInstalled??inspectSetupManagedExtension,reloadInstalled=dependencies.reloadInstalled??reloadInstalledExtension,sleep2=dependencies.sleep??(milliseconds=>new Promise(resolve16=>setTimeout(resolve16,milliseconds))),writeLine=options.writeLine??(line=>console.error(line)),targetDirectory=path8.resolve(options.targetDirectory??resolveMearlExtensionDirectory()),release=options.release?validateExtensionRelease(options.release):await fetchBrowserExtensionRelease(fetchImpl),chromeUserDataDirectory=options.chromeUserDataDirectory??resolveChromeUserDataDirectory(),waitForCdpMs=Math.max(0,options.waitForCdpMs??0),useSharedCdpSession=!dependencies.inspectInstallation&&!dependencies.loadUnpacked,setupManagedBrowserIds=[];if(hasSetupMarker(targetDirectory))try{setupManagedBrowserIds=await inspectInstalled(targetDirectory)}catch{}let setupManagedAtStart=setupManagedBrowserIds.length>0,cdpSession2,inspectOnce=async()=>{if(!useSharedCdpSession)return options.force?null:inspectInstallation(chromeUserDataDirectory);let candidate=await connectCdp(chromeUserDataDirectory);try{let installed=options.force?null:await candidate.inspectInstallation();return cdpSession2?.close(),cdpSession2=candidate,installed}catch(error){throw candidate.close(),error}},waitForCdpInspection=async()=>{let deadline=Date.now()+waitForCdpMs,lastFailure,lastNoticeAt=0;do try{let installed=await inspectOnce();if(installed&&!isSetupManagedInstallation(installed,targetDirectory)&&!options.force)throw new BrowserExtensionConflictError(installed);return}catch(error){if(error instanceof BrowserExtensionConflictError)throw error;let message=error instanceof Error?error.message:String(error);if(lastFailure=message,waitForCdpMs===0||isUnsupportedCdpMethodError(message))break;lastNoticeAt===0?(writeLine("Waiting for Chrome remote debugging before checking the installed extension..."),writeLine("Open chrome://inspect/#remote-debugging, enable remote debugging, and approve the connection."),lastNoticeAt=Date.now()):Date.now()-lastNoticeAt>=15e3&&(writeLine("Still waiting for Chrome remote debugging..."),lastNoticeAt=Date.now()),await sleep2(Math.min(1e3,Math.max(0,deadline-Date.now())))}while(Date.now()<deadline);return lastFailure};try{if(!setupManagedAtStart){let cdpError=await waitForCdpInspection();if(cdpError)return{filesUpdated:!1,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError}}if(await downloadAndReplaceExtension(release,targetDirectory,fetchImpl,extractArchive),setupManagedAtStart)try{return await reloadInstalled(setupManagedBrowserIds),{activation:"native-host",extensionId:MEARL_EXTENSION_ID,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(reloadError){let cdpError=await waitForCdpInspection();if(cdpError){let reloadMessage=reloadError instanceof Error?reloadError.message:String(reloadError);return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:`Native Host reload failed: ${reloadMessage}; CDP fallback failed: ${cdpError}`}}}try{return{activation:"cdp",extensionId:(cdpSession2?await cdpSession2.loadUnpacked(targetDirectory):await loadUnpacked(targetDirectory,chromeUserDataDirectory)).extensionId,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(error){return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:error instanceof Error?error.message:String(error)}}}finally{cdpSession2?.close()}}var import_adm_zip,MEARL_EXTENSION_DOWNLOAD_PAGE,MEARL_EXTENSION_REMOTE_CONFIG_URL,MEARL_EXTENSION_DIRECTORY_NAME,MEARL_EXTENSION_ID,MEARL_EXTENSION_SETUP_MARKER,ARCHIVE_PATTERN,MAX_ARCHIVE_BYTES,SHA256_PATTERN,BrowserExtensionConflictError,CdpConnection,init_browserExtension=__esm({"../setup/dist/browserExtension.js"(){"use strict";init_setupVersion();init_dist2();init_check();init_local();import_adm_zip=__toESM(require_adm_zip(),1);init_version();MEARL_EXTENSION_DOWNLOAD_PAGE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/tag/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl/releases/latest",MEARL_EXTENSION_REMOTE_CONFIG_URL=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/download/v${SETUP_VERSION}/config.json`:"https://github.com/mearlhq/mearl/releases/latest/download/config.json",MEARL_EXTENSION_DIRECTORY_NAME="chrome-extension",MEARL_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",MEARL_EXTENSION_SETUP_MARKER=".mearl-setup.json",ARCHIVE_PATTERN=/mearl-chrome-v(\d+\.\d+\.\d+(?:-beta\.\d+)?)\.zip/g,MAX_ARCHIVE_BYTES=64*1024*1024,SHA256_PATTERN=/^[a-f\d]{64}$/i,BrowserExtensionConflictError=class extends Error{installed;constructor(installed){super(`Mearl extension ${installed.id} is already installed from ${installed.location} at ${installed.path||"(managed location)"}. Re-run with --force to replace it.`),this.installed=installed,this.name="BrowserExtensionConflictError"}};CdpConnection=class _CdpConnection{socket;closed=!1;nextId=1;pending=new Map;constructor(socket){this.socket=socket,socket.on("message",data=>this.handleMessage(data)),socket.on("close",()=>this.close(new Error("CDP WebSocket closed before responding"))),socket.on("error",error=>this.close(error))}static connect(endpoint){return new Promise((resolve16,reject)=>{let socket=new WebSocket2(endpoint,{handshakeTimeout:5e3,maxPayload:8388608,perMessageDeflate:!1}),settled=!1,finish=error=>{settled||(settled=!0,error?(socket.terminate(),reject(error)):resolve16(new _CdpConnection(socket)))};socket.once("open",()=>finish()),socket.once("error",error=>finish(error)),socket.once("unexpected-response",(_request,response)=>{response.resume(),finish(new Error(`CDP WebSocket returned HTTP ${response.statusCode??0}`))})})}send(method,params={},sessionId,timeoutMs=1e4){return new Promise((resolve16,reject)=>{let id3=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id3),reject(new Error(`CDP command timed out: ${method}`))},timeoutMs);this.pending.set(id3,{reject,resolve:resolve16,timer}),this.socket.send(JSON.stringify({id:id3,method,params,...sessionId?{sessionId}:{}}),error=>{if(!error)return;let pending=this.pending.get(id3);pending&&(clearTimeout(pending.timer),this.pending.delete(id3),pending.reject(error))})})}close(error=new Error("CDP connection closed")){if(!this.closed){this.closed=!0;for(let pending of this.pending.values())clearTimeout(pending.timer),pending.reject(error);this.pending.clear(),this.socket.terminate()}}handleMessage(data){try{let message=JSON.parse(rawDataToString(data));if(message.id===void 0)return;let pending=this.pending.get(message.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(message.id),message.error?pending.reject(new Error(message.error.message??"CDP command failed")):pending.resolve(message.result??{})}catch{}}}}});var init_plugin2=__esm({"../client/dist/plugin.js"(){"use strict";init_plugin();init_skillManifest()}});var require_clean=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports,module){"use strict";var parse2=require_parse(),clean=(version2,options)=>{let s=parse2(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module.exports=clean}});var require_inc=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/inc.js"(exports,module){"use strict";var SemVer=require_semver(),inc=(version2,release,options,identifier2,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier2,identifier2=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier2,identifierBase).version}catch{return null}};module.exports=inc}});var require_diff=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/diff.js"(exports,module){"use strict";var parse2=require_parse(),diff=(version1,version2)=>{let v1=parse2(version1,null,!0),v2=parse2(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return"major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module.exports=diff}});var require_major=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/major.js"(exports,module){"use strict";var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module.exports=major}});var require_minor=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/minor.js"(exports,module){"use strict";var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module.exports=minor}});var require_patch=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/patch.js"(exports,module){"use strict";var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module.exports=patch}});var require_prerelease=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/prerelease.js"(exports,module){"use strict";var parse2=require_parse(),prerelease=(version2,options)=>{let parsed=parse2(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module.exports=prerelease}});var require_rcompare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rcompare.js"(exports,module){"use strict";var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module.exports=rcompare}});var require_compare_loose=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-loose.js"(exports,module){"use strict";var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module.exports=compareLoose}});var require_compare_build=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-build.js"(exports,module){"use strict";var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module.exports=compareBuild}});var require_sort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/sort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module.exports=sort}});var require_rsort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rsort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module.exports=rsort}});var require_coerce=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/coerce.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else{let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse2(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module.exports=coerce}});var require_truncate=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/truncate.js"(exports,module){"use strict";var parse2=require_parse(),constants7=require_constants(),SemVer=require_semver(),truncate=(version2,truncation,options)=>{if(!constants7.RELEASE_TYPES.includes(truncation))return null;let clonedVersion=cloneInputVersion(version2,options);return clonedVersion&&doTruncation(clonedVersion,truncation)},cloneInputVersion=(version2,options)=>{let versionStringToParse=version2 instanceof SemVer?version2.version:version2;return parse2(versionStringToParse,options)},doTruncation=(version2,truncation)=>{if(isPrerelease(truncation))return version2.version;switch(version2.prerelease=[],truncation){case"major":version2.minor=0,version2.patch=0;break;case"minor":version2.patch=0;break}return version2.format()},isPrerelease=type=>type.startsWith("pre");module.exports=truncate}});var require_to_comparators=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/to-comparators.js"(exports,module){"use strict";var Range=require_range(),toComparators=(range2,options)=>new Range(range2,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module.exports=toComparators}});var require_max_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/max-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range2,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options))}),max};module.exports=maxSatisfying}});var require_min_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range2,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options))}),min};module.exports=minSatisfying}});var require_min_version=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range2,loose)=>{range2=new Range(range2,loose);let minver=new SemVer("0.0.0");if(range2.test(minver)||(minver=new SemVer("0.0.0-0"),range2.test(minver)))return minver;minver=null;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin)}return minver&&range2.test(minver)?minver:null};module.exports=minVersion}});var require_outside=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/outside.js"(exports,module){"use strict";var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies9=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range2,hilo,options)=>{version2=new SemVer(version2,options),range2=new Range(range2,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies9(version2,range2,options))return!1;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator)}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&<efn(version2,low.semver))return!1;if(low.operator===ecomp&<fn(version2,low.semver))return!1}return!0};module.exports=outside}});var require_gtr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/gtr.js"(exports,module){"use strict";var outside=require_outside(),gtr=(version2,range2,options)=>outside(version2,range2,">",options);module.exports=gtr}});var require_ltr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/ltr.js"(exports,module){"use strict";var outside=require_outside(),ltr=(version2,range2,options)=>outside(version2,range2,"<",options);module.exports=ltr}});var require_intersects=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/intersects.js"(exports,module){"use strict";var Range=require_range(),intersects2=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module.exports=intersects2}});var require_simplify=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/simplify.js"(exports,module){"use strict";var satisfies9=require_satisfies(),compare=require_compare();module.exports=(versions,range2,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies9(version2,range2,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range2.raw=="string"?range2.raw:String(range2);return simplified.length<original.length?simplified:range2}}});var require_semver2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports,module){"use strict";var internalRe=require_re(),constants7=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse2=require_parse(),valid7=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),truncate=require_truncate(),Comparator=require_comparator(),Range=require_range(),satisfies9=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange5=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects2=require_intersects(),simplifyRange=require_simplify(),subset2=require_subset();module.exports={parse:parse2,valid:valid7,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,truncate,Comparator,Range,satisfies:satisfies9,toComparators,maxSatisfying,minSatisfying,minVersion,validRange:validRange5,outside,gtr,ltr,intersects:intersects2,simplifyRange,subset:subset2,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants7.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants7.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});import{readFileSync as readFileSync14,statSync as statSync12}from"node:fs";import{homedir as homedir6}from"node:os";import{isAbsolute as isAbsolute6,join as join21,resolve as resolve8}from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";function lockFile(scope,cwd,options){let env=options.env??process.env;return scope==="project"?join21(cwd,"skills-lock.json"):env.XDG_STATE_HOME?join21(env.XDG_STATE_HOME,"skills",".skill-lock.json"):join21(options.homeDirectory??homedir6(),".agents",".skill-lock.json")}function readTrackedSkillSources(scope,cwd,options={}){let file=lockFile(scope,cwd,options),text3;try{if(statSync12(file).size>4*1024*1024)throw new Error("Skill source lock exceeds 4 MiB");text3=readFileSync14(file,"utf8")}catch(error){if(error.code==="ENOENT")return[];throw error}let lock=JSON.parse(text3);if(!lock||!lock.skills||typeof lock.skills!="object"||Array.isArray(lock.skills))throw new Error("Invalid Skills source lock");return Object.entries(lock.skills).flatMap(([name,entry])=>{if(!entry||typeof entry!="object"||entry.sourceType==="node_modules")return[];if(!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid tracked Skill name");let source=typeof entry.sourceUrl=="string"?entry.sourceUrl:entry.source;if(typeof source!="string"||!source.trim())return[];if(source.length>4096||/[\0\r\n]/.test(source))throw new Error("Invalid tracked Skill source");let expectedHash=scope==="global"?entry.skillFolderHash:entry.computedHash;return[{name,source,scope,...typeof entry.sourceType=="string"?{sourceType:entry.sourceType}:{},...typeof entry.ref=="string"?{ref:entry.ref}:{},...typeof entry.skillPath=="string"?{skillPath:entry.skillPath}:{},...typeof expectedHash=="string"&&expectedHash?{expectedHash}:{},hashKind:scope==="global"&&typeof expectedHash=="string"&&/^[a-f0-9]{40}$/.test(expectedHash)?"git-tree":"folder"}]})}function isPublicSkillSource(source){return source.sourceType===void 0||["github","gitlab","git","local","well-known"].includes(source.sourceType)}function gitSource(source,ref){if(/^[\w.-]+\/[\w.-]+$/.test(source))return{repository:`https://github.com/${source}.git`,...ref?{ref}:{}};if(/^[\w.-]+@[\w.-]+:[^\s]+$/.test(source))return{repository:source,...ref?{ref}:{}};let url=new URL(source);if(!["https:","http:","ssh:","git:","file:"].includes(url.protocol)||url.password||url.username&&url.protocol!=="ssh:"||url.search||url.hash)throw new Error("Skill source is not a supported Git repository");if(url.hostname==="github.com"&&!url.port){let parts=url.pathname.split("/").filter(Boolean);if(parts.length>=2)return{repository:`https://github.com/${parts[0]}/${parts[1].replace(/\.git$/,"")}.git`,...ref||["tree","blob"].includes(parts[2])&&parts[3]?{ref:ref||decodeURIComponent(parts[3])}:{},...["tree","blob"].includes(parts[2])&&parts.length>4?{subdirectory:decodeURIComponent(parts.slice(4).join("/")).replace(/\/SKILL\.md$/,"")}:{}}}return{repository:url.href,...ref?{ref}:{}}}function matchesTrackedSkillSource(requested,tracked,normalize=source=>source){let location2=(source,ref,sourceType)=>{let value=normalize(source,sourceType);if(typeof value!="string"||!value||value.length>8192||/[\0\r\n]/.test(value))throw new Error("Invalid normalized Skill source");let hash2=value.indexOf("#"),fragment=hash2<0?void 0:value.slice(hash2+1),plain=hash2<0?value:value.slice(0,hash2),parsed=isAbsolute6(plain)?{repository:plain,ref:ref??fragment}:gitSource(plain,ref??fragment),repository=parsed.repository;if(repository.startsWith("file:")&&(repository=fileURLToPath3(repository)),isAbsolute6(repository))repository=resolve8(repository);else{let ssh=repository.match(/^[\w.-]+@([\w.-]+):(.+)$/),url=new URL(ssh?`ssh://${ssh[1]}/${ssh[2]}`:repository);repository=`${url.hostname.toLowerCase()}${url.port?":"+url.port:""}/${url.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/,"")}`}return{...parsed,repository,ref:parsed.ref||void 0}};try{let expected=location2(requested),actual=location2(tracked.source,tracked.ref,tracked.sourceType);if(expected.repository!==actual.repository||expected.ref!==actual.ref)return!1;if(!expected.subdirectory)return!0;let path29=(tracked.skillPath??actual.subdirectory??"").replace(/(?:^|\/)SKILL\.md$/,"").replace(/\/+$/,"");return path29===expected.subdirectory||path29.startsWith(expected.subdirectory+"/")}catch{return normalize(requested)===normalize(tracked.source,tracked.sourceType)&&!tracked.ref}}var init_skillSourceReceipts=__esm({"../setup/dist/skillSourceReceipts.js"(){"use strict"}});import{createHash as createHash15}from"node:crypto";import{mkdtemp,readFile,readdir,realpath,rm as rm2,stat as stat2}from"node:fs/promises";import{lstatSync as lstatSync4,realpathSync as realpathSync3,renameSync as renameSync12}from"node:fs";import{execFileSync as execFileSync2}from"node:child_process";import{homedir as homedir7,tmpdir as tmpdir3}from"node:os";import{basename as basename3,dirname as dirname8,isAbsolute as isAbsolute7,join as join22,relative as relative4,resolve as resolve9,sep as sep3}from"node:path";import{existsSync as existsSync8}from"node:fs";function skillName(text3){return text3.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1].match(/^name:\s*["']?([^"'\r\n]+?)["']?\s*$/m)?.[1]?.trim()}async function findSkillDirectory(root,name,skillPath){if(skillPath){let directory=resolve9(root,skillPath.replace(/(?:^|\/)SKILL\.md$/,"")),resolvedRoot=await realpath(root),candidate=await realpath(directory);if(candidate!==resolvedRoot&&!candidate.startsWith(resolvedRoot+sep3))throw new Error("Skill source path escapes its repository");if(skillName(await readFile(join22(candidate,"SKILL.md"),"utf8"))===name)return candidate}let matches=[],scanned=0,visit=async(directory,depth)=>{if(++scanned>1e4||depth>32)throw new Error("Skill source discovery exceeds its limit");let entries=await readdir(directory,{withFileTypes:!0});entries.find(entry=>entry.name==="SKILL.md"&&entry.isFile())&&skillName(await readFile(join22(directory,"SKILL.md"),"utf8"))===name&&matches.push(directory);for(let entry of entries)entry.isDirectory()&&![".git","node_modules"].includes(entry.name)&&await visit(join22(directory,entry.name),depth+1)};if(await visit(root,0),matches.length!==1)throw new Error(`Cannot uniquely locate Skill source: ${name}`);return matches[0]}async function hashSkillDirectory(directory,ignoreRuntimeFiles=!1){let files=[],total=0,visit=async current=>{for(let entry of await readdir(current,{withFileTypes:!0})){if([".git","node_modules"].includes(entry.name)||ignoreRuntimeFiles&&["__pycache__",".DS_Store"].includes(entry.name))continue;let file=join22(current,entry.name);if(entry.isDirectory())await visit(file);else if(entry.isFile()){let info=await stat2(file);if(total+=info.size,total>64*1024*1024||files.length>=1e4)throw new Error("Skill source exceeds the comparison limit");files.push({path:relative4(directory,file).split(sep3).join("/").replace(ignoreRuntimeFiles?/^SKILL\.md\.mearl-disabled$/:/$^/,"SKILL.md"),bytes:await readFile(file)})}}};await visit(directory);let hash2=createHash15("sha256");for(let file of files.sort((a,b)=>a.path.localeCompare(b.path)))hash2.update(file.path),hash2.update(file.bytes);return hash2.digest("hex")}async function checkTrackedSkillUpdates(options={}){let sources=[...readTrackedSkillSources("global",void 0,options),...options.cwd?readTrackedSkillSources("project",options.cwd,options):[]];if(sources.some(source=>!isPublicSkillSource(source)))throw new Error("Installed Skills require an external manager. Enable its preset.");if(sources.length>500)throw new Error("Too many tracked Skills to inspect at once");let temporary=await mkdtemp(join22(tmpdir3(),"mearl-skill-sources-")),checkouts=new Map,runner=options.runCommand??runCommand,updates=[];try{for(let source of sources){let local=isAbsolute7(source.source)?source.source:void 0,location2=local?{repository:local}:gitSource(source.source,source.ref),key=JSON.stringify(location2),checkout=checkouts.get(key);if(!checkout){let target=join22(temporary,String(checkouts.size));checkout=local?Promise.resolve(local):(async()=>{if((await runner("git",["clone","--depth","1","--filter=blob:none",...location2.ref?["--branch",location2.ref]:[],"--",location2.repository,target],{capture:!0,env:{...options.env??process.env,GIT_TERMINAL_PROMPT:"0"},timeoutMs:12e4})).code!==0)throw new Error(`Unable to inspect Skill source: ${source.name}`);return target})(),checkouts.set(key,checkout)}let root=await realpath(await checkout),directory=await findSkillDirectory(root,source.name,source.skillPath??location2.subdirectory),changed;if(source.expectedHash&&source.hashKind==="git-tree"&&!local){let folder=relative4(root,directory).split(sep3).join("/"),result=await runner("git",["rev-parse",`HEAD${folder?":"+folder:"^{tree}"}`],{cwd:root,capture:!0,timeoutMs:3e4});if(result.code!==0||!/^[a-f\d]{40,64}$/.test(result.stdout.trim()))throw new Error(`Unable to compare Skill revision: ${source.name}`);changed=result.stdout.trim()!==source.expectedHash}else if(source.expectedHash&&source.hashKind==="folder")changed=await hashSkillDirectory(directory)!==source.expectedHash;else{let installed=join22(source.scope==="global"?options.homeDirectory??homedir7():options.cwd,".agents","skills",source.name);changed=await hashSkillDirectory(directory,!0)!==await hashSkillDirectory(installed,!0)}changed&&updates.push({name:source.name,source:source.source,scope:source.scope})}return updates}finally{await rm2(temporary,{recursive:!0,force:!0})}}function readLinkedSkillSource(directory,name){try{if(!lstatSync4(directory).isSymbolicLink())return;let actual=realpathSync3(directory),git=(...args)=>execFileSync2("git",["--no-optional-locks","-c","core.fsmonitor=false","-C",actual,...args],{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:2e3,maxBuffer:16384}).trim(),root=git("rev-parse","--show-toplevel"),folder=relative4(root,actual);if(folder===".."||folder.startsWith(".."+sep3)||isAbsolute7(folder))return;let skillPath=(folder?folder.split(sep3).join("/")+"/":"")+"SKILL.md";if(git("ls-files","--full-name","--error-unmatch","--","SKILL.md")!==skillPath)return;let source=git("config","--get","remote.origin.url");return!source||source.length>4096||/[\0\r\n]/.test(source)?void 0:(isAbsolute7(source)||gitSource(source),{name,source,scope:"global",skillPath,sourceType:"git",hashKind:"folder"})}catch{return}}async function preserveSkillDisabled(directory,operation){let disabled=getSkillEnabled(directory)===!1;try{return await operation()}finally{disabled&&existsSync8(join22(directory,"SKILL.md"))&&renameSync12(join22(directory,"SKILL.md"),join22(directory,DISABLED_SKILL_MANIFEST))}}function canonicalPath(path29){let absolute=resolve9(path29);try{return realpathSync3(absolute)}catch{let parent=dirname8(absolute);return parent===absolute?absolute:join22(canonicalPath(parent),basename3(absolute))}}function hasOnlySetupRegistrations(directory){let contains=(root,entry)=>{let path29=relative4(root,entry);return path29!==""&&path29!==".."&&!path29.startsWith(".."+sep3)&&!isAbsolute7(path29)},registrations=listPluginNames().flatMap(name=>findPluginRegistration(name)??[]).filter(registration=>contains(resolve9(directory),resolve9(registration.entry))||contains(canonicalPath(directory),canonicalPath(registration.entry)));return registrations.length>0&®istrations.every(registration=>registration.managedBy===OFFICIAL_PLUGIN_MANAGER)}function inspectGlobalSkill(source,name,version2,options={}){if(!source.trim()||!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid Skill identity");let directory=join22(options.homeDirectory??homedir7(),".agents","skills",name);if(existsSync8(join22(directory,"SKILL.md"))&&existsSync8(join22(directory,DISABLED_SKILL_MANIFEST)))return{state:"conflict",reason:"SKILL_MANIFEST_CONFLICT"};let receipt=(options.readSources??readTrackedSkillSources)("global",void 0,{homeDirectory:options.homeDirectory}).find(entry2=>entry2.name===name),tracked=receipt??(/(?:#|\/(?:tree|blob)\/)/.test(source)?void 0:readLinkedSkillSource(directory,name));if(tracked&&(!options.externalManager&&!isPublicSkillSource(tracked)||!matchesTrackedSkillSource(source,tracked,options.normalizeSource))){let metadata2=readInstalledSkillMetadata(directory);return receipt&&(options.externalManager||isPublicSkillSource(receipt))&&metadata2?.name===name&&options.migrateFrom?.some(previous=>matchesTrackedSkillSource(previous,receipt,options.normalizeSource))&&hasOnlySetupRegistrations(directory)?{state:"migration",reason:"SKILL_SOURCE_MIGRATION_REQUIRED"}:{state:"conflict",reason:"SKILL_SOURCE_CONFLICT"}}let metadata=readInstalledSkillMetadata(directory);if(!metadata)return{state:"missing",reason:"SKILL_NOT_INSTALLED"};if(!tracked)return{state:"conflict",reason:"SKILL_SOURCE_UNKNOWN"};if(metadata.name!==name)return{state:"conflict",reason:"SKILL_MANIFEST_IDENTITY"};if(version2&&(!metadata.version||!(0,import_semver.valid)(metadata.version)||!(0,import_semver.satisfies)(metadata.version,version2)))return{state:"version",reason:"SKILL_VERSION_REQUIRED"};let entry=findPluginDirectoryEntry(directory),names=listPluginNames().filter(name2=>{let registered=findPluginRegistration(name2)?.entry;return registered!==void 0&&resolve9(dirname8(dirname8(registered)))===resolve9(directory)}),managedNames=names.filter(name2=>findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER),requiredNames=managedNames.length?managedNames:names;return entry&&(requiredNames.length!==1||!requiredNames.some(name2=>{let registration=findPluginRegistration(name2);return resolve9(registration.entry)===resolve9(entry)&&!pluginRegistrationNeedsRefresh(registration,!0)}))?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:!entry&&names.length?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:{state:"ready"}}var import_semver,init_skillSources=__esm({"../setup/dist/skillSources.js"(){"use strict";init_dist();import_semver=__toESM(require_semver2(),1);init_plugin2();init_skillSourceReceipts();init_skillSourceReceipts()}});import path9 from"node:path";import{homedir as homedir8}from"node:os";function stripAnsi(value){return value.replace(ANSI_ESCAPE_PATTERN,"")}function resolveSkillsExecutable(options={}){let candidate=(options.env??process.env).MEARL_SKILLS_PATH,exists=options.existsSync??(file=>isExecutable(file,options.platform??process.platform));return candidate&&exists(candidate)?candidate:null}function resolveSkillsInvocation(options={}){let env=options.env??process.env,executable=resolveSkillsExecutable(options);if(executable)return{command:executable,argsPrefix:[],env:prependNodePath(prependCommandPath(executable,env))};let processExecPath=options.processExecPath??process.execPath,npx=findExecutable("npx",{env,existsSync:options.existsSync,platform:options.platform,extraDirectories:[path9.dirname(processExecPath)]});return npx?{command:npx,argsPrefix:["-y",`--package=${SKILLS_CLI_PACKAGE}`,"--","skills"],env:npmExecEnvironment(prependNodePath(prependCommandPath(npx,env),processExecPath))}:null}async function captureSkillsCli(options={}){let env=options.env??process.env,runner=options.runCommand??runCommand,directory=env.MEARL_CAPABILITY_DIR||path9.join(homedir8(),".mearl","capabilities"),current=await new PresetInstallationStore({directory}).current({verifyResources:!1}),registry2=new NodeCapabilityRegistry({env:Object.freeze({...env}),runCommand:runner},directory,{hooks:["skills.manager"]});if(await registry2.refresh(),current.activation?.revision!==registry2.revision||current.activation?.installationRevision!==registry2.installationRevision)throw new Error("SKILL_MANAGER_CHANGED");let readSources=(scope,cwd)=>readTrackedSkillSources(scope,cwd,{env}),selection2=current.rawHash?{path:path9.resolve(directory,"active-node.json"),sha256:current.rawHash}:void 0,managedSkills=Object.fromEntries(Object.entries(current.preset?.skills??{}).filter(([,entry])=>entry.enabled!==!1)),backend=registry2.get("skills.manager")?.();if(backend!==void 0){if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(!backend||typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||typeof backend.cli!="function")throw new Error("The selected Skill manager requires a preset update for CLI operations");return{id:backend.id,managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,externalManager:!0,normalizeSource:backend.normalizeSource,readSources:backend.readSources??readSources}),run:async(args,settings)=>{let result=await backend.cli([...args],settings);if(!result||!Number.isInteger(result.code)||typeof result.stdout!="string"||typeof result.stderr!="string")throw new Error("Invalid Skill manager CLI result");return result}}}let invocation2=resolveSkillsInvocation(options);if(invocation2)return{id:"skills",managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,readSources}),run:(args,settings)=>runner(invocation2.command,[...invocation2.argsPrefix,...args],{...settings,env:invocation2.env})}}function parseInstalledSkills(output2){let value=JSON.parse(stripAnsi(output2).trim());if(!Array.isArray(value))throw new Error("Skills returned an invalid skill list");let installed=[];for(let item of value){if(!item||typeof item.name!="string"||!["global","project"].includes(item.scope))throw new Error("Skills returned an invalid skill list");if(!(item.status==="missing"&&item.path===null)){if(typeof item.path!="string")throw new Error("Skills returned an invalid skill list");installed.push(item)}}return installed}function parseGlobalMearlSkillPaths(output2){let parsed=parseInstalledSkills(output2);return[...new Set(parsed.flatMap(skill=>skill.name==="mearl"&&skill.scope==="global"&&typeof skill.path=="string"&&skill.path.trim()?[skill.path.trim()]:[]))]}async function runGlobalMearlSkillOperation(operation,options={}){let runner=options.runCommand??runCommand,writeLine=options.writeLine??(line=>console.error(line)),cli;try{cli=await captureSkillsCli({...options,runCommand:runner})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}if(!cli)return writeLine("Skill: skills and npx are both unavailable."),!1;if(operation!=="uninstall"&&cli.managedSkills.mearl){let owned=cli.managedSkills.mearl,status;try{status=cli.inspectGlobal(owned.source,"mearl",owned.version)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}return status.state!=="ready"?(writeLine(`Skill: preset-managed Mearl requires preset apply/update (${status.reason}).`),!1):(writeLine("Skill: retained the Mearl Skill managed by the selected preset."),!0)}let run=async(args2,capture)=>{try{return await cli.run(args2,{capture,timeoutMs:COMMAND_TIMEOUT_MS})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),null}},listMearlPaths=async()=>{let listed=await run(["list","--global","--json"],!0);if(!listed)return null;if(listed.code!==0){writeLine(`Skill: unable to list global skills (exit ${listed.code}).`);let detail2=stripAnsi(listed.stderr||listed.stdout).trim();return detail2&&writeLine(detail2),null}try{return parseGlobalMearlSkillPaths(listed.stdout)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}.`),null}};if(operation==="install"){let installed=await run(["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global",...options.yes?["--yes"]:[]],!1);if(!installed)return!1;if(installed.code!==0)return writeLine(`Skill: install failed (exit ${installed.code}).`),!1;let installedPaths=await listMearlPaths();return!installedPaths||installedPaths.length===0?(writeLine("Skill: installation finished without a tracked global mearl skill."),!1):(writeLine("Skill: installed."),!0)}let paths=await listMearlPaths();if(!paths)return!1;if(paths.length===0)return writeLine("Skill: no tracked global mearl skill found; skipped."),!0;writeLine("Skill installation:"),paths.forEach(skillPath=>writeLine(` ${skillPath}`));let result=await run(operation==="update"?["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global","--yes"]:["remove","mearl","--global","--yes"],!0);if(!result)return!1;if(result.code!==0)return writeLine(`Skill: ${operation} failed (exit ${result.code}).`),!1;let detail=stripAnsi(`${result.stdout}
|
|
1088
|
+
${result.stderr}`).trim();if(detail&&writeLine(detail),/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail)||operation==="update"&&!/\bInstalled [1-9]\d* skills?\b/.test(detail))return writeLine(`Skill: ${operation} failed.`),!1;let remainingPaths=await listMearlPaths();return!remainingPaths||(operation==="uninstall"?remainingPaths.length!==0:remainingPaths.length===0)?(writeLine(`Skill: ${operation} did not reach the expected installation state.`),!1):(writeLine(`Skill: ${operation==="update"?"updated":"uninstalled"}.`),!0)}var SKILLS_CLI_PACKAGE,MEARL_SKILL_SOURCE,COMMAND_TIMEOUT_MS,ANSI_ESCAPE_PATTERN,init_skills=__esm({"../setup/dist/skills.js"(){"use strict";init_setupVersion();init_node_capabilities();init_skillSources();init_presetStore();init_dist();SKILLS_CLI_PACKAGE="skills",MEARL_SKILL_SOURCE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/tree/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl",COMMAND_TIMEOUT_MS=12e4,ANSI_ESCAPE_PATTERN=new RegExp(String.raw`\u001B\[[0-?]*[ -/]*[@-~]`,"g")}});function detectMearlProfiles(options={}){let detected=new Map;for(let profile of Object.values(MEARL_PROFILES)){let installation=detectGlobalPackage(profile.anchorPackage,profile.anchorBins,options);installation&&detected.set(profile.id,installation)}return detected}var MEARL_PROFILES,init_profiles=__esm({"../setup/dist/profiles.js"(){"use strict";init_packageManager();MEARL_PROFILES={local:{id:"local",label:"local browser",anchorPackage:"@mearl/native-host",anchorBins:["mearl-native-host"],packages:["@mearl/native-host","@mearl/client"],usesSkill:!0},cloud:{id:"cloud",label:"cloud agent",anchorPackage:"@mearl/cloud-server",anchorBins:["mearl-cloud-server"],packages:["@mearl/cloud-server","@mearl/client"],usesSkill:!0},mcp:{id:"mcp",label:"MCP",anchorPackage:"@mearl/mcp-server",anchorBins:["mearl-mcp-server"],packages:["@mearl/mcp-server"],usesSkill:!1}}}});import fs8 from"node:fs";import path10 from"node:path";import{execFileSync as execFileSync3}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync3("reg",["delete",registryKey,"/f"],{stdio:"pipe"})}catch{}}function uninstallNativeHostArtifacts(options={},dependencies={}){let{mode="both",silent=!1}=options;if(mode==="both")return["skills","mcp"].map(integrationMode=>uninstallNativeHostArtifacts({...options,mode:integrationMode},dependencies)).every(Boolean);let writeLine=dependencies.writeLine??(line=>console.error(line)),log2=line=>{silent||writeLine(line)};try{let existsSync15=dependencies.existsSync??fs8.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs8.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path10.join(hostDir,`${hostName}.json`),path10.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync15(artifact)&&(unlinkSync2(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error){return log2(`❌ Uninstall failed: ${error instanceof Error?error.message:String(error)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});function packageRegistryEnvironment(packageName,env){return packageName.split("/")[0]!=="@mearl"?env:{...env,npm_config_registry:OFFICIAL_NPM_REGISTRY,NPM_CONFIG_REGISTRY:OFFICIAL_NPM_REGISTRY,BUN_CONFIG_REGISTRY:OFFICIAL_NPM_REGISTRY,"npm_config_@mearl:registry":OFFICIAL_NPM_REGISTRY}}var OFFICIAL_NPM_REGISTRY,init_npmRegistry=__esm({"../setup/dist/npmRegistry.js"(){"use strict";OFFICIAL_NPM_REGISTRY="https://registry.npmjs.org/"}});import{existsSync as existsSync9,readFileSync as readFileSync15}from"node:fs";import{createRequire as createRequire5}from"node:module";import{join as join23}from"node:path";async function ensurePluginRuntime(runner=runCommand){for(let[packageName,bin]of[["@mearl/client","mearl"],["@mearl/native-host","mearl-native-host"]]){let inspect=()=>{let installed=detectCliPackage(packageName,[bin]),manifest=installed&&JSON.parse(readFileSync15(join23(installed.packageRoot,"package.json"),"utf8")),version2=manifest?.version,pluginExport=manifest?.exports?.["./plugin"]?.import,supported=packageName!=="@mearl/client"||installed&&typeof pluginExport=="string"&&existsSync9(join23(installed.packageRoot,pluginExport)),current=isMearlReleaseVersion(version2)&&compareMearlReleaseVersions(version2,PLUGIN_RUNTIME_VERSION)>=0;return{installed,version:version2,current,ready:current&&supported}},before=inspect(),ready=before;if(!before.ready){if(before.current&&compareMearlReleaseVersions(before.version,PLUGIN_RUNTIME_VERSION)>0)throw new Error(`${packageName}@${before.version} 缺少插件入口,请修复该版本的安装后重试。`);let manager=detectGlobalPackage(packageName,[bin])??resolveInvokingPackageManager(),command=buildGlobalPackageCommand(manager,"install",[packageName],PLUGIN_RUNTIME_VERSION);console.error(`${packageName}: ${before.version??"未安装"} → ${PLUGIN_RUNTIME_VERSION}`);let result=await runner(command.command,command.args,{env:prependCommandPath(command.command,packageRegistryEnvironment(packageName,process.env))});if(result.code!==0)throw new Error(`${packageName} 安装失败 (exit ${result.code}),插件尚未注册。`);if(ready=inspect(),!ready.ready||!ready.installed)throw new Error(`${packageName} 更新后仍不可用,请检查 PATH 中的 ${bin} 是否指向 >= ${PLUGIN_RUNTIME_VERSION} 的有效安装。`)}if(packageName==="@mearl/native-host"){let executable=ready.installed.executable,initialized=await runner(executable,["--init","--mode","skills"],{env:prependCommandPath(executable)});if(initialized.code!==0)throw new Error(`native-host 初始化失败 (exit ${initialized.code}),插件尚未注册。`)}}}var require4,PLUGIN_RUNTIME_VERSION,init_pluginRuntime=__esm({"../setup/dist/pluginRuntime.js"(){"use strict";init_packageManager();init_dist();init_version();init_npmRegistry();require4=createRequire5(import.meta.url),PLUGIN_RUNTIME_VERSION=require4("../package.json").version}});import{existsSync as existsSync10,mkdirSync as mkdirSync12,readdirSync as readdirSync8,readlinkSync,realpathSync as realpathSync4,rmdirSync,statSync as statSync13}from"node:fs";import{homedir as homedir9}from"node:os";import{basename as basename4,dirname as dirname9,isAbsolute as isAbsolute8,join as join24,relative as relative5,resolve as resolve10,sep as sep4}from"node:path";function globalSkill(entry){let globalSkillsDirectory=join24(homedir9(),".agents","skills"),relativeEntry=relative5(globalSkillsDirectory,resolve10(entry));if(!isAbsolute8(relativeEntry)&&relativeEntry!==".."&&!relativeEntry.startsWith(`..${sep4}`)){let[name,...entrySegments]=relativeEntry.split(sep4);if(name&&entrySegments.length>0)return{directory:join24(globalSkillsDirectory,name),name}}let sourceDirectory=dirname9(dirname9(resolve10(entry)));if(basename4(dirname9(entry))==="scripts")try{let source=existsSync10(sourceDirectory)?realpathSync4(sourceDirectory):sourceDirectory;for(let name of readdirSync8(globalSkillsDirectory)){let directory=join24(globalSkillsDirectory,name),target;try{target=resolve10(globalSkillsDirectory,readlinkSync(directory))}catch{continue}if(target===sourceDirectory||existsSync10(target)&&realpathSync4(target)===source)return{directory,name}}}catch{}}function projectSkill(entry,managedBy){if(!managedBy)return;let absolute=resolve10(entry),marker=`${sep4}.agents${sep4}skills${sep4}`,markerIndex=absolute.lastIndexOf(marker);if(markerIndex<=0)return;let cwd=absolute.slice(0,markerIndex);if(resolve10(cwd)===resolve10(homedir9()))return;let[name,scripts,filename,...remaining]=absolute.slice(markerIndex+marker.length).split(sep4);if(!(!name||scripts!=="scripts"||!["main.mjs","main.py"].includes(filename)||remaining.length>0))return{directory:join24(cwd,".agents","skills",name),name,cwd}}async function uninstallPlugin(name,runner=runCommand,options={}){assertPluginName(name);let entry=findPluginEntry(name);if(!entry)return{removed:!1,unregisteredNames:[]};let entryMissing=!existsSync10(entry),managedSkill=projectSkill(entry,findPluginRegistration(name)?.managedBy)??globalSkill(entry);if(!managedSkill)return unregisterPlugin(name),{...entryMissing?{entryMissing:!0}:{},removed:!0,unregisteredNames:[name]};let{directory:skillDirectory,name:skillName2}=managedSkill,unregisteredNames=listPluginNames().filter(pluginName=>{try{let candidate=findPluginEntry(pluginName);return candidate?(projectSkill(candidate,"skills")??globalSkill(candidate))?.directory===skillDirectory:!1}catch{return!1}});if(options.preserveRegistrationsOutsideManager&&unregisteredNames.some(pluginName=>findPluginRegistration(pluginName)?.managedBy!==options.preserveRegistrationsOutsideManager))return unregisterPlugin(name),{removed:!0,unregisteredNames:[name]};let cli=await captureSkillsCli({env:options.env,runCommand:runner});if(!cli)throw new Error("未找到 skills 或 npx,插件注册已保留。");let placeholderCreated=!1;if(!existsSync10(skillDirectory)){mkdirSync12(dirname9(skillDirectory),{recursive:!0,mode:448});try{mkdirSync12(skillDirectory,{mode:448}),placeholderCreated=!0}catch(error){if(error.code!=="EEXIST")throw error}}let removed;try{removed=await cli.run(["remove",skillName2,...managedSkill.cwd?[]:["--global"],"--yes"],{tee:!0,...managedSkill.cwd?{cwd:managedSkill.cwd}:{}})}catch(error){throw new Error(`skills remove ${skillName2} 执行失败:${error instanceof Error?error.message:String(error)};插件注册已保留。`,{cause:error})}finally{if(placeholderCreated)try{rmdirSync(skillDirectory)}catch{}}if(removed.code!==0)throw new Error(`skills remove ${skillName2} 失败(exit ${removed.code});插件注册已保留。`);if(/Failed to remove\s+[1-9]\d*\s+skills?/i.test(stripAnsi(`${removed.stdout}
|
|
1089
1089
|
${removed.stderr}`))||existsSync10(skillDirectory))throw new Error(`skills remove ${skillName2} 未完成;插件注册已保留。`);for(let pluginName of unregisteredNames)unregisterPlugin(pluginName);return{...entryMissing?{entryMissing:!0}:{},removed:!0,skillName:skillName2,unregisteredNames}}function parseInstalledPluginPaths(output2,listed=[]){let paths=[],expected=0,inResult=!1;for(let line of stripAnsi(output2).split(/\r?\n/)){let heading=line.match(/\bInstalled (\d+) skills?\b/);if(heading){expected+=Number(heading[1]),inResult=!0;continue}if(!inResult)continue;if(/[╰└├]/.test(line)){inResult=!1;continue}let item=line.trim().match(/^[│|]?\s*✓\s+(.+?)\s*[│|]?$/);if(!item)continue;let value=item[1].trim().replaceAll("\\","/"),copied=value.match(/^(.+?) \(copied\)$/),matches=copied?listed.filter(skill=>skill.scope==="global"&&skill.name===copied[1]):[];if(copied&&matches.length!==1)throw new Error("无法从 Skills JSON 清单确认复制的 Skill 安装路径。");let installedPath=copied?matches[0].path:value,skillPath=resolve10(installedPath.startsWith("~/")?join24(homedir9(),installedPath.slice(2)):installedPath);if(dirname9(skillPath)!==join24(homedir9(),".agents","skills"))throw new Error(`无法识别全局 skill 安装路径: ${item[1]}。请使用 setup plugin [name] <path> 注册。`);paths.push(skillPath)}if(paths.length!==expected)throw new Error("Skills 安装结果格式无法识别,请使用 setup plugin [name] <path> 注册。");return[...new Set(paths)]}function permitsEmptyInstallResult(args,output2){return args.length===0||args.some(argument=>["--help","-h","--list"].includes(argument))||/\b(?:installation\s+)?cancel(?:led|ed)\b/i.test(output2)}async function installPlugins(args,runner=runCommand,options={}){if(args.includes("--"))throw new Error("plugin install 不支持 -- 参数分隔符,以确保全局安装选项生效。");let cli=await captureSkillsCli({env:options.env,runCommand:runner});if(!cli)throw new Error("未找到 skills 或 npx,请检查 Node.js 安装。");if(options.selection&&(cli.selection?.path!==options.selection.path||cli.selection.sha256!==options.selection.sha256))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");let declaration=options.expectedSkill?cli.managedSkills[options.expectedSkill]:void 0;if(options.expectedSkill&&(!declaration?.source||declaration.source!==args[0]))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let verifySkill=(registered=!1)=>{if(!options.expectedSkill||!declaration)return;let status=cli.inspectGlobal(declaration.source,options.expectedSkill,declaration.version);if(status.state!=="ready"&&(registered||status.state!=="registration"))throw new Error(`${status.reason}: ${options.expectedSkill}`)},assertSource=()=>{if(!options.expectedSkill||!declaration)return;let status=cli.inspectGlobal(declaration.source,options.expectedSkill,declaration.version,{migrateFrom:options.registrationManagedBy===OFFICIAL_PLUGIN_MANAGER?declaration.migrateFrom:void 0});if(status.state==="conflict")throw new Error(`${status.reason}: ${options.expectedSkill}`)};assertSource(),await options.confirm?.(),assertSource();let runInstall=()=>cli.run(["add",...args,"--global"],{tee:!0}),installed=await(options.expectedSkill?preserveSkillDisabled(join24(homedir9(),".agents","skills",options.expectedSkill),runInstall):runInstall());if(installed.code!==0)return installed.code;await options.confirm?.();let output2=`${installed.stdout??""}
|
|
1090
1090
|
${installed.stderr??""}`,listed=[];if(/✓[^\n]*\(copied\)/.test(stripAnsi(output2))){let result=await cli.run(["list","--global","--json"],{capture:!0});if(result.code!==0)throw new Error("无法读取 Skills JSON 清单;插件尚未注册。");listed=parseInstalledSkills(result.stdout)}let paths=parseInstalledPluginPaths(output2,listed);if(options.expectedSkill){if(paths.length!==1||paths[0]!==join24(homedir9(),".agents","skills",options.expectedSkill))throw new Error("PLUGIN_CATALOG_SKILL_RESULT_MISMATCH");verifySkill()}if(paths.length===0){if(permitsEmptyInstallResult(args,output2))return 0;throw new Error("Skills 安装成功但无法识别安装结果,请使用 setup plugin [name] <path> 注册。")}let plugins=new Map;for(let skillPath of paths){if(!statSync13(skillManifestPath(skillPath)??join24(skillPath,"SKILL.md")).isFile())throw new Error(`安装结果缺少 SKILL.md: ${skillPath}`);let entry=findPluginDirectoryEntry(skillPath);if(!entry)continue;let plugin=await loadPlugin(entry,registrationContext),name=plugin.name||basename4(skillPath);if(assertPluginName(name),options.expectedPluginName&&name!==options.expectedPluginName)throw new Error("PLUGIN_CATALOG_ALIAS_MISMATCH");if(plugins.has(name))throw new Error(`多个 skill 使用插件名称 ${name},请调整入口的 name metadata。`);plugins.set(name,{entry,setup:plugin.setup,hasPublicCommands:!!plugin.commandHelp(name),description:plugin.description,...plugin.toolbox?{toolbox:plugin.toolbox}:{},appProfiles:plugin.appProfiles,profileSources:plugin.profileSources})}if(plugins.size===0)return console.error("未找到 scripts/main.mjs 或 scripts/main.py 插件入口;自定义入口可用 setup plugin [name] <path> 注册。"),0;await ensurePluginRuntime(runner);for(let[name,{entry,description,toolbox,appProfiles,profileSources,hasPublicCommands,setup}]of plugins){await options.confirm?.(),verifySkill();let hasUserRegistration=()=>{let existing=findPluginRegistration(name);return options.registrationManagedBy&&existing&&existing.managedBy!==options.registrationManagedBy};if(hasUserRegistration()){console.error(`Plugin ${name}: existing user registration kept.`);continue}if(setup&&(await setup({runCommand:runner}),await options.confirm?.(),verifySkill(),hasUserRegistration())){console.error(`Plugin ${name}: existing user registration kept.`);continue}registerPlugin(name,entry,description,{hasPublicCommands,managedBy:options.registrationManagedBy??(cli.id==="skills"?void 0:cli.id),...toolbox?{toolbox}:{},appProfiles,profileSources}),console.error(`Plugin ${name} registered: ${entry}${hasPublicCommands?`
|
|
1091
1091
|
Run: mearl ${name} --help`:toolbox?`
|
|
1092
1092
|
Open in Mearl toolbox.`:""}`)}return verifySkill(!0),0}var registrationContext,init_plugin3=__esm({"../setup/dist/plugin.js"(){"use strict";init_plugin2();init_skillSources();init_presetInstallationLease();init_pluginRuntime();init_skills();init_dist();registrationContext={options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}}}});async function installManagedPlugins(options={},dependencies={}){let writeLine=options.writeLine??(line=>console.error(line));try{let catalog=(dependencies.readCatalog??readOfficialPluginCatalog)();if(!catalog||Object.keys(catalog.plugins).length===0)return"skipped";let registrationFor=dependencies.findPluginRegistration??findPluginRegistration,candidates=Object.entries(catalog.plugins).filter(([name])=>{let registration=registrationFor(name);return registration&®istration.managedBy!==OFFICIAL_PLUGIN_MANAGER?(writeLine(`${name} plugin: existing user registration kept.`),!1):!0});if(candidates.length===0)return"skipped";if(options.includeMearlSkill&&!await(dependencies.runSkillOperation??runGlobalMearlSkillOperation)(options.mearlSkillOperation??"install",{env:options.env,runCommand:options.runCommand,writeLine,yes:!0}))return"failed";for(let[name,definition]of candidates){let code=await(dependencies.installPlugins??installPlugins)([...definition.installArgs],options.runCommand??runCommand,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,env:options.env});if(code!==0)return writeLine(`${name} plugin: install failed (exit ${code}).`),"failed";if(registrationFor(name)?.managedBy!==OFFICIAL_PLUGIN_MANAGER)return writeLine(`${name} plugin: installation did not create its managed registration.`),"failed";writeLine(`${name} plugin: installed and registered.`)}return"installed"}catch(error){return writeLine(`Managed plugin batch: ${error instanceof Error?error.message:String(error)}; failed.`),"failed"}}async function uninstallManagedPlugins(options={},dependencies={}){let writeLine=options.writeLine??(line=>console.error(line));try{let catalog=(dependencies.readCatalog??readOfficialPluginCatalog)();if(!catalog)return"skipped";let registrationFor=dependencies.findPluginRegistration??findPluginRegistration;for(let name of Object.keys(catalog.plugins)){let registration=registrationFor(name);if(registration){if(registration.managedBy!==OFFICIAL_PLUGIN_MANAGER){writeLine(`${name} plugin: existing user registration kept.`);continue}if(await(dependencies.uninstallPlugin??uninstallPlugin)(name,options.runCommand??runCommand,{preserveRegistrationsOutsideManager:OFFICIAL_PLUGIN_MANAGER,env:options.env}),registrationFor(name))return writeLine(`${name} plugin: uninstall did not clear its registration.`),"failed";writeLine(`${name} plugin: uninstalled.`)}}return options.includeMearlSkill&&!await(dependencies.runSkillOperation??runGlobalMearlSkillOperation)("uninstall",{env:options.env,runCommand:options.runCommand,writeLine,yes:!0})?"failed":"uninstalled"}catch(error){return writeLine(`Managed plugin batch: ${error instanceof Error?error.message:String(error)}; failed.`),"failed"}}var init_managedPlugins=__esm({"../setup/dist/managedPlugins.js"(){"use strict";init_plugin2();init_plugin3();init_skills();init_dist()}});import{existsSync as existsSync11,readFileSync as readFileSync16,statSync as statSync14}from"node:fs";import{join as join25,resolve as resolve11}from"node:path";function inspectProviderPackage(manifest){if(validateInstalledProviderManifest(manifest))return!1;try{let file=join25(manifest.packageRoot,"package.json"),stat5=statSync14(file);if(!stat5.isFile()||stat5.size>1024*1024)return!1;let metadata=JSON.parse(readFileSync16(file,"utf8")),provider=metadata.mearl?.provider;return metadata.name===manifest.packageName&&metadata.version===manifest.version&&provider?.providerId===manifest.providerId&&provider.protocolVersion===manifest.protocolVersion&&typeof provider.entry=="string"&&resolve11(manifest.packageRoot,provider.entry)===manifest.entryPath}catch{return!1}}async function stopProviderBeforePackageChange(providerId){if(readProviderStart(providerId))throw new Error(`Provider ${providerId} is still starting`);let live=readLiveProvider(providerId);if(!live)return;let owner={pid:live.pid,processIdentity:processIdentity(live.pid)};stopProvider(providerId);let deadline=Date.now()+5e3;for(;isProcessOwnerAlive(owner);){if(Date.now()>=deadline)throw new Error(`Provider ${providerId} did not finish stopping`);await new Promise(resolve16=>setTimeout(resolve16,50))}if(readLiveProvider(providerId)||readProviderStart(providerId))throw new Error(`Provider ${providerId} restarted during shutdown`)}function parseProviderPackageSpec(value){let nameMatch=value.trim().match(/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@(.+))?$/i);if(!nameMatch||!nameMatch[1]||/\s/.test(nameMatch[2]??""))throw new Error(`Provider install requires an npm package name, received: ${value}`);return{packageName:nameMatch[1],target:nameMatch[2]||"latest"}}function providerManager(env,dependencies,resolvedManager){return resolvedManager??(dependencies.resolveInvokingManager??(childEnv=>resolveInvokingPackageManager({env:childEnv})))(env)}function outputPath(output2){return output2.split(/\r?\n/).map(line=>line.trim()).filter(Boolean).at(-1)??null}async function resolveGlobalProviderPackageRoot(installation,packageName,runner,env){let args,toNodeModules;switch(installation.manager){case"npm":case"pnpm":args=["root","-g"],toNodeModules=value=>value;break;case"yarn":args=["global","dir"],toNodeModules=value=>join25(value,"node_modules");break;case"bun":args=["pm","bin","-g"],toNodeModules=value=>resolve11(value,"..","install","global","node_modules");break;case"volta":throw new Error("Volta cannot manage a Provider package without a binary; use npm or pnpm")}let result=await runner(installation.command,args,{capture:!0,env:prependCommandPath(installation.command,env)}),root=outputPath(result.stdout);if(result.code!==0||!root)throw new Error(`${installation.manager} global package root lookup failed`);return join25(toNodeModules(root),...packageName.split("/"))}function findRegisteredProvider(selector,listProviders){let matches=listProviders().filter(provider=>provider.providerId===selector||provider.packageName===selector);if(matches.length===0)throw new Error(`Provider is not registered: ${selector}`);if(matches.length>1)throw new Error(`Provider selector is ambiguous: ${selector}`);return matches[0]}async function runPackageCommand(installation,operation,packageName,target,runner,env){let command=buildGlobalPackageCommand(installation,operation,[packageName],target),commandEnv=operation==="uninstall"?env:packageRegistryEnvironment(packageName,env),result=await runner(command.command,command.args,{env:prependCommandPath(command.command,commandEnv),tee:!0});if(result.code!==0)throw new Error(`${packageName} ${operation} failed (exit ${result.code})`)}async function installProviderPackage(packageSpec,dependencies={}){let{packageName,target}=parseProviderPackageSpec(packageSpec),env=process.env,runner=dependencies.runCommand??runCommand,installation=providerManager(env,dependencies),previous=(dependencies.listProviders??listInstalledProviders)().filter(provider=>provider.packageName===packageName);for(let provider of previous)await(dependencies.stopProvider??stopProviderBeforePackageChange)(provider.providerId);await runPackageCommand(installation,"install",packageName,target,runner,env);let packageRoot=await(dependencies.resolvePackageRoot??resolveGlobalProviderPackageRoot)(installation,packageName,runner,env);if(!(dependencies.existsSync??existsSync11)(join25(packageRoot,"package.json")))throw new Error(`${packageName} was installed but its package root was not found: ${packageRoot}`);return{manifest:(dependencies.registerPackage??registerProviderPackage)(packageRoot),manager:installation.manager}}async function updateProviderPackage(selector,dependencies={}){let listProviders=dependencies.listProviders??listInstalledProviders,current=findRegisteredProvider(selector,listProviders),env=process.env,runner=dependencies.runCommand??runCommand,detectedManager=(dependencies.resolvePackageManager??resolvePackageManagerInstallation)(current.packageRoot,current.packageName)??void 0,installation=providerManager(env,dependencies,detectedManager);return await(dependencies.stopProvider??stopProviderBeforePackageChange)(current.providerId),await runPackageCommand(installation,"update",current.packageName,"latest",runner,env),{manifest:(dependencies.registerPackage??registerProviderPackage)(current.packageRoot),manager:installation.manager}}async function uninstallProviderPackage(selector,dependencies={}){let listProviders=dependencies.listProviders??listInstalledProviders,manifest=findRegisteredProvider(selector,listProviders),env=process.env,installation=(dependencies.resolvePackageManager??resolvePackageManagerInstallation)(manifest.packageRoot,manifest.packageName)??providerManager(env,dependencies);return await(dependencies.stopProvider??stopProviderBeforePackageChange)(manifest.providerId),await runPackageCommand(installation,"uninstall",manifest.packageName,"latest",dependencies.runCommand??runCommand,env),(dependencies.unregisterProvider??uninstallProvider)(manifest.providerId),{manifest,manager:installation.manager}}var init_provider=__esm({"../setup/dist/provider.js"(){"use strict";init_host();init_packageManager();init_npmRegistry();init_dist()}});import{readdirSync as readdirSync9}from"node:fs";import{basename as basename5,join as join26,resolve as resolve12}from"node:path";import{homedir as homedir10}from"node:os";async function cleanupUninstalledRuntime(){await cleanupPluginRuntime();let root=join26(homedir10(),".mearl");if(resolve12(pluginDirectory())!==resolve12(join26(root,"plugins")))return;if(listRecordFiles(join26(root,"providers/installed")).length)throw new Error("Registered Providers still use runtime caches; caches were retained");for(let directory of["providers/live","providers/starting"])if(listRecordFiles(join26(root,directory)).some(file=>{let record4=readRecord(file);return record4&&isProcessOwnerAlive(record4)}))throw new Error("Providers still use runtime caches; caches were retained");pruneOrphanLogs(join26(root,"managed-browsers"),0),pruneOrphanLogs(join26(root,"providers/logs"),0);let entries;try{entries=readdirSync9(join26(root,"plugin-pages"),{withFileTypes:!0})}catch(error){if(error.code==="ENOENT")return;throw error}for(let entry of entries)if(!(!entry.isDirectory()||!/^[a-f0-9]{16}\.json\.d$/.test(entry.name)))for(let file of listRecordFiles(join26(root,"plugin-pages",entry.name))){if(!/^session-[a-f0-9]{16}\.json$/.test(basename5(file)))continue;let record4=readRecord(file);record4&&!isProcessOwnerAlive(record4)&&removeRecordIfPid(file,record4.pid)}}var init_runtimeCleanup=__esm({"../setup/dist/runtimeCleanup.js"(){"use strict";init_plugin2();init_dist()}});async function prepareSetupPreset(options,dependencies={}){let installer=dependencies.installer??new PresetInstaller({directory:(options.env??process.env).MEARL_CAPABILITY_DIR,connectedExtensionsOnly:!0});if(options.source)return installer.stage(options.source);let current=await installer.store.current();if(current.receipt)return{revision:current.receipt.revision,activate:()=>installer.resume(current.receipt.revision)};if(!current.activation&&options.fallbackSource)return installer.stage(options.fallbackSource)}var init_setupPreset=__esm({"../setup/dist/setupPreset.js"(){"use strict";init_preset2()}});async function prepareBrowserSetupPreset(options={},dependencies={}){let env=options.env??process.env,directory=env.MEARL_CAPABILITY_DIR,current=await new PresetInstaller({directory}).store.current();if(current.activation||current.receipt)return;let browsers=dependencies.browsers??listLiveBrowsers,invoke3=dependencies.invoke??invokeLocalHost,configuration=dependencies.configuration??(()=>{let url=resolveInstallationConfigUrl(env.MEARL_INSTALLATION_CONFIG_URL);return loadInstallationConfig(url,url.origin,AbortSignal.timeout(5e3))}),connected=()=>connectedPresetExtensions(browsers(),env.MEARL_SOCKET_PATH?.trim()),read=async()=>{let targets=connected();if(targets.length)return(await Promise.all(targets.map(async browser=>{let value;try{value=await invoke3("preset_browser_status",{},{socketPath:browser.socketPath,timeoutSec:5})}catch{if(!connected().some(target=>target.browserId===browser.browserId&&target.socketPath===browser.socketPath))return[];throw new Error(`Cannot read preset from ${browser.browserId}. Reconnect the extension and retry setup, or use --preset <source>.`)}if(value?.error==="EXTENSION_NOT_CONNECTED")return[];if(value?.error||typeof value?.browserReady!="boolean"||!Object.hasOwn(value,"browserRevision")||value.presetId!==void 0&&(typeof value.presetId!="string"||!value.presetId||typeof value.presetSource!="string"||typeof value.browserRevision!="string"||value.browserReady!==!0))throw new Error(`Browser preset is unavailable in ${browser.browserId}. Reconnect the extension and retry setup, or use --preset <source>.`);return value.presetId?[{browserId:browser.browserId,presetId:value.presetId,presetSource:value.presetSource,browserRevision:value.browserRevision}]:[]}))).flat()},accepted=await read();if(!accepted?.length)return;let first=accepted[0];if(accepted.some(value=>value.presetId!==first.presetId||value.presetSource!==first.presetSource))throw new Error("Connected browsers use different presets. Select one explicitly with --preset <source>.");let trusted=trustedInstallationPreset(await configuration(),first.presetId,first.presetSource);if(!trusted)throw new Error("The browser preset is not in the trusted installation catalog. Install it explicitly with --preset <source>.");let load=dependencies.load??createNodePresetLoader(),installer=new PresetInstaller({directory,connectedExtensionsOnly:!0,load:(source,resourceOptions)=>{let url=new URL(source);if(url.protocol!=="https:"||url.username||url.password||!trusted.origins.some(origin=>matchesInstallationOrigin(origin,url)))throw new Error("Browser preset resource is outside the trusted installation catalog");return load(source,resourceOptions)}});return options.writeLine?.(`Using the browser's trusted preset: ${first.presetId}`),installer.stage(first.presetSource,{expectedId:first.presetId,expectedRevision:null,signal:AbortSignal.timeout(12e4),validatePrepared:async prepared=>{if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,trusted.origins)))throw new Error("Browser preset permissions exceed the trusted installation catalog")},confirm:async()=>{if(JSON.stringify(trustedInstallationPreset(await configuration(),first.presetId,first.presetSource))!==JSON.stringify(trusted))throw new Error("Browser preset trust changed during setup");let latest=await read();if(!latest||latest.length!==accepted.length||accepted.some(value=>!latest.some(other=>value.browserId===other.browserId&&value.presetId===other.presetId&&value.presetSource===other.presetSource&&value.browserRevision===other.browserRevision)))throw new Error("The browser preset changed during setup. Retry or use --preset <source>.")}})}var init_browserPreset2=__esm({"../setup/dist/browserPreset.js"(){"use strict";init_local();init_installation();init_preset2()}});import fs9 from"node:fs";import path11 from"node:path";import{homedir as homedir11}from"node:os";import{createInterface as createInterface2}from"node:readline/promises";import{stdin as input,stdout as output}from"node:process";function autoUpdateClientInstallation(env){let root=env.MEARL_AUTO_UPDATE_CLIENT_ROOT;if(!root)return null;try{let packageRoot=fs9.realpathSync(root);return JSON.parse(fs9.readFileSync(path11.join(packageRoot,"package.json"),"utf8")).name!==UNIFIED_CLIENT?null:resolvePackageManagerInstallation(packageRoot,UNIFIED_CLIENT,{env})}catch{return null}}function autoUpdateProfiles(env){let value=env.MEARL_AUTO_UPDATE_PROFILES;if(value===void 0)return;let requested=value.split(",");if(requested.length===0||new Set(requested).size!==requested.length||requested.some(profile=>!PROFILE_ORDER.includes(profile)))throw new Error("Invalid automatic update profiles");return PROFILE_ORDER.filter(profile=>requested.includes(profile))}async function confirmInTerminal(message){if(!input.isTTY||!output.isTTY)return!1;let readline2=createInterface2({input,output});try{let answer=(await readline2.question(`${message} [y/N] `)).trim().toLowerCase();return answer==="y"||answer==="yes"}finally{readline2.close()}}function siblingExecutable(anchor,name,existsSync15){for(let executableName of executableNames(name)){let candidate=path11.join(path11.dirname(anchor),executableName);if(existsSync15(candidate))return candidate}return null}async function runLifecycleCommand(runner,command,args,env,label,writeLine,capture=!1){try{return await runner(command,args,{capture,env:prependCommandPath(command,env)})}catch(error){return writeLine(`${label}: ${error instanceof Error?error.message:String(error)}`),null}}async function runPackageOperation(installation,operation,packages,targetLine,runner,env,label,writeLine){let command=buildGlobalPackageCommand(installation,operation,packages,targetLine);writeLine(`${label}: ${command.manager}`);let result=await runLifecycleCommand(runner,command.command,command.args,operation==="uninstall"?env:packages.reduce((childEnv,name)=>packageRegistryEnvironment(name,childEnv),env),label,writeLine);return result?result.code!==0?(writeLine(`${label}: failed (exit ${result.code}).`),{command,ok:!1}):{command,ok:!0}:{command,ok:!1}}async function runHook(profile,operation,detected,runner,existsSync15,env,writeLine,yes,cloudMode){let executable,args,hookEnv=env;if(profile==="local"&&operation!=="uninstall")executable=detected.executable,args=["--init","--mode","skills"];else if(profile==="mcp"&&operation==="uninstall")executable=siblingExecutable(detected.executable,"mearl-mcp-uninstall",existsSync15),args=["--managed-by-setup",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="install")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync15),args=["--global-install",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="update")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync15),args=["--skip-mcp","--global-install"];else if(profile==="cloud"){if(executable=siblingExecutable(detected.executable,"mearl-cloud-server",existsSync15),!executable)return writeLine(`Hook: ${profile} ${operation} command was not found.`),!1;let requestedMode=operation==="uninstall"?"websocket":cloudMode,commandEnv=requestedMode?{...env,MEARL_CLOUD_MODE:requestedMode}:env;if(hookEnv=commandEnv,operation==="uninstall")args=["stop"];else{let status=await runLifecycleCommand(runner,executable,["status"],commandEnv,"Hook: cloud status",writeLine,!0);if(!status)return!1;if(status.code!==0)return writeLine(`Hook: cloud status failed (exit ${status.code}).`),!1;let running=/\[CloudServer\]\s+Status:\s+running\b/.test(status.stdout),pluginMode=!!(cloudMode&&cloudMode!=="websocket")||/\[CloudServer\]\s+Mode:\s+(?!websocket\b)\S+/.test(status.stdout);if(operation==="update"&&!running&&!pluginMode)return writeLine("Hook: cloud update skipped because cloud-server is not running."),!0;args=[running&&!pluginMode?"restart":"start"]}}else return!0;if(!executable)return writeLine(`Hook: ${profile} ${operation} command was not found.`),!1;let result=await runLifecycleCommand(runner,executable,args,hookEnv,`Hook: ${profile} ${operation}`,writeLine);return result?result.code!==0?(writeLine(`Hook: ${profile} ${operation} failed (exit ${result.code}).`),!1):!0:!1}function selectedProfiles(operation,requested,detected){if(requested?.length){let requestedSet=new Set(requested);return PROFILE_ORDER.filter(profile=>requestedSet.has(profile))}return operation==="install"?["local"]:PROFILE_ORDER.filter(profile=>detected.has(profile))}function operationVerb(operation){return operation==="uninstall"?"uninstall":operation==="update"?"update":"install"}async function runMearlLifecycle(options,dependencies={}){if(options.targetLine&&!isMearlReleaseLine(options.targetLine))throw new Error("targetLine must be a valid Mearl release line such as 2.3.x");let writeLine=dependencies.writeLine??(line=>console.error(line)),lease;try{lease=(dependencies.claimLifecycle??(()=>claimPresetInstallation(path11.join(homedir11(),".agents",".mearl-setup-lifecycle.json"))))();let readManagement=()=>(dependencies.readManagement??readInstallationManagement)({directory:(options.env??process.env).MEARL_CAPABILITY_DIR}),acceptedRevision=(await readManagement()).revision,selector=mearlPackageSelector(SETUP_VERSION,options.targetLine),assertManagement=async(expected=acceptedRevision)=>{let{setup,revision:revision3}=await readManagement();if(revision3!==expected)throw new Error("PRESET_SELECTION_CHANGED: The selected preset changed during setup.");if(setup&&options.operation!=="uninstall"&&!setupRuntimeCompatible(setup,SETUP_VERSION,options.targetLine))throw new Error(`SETUP_RUNTIME_CONFLICT: The selected preset requires ${setup.runtime}. Use ${setupManagementCommand(setup)} ${options.operation}.`);selector=setup?.runtime?options.targetLine??SETUP_VERSION:mearlPackageSelector(SETUP_VERSION,options.targetLine)};await assertManagement();let runner=dependencies.runCommand??runCommand;return await withOwnedCommands(lease.lifecycle,()=>executeLifecycle(options,{...dependencies,runCommand:async(...args)=>(await assertManagement(),runner(...args))},async revision3=>{await assertManagement(revision3),acceptedRevision=revision3},()=>selector))}catch(error){return writeLine(`Setup: ${error instanceof Error?error.message:String(error)}`),!1}finally{lease?.release()}}async function executeLifecycle(options,dependencies,acceptPreset,packageSelector){let env=options.env??process.env,writeLine=dependencies.writeLine??(line=>console.error(line)),existsSync15=dependencies.existsSync??fs9.existsSync,runner=dependencies.runCommand??runCommand,cleanupNativeHost=dependencies.cleanupNativeHost??uninstallNativeHostArtifacts,detectPackage=dependencies.detectPackage??detectGlobalPackage,detectProfiles=dependencies.detectProfiles??((childEnv,detectionOptions)=>detectMearlProfiles({env:childEnv,...detectionOptions})),resolveInvokingManager=dependencies.resolveInvokingManager??(childEnv=>resolveInvokingPackageManager({env:childEnv})),runSkill=dependencies.runSkillOperation??runGlobalMearlSkillOperation,confirm=dependencies.confirm??confirmInTerminal,detectionEnv=options.operation==="update"&&env.MEARL_AUTO_UPDATE_SEARCH_PATH!==void 0?{...env,PATH:env.MEARL_AUTO_UPDATE_SEARCH_PATH}:env,detected=options.operation==="uninstall"?detectProfiles(detectionEnv,{includeLinked:!0}):detectProfiles(detectionEnv),packageDetectionOptions={env,...options.operation==="uninstall"?{includeLinked:!0}:{}},requestedProfiles=options.profiles??(options.profile?[options.profile]:void 0)??(options.operation==="update"?autoUpdateProfiles(env):void 0),autoUpdateClient=options.operation==="update"?autoUpdateClientInstallation(env):null,clientOnly=options.operation==="update"&&env.MEARL_AUTO_UPDATE_CLIENT_ONLY==="1";if(clientOnly&&!autoUpdateClient)return writeLine("A valid global client installation is required for a client-only update."),!1;let selected=clientOnly?[]:selectedProfiles(options.operation,requestedProfiles,detected),lifecycleSelected=options.operation==="uninstall"?selected.filter(profile=>detected.has(profile)):selected,fullPluginNames=[],fullProviders=[];if(options.operation==="uninstall"&&options.full){try{fullPluginNames=(dependencies.listPlugins??listPluginNames)()}catch(error){return writeLine(`CLI plugins: unable to list registrations: ${error instanceof Error?error.message:String(error)}`),!1}try{fullProviders=(dependencies.listProviders??listInstalledProviders)()}catch(error){return writeLine(`Providers: unable to list registrations: ${error instanceof Error?error.message:String(error)}`),!1}}if(selected.length===0&&!autoUpdateClient&&!(options.operation==="uninstall"&&options.full))return writeLine("No installed Mearl environment was detected on the current PATH."),options.operation==="uninstall"?!0:(writeLine("Run: npx @mearl/setup"),!1);if(options.operation==="update"){let missing=selected.filter(profile=>!detected.has(profile));if(missing.length>0)return writeLine(`Not installed: ${missing.join(", ")}. Run the install command first.`),!1}if(options.operation==="uninstall"){if(lifecycleSelected.length===0&&!options.full)return writeLine(`Nothing to uninstall for ${selected.join(", ")}.`),!0;if(options.full&&(writeLine(`CLI plugins: ${fullPluginNames.length>0?fullPluginNames.join(", "):"none detected"}.`),writeLine(`Providers: ${fullProviders.length>0?fullProviders.map(provider=>provider.providerId).join(", "):"none detected"}.`)),!options.yes&&!await confirm(options.full?`Uninstall ${lifecycleSelected.length>0?`Mearl environments (${lifecycleSelected.join(", ")}) and `:""}all CLI plugins and Providers?`:`Uninstall Mearl environments: ${lifecycleSelected.join(", ")}?`))return writeLine("Uninstall cancelled."),!1}lifecycleSelected.length>0&&writeLine(`${operationVerb(options.operation)} targets: ${lifecycleSelected.map(profile=>MEARL_PROFILES[profile].label).join(", ")}`),autoUpdateClient&&lifecycleSelected.length===0&&writeLine("update targets: client CLI");let selectedUsesClient=autoUpdateClient!==null||lifecycleSelected.some(profile=>CLIENT_PROFILES.includes(profile)),detectedClientCandidate=selectedUsesClient&&!autoUpdateClient?detectPackage(UNIFIED_CLIENT,["mearl"],packageDetectionOptions):null,detectedClient=detectedClientCandidate?.packageName===UNIFIED_CLIENT?detectedClientCandidate:null,preparesPreset=options.operation!=="uninstall"&&!dependencies.prepareSkills&&(!options.targetLine||Number(options.targetLine.split(".")[0])>=3),selectsInitialPreset=preparesPreset&&!options.skipSkill&&!env.MEARL_AUTO_UPDATE_CLIENT_ROOT&&!env.MEARL_AUTO_UPDATE_PROFILES,stagedPreset;if(preparesPreset||options.operation!=="uninstall"&&options.presetSource&&!dependencies.prepareSkills)try{stagedPreset=await(dependencies.preparePreset??prepareSetupPreset)({source:options.presetSource,env}),stagedPreset&&await acceptPreset(stagedPreset.revision)}catch(error){return writeLine(`Preset preparation: ${error instanceof Error?error.message:String(error)}`),!1}let packagesOk=!0;if(lifecycleSelected.includes("cloud")){let legacyCloudClient=detectPackage(LEGACY_CLOUD_CLIENT,["mearl-cloud"],packageDetectionOptions);if(legacyCloudClient?.packageName===LEGACY_CLOUD_CLIENT){let command=buildGlobalPackageCommand(legacyCloudClient,"uninstall",[LEGACY_CLOUD_CLIENT]);writeLine(`Migration (cloud): removing ${LEGACY_CLOUD_CLIENT}.`);let result=await runLifecycleCommand(runner,command.command,command.args,env,"Migration (cloud)",writeLine);if(!result||result.code!==0)return result&&writeLine(`Migration (cloud): failed (exit ${result.code}).`),writeLine("Mearl setup incomplete. Review the messages above."),!1}}let remainingClientProfiles=selectedUsesClient&&options.operation==="uninstall"?CLIENT_PROFILES.filter(profile=>detected.has(profile)&&!lifecycleSelected.includes(profile)):[];if(selectedUsesClient&&options.operation!=="uninstall"){let clientInstallation=autoUpdateClient??detectedClient??detected.get("local")??detected.get("cloud")??resolveInvokingManager(env);if(!(await runPackageOperation(clientInstallation,options.operation,[UNIFIED_CLIENT],packageSelector(),runner,env,"Packages (shared client)",writeLine)).ok)return writeLine("Mearl setup incomplete. Review the messages above."),!1}for(let profile of lifecycleSelected){let config=MEARL_PROFILES[profile],current=detected.get(profile);if(options.operation==="uninstall"&&!current)continue;let installation=current??resolveInvokingManager(env);if(options.operation==="uninstall"&&profile==="local"){let keepsMcp=detected.has("mcp")&&!selected.includes("mcp"),cleanupOk=!1;try{cleanupOk=cleanupNativeHost({mode:keepsMcp?"skills":"both",silent:!0})}catch(error){writeLine(`Native host: ${error instanceof Error?error.message:String(error)}`)}if(writeLine(`Native host: ${cleanupOk?"cleaned.":"cleanup failed."}`),!cleanupOk){packagesOk=!1;continue}}if(options.operation==="uninstall"&&!await runHook(profile,options.operation,current,runner,existsSync15,env,writeLine,options.yes===!0,options.cloudMode)){packagesOk=!1;continue}let packageOperation=options.operation,packages=config.packages.filter(packageName=>packageName!==UNIFIED_CLIENT);if(packages.length===0)continue;let packageResult=await runPackageOperation(installation,packageOperation,packages,packageSelector(),runner,env,`Packages (${profile})`,writeLine);if(!packageResult.ok){packagesOk=!1;continue}if(options.operation!=="uninstall"&&(profile==="local"||profile==="cloud"||profile==="mcp")){let refreshed=detectPackage(config.anchorPackage,config.anchorBins,{env:prependCommandPath(packageResult.command.command,env)})??current;(!refreshed||!await runHook(profile,options.operation,refreshed,runner,existsSync15,env,writeLine,options.yes===!0,options.cloudMode))&&(packagesOk=!1)}}selectedUsesClient&&options.operation==="uninstall"&&(remainingClientProfiles.length>0?writeLine(`Packages (shared client): kept for ${remainingClientProfiles.join(", ")}.`):packagesOk&&detectedClient&&((await runPackageOperation(detectedClient,"uninstall",[UNIFIED_CLIENT],void 0,runner,env,"Packages (shared client)",writeLine)).ok||(packagesOk=!1)));let fullOk=!0;if(options.operation==="uninstall"&&options.full){let pendingPlugins=new Set(fullPluginNames),removePlugin=dependencies.uninstallPlugin??uninstallPlugin;for(;pendingPlugins.size>0;){let name=pendingPlugins.values().next().value;pendingPlugins.delete(name);try{let result=await removePlugin(name,runner);for(let removedName of result.unregisteredNames)pendingPlugins.delete(removedName);result.removed&&writeLine(`CLI plugin ${name}: uninstalled.`)}catch(error){fullOk=!1,writeLine(`CLI plugin ${name}: ${error instanceof Error?error.message:String(error)}`)}}let removeProvider=dependencies.uninstallProvider??uninstallProviderPackage;for(let provider of fullProviders)try{await removeProvider(provider.providerId),writeLine(`Provider ${provider.providerId}: uninstalled.`)}catch(error){fullOk=!1,writeLine(`Provider ${provider.providerId}: ${error instanceof Error?error.message:String(error)}`)}}if(packagesOk&&selectsInitialPreset&&!stagedPreset&&!options.presetSource&&lifecycleSelected.some(profile=>profile==="local"||profile==="mcp"))try{stagedPreset=await(dependencies.prepareBrowserPreset??prepareBrowserSetupPreset)({env,writeLine}),stagedPreset&&await acceptPreset(stagedPreset.revision)}catch(error){writeLine(`Browser preset: ${error instanceof Error?error.message:String(error)}`),packagesOk=!1}if(packagesOk&&selectsInitialPreset&&!stagedPreset&&options.defaultPresetSource)try{stagedPreset=await(dependencies.preparePreset??prepareSetupPreset)({fallbackSource:options.defaultPresetSource,env}),stagedPreset&&await acceptPreset(stagedPreset.revision)}catch(error){writeLine(`Default preset: ${error instanceof Error?error.message:String(error)}`),packagesOk=!1}if(packagesOk&&options.operation!=="uninstall"&&(stagedPreset||dependencies.prepareSkills))try{if(stagedPreset){let status=await stagedPreset.activate();dependencies.onPresetStatus?.(status)}else await dependencies.prepareSkills()}catch(error){writeLine(`Skill preparation: ${error instanceof Error?error.message:String(error)}`),packagesOk=!1}let selectedUsesSkill=lifecycleSelected.some(profile=>MEARL_PROFILES[profile].usesSkill),remainingSkillProfiles=["local","cloud"].filter(profile=>detected.has(profile)&&!lifecycleSelected.includes(profile)),runStandaloneSkill=!0,skillOk=!0;if(packagesOk&&selectedUsesSkill&&selectedUsesClient&&options.skipSkill!==!0&&(options.operation==="uninstall"&&remainingSkillProfiles.length===0||options.operation!=="uninstall"&&options.targetLine===void 0))try{if(options.operation==="uninstall"){let result=await(dependencies.uninstallManagedPlugins??uninstallManagedPlugins)({env,includeMearlSkill:!0,runCommand:runner,writeLine});result==="uninstalled"?runStandaloneSkill=!1:result==="failed"&&(runStandaloneSkill=!1,skillOk=!1)}else{let result=await(dependencies.installManagedPlugins??installManagedPlugins)({env,includeMearlSkill:!0,mearlSkillOperation:options.operation,runCommand:runner,writeLine});result==="installed"?runStandaloneSkill=!1:result==="failed"&&(runStandaloneSkill=!1,skillOk=!1)}}catch(error){writeLine(`Managed plugin batch: ${error instanceof Error?error.message:String(error)}; failed.`),runStandaloneSkill=!1,skillOk=!1}if(packagesOk&&skillOk&&selectedUsesSkill&&options.skipSkill!==!0)try{options.operation==="uninstall"?remainingSkillProfiles.length>0?(writeLine(`Skill: kept for ${remainingSkillProfiles.join(", ")}.`),writeLine(`Managed plugins: kept for ${remainingSkillProfiles.join(", ")}.`)):runStandaloneSkill&&(skillOk=await runSkill("uninstall",{env,yes:options.yes,writeLine,runCommand:runner})):runStandaloneSkill&&(skillOk=await runSkill(options.operation,{env,yes:options.yes,writeLine,runCommand:runner}))}catch(error){writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),skillOk=!1}if(packagesOk&&skillOk&&fullOk){if(options.operation==="uninstall"&&options.full&&PROFILE_ORDER.every(profile=>!detected.has(profile)||lifecycleSelected.includes(profile)))try{await(dependencies.cleanupRuntime??cleanupUninstalledRuntime)(),writeLine("Runtime caches: cleaned; user data and browser profiles were retained.")}catch(error){return writeLine(`Runtime caches: ${error instanceof Error?error.message:String(error)}`),!1}return writeLine("Mearl setup complete."),!0}return writeLine("Mearl setup incomplete. Review the messages above."),!1}var LEGACY_CLOUD_CLIENT,UNIFIED_CLIENT,PROFILE_ORDER,CLIENT_PROFILES,init_lifecycle=__esm({"../setup/dist/lifecycle.js"(){"use strict";init_setupVersion();init_plugin2();init_host();init_skills();init_packageManager();init_profiles();init_nativeHost2();init_dist();init_preset_installation();init_presetInstallationLease();init_version();init_managedPlugins();init_plugin3();init_provider();init_npmRegistry();init_runtimeCleanup();init_setupPreset();init_browserPreset2();LEGACY_CLOUD_CLIENT="@mearl/cloud-client",UNIFIED_CLIENT="@mearl/client",PROFILE_ORDER=["local","cloud","mcp"],CLIENT_PROFILES=["local","cloud"]}});var dist_exports4={};__export(dist_exports4,{BrowserExtensionConflictError:()=>BrowserExtensionConflictError,MEARL_EXTENSION_DIRECTORY_NAME:()=>MEARL_EXTENSION_DIRECTORY_NAME,MEARL_EXTENSION_DOWNLOAD_PAGE:()=>MEARL_EXTENSION_DOWNLOAD_PAGE,MEARL_EXTENSION_ID:()=>MEARL_EXTENSION_ID,MEARL_EXTENSION_REMOTE_CONFIG_URL:()=>MEARL_EXTENSION_REMOTE_CONFIG_URL,MEARL_NATIVE_HOST_NAMES:()=>MEARL_NATIVE_HOST_NAMES,MEARL_PROFILES:()=>MEARL_PROFILES,PresetInstallationStore:()=>PresetInstallationStore,PresetInstaller:()=>PresetInstaller,buildGlobalPackageCommand:()=>buildGlobalPackageCommand,compareMearlReleaseLines:()=>compareMearlReleaseLines,compareMearlReleaseVersions:()=>compareMearlReleaseVersions,createNodePresetLoader:()=>createNodePresetLoader,detectGlobalPackage:()=>detectGlobalPackage,detectMearlProfiles:()=>detectMearlProfiles,extensionArchiveUrl:()=>extensionArchiveUrl,fetchBrowserExtensionRelease:()=>fetchBrowserExtensionRelease,findLatestExtensionVersion:()=>findLatestExtensionVersion,inspectMearlExtensionViaCdp:()=>inspectMearlExtensionViaCdp,inspectProviderPackage:()=>inspectProviderPackage,installMearlBrowserExtension:()=>installMearlBrowserExtension,installProviderPackage:()=>installProviderPackage,isMearlReleaseLine:()=>isMearlReleaseLine,isMearlReleaseVersion:()=>isMearlReleaseVersion,isMearlReleaseVersionInLine:()=>isMearlReleaseVersionInLine,loadUnpackedViaCdp:()=>loadUnpackedViaCdp,mearlReleaseLineForVersion:()=>mearlReleaseLineForVersion,parseMearlReleaseLine:()=>parseMearlReleaseLine,parseMearlReleaseVersion:()=>parseMearlReleaseVersion,parseProviderPackageSpec:()=>parseProviderPackageSpec,resolveChromeUserDataDirectory:()=>resolveChromeUserDataDirectory,resolveInvokingPackageManager:()=>resolveInvokingPackageManager,resolveMearlExtensionDirectory:()=>resolveMearlExtensionDirectory,resolveNativeHostDirectory:()=>resolveNativeHostDirectory,resolvePackageManagerInstallation:()=>resolvePackageManagerInstallation,runMearlLifecycle:()=>runMearlLifecycle,runPresetCommand:()=>runPresetCommand,uninstallNativeHostArtifacts:()=>uninstallNativeHostArtifacts,uninstallProviderPackage:()=>uninstallProviderPackage,updateProviderPackage:()=>updateProviderPackage,updateSetupManagedBrowserExtensionFiles:()=>updateSetupManagedBrowserExtensionFiles});var init_dist7=__esm({"../setup/dist/index.js"(){"use strict";init_packageManager();init_browserExtension();init_lifecycle();init_profiles();init_nativeHost2();init_preset2();init_version();init_provider()}});function browserConnectionIdentity(browser){return JSON.stringify([browser.pid,browser.startedAt,browser.socketPath])}function initBrowserRegistry(deps){logFn=deps.log}function recordFileFor(browserId){return keyedConfigFile(BROWSERS_SUBDIR2,browserId)}function persist(patch){if(!identity)return!1;let file=recordFileFor(identity.browserId),previous=readRecord(file);if(previous&&previous.pid!==process.pid&&isAlive(previous.pid))return!1;let record4={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{return previous?.pid===process.pid?writeRecordIfPid(file,process.pid,record4):previous&&!removeRecordIfPid(file,previous.pid)?!1:claimRecord(file,record4)}catch(error){return logFn("browser-registry: failed to write record:",String(error)),!1}}async function retireUnreachableBrowserRecord(browserId,canConnect){let file=recordFileFor(browserId),existing=readRecord(file);return!existing||existing.pid===process.pid||!isAlive(existing.pid)||await canConnect(existing.socketPath)?!1:removeRecordIfPid(file,existing.pid)}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor(info.browserId)),registered=persist({lastFocusedAt:info.preserveFocus===!1?info.lastFocusedAt??0:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion});return logFn(`browser-registry: ${registered?"registered":"registration skipped"} ${info.browserName} (${info.browserId})`),registered}function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file=recordFileFor(identity.browserId);removeRecordIfPid(file,process.pid)}function pruneDeadBrowsers(){let now=Date.now();for(let file of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let rec=readRecord(file);if(!rec){removeInvalidRecord(file);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecordIfPid(file,rec.pid)}}function listRegisteredBrowsers(){let records=[];for(let file of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let record4=readRecord(file);record4&&isAlive(record4.pid)&&records.push(record4)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}var BROWSERS_SUBDIR2,STALE_RECORD_TTL_MS,FOCUS_WRITE_THROTTLE_MS,identity,logFn,lastFocusWriteAt,focusFlushTimer,init_browser_registry=__esm({"src/browser-registry.ts"(){"use strict";init_dist();BROWSERS_SUBDIR2="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3;identity=null,logFn=()=>{};lastFocusWriteAt=0,focusFlushTimer=null}});import{StringDecoder as StringDecoder3}from"node:string_decoder";var Utf8LineBuffer,init_socketLines=__esm({"src/socketLines.ts"(){"use strict";Utf8LineBuffer=class{constructor(maxBufferBytes){this.maxBufferBytes=maxBufferBytes}maxBufferBytes;buffer="";decoder=new StringDecoder3("utf8");push(chunk){if(this.buffer+=this.decoder.write(chunk),Buffer.byteLength(this.buffer,"utf8")>this.maxBufferBytes)return this.buffer="",{lines:[],overflow:!0};let lines=[],newlineIndex;for(;(newlineIndex=this.buffer.indexOf(`
|
|
1093
1093
|
`))!==-1;)lines.push(this.buffer.slice(0,newlineIndex)),this.buffer=this.buffer.slice(newlineIndex+1);return{lines,overflow:!1}}}}});var browser_socket_request_exports={};__export(browser_socket_request_exports,{requestBrowserSocket:()=>requestBrowserSocket});import net4 from"node:net";function requestBrowserSocket(socketPath,action,data,version2,timeoutMs=6e4,browserId,host,routing){let deadline=routing?.deadline??Date.now()+timeoutMs,remaining=deadline-Date.now();if(!Number.isSafeInteger(deadline)||remaining<1)return Promise.reject(new Error("Browser request deadline exceeded"));let id3=`browser_rpc_${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve16,reject)=>{let client=net4.createConnection(socketPath),lines=new Utf8LineBuffer(MAX_RESPONSE_BUFFER_SIZE),settled=!1,finish=(error,result)=>{settled||(settled=!0,clearTimeout(timer),client.removeAllListeners(),client.destroy(),error?reject(error):resolve16(result))},timer=setTimeout(()=>finish(new Error(`Browser request timeout after ${timeoutMs}ms`)),Math.min(timeoutMs,remaining));client.on("connect",()=>{if(Date.now()>=deadline)return finish(new Error("Browser request deadline exceeded"));client.write(`${JSON.stringify({id:id3,action,data,version:version2,protocolVersion:3,deadline,controlSource:routing?.controlSource??"local",...routing?.providerTarget?{providerTarget:routing.providerTarget}:{},...routing?.providerControlToken?{providerControlToken:routing.providerControlToken}:{},...routing?.providerSourceIdentity?{providerSourceIdentity:routing.providerSourceIdentity}:{},...routing?.providerPageId!==void 0?{providerPageId:routing.providerPageId}:{},...browserId?{browserId}:{},...host?{host}:{}})}
|
|
1094
|
-
`)}),client.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id3){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client.on("error",error=>finish(error)),client.on("end",()=>finish(new Error("Browser connection closed before responding"))),client.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();init_dist3();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var version_exports={};__export(version_exports,{NATIVE_HOST_VERSION:()=>NATIVE_HOST_VERSION});var NATIVE_HOST_VERSION,init_version2=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="3.0.0"}});function providerRequestTimeoutMs(action,data,deadline){if(deadline!==void 0){if(!Number.isSafeInteger(deadline)||deadline<=0)throw new Error("Invalid Provider request deadline");let remaining=deadline-Date.now();if(remaining<=0)throw new Error("Provider request deadline exceeded");if(remaining>2147483647)throw new Error("Provider request deadline exceeds the supported range");return remaining}return resolveActionTimeoutSec(action,data,120)*1e3}var init_provider_request_timeout=__esm({"src/provider-request-timeout.ts"(){"use strict";init_actionTimeouts()}});var browser_provider_exports={};__export(browser_provider_exports,{accessProviderBrowser:()=>accessProviderBrowser,closeProviderBrowser:()=>closeProviderBrowser,configureProvider:()=>configureProvider,detachProviderBrowser:()=>detachProviderBrowser,findProviderBrowser:()=>findProviderBrowser,getProviderLaunchForm:()=>getProviderLaunchForm,launchProviderBrowser:()=>launchProviderBrowser,listExternalBrowserProviders:()=>listExternalBrowserProviders,listProviderControlSessions:()=>listProviderControlSessions,startProviderBrowser:()=>startProviderBrowser,syncProviderBrowserCookies:()=>syncProviderBrowserCookies,updateProviderControlSession:()=>updateProviderControlSession});function listExternalBrowserProviders(){return listInstalledProviders().map(provider=>({provider:{id:provider.providerId,name:provider.name,builtin:!1,version:provider.version,protocolVersion:provider.protocolVersion},browserType:provider.browserType}))}async function getProviderLaunchForm(providerId,request){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.dynamicLaunchForm)throw new Error(`Provider does not support dynamic launch forms: ${providerId}`);let live=await requireLiveProvider(providerId),form=await requestBrowserSocket(live.socketPath,"browser_providers",{...request,operation:"launch_form"},NATIVE_HOST_VERSION,12e4);return validateProviderLaunchForm(form),form}async function requireLiveProvider(providerId){let warning=(await ensureInstalledProvidersRunning([providerId])).find(item=>item.startsWith(`provider ${providerId}:`));if(warning)throw new Error(warning);let live=readLiveProvider(providerId);if(!live)throw new Error(`Provider did not start: ${providerId}`);return assertProviderProtocolVersion(live.providerProtocolVersion,providerId),{socketPath:live.socketPath}}async function launchProviderBrowser(input2){let providerId=input2.provider.trim();if(!listInstalledProviders().find(item=>item.providerId===providerId))throw new Error(`Provider is not registered: ${providerId}`);let live=await requireLiveProvider(providerId),result=await(input2.host?requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions),void 0,input2.host):requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions)));return validateProviderBrowser(result),{...result,browserId:providerBrowserKey(providerId,result.browserId)}}function findProviderBrowser(selector){let normalized=selector.toLowerCase(),exact=listRegisteredBrowsers().filter(browser=>browser.transport==="provider").filter(browser=>browser.browserId.toLowerCase()===normalized||browser.providerBrowserId?.toLowerCase()===normalized||browser.browserName.toLowerCase()===normalized);if(exact.length>1)throw new Error(`Provider browser selector is ambiguous: ${selector}`);return exact[0]&&assertProviderProtocolVersion(exact[0].provider?.protocolVersion,exact[0].provider?.id??"Provider"),exact[0]??null}function requireProviderBrowser(browser){if(browser.transport!=="provider"||!browser.providerBrowserId)throw new Error(`Browser is not managed by an external Provider: ${browser.browserId}`);return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser.providerBrowserId}function requestControlledProvider(browser,action,data,host){return requireProviderBrowser(browser),ensureProviderControlHost().then(controlHost=>(assertProviderControlSessionMode(controlHost,browser.capabilities?.controlSessionMode),requestBrowserSocket(controlHost.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data),void 0,host,{providerTarget:browser.browserId})))}async function listProviderControlSessions(){let host=readProviderControlHost();return host?(await requestBrowserSocket(host.socketPath,"browser_sessions",{operation:"list"},NATIVE_HOST_VERSION)).sessions??[]:[]}async function updateProviderControlSession(sessionId,operation){let host=readProviderControlHost();if(!host)throw new Error("CONTROL_SESSION_NOT_FOUND");return(await requestBrowserSocket(host.socketPath,"browser_sessions",{sessionId,operation},NATIVE_HOST_VERSION)).session}function closeProviderBrowser(browser,options={}){return requestControlledProvider(browser,"browser_close",{deleteProfile:options.deleteProfile===!0})}function detachProviderBrowser(browser){return requestControlledProvider(browser,"browser_instances",{operation:"detach"})}async function accessProviderBrowser(browser){return(await requestBrowserSocket(browser.socketPath,"get_browser_access_url",{},NATIVE_HOST_VERSION,6e4,requireProviderBrowser(browser))).browserAccess}async function startProviderBrowser(browser){let result=await requestControlledProvider(browser,"browser_instances",{operation:"start"});return validateProviderBrowser(result),{...result,browserId:browser.browserId}}function syncProviderBrowserCookies(browser,scope,host){return requestControlledProvider(browser,"browser_instances",{operation:"sync_cookies",scope},host)}async function configureProvider(providerId,options){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.configuration)throw new Error(`Provider does not support configuration: ${providerId}`);let live=await requireLiveProvider(providerId);return requestBrowserSocket(live.socketPath,"browser_providers",{operation:"configure",options},NATIVE_HOST_VERSION)}var init_browser_provider=__esm({"src/browser-provider.ts"(){"use strict";init_dist3();init_host();init_runtime();init_browser_registry();init_browser_socket_request();init_version2();init_provider_request_timeout()}});async function initialize(){if(registry)return registry;initializing??=(async()=>{let[core,qr,providerHost,providerRuntime,provider,setup,daemon,browsers,transport,version2]=await Promise.all([Promise.resolve().then(()=>(init_node_capabilities2(),node_capabilities_exports)),Promise.resolve().then(()=>(init_dist5(),dist_exports3)),Promise.resolve().then(()=>(init_host(),host_exports)),Promise.resolve().then(()=>(init_runtime(),runtime_exports)),Promise.resolve().then(()=>(init_dist3(),dist_exports2)),Promise.resolve().then(()=>(init_dist7(),dist_exports4)),Promise.resolve().then(()=>(init_dist(),dist_exports)),Promise.resolve().then(()=>(init_browser_provider(),browser_provider_exports)),Promise.resolve().then(()=>(init_browser_socket_request(),browser_socket_request_exports)),Promise.resolve().then(()=>(init_version2(),version_exports))]);return registry=new core.NodeCapabilityRegistry({version:version2.NATIVE_HOST_VERSION,env:Object.freeze({...process.env}),fetch:globalThis.fetch,providers:Object.freeze({listInstalled:providerHost.listInstalledProviders,readLive:providerRuntime.readLiveProvider,assertProtocol:provider.assertProviderProtocolVersion,install:setup.installProviderPackage,launch:browsers.launchProviderBrowser,find:browsers.findProviderBrowser,close:browsers.closeProviderBrowser,request:transport.requestBrowserSocket}),renderQr:value=>qr.renderSVG(value,{pixelSize:1,border:2}),runCommand:daemon.runCommand},capabilityDirectory())})();try{return await initializing}catch(error){throw initializing=void 0,error}}var registry,initializing,nativeCapabilities,init_native_capability_services=__esm({"src/native-capability-services.ts"(){"use strict";init_page_runtime_store();nativeCapabilities={get(name){return registry?.get(name)},entries(prefix){return registry?.entries(prefix)??[]},require(name){let handler=registry?.get(name);if(!handler)throw new Error(`Required capability is not installed: ${name}. Enable the preset that provides it.`);return handler},requireCustom(name){if(!registry)throw new Error(`Required capability is not installed: ${name}`);return registry.require(name)},async refresh(){return(await initialize()).refresh()},status(){return{revision:registry?.revision??null,installationRevision:registry?.installationRevision??null}},async synchronize(){try{return await nativeCapabilities.refresh(),{...nativeCapabilities.status(),accepted:!0}}catch(error){return{...nativeCapabilities.status(),accepted:!1,error:error instanceof Error?error.message:String(error)}}}}}});function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],protocol:[],kvGet:[],kvSet:[],kvDelete:[],pageContext:[],responses:{},behaviors:{},noop:[],silent:[]}}function mergeActions(...maps){let out=emptyActions();for(let m of maps)out.open.push(...m.open),out.close.push(...m.close),out.title.push(...m.title),out.navigationBar.push(...m.navigationBar??[]),out.statusBar.push(...m.statusBar??[]),out.systemInfo.push(...m.systemInfo),out.protocol.push(...m.protocol),out.kvGet.push(...m.kvGet??[]),out.kvSet.push(...m.kvSet??[]),out.kvDelete.push(...m.kvDelete??[]),out.pageContext.push(...m.pageContext??[]),Object.assign(out.responses,m.responses??{}),Object.assign(out.behaviors,m.behaviors??{}),out.noop.push(...m.noop),out.silent.push(...m.silent??[]);return out}function isJsonValue2(value,seen=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||seen.has(value))return!1;seen.add(value);let valid7=Array.isArray(value)?value.every(item=>isJsonValue2(item,seen)):Object.values(value).every(item=>isJsonValue2(item,seen));return seen.delete(value),valid7}function validateAppBridgeConfig(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("bridgeConfig must be an object");let root=value;if(Object.keys(root).some(key=>key!=="methods"))throw new Error('bridgeConfig only supports the "methods" field');if(!root.methods||typeof root.methods!="object"||Array.isArray(root.methods))throw new Error("bridgeConfig.methods must be an object");let entries=Object.entries(root.methods);if(entries.length>200)throw new Error("bridgeConfig supports at most 200 methods");let methods={};for(let[method,rawConfig]of entries){if(!method.trim()||method.length>200)throw new Error("bridgeConfig method names must contain 1-200 characters");if(method==="__proto__"||method==="prototype"||method==="constructor")throw new Error(`bridgeConfig method name "${method}" is reserved`);if(!rawConfig||typeof rawConfig!="object"||Array.isArray(rawConfig))throw new Error(`bridgeConfig.methods.${method} must be an object`);let methodConfig=rawConfig,supportedKeys=new Set(["behavior","response","noop","silent"]);if(Object.keys(methodConfig).some(key=>!supportedKeys.has(key)))throw new Error(`bridgeConfig.methods.${method} contains an unsupported field`);if("behavior"in methodConfig&&typeof methodConfig.behavior!="string")throw new Error(`bridgeConfig.methods.${method}.behavior must be a string`);let hasBehavior=typeof methodConfig.behavior=="string",hasResponse=Object.prototype.hasOwnProperty.call(methodConfig,"response"),hasNoop=methodConfig.noop===!0;if(Number(hasBehavior)+Number(hasResponse)+Number(hasNoop)!==1)throw new Error(`bridgeConfig.methods.${method} must define exactly one of behavior, response, or noop=true`);if(hasBehavior&&!isAppBridgeBehavior(methodConfig.behavior))throw new Error(`bridgeConfig.methods.${method} has an unsupported behavior`);if(hasResponse&&!isJsonValue2(methodConfig.response))throw new Error(`bridgeConfig.methods.${method}.response must be valid JSON data`);if("noop"in methodConfig&&methodConfig.noop!==!0)throw new Error(`bridgeConfig.methods.${method}.noop must be true when provided`);if("silent"in methodConfig&&typeof methodConfig.silent!="boolean")throw new Error(`bridgeConfig.methods.${method}.silent must be a boolean`);methods[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config=>config!==void 0);if(present.length===0)return;let methods={};for(let config of present)Object.assign(methods,validateAppBridgeConfig(config).methods);return validateAppBridgeConfig({methods})}function applyAppBridgeConfig(actions,config){let out=mergeActions(actions);if(!config)return out;let{methods}=validateAppBridgeConfig(config);for(let[method,methodConfig]of Object.entries(methods)){for(let key of BRIDGE_ACTION_ARRAY_KEYS){let values=out[key];values&&(out[key]=values.filter(value=>value!==method))}out.silent=(out.silent??[]).filter(value=>value!==method),delete out.responses?.[method],delete out.behaviors?.[method],methodConfig.behavior?out.behaviors[method]=methodConfig.behavior:Object.prototype.hasOwnProperty.call(methodConfig,"response")?out.responses[method]=methodConfig.response:methodConfig.noop&&out.noop.push(method),methodConfig.silent&&out.silent.push(method)}return out}function buildAppProfileUa(profile,options={}){let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";return profile.uaTemplate?profile.uaTemplate[os13].replaceAll("{v}",version2).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans"):os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36`:"Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1"}function listBuiltinAppProfiles(){return[]}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Install an App simulation capability first.`);return resolveAppProfileDefinition(definition,options)}function resolveAppProfileDefinition(definition,options={}){let profile=validateAppProfileDefinition(definition);if(options.lockDefinition!==void 0&&typeof options.lockDefinition!="boolean")throw new Error("lockDefinition must be a boolean");if(options.os!==void 0&&options.os!=="ios"&&options.os!=="android")throw new Error("Invalid app profile OS");if(options.orientation!==void 0&&options.orientation!=="portrait"&&options.orientation!=="landscape")throw new Error("Invalid app profile orientation");if(options.devicePreset!==void 0&&!Object.hasOwn(DEVICE_PRESETS,options.devicePreset))throw new Error("Invalid app profile device preset");for(let[key,maximum]of[["appVersion",100],["deviceModel",200],["language",100]]){let value=options[key];if(value!==void 0&&(typeof value!="string"||!value||value.length>maximum||/[\r\n]/.test(value)))throw new Error(`Invalid app profile ${key}`)}if(options.language!==void 0&&profile.policies?.languages&&!profile.policies.languages.includes(options.language))throw new Error(`Unsupported ${profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,recommendedPreset=os13==="android"?"pixel-11":"iphone-17-pro",devicePreset=options.devicePreset??recommendedPreset,emulation=resolveEmulationConfig({enabled:!0,preset:devicePreset,orientation:options.orientation}),deviceModel=options.deviceModel??DEVICE_PRESETS[devicePreset].appProfileModel,globals=profile.pageRuntime||profile.bridges.length>0||Object.keys(profile.globals).length>0?{...Object.fromEntries(Object.entries(profile.globals).map(([key,value])=>[key,value.replaceAll("{deviceModel}",deviceModel).replaceAll("{v}",version2)])),__APP_NAME__:profile.appName,__APP_VERSION__:version2,__DEVICE_MODEL__:deviceModel}:{},ua=buildAppProfileUa(profile,{...options,os:os13,deviceModel});return{profile:profile.name,label:profile.label,ua,injected:{...profile.pageRuntime&&{pageRuntime:profile.pageRuntime},binding:{version:1,revision:appProfileRevision(profile),definition:profile,options:JSON.parse(JSON.stringify({...options,os:os13,appVersion:version2,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],settingsUi:profile.settingsUi,settingsGroup:profile.settingsGroup,profile:profile.name,label:profile.label,globals,bridges:profile.bridges,activeEvents:profile.activeEvents,maxTouchPoints:5,statusBarHeight:emulation.safeAreaInsets.top,safeAreaInsets:emulation.safeAreaInsets,deviceAppearance:{preset:devicePreset,orientation:emulation.orientation,cutout:emulation.appearance.cutout},language:options.language??profile.policies?.defaultLanguage??"zh-Hans",userAgent:ua,navigatorPlatform:os13==="android"?"Linux armv8l":"iPhone",platform:os13==="android"?"Android":"iOS",systemVersion:os13==="android"?"17":"26.0",clientType:os13==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.overlay&&{overlay:profile.overlay},...profile.popBeforeOpenParam&&{popBeforeOpenParam:profile.popBeforeOpenParam},...profile.messageEvent&&{messageEvent:profile.messageEvent},...profile.nativeBack&&{nativeBack:profile.nativeBack},...profile.layerUrlProxy&&{layerUrlProxy:profile.layerUrlProxy},...profile.urlSyncHostSuffixes&&{urlSyncHostSuffixes:profile.urlSyncHostSuffixes},...profile.runtimeOptions&&{runtimeOptions:JSON.parse(JSON.stringify(profile.runtimeOptions))},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os13==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}var BRIDGE_ACTION_ARRAY_KEYS,APP_PROFILES,init_profiles2=__esm({"../app-profiles/dist/profiles.js"(){"use strict";init_dist2();BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","protocol","kvGet","kvSet","kvDelete","pageContext","noop"];APP_PROFILES=Object.freeze({})}});async function findAppProfileDefinitionUpdate(current,load,timeoutMs=1500){if(!current.binding||current.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve16=>{timer=setTimeout(()=>resolve16(void 0),timeoutMs)})]);return current.binding.definition.pageRuntime&&definition&&!definition.pageRuntime?void 0:definition&&definition.name===current.profile&&appProfileRevision(definition)!==current.binding.revision?definition:void 0}catch{return}finally{clearTimeout(timer)}}function mergeAppProfileOptions(...sources){let result={};for(let source of sources)if(source){for(let key of OPTION_KEYS)source[key]!==void 0&&Object.assign(result,{[key]:source[key]});source.bridgeConfig!==void 0&&(result.bridgeConfig=mergeAppBridgeConfigs(result.bridgeConfig,source.bridgeConfig))}return result}function getAppProfileExplicitOptions(config){return mergeAppProfileOptions(config.binding?.explicitOptions,{bridgeConfig:config.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current,definition,defaults,options,deviceOptions}={}){let active=current?.profile===name?current:void 0,explicit=mergeAppProfileOptions(defaults,active?getAppProfileExplicitOptions(active):void 0,options),previousDevice=active?.binding?.options,effective=mergeAppProfileOptions(previousDevice&&{os:previousDevice.os,deviceModel:previousDevice.deviceModel,devicePreset:previousDevice.devicePreset,orientation:previousDevice.orientation},explicit,deviceOptions),resolved=resolveAppProfile(name,effective,definition??active?.binding?.definition);return resolved.injected.binding.explicitOptions=Object.fromEntries(Object.entries(explicit).filter(([key])=>key!=="bridgeConfig")),active?.hostCapabilities&&(definition===void 0||definition===active.binding?.definition)&&(resolved.injected.hostCapabilities=structuredClone(active.hostCapabilities)),resolved}function rebuildAppProfileConfig(current,options={},definition=current.binding?.definition){let next=resolveAppProfileUpdate(current.profile,{current,definition,options}).injected;return{...next,animationMs:current.animationMs,statusBarHeight:current.statusBarHeight,safeAreaInsets:current.safeAreaInsets,deviceAppearance:current.deviceAppearance,simulateSystemBars:current.simulateSystemBars,externalDeviceChrome:current.externalDeviceChrome,rootContainer:{...next.rootContainer,...next.rootContainer?.initialCookies&&{initialCookies:next.rootContainer.initialCookies.map(cookie=>({...cookie,value:String(current.statusBarHeight)}))},enabled:current.rootContainer?.enabled??!1,...current.rootContainer?.splitScreen!==void 0&&{splitScreen:current.rootContainer.splitScreen}}}}var OPTION_KEYS,init_updates=__esm({"../app-profiles/dist/updates.js"(){"use strict";init_dist2();init_profiles2();OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"]}});function updateAppProfileSetting(config,id3,value){let binding=config.binding,setting=binding?.definition.settings?.find(item=>item.id===id3);if(!binding||!setting)throw new Error("App profile setting is unavailable");if(setting.type==="boolean"&&typeof value!="boolean"||setting.type==="number"&&(typeof value!="number"||!Number.isFinite(value)||setting.minimum!==void 0&&value<setting.minimum||setting.maximum!==void 0&&value>setting.maximum)||["text","select"].includes(setting.type)&&typeof value!="string"||setting.type==="select"&&!setting.choices?.some(choice=>choice.value===value))throw new Error("Invalid app profile setting value");if(JSON.stringify(value)?.length>16384||value===void 0)throw new Error("Invalid app profile setting value");if("option"in setting.target){let next2=rebuildAppProfileConfig(config,{language:String(value)});return{config:next2,options:next2.binding.options,reload:!0}}let{method,field}=setting.target,old=config.actions.responses?.[method],response=field?{...old&&typeof old=="object"&&!Array.isArray(old)?old:{},[field]:value}:value,patch={methods:{[method]:{response,silent:config.actions.silent?.includes(method)===!0}}},next=rebuildAppProfileConfig(config,{bridgeConfig:patch});return{config:next,options:next.binding.options,responses:{[method]:response},reload:!1}}var init_settings=__esm({"../app-profiles/dist/settings.js"(){"use strict";init_updates()}});var init_changes=__esm({"../app-profiles/dist/environment/changes.js"(){"use strict"}});function installAppProfileDocumentEnvironment(config,options){let browser=globalThis,target=browser;if(options.restoreHintName)try{Object.defineProperty(target,options.restoreHintName,{configurable:!0,enumerable:!1,writable:!1,value:!0})}catch{target[options.restoreHintName]=!0}let includeGlobals=options.globals==="always"||!!config.pageRuntime;for(let[key,value]of Object.entries(includeGlobals?config.globals:{}))try{target[key]=value}catch{}let insets=config.safeAreaInsets??{top:config.statusBarHeight,right:0,bottom:0,left:0};includeGlobals&&(target.__STATUS_BAR_HEIGHT__=config.statusBarHeight,target.__SAFE_AREA_INSET_BOTTOM__=insets.bottom);for(let[key,value]of[["userAgent",config.userAgent],["platform",config.navigatorPlatform],...includeGlobals?[["vendor","Apple Computer, Inc."]]:[],["appVersion",config.userAgent.replace(/^Mozilla\//,"")],["maxTouchPoints",config.maxTouchPoints],...includeGlobals&&config.policies?.navigatorLanguage===!0?[["language",config.language]]:[]])try{Object.defineProperty(browser.navigator,key,{configurable:!0,get:()=>value})}catch{}if(includeGlobals&&config.policies?.navigatorLanguage===!0)try{Object.defineProperty(browser.navigator,"languages",{configurable:!0,get:()=>[config.language]})}catch{}if(options.safeAreaVariables){let apply=()=>{let root=browser.document.documentElement;return root?(root.style.setProperty("--safe-area-inset-top",`${insets.top}px`),root.style.setProperty("--safe-area-inset-right",`${insets.right}px`),root.style.setProperty("--safe-area-inset-bottom",`${insets.bottom}px`),root.style.setProperty("--safe-area-inset-left",`${insets.left}px`),!0):!1};if(!apply()){let observer=new browser.MutationObserver(()=>{apply()&&observer.disconnect()});observer.observe(browser.document,{childList:!0})}}}function installAppProfileWhenDocumentReady(install,waitForBody=!1){let browser=globalThis,ready=()=>!!(browser.document.documentElement&&(!waitForBody||browser.document.body));if(ready()){install();return}let observer=new browser.MutationObserver(()=>{ready()&&(observer.disconnect(),install())});observer.observe(browser.document,{childList:!0,subtree:waitForBody})}var init_document=__esm({"../app-profiles/dist/environment/document.js"(){"use strict"}});function installAppProfileMessageRelay(bindingName,options={}){let browser=globalThis,target=globalThis,markerName=options.markerName??"__mearlCdpAppProfileRelayInstalled__";target[markerName]||(target[markerName]=!0,browser.addEventListener("message",event=>{if(event.source!==globalThis)return;let message=event.data;if(!message||message.source!=="mearl-app-bridge")return;let requestId=message.requestId;if(typeof requestId!="number"||message.type==="settings"&&globalThis.top!==globalThis)return;if(message.type==="prepareWebView"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE",requestId,result:{success:!0}},"*");return}if(message.type!=="protocol"&&message.type!=="protocolStream"&&message.type!=="userInfo"&&message.type!=="authCode"&&message.type!=="authCodeCancel"&&message.type!=="settings"&&message.type!=="screenshot")return;let replyFailure=reason=>{if(browser.console?.warn("[Mearl] App bridge relay unavailable:",reason),message.type==="protocolStream"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PROTOCOL_STREAM_EVENT",requestId,eventType:"onError",data:{error:reason}},"*");return}let responseTypes={protocol:"APP_BRIDGE_PROTOCOL_RESPONSE",userInfo:"APP_BRIDGE_USER_INFO_RESPONSE",authCode:"APP_BRIDGE_AUTH_CODE_RESPONSE",screenshot:"APP_BRIDGE_SCREENSHOT_RESPONSE",settings:"APP_BRIDGE_SETTINGS_RESPONSE"};browser.postMessage({source:"mearl-content",type:responseTypes[String(message.type)],requestId,result:{success:!1,error:reason}},"*")};if(options.supportedTypes&&!options.supportedTypes.includes(String(message.type))){replyFailure("this App bridge operation is not supported by the selected backend");return}let binding=target[bindingName];if(typeof binding!="function"){replyFailure("native relay binding is unavailable");return}try{binding(JSON.stringify({type:message.type,requestId,payload:message.payload}))}catch(error){replyFailure(error instanceof Error?error.message:"native relay call failed")}}))}var init_relay=__esm({"../app-profiles/dist/environment/relay.js"(){"use strict"}});var init_app_device=__esm({"../app-profiles/dist/environment/app-device.js"(){"use strict"}});var init_identity=__esm({"../app-profiles/dist/environment/identity.js"(){"use strict";init_dist2()}});var init_dist8=__esm({"../app-profiles/dist/index.js"(){"use strict";init_profiles2();init_settings();init_updates();init_changes();init_document();init_relay();init_app_device();init_identity()}});function capabilityCatalog(){let factory=nativeCapabilities.get("app.profileCatalog");if(!factory)return cachedFactory=void 0,cachedCatalog=[],[];if(factory===cachedFactory)return structuredClone(cachedCatalog);let contribution=structuredClone(factory());if(!contribution||!/^[a-z][a-z0-9-]{0,79}$/.test(contribution.namespace)||!Array.isArray(contribution.profiles)||contribution.profiles.length>64||!contribution.bindings||typeof contribution.bindings!="object"||Array.isArray(contribution.bindings)||Object.keys(contribution.bindings).length>64)throw new Error("Invalid capability App catalog");let definitions=new Map;for(let raw of contribution.profiles){let definition=validateAppProfileDefinition(raw);if(!definition.name.startsWith(contribution.namespace+"/")||definitions.has(definition.name))throw new Error("Invalid capability App namespace");definitions.set(definition.name,definition)}let bound=new Set,entries=[];for(let[id3,target]of Object.entries(contribution.bindings)){if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof target!="string"||!definitions.has(target))throw new Error("Invalid capability App binding");bound.add(target);let definition=validateAppProfileDefinition({...definitions.get(target),name:id3});entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition})}for(let[id3,definition]of definitions)bound.has(id3)||entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition});if(contribution.order!==void 0){if(!Array.isArray(contribution.order)||new Set(contribution.order).size!==contribution.order.length||contribution.order.some(id3=>!entries.some(entry=>entry.id===id3)))throw new Error("Invalid capability App order");entries.sort((a,b)=>{let first=contribution.order.indexOf(a.id),second=contribution.order.indexOf(b.id);return(first<0?1/0:first)-(second<0?1/0:second)})}return cachedCatalog=entries,cachedFactory=factory,entries}function findCapabilityAppProfile(id3){return capabilityCatalog().find(entry=>entry.id===id3)}async function listInstalledAppProfiles(options={}){let profiles=listBuiltinAppProfiles(),errors=[];try{let contributed=capabilityCatalog();if(contributed.length){let overridden=new Set(contributed.map(entry=>entry.id));profiles=[...contributed,...profiles.filter(entry=>!overridden.has(entry.id))]}}catch(error){errors.push({plugin:"capabilities",error:error instanceof Error?error.message:String(error)})}for(let plugin of listPluginNames())try{let registered=findPluginRegistration(plugin);if(!registered)continue;let registration=options.refresh===!1?registered:await refreshRegisteredPlugin(plugin);for(let raw of registration?.appProfiles?.profiles??[]){if(raw.name.includes("/"))throw new Error("Plugin profile names must be local identifiers");let id3=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition({...raw,name:id3});profiles.push({id:id3,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error){errors.push({plugin,error:error instanceof Error?error.message:String(error)})}return{profiles,errors}}async function resolveInstalledAppProfile(name,options={}){let contributed=capabilityCatalog().find(entry=>entry.id===name);if(contributed)return resolveAppProfile(name,options,contributed.definition);if(!name.includes("/"))return resolveAppProfile(name,options);let profile=(await listInstalledAppProfiles()).profiles.find(candidate=>candidate.id===name);if(!profile)throw new Error(`App profile is unavailable: ${name}`);return resolveAppProfile(name,options,profile.definition)}var cachedFactory,cachedCatalog,init_app_profile_catalog=__esm({"src/app-profile-catalog.ts"(){"use strict";init_native_capability_services();init_plugin2();init_dist8();init_dist2();cachedCatalog=[]}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist2();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}browserId;sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id3=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id3))return id3}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id3){let record4=this.require(id3);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}state(id3){let{tabs:_tabs,...state}=this.require(id3);return state}find(id3){return this.sessions.get(id3)?.browserId===this.browserId()?this.info(id3):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id3){let record4=this.sessions.get(id3);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id3,generation){let record4=this.require(id3);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id3,tabId,source){let record4=this.require(id3),owner=this.owners.get(tabId);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id3)}blockedTabs(id3){return[...this.owners].filter(([,owner])=>owner!==id3).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations=>[...operations])),await operation()}finally{this.browserReleasing=!1}}async run(id3,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id3?this.assertActive(id3).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.networkControl!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id3&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id3))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id3&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve16=>{unlock=resolve16}),runtimeTransport=action==="page_runtime",predecessors=runtimeTransport?[]:[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);if(!runtimeTransport&&this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE)),!runtimeTransport)for(let tab of tabs)this.queues.set(tab,tail);let promise=(async()=>{try{await Promise.all(predecessors),id3&&this.assertActive(id3,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");id3&&tab>=0&&this.claim(id3,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id3)??new Set;pending.add(promise),this.pending.set(id3,pending);try{return await promise}finally{pending.delete(promise),pending.size||this.pending.delete(id3)}}async waitForIdle(id3){await Promise.allSettled([...this.pending.get(id3)??[]])}assertStep(id3,generation){this.assertActive(id3,generation)}recordResult(id3,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id3,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id3,tab.tabId,"created");let target=this.require(id3).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id3).tabs=this.require(id3).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id3).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id3,reason){let record4=this.assertActive(id3);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id3)}async resume(id3,cleanup=async()=>{}){let record4=this.require(id3);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id3);try{return await this.waitForIdle(id3),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id3)}finally{this.resuming.delete(id3)}}async release(id3,params,cleanup){let record4=this.require(id3);if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id3);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id3)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id3&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id3);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error){throw record4.status=previous,error}return this.info(id3)}}}});import{rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID21}from"node:crypto";import{mkdir as mkdir2,open as open4,rm as rm3,stat as stat3,writeFile}from"node:fs/promises";import path13 from"node:path";import os5 from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path13.join(os5.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID21()}`)){this.root=root}root;files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id3,file2]of this.files)!file2.sessionId&&!file2.writing&&Date.now()-file2.accessedAt>3600*1e3&&this.remove(id3).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID21(),directory=path13.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file={artifactId,filename,bytes:0,location:"browser",path:path13.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file.path,"",{mode:384}),this.files.set(artifactId,file),this.info(file)}async importFile(filename,sourcePath,sessionId){let source=await open4(sourcePath,"r"),id3;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id3=(await this.create(filename,sessionId)).artifactId;let file=this.require(id3,sessionId),target=await open4(file.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file.bytes=(await stat3(file.path)).size,file.ready=!0,this.info(file)}catch(error){throw id3&&await this.remove(id3,sessionId),error}finally{await source.close()}}require(id3,sessionId){let file=this.files.get(id3);if(!file||file.sessionId!==void 0&&file.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file.accessedAt=Date.now(),file}info(file){return{artifactId:file.artifactId,filename:file.filename,bytes:file.bytes,location:"browser"}}async write(id3,offset,base64,sessionId){let file=this.require(id3,sessionId);if(file.ready||file.writing||offset!==file.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base64!="string"||base64.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base64.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base64))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base64,"base64");if(chunk.toString("base64")!==base64)throw new Error("Invalid artifact chunk");if(file.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file.writing=!0;try{let handle=await open4(file.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file.bytes+=chunk.length,this.info(file)}finally{file.writing=!1}}complete(id3,bytes,sessionId){let file=this.require(id3,sessionId);if(file.writing||bytes!==file.bytes)throw new Error("Artifact size mismatch");return file.ready=!0,this.info(file)}resolve(id3,sessionId){let file=this.require(id3,sessionId);if(!file.ready)throw new Error("Artifact is not ready");return file.path}async read(id3,offset,sessionId){let file=this.require(id3,sessionId);if(!file.ready||!Number.isSafeInteger(offset)||offset<0||offset>file.bytes)throw new Error("Invalid artifact read");let handle=await open4(file.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file.bytes}}finally{await handle.close()}}async remove(id3,sessionId){let file=this.require(id3,sessionId);await rm3(path13.dirname(file.path),{recursive:!0,force:!0}),this.files.delete(id3)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id3,file]of this.files)file.sessionId===sessionId&&(retain.has(id3)?(file.sessionId=void 0,file.accessedAt=Date.now()):await this.remove(id3,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync14(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm3(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist2();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}dependencies;registry;artifacts=new BrowserArtifactStore;activityQueues=new Map;async withActivity(id3,operation){let pending=(this.activityQueues.get(id3)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id3,pending);try{return await pending}finally{this.activityQueues.get(id3)===pending&&this.activityQueues.delete(id3)}}async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id3,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id3),this.registry.info(id3);operation==="resume"&&await this.activityQueues.get(id3)?.catch(()=>{});let current=this.registry.info(id3),info=operation==="resume"?await this.registry.resume(id3,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0,!0)):current.status==="user"?current:this.registry.handoff(id3,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id3,async()=>{await this.dependencies.deactivate?.(this.registry.info(id3).tabs.map(tab=>tab.tabId),current.transport)}),this.registry.info(id3)):info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data.reason)}}if(action==="browser_release"&&sessionId){let params=data;return await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)}),this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session:this.registry.state(sessionId)}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let performStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file=>this.artifacts.resolve(file.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},invokeStep=(name,payload,batch=!1)=>sessionId&&name==="tab_open"?this.withActivity(sessionId,async()=>(this.registry.assertStep(sessionId,info.generation),performStep(name,payload,batch))):performStep(name,payload,batch),result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm6,rmdir:rmdir2}=await import("node:fs/promises");await rm6(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error){throw created&&sessionId&&await this.registry.release(sessionId,{},async tabs=>{await this.dependencies.cleanup(tabs,transport,!0),await this.artifacts.release(sessionId)}),this.dependencies.notify(),error}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.state(sessionId)}):result}}}});var require_cjs=__commonJS({"../../node_modules/.pnpm/tldts@7.4.19/node_modules/tldts/dist/cjs/index.js"(exports){"use strict";function shareSameDomainSuffix(hostname,vhost){return hostname.endsWith(vhost)?hostname.length===vhost.length||hostname[hostname.length-vhost.length-1]===".":!1}function extractDomainWithSuffix(hostname,publicSuffix){let publicSuffixIndex=hostname.length-publicSuffix.length-2,lastDotBeforeSuffixIndex=hostname.lastIndexOf(".",publicSuffixIndex);return lastDotBeforeSuffixIndex===-1?hostname:hostname.slice(lastDotBeforeSuffixIndex+1)}function getDomain$1(suffix,hostname,options){if(options.validHosts!==null){let validHosts=options.validHosts;for(let vhost of validHosts)if(shareSameDomainSuffix(hostname,vhost))return vhost}let numberOfLeadingDots=0;if(hostname.startsWith("."))for(;numberOfLeadingDots<hostname.length&&hostname[numberOfLeadingDots]===".";)numberOfLeadingDots+=1;return suffix.length===hostname.length-numberOfLeadingDots?null:extractDomainWithSuffix(hostname,suffix)}function getDomainWithoutSuffix$1(domain,suffix){return domain.slice(0,-suffix.length-1)}var CONTROL_CHARS2=/[\t\n\r]/g,extractedHostnameValidated=!1;function isValidHostnameChar(code){return code>=97&&code<=122||code>=48&&code<=57||code>127||code>=65&&code<=90||code===45||code===95}function getSpecialScheme(url,schemeStart,colonIndex){let length=colonIndex-schemeStart,c0=url.charCodeAt(schemeStart)|32;if(length===2)return c0===119&&(url.charCodeAt(schemeStart+1)|32)===115?1:0;if(length===3){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32;return c0===119&&c1===115&&c2===115||c0===102&&c1===116&&c2===112?1:0}else if(length===4){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32,c3=url.charCodeAt(schemeStart+3)|32;return c0===104&&c1===116&&c2===116&&c3===112?1:c0===102&&c1===105&&c2===108&&c3===101?2:0}else if(length===5)return c0===104&&(url.charCodeAt(schemeStart+1)|32)===116&&(url.charCodeAt(schemeStart+2)|32)===116&&(url.charCodeAt(schemeStart+3)|32)===112&&(url.charCodeAt(schemeStart+4)|32)===115?1:0;return 0}function extractHostname(url,urlIsValidHostname,validate2=!1){let start=0,end=url.length,hasUpper=!1,isSpecial=!1;if(extractedHostnameValidated=!1,!urlIsValidHostname){if(url.startsWith("data:"))return null;for(;start<url.length&&url.charCodeAt(start)<=32;)start+=1;for(;end>start+1&&url.charCodeAt(end-1)<=32;)end-=1;if(url.charCodeAt(start)===47&&url.charCodeAt(start+1)===47)start+=2;else{let indexOfProtocol=url.indexOf(":/",start);if(indexOfProtocol!==-1){let special=getSpecialScheme(url,start,indexOfProtocol);if(special===1)for(isSpecial=!0,start=indexOfProtocol+2;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1;else if(special===2){isSpecial=!0,start=indexOfProtocol+1;let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else{for(let i=start;i<indexOfProtocol;i+=1){let code=url.charCodeAt(i)|32;if(!(code>=97&&code<=122||code>=48&&code<=57||code===46||code===45||code===43)){let raw=url.charCodeAt(i);return raw===9||raw===10||raw===13?extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2):null}}if(url.charCodeAt(indexOfProtocol+2)===47)start=indexOfProtocol+3;else return null}}else if(url.charCodeAt(start)!==91){let indexOfColon=-1;for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code===9||code===10||code===13)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(code===58){indexOfColon=i;break}if(code===47||code===92||code===63||code===35)break}if(indexOfColon!==-1){let hasIdentifier=!1;for(let i=indexOfColon+1;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code===64){hasIdentifier=!0;break}}if(!hasIdentifier){let allDigits=!0,i=indexOfColon+1;for(;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code<48||code>57){allDigits=!1;break}}if(i===indexOfColon+1&&(allDigits=!1),!allDigits){let special=getSpecialScheme(url,start,indexOfColon);if(special===0){let isBareIpv6=!1;for(let j=indexOfColon+1;j<end;j+=1){let code=url.charCodeAt(j);if(code===47||code===92||code===63||code===35)break;if(code===58){isBareIpv6=!0;break}}if(!isBareIpv6)return null}else if(isSpecial=!0,start=indexOfColon+1,special===2){let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else for(;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1}}}}}let indexOfIdentifier=-1,indexOfClosingBracket=-1,indexOfPort=-1,indexOfFirstColon=-1,hasControl=!1,vValid=validate2,vLastDot=start-1,vLastCode=-1;if(validate2&&start<end){let c0=url.charCodeAt(start);(!(isValidHostnameChar(c0)||c0===46||c0===95)||c0===45)&&(vValid=!1)}for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code<64)if(code===47||code===35||code===63){end=i;break}else code===58?(indexOfFirstColon===-1&&(indexOfFirstColon=i),indexOfPort=i):code===9||code===10||code===13?hasControl=!0:validate2&&(code===46?((i-vLastDot>64||vLastCode===46||vLastCode===45)&&(vValid=!1),vLastDot=i):(code<48||code>57)&&(code!==45||vLastCode===46)&&(vValid=!1));else if(isSpecial&&code===92){end=i;break}else code===64?(indexOfIdentifier=i,indexOfFirstColon=-1):code===93?indexOfClosingBracket=i:code>=65&&code<=90?hasUpper=!0:validate2&&!isValidHostnameChar(code)&&(vValid=!1);validate2&&(vLastCode=code)}if(hasControl)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(indexOfIdentifier!==-1&&indexOfIdentifier>=start&&indexOfIdentifier<end&&(start=indexOfIdentifier+1),url.charCodeAt(start)===91)return indexOfClosingBracket!==-1?url.slice(start+1,indexOfClosingBracket).toLowerCase():null;if(indexOfPort!==-1&&indexOfPort>start&&indexOfPort<end&&indexOfFirstColon===indexOfPort&&(end=indexOfPort),start>=end)return null;validate2&&vValid&&indexOfIdentifier===-1&&indexOfPort===-1&&indexOfClosingBracket===-1&&url.charCodeAt(end-1)!==46&&end-start<=255&&end-vLastDot-1<=63&&vLastCode!==45&&(extractedHostnameValidated=!0)}for(;end>start+1&&url.charCodeAt(end-1)===46;)end-=1;let hostname=start!==0||end!==url.length?url.slice(start,end):url;return hasUpper?hostname.toLowerCase():hostname}function isProbablyIpv4(hostname){if(hostname.length<7||hostname.length>15)return!1;let numberOfDots=0;for(let i=0;i<hostname.length;i+=1){let code=hostname.charCodeAt(i);if(code===46)numberOfDots+=1;else if(code<48||code>57)return!1}return numberOfDots===3&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(hostname.length-1)!==46}function isProbablyIpv6(hostname){if(hostname.length<3)return!1;let start=hostname.startsWith("[")?1:0,end=hostname.length;if(hostname[end-1]==="]"&&(end-=1),end-start>39)return!1;let hasColon=!1;for(;start<end;start+=1){let code=hostname.charCodeAt(start);if(code===58)hasColon=!0;else if(!(code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=70))return!1}return hasColon}function isIp(hostname){return isProbablyIpv6(hostname)||isProbablyIpv4(hostname)}var SPECIAL_USE_DOMAINS2=["test","localhost","invalid","example","example.com","example.net","example.org","local","onion","alt","home.arpa","ipv4only.arpa","resolver.arpa","service.arpa","6tisch.arpa","eap.arpa"];function isSpecialUse(hostname){for(let name of SPECIAL_USE_DOMAINS2)if(hostname.endsWith(name)&&(hostname.length===name.length||hostname.charCodeAt(hostname.length-name.length-1)===46))return!0;return!1}function isValidAscii(code){return code>=97&&code<=122||code>=48&&code<=57||code>127}function isValidHostname(hostname){if(hostname.length>255||hostname.length===0||!isValidAscii(hostname.charCodeAt(0))&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(0)!==95)return!1;let lastDotIndex=-1,lastCharCode=-1,len=hostname.length;for(let i=0;i<len;i+=1){let code=hostname.charCodeAt(i);if(code===46){if(i-lastDotIndex>64||lastCharCode===46||lastCharCode===45)return!1;lastDotIndex=i}else if(!(isValidAscii(code)||code===45||code===95)||code===45&&lastCharCode===46)return!1;lastCharCode=code}return len-lastDotIndex-1<=63&&lastCharCode!==45}function setDefaultsImpl({allowIcannDomains=!0,allowPrivateDomains=!1,detectIp=!0,detectSpecialUse=!1,extractHostname:extractHostname2=!0,mixedInputs=!0,validHosts=null,validateHostname=!0}){return{allowIcannDomains,allowPrivateDomains,detectIp,detectSpecialUse,extractHostname:extractHostname2,mixedInputs,validHosts,validateHostname}}var DEFAULT_OPTIONS=setDefaultsImpl({});function setDefaults(options){return options===void 0?DEFAULT_OPTIONS:setDefaultsImpl(options)}function getSubdomain$1(hostname,domain){return domain.length===hostname.length?"":hostname.slice(0,-domain.length-1)}function getEmptyResult(){return{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,isSpecialUse:null,publicSuffix:null,subdomain:null}}function resetResult(result){result.domain=null,result.domainWithoutSuffix=null,result.hostname=null,result.isIcann=null,result.isIp=null,result.isPrivate=null,result.isSpecialUse=null,result.publicSuffix=null,result.subdomain=null}function parseImpl(url,step,suffixLookup2,partialOptions,result){let options=setDefaults(partialOptions);if(typeof url!="string")return result;let urlIsValid=!1;return options.extractHostname?options.mixedInputs?(urlIsValid=isValidHostname(url),result.hostname=extractHostname(url,urlIsValid,options.validateHostname)):result.hostname=extractHostname(url,!1,options.validateHostname):result.hostname=url,options.detectIp&&result.hostname!==null&&(result.isIp=isIp(result.hostname),result.isIp)?result:options.validateHostname&&options.extractHostname&&result.hostname!==null&&!(urlIsValid&&result.hostname===url)&&!extractedHostnameValidated&&!isValidHostname(result.hostname)?(result.hostname=null,result):(step===0||result.hostname===null||(step===5&&options.detectSpecialUse&&(result.isSpecialUse=isSpecialUse(result.hostname)),suffixLookup2(result.hostname,options,result),step===2||result.publicSuffix===null)||(result.domain=getDomain$1(result.publicSuffix,result.hostname,options),step===3||result.domain===null)||(result.subdomain=getSubdomain$1(result.hostname,result.domain),step===4)||(result.domainWithoutSuffix=getDomainWithoutSuffix$1(result.domain,result.publicSuffix)),result)}function fastPathLookup(hostname,options,out){if(!options.allowPrivateDomains&&hostname.length>3){let last=hostname.length-1,c3=hostname.charCodeAt(last),c2=hostname.charCodeAt(last-1),c1=hostname.charCodeAt(last-2),c0=hostname.charCodeAt(last-3);if(c3===109&&c2===111&&c1===99&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="com",!0;if(c3===103&&c2===114&&c1===111&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="org",!0;if(c3===117&&c2===100&&c1===101&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="edu",!0;if(c3===118&&c2===111&&c1===103&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="gov",!0;if(c3===116&&c2===101&&c1===110&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="net",!0;if(c3===101&&c2===100&&c1===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="de",!0}return!1}var nodeFlags=new Uint8Array([1,2,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,2,2,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,2,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,2,0,2,2,0,0,2,2,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,2,0,1,1,0,2,0,2,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,2,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2,2,0,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,2,2,1,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,2,1,1,1,2,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]),edgeStart=new Uint16Array([0,0,0,10,11,18,106,111,117,124,130,136,145,146,147,148,149,150,151,153,154,155,157,159,228,241,243,244,245,260,267,268,271,272,273,276,278,297,298,300,309,314,331,332,335,336,338,340,376,377,379,382,383,387,389,393,396,428,431,444,445,453,454,456,466,480,481,482,483,492,493,530,535,551,571,577,619,620,647,674,675,823,829,832,833,834,839,844,853,875,876,877,878,879,880,881,899,901,902,905,907,908,910,912,927,942,947,948,950,951,952,953,954,956,959,964,965,966,968,969,972,975,976,977,990,992,1004,1015,1023,1025,1065,1068,1072,1073,1075,1078,1089,1091,1101,1103,1109,1111,1112,1114,1117,1118,1119,1172,1174,1176,1196,1197,1198,1199,1201,1212,1243,1254,1255,1268,1278,1287,1295,1296,1301,1315,1326,1338,1350,1364,1365,1376,1410,1411,1412,1428,1444,1456,1529,1530,1532,1533,1569,1588,1589,1590,1591,1592,1595,1599,1602,1604,1638,1639,1647,1648,1649,1650,1651,1652,1654,1656,1658,1659,1663,1664,1665,1667,1669,1670,1672,1673,1674,1685,1687,1688,1692,1693,1696,1703,1704,1709,1713,1714,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,2193,2196,2197,2199,2206,2213,2223,2227,2238,2239,2240,2252,2253,2255,2257,2258,2265,2266,2268,2269,2271,2272,2273,2274,2275,2349,2351,2372,2373,2374,2376,2378,2379,2430,2431,2433,2440,2446,2456,2466,2519,2520,2521,2531,2545,2546,2549,2556,2557,2565,2567,2568,2569,2570,2581,2582,2583,2585,2586,2587,2596,2608,2614,2646,2650,2652,2653,2655,2656,2667,2668,2670,2678,2685,2691,2696,2697,2703,2706,2712,2719,2720,2727,2735,2736,2737,2775,2781,2796,2797,2802,2820,2851,2869,2871,2874,2882,2884,2891,2943,2967,2968,2969,2970,2971,2972,2973,2980,2981,2982,2983,2984,2985,2987,2988,2992,3072,3085,3086,3523,3527,3541,3593,3621,3643,3701,3723,3738,3801,3852,3890,3926,3951,4093,4139,4190,4209,4243,4258,4278,4308,4339,4362,4393,4423,4455,4482,4557,4579,4617,4627,4661,4680,4706,4748,4798,4824,4893,4894,4896,4919,4942,4978,5009,5026,5083,5096,5120,5149,5151,5185,5201,5229,5534,5543,5552,5559,5576,5580,5586,5625,5627,5634,5641,5650,5657,5658,5659,5671,5674,5689,5690,5699,5700,5709,5718,5724,5726,5727,5728,5765,5766,5768,5776,5783,5796,5800,5802,5803,5809,5816,5830,5840,5845,5853,5861,5867,5868,5872,5874,5875,5887,5959,5960,5961,5962,5964,5965,5968,5970,5973,5977,5978,5979,5985,5986,5987,5989,5991,5993,5994,5995,5998,6e3,6003,6004,6006,6204,6211,6212,6213,6223,6228,6245,6259,6268,6269,6270,6274,6275,6277,6279,6285,6286,6289,6290,6292,6293,6294,7194,7197,7201,7219,7228,7231,7238,7239,7241,7242,7243,7245,7297,7298,7301,7302,7419,7420,7431,7442,7449,7452,7461,7462,7463,7478,7533,7725,7727,7728,7730,7735,7748,7763,7770,7779,7782,7785,7792,7800,7804,7805,7806,7820,7824,7833,7834,7835,7839,7874,7875,7893,7900,7908,7909,7914,7922,7966,7967,7973,7976,7988,7993,7994,7996,7998,8033,8034,8040,8047,8048,8057,8066,8081,8085,8086,8138,8139,8144,8145,8148,8150,8151,8152,8161,8175,8183,8197,8209,8210,8212,8214,8236,8247,8253,8254,8266,8278,8365,8377,8385,8388,8394,8419,8422,8423,8424,8425,8427,8430,8433,8444,8446,8448,8476,8551,8558,8562,8563,8572,8594,8595,8600,8601,8680,8682,8684,8693,8697,8703,8709,8715,8725,8730,8731,8749,8760,8765,8770,8780,8786,8790,8796,8802,10410,10411,10412,10419,10421]),edgeLength=new Uint8Array([3,3,3,3,3,3,3,3,5,8,8,2,2,3,3,3,3,3,8,5,5,5,5,5,3,3,5,5,9,12,19,8,19,8,11,9,9,8,7,7,6,8,9,16,10,7,7,11,8,6,6,9,7,11,7,14,4,4,4,4,4,4,10,7,6,6,6,6,10,10,6,10,10,22,11,9,10,10,10,9,10,8,7,7,7,8,21,13,11,11,9,10,9,13,10,8,8,9,12,9,7,10,7,7,13,7,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,8,6,3,3,3,3,3,3,2,5,3,3,3,7,2,2,2,2,2,2,3,3,3,1,1,7,8,5,2,2,7,2,2,1,4,1,11,9,9,5,5,8,5,5,5,5,5,5,5,3,3,3,3,3,5,11,9,9,13,7,14,7,6,6,6,7,6,6,6,6,6,6,10,7,11,9,4,4,4,4,4,6,6,6,6,13,6,8,7,10,9,9,7,9,8,9,8,7,10,6,9,8,10,10,7,8,1,9,10,12,12,12,10,9,9,10,10,9,9,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,4,3,3,3,7,4,4,4,3,3,6,7,3,4,1,2,2,2,6,1,2,2,2,2,2,12,5,3,8,9,13,4,4,13,9,9,11,7,3,12,9,2,2,2,3,3,3,3,3,8,2,2,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,3,7,10,15,15,7,15,20,15,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,8,6,8,8,6,8,13,8,8,6,13,8,11,13,8,6,13,8,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,9,9,9,10,14,14,11,13,13,9,9,9,9,9,9,2,6,9,2,2,3,3,3,3,3,3,3,3,3,4,4,4,2,3,3,3,3,3,3,7,7,2,3,2,2,5,3,3,3,3,3,3,4,2,2,2,2,2,2,3,3,3,3,3,3,3,4,5,7,4,2,2,12,8,10,8,10,7,18,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,2,3,3,3,5,5,3,8,8,6,8,6,6,4,6,7,7,7,10,11,2,5,5,3,3,3,3,3,3,5,5,6,11,10,7,7,7,4,4,4,2,3,3,3,3,3,2,2,7,5,5,3,3,3,3,3,3,3,3,7,7,7,11,7,6,9,6,6,8,10,8,6,8,13,4,4,4,4,4,10,8,11,8,8,8,10,10,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,10,13,7,8,7,11,8,8,6,9,8,8,6,6,6,8,8,6,6,6,6,6,9,7,6,4,4,4,4,4,4,4,6,6,6,9,7,8,10,8,8,2,3,3,3,3,3,2,8,9,9,2,2,2,3,3,3,2,3,3,3,9,2,2,3,3,3,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,5,5,3,5,4,2,3,2,4,3,9,2,2,2,2,2,5,5,3,8,8,13,6,10,9,4,7,9,11,2,3,7,3,3,4,1,3,4,2,9,3,3,12,5,3,7,10,10,7,4,4,6,14,7,9,7,13,2,2,2,2,2,2,3,3,3,3,3,8,15,4,4,2,3,3,3,7,4,9,9,2,3,3,3,5,3,2,2,7,2,7,6,6,7,2,4,2,2,2,2,2,2,8,8,8,9,5,2,3,3,3,3,3,3,10,7,4,4,4,4,3,4,2,3,3,3,3,3,10,7,4,4,4,4,2,3,3,3,3,10,7,4,4,4,4,3,9,6,6,6,9,13,9,2,2,2,8,7,9,5,3,3,3,5,5,13,12,9,10,7,8,7,6,8,6,11,12,7,10,4,4,7,8,11,6,7,9,8,7,10,8,9,15,7,8,5,4,7,2,3,3,3,2,14,10,2,14,10,2,14,3,9,13,13,10,14,16,17,11,2,14,2,14,3,9,13,10,14,16,17,11,14,10,14,2,7,3,10,7,14,10,2,14,10,9,9,17,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,10,10,10,12,9,4,10,10,11,8,8,8,7,9,5,3,3,3,3,3,3,3,3,5,8,4,4,4,4,4,4,6,16,3,3,14,3,14,2,14,9,13,10,10,14,16,17,11,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,9,9,9,9,9,9,2,14,9,13,10,10,14,16,17,11,6,14,2,14,9,17,13,10,10,14,17,16,17,11,6,2,14,9,13,10,14,17,16,17,11,2,14,9,13,10,14,16,17,11,2,14,9,13,10,17,16,11,17,2,14,10,19,7,2,14,9,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,16,17,11,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,17,13,10,10,14,17,16,17,11,6,3,2,14,9,13,10,10,14,16,17,11,6,9,10,12,14,14,14,12,12,12,12,12,14,14,14,10,10,10,14,9,9,9,9,14,14,14,13,13,14,9,9,9,9,9,9,4,11,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,17,16,17,11,2,9,10,10,7,17,3,3,12,12,16,15,15,12,14,14,14,20,20,13,12,12,12,12,12,12,20,25,14,14,12,12,10,10,10,10,14,9,9,9,25,4,9,17,10,7,14,16,21,13,13,14,20,14,13,17,24,9,12,13,25,13,21,20,17,9,9,9,9,9,9,12,17,4,4,9,9,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,9,10,14,12,12,14,14,10,9,9,9,10,14,14,14,9,9,9,9,2,1,5,8,7,11,11,1,3,3,3,5,3,3,4,8,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,4,4,4,4,4,4,4,4,4,10,2,2,6,7,6,2,3,2,3,6,2,7,6,10,7,4,9,12,6,14,4,12,7,2,2,1,2,7,6,4,4,4,6,8,8,7,2,2,13,2,2,2,2,6,2,8,12,2,7,7,6,8,10,12,2,2,2,3,3,13,2,2,3,3,6,7,6,4,5,6,3,3,3,3,4,16,8,5,4,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,12,7,7,13,9,10,17,12,8,9,7,17,17,8,5,12,10,13,14,5,5,5,13,5,5,5,3,3,3,5,16,5,5,5,5,7,12,14,8,12,8,10,12,9,11,7,9,7,10,7,13,9,7,12,8,17,7,7,16,10,13,13,8,10,10,14,17,7,16,16,15,8,10,10,12,17,17,7,17,14,7,10,17,8,7,7,7,8,15,15,7,14,10,10,10,11,11,7,7,13,8,10,7,16,7,8,7,14,17,12,10,11,21,8,9,7,13,9,8,6,13,6,12,7,6,13,10,10,10,8,18,9,17,13,10,12,6,13,6,11,8,13,10,13,18,13,11,13,8,16,7,10,8,16,12,10,8,8,14,11,8,15,8,8,7,7,12,7,8,9,14,15,8,9,10,9,15,7,8,8,12,13,9,10,15,13,7,10,10,20,7,6,9,6,6,14,11,14,11,12,9,10,16,16,12,7,11,28,8,11,10,7,21,8,7,9,4,4,4,17,7,8,6,9,6,6,13,6,6,6,6,18,20,14,8,11,12,9,10,13,15,15,19,8,9,12,7,10,16,12,9,9,9,14,12,11,10,9,12,11,18,9,9,9,10,7,7,16,8,9,7,13,12,10,14,18,7,8,11,7,7,8,8,13,7,7,7,11,15,13,11,7,8,15,11,7,8,18,14,13,18,15,10,12,12,9,7,11,11,8,7,10,8,14,12,10,18,7,10,9,7,8,13,10,14,10,8,8,23,7,7,11,12,12,17,7,7,11,11,17,16,16,7,8,11,14,14,8,10,7,7,16,16,13,9,11,9,15,15,11,11,7,7,14,7,9,7,7,16,10,13,10,11,14,7,11,10,11,7,11,10,11,15,11,15,10,12,10,14,13,11,11,12,13,10,7,13,10,16,12,21,15,9,10,10,7,11,14,17,7,7,8,11,13,12,8,15,14,14,8,17,12,10,10,7,9,11,7,10,7,11,18,7,11,7,12,11,8,8,14,12,7,8,15,3,7,7,5,2,9,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,5,3,3,3,3,3,3,4,4,3,3,3,3,3,3,5,11,6,4,7,10,7,7,11,1,10,2,2,3,3,3,3,3,3,3,3,5,7,3,5,6,3,3,5,2,2,5,3,4,13,11,3,3,6,3,5,14,2,2,3,8,2,2,12,5,18,5,3,3,3,16,5,5,5,10,7,13,12,13,9,12,14,19,9,9,21,9,9,10,6,9,6,15,10,6,12,8,6,10,15,4,4,6,6,9,9,12,16,14,23,7,7,7,14,9,7,7,11,14,10,7,10,10,10,12,6,11,10,13,11,15,11,7,12,10,3,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,3,7,1,5,2,2,2,5,5,5,5,3,3,3,3,3,5,5,10,9,11,8,7,12,8,9,7,6,13,11,6,13,7,9,9,4,4,4,4,4,6,10,7,8,13,8,8,9,14,7,8,10,7,7,7,9,6,9,7,2,12,5,3,3,13,4,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,4,4,4,4,4,4,4,4,4,9,3,3,3,3,3,3,3,3,3,3,4,2,2,2,5,3,3,3,3,3,3,3,3,4,4,1,7,6,4,12,3,3,3,3,3,8,7,3,3,3,3,3,3,4,4,11,15,14,2,8,3,5,5,8,10,8,6,4,7,17,7,4,5,2,6,3,2,2,12,5,5,3,15,13,8,11,2,2,3,3,3,3,3,3,3,3,4,4,5,3,3,3,3,4,18,2,12,5,3,3,3,3,3,5,16,8,8,9,6,6,4,4,4,4,31,6,6,10,11,21,10,9,7,10,7,7,2,4,4,4,4,6,5,3,3,4,3,3,3,3,3,3,3,3,3,6,6,6,2,2,2,5,3,3,3,7,7,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,8,2,3,3,3,3,3,5,9,11,3,3,3,3,4,4,3,3,3,3,3,5,10,9,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,11,10,10,10,10,10,11,10,11,10,11,10,9,9,11,3,3,3,3,3,3,5,3,7,8,8,7,6,6,11,4,4,4,7,8,9,9,2,3,7,4,4,2,5,5,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,2,2,5,5,5,5,5,3,3,5,5,5,7,7,6,6,6,4,4,4,4,4,4,4,4,4,4,6,6,8,8,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,6,9,12,3,7,10,7,2,2,3,3,3,3,3,4,3,3,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,6,6,8,6,7,4,4,4,4,4,4,6,7,5,5,20,19,8,10,9,7,10,6,8,11,6,6,6,6,13,12,8,6,7,14,11,9,2,5,3,6,2,3,2,2,2,2,2,2,2,5,4,3,7,6,4,7,4,3,6,4,7,2,7,7,7,5,5,5,5,3,3,3,3,3,3,3,3,3,5,9,10,10,11,7,8,20,7,8,9,8,12,6,6,6,8,9,8,12,6,6,8,13,10,12,6,6,7,7,9,6,4,4,4,4,4,4,10,6,6,6,7,14,11,10,7,8,10,8,11,14,11,11,9,7,9,8,11,9,17,10,9,2,2,2,9,3,3,3,3,15,14,9,5,5,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,12,22,19,17,18,18,19,21,7,16,16,5,5,5,5,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5,5,5,5,5,9,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,7,16,11,11,7,7,7,7,17,7,8,12,15,9,19,7,19,8,21,11,12,19,14,22,7,7,7,7,7,7,7,7,7,7,7,16,16,19,24,12,7,14,7,12,7,8,10,10,13,7,12,12,7,7,10,18,15,12,16,7,14,12,17,10,16,17,12,17,25,7,7,7,13,6,9,6,9,18,6,6,11,20,10,6,6,6,6,6,6,17,6,6,6,15,6,6,6,6,6,8,14,11,12,11,15,13,19,17,21,7,18,8,13,13,8,12,8,6,6,13,6,15,15,16,6,6,16,6,6,6,14,6,18,6,6,6,17,18,9,13,15,8,19,8,15,15,18,14,16,4,4,4,4,4,4,4,4,4,4,4,4,6,11,10,11,6,21,23,12,17,12,11,14,13,22,15,15,11,12,14,12,7,12,8,12,14,12,18,10,8,16,19,17,12,14,15,8,19,17,12,13,13,15,18,13,23,24,23,21,17,24,8,21,8,14,14,16,20,14,8,8,15,20,8,19,21,9,8,13,12,13,15,11,8,11,9,9,8,11,8,21,14,21,15,15,13,7,19,7,7,7,7,7,7,16,12,17,18,7,7,11,11,7,9,9,2,2,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,3,3,10,10,7,9,7,7,7,6,8,6,6,6,6,6,6,6,7,6,8,6,6,9,7,7,7,4,4,4,4,4,4,4,4,8,9,8,7,8,7,8,10,7,5,5,5,5,5,5,3,9,7,7,8,6,6,6,6,6,6,6,6,9,6,6,9,11,13,7,8,9,9,5,5,5,7,8,6,6,6,6,6,6,6,7,8,9,7,10,9,10,7,8,5,5,5,5,5,5,7,7,9,8,7,7,6,6,6,6,6,6,10,6,6,6,6,6,6,6,6,6,6,6,9,10,4,4,4,4,8,7,7,10,10,9,8,8,15,9,8,8,8,8,8,9,10,9,10,7,8,13,5,5,5,5,5,3,3,7,7,8,6,6,6,4,4,11,9,7,8,9,10,7,5,5,5,5,5,3,3,7,6,6,13,7,9,8,7,5,5,5,5,5,5,5,5,3,3,3,3,7,8,7,8,13,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,6,6,6,6,7,6,7,6,6,9,7,4,4,4,4,4,4,4,7,8,7,8,9,8,8,8,7,10,7,8,5,5,5,5,5,5,5,5,3,7,7,7,7,9,7,10,9,6,6,6,6,6,8,8,6,6,6,7,6,6,6,9,9,4,4,13,7,10,9,9,12,7,8,8,10,8,8,8,8,8,8,5,5,5,5,3,7,7,11,7,9,8,8,6,6,10,6,8,8,8,6,7,6,6,12,4,4,4,4,4,4,4,4,4,9,8,8,16,8,9,8,7,5,5,5,5,5,3,3,7,7,7,10,15,8,9,8,9,9,6,6,6,6,6,6,7,4,8,7,8,8,7,8,11,8,5,5,5,5,5,3,7,7,6,11,16,7,6,4,4,4,4,9,9,8,8,8,13,12,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,7,8,8,9,13,7,7,7,9,8,8,9,12,7,12,7,12,8,7,10,12,9,9,6,6,8,8,6,6,6,6,6,6,6,9,8,9,11,8,6,6,6,6,6,12,7,6,6,6,9,7,7,6,6,6,6,6,11,9,6,6,6,6,6,7,9,4,4,4,4,4,4,4,4,9,9,9,9,7,7,7,7,7,11,7,7,8,8,8,8,8,8,9,8,9,9,7,7,11,11,7,12,8,8,8,8,8,7,8,8,8,8,8,13,12,8,8,8,8,7,7,7,9,5,5,5,5,5,5,5,3,3,7,7,11,7,8,8,8,6,6,6,6,6,6,6,6,6,6,6,10,11,6,7,9,4,4,4,4,4,4,9,9,8,9,8,8,8,7,7,5,5,5,5,5,5,5,5,5,5,3,3,11,7,7,7,9,6,6,11,8,10,6,6,6,12,8,8,7,6,6,8,7,4,4,4,4,4,4,4,4,9,10,9,9,8,10,9,11,8,5,5,5,7,6,6,8,7,4,4,4,4,8,7,7,8,7,8,8,5,5,5,5,7,7,8,8,8,6,6,6,6,6,10,8,9,13,6,7,6,6,8,7,8,4,4,4,4,11,8,8,8,10,5,5,8,7,8,13,8,7,6,8,6,9,7,8,7,5,5,5,5,5,5,3,3,7,8,9,6,4,8,10,10,8,12,9,13,2,7,5,5,5,5,5,7,7,10,6,6,6,6,6,6,6,8,4,4,9,8,8,8,14,8,8,8,9,8,5,5,5,5,5,3,3,9,6,6,6,6,10,12,6,6,6,6,6,6,6,4,4,4,4,11,8,7,8,8,8,5,5,3,3,3,3,7,7,6,8,6,8,11,7,6,6,6,7,4,8,11,9,10,5,5,5,3,3,3,7,7,8,9,8,15,9,6,6,6,6,6,6,11,11,4,4,4,4,4,7,9,9,10,8,7,5,5,5,5,5,5,3,3,8,6,6,6,6,6,6,6,6,6,9,7,4,4,4,4,4,9,9,8,8,10,13,5,5,5,3,17,7,7,7,7,7,8,6,8,13,6,6,6,6,6,6,6,6,4,4,4,9,10,8,8,8,5,5,5,5,3,7,7,7,8,8,6,6,6,8,8,8,9,10,8,4,8,10,9,8,8,8,9,13,10,5,5,5,5,5,5,5,5,5,5,3,3,7,8,9,9,7,7,7,10,9,9,8,9,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,8,12,6,6,6,6,6,6,6,6,6,12,4,4,4,4,4,4,4,4,4,4,4,11,8,8,9,9,10,8,9,7,7,5,5,5,5,5,5,3,7,8,7,6,6,8,6,6,10,4,7,8,9,12,8,7,7,5,5,5,5,5,5,3,3,7,14,7,9,8,8,6,6,8,12,12,6,6,7,7,10,4,4,4,4,4,9,9,14,9,13,8,7,5,5,5,6,6,6,7,4,8,7,5,5,5,5,5,5,5,5,3,3,7,7,7,8,6,6,6,6,6,6,12,6,6,6,6,4,4,9,9,8,8,11,7,7,7,5,5,5,3,9,8,6,6,7,4,4,4,4,4,4,8,8,11,5,5,5,7,7,7,9,6,6,6,6,6,6,9,8,4,4,4,4,7,12,9,8,8,8,7,10,10,5,5,5,5,5,5,5,3,11,14,8,7,8,8,6,6,6,6,6,8,7,6,6,6,7,6,8,9,4,4,4,7,8,9,7,9,7,7,9,8,5,5,5,5,5,5,5,5,5,11,3,9,7,7,12,14,8,6,6,12,11,8,6,6,6,6,6,6,6,6,6,15,7,4,4,4,16,9,9,9,8,9,9,9,9,9,8,8,8,13,11,8,5,5,5,5,3,7,6,6,8,8,8,6,6,7,10,7,4,4,4,4,9,7,8,7,7,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,7,7,7,9,6,6,6,6,6,8,8,7,7,9,6,6,6,7,6,6,6,6,6,15,4,4,4,4,4,8,8,7,8,12,9,8,8,8,8,8,9,8,8,10,8,8,8,8,16,9,10,2,5,5,5,5,5,5,5,9,7,6,8,9,4,4,4,4,4,7,8,8,8,9,8,11,10,5,5,5,5,3,7,8,6,6,6,6,6,8,6,6,6,6,4,12,10,12,7,7,7,7,7,7,7,5,5,5,5,3,3,7,7,10,8,9,7,6,10,7,6,6,4,4,8,9,7,9,9,9,9,8,8,8,8,10,5,5,5,5,5,5,8,7,6,6,6,10,6,7,10,7,4,4,4,4,4,4,4,12,9,10,7,7,10,8,10,5,12,9,6,6,6,6,6,7,6,4,4,4,10,9,9,8,7,7,5,5,5,5,5,5,3,3,13,7,7,9,7,7,7,8,9,9,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,15,15,4,4,4,4,4,10,10,9,8,9,8,8,9,7,8,7,8,5,5,7,6,6,6,4,4,4,7,8,11,8,5,5,5,5,5,5,5,7,6,6,6,6,6,6,9,11,10,7,4,4,4,9,8,8,5,5,5,5,5,9,9,6,6,6,6,6,6,6,9,9,4,4,4,4,8,8,8,9,9,8,8,8,13,2,4,2,7,5,5,5,5,5,5,9,9,6,6,6,6,10,8,8,8,6,6,6,4,4,9,8,10,8,9,8,8,8,9,8,8,5,3,3,3,11,6,6,6,7,6,6,6,4,4,9,8,5,5,5,5,5,3,11,8,6,6,6,6,6,9,7,4,4,14,10,9,8,12,8,8,8,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,10,10,7,7,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,3,7,11,7,7,11,11,7,8,9,10,7,7,9,9,9,9,7,7,10,8,13,8,8,8,8,11,10,6,6,8,10,11,14,14,6,6,6,6,6,6,9,11,7,7,6,8,12,11,11,6,6,10,6,6,6,6,6,10,7,7,6,6,11,6,6,6,11,8,9,7,6,10,11,9,10,11,7,11,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,6,6,8,9,10,9,6,6,6,10,6,6,6,6,11,10,11,10,9,8,7,7,7,7,11,14,8,10,9,9,8,8,7,11,8,8,8,11,11,10,10,9,10,8,11,10,8,11,9,12,8,10,8,11,8,9,9,11,11,10,11,13,8,7,8,8,9,7,8,8,8,8,7,8,2,2,2,2,2,2,2,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,8,6,4,4,4,11,7,11,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,3,3,3,3,8,7,7,8,8,4,8,7,7,7,9,7,8,9,8,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,4,5,5,3,3,8,8,6,9,4,4,10,7,3,3,3,2,5,3,3,3,3,3,3,3,3,3,3,3,3,4,3,2,2,2,3,3,3,3,3,4,10,2,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,2,2,3,3,3,5,2,4,2,6,2,2,9,5,5,3,3,3,3,3,3,3,5,5,5,9,8,7,9,6,6,11,4,4,4,4,4,4,4,4,6,6,7,7,11,8,8,6,5,11,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,6,4,4,4,4,3,3,3,3,5,7,2,3,3,3,3,3,8,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,4,4,4,4,2,2,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,2,3,3,3,3,3,6,3,3,8,10,3,4,4,1,1,1,1,1,1,1,8,9,10,7,7,1,14,18,13,18,13,10,10,16,13,18,16,13,16,18,13,22,16,16,16,14,21,16,9,14,16,9,9,14,10,10,14,12,14,19,12,11,18,13,17,15,15,15,15,16,14,13,19,18,15,19,18,12,18,12,11,20,14,15,10,17,17,16,19,20,21,15,13,16,15,15,15,1,1,3,8,7,7,8,8,8,1,6,1,1,6,3,3,4,7,3,3,5,5,4,4,4,4,4,2,7,7,8,12,3,4,5,1,3,4,4,10,4,3,3,3,8,7,7,2,2,2,2,2,2,2,2,2,12,9,20,7,5,5,5,9,13,5,5,5,5,5,3,3,3,16,5,5,5,13,7,8,8,11,8,7,9,7,11,12,9,9,8,8,11,10,14,7,12,10,11,13,7,9,11,17,17,14,13,7,8,7,10,10,7,16,13,7,8,17,12,9,8,6,7,10,6,6,12,6,8,10,8,8,8,6,8,6,14,6,6,6,13,6,10,6,6,7,14,8,6,6,10,11,10,9,9,7,7,6,6,6,9,9,7,9,10,9,13,12,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,6,8,9,10,9,7,10,10,8,7,8,7,10,12,9,8,15,8,7,8,8,7,7,15,13,7,10,9,14,18,16,7,24,7,8,10,11,16,8,14,7,9,9,9,13,19,14,15,14,11,7,13,9,10,7,13,9,10,11,12,8,9,2,3,5,8,7,4,4,15,10,5,3,3,3,3,3,5,4,4,4,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,4,2,12,5,3,8,10,15,6,7,2,3,2,5,5,12,2,5,5,5,5,2,2,5,5,12,9,5,2,2,9,5,5,12,12,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,12,5,8,8,9,5,5,5,8,19,7,16,15,14,9,9,9,9,7,11,11,11,7,14,10,10,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,12,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,12,9,9,12,12,12,15,7,11,7,14,11,18,13,8,18,15,18,12,14,12,8,8,8,8,9,9,9,12,7,10,10,8,8,12,12,12,7,12,12,9,7,7,7,7,7,8,15,12,9,10,10,7,10,10,13,11,10,9,22,11,9,8,8,8,8,8,13,18,13,9,15,19,9,7,7,10,7,7,7,11,8,13,17,7,7,10,10,10,7,20,16,7,7,7,7,7,7,11,21,12,12,13,11,14,16,8,8,13,11,7,7,13,7,7,14,15,15,6,6,6,6,6,6,6,6,6,6,13,10,18,6,6,6,6,6,6,6,6,6,11,8,8,12,12,11,11,8,12,9,9,9,13,13,9,9,9,9,9,9,6,10,12,6,6,6,6,17,11,7,7,7,7,14,14,12,6,7,7,6,6,15,10,13,10,6,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,9,15,13,6,12,12,6,19,11,10,7,7,16,8,19,17,9,9,9,9,9,6,6,6,10,8,16,8,6,6,9,6,6,6,6,6,6,6,6,8,8,8,6,7,6,6,6,6,6,6,6,6,6,6,6,14,6,6,6,6,20,6,9,6,14,9,9,9,6,9,8,8,12,9,8,8,8,8,7,8,12,7,8,8,8,6,8,6,6,6,6,6,6,6,9,8,8,6,6,13,9,12,13,12,14,13,12,11,11,6,8,8,8,6,13,12,11,11,12,6,11,12,11,13,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,6,6,6,6,6,6,6,13,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,6,18,6,12,13,13,13,9,10,15,9,12,6,6,6,6,6,6,6,6,9,15,10,9,10,13,9,19,8,18,17,10,10,8,8,6,6,6,6,6,6,10,14,8,16,16,9,8,15,8,8,10,12,14,7,7,8,8,7,7,7,7,8,13,13,11,9,9,9,12,10,17,8,11,9,7,7,14,8,14,14,7,7,7,7,7,7,14,7,7,7,7,7,10,10,8,14,7,7,7,7,8,8,8,8,8,17,9,7,15,7,8,12,7,9,14,7,7,7,9,13,8,14,7,16,18,13,15,14,12,13,10,15,9,7,7,7,10,13,15,15,9,9,9,9,19,11,7,11,11,13,8,8,8,8,7,12,19,17,9,9,13,7,7,7,9,7,7,7,12,13,15,10,8,8,14,15,12,13,13,8,12,14,7,11,7,14,15,13,12,8,8,8,8,11,13,15,15,8,13,12,8,8,8,13,10,16,14,11,8,8,12,12,9,15,15,12,12,13,8,8,9,12,13,9,8,8,8,8,8,8,8,8,8,8,8,11,12,11,7,14,7,13,13,13,12,18,16,7,12,11,10,10,15,9,9,9,21,7,7,7,11,16,8,8,11,11,7,7,7,7,7,19,7,7,7,7,7,7,7,7,7,12,8,9,12,14,11,9,9,9,22,12,3,3,4,8,8,15,4,2,2,5,5,3,3,3,3,3,3,6,6,4,4,4,12,7,10,2,3,3,3,3,3,3,3,6,7,3,7,5,14,4,4,7,8,10,4,1,3,3,6,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,5,3,4,2,2,2,2,2,2,11,5,5,5,11,5,5,3,5,5,5,5,11,14,13,9,11,9,12,8,11,11,8,11,16,9,9,7,10,9,12,8,15,6,7,6,6,13,10,8,11,8,6,6,6,12,16,6,11,7,8,9,18,6,6,9,4,4,6,13,6,6,6,6,8,8,9,16,7,7,14,7,8,8,8,7,7,7,7,7,7,15,13,7,10,7,7,10,12,16,15,7,9,9,14,11,11,10,9,10,8,12,7,8,7,7,10,12,7,12,8,7,2,3,3,3,3,3,3,3,3,3,3,5,3,3,5,5,5,10,4,8,7,10,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,7,4,5,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,8,2,2,2,8,12,7,7,5,5,5,5,5,5,5,5,5,5,5,5,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,7,11,9,8,8,8,7,8,9,7,7,9,7,7,7,10,7,7,10,9,10,6,6,6,6,6,6,15,7,8,9,9,8,6,6,10,9,6,8,13,9,7,6,6,6,6,6,6,12,6,6,7,6,7,6,6,6,10,10,7,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,14,6,6,7,7,9,6,6,6,6,9,9,8,9,10,9,8,9,12,7,7,7,8,7,10,12,11,9,10,7,7,7,9,10,10,8,12,9,7,7,9,8,8,8,10,7,7,8,9,9,7,7,7,8,2,4,6,3,4,2,3,3,3,3,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,3,3,3,3,3,3,3,3,5,8,6,4,7,3,3,3,3,3,3,3,12,3,3,3,3,3,3,4,4,2,3,5,3,4,7,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,3,3,6,4,3,4,2,2,2,5,3,3,3,3,3,5,4,4,4,4,7,6,8,9,2,2,2,2,3,3,3,5,7,2,3,3,8,7,7,2,2,8,5,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,7,7,6,10,6,9,7,11,4,6,8,8,7,8,4,5,5,5,5,3,3,11,8,9,6,6,8,7,4,4,7,8,7,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,7,2,2,5,3,3,2,3,3,3,3,3,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,12,5,5,3,3,3,5,10,12,6,15,4,6,6,7,14,9,3,3,3,3,3,8,2,2,3,5,5,3,3,3,3,3,3,8,8,8,7,5,8,4,6,11,2,2,7,3,3,2,9,8,5,5,3,3,3,5,5,7,7,6,6,10,6,8,6,8,9,7,4,4,4,4,7,6,6,7,7,10,9,8,11,8,3,3,3,3,3,4,4,2,3,3,3,3,3,7,6,2,5,6,7,6,4,8,9,11,2,2,3,3,3,3,3,3,3,2,2,5,3,3,3,3,3,9,9,6,4,8,7,7,5,9,8,6,2,8,7,8,5,5,5,5,5,3,3,3,16,8,7,7,7,8,7,7,7,7,9,6,9,6,10,7,7,7,6,10,8,9,11,11,8,4,4,10,8,8,6,9,6,11,8,8,8,15,7,8,9,5,3,3,3,3,3,5,2,2,3,8,9,10,3,2,2,2,2,2,2,3,6,4,2,2,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,11,5,3,3,3,3,3,3,3,3,6,7,4,4,2,3,3,3,3,3,3,3,3,12,7,4,12,4,6,5,4,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,3,4,4,11,10,6,4,6,10,8,3,3,3,3,3,3,3,3,5,4,4,4,2,2,2,2,2,2,2,2,5,3,4,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,5,5,5,5,5,5,3,3,3,3,3,3,3,3,7,8,8,7,13,12,10,10,8,8,7,7,9,12,11,6,6,8,8,9,7,7,7,10,15,10,4,4,4,4,4,11,8,8,9,7,9,14,14,12,2,2,2,2,2,2,2,3,3,3,3,3,12,5,5,5,11,10,7,9,3,8,7,3,15,13,11,4,4,2,2,2,19,7,5,5,3,3,3,3,3,3,3,5,22,18,6,14,17,4,4,19,16,18,2,3,3,7,2,3,2,3,3,6,4,2,3,3,2,5,3,3,3,3,3,3,3,9,9,2,3,2,2,2,3,3,3,5,7,14,7,7,12,9,13,6,11,6,10,9,7,7,8,12,12,8,8,8,10,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,5,8,10,7,8,11,8,12,9,4,14,7,7,9,13,2,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,3,3,3,3,5,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,3,2,3,3,3,3,5,2,2,2,2,5,5,5,5,3,3,3,3,3,3,3,3,3,7,7,7,7,7,8,8,8,8,8,12,9,8,8,9,8,6,17,6,6,6,8,8,6,6,6,6,6,6,6,6,6,6,6,7,4,4,8,8,9,9,9,7,7,7,7,7,7,7,9,9,9,7,8,8,8,10,7,13,10,8,9,3,3,5,13,3,3,3,3,3,7,7,6,6,10,13,11,11,8,8,9,8,9,9,10,10,10,11,10,10,13,13,16,15,11,12,9,9,10,9,11,10,9,9,14,7,8,3,10,7,7,3,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,2,3,3,3,3,3,3,3,3,4,11,6,7,4,6,2,2,3,3,3,1,3,3,3,3,3,3,6,4,4,2,2,2,3,3,3,3,4,4,6,6,6,6,5,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,11,6,10,9,12,7,7,11,14,9,7,12,3,3,7,12,11,12,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,5,5,5,5,5,5,5,5,11,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,3,10,3,3,3,11,3,5,9,11,8,12,14,9,7,8,7,7,11,11,7,7,10,9,8,10,9,7,7,7,7,7,7,8,8,7,11,8,8,8,7,7,10,8,7,13,12,7,17,10,8,8,11,7,11,11,14,7,11,7,8,6,9,20,8,7,9,16,7,10,6,11,10,8,9,7,16,11,11,9,8,9,8,8,8,11,8,15,8,8,9,7,8,8,11,10,7,5,7,10,10,15,7,7,7,8,7,8,8,10,11,10,10,10,11,11,7,8,6,8,8,8,10,6,8,6,6,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,16,6,15,6,7,11,11,7,9,10,11,13,10,6,16,8,10,12,11,6,6,6,6,6,6,6,10,6,10,7,7,7,11,7,11,6,6,6,6,6,6,17,7,7,6,6,12,22,6,6,6,6,6,8,6,6,6,6,7,6,6,5,6,6,8,11,6,9,14,11,9,11,7,7,8,6,6,6,8,10,9,6,6,6,6,9,7,6,6,6,6,6,15,6,4,4,4,6,4,17,8,11,6,6,9,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,6,6,6,6,10,6,10,6,6,6,6,12,8,6,6,6,6,6,6,6,6,6,9,6,6,6,6,18,6,6,6,8,9,10,7,8,9,10,11,7,13,6,8,8,6,6,14,7,7,7,7,10,7,14,9,6,6,9,15,9,7,14,6,11,14,13,7,12,8,7,7,7,7,7,12,7,10,9,16,6,8,6,5,17,6,8,10,4,6,4,10,15,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,4,4,11,7,4,4,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,19,17,6,10,11,6,6,6,6,18,6,6,11,4,4,4,5,6,6,6,9,5,6,4,6,6,4,6,6,6,6,10,6,6,4,6,6,10,6,10,6,6,6,6,11,6,6,10,6,6,8,6,6,6,8,6,11,4,11,9,10,9,11,4,8,4,11,12,7,9,8,6,7,7,8,12,12,11,13,10,11,7,7,7,9,7,11,10,7,7,7,16,11,10,11,17,9,9,8,8,7,7,7,9,7,7,7,14,7,13,9,11,10,14,10,10,12,11,10,7,10,5,14,8,8,8,9,7,8,7,7,9,8,7,8,7,7,7,7,7,7,7,11,8,10,8,7,8,14,11,8,9,9,9,8,24,10,10,12,7,7,15,11,8,8,12,11,8,9,9,7,8,9,10,11,10,11,7,12,7,7,11,9,8,14,13,12,8,11,10,8,8,7,7,14,9,10,8,9,11,7,14,8,8,13,8,8,12,7,10,14,14,11,9,10,9,9,7,7,11,11,13,9,13,5,5,5,7,9,5,11,12,14,8,7,7,11,10,9,7,8,8,7,10,11,11,5,5,7,5,5,5,7,7,15,7,7,8,7,15,12,12,10,7,8,7,11,7,7,7,23,11,8,8,11,10,7,8,11,7,19,7,7,6,9,9,9,11,3,4,7,8,6,6,4,10,8,2,2]),edgeChild=new Uint16Array([0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,17,1,1,1,12,1,12,1,12,13,1,1,1,1,12,1,12,1,1,1,1,1,14,21,1,1,1,1,1,1,1,19,12,1,1,1,1,1,1,1,1,20,1,1,1,16,18,1,1,15,1,1,1,1,12,1,1,1,1,1,1,1,1,22,1,1,1,1,12,1,1,1,1,1,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,1,24,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,12,12,12,12,1,32,0,0,0,1,1,1,1,35,34,1,1,1,1,1,33,1,1,1,1,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,39,40,0,0,0,0,12,1,1,1,12,1,1,1,43,45,45,45,43,45,43,43,44,45,43,45,43,43,43,43,43,43,45,43,43,44,43,43,43,43,45,46,46,44,45,43,43,43,43,43,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,49,51,49,49,49,51,49,50,49,52,49,50,50,49,49,49,50,52,50,52,49,50,50,12,54,54,53,55,50,52,49,49,47,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,59,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,66,67,12,1,1,65,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,76,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,12,1,1,1,1,89,1,91,1,1,1,1,1,1,1,1,94,1,1,1,1,1,1,1,1,1,1,1,1,0,1,97,97,1,1,12,1,100,1,1,1,1,1,1,1,98,1,99,1,101,1,1,1,1,1,102,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,110,111,1,1,1,1,1,1,113,113,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,121,122,1,1,1,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,126,123,125,120,1,124,1,1,114,1,1,1,1,117,1,127,1,1,1,1,1,1,119,1,108,1,109,1,12,128,106,112,1,1,1,1,1,107,115,1,12,12,12,118,116,1,1,1,1,1,1,0,0,0,0,1,12,12,1,1,1,1,1,12,134,1,1,1,1,1,1,1,1,1,1,1,12,136,1,1,1,1,1,1,1,1,137,138,12,12,135,133,45,45,140,49,49,139,142,141,1,1,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0,0,0,1,0,144,132,1,0,1,1,12,12,1,1,1,1,1,0,0,0,0,0,0,0,1,148,147,20,1,1,12,12,1,20,12,12,1,1,1,1,1,134,1,1,152,1,1,1,1,153,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,1,136,1,1,152,1,1,1,1,153,1,1,1,134,1,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,157,1,1,1,1,1,134,1,1,1,1,1,1,1,1,134,1,1,157,1,1,157,1,1,1,1,1,1,1,163,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,1,1,1,1,1,136,1,1,152,1,157,1,1,1,153,1,1,134,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,1,152,1,157,1,1,1,153,1,1,1,134,1,1,152,1,1,1,1,169,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,172,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,157,1,1,1,1,167,159,159,12,1,12,171,1,1,1,1,1,160,160,160,154,1,1,1,158,160,164,170,1,1,1,1,158,158,1,1,156,154,167,158,162,175,166,175,1,1,173,1,166,155,158,1,1,1,1,158,1,161,1,1,1,12,1,176,1,165,1,1,1,165,164,168,174,156,167,1,1,1,1,1,1,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179,178,178,179,178,178,178,178,180,180,178,178,179,178,179,178,178,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,182,12,1,12,12,12,12,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,195,1,197,198,196,195,195,1,1,201,1,202,200,1,12,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,213,195,195,195,195,213,1,1,1,1,216,217,215,1,1,1,1,1,1,219,219,1,1,1,219,219,221,222,220,1,224,1,1,1,1,12,230,231,232,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,199,203,1,1,1,1,151,1,1,1,1,1,1,1,1,1,1,1,227,1,1,1,194,1,1,1,1,238,1,1,235,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,12,1,1,1,1,1,1,1,1,185,210,1,1,1,206,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,192,1,1,1,1,1,1,1,211,1,1,1,1,226,1,1,1,1,177,1,214,1,209,1,1,1,212,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,190,1,12,1,1,12,1,1,1,1,193,1,1,1,208,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,239,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,225,1,1,1,1,1,12,1,1,1,1,1,1,1,1,184,12,1,1,1,187,12,1,1,1,1,1,1,1,229,1,1,1,1,1,1,1,1,1,1,186,1,1,1,1,1,1,1,234,1,1,1,191,1,1,1,207,1,12,1,223,204,12,1,1,1,1,1,1,1,1,1,1,211,1,1,1,1,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,181,1,1,1,1,1,1,1,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,236,1,1,1,1,1,1,1,1,1,1,12,1,237,1,1,12,1,1,1,1,188,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,228,1,1,1,1,183,1,1,1,1,1,1,1,1,1,1,1,218,1,1,1,12,12,1,1,1,1,1,1,1,1,1,233,1,1,12,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,249,0,0,0,0,0,250,0,0,0,0,0,0,1,12,1,1,1,254,1,1,1,0,255,252,253,1,1,1,1,1,1,260,1,262,1,1,1,1,1,1,1,1,1,1,1,258,1,1,1,1,1,264,1,1,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,263,1,1,1,12,1,1,1,1,259,1,1,1,257,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,261,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,12,1,1,1,12,1,1,270,13,1,1,1,12,12,267,268,1,1,1,1,269,1,1,12,1,1,1,1,1,1,1,271,1,1,12,16,1,1,1,1,1,1,272,1,1,1,12,12,1,1,1,1,1,1,272,12,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,285,285,1,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,178,1,290,291,1,12,1,1,1,1,12,293,1,1,292,1,1,295,1,1,1,1,1,1,0,1,1,1,299,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,310,0,0,311,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,12,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,59,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0,335,0,0,0,0,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,12,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,353,353,354,353,0,205,1,1,13,349,1,347,0,0,0,0,0,0,0,350,1,1,355,1,235,1,1,1,1,348,1,345,1,351,1,343,1,352,1,344,1,1,1,1,1,1,1,12,1,1,1,1,12,346,346,1,1,1,194,1,1,12,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,12,1,1,1,1,342,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,358,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,295,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,398,398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,366,377,1,1,365,400,1,371,1,1,363,395,1,1,381,362,367,1,1,1,374,405,383,1,1,1,1,1,1,384,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,393,397,0,0,79,1,1,0,391,368,404,369,372,379,1,394,0,1,0,79,388,386,1,0,0,1,1,1,0,0,0,0,407,1,1,378,1,79,1,0,1,1,1,410,1,0,0,79,385,0,1,364,1,1,1,0,1,1,387,1,0,1,1,1,0,1,412,375,1,1,0,1,0,0,403,0,1,1,1,79,396,1,1,392,389,1,1,1,1,1,1,1,1,1,1,1,370,1,1,1,1,1,1,1,1,1,1,1,402,0,79,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,406,1,1,1,0,0,409,0,0,0,1,382,1,0,79,408,1,0,0,0,0,411,1,1,0,0,1,0,1,0,380,0,376,0,1,1,1,0,1,1,0,399,373,401,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,12,1,1,1,12,427,427,1,1,12,12,1,427,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,439,1,1,0,1,1,1,1,235,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,457,457,1,1,0,0,343,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,470,1,469,1,1,1,1,1,1,1,1,1,474,1,12,12,1,1,1,1,1,12,1,1,1,1,482,1,1,1,484,1,1,1,1,1,1,1,1,1,1,481,1,476,1,1,1,1,463,1,1,1,1,1,1,1,1,477,12,1,1,1,1,483,1,1,1,478,472,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,343,1,460,1,1,12,480,1,1,343,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,465,1,1,1,1,1,1,1,1,1,1,1,483,1,1,1,1,343,1,479,1,1,1,473,467,1,1,1,1,1,468,1,485,471,1,1,1,1,1,466,1,1,1,1,1,1,1,1,1,461,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,475,1,1,1,1,1,1,1,1,1,1,1,1,464,1,1,1,1,1,462,1,249,486,1,1,1,1,1,12,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,0,492,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,1,67,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,496,496,496,496,496,496,496,0,496,496,496,496,496,1,496,496,496,0,496,496,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,501,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,508,503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,502,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,506,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,1,1,1,1,1,1,1,518,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,229,229,1,522,1,1,1,521,1,1,1,1,517,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,519,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,523,1,1,520,1,1,1,1,1,1,1,1,398,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,524,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,535,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,12,1,537,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,12,12,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,59,1,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,556,1,1,1,1,1,1,1,557,1,1,1,1,1,1,1,555,1,1,12,1,1,559,268,1,1,12,12,1,1,12,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,569,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,132,1,12,574,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,107,1,1,12,1,1,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,579,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,144,1,1,1,257,1,1,12,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,604,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,249,1,354,1,1,1,1,1,1,1,1,1,0,0,609,1,1,1,1,0,611,0,79,0,610,0,1,1,1,0,1,1,1,1,1,1,12,0,0,0,1,0,1,0,0,0,0,0,0,618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,613,613,0,617,615,613,613,613,613,613,619,613,613,623,613,613,613,613,613,613,613,613,613,613,620,617,613,613,617,613,613,613,613,613,613,613,613,613,613,613,613,613,615,613,613,613,613,613,621,613,613,613,613,613,613,0,0,0,1,622,1,1,1,1,616,1,1,1,1,1,614,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,12,627,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,12,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,64,307,333,438,565,0,4,68,265,283,309,334,360,414,440,0,529,549,566,629,9,0,60,88,424,436,456,607,0,527,548,562,644,0,30,6,0,491,530,634,592,70,0,7,312,284,415,493,443,568,79,630,0,608,336,445,495,9,105,315,536,6,30,0,338,79,417,79,513,10,6,131,277,302,0,645,539,0,595,0,63,6,6,280,95,2,459,425,437,628,0,6,0,6,313,103,6,593,531,570,0,494,416,300,314,8,71,104,631,573,418,339,327,446,146,74,317,577,540,633,596,361,356,509,6,75,149,11,0,278,552,578,597,544,582,602,643,36,6,289,322,359,331,247,30,558,585,247,41,245,294,323,332,433,450,511,301,0,73,594,0,430,444,326,79,276,79,0,612,576,534,319,448,79,419,413,0,0,0,9,587,603,246,0,451,434,561,546,605,647,85,247,42,324,422,452,601,0,541,320,303,79,244,80,28,416,30,6,420,357,330,636,624,554,581,543,0,287,81,30,432,449,0,30,453,0,248,625,547,9,435,454,247,277,86,251,626,606,589,512,455,423,279,256,87,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,82,0,129,0,0,84,580,0,0,0,0,0,0,0,27,0,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,533,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321,0,0,0,0,0,0,0,649,0,0,0,0,0,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,525,0,0,0,0,0,0,431,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,298,308,0,0,0,0,0,560,304,0,0,0,0,0,0,0,0,0,0,0,0,0,542,0,0,0,0,0,0,0,0,0,0,0,487,0,0,0,341,0,0,0,0,0,0,282,0,0,0,0,0,0,23,0,0,0,0,600,0,0,0,0,632,551,0,0,0,0,273,0,0,0,0,0,0,489,0,0,510,0,0,0,0,0,61,0,0,0,296,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,275,0,0,0,0,0,306,642,0,72,0,0,0,0,0,0,0,0,0,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,0,305,0,0,0,0,0,0,599,0,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,598,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,532,0,0,0,0,0,586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,83,0,0,0,0,0,0,0,0,0,0,0,0,516,0,515,0,0,0,0,0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567,0,0,0,0,0,0,0,0,325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,266,0,0,0,0,0,0,0,0,0,0,84,0,638,0,0,584,0,0,0,0,0,0,0,0,0,274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,550,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,646,0,0,458,0,0,0,0,0,0,0,0,0,0,0,0,429,0,0,0,575,0,93,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,29,92,0,0,0,0,0,0,0,0,0,0,0,0,318,0,0,0,243,0,0,0,0,0,0,590,0,0,0,0,130,0,0,0,0,0,591,0,0,0,0,0,0,0,441,447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,426,0,340,0,0,0,0,0,5,0,0,0,0,0,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0,0,564,0,0,0,442,0,0,428,0,0,0,0,0,0,635,0,0,0,571,0,0,90,0,572,0,0,0,0,0,0,0,0,0,0,538,490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,639,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,588,0,0,0,0,0,0,0,0,0,0,329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,637,0,0,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655,655,655,655,655,655,655,654,656]),labelText="orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashretoolvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitglideossnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webapptransfer-webappairflowtransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxysiteacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetinteduaéroportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetjenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz網絡网络公司orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9consent-portals3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websitebedrock-agentcores3-object-lambdaexecute-apibedrock-agentcores3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1eu-west-3eu-south-2ap-southeast-3eu-central-1ca-central-1ap-northeast-1ap-southeast-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5eu-west-1us-east-1ap-east-1sa-east-1csrframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appss3-websitekrkrobjectprivateobjectkrkrskrkrsobjectkrprivateobjectkr-privatecomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalsgkrobjectstoragedesgkrusobjectkrkr-naverkr-naver-devkrprivatewebsiteobjectkr-naverkr-privatekr-naver-devjpjpkrjp4jp5s3-website-jpjpkrjp4jp5objectprivateobjecto365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsitefin-ncloudstoragegov-ncloudstorageappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urlnclouddyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappncpstorageherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisoramazonlightsailservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudncloudstorageis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectgünstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsgünstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjects*teamst3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idptransfer-webappeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformhäkkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra教育敎育網絡网絡组織組織网络網络组织組织公司政府個人个人箇人ltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormyᬩᬮᬶmilwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedgeايرانایرانjclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinosüdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforlì-cesenatuscanyvallée-d-aostemantovavallée-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavalléedaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentinsüd-tiroltrentinosüd-tirolmonzabrianzatrentino-südtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevalléeaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-süd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforlìcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentinsüdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-südtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-süd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzasüdtirolreggiocalabriatrentinoaadigetrentin-südtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forlìvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforlìtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-südtirolbalsan-südtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara長野京都岐阜大阪三重群馬千葉滋賀佐賀奈良adednelgaccogogror秋田愛知高知埼玉沖縄栃木熊本岩手青森山梨新潟島根鳥取長崎香川宮城石川大分宮崎茨城山口兵庫山形徳島広島福島福岡岡山富山静岡愛媛福井東京xn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste北海道penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez神奈川鹿児島和歌山bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalervålerxn--vler-qoaossandeheroysandeherøybøboheroyherøyxn--hery-iraxn--b-5gavalerbøboxn--b-5gasandesandexn--hery-iraxn--vler-qoavålerhåreålaahavaofsfvfhlolnlalrlhmfmtmahcostntbuåstrmreigersundmyspreadshopgálsáeidsvolltingvollgildeskalflorøvadsøvardøvanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-landsøndre-landtjieltexn--vrggt-xqadsør-aurdalsor-aurdalheradstordmoldefordeførdeseljefedjeryggehemnexn--krehamn-dxasognegranesøgnebrynetjomevallebykletokkegiskedovretjømehobølvoldasaudatolgasømnaviknadønnasomnadonnatranafrananesnaraumasmolatrænafrænalesjasmølaørstaorstahitrafloraaukraloppafrøyarissasnasahalsagalsaromsaraisaráisafroyasnåsagronghobolfjelltydalårdalardalaskimharamkraanghkekråanghkesorumbarumhurumbærumsørummodumsálátbálátfrognbjugnvåganvagangulenskienløtenlotenstrynvefsnxn--merker-kuaskaunsveiobømlobomloskjåkvardoflorovadsosalatbalatsálatklæbuklabuselbubarduulvikskjakklepprisørxn--nttery-byaeflåeidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnesåsnesrørosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyradøyandøyrødøymeløyaskøylurøydyrøymåsøyværøynærøyhoylandethøylandetdivtasvuodnalørenskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunjárgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkvæfjordsongdalenmjondalenmjøndalenxn--gls-elackragerogáŋgaviikagangaviikasørreisasorreisasør-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikrøyrvikroyrviksvelvikvenneslaevje-og-hornnessandnessjøenmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabrønnøysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontrøgstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hvegårsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenjárgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkrødsheradkrodsheradkvinnheradbrønnøyxn--mtta-vrjjat-k7afxn--lrenskog-54akvitsøyvárggátkarlsøyosterøyinderøyhamarøybronnoysundxn--aurskog-hland-jnbbahccavuotnabáhccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvmålselvxn--unjrga-rtamøre-og-romsdalmore-og-romsdalhareidmelandørlandorlandstrandålgårdsolundalgardafjordåfjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesnåasesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-totenøstre-totenvestfoldxn--mely-iraálaheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordjølsterjolsteraremarkhedmarknååmesjevuemienaamesjevuemiexn--vard-jrarollagmeråkermerakerorskogørskogxn--bdddj-mrabdákŋoluoktaxn--osyro-wuaaknoluoktatrysilskjervøymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdallærdalhurdalsirdalverdallerdallardaloppdalåseralaseralhadselkragerødivttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettromsøxn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblbájddarbajddarxn--laheadju-7yarennesøyxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordbåtsfjordbatsfjordmuosátbievátloabátkárášjohkanøtterøyxn--mjndalen-64anordkappláhppilahppialstahaugsiljanverranrøykenroykenhaldenlyngenbergenhortenhønefosshonefosstroandinbeiarnvarggatosoyroosøyrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyaskánitskanitraholtråholtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandjørpelanddeatnuringsakersør-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstjørdalnaustdalhjartdalgjøvikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdrøbakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iramálatvuopmimalatvuopmitysværkirkenesbirkenesmoskenesbáidárxn--fjord-lraxn--rdal-poabahcavuotnabáhcavuotnaxn--frde-gralindåsbearalvahkixn--hobl-iraráhkkerávjuxn--loabt-0qavågåáltábodøsundlundraderådeetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvamåmliamlibokntinnroangranosenoslobodorøstroststatåmotamotivguprivøyeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerhábmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularhápmirhapmirmelhusfosnesøksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergtønsberglindasxn--sndre-land-0cbnamsosxn--srum-graøystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26fčáhcesuolocahcesuoloakrehamnåkrehamnsandøykarmøyfinnøytranøyvågsøyaverøynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildeskålporsanguxn--trgstad-r1anávuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaevenáššivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalváhkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8aporsáŋgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierváivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsundålesundalesundfetsundfarsundovre-eikerøvre-eikerakershusxn--moreke-juasørfoldøstfoldostfoldsorfoldhøyangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordkåfjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogrømskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkvænangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandskånlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnagáivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimbådåddjåxn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholtålenxn--vads-jraxn--jlster-byamosjøenxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppegårdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangevågberlevågkristiansandxn--rsta-frahornindalstjørdalshalsenstjordalshalsensandnessjoenhámmárfeastaxn--lrdal-srasør-fronsor-fronnord-odalkristiansundmátta-várjjatvestvågøynesoddennotoddenbuskerudøygardenoygardensalangenlavangenralingenrælingenlodingenlødingenleaŋgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadhægebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomoårekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-hølandxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorimāoriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshoppriviqhslapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgovяспборгкоммскбизмирсамаракрымсочиакодпроргобрупрצהלממשלישובאקדמיהองค์กรธุรกิจรัฐบาลศึกษาทหารเน็ต教育網絡組織公司政府個人닷넷한국澳门新闻澳門联通家電嘉里招聘通販닷컴삼성コムგეбгрфеюadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzazελευ世界台灣购物公益点看臺灣网络書籍在线网站手机机构大拿游戏信息台湾谷歌慈善商标香港中国餐厅网址中國商城食品微博政务移动集团公司八卦商店健康网店政府时尚佛山中信娱乐广东企业homedepotengineeringاماراتrepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf亚马逊淡马锡alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxiみんなストアセールcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9cקוםհայоргсрбмонкомбелмкдқазрусукрمصرقطرعربكومdadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolarລາວคอมไทยtourslocusnexuslexusgiftsbeatsboatspartspressglassswissकॉमनेटtiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparisファッションworkssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday中文网xn--unup4y天主教飞利浦新加坡enterprises我爱你嘉里大酒店christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbankكاثوليكxn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbankپاكستانپاکستانnextdirectالسعوديهالعليانxn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownloadمليسياxn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7gஇலங்கைcontractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmartഭാരതംsupportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrimмоскваالسعودیةcoffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspaceонлайнvermögensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltiendaभारतम्africatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworktheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburgفلسطينlplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstreamభారత్unicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearchالاردنmarketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzukiアマゾンクラウドポイントbhartiグーグルxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgmابوظبيdiscoverreviewবাংলাxn--5su34j936bgsgmoscowobserverapartmentsдетиارامكوсайтeurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0hتونسموقعبارتڀارتشبكةعمانبيتكعراقreadkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilipsලංකාಭಾರತfitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcvermögensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56aভাৰতভারতभारतभारोतviajeshermeshughesxn--j1aefसंगठनvillasଭାରତclaimshotelsભારતzapposphotosjuegoscondostatamotorsgratistennisਭਾਰਤtkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b電訊盈科xn--gecrj9cstatefarmaccountantaquarelleolayangroup香格里拉xn--p1ai组织机构xn--1ck2e1bxn--mgbt3dhdschwarzموريتانياabudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsuالسعوديةstcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundationישראלxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrxالبحرينdiamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fhкатоликcaravanசிங்கப்பூர்richardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchenஇந்தியாweatherchannelallfinanzxn--kput3iالسعودیۃxn--90aisxn--efvy88hالجزائرxn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammxبازاربھارتسوريةorganicfreseniusسورياxn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082fاليمنهمراهpolitieسودانايرانایرانnetflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigitalالمغربbarcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp",rulesRoot=653,exceptionsRoot=657,numberOfNodes=nodeFlags.length,numberOfEdges=edgeLength.length,edgeOffset=new Uint32Array(numberOfEdges),edgeHash=new Uint32Array(numberOfEdges),wildcardEdge=new Int32Array(numberOfNodes).fill(-1);for(let node=0,offset=0;node<numberOfNodes;node+=1)for(let edge=edgeStart[node];edge<edgeStart[node+1];edge+=1){edgeOffset[edge]=offset;let end=offset+edgeLength[edge],hash2=5381;for(let i=end-1;i>=offset;i-=1)hash2=hash2*33^labelText.charCodeAt(i);edgeHash[edge]=hash2>>>0,edgeLength[edge]===1&&labelText.charCodeAt(offset)===42&&(wildcardEdge[node]=edge),offset=end}var matchNode=-1,matchStart=0,matchEnd=0;function labelEquals(edge,hostname,start,length){if(edgeLength[edge]!==length)return!1;let offset=edgeOffset[edge];for(let i=0;i<length;i+=1)if(labelText.charCodeAt(offset+i)!==hostname.charCodeAt(start+i))return!1;return!0}function findEdge(node,hash2,hostname,start,length){let lo=edgeStart[node],hi=edgeStart[node+1];for(;lo<hi;){let mid=lo+hi>>>1,value=edgeHash[mid];if(value<hash2)lo=mid+1;else if(value>hash2)hi=mid;else{for(let e=mid;e>=lo&&edgeHash[e]===hash2;e-=1)if(labelEquals(e,hostname,start,length))return e;for(let e=mid+1;e<hi&&edgeHash[e]===hash2;e+=1)if(labelEquals(e,hostname,start,length))return e;return-1}}return-1}function walk(hostname,root,allowedMask){let node=root,end=hostname.length,hash2=5381;matchNode=-1;for(let i=hostname.length-1;i>=0;i-=1){let code=hostname.charCodeAt(i);if(code===46){let start=i+1,edge2=findEdge(node,hash2>>>0,hostname,start,end-start);if(edge2===-1&&(edge2=wildcardEdge[node]),edge2===-1)return matchNode!==-1;node=edgeChild[edge2],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=start,matchEnd=end),end=i,hash2=5381}else hash2=hash2*33^code}let edge=findEdge(node,hash2>>>0,hostname,0,end);return edge===-1&&(edge=wildcardEdge[node]),edge!==-1&&(node=edgeChild[edge],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=0,matchEnd=end)),matchNode!==-1}function suffixLookup(hostname,options,out){if(fastPathLookup(hostname,options,out))return;let allowedMask=(options.allowPrivateDomains?2:0)|(options.allowIcannDomains?1:0);if(walk(hostname,exceptionsRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchEnd+1);return}if(walk(hostname,rulesRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchStart);return}out.isIcann=!1,out.isPrivate=!1;let lastDot=hostname.lastIndexOf(".");out.publicSuffix=lastDot===-1?hostname:hostname.slice(lastDot+1)}var RESULT=getEmptyResult();function parse2(url,options){return parseImpl(url,5,suffixLookup,options,getEmptyResult())}function getHostname(url,options){return resetResult(RESULT),parseImpl(url,0,suffixLookup,options,RESULT).hostname}function getPublicSuffix2(url,options){return resetResult(RESULT),parseImpl(url,2,suffixLookup,options,RESULT).publicSuffix}function getDomain2(url,options){return resetResult(RESULT),parseImpl(url,3,suffixLookup,options,RESULT).domain}function getFullDomain(url,options){resetResult(RESULT);let result=parseImpl(url,3,suffixLookup,options,RESULT);return result.domain===null?null:result.hostname}function getSubdomain(url,options){return resetResult(RESULT),parseImpl(url,4,suffixLookup,options,RESULT).subdomain}function getDomainWithoutSuffix(url,options){return resetResult(RESULT),parseImpl(url,5,suffixLookup,options,RESULT).domainWithoutSuffix}exports.getDomain=getDomain2;exports.getDomainWithoutSuffix=getDomainWithoutSuffix;exports.getFullDomain=getFullDomain;exports.getHostname=getHostname;exports.getPublicSuffix=getPublicSuffix2;exports.getSubdomain=getSubdomain;exports.parse=parse2}});var init_process_env=__esm({"../agent-runtime/dist/process-env.js"(){"use strict";init_dist()}});import fs14 from"node:fs";import{spawn as spawn9}from"node:child_process";import path20 from"node:path";function agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath,env=process.env,extraUserCandidates=[],home,platform=process.platform,processExecPath=process.execPath,readdirSync:readdirSync10}){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",pathCandidates=(env[pathKey]||"").split(path20.delimiter).filter(Boolean).flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),commonUserDirectories=[path20.join(home,".local","bin"),path20.join(home,".npm-global","bin"),path20.join(home,".volta","bin"),path20.join(home,".local","share","pnpm"),path20.join(home,"Library","pnpm"),path20.join(home,".bun","bin"),...platform==="win32"&&env.APPDATA?[path20.join(env.APPDATA,"npm")]:[]],systemDirectories=platform==="win32"?[]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin"];return[configuredPath,...executableNames2.map(name=>path20.join(path20.dirname(processExecPath),name)),...commonUserDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...extraUserCandidates,...versionManagerExecutableCandidates(home,executableNames2,{env,platform,readdirSync:readdirSync10}),...systemDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...pathCandidates].filter(candidate=>typeof candidate=="string")}function executableFileCandidates(candidates){let seen=new Set,executableCandidates=[];for(let candidate of candidates)!candidate||seen.has(candidate)||(seen.add(candidate),isExecutableFile(candidate)&&executableCandidates.push(candidate));return executableCandidates}function probeAgentExecutable(executable,options){return new Promise(resolve16=>{let settled=!1,stderr="",launch=resolveSpawnCommand(executable,options.args),child=spawn9(launch.command,launch.args,{stdio:["ignore","ignore","pipe"],windowsHide:!0,env:prependNodePath()}),finish=error=>{settled||(settled=!0,clearTimeout(timer),resolve16(error))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(options.timeoutError)},options.timeoutMs);child.stderr?.on("data",chunk=>{stderr.length<4e3&&(stderr+=chunk.toString("utf8"))}),child.once("error",error=>finish(options.startError(error))),child.once("exit",code=>{if(code===0){finish(null);return}finish(stderr.trim()||options.exitError(code))})})}function isExecutableFile(candidate){try{return fs14.accessSync(candidate,process.platform==="win32"?fs14.constants.F_OK:fs14.constants.X_OK),fs14.statSync(candidate).isFile()}catch{return!1}}var AgentExecutableResolver,init_executable_resolver=__esm({"../agent-runtime/dist/executable-resolver.js"(){"use strict";init_process_env();AgentExecutableResolver=class{options;resolvedExecutable=null;resolutionPromise=null;generation=0;constructor(options){this.options=options}async resolve(){if(this.resolvedExecutable){if(isExecutableFile(this.resolvedExecutable))return{executable:this.resolvedExecutable,error:null};this.resolvedExecutable=null}if(this.resolutionPromise)return this.resolutionPromise;let generation=this.generation,resolution=this.probeCandidates(generation);this.resolutionPromise=resolution;try{return await resolution}finally{this.resolutionPromise===resolution&&(this.resolutionPromise=null)}}reset(){this.generation+=1,this.resolvedExecutable=null,this.resolutionPromise=null}async probeCandidates(generation){let candidates=this.options.candidates();if(candidates.length===0)return{executable:null,error:this.options.notFoundError};let failures=[],recordFailure=(executable,error)=>{failures.push({executable,error}),this.options.onFailure?.(executable,error)},select=(executable,version2)=>(this.generation===generation&&(this.resolvedExecutable=executable,this.options.onSelection?.(executable,version2)),{executable,error:null}),preferredCandidates=this.options.preferred?candidates.filter(executable=>this.options.preferred?.(executable)):[],automaticCandidates=candidates.filter(executable=>!preferredCandidates.includes(executable));for(let executable of preferredCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let getVersion=this.options.getVersion;if(getVersion){let inspected=await Promise.all(automaticCandidates.map(async(executable,index)=>{let[error,version2]=await Promise.all([this.options.probe(executable),getVersion(executable).catch(()=>null)]);return{executable,error,index,version:version2}})),usable=inspected.filter(candidate=>candidate.error===null);for(let candidate of inspected)candidate.error!==null&&recordFailure(candidate.executable,candidate.error);usable.sort((left,right)=>{if(left.version&&right.version&&this.options.compareVersions){let comparison=this.options.compareVersions(left.version,right.version);if(comparison!==0)return-comparison}else{if(left.version)return-1;if(right.version)return 1}return left.index-right.index});let selected=usable[0];if(selected)return select(selected.executable,selected.version)}else for(let executable of automaticCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let detail=failures.map(({executable,error})=>{let compactError=error.replace(/\s+/g," ").trim().slice(0,300);return`${executable}: ${compactError}`}).join("; ");return{executable:null,error:`${this.options.unusableError} ${detail}`}}}}});import{isAbsolute as isAbsolute10}from"node:path";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}:${browser.capabilities?.controlSessionMode??"mearl"}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist2();init_control_session_manager();init_dist3();init_provider_request_timeout();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;deadlines=new AsyncLocalStorage2;controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider");let mode=browser.capabilities?.controlSessionMode;if(mode!==void 0&&mode!=="mearl"&&mode!=="external")throw new Error("Provider browser has invalid control session mode");return browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions2=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions2.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions2[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute10(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){let nativeDialogPress=(action2,payload)=>action2==="page_press"&&(payload?.dialogId!==void 0||payload?.promptText!==void 0);if(nativeDialogPress(action,data)||action==="run_actions"&&Array.isArray(data?.actions)&&data.actions.some(step=>nativeDialogPress(step?.action,step?.data)))throw new Error("Provider native dialog handling is not negotiated. Use the built-in CDP or extension transport.");if(action==="get_capabilities"&&!browser.capabilities?.actions.includes("get_capabilities"))return describeBrowserCapabilities(["get_capabilities",...browser.capabilities?.actions??[]],void 0,data);action==="browser_release"&&(action="browser_instances",data={operation:"detach"});let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data.operation==="sync_cookies"?"syncCookies":data.operation:void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}let deadline=this.deadlines.getStore();return deadline!==void 0?(providerRequestTimeoutMs(action,data,deadline),this.dependencies.request(browser,action,data,origin,host,deadline)):this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,networkControl:null}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data,deadline),this.reap();let browser=this.browser(browserId);if(browser.capabilities?.controlSessionMode==="external"&&(sessionId!==void 0||action==="browser_control"))throw new Error("CONTROL_SESSION_UNSUPPORTED: this Provider manages task control externally; use its native handoff/resume without --session.");let{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host))}return manager.invoke(action,data,sessionId,void 0,origin)})}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});import{randomUUID as randomUUID29}from"node:crypto";var slotKey,ProviderEnhancementService,init_provider_enhancements=__esm({"src/provider-enhancements.ts"(){"use strict";init_dist2();init_dist3();init_browser_registry();slotKey=(owner,sourceIdentity,tabId)=>JSON.stringify([owner,sourceIdentity,tabId]),ProviderEnhancementService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;bindings=new Map;busy=new Set;pendingBindings=0;provider(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId||browser.status!=="connected"||browser.capabilities?.controlSessionMode!=="external")throw new Error("BROWSER_ENHANCEMENT_OWNER_UNAVAILABLE");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id),browser}async verifyPage(provider,binding,deadline){let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:binding.providerTabId},deadline),binding.providerTabId);if(!matchesProviderEnhancementTarget(frame,binding))throw new Error("PAGE_IDENTITY_CHANGED");let native=this.dependencies.browsers().find(item=>item.browserId===binding.nativeBrowserId&&item.transport==="extension");if(!native)throw new Error("BROWSER_ENHANCEMENT_EXTENSION_UNAVAILABLE");return native}async invoke(owner,request,deadline){if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("Browser enhancement deadline exceeded");if(!request||typeof request!="object"||!["inspect","bind","invoke","release"].includes(request.operation))throw new Error("Invalid Provider enhancement request");let provider={...this.provider(owner)},activeOwners=new Set(this.dependencies.browsers().filter(browser=>browser.transport==="provider"&&browser.status==="connected").map(browser=>`${browser.browserId}:${browserConnectionIdentity(browser)}`));for(let[id3,binding]of this.bindings)!activeOwners.has(`${binding.owner}:${binding.providerIdentity}`)&&!this.busy.has(slotKey(binding.owner,binding.providerIdentity,binding.binding.providerTabId))&&this.bindings.delete(id3);if(request.operation==="inspect"||request.operation==="bind"){let slot2=slotKey(owner,browserConnectionIdentity(provider),request.providerTabId);if(this.busy.has(slot2))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot2);try{return await this.negotiate(provider,request,deadline)}finally{this.busy.delete(slot2)}}let page=this.bindings.get(request.bindingId);if(!page||page.owner!==owner||page.providerIdentity!==browserConnectionIdentity(provider)||page.binding.generation!==request.generation)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: reverify and rebind the page");let slot=slotKey(owner,browserConnectionIdentity(provider),page.binding.providerTabId);if(this.busy.has(slot))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot);try{return await this.mutate(provider,request,page,deadline)}finally{this.busy.delete(slot)}}async mutate(provider,request,page,deadline){let owner=provider.browserId;if(page.uncertain)throw new Error("ENVIRONMENT_UNCONFIRMED: reverify the binding before another mutation");let native=await this.verifyPage(provider,page.binding,deadline);if(browserConnectionIdentity(native)!==page.nativeIdentity)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: the native host changed; rebind first");let physical;if(request.operation==="invoke"){if(!isBrowserEnhancementAction(request.action)||requiredBrowserEnhancementActions(request).some(action=>!page.binding.actions.includes(action))||!request.data||typeof request.data!="object"||Array.isArray(request.data)||request.data.tabId!==void 0&&request.data.tabId!==page.binding.providerTabId)throw new Error("BROWSER_ENHANCEMENT_SCOPE_MISMATCH");physical={...request,bindingId:page.extensionBindingId,owner,data:{...request.data,tabId:page.binding.tabId}}}else physical={...request,bindingId:page.extensionBindingId,owner};try{let result=await this.dependencies.enhance(native,provider,physical,deadline,page.binding.providerTabId);if(request.operation==="invoke"&&!("result"in result))throw new Error("Invalid enhancement invocation response");if(request.operation==="release"&&(!("released"in result)||typeof result.released!="boolean"||result.conflicts!==void 0&&(!Array.isArray(result.conflicts)||result.conflicts.some(conflict=>typeof conflict!="string"))))throw new Error("Invalid enhancement release response");if(request.operation==="release"&&"released"in result&&result.released&&this.bindings.delete(request.bindingId),"binding"in result||"capabilities"in result||"preparation"in result)throw new Error("Invalid enhancement mutation response");return result}catch(error){throw page.uncertain=!0,error}}async negotiate(provider,request,deadline){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||!Array.isArray(request.actions)||!request.actions.length||new Set(request.actions).size!==request.actions.length||request.actions.some(action=>!isBrowserEnhancementAction(action))||request.navigationOrigin!==void 0&&!isEnhancementNavigationOrigin(request.navigationOrigin)||request.nativeBrowserId!==void 0&&(typeof request.nativeBrowserId!="string"||!request.nativeBrowserId))throw new Error("Invalid Provider enhancement binding request");let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"&&(!frame.targetId||!isEnhancementNavigationOrigin(request.navigationOrigin)))throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: preparation requires a physical target and navigation origin");let previous=[...this.bindings.values()].find(page=>page.owner===provider.browserId&&page.binding.providerTabId===request.providerTabId&&matchesProviderEnhancementTarget(frame,page.binding)),candidates=this.dependencies.browsers().filter(browser=>browser.transport==="extension"&&(request.nativeBrowserId===void 0||request.nativeBrowserId===browser.browserId)),matches=[],liveTabs=new Map,probes=0,failure,denied,recordFailure=error=>{let issue=error instanceof Error?error:new Error(String(error));(issue.message.startsWith("BROWSER_ENHANCEMENT_PERMISSION_DENIED:")||issue.message.startsWith("BROWSER_ENHANCEMENT_AGENT_DISABLED:"))&&(denied??=issue),failure??=issue};if(candidates.length>64)throw new Error("Specify a nativeBrowserId to narrow enhancement discovery");let discoveryDeadline=()=>Math.min(deadline??1/0,Date.now()+5e3);for(let browser of candidates)try{let result=await this.dependencies.request(browser,"tab_list",{},discoveryDeadline());if(!Array.isArray(result?.tabs))throw new Error("Invalid enhancement discovery response");liveTabs.set(browser.browserId,new Set(result.tabs.map(tab=>tab?.tabId).filter(Number.isSafeInteger)));for(let tab of result.tabs){let missingUrl=tab?.url===void 0||tab?.url==="";if(!(tab?.url!==frame.url&&!(missingUrl&&frame.targetId)||!Number.isSafeInteger(tab?.tabId)||tab.tabId<0)){if(++probes>128)throw new Error("Too many matching pages; narrow enhancement discovery");try{let probe=await this.dependencies.enhance(browser,provider,request.operation==="inspect"?{operation:"inspect",owner:provider.browserId,tabId:tab.tabId,targetId:frame.targetId,actions:request.actions,navigationOrigin:request.navigationOrigin}:{operation:"probe",tabId:tab.tabId},discoveryDeadline(),request.providerTabId),capabilities="preparation"in probe?probe.preparation.capabilities:"capabilities"in probe?probe.capabilities:void 0;if((frame.initialEnvironment?.preserveHostPlatform||frame.initialEnvironment?.preserveHostInput)&&capabilities?.hostEnvironmentVersion!==BROWSER_ENHANCEMENT_HOST_ENVIRONMENT_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot preserve the captured host environment");if(request.operation==="inspect"){if(!("preparation"in probe)||probe.preparation.capabilities?.preparationVersion!==BROWSER_ENHANCEMENT_PREPARATION_VERSION||probe.preparation.capabilities?.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||probe.preparation.capabilities?.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot negotiate a preparation page");if(probe.preparation.tabId!==tab.tabId||probe.preparation.targetId!==frame.targetId||!isBrowserEnhancementPreparationUrl(probe.preparation.url)||!Array.isArray(probe.preparation.capabilities.actions)||request.actions.some(action=>!probe.preparation.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,targetId:probe.preparation.targetId,preparation:probe.preparation});continue}if(!("capabilities"in probe)||probe.capabilities.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||request.navigationOrigin!==void 0&&probe.capabilities.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION||!matchesProviderEnhancementTarget(frame,probe)||request.actions.some(action=>!probe.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,mainFrameId:probe.mainFrameId,...probe.targetId?{targetId:probe.targetId}:{}})}catch(error){recordFailure(error)}}}}catch(error){if(error instanceof Error&&error.message==="Too many matching pages; narrow enhancement discovery")throw error;recordFailure(error)}if(!matches.length&&denied)throw denied;if(!matches.length&&failure)throw failure;if(matches.length!==1)throw new Error(matches.length?"BROWSER_ENHANCEMENT_AMBIGUOUS_PAGE":"BROWSER_ENHANCEMENT_UNAVAILABLE: no verified extension page");let match=matches[0],current=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"){if(!current.targetId||current.targetId!==match.targetId)throw new Error("PAGE_IDENTITY_CHANGED");return{preparation:{...match.preparation,nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId}}}if(!match.mainFrameId||!matchesProviderEnhancementTarget(current,{...match,mainFrameId:match.mainFrameId}))throw new Error("PAGE_IDENTITY_CHANGED");for(let[id3,page]of this.bindings)liveTabs.has(page.binding.nativeBrowserId)&&!liveTabs.get(page.binding.nativeBrowserId).has(page.binding.tabId)&&!this.busy.has(slotKey(page.owner,page.providerIdentity,page.binding.providerTabId))&&this.bindings.delete(id3);if(this.bindings.size+this.pendingBindings>=512&&!previous)throw new Error("Provider enhancement binding limit reached");previous||this.pendingBindings++;try{let result=await this.dependencies.enhance(match.browser,provider,{operation:"bind",owner:provider.browserId,tabId:match.tabId,mainFrameId:match.mainFrameId,...match.targetId?{targetId:match.targetId}:{},actions:request.actions,...request.navigationOrigin?{navigationOrigin:request.navigationOrigin}:{}},deadline,request.providerTabId);if(!("binding"in result)||result.binding.mainFrameId!==match.mainFrameId||result.binding.targetId!==match.targetId)throw new Error("Invalid enhancement binding response");let binding={...result.binding,bindingId:previous&&previous.providerIdentity===browserConnectionIdentity(provider)&&previous.nativeIdentity===browserConnectionIdentity(match.browser)&&previous.extensionBindingId===result.binding.bindingId&&previous.binding.generation===result.binding.generation?previous.binding.bindingId:randomUUID29(),nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId};return previous&&previous.binding.bindingId!==binding.bindingId&&this.bindings.delete(previous.binding.bindingId),this.bindings.set(binding.bindingId,{owner:provider.browserId,providerIdentity:browserConnectionIdentity(provider),nativeIdentity:browserConnectionIdentity(match.browser),extensionBindingId:result.binding.bindingId,binding,uncertain:!1}),{binding}}finally{previous||this.pendingBindings--}}}}});async function acceptedAppResources(){await nativeCapabilities.refresh();let status=nativeCapabilities.status(),runtime=nativeCapabilities.get("app.pageRuntime"),defaultRuntime=nativeCapabilities.get("app.defaultPageRuntime"),catalog=await listInstalledAppProfiles({refresh:!1});if(JSON.stringify(nativeCapabilities.status())!==JSON.stringify(status))throw new Error("APP_RESOURCE_CATALOG_CHANGED");return{...status,catalog,runtime,defaultRuntime}}var revision2,ProviderAppResourceService,init_provider_app_resources=__esm({"src/provider-app-resources.ts"(){"use strict";init_dist2();init_dist8();init_dist3();init_page_runtimes();init_native_capability_services();init_app_profile_catalog();init_browser_registry();revision2=snapshot=>({capabilityRevision:snapshot.revision,installationRevision:snapshot.installationRevision}),ProviderAppResourceService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;async invoke(owner,request,deadline){let assertDeadline2=()=>{if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("App resource deadline exceeded")};assertDeadline2();let provider=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!provider||provider.transport!=="provider"||!provider.providerBrowserId||provider.status!=="connected"||provider.capabilities?.controlSessionMode!=="external")throw new Error("APP_RESOURCE_OWNER_UNAVAILABLE");assertProviderProtocolVersion(provider.provider?.protocolVersion,provider.provider?.id);let identity3=browserConnectionIdentity(provider),assertCurrent=()=>{assertDeadline2();let current=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!current||current.status!=="connected"||current.capabilities?.controlSessionMode!=="external"||browserConnectionIdentity(current)!==identity3)throw new Error("APP_RESOURCE_OWNER_CHANGED")};if(!request||typeof request!="object"||Array.isArray(request)||!["catalog","resolve"].includes(request.operation))throw new Error("Invalid App resource request");let allowed=request.operation==="catalog"?["operation","params"]:["operation","providerTabId","profile","options"];if(Object.keys(request).some(key=>!allowed.includes(key)))throw new Error("Invalid App resource request");let target;if(request.operation==="resolve"){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||typeof request.profile!="string"||!request.profile||request.profile.length>161||request.options!==void 0&&(!request.options||typeof request.options!="object"||Array.isArray(request.options)))throw new Error("Invalid App resource request");target=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId),assertCurrent()}let snapshot=await this.dependencies.snapshot();assertCurrent();let result;if(request.operation==="catalog")result={...revision2(snapshot),catalog:describeBrowserCapabilities(["set_app_profile"],snapshot.catalog,request.params).apps};else{let entry=snapshot.catalog.profiles.find(entry2=>entry2.id===request.profile);if(!entry||entry.available===!1)throw new Error(`App profile is unavailable: ${request.profile}`);let definition=entry.definition;if(!definition.pageRuntime&&(definition.bridges.length||Object.keys(definition.globals).length)){let binding2=snapshot.defaultRuntime?.();if(!binding2)throw new Error("Required App runtime is not installed");definition=validateAppProfileDefinition({...definition,pageRuntime:binding2})}let options=mergeAppProfileOptions(request.options);if(Object.keys(request.options??{}).some(key=>!Object.hasOwn(options,key)))throw new Error("Unsupported App resource option");let resolved=resolveAppProfile(request.profile,options,definition),binding=resolved.injected.pageRuntime,source=binding?(this.dependencies.store??new NodePageRuntimeStore).resolve(binding,snapshot.runtime):void 0,current=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId);if(assertCurrent(),current.mainFrameId!==target.mainFrameId||current.targetId!==target.targetId)throw new Error("PAGE_IDENTITY_CHANGED");result={...revision2(snapshot),config:resolved.injected,recommendedPreset:resolved.recommendedPreset,target:current,...binding&&source!==void 0?{runtime:{binding,source}}:{}}}if(Buffer.byteLength(JSON.stringify(result))+256>16777216)throw new Error("App resource response exceeded its byte limit");return result}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net5 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync16}from"node:fs";import{randomUUID as randomUUID30}from"node:crypto";async function runProviderControlHost(token){let file=providerControlHostFile(),owner=readRecord(file);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file,owner.pid,{pid:process.pid,socketPath,token,ready:!1,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,host,{controlSource:origin,deadline}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),enhancements=new ProviderEnhancementService({browsers:listRegisteredBrowsers,request:(browser,action,data,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,void 0,{deadline}),enhance:(browser,provider,data,deadline,providerTabId)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement",data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(data.operation==="invoke"?data.action:"page_frames",data,deadline),void 0,void 0,{providerTarget:provider.browserId,providerControlToken:token,providerSourceIdentity:browserConnectionIdentity(provider),providerPageId:providerTabId,deadline})}),appResources=new ProviderAppResourceService({browsers:listRegisteredBrowsers,snapshot:acceptedAppResources,verify:(browser,tabId,deadline)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement_target",{tabId},NATIVE_HOST_VERSION,providerRequestTimeoutMs("page_frames",{},deadline),browser.providerBrowserId,void 0,{deadline})}),server=net5.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id3="";try{let request=JSON.parse(line);id3=typeof request.id=="string"?request.id:randomUUID30(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="__provider_enhancement"){if(typeof request.providerTarget!="string"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("Provider enhancements require an external browser without a Mearl session");result=await enhancements.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="__provider_app_resources"){if(typeof request.providerTarget!="string"||request.controlSource!=="local"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("App resources require a local external browser without a Mearl session");result=await appResources.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="browser_sessions")if(data.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id:id3,success:!0,data:result})+`
|
|
1094
|
+
`)}),client.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id3){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client.on("error",error=>finish(error)),client.on("end",()=>finish(new Error("Browser connection closed before responding"))),client.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();init_dist3();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var version_exports={};__export(version_exports,{NATIVE_HOST_VERSION:()=>NATIVE_HOST_VERSION});var NATIVE_HOST_VERSION,init_version2=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="3.0.1"}});function providerRequestTimeoutMs(action,data,deadline){if(deadline!==void 0){if(!Number.isSafeInteger(deadline)||deadline<=0)throw new Error("Invalid Provider request deadline");let remaining=deadline-Date.now();if(remaining<=0)throw new Error("Provider request deadline exceeded");if(remaining>2147483647)throw new Error("Provider request deadline exceeds the supported range");return remaining}return resolveActionTimeoutSec(action,data,120)*1e3}var init_provider_request_timeout=__esm({"src/provider-request-timeout.ts"(){"use strict";init_actionTimeouts()}});var browser_provider_exports={};__export(browser_provider_exports,{accessProviderBrowser:()=>accessProviderBrowser,closeProviderBrowser:()=>closeProviderBrowser,configureProvider:()=>configureProvider,detachProviderBrowser:()=>detachProviderBrowser,findProviderBrowser:()=>findProviderBrowser,getProviderLaunchForm:()=>getProviderLaunchForm,launchProviderBrowser:()=>launchProviderBrowser,listExternalBrowserProviders:()=>listExternalBrowserProviders,listProviderControlSessions:()=>listProviderControlSessions,startProviderBrowser:()=>startProviderBrowser,syncProviderBrowserCookies:()=>syncProviderBrowserCookies,updateProviderControlSession:()=>updateProviderControlSession});function listExternalBrowserProviders(){return listInstalledProviders().map(provider=>({provider:{id:provider.providerId,name:provider.name,builtin:!1,version:provider.version,protocolVersion:provider.protocolVersion},browserType:provider.browserType}))}async function getProviderLaunchForm(providerId,request){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.dynamicLaunchForm)throw new Error(`Provider does not support dynamic launch forms: ${providerId}`);let live=await requireLiveProvider(providerId),form=await requestBrowserSocket(live.socketPath,"browser_providers",{...request,operation:"launch_form"},NATIVE_HOST_VERSION,12e4);return validateProviderLaunchForm(form),form}async function requireLiveProvider(providerId){let warning=(await ensureInstalledProvidersRunning([providerId])).find(item=>item.startsWith(`provider ${providerId}:`));if(warning)throw new Error(warning);let live=readLiveProvider(providerId);if(!live)throw new Error(`Provider did not start: ${providerId}`);return assertProviderProtocolVersion(live.providerProtocolVersion,providerId),{socketPath:live.socketPath}}async function launchProviderBrowser(input2){let providerId=input2.provider.trim();if(!listInstalledProviders().find(item=>item.providerId===providerId))throw new Error(`Provider is not registered: ${providerId}`);let live=await requireLiveProvider(providerId),result=await(input2.host?requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions),void 0,input2.host):requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions)));return validateProviderBrowser(result),{...result,browserId:providerBrowserKey(providerId,result.browserId)}}function findProviderBrowser(selector){let normalized=selector.toLowerCase(),exact=listRegisteredBrowsers().filter(browser=>browser.transport==="provider").filter(browser=>browser.browserId.toLowerCase()===normalized||browser.providerBrowserId?.toLowerCase()===normalized||browser.browserName.toLowerCase()===normalized);if(exact.length>1)throw new Error(`Provider browser selector is ambiguous: ${selector}`);return exact[0]&&assertProviderProtocolVersion(exact[0].provider?.protocolVersion,exact[0].provider?.id??"Provider"),exact[0]??null}function requireProviderBrowser(browser){if(browser.transport!=="provider"||!browser.providerBrowserId)throw new Error(`Browser is not managed by an external Provider: ${browser.browserId}`);return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser.providerBrowserId}function requestControlledProvider(browser,action,data,host){return requireProviderBrowser(browser),ensureProviderControlHost().then(controlHost=>(assertProviderControlSessionMode(controlHost,browser.capabilities?.controlSessionMode),requestBrowserSocket(controlHost.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data),void 0,host,{providerTarget:browser.browserId})))}async function listProviderControlSessions(){let host=readProviderControlHost();return host?(await requestBrowserSocket(host.socketPath,"browser_sessions",{operation:"list"},NATIVE_HOST_VERSION)).sessions??[]:[]}async function updateProviderControlSession(sessionId,operation){let host=readProviderControlHost();if(!host)throw new Error("CONTROL_SESSION_NOT_FOUND");return(await requestBrowserSocket(host.socketPath,"browser_sessions",{sessionId,operation},NATIVE_HOST_VERSION)).session}function closeProviderBrowser(browser,options={}){return requestControlledProvider(browser,"browser_close",{deleteProfile:options.deleteProfile===!0})}function detachProviderBrowser(browser){return requestControlledProvider(browser,"browser_instances",{operation:"detach"})}async function accessProviderBrowser(browser){return(await requestBrowserSocket(browser.socketPath,"get_browser_access_url",{},NATIVE_HOST_VERSION,6e4,requireProviderBrowser(browser))).browserAccess}async function startProviderBrowser(browser){let result=await requestControlledProvider(browser,"browser_instances",{operation:"start"});return validateProviderBrowser(result),{...result,browserId:browser.browserId}}function syncProviderBrowserCookies(browser,scope,host){return requestControlledProvider(browser,"browser_instances",{operation:"sync_cookies",scope},host)}async function configureProvider(providerId,options){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.configuration)throw new Error(`Provider does not support configuration: ${providerId}`);let live=await requireLiveProvider(providerId);return requestBrowserSocket(live.socketPath,"browser_providers",{operation:"configure",options},NATIVE_HOST_VERSION)}var init_browser_provider=__esm({"src/browser-provider.ts"(){"use strict";init_dist3();init_host();init_runtime();init_browser_registry();init_browser_socket_request();init_version2();init_provider_request_timeout()}});async function initialize(){if(registry)return registry;initializing??=(async()=>{let[core,qr,providerHost,providerRuntime,provider,setup,daemon,browsers,transport,version2]=await Promise.all([Promise.resolve().then(()=>(init_node_capabilities2(),node_capabilities_exports)),Promise.resolve().then(()=>(init_dist5(),dist_exports3)),Promise.resolve().then(()=>(init_host(),host_exports)),Promise.resolve().then(()=>(init_runtime(),runtime_exports)),Promise.resolve().then(()=>(init_dist3(),dist_exports2)),Promise.resolve().then(()=>(init_dist7(),dist_exports4)),Promise.resolve().then(()=>(init_dist(),dist_exports)),Promise.resolve().then(()=>(init_browser_provider(),browser_provider_exports)),Promise.resolve().then(()=>(init_browser_socket_request(),browser_socket_request_exports)),Promise.resolve().then(()=>(init_version2(),version_exports))]);return registry=new core.NodeCapabilityRegistry({version:version2.NATIVE_HOST_VERSION,env:Object.freeze({...process.env}),fetch:globalThis.fetch,providers:Object.freeze({listInstalled:providerHost.listInstalledProviders,readLive:providerRuntime.readLiveProvider,assertProtocol:provider.assertProviderProtocolVersion,install:setup.installProviderPackage,launch:browsers.launchProviderBrowser,find:browsers.findProviderBrowser,close:browsers.closeProviderBrowser,request:transport.requestBrowserSocket}),renderQr:value=>qr.renderSVG(value,{pixelSize:1,border:2}),runCommand:daemon.runCommand},capabilityDirectory())})();try{return await initializing}catch(error){throw initializing=void 0,error}}var registry,initializing,nativeCapabilities,init_native_capability_services=__esm({"src/native-capability-services.ts"(){"use strict";init_page_runtime_store();nativeCapabilities={get(name){return registry?.get(name)},entries(prefix){return registry?.entries(prefix)??[]},require(name){let handler=registry?.get(name);if(!handler)throw new Error(`Required capability is not installed: ${name}. Enable the preset that provides it.`);return handler},requireCustom(name){if(!registry)throw new Error(`Required capability is not installed: ${name}`);return registry.require(name)},async refresh(){return(await initialize()).refresh()},status(){return{revision:registry?.revision??null,installationRevision:registry?.installationRevision??null}},async synchronize(){try{return await nativeCapabilities.refresh(),{...nativeCapabilities.status(),accepted:!0}}catch(error){return{...nativeCapabilities.status(),accepted:!1,error:error instanceof Error?error.message:String(error)}}}}}});function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],protocol:[],kvGet:[],kvSet:[],kvDelete:[],pageContext:[],responses:{},behaviors:{},noop:[],silent:[]}}function mergeActions(...maps){let out=emptyActions();for(let m of maps)out.open.push(...m.open),out.close.push(...m.close),out.title.push(...m.title),out.navigationBar.push(...m.navigationBar??[]),out.statusBar.push(...m.statusBar??[]),out.systemInfo.push(...m.systemInfo),out.protocol.push(...m.protocol),out.kvGet.push(...m.kvGet??[]),out.kvSet.push(...m.kvSet??[]),out.kvDelete.push(...m.kvDelete??[]),out.pageContext.push(...m.pageContext??[]),Object.assign(out.responses,m.responses??{}),Object.assign(out.behaviors,m.behaviors??{}),out.noop.push(...m.noop),out.silent.push(...m.silent??[]);return out}function isJsonValue2(value,seen=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||seen.has(value))return!1;seen.add(value);let valid7=Array.isArray(value)?value.every(item=>isJsonValue2(item,seen)):Object.values(value).every(item=>isJsonValue2(item,seen));return seen.delete(value),valid7}function validateAppBridgeConfig(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("bridgeConfig must be an object");let root=value;if(Object.keys(root).some(key=>key!=="methods"))throw new Error('bridgeConfig only supports the "methods" field');if(!root.methods||typeof root.methods!="object"||Array.isArray(root.methods))throw new Error("bridgeConfig.methods must be an object");let entries=Object.entries(root.methods);if(entries.length>200)throw new Error("bridgeConfig supports at most 200 methods");let methods={};for(let[method,rawConfig]of entries){if(!method.trim()||method.length>200)throw new Error("bridgeConfig method names must contain 1-200 characters");if(method==="__proto__"||method==="prototype"||method==="constructor")throw new Error(`bridgeConfig method name "${method}" is reserved`);if(!rawConfig||typeof rawConfig!="object"||Array.isArray(rawConfig))throw new Error(`bridgeConfig.methods.${method} must be an object`);let methodConfig=rawConfig,supportedKeys=new Set(["behavior","response","noop","silent"]);if(Object.keys(methodConfig).some(key=>!supportedKeys.has(key)))throw new Error(`bridgeConfig.methods.${method} contains an unsupported field`);if("behavior"in methodConfig&&typeof methodConfig.behavior!="string")throw new Error(`bridgeConfig.methods.${method}.behavior must be a string`);let hasBehavior=typeof methodConfig.behavior=="string",hasResponse=Object.prototype.hasOwnProperty.call(methodConfig,"response"),hasNoop=methodConfig.noop===!0;if(Number(hasBehavior)+Number(hasResponse)+Number(hasNoop)!==1)throw new Error(`bridgeConfig.methods.${method} must define exactly one of behavior, response, or noop=true`);if(hasBehavior&&!isAppBridgeBehavior(methodConfig.behavior))throw new Error(`bridgeConfig.methods.${method} has an unsupported behavior`);if(hasResponse&&!isJsonValue2(methodConfig.response))throw new Error(`bridgeConfig.methods.${method}.response must be valid JSON data`);if("noop"in methodConfig&&methodConfig.noop!==!0)throw new Error(`bridgeConfig.methods.${method}.noop must be true when provided`);if("silent"in methodConfig&&typeof methodConfig.silent!="boolean")throw new Error(`bridgeConfig.methods.${method}.silent must be a boolean`);methods[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config=>config!==void 0);if(present.length===0)return;let methods={};for(let config of present)Object.assign(methods,validateAppBridgeConfig(config).methods);return validateAppBridgeConfig({methods})}function applyAppBridgeConfig(actions,config){let out=mergeActions(actions);if(!config)return out;let{methods}=validateAppBridgeConfig(config);for(let[method,methodConfig]of Object.entries(methods)){for(let key of BRIDGE_ACTION_ARRAY_KEYS){let values=out[key];values&&(out[key]=values.filter(value=>value!==method))}out.silent=(out.silent??[]).filter(value=>value!==method),delete out.responses?.[method],delete out.behaviors?.[method],methodConfig.behavior?out.behaviors[method]=methodConfig.behavior:Object.prototype.hasOwnProperty.call(methodConfig,"response")?out.responses[method]=methodConfig.response:methodConfig.noop&&out.noop.push(method),methodConfig.silent&&out.silent.push(method)}return out}function buildAppProfileUa(profile,options={}){let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";return profile.uaTemplate?profile.uaTemplate[os13].replaceAll("{v}",version2).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans"):os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36`:"Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1"}function listBuiltinAppProfiles(){return[]}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Install an App simulation capability first.`);return resolveAppProfileDefinition(definition,options)}function resolveAppProfileDefinition(definition,options={}){let profile=validateAppProfileDefinition(definition);if(options.lockDefinition!==void 0&&typeof options.lockDefinition!="boolean")throw new Error("lockDefinition must be a boolean");if(options.os!==void 0&&options.os!=="ios"&&options.os!=="android")throw new Error("Invalid app profile OS");if(options.orientation!==void 0&&options.orientation!=="portrait"&&options.orientation!=="landscape")throw new Error("Invalid app profile orientation");if(options.devicePreset!==void 0&&!Object.hasOwn(DEVICE_PRESETS,options.devicePreset))throw new Error("Invalid app profile device preset");for(let[key,maximum]of[["appVersion",100],["deviceModel",200],["language",100]]){let value=options[key];if(value!==void 0&&(typeof value!="string"||!value||value.length>maximum||/[\r\n]/.test(value)))throw new Error(`Invalid app profile ${key}`)}if(options.language!==void 0&&profile.policies?.languages&&!profile.policies.languages.includes(options.language))throw new Error(`Unsupported ${profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,recommendedPreset=os13==="android"?"pixel-11":"iphone-17-pro",devicePreset=options.devicePreset??recommendedPreset,emulation=resolveEmulationConfig({enabled:!0,preset:devicePreset,orientation:options.orientation}),deviceModel=options.deviceModel??DEVICE_PRESETS[devicePreset].appProfileModel,globals=profile.pageRuntime||profile.bridges.length>0||Object.keys(profile.globals).length>0?{...Object.fromEntries(Object.entries(profile.globals).map(([key,value])=>[key,value.replaceAll("{deviceModel}",deviceModel).replaceAll("{v}",version2)])),__APP_NAME__:profile.appName,__APP_VERSION__:version2,__DEVICE_MODEL__:deviceModel}:{},ua=buildAppProfileUa(profile,{...options,os:os13,deviceModel});return{profile:profile.name,label:profile.label,ua,injected:{...profile.pageRuntime&&{pageRuntime:profile.pageRuntime},binding:{version:1,revision:appProfileRevision(profile),definition:profile,options:JSON.parse(JSON.stringify({...options,os:os13,appVersion:version2,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],settingsUi:profile.settingsUi,settingsGroup:profile.settingsGroup,profile:profile.name,label:profile.label,globals,bridges:profile.bridges,activeEvents:profile.activeEvents,maxTouchPoints:5,statusBarHeight:emulation.safeAreaInsets.top,safeAreaInsets:emulation.safeAreaInsets,deviceAppearance:{preset:devicePreset,orientation:emulation.orientation,cutout:emulation.appearance.cutout},language:options.language??profile.policies?.defaultLanguage??"zh-Hans",userAgent:ua,navigatorPlatform:os13==="android"?"Linux armv8l":"iPhone",platform:os13==="android"?"Android":"iOS",systemVersion:os13==="android"?"17":"26.0",clientType:os13==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.overlay&&{overlay:profile.overlay},...profile.popBeforeOpenParam&&{popBeforeOpenParam:profile.popBeforeOpenParam},...profile.messageEvent&&{messageEvent:profile.messageEvent},...profile.nativeBack&&{nativeBack:profile.nativeBack},...profile.layerUrlProxy&&{layerUrlProxy:profile.layerUrlProxy},...profile.urlSyncHostSuffixes&&{urlSyncHostSuffixes:profile.urlSyncHostSuffixes},...profile.runtimeOptions&&{runtimeOptions:JSON.parse(JSON.stringify(profile.runtimeOptions))},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os13==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}var BRIDGE_ACTION_ARRAY_KEYS,APP_PROFILES,init_profiles2=__esm({"../app-profiles/dist/profiles.js"(){"use strict";init_dist2();BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","protocol","kvGet","kvSet","kvDelete","pageContext","noop"];APP_PROFILES=Object.freeze({})}});async function findAppProfileDefinitionUpdate(current,load,timeoutMs=1500){if(!current.binding||current.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve16=>{timer=setTimeout(()=>resolve16(void 0),timeoutMs)})]);return current.binding.definition.pageRuntime&&definition&&!definition.pageRuntime?void 0:definition&&definition.name===current.profile&&appProfileRevision(definition)!==current.binding.revision?definition:void 0}catch{return}finally{clearTimeout(timer)}}function mergeAppProfileOptions(...sources){let result={};for(let source of sources)if(source){for(let key of OPTION_KEYS)source[key]!==void 0&&Object.assign(result,{[key]:source[key]});source.bridgeConfig!==void 0&&(result.bridgeConfig=mergeAppBridgeConfigs(result.bridgeConfig,source.bridgeConfig))}return result}function getAppProfileExplicitOptions(config){return mergeAppProfileOptions(config.binding?.explicitOptions,{bridgeConfig:config.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current,definition,defaults,options,deviceOptions}={}){let active=current?.profile===name?current:void 0,explicit=mergeAppProfileOptions(defaults,active?getAppProfileExplicitOptions(active):void 0,options),previousDevice=active?.binding?.options,effective=mergeAppProfileOptions(previousDevice&&{os:previousDevice.os,deviceModel:previousDevice.deviceModel,devicePreset:previousDevice.devicePreset,orientation:previousDevice.orientation},explicit,deviceOptions),resolved=resolveAppProfile(name,effective,definition??active?.binding?.definition);return resolved.injected.binding.explicitOptions=Object.fromEntries(Object.entries(explicit).filter(([key])=>key!=="bridgeConfig")),active?.hostCapabilities&&(definition===void 0||definition===active.binding?.definition)&&(resolved.injected.hostCapabilities=structuredClone(active.hostCapabilities)),resolved}function rebuildAppProfileConfig(current,options={},definition=current.binding?.definition){let next=resolveAppProfileUpdate(current.profile,{current,definition,options}).injected;return{...next,animationMs:current.animationMs,statusBarHeight:current.statusBarHeight,safeAreaInsets:current.safeAreaInsets,deviceAppearance:current.deviceAppearance,simulateSystemBars:current.simulateSystemBars,externalDeviceChrome:current.externalDeviceChrome,rootContainer:{...next.rootContainer,...next.rootContainer?.initialCookies&&{initialCookies:next.rootContainer.initialCookies.map(cookie=>({...cookie,value:String(current.statusBarHeight)}))},enabled:current.rootContainer?.enabled??!1,...current.rootContainer?.splitScreen!==void 0&&{splitScreen:current.rootContainer.splitScreen}}}}var OPTION_KEYS,init_updates=__esm({"../app-profiles/dist/updates.js"(){"use strict";init_dist2();init_profiles2();OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"]}});function updateAppProfileSetting(config,id3,value){let binding=config.binding,setting=binding?.definition.settings?.find(item=>item.id===id3);if(!binding||!setting)throw new Error("App profile setting is unavailable");if(setting.type==="boolean"&&typeof value!="boolean"||setting.type==="number"&&(typeof value!="number"||!Number.isFinite(value)||setting.minimum!==void 0&&value<setting.minimum||setting.maximum!==void 0&&value>setting.maximum)||["text","select"].includes(setting.type)&&typeof value!="string"||setting.type==="select"&&!setting.choices?.some(choice=>choice.value===value))throw new Error("Invalid app profile setting value");if(JSON.stringify(value)?.length>16384||value===void 0)throw new Error("Invalid app profile setting value");if("option"in setting.target){let next2=rebuildAppProfileConfig(config,{language:String(value)});return{config:next2,options:next2.binding.options,reload:!0}}let{method,field}=setting.target,old=config.actions.responses?.[method],response=field?{...old&&typeof old=="object"&&!Array.isArray(old)?old:{},[field]:value}:value,patch={methods:{[method]:{response,silent:config.actions.silent?.includes(method)===!0}}},next=rebuildAppProfileConfig(config,{bridgeConfig:patch});return{config:next,options:next.binding.options,responses:{[method]:response},reload:!1}}var init_settings=__esm({"../app-profiles/dist/settings.js"(){"use strict";init_updates()}});var init_changes=__esm({"../app-profiles/dist/environment/changes.js"(){"use strict"}});function installAppProfileDocumentEnvironment(config,options){let browser=globalThis,target=browser;if(options.restoreHintName)try{Object.defineProperty(target,options.restoreHintName,{configurable:!0,enumerable:!1,writable:!1,value:!0})}catch{target[options.restoreHintName]=!0}let includeGlobals=options.globals==="always"||!!config.pageRuntime;for(let[key,value]of Object.entries(includeGlobals?config.globals:{}))try{target[key]=value}catch{}let insets=config.safeAreaInsets??{top:config.statusBarHeight,right:0,bottom:0,left:0};includeGlobals&&(target.__STATUS_BAR_HEIGHT__=config.statusBarHeight,target.__SAFE_AREA_INSET_BOTTOM__=insets.bottom);for(let[key,value]of[["userAgent",config.userAgent],["platform",config.navigatorPlatform],...includeGlobals?[["vendor","Apple Computer, Inc."]]:[],["appVersion",config.userAgent.replace(/^Mozilla\//,"")],["maxTouchPoints",config.maxTouchPoints],...includeGlobals&&config.policies?.navigatorLanguage===!0?[["language",config.language]]:[]])try{Object.defineProperty(browser.navigator,key,{configurable:!0,get:()=>value})}catch{}if(includeGlobals&&config.policies?.navigatorLanguage===!0)try{Object.defineProperty(browser.navigator,"languages",{configurable:!0,get:()=>[config.language]})}catch{}if(options.safeAreaVariables){let apply=()=>{let root=browser.document.documentElement;return root?(root.style.setProperty("--safe-area-inset-top",`${insets.top}px`),root.style.setProperty("--safe-area-inset-right",`${insets.right}px`),root.style.setProperty("--safe-area-inset-bottom",`${insets.bottom}px`),root.style.setProperty("--safe-area-inset-left",`${insets.left}px`),!0):!1};if(!apply()){let observer=new browser.MutationObserver(()=>{apply()&&observer.disconnect()});observer.observe(browser.document,{childList:!0})}}}function installAppProfileWhenDocumentReady(install,waitForBody=!1){let browser=globalThis,ready=()=>!!(browser.document.documentElement&&(!waitForBody||browser.document.body));if(ready()){install();return}let observer=new browser.MutationObserver(()=>{ready()&&(observer.disconnect(),install())});observer.observe(browser.document,{childList:!0,subtree:waitForBody})}var init_document=__esm({"../app-profiles/dist/environment/document.js"(){"use strict"}});function installAppProfileMessageRelay(bindingName,options={}){let browser=globalThis,target=globalThis,markerName=options.markerName??"__mearlCdpAppProfileRelayInstalled__";target[markerName]||(target[markerName]=!0,browser.addEventListener("message",event=>{if(event.source!==globalThis)return;let message=event.data;if(!message||message.source!=="mearl-app-bridge")return;let requestId=message.requestId;if(typeof requestId!="number"||message.type==="settings"&&globalThis.top!==globalThis)return;if(message.type==="prepareWebView"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE",requestId,result:{success:!0}},"*");return}if(message.type!=="protocol"&&message.type!=="protocolStream"&&message.type!=="userInfo"&&message.type!=="authCode"&&message.type!=="authCodeCancel"&&message.type!=="settings"&&message.type!=="screenshot")return;let replyFailure=reason=>{if(browser.console?.warn("[Mearl] App bridge relay unavailable:",reason),message.type==="protocolStream"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PROTOCOL_STREAM_EVENT",requestId,eventType:"onError",data:{error:reason}},"*");return}let responseTypes={protocol:"APP_BRIDGE_PROTOCOL_RESPONSE",userInfo:"APP_BRIDGE_USER_INFO_RESPONSE",authCode:"APP_BRIDGE_AUTH_CODE_RESPONSE",screenshot:"APP_BRIDGE_SCREENSHOT_RESPONSE",settings:"APP_BRIDGE_SETTINGS_RESPONSE"};browser.postMessage({source:"mearl-content",type:responseTypes[String(message.type)],requestId,result:{success:!1,error:reason}},"*")};if(options.supportedTypes&&!options.supportedTypes.includes(String(message.type))){replyFailure("this App bridge operation is not supported by the selected backend");return}let binding=target[bindingName];if(typeof binding!="function"){replyFailure("native relay binding is unavailable");return}try{binding(JSON.stringify({type:message.type,requestId,payload:message.payload}))}catch(error){replyFailure(error instanceof Error?error.message:"native relay call failed")}}))}var init_relay=__esm({"../app-profiles/dist/environment/relay.js"(){"use strict"}});var init_app_device=__esm({"../app-profiles/dist/environment/app-device.js"(){"use strict"}});var init_identity=__esm({"../app-profiles/dist/environment/identity.js"(){"use strict";init_dist2()}});var init_dist8=__esm({"../app-profiles/dist/index.js"(){"use strict";init_profiles2();init_settings();init_updates();init_changes();init_document();init_relay();init_app_device();init_identity()}});function capabilityCatalog(){let factory=nativeCapabilities.get("app.profileCatalog");if(!factory)return cachedFactory=void 0,cachedCatalog=[],[];if(factory===cachedFactory)return structuredClone(cachedCatalog);let contribution=structuredClone(factory());if(!contribution||!/^[a-z][a-z0-9-]{0,79}$/.test(contribution.namespace)||!Array.isArray(contribution.profiles)||contribution.profiles.length>64||!contribution.bindings||typeof contribution.bindings!="object"||Array.isArray(contribution.bindings)||Object.keys(contribution.bindings).length>64)throw new Error("Invalid capability App catalog");let definitions=new Map;for(let raw of contribution.profiles){let definition=validateAppProfileDefinition(raw);if(!definition.name.startsWith(contribution.namespace+"/")||definitions.has(definition.name))throw new Error("Invalid capability App namespace");definitions.set(definition.name,definition)}let bound=new Set,entries=[];for(let[id3,target]of Object.entries(contribution.bindings)){if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof target!="string"||!definitions.has(target))throw new Error("Invalid capability App binding");bound.add(target);let definition=validateAppProfileDefinition({...definitions.get(target),name:id3});entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition})}for(let[id3,definition]of definitions)bound.has(id3)||entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition});if(contribution.order!==void 0){if(!Array.isArray(contribution.order)||new Set(contribution.order).size!==contribution.order.length||contribution.order.some(id3=>!entries.some(entry=>entry.id===id3)))throw new Error("Invalid capability App order");entries.sort((a,b)=>{let first=contribution.order.indexOf(a.id),second=contribution.order.indexOf(b.id);return(first<0?1/0:first)-(second<0?1/0:second)})}return cachedCatalog=entries,cachedFactory=factory,entries}function findCapabilityAppProfile(id3){return capabilityCatalog().find(entry=>entry.id===id3)}async function listInstalledAppProfiles(options={}){let profiles=listBuiltinAppProfiles(),errors=[];try{let contributed=capabilityCatalog();if(contributed.length){let overridden=new Set(contributed.map(entry=>entry.id));profiles=[...contributed,...profiles.filter(entry=>!overridden.has(entry.id))]}}catch(error){errors.push({plugin:"capabilities",error:error instanceof Error?error.message:String(error)})}for(let plugin of listPluginNames())try{let registered=findPluginRegistration(plugin);if(!registered)continue;let registration=options.refresh===!1?registered:await refreshRegisteredPlugin(plugin);for(let raw of registration?.appProfiles?.profiles??[]){if(raw.name.includes("/"))throw new Error("Plugin profile names must be local identifiers");let id3=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition({...raw,name:id3});profiles.push({id:id3,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error){errors.push({plugin,error:error instanceof Error?error.message:String(error)})}return{profiles,errors}}async function resolveInstalledAppProfile(name,options={}){let contributed=capabilityCatalog().find(entry=>entry.id===name);if(contributed)return resolveAppProfile(name,options,contributed.definition);if(!name.includes("/"))return resolveAppProfile(name,options);let profile=(await listInstalledAppProfiles()).profiles.find(candidate=>candidate.id===name);if(!profile)throw new Error(`App profile is unavailable: ${name}`);return resolveAppProfile(name,options,profile.definition)}var cachedFactory,cachedCatalog,init_app_profile_catalog=__esm({"src/app-profile-catalog.ts"(){"use strict";init_native_capability_services();init_plugin2();init_dist8();init_dist2();cachedCatalog=[]}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist2();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}browserId;sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id3=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id3))return id3}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id3){let record4=this.require(id3);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}state(id3){let{tabs:_tabs,...state}=this.require(id3);return state}find(id3){return this.sessions.get(id3)?.browserId===this.browserId()?this.info(id3):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id3){let record4=this.sessions.get(id3);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id3,generation){let record4=this.require(id3);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id3,tabId,source){let record4=this.require(id3),owner=this.owners.get(tabId);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id3)}blockedTabs(id3){return[...this.owners].filter(([,owner])=>owner!==id3).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations=>[...operations])),await operation()}finally{this.browserReleasing=!1}}async run(id3,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id3?this.assertActive(id3).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.networkControl!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id3&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id3))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id3&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve16=>{unlock=resolve16}),runtimeTransport=action==="page_runtime",predecessors=runtimeTransport?[]:[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);if(!runtimeTransport&&this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE)),!runtimeTransport)for(let tab of tabs)this.queues.set(tab,tail);let promise=(async()=>{try{await Promise.all(predecessors),id3&&this.assertActive(id3,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");id3&&tab>=0&&this.claim(id3,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id3)??new Set;pending.add(promise),this.pending.set(id3,pending);try{return await promise}finally{pending.delete(promise),pending.size||this.pending.delete(id3)}}async waitForIdle(id3){await Promise.allSettled([...this.pending.get(id3)??[]])}assertStep(id3,generation){this.assertActive(id3,generation)}recordResult(id3,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id3,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id3,tab.tabId,"created");let target=this.require(id3).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id3).tabs=this.require(id3).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id3).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id3,reason){let record4=this.assertActive(id3);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id3)}async resume(id3,cleanup=async()=>{}){let record4=this.require(id3);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id3);try{return await this.waitForIdle(id3),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id3)}finally{this.resuming.delete(id3)}}async release(id3,params,cleanup){let record4=this.require(id3);if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id3);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id3)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id3&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id3);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error){throw record4.status=previous,error}return this.info(id3)}}}});import{rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID21}from"node:crypto";import{mkdir as mkdir2,open as open4,rm as rm3,stat as stat3,writeFile}from"node:fs/promises";import path13 from"node:path";import os5 from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path13.join(os5.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID21()}`)){this.root=root}root;files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id3,file2]of this.files)!file2.sessionId&&!file2.writing&&Date.now()-file2.accessedAt>3600*1e3&&this.remove(id3).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID21(),directory=path13.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file={artifactId,filename,bytes:0,location:"browser",path:path13.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file.path,"",{mode:384}),this.files.set(artifactId,file),this.info(file)}async importFile(filename,sourcePath,sessionId){let source=await open4(sourcePath,"r"),id3;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id3=(await this.create(filename,sessionId)).artifactId;let file=this.require(id3,sessionId),target=await open4(file.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file.bytes=(await stat3(file.path)).size,file.ready=!0,this.info(file)}catch(error){throw id3&&await this.remove(id3,sessionId),error}finally{await source.close()}}require(id3,sessionId){let file=this.files.get(id3);if(!file||file.sessionId!==void 0&&file.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file.accessedAt=Date.now(),file}info(file){return{artifactId:file.artifactId,filename:file.filename,bytes:file.bytes,location:"browser"}}async write(id3,offset,base64,sessionId){let file=this.require(id3,sessionId);if(file.ready||file.writing||offset!==file.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base64!="string"||base64.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base64.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base64))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base64,"base64");if(chunk.toString("base64")!==base64)throw new Error("Invalid artifact chunk");if(file.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file.writing=!0;try{let handle=await open4(file.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file.bytes+=chunk.length,this.info(file)}finally{file.writing=!1}}complete(id3,bytes,sessionId){let file=this.require(id3,sessionId);if(file.writing||bytes!==file.bytes)throw new Error("Artifact size mismatch");return file.ready=!0,this.info(file)}resolve(id3,sessionId){let file=this.require(id3,sessionId);if(!file.ready)throw new Error("Artifact is not ready");return file.path}async read(id3,offset,sessionId){let file=this.require(id3,sessionId);if(!file.ready||!Number.isSafeInteger(offset)||offset<0||offset>file.bytes)throw new Error("Invalid artifact read");let handle=await open4(file.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file.bytes}}finally{await handle.close()}}async remove(id3,sessionId){let file=this.require(id3,sessionId);await rm3(path13.dirname(file.path),{recursive:!0,force:!0}),this.files.delete(id3)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id3,file]of this.files)file.sessionId===sessionId&&(retain.has(id3)?(file.sessionId=void 0,file.accessedAt=Date.now()):await this.remove(id3,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync14(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm3(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist2();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}dependencies;registry;artifacts=new BrowserArtifactStore;activityQueues=new Map;async withActivity(id3,operation){let pending=(this.activityQueues.get(id3)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id3,pending);try{return await pending}finally{this.activityQueues.get(id3)===pending&&this.activityQueues.delete(id3)}}async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id3,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id3),this.registry.info(id3);operation==="resume"&&await this.activityQueues.get(id3)?.catch(()=>{});let current=this.registry.info(id3),info=operation==="resume"?await this.registry.resume(id3,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0,!0)):current.status==="user"?current:this.registry.handoff(id3,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id3,async()=>{await this.dependencies.deactivate?.(this.registry.info(id3).tabs.map(tab=>tab.tabId),current.transport)}),this.registry.info(id3)):info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data.reason)}}if(action==="browser_release"&&sessionId){let params=data;return await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)}),this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session:this.registry.state(sessionId)}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let performStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file=>this.artifacts.resolve(file.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},invokeStep=(name,payload,batch=!1)=>sessionId&&name==="tab_open"?this.withActivity(sessionId,async()=>(this.registry.assertStep(sessionId,info.generation),performStep(name,payload,batch))):performStep(name,payload,batch),result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm6,rmdir:rmdir2}=await import("node:fs/promises");await rm6(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error){throw created&&sessionId&&await this.registry.release(sessionId,{},async tabs=>{await this.dependencies.cleanup(tabs,transport,!0),await this.artifacts.release(sessionId)}),this.dependencies.notify(),error}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.state(sessionId)}):result}}}});var require_cjs=__commonJS({"../../node_modules/.pnpm/tldts@7.4.19/node_modules/tldts/dist/cjs/index.js"(exports){"use strict";function shareSameDomainSuffix(hostname,vhost){return hostname.endsWith(vhost)?hostname.length===vhost.length||hostname[hostname.length-vhost.length-1]===".":!1}function extractDomainWithSuffix(hostname,publicSuffix){let publicSuffixIndex=hostname.length-publicSuffix.length-2,lastDotBeforeSuffixIndex=hostname.lastIndexOf(".",publicSuffixIndex);return lastDotBeforeSuffixIndex===-1?hostname:hostname.slice(lastDotBeforeSuffixIndex+1)}function getDomain$1(suffix,hostname,options){if(options.validHosts!==null){let validHosts=options.validHosts;for(let vhost of validHosts)if(shareSameDomainSuffix(hostname,vhost))return vhost}let numberOfLeadingDots=0;if(hostname.startsWith("."))for(;numberOfLeadingDots<hostname.length&&hostname[numberOfLeadingDots]===".";)numberOfLeadingDots+=1;return suffix.length===hostname.length-numberOfLeadingDots?null:extractDomainWithSuffix(hostname,suffix)}function getDomainWithoutSuffix$1(domain,suffix){return domain.slice(0,-suffix.length-1)}var CONTROL_CHARS2=/[\t\n\r]/g,extractedHostnameValidated=!1;function isValidHostnameChar(code){return code>=97&&code<=122||code>=48&&code<=57||code>127||code>=65&&code<=90||code===45||code===95}function getSpecialScheme(url,schemeStart,colonIndex){let length=colonIndex-schemeStart,c0=url.charCodeAt(schemeStart)|32;if(length===2)return c0===119&&(url.charCodeAt(schemeStart+1)|32)===115?1:0;if(length===3){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32;return c0===119&&c1===115&&c2===115||c0===102&&c1===116&&c2===112?1:0}else if(length===4){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32,c3=url.charCodeAt(schemeStart+3)|32;return c0===104&&c1===116&&c2===116&&c3===112?1:c0===102&&c1===105&&c2===108&&c3===101?2:0}else if(length===5)return c0===104&&(url.charCodeAt(schemeStart+1)|32)===116&&(url.charCodeAt(schemeStart+2)|32)===116&&(url.charCodeAt(schemeStart+3)|32)===112&&(url.charCodeAt(schemeStart+4)|32)===115?1:0;return 0}function extractHostname(url,urlIsValidHostname,validate2=!1){let start=0,end=url.length,hasUpper=!1,isSpecial=!1;if(extractedHostnameValidated=!1,!urlIsValidHostname){if(url.startsWith("data:"))return null;for(;start<url.length&&url.charCodeAt(start)<=32;)start+=1;for(;end>start+1&&url.charCodeAt(end-1)<=32;)end-=1;if(url.charCodeAt(start)===47&&url.charCodeAt(start+1)===47)start+=2;else{let indexOfProtocol=url.indexOf(":/",start);if(indexOfProtocol!==-1){let special=getSpecialScheme(url,start,indexOfProtocol);if(special===1)for(isSpecial=!0,start=indexOfProtocol+2;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1;else if(special===2){isSpecial=!0,start=indexOfProtocol+1;let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else{for(let i=start;i<indexOfProtocol;i+=1){let code=url.charCodeAt(i)|32;if(!(code>=97&&code<=122||code>=48&&code<=57||code===46||code===45||code===43)){let raw=url.charCodeAt(i);return raw===9||raw===10||raw===13?extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2):null}}if(url.charCodeAt(indexOfProtocol+2)===47)start=indexOfProtocol+3;else return null}}else if(url.charCodeAt(start)!==91){let indexOfColon=-1;for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code===9||code===10||code===13)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(code===58){indexOfColon=i;break}if(code===47||code===92||code===63||code===35)break}if(indexOfColon!==-1){let hasIdentifier=!1;for(let i=indexOfColon+1;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code===64){hasIdentifier=!0;break}}if(!hasIdentifier){let allDigits=!0,i=indexOfColon+1;for(;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code<48||code>57){allDigits=!1;break}}if(i===indexOfColon+1&&(allDigits=!1),!allDigits){let special=getSpecialScheme(url,start,indexOfColon);if(special===0){let isBareIpv6=!1;for(let j=indexOfColon+1;j<end;j+=1){let code=url.charCodeAt(j);if(code===47||code===92||code===63||code===35)break;if(code===58){isBareIpv6=!0;break}}if(!isBareIpv6)return null}else if(isSpecial=!0,start=indexOfColon+1,special===2){let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else for(;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1}}}}}let indexOfIdentifier=-1,indexOfClosingBracket=-1,indexOfPort=-1,indexOfFirstColon=-1,hasControl=!1,vValid=validate2,vLastDot=start-1,vLastCode=-1;if(validate2&&start<end){let c0=url.charCodeAt(start);(!(isValidHostnameChar(c0)||c0===46||c0===95)||c0===45)&&(vValid=!1)}for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code<64)if(code===47||code===35||code===63){end=i;break}else code===58?(indexOfFirstColon===-1&&(indexOfFirstColon=i),indexOfPort=i):code===9||code===10||code===13?hasControl=!0:validate2&&(code===46?((i-vLastDot>64||vLastCode===46||vLastCode===45)&&(vValid=!1),vLastDot=i):(code<48||code>57)&&(code!==45||vLastCode===46)&&(vValid=!1));else if(isSpecial&&code===92){end=i;break}else code===64?(indexOfIdentifier=i,indexOfFirstColon=-1):code===93?indexOfClosingBracket=i:code>=65&&code<=90?hasUpper=!0:validate2&&!isValidHostnameChar(code)&&(vValid=!1);validate2&&(vLastCode=code)}if(hasControl)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(indexOfIdentifier!==-1&&indexOfIdentifier>=start&&indexOfIdentifier<end&&(start=indexOfIdentifier+1),url.charCodeAt(start)===91)return indexOfClosingBracket!==-1?url.slice(start+1,indexOfClosingBracket).toLowerCase():null;if(indexOfPort!==-1&&indexOfPort>start&&indexOfPort<end&&indexOfFirstColon===indexOfPort&&(end=indexOfPort),start>=end)return null;validate2&&vValid&&indexOfIdentifier===-1&&indexOfPort===-1&&indexOfClosingBracket===-1&&url.charCodeAt(end-1)!==46&&end-start<=255&&end-vLastDot-1<=63&&vLastCode!==45&&(extractedHostnameValidated=!0)}for(;end>start+1&&url.charCodeAt(end-1)===46;)end-=1;let hostname=start!==0||end!==url.length?url.slice(start,end):url;return hasUpper?hostname.toLowerCase():hostname}function isProbablyIpv4(hostname){if(hostname.length<7||hostname.length>15)return!1;let numberOfDots=0;for(let i=0;i<hostname.length;i+=1){let code=hostname.charCodeAt(i);if(code===46)numberOfDots+=1;else if(code<48||code>57)return!1}return numberOfDots===3&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(hostname.length-1)!==46}function isProbablyIpv6(hostname){if(hostname.length<3)return!1;let start=hostname.startsWith("[")?1:0,end=hostname.length;if(hostname[end-1]==="]"&&(end-=1),end-start>39)return!1;let hasColon=!1;for(;start<end;start+=1){let code=hostname.charCodeAt(start);if(code===58)hasColon=!0;else if(!(code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=70))return!1}return hasColon}function isIp(hostname){return isProbablyIpv6(hostname)||isProbablyIpv4(hostname)}var SPECIAL_USE_DOMAINS2=["test","localhost","invalid","example","example.com","example.net","example.org","local","onion","alt","home.arpa","ipv4only.arpa","resolver.arpa","service.arpa","6tisch.arpa","eap.arpa"];function isSpecialUse(hostname){for(let name of SPECIAL_USE_DOMAINS2)if(hostname.endsWith(name)&&(hostname.length===name.length||hostname.charCodeAt(hostname.length-name.length-1)===46))return!0;return!1}function isValidAscii(code){return code>=97&&code<=122||code>=48&&code<=57||code>127}function isValidHostname(hostname){if(hostname.length>255||hostname.length===0||!isValidAscii(hostname.charCodeAt(0))&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(0)!==95)return!1;let lastDotIndex=-1,lastCharCode=-1,len=hostname.length;for(let i=0;i<len;i+=1){let code=hostname.charCodeAt(i);if(code===46){if(i-lastDotIndex>64||lastCharCode===46||lastCharCode===45)return!1;lastDotIndex=i}else if(!(isValidAscii(code)||code===45||code===95)||code===45&&lastCharCode===46)return!1;lastCharCode=code}return len-lastDotIndex-1<=63&&lastCharCode!==45}function setDefaultsImpl({allowIcannDomains=!0,allowPrivateDomains=!1,detectIp=!0,detectSpecialUse=!1,extractHostname:extractHostname2=!0,mixedInputs=!0,validHosts=null,validateHostname=!0}){return{allowIcannDomains,allowPrivateDomains,detectIp,detectSpecialUse,extractHostname:extractHostname2,mixedInputs,validHosts,validateHostname}}var DEFAULT_OPTIONS=setDefaultsImpl({});function setDefaults(options){return options===void 0?DEFAULT_OPTIONS:setDefaultsImpl(options)}function getSubdomain$1(hostname,domain){return domain.length===hostname.length?"":hostname.slice(0,-domain.length-1)}function getEmptyResult(){return{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,isSpecialUse:null,publicSuffix:null,subdomain:null}}function resetResult(result){result.domain=null,result.domainWithoutSuffix=null,result.hostname=null,result.isIcann=null,result.isIp=null,result.isPrivate=null,result.isSpecialUse=null,result.publicSuffix=null,result.subdomain=null}function parseImpl(url,step,suffixLookup2,partialOptions,result){let options=setDefaults(partialOptions);if(typeof url!="string")return result;let urlIsValid=!1;return options.extractHostname?options.mixedInputs?(urlIsValid=isValidHostname(url),result.hostname=extractHostname(url,urlIsValid,options.validateHostname)):result.hostname=extractHostname(url,!1,options.validateHostname):result.hostname=url,options.detectIp&&result.hostname!==null&&(result.isIp=isIp(result.hostname),result.isIp)?result:options.validateHostname&&options.extractHostname&&result.hostname!==null&&!(urlIsValid&&result.hostname===url)&&!extractedHostnameValidated&&!isValidHostname(result.hostname)?(result.hostname=null,result):(step===0||result.hostname===null||(step===5&&options.detectSpecialUse&&(result.isSpecialUse=isSpecialUse(result.hostname)),suffixLookup2(result.hostname,options,result),step===2||result.publicSuffix===null)||(result.domain=getDomain$1(result.publicSuffix,result.hostname,options),step===3||result.domain===null)||(result.subdomain=getSubdomain$1(result.hostname,result.domain),step===4)||(result.domainWithoutSuffix=getDomainWithoutSuffix$1(result.domain,result.publicSuffix)),result)}function fastPathLookup(hostname,options,out){if(!options.allowPrivateDomains&&hostname.length>3){let last=hostname.length-1,c3=hostname.charCodeAt(last),c2=hostname.charCodeAt(last-1),c1=hostname.charCodeAt(last-2),c0=hostname.charCodeAt(last-3);if(c3===109&&c2===111&&c1===99&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="com",!0;if(c3===103&&c2===114&&c1===111&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="org",!0;if(c3===117&&c2===100&&c1===101&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="edu",!0;if(c3===118&&c2===111&&c1===103&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="gov",!0;if(c3===116&&c2===101&&c1===110&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="net",!0;if(c3===101&&c2===100&&c1===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="de",!0}return!1}var nodeFlags=new Uint8Array([1,2,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,2,2,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,2,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,2,0,2,2,0,0,2,2,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,2,0,1,1,0,2,0,2,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,2,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2,2,0,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,2,2,1,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,2,1,1,1,2,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]),edgeStart=new Uint16Array([0,0,0,10,11,18,106,111,117,124,130,136,145,146,147,148,149,150,151,153,154,155,157,159,228,241,243,244,245,260,267,268,271,272,273,276,278,297,298,300,309,314,331,332,335,336,338,340,376,377,379,382,383,387,389,393,396,428,431,444,445,453,454,456,466,480,481,482,483,492,493,530,535,551,571,577,619,620,647,674,675,823,829,832,833,834,839,844,853,875,876,877,878,879,880,881,899,901,902,905,907,908,910,912,927,942,947,948,950,951,952,953,954,956,959,964,965,966,968,969,972,975,976,977,990,992,1004,1015,1023,1025,1065,1068,1072,1073,1075,1078,1089,1091,1101,1103,1109,1111,1112,1114,1117,1118,1119,1172,1174,1176,1196,1197,1198,1199,1201,1212,1243,1254,1255,1268,1278,1287,1295,1296,1301,1315,1326,1338,1350,1364,1365,1376,1410,1411,1412,1428,1444,1456,1529,1530,1532,1533,1569,1588,1589,1590,1591,1592,1595,1599,1602,1604,1638,1639,1647,1648,1649,1650,1651,1652,1654,1656,1658,1659,1663,1664,1665,1667,1669,1670,1672,1673,1674,1685,1687,1688,1692,1693,1696,1703,1704,1709,1713,1714,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,2193,2196,2197,2199,2206,2213,2223,2227,2238,2239,2240,2252,2253,2255,2257,2258,2265,2266,2268,2269,2271,2272,2273,2274,2275,2349,2351,2372,2373,2374,2376,2378,2379,2430,2431,2433,2440,2446,2456,2466,2519,2520,2521,2531,2545,2546,2549,2556,2557,2565,2567,2568,2569,2570,2581,2582,2583,2585,2586,2587,2596,2608,2614,2646,2650,2652,2653,2655,2656,2667,2668,2670,2678,2685,2691,2696,2697,2703,2706,2712,2719,2720,2727,2735,2736,2737,2775,2781,2796,2797,2802,2820,2851,2869,2871,2874,2882,2884,2891,2943,2967,2968,2969,2970,2971,2972,2973,2980,2981,2982,2983,2984,2985,2987,2988,2992,3072,3085,3086,3523,3527,3541,3593,3621,3643,3701,3723,3738,3801,3852,3890,3926,3951,4093,4139,4190,4209,4243,4258,4278,4308,4339,4362,4393,4423,4455,4482,4557,4579,4617,4627,4661,4680,4706,4748,4798,4824,4893,4894,4896,4919,4942,4978,5009,5026,5083,5096,5120,5149,5151,5185,5201,5229,5534,5543,5552,5559,5576,5580,5586,5625,5627,5634,5641,5650,5657,5658,5659,5671,5674,5689,5690,5699,5700,5709,5718,5724,5726,5727,5728,5765,5766,5768,5776,5783,5796,5800,5802,5803,5809,5816,5830,5840,5845,5853,5861,5867,5868,5872,5874,5875,5887,5959,5960,5961,5962,5964,5965,5968,5970,5973,5977,5978,5979,5985,5986,5987,5989,5991,5993,5994,5995,5998,6e3,6003,6004,6006,6204,6211,6212,6213,6223,6228,6245,6259,6268,6269,6270,6274,6275,6277,6279,6285,6286,6289,6290,6292,6293,6294,7194,7197,7201,7219,7228,7231,7238,7239,7241,7242,7243,7245,7297,7298,7301,7302,7419,7420,7431,7442,7449,7452,7461,7462,7463,7478,7533,7725,7727,7728,7730,7735,7748,7763,7770,7779,7782,7785,7792,7800,7804,7805,7806,7820,7824,7833,7834,7835,7839,7874,7875,7893,7900,7908,7909,7914,7922,7966,7967,7973,7976,7988,7993,7994,7996,7998,8033,8034,8040,8047,8048,8057,8066,8081,8085,8086,8138,8139,8144,8145,8148,8150,8151,8152,8161,8175,8183,8197,8209,8210,8212,8214,8236,8247,8253,8254,8266,8278,8365,8377,8385,8388,8394,8419,8422,8423,8424,8425,8427,8430,8433,8444,8446,8448,8476,8551,8558,8562,8563,8572,8594,8595,8600,8601,8680,8682,8684,8693,8697,8703,8709,8715,8725,8730,8731,8749,8760,8765,8770,8780,8786,8790,8796,8802,10410,10411,10412,10419,10421]),edgeLength=new Uint8Array([3,3,3,3,3,3,3,3,5,8,8,2,2,3,3,3,3,3,8,5,5,5,5,5,3,3,5,5,9,12,19,8,19,8,11,9,9,8,7,7,6,8,9,16,10,7,7,11,8,6,6,9,7,11,7,14,4,4,4,4,4,4,10,7,6,6,6,6,10,10,6,10,10,22,11,9,10,10,10,9,10,8,7,7,7,8,21,13,11,11,9,10,9,13,10,8,8,9,12,9,7,10,7,7,13,7,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,8,6,3,3,3,3,3,3,2,5,3,3,3,7,2,2,2,2,2,2,3,3,3,1,1,7,8,5,2,2,7,2,2,1,4,1,11,9,9,5,5,8,5,5,5,5,5,5,5,3,3,3,3,3,5,11,9,9,13,7,14,7,6,6,6,7,6,6,6,6,6,6,10,7,11,9,4,4,4,4,4,6,6,6,6,13,6,8,7,10,9,9,7,9,8,9,8,7,10,6,9,8,10,10,7,8,1,9,10,12,12,12,10,9,9,10,10,9,9,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,4,3,3,3,7,4,4,4,3,3,6,7,3,4,1,2,2,2,6,1,2,2,2,2,2,12,5,3,8,9,13,4,4,13,9,9,11,7,3,12,9,2,2,2,3,3,3,3,3,8,2,2,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,3,7,10,15,15,7,15,20,15,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,8,6,8,8,6,8,13,8,8,6,13,8,11,13,8,6,13,8,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,9,9,9,10,14,14,11,13,13,9,9,9,9,9,9,2,6,9,2,2,3,3,3,3,3,3,3,3,3,4,4,4,2,3,3,3,3,3,3,7,7,2,3,2,2,5,3,3,3,3,3,3,4,2,2,2,2,2,2,3,3,3,3,3,3,3,4,5,7,4,2,2,12,8,10,8,10,7,18,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,2,3,3,3,5,5,3,8,8,6,8,6,6,4,6,7,7,7,10,11,2,5,5,3,3,3,3,3,3,5,5,6,11,10,7,7,7,4,4,4,2,3,3,3,3,3,2,2,7,5,5,3,3,3,3,3,3,3,3,7,7,7,11,7,6,9,6,6,8,10,8,6,8,13,4,4,4,4,4,10,8,11,8,8,8,10,10,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,10,13,7,8,7,11,8,8,6,9,8,8,6,6,6,8,8,6,6,6,6,6,9,7,6,4,4,4,4,4,4,4,6,6,6,9,7,8,10,8,8,2,3,3,3,3,3,2,8,9,9,2,2,2,3,3,3,2,3,3,3,9,2,2,3,3,3,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,5,5,3,5,4,2,3,2,4,3,9,2,2,2,2,2,5,5,3,8,8,13,6,10,9,4,7,9,11,2,3,7,3,3,4,1,3,4,2,9,3,3,12,5,3,7,10,10,7,4,4,6,14,7,9,7,13,2,2,2,2,2,2,3,3,3,3,3,8,15,4,4,2,3,3,3,7,4,9,9,2,3,3,3,5,3,2,2,7,2,7,6,6,7,2,4,2,2,2,2,2,2,8,8,8,9,5,2,3,3,3,3,3,3,10,7,4,4,4,4,3,4,2,3,3,3,3,3,10,7,4,4,4,4,2,3,3,3,3,10,7,4,4,4,4,3,9,6,6,6,9,13,9,2,2,2,8,7,9,5,3,3,3,5,5,13,12,9,10,7,8,7,6,8,6,11,12,7,10,4,4,7,8,11,6,7,9,8,7,10,8,9,15,7,8,5,4,7,2,3,3,3,2,14,10,2,14,10,2,14,3,9,13,13,10,14,16,17,11,2,14,2,14,3,9,13,10,14,16,17,11,14,10,14,2,7,3,10,7,14,10,2,14,10,9,9,17,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,10,10,10,12,9,4,10,10,11,8,8,8,7,9,5,3,3,3,3,3,3,3,3,5,8,4,4,4,4,4,4,6,16,3,3,14,3,14,2,14,9,13,10,10,14,16,17,11,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,9,9,9,9,9,9,2,14,9,13,10,10,14,16,17,11,6,14,2,14,9,17,13,10,10,14,17,16,17,11,6,2,14,9,13,10,14,17,16,17,11,2,14,9,13,10,14,16,17,11,2,14,9,13,10,17,16,11,17,2,14,10,19,7,2,14,9,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,16,17,11,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,17,13,10,10,14,17,16,17,11,6,3,2,14,9,13,10,10,14,16,17,11,6,9,10,12,14,14,14,12,12,12,12,12,14,14,14,10,10,10,14,9,9,9,9,14,14,14,13,13,14,9,9,9,9,9,9,4,11,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,17,16,17,11,2,9,10,10,7,17,3,3,12,12,16,15,15,12,14,14,14,20,20,13,12,12,12,12,12,12,20,25,14,14,12,12,10,10,10,10,14,9,9,9,25,4,9,17,10,7,14,16,21,13,13,14,20,14,13,17,24,9,12,13,25,13,21,20,17,9,9,9,9,9,9,12,17,4,4,9,9,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,9,10,14,12,12,14,14,10,9,9,9,10,14,14,14,9,9,9,9,2,1,5,8,7,11,11,1,3,3,3,5,3,3,4,8,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,4,4,4,4,4,4,4,4,4,10,2,2,6,7,6,2,3,2,3,6,2,7,6,10,7,4,9,12,6,14,4,12,7,2,2,1,2,7,6,4,4,4,6,8,8,7,2,2,13,2,2,2,2,6,2,8,12,2,7,7,6,8,10,12,2,2,2,3,3,13,2,2,3,3,6,7,6,4,5,6,3,3,3,3,4,16,8,5,4,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,12,7,7,13,9,10,17,12,8,9,7,17,17,8,5,12,10,13,14,5,5,5,13,5,5,5,3,3,3,5,16,5,5,5,5,7,12,14,8,12,8,10,12,9,11,7,9,7,10,7,13,9,7,12,8,17,7,7,16,10,13,13,8,10,10,14,17,7,16,16,15,8,10,10,12,17,17,7,17,14,7,10,17,8,7,7,7,8,15,15,7,14,10,10,10,11,11,7,7,13,8,10,7,16,7,8,7,14,17,12,10,11,21,8,9,7,13,9,8,6,13,6,12,7,6,13,10,10,10,8,18,9,17,13,10,12,6,13,6,11,8,13,10,13,18,13,11,13,8,16,7,10,8,16,12,10,8,8,14,11,8,15,8,8,7,7,12,7,8,9,14,15,8,9,10,9,15,7,8,8,12,13,9,10,15,13,7,10,10,20,7,6,9,6,6,14,11,14,11,12,9,10,16,16,12,7,11,28,8,11,10,7,21,8,7,9,4,4,4,17,7,8,6,9,6,6,13,6,6,6,6,18,20,14,8,11,12,9,10,13,15,15,19,8,9,12,7,10,16,12,9,9,9,14,12,11,10,9,12,11,18,9,9,9,10,7,7,16,8,9,7,13,12,10,14,18,7,8,11,7,7,8,8,13,7,7,7,11,15,13,11,7,8,15,11,7,8,18,14,13,18,15,10,12,12,9,7,11,11,8,7,10,8,14,12,10,18,7,10,9,7,8,13,10,14,10,8,8,23,7,7,11,12,12,17,7,7,11,11,17,16,16,7,8,11,14,14,8,10,7,7,16,16,13,9,11,9,15,15,11,11,7,7,14,7,9,7,7,16,10,13,10,11,14,7,11,10,11,7,11,10,11,15,11,15,10,12,10,14,13,11,11,12,13,10,7,13,10,16,12,21,15,9,10,10,7,11,14,17,7,7,8,11,13,12,8,15,14,14,8,17,12,10,10,7,9,11,7,10,7,11,18,7,11,7,12,11,8,8,14,12,7,8,15,3,7,7,5,2,9,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,5,3,3,3,3,3,3,4,4,3,3,3,3,3,3,5,11,6,4,7,10,7,7,11,1,10,2,2,3,3,3,3,3,3,3,3,5,7,3,5,6,3,3,5,2,2,5,3,4,13,11,3,3,6,3,5,14,2,2,3,8,2,2,12,5,18,5,3,3,3,16,5,5,5,10,7,13,12,13,9,12,14,19,9,9,21,9,9,10,6,9,6,15,10,6,12,8,6,10,15,4,4,6,6,9,9,12,16,14,23,7,7,7,14,9,7,7,11,14,10,7,10,10,10,12,6,11,10,13,11,15,11,7,12,10,3,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,3,7,1,5,2,2,2,5,5,5,5,3,3,3,3,3,5,5,10,9,11,8,7,12,8,9,7,6,13,11,6,13,7,9,9,4,4,4,4,4,6,10,7,8,13,8,8,9,14,7,8,10,7,7,7,9,6,9,7,2,12,5,3,3,13,4,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,4,4,4,4,4,4,4,4,4,9,3,3,3,3,3,3,3,3,3,3,4,2,2,2,5,3,3,3,3,3,3,3,3,4,4,1,7,6,4,12,3,3,3,3,3,8,7,3,3,3,3,3,3,4,4,11,15,14,2,8,3,5,5,8,10,8,6,4,7,17,7,4,5,2,6,3,2,2,12,5,5,3,15,13,8,11,2,2,3,3,3,3,3,3,3,3,4,4,5,3,3,3,3,4,18,2,12,5,3,3,3,3,3,5,16,8,8,9,6,6,4,4,4,4,31,6,6,10,11,21,10,9,7,10,7,7,2,4,4,4,4,6,5,3,3,4,3,3,3,3,3,3,3,3,3,6,6,6,2,2,2,5,3,3,3,7,7,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,8,2,3,3,3,3,3,5,9,11,3,3,3,3,4,4,3,3,3,3,3,5,10,9,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,11,10,10,10,10,10,11,10,11,10,11,10,9,9,11,3,3,3,3,3,3,5,3,7,8,8,7,6,6,11,4,4,4,7,8,9,9,2,3,7,4,4,2,5,5,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,2,2,5,5,5,5,5,3,3,5,5,5,7,7,6,6,6,4,4,4,4,4,4,4,4,4,4,6,6,8,8,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,6,9,12,3,7,10,7,2,2,3,3,3,3,3,4,3,3,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,6,6,8,6,7,4,4,4,4,4,4,6,7,5,5,20,19,8,10,9,7,10,6,8,11,6,6,6,6,13,12,8,6,7,14,11,9,2,5,3,6,2,3,2,2,2,2,2,2,2,5,4,3,7,6,4,7,4,3,6,4,7,2,7,7,7,5,5,5,5,3,3,3,3,3,3,3,3,3,5,9,10,10,11,7,8,20,7,8,9,8,12,6,6,6,8,9,8,12,6,6,8,13,10,12,6,6,7,7,9,6,4,4,4,4,4,4,10,6,6,6,7,14,11,10,7,8,10,8,11,14,11,11,9,7,9,8,11,9,17,10,9,2,2,2,9,3,3,3,3,15,14,9,5,5,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,12,22,19,17,18,18,19,21,7,16,16,5,5,5,5,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5,5,5,5,5,9,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,7,16,11,11,7,7,7,7,17,7,8,12,15,9,19,7,19,8,21,11,12,19,14,22,7,7,7,7,7,7,7,7,7,7,7,16,16,19,24,12,7,14,7,12,7,8,10,10,13,7,12,12,7,7,10,18,15,12,16,7,14,12,17,10,16,17,12,17,25,7,7,7,13,6,9,6,9,18,6,6,11,20,10,6,6,6,6,6,6,17,6,6,6,15,6,6,6,6,6,8,14,11,12,11,15,13,19,17,21,7,18,8,13,13,8,12,8,6,6,13,6,15,15,16,6,6,16,6,6,6,14,6,18,6,6,6,17,18,9,13,15,8,19,8,15,15,18,14,16,4,4,4,4,4,4,4,4,4,4,4,4,6,11,10,11,6,21,23,12,17,12,11,14,13,22,15,15,11,12,14,12,7,12,8,12,14,12,18,10,8,16,19,17,12,14,15,8,19,17,12,13,13,15,18,13,23,24,23,21,17,24,8,21,8,14,14,16,20,14,8,8,15,20,8,19,21,9,8,13,12,13,15,11,8,11,9,9,8,11,8,21,14,21,15,15,13,7,19,7,7,7,7,7,7,16,12,17,18,7,7,11,11,7,9,9,2,2,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,3,3,10,10,7,9,7,7,7,6,8,6,6,6,6,6,6,6,7,6,8,6,6,9,7,7,7,4,4,4,4,4,4,4,4,8,9,8,7,8,7,8,10,7,5,5,5,5,5,5,3,9,7,7,8,6,6,6,6,6,6,6,6,9,6,6,9,11,13,7,8,9,9,5,5,5,7,8,6,6,6,6,6,6,6,7,8,9,7,10,9,10,7,8,5,5,5,5,5,5,7,7,9,8,7,7,6,6,6,6,6,6,10,6,6,6,6,6,6,6,6,6,6,6,9,10,4,4,4,4,8,7,7,10,10,9,8,8,15,9,8,8,8,8,8,9,10,9,10,7,8,13,5,5,5,5,5,3,3,7,7,8,6,6,6,4,4,11,9,7,8,9,10,7,5,5,5,5,5,3,3,7,6,6,13,7,9,8,7,5,5,5,5,5,5,5,5,3,3,3,3,7,8,7,8,13,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,6,6,6,6,7,6,7,6,6,9,7,4,4,4,4,4,4,4,7,8,7,8,9,8,8,8,7,10,7,8,5,5,5,5,5,5,5,5,3,7,7,7,7,9,7,10,9,6,6,6,6,6,8,8,6,6,6,7,6,6,6,9,9,4,4,13,7,10,9,9,12,7,8,8,10,8,8,8,8,8,8,5,5,5,5,3,7,7,11,7,9,8,8,6,6,10,6,8,8,8,6,7,6,6,12,4,4,4,4,4,4,4,4,4,9,8,8,16,8,9,8,7,5,5,5,5,5,3,3,7,7,7,10,15,8,9,8,9,9,6,6,6,6,6,6,7,4,8,7,8,8,7,8,11,8,5,5,5,5,5,3,7,7,6,11,16,7,6,4,4,4,4,9,9,8,8,8,13,12,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,7,8,8,9,13,7,7,7,9,8,8,9,12,7,12,7,12,8,7,10,12,9,9,6,6,8,8,6,6,6,6,6,6,6,9,8,9,11,8,6,6,6,6,6,12,7,6,6,6,9,7,7,6,6,6,6,6,11,9,6,6,6,6,6,7,9,4,4,4,4,4,4,4,4,9,9,9,9,7,7,7,7,7,11,7,7,8,8,8,8,8,8,9,8,9,9,7,7,11,11,7,12,8,8,8,8,8,7,8,8,8,8,8,13,12,8,8,8,8,7,7,7,9,5,5,5,5,5,5,5,3,3,7,7,11,7,8,8,8,6,6,6,6,6,6,6,6,6,6,6,10,11,6,7,9,4,4,4,4,4,4,9,9,8,9,8,8,8,7,7,5,5,5,5,5,5,5,5,5,5,3,3,11,7,7,7,9,6,6,11,8,10,6,6,6,12,8,8,7,6,6,8,7,4,4,4,4,4,4,4,4,9,10,9,9,8,10,9,11,8,5,5,5,7,6,6,8,7,4,4,4,4,8,7,7,8,7,8,8,5,5,5,5,7,7,8,8,8,6,6,6,6,6,10,8,9,13,6,7,6,6,8,7,8,4,4,4,4,11,8,8,8,10,5,5,8,7,8,13,8,7,6,8,6,9,7,8,7,5,5,5,5,5,5,3,3,7,8,9,6,4,8,10,10,8,12,9,13,2,7,5,5,5,5,5,7,7,10,6,6,6,6,6,6,6,8,4,4,9,8,8,8,14,8,8,8,9,8,5,5,5,5,5,3,3,9,6,6,6,6,10,12,6,6,6,6,6,6,6,4,4,4,4,11,8,7,8,8,8,5,5,3,3,3,3,7,7,6,8,6,8,11,7,6,6,6,7,4,8,11,9,10,5,5,5,3,3,3,7,7,8,9,8,15,9,6,6,6,6,6,6,11,11,4,4,4,4,4,7,9,9,10,8,7,5,5,5,5,5,5,3,3,8,6,6,6,6,6,6,6,6,6,9,7,4,4,4,4,4,9,9,8,8,10,13,5,5,5,3,17,7,7,7,7,7,8,6,8,13,6,6,6,6,6,6,6,6,4,4,4,9,10,8,8,8,5,5,5,5,3,7,7,7,8,8,6,6,6,8,8,8,9,10,8,4,8,10,9,8,8,8,9,13,10,5,5,5,5,5,5,5,5,5,5,3,3,7,8,9,9,7,7,7,10,9,9,8,9,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,8,12,6,6,6,6,6,6,6,6,6,12,4,4,4,4,4,4,4,4,4,4,4,11,8,8,9,9,10,8,9,7,7,5,5,5,5,5,5,3,7,8,7,6,6,8,6,6,10,4,7,8,9,12,8,7,7,5,5,5,5,5,5,3,3,7,14,7,9,8,8,6,6,8,12,12,6,6,7,7,10,4,4,4,4,4,9,9,14,9,13,8,7,5,5,5,6,6,6,7,4,8,7,5,5,5,5,5,5,5,5,3,3,7,7,7,8,6,6,6,6,6,6,12,6,6,6,6,4,4,9,9,8,8,11,7,7,7,5,5,5,3,9,8,6,6,7,4,4,4,4,4,4,8,8,11,5,5,5,7,7,7,9,6,6,6,6,6,6,9,8,4,4,4,4,7,12,9,8,8,8,7,10,10,5,5,5,5,5,5,5,3,11,14,8,7,8,8,6,6,6,6,6,8,7,6,6,6,7,6,8,9,4,4,4,7,8,9,7,9,7,7,9,8,5,5,5,5,5,5,5,5,5,11,3,9,7,7,12,14,8,6,6,12,11,8,6,6,6,6,6,6,6,6,6,15,7,4,4,4,16,9,9,9,8,9,9,9,9,9,8,8,8,13,11,8,5,5,5,5,3,7,6,6,8,8,8,6,6,7,10,7,4,4,4,4,9,7,8,7,7,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,7,7,7,9,6,6,6,6,6,8,8,7,7,9,6,6,6,7,6,6,6,6,6,15,4,4,4,4,4,8,8,7,8,12,9,8,8,8,8,8,9,8,8,10,8,8,8,8,16,9,10,2,5,5,5,5,5,5,5,9,7,6,8,9,4,4,4,4,4,7,8,8,8,9,8,11,10,5,5,5,5,3,7,8,6,6,6,6,6,8,6,6,6,6,4,12,10,12,7,7,7,7,7,7,7,5,5,5,5,3,3,7,7,10,8,9,7,6,10,7,6,6,4,4,8,9,7,9,9,9,9,8,8,8,8,10,5,5,5,5,5,5,8,7,6,6,6,10,6,7,10,7,4,4,4,4,4,4,4,12,9,10,7,7,10,8,10,5,12,9,6,6,6,6,6,7,6,4,4,4,10,9,9,8,7,7,5,5,5,5,5,5,3,3,13,7,7,9,7,7,7,8,9,9,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,15,15,4,4,4,4,4,10,10,9,8,9,8,8,9,7,8,7,8,5,5,7,6,6,6,4,4,4,7,8,11,8,5,5,5,5,5,5,5,7,6,6,6,6,6,6,9,11,10,7,4,4,4,9,8,8,5,5,5,5,5,9,9,6,6,6,6,6,6,6,9,9,4,4,4,4,8,8,8,9,9,8,8,8,13,2,4,2,7,5,5,5,5,5,5,9,9,6,6,6,6,10,8,8,8,6,6,6,4,4,9,8,10,8,9,8,8,8,9,8,8,5,3,3,3,11,6,6,6,7,6,6,6,4,4,9,8,5,5,5,5,5,3,11,8,6,6,6,6,6,9,7,4,4,14,10,9,8,12,8,8,8,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,10,10,7,7,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,3,7,11,7,7,11,11,7,8,9,10,7,7,9,9,9,9,7,7,10,8,13,8,8,8,8,11,10,6,6,8,10,11,14,14,6,6,6,6,6,6,9,11,7,7,6,8,12,11,11,6,6,10,6,6,6,6,6,10,7,7,6,6,11,6,6,6,11,8,9,7,6,10,11,9,10,11,7,11,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,6,6,8,9,10,9,6,6,6,10,6,6,6,6,11,10,11,10,9,8,7,7,7,7,11,14,8,10,9,9,8,8,7,11,8,8,8,11,11,10,10,9,10,8,11,10,8,11,9,12,8,10,8,11,8,9,9,11,11,10,11,13,8,7,8,8,9,7,8,8,8,8,7,8,2,2,2,2,2,2,2,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,8,6,4,4,4,11,7,11,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,3,3,3,3,8,7,7,8,8,4,8,7,7,7,9,7,8,9,8,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,4,5,5,3,3,8,8,6,9,4,4,10,7,3,3,3,2,5,3,3,3,3,3,3,3,3,3,3,3,3,4,3,2,2,2,3,3,3,3,3,4,10,2,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,2,2,3,3,3,5,2,4,2,6,2,2,9,5,5,3,3,3,3,3,3,3,5,5,5,9,8,7,9,6,6,11,4,4,4,4,4,4,4,4,6,6,7,7,11,8,8,6,5,11,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,6,4,4,4,4,3,3,3,3,5,7,2,3,3,3,3,3,8,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,4,4,4,4,2,2,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,2,3,3,3,3,3,6,3,3,8,10,3,4,4,1,1,1,1,1,1,1,8,9,10,7,7,1,14,18,13,18,13,10,10,16,13,18,16,13,16,18,13,22,16,16,16,14,21,16,9,14,16,9,9,14,10,10,14,12,14,19,12,11,18,13,17,15,15,15,15,16,14,13,19,18,15,19,18,12,18,12,11,20,14,15,10,17,17,16,19,20,21,15,13,16,15,15,15,1,1,3,8,7,7,8,8,8,1,6,1,1,6,3,3,4,7,3,3,5,5,4,4,4,4,4,2,7,7,8,12,3,4,5,1,3,4,4,10,4,3,3,3,8,7,7,2,2,2,2,2,2,2,2,2,12,9,20,7,5,5,5,9,13,5,5,5,5,5,3,3,3,16,5,5,5,13,7,8,8,11,8,7,9,7,11,12,9,9,8,8,11,10,14,7,12,10,11,13,7,9,11,17,17,14,13,7,8,7,10,10,7,16,13,7,8,17,12,9,8,6,7,10,6,6,12,6,8,10,8,8,8,6,8,6,14,6,6,6,13,6,10,6,6,7,14,8,6,6,10,11,10,9,9,7,7,6,6,6,9,9,7,9,10,9,13,12,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,6,8,9,10,9,7,10,10,8,7,8,7,10,12,9,8,15,8,7,8,8,7,7,15,13,7,10,9,14,18,16,7,24,7,8,10,11,16,8,14,7,9,9,9,13,19,14,15,14,11,7,13,9,10,7,13,9,10,11,12,8,9,2,3,5,8,7,4,4,15,10,5,3,3,3,3,3,5,4,4,4,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,4,2,12,5,3,8,10,15,6,7,2,3,2,5,5,12,2,5,5,5,5,2,2,5,5,12,9,5,2,2,9,5,5,12,12,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,12,5,8,8,9,5,5,5,8,19,7,16,15,14,9,9,9,9,7,11,11,11,7,14,10,10,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,12,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,12,9,9,12,12,12,15,7,11,7,14,11,18,13,8,18,15,18,12,14,12,8,8,8,8,9,9,9,12,7,10,10,8,8,12,12,12,7,12,12,9,7,7,7,7,7,8,15,12,9,10,10,7,10,10,13,11,10,9,22,11,9,8,8,8,8,8,13,18,13,9,15,19,9,7,7,10,7,7,7,11,8,13,17,7,7,10,10,10,7,20,16,7,7,7,7,7,7,11,21,12,12,13,11,14,16,8,8,13,11,7,7,13,7,7,14,15,15,6,6,6,6,6,6,6,6,6,6,13,10,18,6,6,6,6,6,6,6,6,6,11,8,8,12,12,11,11,8,12,9,9,9,13,13,9,9,9,9,9,9,6,10,12,6,6,6,6,17,11,7,7,7,7,14,14,12,6,7,7,6,6,15,10,13,10,6,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,9,15,13,6,12,12,6,19,11,10,7,7,16,8,19,17,9,9,9,9,9,6,6,6,10,8,16,8,6,6,9,6,6,6,6,6,6,6,6,8,8,8,6,7,6,6,6,6,6,6,6,6,6,6,6,14,6,6,6,6,20,6,9,6,14,9,9,9,6,9,8,8,12,9,8,8,8,8,7,8,12,7,8,8,8,6,8,6,6,6,6,6,6,6,9,8,8,6,6,13,9,12,13,12,14,13,12,11,11,6,8,8,8,6,13,12,11,11,12,6,11,12,11,13,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,6,6,6,6,6,6,6,13,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,6,18,6,12,13,13,13,9,10,15,9,12,6,6,6,6,6,6,6,6,9,15,10,9,10,13,9,19,8,18,17,10,10,8,8,6,6,6,6,6,6,10,14,8,16,16,9,8,15,8,8,10,12,14,7,7,8,8,7,7,7,7,8,13,13,11,9,9,9,12,10,17,8,11,9,7,7,14,8,14,14,7,7,7,7,7,7,14,7,7,7,7,7,10,10,8,14,7,7,7,7,8,8,8,8,8,17,9,7,15,7,8,12,7,9,14,7,7,7,9,13,8,14,7,16,18,13,15,14,12,13,10,15,9,7,7,7,10,13,15,15,9,9,9,9,19,11,7,11,11,13,8,8,8,8,7,12,19,17,9,9,13,7,7,7,9,7,7,7,12,13,15,10,8,8,14,15,12,13,13,8,12,14,7,11,7,14,15,13,12,8,8,8,8,11,13,15,15,8,13,12,8,8,8,13,10,16,14,11,8,8,12,12,9,15,15,12,12,13,8,8,9,12,13,9,8,8,8,8,8,8,8,8,8,8,8,11,12,11,7,14,7,13,13,13,12,18,16,7,12,11,10,10,15,9,9,9,21,7,7,7,11,16,8,8,11,11,7,7,7,7,7,19,7,7,7,7,7,7,7,7,7,12,8,9,12,14,11,9,9,9,22,12,3,3,4,8,8,15,4,2,2,5,5,3,3,3,3,3,3,6,6,4,4,4,12,7,10,2,3,3,3,3,3,3,3,6,7,3,7,5,14,4,4,7,8,10,4,1,3,3,6,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,5,3,4,2,2,2,2,2,2,11,5,5,5,11,5,5,3,5,5,5,5,11,14,13,9,11,9,12,8,11,11,8,11,16,9,9,7,10,9,12,8,15,6,7,6,6,13,10,8,11,8,6,6,6,12,16,6,11,7,8,9,18,6,6,9,4,4,6,13,6,6,6,6,8,8,9,16,7,7,14,7,8,8,8,7,7,7,7,7,7,15,13,7,10,7,7,10,12,16,15,7,9,9,14,11,11,10,9,10,8,12,7,8,7,7,10,12,7,12,8,7,2,3,3,3,3,3,3,3,3,3,3,5,3,3,5,5,5,10,4,8,7,10,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,7,4,5,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,8,2,2,2,8,12,7,7,5,5,5,5,5,5,5,5,5,5,5,5,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,7,11,9,8,8,8,7,8,9,7,7,9,7,7,7,10,7,7,10,9,10,6,6,6,6,6,6,15,7,8,9,9,8,6,6,10,9,6,8,13,9,7,6,6,6,6,6,6,12,6,6,7,6,7,6,6,6,10,10,7,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,14,6,6,7,7,9,6,6,6,6,9,9,8,9,10,9,8,9,12,7,7,7,8,7,10,12,11,9,10,7,7,7,9,10,10,8,12,9,7,7,9,8,8,8,10,7,7,8,9,9,7,7,7,8,2,4,6,3,4,2,3,3,3,3,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,3,3,3,3,3,3,3,3,5,8,6,4,7,3,3,3,3,3,3,3,12,3,3,3,3,3,3,4,4,2,3,5,3,4,7,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,3,3,6,4,3,4,2,2,2,5,3,3,3,3,3,5,4,4,4,4,7,6,8,9,2,2,2,2,3,3,3,5,7,2,3,3,8,7,7,2,2,8,5,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,7,7,6,10,6,9,7,11,4,6,8,8,7,8,4,5,5,5,5,3,3,11,8,9,6,6,8,7,4,4,7,8,7,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,7,2,2,5,3,3,2,3,3,3,3,3,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,12,5,5,3,3,3,5,10,12,6,15,4,6,6,7,14,9,3,3,3,3,3,8,2,2,3,5,5,3,3,3,3,3,3,8,8,8,7,5,8,4,6,11,2,2,7,3,3,2,9,8,5,5,3,3,3,5,5,7,7,6,6,10,6,8,6,8,9,7,4,4,4,4,7,6,6,7,7,10,9,8,11,8,3,3,3,3,3,4,4,2,3,3,3,3,3,7,6,2,5,6,7,6,4,8,9,11,2,2,3,3,3,3,3,3,3,2,2,5,3,3,3,3,3,9,9,6,4,8,7,7,5,9,8,6,2,8,7,8,5,5,5,5,5,3,3,3,16,8,7,7,7,8,7,7,7,7,9,6,9,6,10,7,7,7,6,10,8,9,11,11,8,4,4,10,8,8,6,9,6,11,8,8,8,15,7,8,9,5,3,3,3,3,3,5,2,2,3,8,9,10,3,2,2,2,2,2,2,3,6,4,2,2,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,11,5,3,3,3,3,3,3,3,3,6,7,4,4,2,3,3,3,3,3,3,3,3,12,7,4,12,4,6,5,4,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,3,4,4,11,10,6,4,6,10,8,3,3,3,3,3,3,3,3,5,4,4,4,2,2,2,2,2,2,2,2,5,3,4,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,5,5,5,5,5,5,3,3,3,3,3,3,3,3,7,8,8,7,13,12,10,10,8,8,7,7,9,12,11,6,6,8,8,9,7,7,7,10,15,10,4,4,4,4,4,11,8,8,9,7,9,14,14,12,2,2,2,2,2,2,2,3,3,3,3,3,12,5,5,5,11,10,7,9,3,8,7,3,15,13,11,4,4,2,2,2,19,7,5,5,3,3,3,3,3,3,3,5,22,18,6,14,17,4,4,19,16,18,2,3,3,7,2,3,2,3,3,6,4,2,3,3,2,5,3,3,3,3,3,3,3,9,9,2,3,2,2,2,3,3,3,5,7,14,7,7,12,9,13,6,11,6,10,9,7,7,8,12,12,8,8,8,10,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,5,8,10,7,8,11,8,12,9,4,14,7,7,9,13,2,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,3,3,3,3,5,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,3,2,3,3,3,3,5,2,2,2,2,5,5,5,5,3,3,3,3,3,3,3,3,3,7,7,7,7,7,8,8,8,8,8,12,9,8,8,9,8,6,17,6,6,6,8,8,6,6,6,6,6,6,6,6,6,6,6,7,4,4,8,8,9,9,9,7,7,7,7,7,7,7,9,9,9,7,8,8,8,10,7,13,10,8,9,3,3,5,13,3,3,3,3,3,7,7,6,6,10,13,11,11,8,8,9,8,9,9,10,10,10,11,10,10,13,13,16,15,11,12,9,9,10,9,11,10,9,9,14,7,8,3,10,7,7,3,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,2,3,3,3,3,3,3,3,3,4,11,6,7,4,6,2,2,3,3,3,1,3,3,3,3,3,3,6,4,4,2,2,2,3,3,3,3,4,4,6,6,6,6,5,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,11,6,10,9,12,7,7,11,14,9,7,12,3,3,7,12,11,12,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,5,5,5,5,5,5,5,5,11,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,3,10,3,3,3,11,3,5,9,11,8,12,14,9,7,8,7,7,11,11,7,7,10,9,8,10,9,7,7,7,7,7,7,8,8,7,11,8,8,8,7,7,10,8,7,13,12,7,17,10,8,8,11,7,11,11,14,7,11,7,8,6,9,20,8,7,9,16,7,10,6,11,10,8,9,7,16,11,11,9,8,9,8,8,8,11,8,15,8,8,9,7,8,8,11,10,7,5,7,10,10,15,7,7,7,8,7,8,8,10,11,10,10,10,11,11,7,8,6,8,8,8,10,6,8,6,6,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,16,6,15,6,7,11,11,7,9,10,11,13,10,6,16,8,10,12,11,6,6,6,6,6,6,6,10,6,10,7,7,7,11,7,11,6,6,6,6,6,6,17,7,7,6,6,12,22,6,6,6,6,6,8,6,6,6,6,7,6,6,5,6,6,8,11,6,9,14,11,9,11,7,7,8,6,6,6,8,10,9,6,6,6,6,9,7,6,6,6,6,6,15,6,4,4,4,6,4,17,8,11,6,6,9,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,6,6,6,6,10,6,10,6,6,6,6,12,8,6,6,6,6,6,6,6,6,6,9,6,6,6,6,18,6,6,6,8,9,10,7,8,9,10,11,7,13,6,8,8,6,6,14,7,7,7,7,10,7,14,9,6,6,9,15,9,7,14,6,11,14,13,7,12,8,7,7,7,7,7,12,7,10,9,16,6,8,6,5,17,6,8,10,4,6,4,10,15,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,4,4,11,7,4,4,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,19,17,6,10,11,6,6,6,6,18,6,6,11,4,4,4,5,6,6,6,9,5,6,4,6,6,4,6,6,6,6,10,6,6,4,6,6,10,6,10,6,6,6,6,11,6,6,10,6,6,8,6,6,6,8,6,11,4,11,9,10,9,11,4,8,4,11,12,7,9,8,6,7,7,8,12,12,11,13,10,11,7,7,7,9,7,11,10,7,7,7,16,11,10,11,17,9,9,8,8,7,7,7,9,7,7,7,14,7,13,9,11,10,14,10,10,12,11,10,7,10,5,14,8,8,8,9,7,8,7,7,9,8,7,8,7,7,7,7,7,7,7,11,8,10,8,7,8,14,11,8,9,9,9,8,24,10,10,12,7,7,15,11,8,8,12,11,8,9,9,7,8,9,10,11,10,11,7,12,7,7,11,9,8,14,13,12,8,11,10,8,8,7,7,14,9,10,8,9,11,7,14,8,8,13,8,8,12,7,10,14,14,11,9,10,9,9,7,7,11,11,13,9,13,5,5,5,7,9,5,11,12,14,8,7,7,11,10,9,7,8,8,7,10,11,11,5,5,7,5,5,5,7,7,15,7,7,8,7,15,12,12,10,7,8,7,11,7,7,7,23,11,8,8,11,10,7,8,11,7,19,7,7,6,9,9,9,11,3,4,7,8,6,6,4,10,8,2,2]),edgeChild=new Uint16Array([0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,17,1,1,1,12,1,12,1,12,13,1,1,1,1,12,1,12,1,1,1,1,1,14,21,1,1,1,1,1,1,1,19,12,1,1,1,1,1,1,1,1,20,1,1,1,16,18,1,1,15,1,1,1,1,12,1,1,1,1,1,1,1,1,22,1,1,1,1,12,1,1,1,1,1,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,1,24,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,12,12,12,12,1,32,0,0,0,1,1,1,1,35,34,1,1,1,1,1,33,1,1,1,1,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,39,40,0,0,0,0,12,1,1,1,12,1,1,1,43,45,45,45,43,45,43,43,44,45,43,45,43,43,43,43,43,43,45,43,43,44,43,43,43,43,45,46,46,44,45,43,43,43,43,43,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,49,51,49,49,49,51,49,50,49,52,49,50,50,49,49,49,50,52,50,52,49,50,50,12,54,54,53,55,50,52,49,49,47,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,59,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,66,67,12,1,1,65,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,76,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,12,1,1,1,1,89,1,91,1,1,1,1,1,1,1,1,94,1,1,1,1,1,1,1,1,1,1,1,1,0,1,97,97,1,1,12,1,100,1,1,1,1,1,1,1,98,1,99,1,101,1,1,1,1,1,102,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,110,111,1,1,1,1,1,1,113,113,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,121,122,1,1,1,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,126,123,125,120,1,124,1,1,114,1,1,1,1,117,1,127,1,1,1,1,1,1,119,1,108,1,109,1,12,128,106,112,1,1,1,1,1,107,115,1,12,12,12,118,116,1,1,1,1,1,1,0,0,0,0,1,12,12,1,1,1,1,1,12,134,1,1,1,1,1,1,1,1,1,1,1,12,136,1,1,1,1,1,1,1,1,137,138,12,12,135,133,45,45,140,49,49,139,142,141,1,1,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0,0,0,1,0,144,132,1,0,1,1,12,12,1,1,1,1,1,0,0,0,0,0,0,0,1,148,147,20,1,1,12,12,1,20,12,12,1,1,1,1,1,134,1,1,152,1,1,1,1,153,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,1,136,1,1,152,1,1,1,1,153,1,1,1,134,1,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,157,1,1,1,1,1,134,1,1,1,1,1,1,1,1,134,1,1,157,1,1,157,1,1,1,1,1,1,1,163,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,1,1,1,1,1,136,1,1,152,1,157,1,1,1,153,1,1,134,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,1,152,1,157,1,1,1,153,1,1,1,134,1,1,152,1,1,1,1,169,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,172,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,157,1,1,1,1,167,159,159,12,1,12,171,1,1,1,1,1,160,160,160,154,1,1,1,158,160,164,170,1,1,1,1,158,158,1,1,156,154,167,158,162,175,166,175,1,1,173,1,166,155,158,1,1,1,1,158,1,161,1,1,1,12,1,176,1,165,1,1,1,165,164,168,174,156,167,1,1,1,1,1,1,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179,178,178,179,178,178,178,178,180,180,178,178,179,178,179,178,178,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,182,12,1,12,12,12,12,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,195,1,197,198,196,195,195,1,1,201,1,202,200,1,12,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,213,195,195,195,195,213,1,1,1,1,216,217,215,1,1,1,1,1,1,219,219,1,1,1,219,219,221,222,220,1,224,1,1,1,1,12,230,231,232,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,199,203,1,1,1,1,151,1,1,1,1,1,1,1,1,1,1,1,227,1,1,1,194,1,1,1,1,238,1,1,235,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,12,1,1,1,1,1,1,1,1,185,210,1,1,1,206,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,192,1,1,1,1,1,1,1,211,1,1,1,1,226,1,1,1,1,177,1,214,1,209,1,1,1,212,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,190,1,12,1,1,12,1,1,1,1,193,1,1,1,208,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,239,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,225,1,1,1,1,1,12,1,1,1,1,1,1,1,1,184,12,1,1,1,187,12,1,1,1,1,1,1,1,229,1,1,1,1,1,1,1,1,1,1,186,1,1,1,1,1,1,1,234,1,1,1,191,1,1,1,207,1,12,1,223,204,12,1,1,1,1,1,1,1,1,1,1,211,1,1,1,1,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,181,1,1,1,1,1,1,1,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,236,1,1,1,1,1,1,1,1,1,1,12,1,237,1,1,12,1,1,1,1,188,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,228,1,1,1,1,183,1,1,1,1,1,1,1,1,1,1,1,218,1,1,1,12,12,1,1,1,1,1,1,1,1,1,233,1,1,12,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,249,0,0,0,0,0,250,0,0,0,0,0,0,1,12,1,1,1,254,1,1,1,0,255,252,253,1,1,1,1,1,1,260,1,262,1,1,1,1,1,1,1,1,1,1,1,258,1,1,1,1,1,264,1,1,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,263,1,1,1,12,1,1,1,1,259,1,1,1,257,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,261,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,12,1,1,1,12,1,1,270,13,1,1,1,12,12,267,268,1,1,1,1,269,1,1,12,1,1,1,1,1,1,1,271,1,1,12,16,1,1,1,1,1,1,272,1,1,1,12,12,1,1,1,1,1,1,272,12,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,285,285,1,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,178,1,290,291,1,12,1,1,1,1,12,293,1,1,292,1,1,295,1,1,1,1,1,1,0,1,1,1,299,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,310,0,0,311,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,12,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,59,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0,335,0,0,0,0,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,12,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,353,353,354,353,0,205,1,1,13,349,1,347,0,0,0,0,0,0,0,350,1,1,355,1,235,1,1,1,1,348,1,345,1,351,1,343,1,352,1,344,1,1,1,1,1,1,1,12,1,1,1,1,12,346,346,1,1,1,194,1,1,12,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,12,1,1,1,1,342,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,358,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,295,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,398,398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,366,377,1,1,365,400,1,371,1,1,363,395,1,1,381,362,367,1,1,1,374,405,383,1,1,1,1,1,1,384,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,393,397,0,0,79,1,1,0,391,368,404,369,372,379,1,394,0,1,0,79,388,386,1,0,0,1,1,1,0,0,0,0,407,1,1,378,1,79,1,0,1,1,1,410,1,0,0,79,385,0,1,364,1,1,1,0,1,1,387,1,0,1,1,1,0,1,412,375,1,1,0,1,0,0,403,0,1,1,1,79,396,1,1,392,389,1,1,1,1,1,1,1,1,1,1,1,370,1,1,1,1,1,1,1,1,1,1,1,402,0,79,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,406,1,1,1,0,0,409,0,0,0,1,382,1,0,79,408,1,0,0,0,0,411,1,1,0,0,1,0,1,0,380,0,376,0,1,1,1,0,1,1,0,399,373,401,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,12,1,1,1,12,427,427,1,1,12,12,1,427,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,439,1,1,0,1,1,1,1,235,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,457,457,1,1,0,0,343,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,470,1,469,1,1,1,1,1,1,1,1,1,474,1,12,12,1,1,1,1,1,12,1,1,1,1,482,1,1,1,484,1,1,1,1,1,1,1,1,1,1,481,1,476,1,1,1,1,463,1,1,1,1,1,1,1,1,477,12,1,1,1,1,483,1,1,1,478,472,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,343,1,460,1,1,12,480,1,1,343,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,465,1,1,1,1,1,1,1,1,1,1,1,483,1,1,1,1,343,1,479,1,1,1,473,467,1,1,1,1,1,468,1,485,471,1,1,1,1,1,466,1,1,1,1,1,1,1,1,1,461,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,475,1,1,1,1,1,1,1,1,1,1,1,1,464,1,1,1,1,1,462,1,249,486,1,1,1,1,1,12,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,0,492,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,1,67,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,496,496,496,496,496,496,496,0,496,496,496,496,496,1,496,496,496,0,496,496,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,501,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,508,503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,502,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,506,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,1,1,1,1,1,1,1,518,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,229,229,1,522,1,1,1,521,1,1,1,1,517,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,519,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,523,1,1,520,1,1,1,1,1,1,1,1,398,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,524,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,535,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,12,1,537,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,12,12,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,59,1,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,556,1,1,1,1,1,1,1,557,1,1,1,1,1,1,1,555,1,1,12,1,1,559,268,1,1,12,12,1,1,12,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,569,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,132,1,12,574,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,107,1,1,12,1,1,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,579,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,144,1,1,1,257,1,1,12,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,604,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,249,1,354,1,1,1,1,1,1,1,1,1,0,0,609,1,1,1,1,0,611,0,79,0,610,0,1,1,1,0,1,1,1,1,1,1,12,0,0,0,1,0,1,0,0,0,0,0,0,618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,613,613,0,617,615,613,613,613,613,613,619,613,613,623,613,613,613,613,613,613,613,613,613,613,620,617,613,613,617,613,613,613,613,613,613,613,613,613,613,613,613,613,615,613,613,613,613,613,621,613,613,613,613,613,613,0,0,0,1,622,1,1,1,1,616,1,1,1,1,1,614,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,12,627,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,12,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,64,307,333,438,565,0,4,68,265,283,309,334,360,414,440,0,529,549,566,629,9,0,60,88,424,436,456,607,0,527,548,562,644,0,30,6,0,491,530,634,592,70,0,7,312,284,415,493,443,568,79,630,0,608,336,445,495,9,105,315,536,6,30,0,338,79,417,79,513,10,6,131,277,302,0,645,539,0,595,0,63,6,6,280,95,2,459,425,437,628,0,6,0,6,313,103,6,593,531,570,0,494,416,300,314,8,71,104,631,573,418,339,327,446,146,74,317,577,540,633,596,361,356,509,6,75,149,11,0,278,552,578,597,544,582,602,643,36,6,289,322,359,331,247,30,558,585,247,41,245,294,323,332,433,450,511,301,0,73,594,0,430,444,326,79,276,79,0,612,576,534,319,448,79,419,413,0,0,0,9,587,603,246,0,451,434,561,546,605,647,85,247,42,324,422,452,601,0,541,320,303,79,244,80,28,416,30,6,420,357,330,636,624,554,581,543,0,287,81,30,432,449,0,30,453,0,248,625,547,9,435,454,247,277,86,251,626,606,589,512,455,423,279,256,87,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,82,0,129,0,0,84,580,0,0,0,0,0,0,0,27,0,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,533,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321,0,0,0,0,0,0,0,649,0,0,0,0,0,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,525,0,0,0,0,0,0,431,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,298,308,0,0,0,0,0,560,304,0,0,0,0,0,0,0,0,0,0,0,0,0,542,0,0,0,0,0,0,0,0,0,0,0,487,0,0,0,341,0,0,0,0,0,0,282,0,0,0,0,0,0,23,0,0,0,0,600,0,0,0,0,632,551,0,0,0,0,273,0,0,0,0,0,0,489,0,0,510,0,0,0,0,0,61,0,0,0,296,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,275,0,0,0,0,0,306,642,0,72,0,0,0,0,0,0,0,0,0,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,0,305,0,0,0,0,0,0,599,0,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,598,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,532,0,0,0,0,0,586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,83,0,0,0,0,0,0,0,0,0,0,0,0,516,0,515,0,0,0,0,0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567,0,0,0,0,0,0,0,0,325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,266,0,0,0,0,0,0,0,0,0,0,84,0,638,0,0,584,0,0,0,0,0,0,0,0,0,274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,550,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,646,0,0,458,0,0,0,0,0,0,0,0,0,0,0,0,429,0,0,0,575,0,93,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,29,92,0,0,0,0,0,0,0,0,0,0,0,0,318,0,0,0,243,0,0,0,0,0,0,590,0,0,0,0,130,0,0,0,0,0,591,0,0,0,0,0,0,0,441,447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,426,0,340,0,0,0,0,0,5,0,0,0,0,0,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0,0,564,0,0,0,442,0,0,428,0,0,0,0,0,0,635,0,0,0,571,0,0,90,0,572,0,0,0,0,0,0,0,0,0,0,538,490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,639,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,588,0,0,0,0,0,0,0,0,0,0,329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,637,0,0,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655,655,655,655,655,655,655,654,656]),labelText="orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashretoolvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitglideossnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webapptransfer-webappairflowtransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxysiteacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetinteduaéroportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetjenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz網絡网络公司orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9consent-portals3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websitebedrock-agentcores3-object-lambdaexecute-apibedrock-agentcores3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1eu-west-3eu-south-2ap-southeast-3eu-central-1ca-central-1ap-northeast-1ap-southeast-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5eu-west-1us-east-1ap-east-1sa-east-1csrframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appss3-websitekrkrobjectprivateobjectkrkrskrkrsobjectkrprivateobjectkr-privatecomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalsgkrobjectstoragedesgkrusobjectkrkr-naverkr-naver-devkrprivatewebsiteobjectkr-naverkr-privatekr-naver-devjpjpkrjp4jp5s3-website-jpjpkrjp4jp5objectprivateobjecto365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsitefin-ncloudstoragegov-ncloudstorageappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urlnclouddyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappncpstorageherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisoramazonlightsailservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudncloudstorageis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectgünstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsgünstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjects*teamst3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idptransfer-webappeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformhäkkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra教育敎育網絡网絡组織組織网络網络组织組织公司政府個人个人箇人ltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormyᬩᬮᬶmilwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedgeايرانایرانjclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinosüdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforlì-cesenatuscanyvallée-d-aostemantovavallée-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavalléedaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentinsüd-tiroltrentinosüd-tirolmonzabrianzatrentino-südtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevalléeaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-süd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforlìcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentinsüdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-südtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-süd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzasüdtirolreggiocalabriatrentinoaadigetrentin-südtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forlìvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforlìtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-südtirolbalsan-südtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara長野京都岐阜大阪三重群馬千葉滋賀佐賀奈良adednelgaccogogror秋田愛知高知埼玉沖縄栃木熊本岩手青森山梨新潟島根鳥取長崎香川宮城石川大分宮崎茨城山口兵庫山形徳島広島福島福岡岡山富山静岡愛媛福井東京xn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste北海道penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez神奈川鹿児島和歌山bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalervålerxn--vler-qoaossandeheroysandeherøybøboheroyherøyxn--hery-iraxn--b-5gavalerbøboxn--b-5gasandesandexn--hery-iraxn--vler-qoavålerhåreålaahavaofsfvfhlolnlalrlhmfmtmahcostntbuåstrmreigersundmyspreadshopgálsáeidsvolltingvollgildeskalflorøvadsøvardøvanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-landsøndre-landtjieltexn--vrggt-xqadsør-aurdalsor-aurdalheradstordmoldefordeførdeseljefedjeryggehemnexn--krehamn-dxasognegranesøgnebrynetjomevallebykletokkegiskedovretjømehobølvoldasaudatolgasømnaviknadønnasomnadonnatranafrananesnaraumasmolatrænafrænalesjasmølaørstaorstahitrafloraaukraloppafrøyarissasnasahalsagalsaromsaraisaráisafroyasnåsagronghobolfjelltydalårdalardalaskimharamkraanghkekråanghkesorumbarumhurumbærumsørummodumsálátbálátfrognbjugnvåganvagangulenskienløtenlotenstrynvefsnxn--merker-kuaskaunsveiobømlobomloskjåkvardoflorovadsosalatbalatsálatklæbuklabuselbubarduulvikskjakklepprisørxn--nttery-byaeflåeidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnesåsnesrørosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyradøyandøyrødøymeløyaskøylurøydyrøymåsøyværøynærøyhoylandethøylandetdivtasvuodnalørenskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunjárgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkvæfjordsongdalenmjondalenmjøndalenxn--gls-elackragerogáŋgaviikagangaviikasørreisasorreisasør-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikrøyrvikroyrviksvelvikvenneslaevje-og-hornnessandnessjøenmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabrønnøysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontrøgstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hvegårsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenjárgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkrødsheradkrodsheradkvinnheradbrønnøyxn--mtta-vrjjat-k7afxn--lrenskog-54akvitsøyvárggátkarlsøyosterøyinderøyhamarøybronnoysundxn--aurskog-hland-jnbbahccavuotnabáhccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvmålselvxn--unjrga-rtamøre-og-romsdalmore-og-romsdalhareidmelandørlandorlandstrandålgårdsolundalgardafjordåfjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesnåasesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-totenøstre-totenvestfoldxn--mely-iraálaheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordjølsterjolsteraremarkhedmarknååmesjevuemienaamesjevuemiexn--vard-jrarollagmeråkermerakerorskogørskogxn--bdddj-mrabdákŋoluoktaxn--osyro-wuaaknoluoktatrysilskjervøymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdallærdalhurdalsirdalverdallerdallardaloppdalåseralaseralhadselkragerødivttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettromsøxn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblbájddarbajddarxn--laheadju-7yarennesøyxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordbåtsfjordbatsfjordmuosátbievátloabátkárášjohkanøtterøyxn--mjndalen-64anordkappláhppilahppialstahaugsiljanverranrøykenroykenhaldenlyngenbergenhortenhønefosshonefosstroandinbeiarnvarggatosoyroosøyrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyaskánitskanitraholtråholtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandjørpelanddeatnuringsakersør-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstjørdalnaustdalhjartdalgjøvikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdrøbakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iramálatvuopmimalatvuopmitysværkirkenesbirkenesmoskenesbáidárxn--fjord-lraxn--rdal-poabahcavuotnabáhcavuotnaxn--frde-gralindåsbearalvahkixn--hobl-iraráhkkerávjuxn--loabt-0qavågåáltábodøsundlundraderådeetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvamåmliamlibokntinnroangranosenoslobodorøstroststatåmotamotivguprivøyeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerhábmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularhápmirhapmirmelhusfosnesøksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergtønsberglindasxn--sndre-land-0cbnamsosxn--srum-graøystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26fčáhcesuolocahcesuoloakrehamnåkrehamnsandøykarmøyfinnøytranøyvågsøyaverøynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildeskålporsanguxn--trgstad-r1anávuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaevenáššivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalváhkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8aporsáŋgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierváivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsundålesundalesundfetsundfarsundovre-eikerøvre-eikerakershusxn--moreke-juasørfoldøstfoldostfoldsorfoldhøyangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordkåfjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogrømskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkvænangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandskånlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnagáivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimbådåddjåxn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholtålenxn--vads-jraxn--jlster-byamosjøenxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppegårdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangevågberlevågkristiansandxn--rsta-frahornindalstjørdalshalsenstjordalshalsensandnessjoenhámmárfeastaxn--lrdal-srasør-fronsor-fronnord-odalkristiansundmátta-várjjatvestvågøynesoddennotoddenbuskerudøygardenoygardensalangenlavangenralingenrælingenlodingenlødingenleaŋgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadhægebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomoårekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-hølandxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorimāoriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshoppriviqhslapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgovяспборгкоммскбизмирсамаракрымсочиакодпроргобрупрצהלממשלישובאקדמיהองค์กรธุรกิจรัฐบาลศึกษาทหารเน็ต教育網絡組織公司政府個人닷넷한국澳门新闻澳門联通家電嘉里招聘通販닷컴삼성コムგეбгрфеюadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzazελευ世界台灣购物公益点看臺灣网络書籍在线网站手机机构大拿游戏信息台湾谷歌慈善商标香港中国餐厅网址中國商城食品微博政务移动集团公司八卦商店健康网店政府时尚佛山中信娱乐广东企业homedepotengineeringاماراتrepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf亚马逊淡马锡alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxiみんなストアセールcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9cקוםհայоргсрбмонкомбелмкдқазрусукрمصرقطرعربكومdadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolarລາວคอมไทยtourslocusnexuslexusgiftsbeatsboatspartspressglassswissकॉमनेटtiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparisファッションworkssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday中文网xn--unup4y天主教飞利浦新加坡enterprises我爱你嘉里大酒店christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbankكاثوليكxn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbankپاكستانپاکستانnextdirectالسعوديهالعليانxn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownloadمليسياxn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7gஇலங்கைcontractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmartഭാരതംsupportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrimмоскваالسعودیةcoffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspaceонлайнvermögensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltiendaभारतम्africatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworktheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburgفلسطينlplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstreamభారత్unicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearchالاردنmarketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzukiアマゾンクラウドポイントbhartiグーグルxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgmابوظبيdiscoverreviewবাংলাxn--5su34j936bgsgmoscowobserverapartmentsдетиارامكوсайтeurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0hتونسموقعبارتڀارتشبكةعمانبيتكعراقreadkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilipsලංකාಭಾರತfitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcvermögensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56aভাৰতভারতभारतभारोतviajeshermeshughesxn--j1aefसंगठनvillasଭାରତclaimshotelsભારતzapposphotosjuegoscondostatamotorsgratistennisਭਾਰਤtkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b電訊盈科xn--gecrj9cstatefarmaccountantaquarelleolayangroup香格里拉xn--p1ai组织机构xn--1ck2e1bxn--mgbt3dhdschwarzموريتانياabudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsuالسعوديةstcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundationישראלxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrxالبحرينdiamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fhкатоликcaravanசிங்கப்பூர்richardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchenஇந்தியாweatherchannelallfinanzxn--kput3iالسعودیۃxn--90aisxn--efvy88hالجزائرxn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammxبازاربھارتسوريةorganicfreseniusسورياxn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082fاليمنهمراهpolitieسودانايرانایرانnetflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigitalالمغربbarcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp",rulesRoot=653,exceptionsRoot=657,numberOfNodes=nodeFlags.length,numberOfEdges=edgeLength.length,edgeOffset=new Uint32Array(numberOfEdges),edgeHash=new Uint32Array(numberOfEdges),wildcardEdge=new Int32Array(numberOfNodes).fill(-1);for(let node=0,offset=0;node<numberOfNodes;node+=1)for(let edge=edgeStart[node];edge<edgeStart[node+1];edge+=1){edgeOffset[edge]=offset;let end=offset+edgeLength[edge],hash2=5381;for(let i=end-1;i>=offset;i-=1)hash2=hash2*33^labelText.charCodeAt(i);edgeHash[edge]=hash2>>>0,edgeLength[edge]===1&&labelText.charCodeAt(offset)===42&&(wildcardEdge[node]=edge),offset=end}var matchNode=-1,matchStart=0,matchEnd=0;function labelEquals(edge,hostname,start,length){if(edgeLength[edge]!==length)return!1;let offset=edgeOffset[edge];for(let i=0;i<length;i+=1)if(labelText.charCodeAt(offset+i)!==hostname.charCodeAt(start+i))return!1;return!0}function findEdge(node,hash2,hostname,start,length){let lo=edgeStart[node],hi=edgeStart[node+1];for(;lo<hi;){let mid=lo+hi>>>1,value=edgeHash[mid];if(value<hash2)lo=mid+1;else if(value>hash2)hi=mid;else{for(let e=mid;e>=lo&&edgeHash[e]===hash2;e-=1)if(labelEquals(e,hostname,start,length))return e;for(let e=mid+1;e<hi&&edgeHash[e]===hash2;e+=1)if(labelEquals(e,hostname,start,length))return e;return-1}}return-1}function walk(hostname,root,allowedMask){let node=root,end=hostname.length,hash2=5381;matchNode=-1;for(let i=hostname.length-1;i>=0;i-=1){let code=hostname.charCodeAt(i);if(code===46){let start=i+1,edge2=findEdge(node,hash2>>>0,hostname,start,end-start);if(edge2===-1&&(edge2=wildcardEdge[node]),edge2===-1)return matchNode!==-1;node=edgeChild[edge2],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=start,matchEnd=end),end=i,hash2=5381}else hash2=hash2*33^code}let edge=findEdge(node,hash2>>>0,hostname,0,end);return edge===-1&&(edge=wildcardEdge[node]),edge!==-1&&(node=edgeChild[edge],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=0,matchEnd=end)),matchNode!==-1}function suffixLookup(hostname,options,out){if(fastPathLookup(hostname,options,out))return;let allowedMask=(options.allowPrivateDomains?2:0)|(options.allowIcannDomains?1:0);if(walk(hostname,exceptionsRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchEnd+1);return}if(walk(hostname,rulesRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchStart);return}out.isIcann=!1,out.isPrivate=!1;let lastDot=hostname.lastIndexOf(".");out.publicSuffix=lastDot===-1?hostname:hostname.slice(lastDot+1)}var RESULT=getEmptyResult();function parse2(url,options){return parseImpl(url,5,suffixLookup,options,getEmptyResult())}function getHostname(url,options){return resetResult(RESULT),parseImpl(url,0,suffixLookup,options,RESULT).hostname}function getPublicSuffix2(url,options){return resetResult(RESULT),parseImpl(url,2,suffixLookup,options,RESULT).publicSuffix}function getDomain2(url,options){return resetResult(RESULT),parseImpl(url,3,suffixLookup,options,RESULT).domain}function getFullDomain(url,options){resetResult(RESULT);let result=parseImpl(url,3,suffixLookup,options,RESULT);return result.domain===null?null:result.hostname}function getSubdomain(url,options){return resetResult(RESULT),parseImpl(url,4,suffixLookup,options,RESULT).subdomain}function getDomainWithoutSuffix(url,options){return resetResult(RESULT),parseImpl(url,5,suffixLookup,options,RESULT).domainWithoutSuffix}exports.getDomain=getDomain2;exports.getDomainWithoutSuffix=getDomainWithoutSuffix;exports.getFullDomain=getFullDomain;exports.getHostname=getHostname;exports.getPublicSuffix=getPublicSuffix2;exports.getSubdomain=getSubdomain;exports.parse=parse2}});var init_process_env=__esm({"../agent-runtime/dist/process-env.js"(){"use strict";init_dist()}});import fs14 from"node:fs";import{spawn as spawn9}from"node:child_process";import path20 from"node:path";function agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath,env=process.env,extraUserCandidates=[],home,platform=process.platform,processExecPath=process.execPath,readdirSync:readdirSync10}){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",pathCandidates=(env[pathKey]||"").split(path20.delimiter).filter(Boolean).flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),commonUserDirectories=[path20.join(home,".local","bin"),path20.join(home,".npm-global","bin"),path20.join(home,".volta","bin"),path20.join(home,".local","share","pnpm"),path20.join(home,"Library","pnpm"),path20.join(home,".bun","bin"),...platform==="win32"&&env.APPDATA?[path20.join(env.APPDATA,"npm")]:[]],systemDirectories=platform==="win32"?[]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin"];return[configuredPath,...executableNames2.map(name=>path20.join(path20.dirname(processExecPath),name)),...commonUserDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...extraUserCandidates,...versionManagerExecutableCandidates(home,executableNames2,{env,platform,readdirSync:readdirSync10}),...systemDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...pathCandidates].filter(candidate=>typeof candidate=="string")}function executableFileCandidates(candidates){let seen=new Set,executableCandidates=[];for(let candidate of candidates)!candidate||seen.has(candidate)||(seen.add(candidate),isExecutableFile(candidate)&&executableCandidates.push(candidate));return executableCandidates}function probeAgentExecutable(executable,options){return new Promise(resolve16=>{let settled=!1,stderr="",launch=resolveSpawnCommand(executable,options.args),child=spawn9(launch.command,launch.args,{stdio:["ignore","ignore","pipe"],windowsHide:!0,env:prependNodePath()}),finish=error=>{settled||(settled=!0,clearTimeout(timer),resolve16(error))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(options.timeoutError)},options.timeoutMs);child.stderr?.on("data",chunk=>{stderr.length<4e3&&(stderr+=chunk.toString("utf8"))}),child.once("error",error=>finish(options.startError(error))),child.once("exit",code=>{if(code===0){finish(null);return}finish(stderr.trim()||options.exitError(code))})})}function isExecutableFile(candidate){try{return fs14.accessSync(candidate,process.platform==="win32"?fs14.constants.F_OK:fs14.constants.X_OK),fs14.statSync(candidate).isFile()}catch{return!1}}var AgentExecutableResolver,init_executable_resolver=__esm({"../agent-runtime/dist/executable-resolver.js"(){"use strict";init_process_env();AgentExecutableResolver=class{options;resolvedExecutable=null;resolutionPromise=null;generation=0;constructor(options){this.options=options}async resolve(){if(this.resolvedExecutable){if(isExecutableFile(this.resolvedExecutable))return{executable:this.resolvedExecutable,error:null};this.resolvedExecutable=null}if(this.resolutionPromise)return this.resolutionPromise;let generation=this.generation,resolution=this.probeCandidates(generation);this.resolutionPromise=resolution;try{return await resolution}finally{this.resolutionPromise===resolution&&(this.resolutionPromise=null)}}reset(){this.generation+=1,this.resolvedExecutable=null,this.resolutionPromise=null}async probeCandidates(generation){let candidates=this.options.candidates();if(candidates.length===0)return{executable:null,error:this.options.notFoundError};let failures=[],recordFailure=(executable,error)=>{failures.push({executable,error}),this.options.onFailure?.(executable,error)},select=(executable,version2)=>(this.generation===generation&&(this.resolvedExecutable=executable,this.options.onSelection?.(executable,version2)),{executable,error:null}),preferredCandidates=this.options.preferred?candidates.filter(executable=>this.options.preferred?.(executable)):[],automaticCandidates=candidates.filter(executable=>!preferredCandidates.includes(executable));for(let executable of preferredCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let getVersion=this.options.getVersion;if(getVersion){let inspected=await Promise.all(automaticCandidates.map(async(executable,index)=>{let[error,version2]=await Promise.all([this.options.probe(executable),getVersion(executable).catch(()=>null)]);return{executable,error,index,version:version2}})),usable=inspected.filter(candidate=>candidate.error===null);for(let candidate of inspected)candidate.error!==null&&recordFailure(candidate.executable,candidate.error);usable.sort((left,right)=>{if(left.version&&right.version&&this.options.compareVersions){let comparison=this.options.compareVersions(left.version,right.version);if(comparison!==0)return-comparison}else{if(left.version)return-1;if(right.version)return 1}return left.index-right.index});let selected=usable[0];if(selected)return select(selected.executable,selected.version)}else for(let executable of automaticCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let detail=failures.map(({executable,error})=>{let compactError=error.replace(/\s+/g," ").trim().slice(0,300);return`${executable}: ${compactError}`}).join("; ");return{executable:null,error:`${this.options.unusableError} ${detail}`}}}}});import{isAbsolute as isAbsolute10}from"node:path";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}:${browser.capabilities?.controlSessionMode??"mearl"}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist2();init_control_session_manager();init_dist3();init_provider_request_timeout();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;deadlines=new AsyncLocalStorage2;controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider");let mode=browser.capabilities?.controlSessionMode;if(mode!==void 0&&mode!=="mearl"&&mode!=="external")throw new Error("Provider browser has invalid control session mode");return browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions2=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions2.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions2[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute10(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){let nativeDialogPress=(action2,payload)=>action2==="page_press"&&(payload?.dialogId!==void 0||payload?.promptText!==void 0);if(nativeDialogPress(action,data)||action==="run_actions"&&Array.isArray(data?.actions)&&data.actions.some(step=>nativeDialogPress(step?.action,step?.data)))throw new Error("Provider native dialog handling is not negotiated. Use the built-in CDP or extension transport.");if(action==="get_capabilities"&&!browser.capabilities?.actions.includes("get_capabilities"))return describeBrowserCapabilities(["get_capabilities",...browser.capabilities?.actions??[]],void 0,data);action==="browser_release"&&(action="browser_instances",data={operation:"detach"});let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data.operation==="sync_cookies"?"syncCookies":data.operation:void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}let deadline=this.deadlines.getStore();return deadline!==void 0?(providerRequestTimeoutMs(action,data,deadline),this.dependencies.request(browser,action,data,origin,host,deadline)):this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,networkControl:null}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data,deadline),this.reap();let browser=this.browser(browserId);if(browser.capabilities?.controlSessionMode==="external"&&(sessionId!==void 0||action==="browser_control"))throw new Error("CONTROL_SESSION_UNSUPPORTED: this Provider manages task control externally; use its native handoff/resume without --session.");let{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host))}return manager.invoke(action,data,sessionId,void 0,origin)})}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});import{randomUUID as randomUUID29}from"node:crypto";var slotKey,ProviderEnhancementService,init_provider_enhancements=__esm({"src/provider-enhancements.ts"(){"use strict";init_dist2();init_dist3();init_browser_registry();slotKey=(owner,sourceIdentity,tabId)=>JSON.stringify([owner,sourceIdentity,tabId]),ProviderEnhancementService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;bindings=new Map;busy=new Set;pendingBindings=0;provider(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId||browser.status!=="connected"||browser.capabilities?.controlSessionMode!=="external")throw new Error("BROWSER_ENHANCEMENT_OWNER_UNAVAILABLE");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id),browser}async verifyPage(provider,binding,deadline){let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:binding.providerTabId},deadline),binding.providerTabId);if(!matchesProviderEnhancementTarget(frame,binding))throw new Error("PAGE_IDENTITY_CHANGED");let native=this.dependencies.browsers().find(item=>item.browserId===binding.nativeBrowserId&&item.transport==="extension");if(!native)throw new Error("BROWSER_ENHANCEMENT_EXTENSION_UNAVAILABLE");return native}async invoke(owner,request,deadline){if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("Browser enhancement deadline exceeded");if(!request||typeof request!="object"||!["inspect","bind","invoke","release"].includes(request.operation))throw new Error("Invalid Provider enhancement request");let provider={...this.provider(owner)},activeOwners=new Set(this.dependencies.browsers().filter(browser=>browser.transport==="provider"&&browser.status==="connected").map(browser=>`${browser.browserId}:${browserConnectionIdentity(browser)}`));for(let[id3,binding]of this.bindings)!activeOwners.has(`${binding.owner}:${binding.providerIdentity}`)&&!this.busy.has(slotKey(binding.owner,binding.providerIdentity,binding.binding.providerTabId))&&this.bindings.delete(id3);if(request.operation==="inspect"||request.operation==="bind"){let slot2=slotKey(owner,browserConnectionIdentity(provider),request.providerTabId);if(this.busy.has(slot2))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot2);try{return await this.negotiate(provider,request,deadline)}finally{this.busy.delete(slot2)}}let page=this.bindings.get(request.bindingId);if(!page||page.owner!==owner||page.providerIdentity!==browserConnectionIdentity(provider)||page.binding.generation!==request.generation)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: reverify and rebind the page");let slot=slotKey(owner,browserConnectionIdentity(provider),page.binding.providerTabId);if(this.busy.has(slot))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot);try{return await this.mutate(provider,request,page,deadline)}finally{this.busy.delete(slot)}}async mutate(provider,request,page,deadline){let owner=provider.browserId;if(page.uncertain)throw new Error("ENVIRONMENT_UNCONFIRMED: reverify the binding before another mutation");let native=await this.verifyPage(provider,page.binding,deadline);if(browserConnectionIdentity(native)!==page.nativeIdentity)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: the native host changed; rebind first");let physical;if(request.operation==="invoke"){if(!isBrowserEnhancementAction(request.action)||requiredBrowserEnhancementActions(request).some(action=>!page.binding.actions.includes(action))||!request.data||typeof request.data!="object"||Array.isArray(request.data)||request.data.tabId!==void 0&&request.data.tabId!==page.binding.providerTabId)throw new Error("BROWSER_ENHANCEMENT_SCOPE_MISMATCH");physical={...request,bindingId:page.extensionBindingId,owner,data:{...request.data,tabId:page.binding.tabId}}}else physical={...request,bindingId:page.extensionBindingId,owner};try{let result=await this.dependencies.enhance(native,provider,physical,deadline,page.binding.providerTabId);if(request.operation==="invoke"&&!("result"in result))throw new Error("Invalid enhancement invocation response");if(request.operation==="release"&&(!("released"in result)||typeof result.released!="boolean"||result.conflicts!==void 0&&(!Array.isArray(result.conflicts)||result.conflicts.some(conflict=>typeof conflict!="string"))))throw new Error("Invalid enhancement release response");if(request.operation==="release"&&"released"in result&&result.released&&this.bindings.delete(request.bindingId),"binding"in result||"capabilities"in result||"preparation"in result)throw new Error("Invalid enhancement mutation response");return result}catch(error){throw page.uncertain=!0,error}}async negotiate(provider,request,deadline){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||!Array.isArray(request.actions)||!request.actions.length||new Set(request.actions).size!==request.actions.length||request.actions.some(action=>!isBrowserEnhancementAction(action))||request.navigationOrigin!==void 0&&!isEnhancementNavigationOrigin(request.navigationOrigin)||request.nativeBrowserId!==void 0&&(typeof request.nativeBrowserId!="string"||!request.nativeBrowserId))throw new Error("Invalid Provider enhancement binding request");let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"&&(!frame.targetId||!isEnhancementNavigationOrigin(request.navigationOrigin)))throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: preparation requires a physical target and navigation origin");let previous=[...this.bindings.values()].find(page=>page.owner===provider.browserId&&page.binding.providerTabId===request.providerTabId&&matchesProviderEnhancementTarget(frame,page.binding)),candidates=this.dependencies.browsers().filter(browser=>browser.transport==="extension"&&(request.nativeBrowserId===void 0||request.nativeBrowserId===browser.browserId)),matches=[],liveTabs=new Map,probes=0,failure,denied,recordFailure=error=>{let issue=error instanceof Error?error:new Error(String(error));(issue.message.startsWith("BROWSER_ENHANCEMENT_PERMISSION_DENIED:")||issue.message.startsWith("BROWSER_ENHANCEMENT_AGENT_DISABLED:"))&&(denied??=issue),failure??=issue};if(candidates.length>64)throw new Error("Specify a nativeBrowserId to narrow enhancement discovery");let discoveryDeadline=()=>Math.min(deadline??1/0,Date.now()+5e3);for(let browser of candidates)try{let result=await this.dependencies.request(browser,"tab_list",{},discoveryDeadline());if(!Array.isArray(result?.tabs))throw new Error("Invalid enhancement discovery response");liveTabs.set(browser.browserId,new Set(result.tabs.map(tab=>tab?.tabId).filter(Number.isSafeInteger)));for(let tab of result.tabs){let missingUrl=tab?.url===void 0||tab?.url==="";if(!(tab?.url!==frame.url&&!(missingUrl&&frame.targetId)||!Number.isSafeInteger(tab?.tabId)||tab.tabId<0)){if(++probes>128)throw new Error("Too many matching pages; narrow enhancement discovery");try{let probe=await this.dependencies.enhance(browser,provider,request.operation==="inspect"?{operation:"inspect",owner:provider.browserId,tabId:tab.tabId,targetId:frame.targetId,actions:request.actions,navigationOrigin:request.navigationOrigin}:{operation:"probe",tabId:tab.tabId},discoveryDeadline(),request.providerTabId),capabilities="preparation"in probe?probe.preparation.capabilities:"capabilities"in probe?probe.capabilities:void 0;if((frame.initialEnvironment?.preserveHostPlatform||frame.initialEnvironment?.preserveHostInput)&&capabilities?.hostEnvironmentVersion!==BROWSER_ENHANCEMENT_HOST_ENVIRONMENT_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot preserve the captured host environment");if(request.operation==="inspect"){if(!("preparation"in probe)||probe.preparation.capabilities?.preparationVersion!==BROWSER_ENHANCEMENT_PREPARATION_VERSION||probe.preparation.capabilities?.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||probe.preparation.capabilities?.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot negotiate a preparation page");if(probe.preparation.tabId!==tab.tabId||probe.preparation.targetId!==frame.targetId||!isBrowserEnhancementPreparationUrl(probe.preparation.url)||!Array.isArray(probe.preparation.capabilities.actions)||request.actions.some(action=>!probe.preparation.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,targetId:probe.preparation.targetId,preparation:probe.preparation});continue}if(!("capabilities"in probe)||probe.capabilities.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||request.navigationOrigin!==void 0&&probe.capabilities.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION||!matchesProviderEnhancementTarget(frame,probe)||request.actions.some(action=>!probe.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,mainFrameId:probe.mainFrameId,...probe.targetId?{targetId:probe.targetId}:{}})}catch(error){recordFailure(error)}}}}catch(error){if(error instanceof Error&&error.message==="Too many matching pages; narrow enhancement discovery")throw error;recordFailure(error)}if(!matches.length&&denied)throw denied;if(!matches.length&&failure)throw failure;if(matches.length!==1)throw new Error(matches.length?"BROWSER_ENHANCEMENT_AMBIGUOUS_PAGE":"BROWSER_ENHANCEMENT_UNAVAILABLE: no verified extension page");let match=matches[0],current=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"){if(!current.targetId||current.targetId!==match.targetId)throw new Error("PAGE_IDENTITY_CHANGED");return{preparation:{...match.preparation,nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId}}}if(!match.mainFrameId||!matchesProviderEnhancementTarget(current,{...match,mainFrameId:match.mainFrameId}))throw new Error("PAGE_IDENTITY_CHANGED");for(let[id3,page]of this.bindings)liveTabs.has(page.binding.nativeBrowserId)&&!liveTabs.get(page.binding.nativeBrowserId).has(page.binding.tabId)&&!this.busy.has(slotKey(page.owner,page.providerIdentity,page.binding.providerTabId))&&this.bindings.delete(id3);if(this.bindings.size+this.pendingBindings>=512&&!previous)throw new Error("Provider enhancement binding limit reached");previous||this.pendingBindings++;try{let result=await this.dependencies.enhance(match.browser,provider,{operation:"bind",owner:provider.browserId,tabId:match.tabId,mainFrameId:match.mainFrameId,...match.targetId?{targetId:match.targetId}:{},actions:request.actions,...request.navigationOrigin?{navigationOrigin:request.navigationOrigin}:{}},deadline,request.providerTabId);if(!("binding"in result)||result.binding.mainFrameId!==match.mainFrameId||result.binding.targetId!==match.targetId)throw new Error("Invalid enhancement binding response");let binding={...result.binding,bindingId:previous&&previous.providerIdentity===browserConnectionIdentity(provider)&&previous.nativeIdentity===browserConnectionIdentity(match.browser)&&previous.extensionBindingId===result.binding.bindingId&&previous.binding.generation===result.binding.generation?previous.binding.bindingId:randomUUID29(),nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId};return previous&&previous.binding.bindingId!==binding.bindingId&&this.bindings.delete(previous.binding.bindingId),this.bindings.set(binding.bindingId,{owner:provider.browserId,providerIdentity:browserConnectionIdentity(provider),nativeIdentity:browserConnectionIdentity(match.browser),extensionBindingId:result.binding.bindingId,binding,uncertain:!1}),{binding}}finally{previous||this.pendingBindings--}}}}});async function acceptedAppResources(){await nativeCapabilities.refresh();let status=nativeCapabilities.status(),runtime=nativeCapabilities.get("app.pageRuntime"),defaultRuntime=nativeCapabilities.get("app.defaultPageRuntime"),catalog=await listInstalledAppProfiles({refresh:!1});if(JSON.stringify(nativeCapabilities.status())!==JSON.stringify(status))throw new Error("APP_RESOURCE_CATALOG_CHANGED");return{...status,catalog,runtime,defaultRuntime}}var revision2,ProviderAppResourceService,init_provider_app_resources=__esm({"src/provider-app-resources.ts"(){"use strict";init_dist2();init_dist8();init_dist3();init_page_runtimes();init_native_capability_services();init_app_profile_catalog();init_browser_registry();revision2=snapshot=>({capabilityRevision:snapshot.revision,installationRevision:snapshot.installationRevision}),ProviderAppResourceService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;async invoke(owner,request,deadline){let assertDeadline2=()=>{if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("App resource deadline exceeded")};assertDeadline2();let provider=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!provider||provider.transport!=="provider"||!provider.providerBrowserId||provider.status!=="connected"||provider.capabilities?.controlSessionMode!=="external")throw new Error("APP_RESOURCE_OWNER_UNAVAILABLE");assertProviderProtocolVersion(provider.provider?.protocolVersion,provider.provider?.id);let identity3=browserConnectionIdentity(provider),assertCurrent=()=>{assertDeadline2();let current=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!current||current.status!=="connected"||current.capabilities?.controlSessionMode!=="external"||browserConnectionIdentity(current)!==identity3)throw new Error("APP_RESOURCE_OWNER_CHANGED")};if(!request||typeof request!="object"||Array.isArray(request)||!["catalog","resolve"].includes(request.operation))throw new Error("Invalid App resource request");let allowed=request.operation==="catalog"?["operation","params"]:["operation","providerTabId","profile","options"];if(Object.keys(request).some(key=>!allowed.includes(key)))throw new Error("Invalid App resource request");let target;if(request.operation==="resolve"){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||typeof request.profile!="string"||!request.profile||request.profile.length>161||request.options!==void 0&&(!request.options||typeof request.options!="object"||Array.isArray(request.options)))throw new Error("Invalid App resource request");target=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId),assertCurrent()}let snapshot=await this.dependencies.snapshot();assertCurrent();let result;if(request.operation==="catalog")result={...revision2(snapshot),catalog:describeBrowserCapabilities(["set_app_profile"],snapshot.catalog,request.params).apps};else{let entry=snapshot.catalog.profiles.find(entry2=>entry2.id===request.profile);if(!entry||entry.available===!1)throw new Error(`App profile is unavailable: ${request.profile}`);let definition=entry.definition;if(!definition.pageRuntime&&(definition.bridges.length||Object.keys(definition.globals).length)){let binding2=snapshot.defaultRuntime?.();if(!binding2)throw new Error("Required App runtime is not installed");definition=validateAppProfileDefinition({...definition,pageRuntime:binding2})}let options=mergeAppProfileOptions(request.options);if(Object.keys(request.options??{}).some(key=>!Object.hasOwn(options,key)))throw new Error("Unsupported App resource option");let resolved=resolveAppProfile(request.profile,options,definition),binding=resolved.injected.pageRuntime,source=binding?(this.dependencies.store??new NodePageRuntimeStore).resolve(binding,snapshot.runtime):void 0,current=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId);if(assertCurrent(),current.mainFrameId!==target.mainFrameId||current.targetId!==target.targetId)throw new Error("PAGE_IDENTITY_CHANGED");result={...revision2(snapshot),config:resolved.injected,recommendedPreset:resolved.recommendedPreset,target:current,...binding&&source!==void 0?{runtime:{binding,source}}:{}}}if(Buffer.byteLength(JSON.stringify(result))+256>16777216)throw new Error("App resource response exceeded its byte limit");return result}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net5 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync16}from"node:fs";import{randomUUID as randomUUID30}from"node:crypto";async function runProviderControlHost(token){let file=providerControlHostFile(),owner=readRecord(file);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file,owner.pid,{pid:process.pid,socketPath,token,ready:!1,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,host,{controlSource:origin,deadline}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),enhancements=new ProviderEnhancementService({browsers:listRegisteredBrowsers,request:(browser,action,data,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,void 0,{deadline}),enhance:(browser,provider,data,deadline,providerTabId)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement",data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(data.operation==="invoke"?data.action:"page_frames",data,deadline),void 0,void 0,{providerTarget:provider.browserId,providerControlToken:token,providerSourceIdentity:browserConnectionIdentity(provider),providerPageId:providerTabId,deadline})}),appResources=new ProviderAppResourceService({browsers:listRegisteredBrowsers,snapshot:acceptedAppResources,verify:(browser,tabId,deadline)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement_target",{tabId},NATIVE_HOST_VERSION,providerRequestTimeoutMs("page_frames",{},deadline),browser.providerBrowserId,void 0,{deadline})}),server=net5.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id3="";try{let request=JSON.parse(line);id3=typeof request.id=="string"?request.id:randomUUID30(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="__provider_enhancement"){if(typeof request.providerTarget!="string"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("Provider enhancements require an external browser without a Mearl session");result=await enhancements.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="__provider_app_resources"){if(typeof request.providerTarget!="string"||request.controlSource!=="local"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("App resources require a local external browser without a Mearl session");result=await appResources.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="browser_sessions")if(data.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id:id3,success:!0,data:result})+`
|
|
1095
1095
|
`)}catch(error){socket.destroyed||socket.write(JSON.stringify({id:id3,success:!1,error:error instanceof Error?error.message:String(error)})+`
|
|
1096
1096
|
`)}}try{if(await new Promise((resolve16,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.removeListener("error",reject),resolve16()})}),process.platform!=="win32"&&chmodSync2(socketPath,384),!writeRecordIfPid(file,process.pid,{pid:process.pid,socketPath,token,ready:!0,protocolVersion:3,controlSessionModes:["mearl","external"],enhancementProtocolVersion:BROWSER_ENHANCEMENT_PROTOCOL_VERSION,enhancementNavigationOriginVersion:BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION,enhancementPreparationVersion:BROWSER_ENHANCEMENT_PREPARATION_VERSION,enhancementHostEnvironmentVersion:BROWSER_ENHANCEMENT_HOST_ENVIRONMENT_VERSION,appResourceProtocolVersion:1}))throw new Error("Provider control host startup ownership was lost");await new Promise(resolve16=>{let stop=()=>{removeRecordIfPid(file,process.pid);for(let socket of connections)socket.destroy();server.close(()=>resolve16())};process.once("SIGTERM",stop),process.once("SIGINT",stop)})}finally{removeRecordIfPid(file,process.pid);for(let socket of connections)socket.destroy();server.close(),process.platform!=="win32"&&rmSync16(socketPath,{force:!0}),await service.dispose()}}var init_provider_control_host=__esm({"src/provider-control-host.ts"(){"use strict";init_dist();init_host();init_browser_registry();init_browser_socket_request();init_provider_control();init_provider_enhancements();init_dist2();init_provider_app_resources();init_socketLines();init_version2();init_dist3();init_provider_request_timeout()}});import fs18 from"node:fs";import path25 from"node:path";function resolveLauncherNodePaths(execPath){let nodePath=path25.resolve(execPath),homebrewNode=nodePath.match(/^(.*)\/Cellar\/(node(?:@\d+(?:\.\d+)*)?)\/[^/]+\/bin\/node$/);if(!homebrewNode)return[nodePath];let[,prefix,formula]=homebrewNode,stablePath=path25.join(prefix,"opt",formula,"bin","node");try{if(fs18.accessSync(stablePath,fs18.constants.X_OK),fs18.statSync(stablePath).isFile()&&fs18.realpathSync(stablePath)===fs18.realpathSync(nodePath))return[stablePath,nodePath]}catch{}return[nodePath,stablePath]}function shellQuote(value){return`'${value.replaceAll("'","'\\''")}'`}function createLauncherScript(hostDir,hostPath,hostName,execPath=process.execPath){let nodePaths=process.platform==="win32"?[path25.resolve(execPath)]:resolveLauncherNodePaths(execPath),metadataLine=`mearl-native-host-launcher: ${JSON.stringify({version:1,nodePaths,hostPath})}`;if(process.platform==="win32"){let launcherPath2=path25.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
|
|
1097
1097
|
rem ${metadataLine}\r
|
|
@@ -1129,8 +1129,8 @@ Verify:
|
|
|
1129
1129
|
mearl get_requests --payload '{"tabId":12345,"count":1}'
|
|
1130
1130
|
`),success?0:1}var DEFAULT_EXTENSION_ID,__filename,__dirname,ALL_MODES,init_install=__esm({"src/install.ts"(){"use strict";init_launcher2();init_nativeHost2();DEFAULT_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",__filename=fileURLToPath5(import.meta.url),__dirname=path26.dirname(__filename),ALL_MODES=["skills","mcp"]}});import fs20 from"node:fs";import os11 from"node:os";import path27 from"node:path";import readline from"node:readline";import{spawn as spawn12}from"node:child_process";function configOverride(value){return Array.isArray(value)?value.map(configOverride):value&&typeof value=="object"?Object.fromEntries(Object.entries(value).filter(([,field])=>field!=null).map(([key,field])=>[key,configOverride(field)])):value}function normalizeCodexVersion(value){return typeof value!="string"||value.length>MAX_VERSION_OUTPUT_CHARS?null:CODEX_VERSION_PATTERN.exec(value.trim())?.[1]??null}function parsedCodexVersion(value){let normalized=normalizeCodexVersion(value);if(!normalized)return null;let withoutBuild=normalized.split("+",1)[0],prereleaseSeparator=withoutBuild.indexOf("-"),coreValue=prereleaseSeparator===-1?withoutBuild:withoutBuild.slice(0,prereleaseSeparator),prereleaseValue=prereleaseSeparator===-1?void 0:withoutBuild.slice(prereleaseSeparator+1),core=coreValue?.split(".").map(Number);return core?.length!==3||core.some(component2=>!Number.isSafeInteger(component2)||component2<0)?null:{core,prerelease:prereleaseValue?prereleaseValue.split("."):[]}}function compareCodexVersions(leftValue,rightValue){let left=parsedCodexVersion(leftValue),right=parsedCodexVersion(rightValue);if(!left||!right)return leftValue.localeCompare(rightValue,void 0,{numeric:!0});for(let index=0;index<left.core.length;index+=1){let difference=left.core[index]-right.core[index];if(difference!==0)return difference}if(left.prerelease.length===0||right.prerelease.length===0)return left.prerelease.length===right.prerelease.length?0:left.prerelease.length===0?1:-1;let identifierCount=Math.max(left.prerelease.length,right.prerelease.length);for(let index=0;index<identifierCount;index+=1){let leftIdentifier=left.prerelease[index],rightIdentifier=right.prerelease[index];if(leftIdentifier===void 0||rightIdentifier===void 0)return leftIdentifier===rightIdentifier?0:leftIdentifier===void 0?-1:1;if(leftIdentifier===rightIdentifier)continue;let leftNumeric=/^\d+$/.test(leftIdentifier),rightNumeric=/^\d+$/.test(rightIdentifier);return leftNumeric&&rightNumeric?Number(leftIdentifier)-Number(rightIdentifier):leftNumeric!==rightNumeric?leftNumeric?-1:1:leftIdentifier.localeCompare(rightIdentifier)}return 0}function codexAppExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os11.homedir)(),platform=options.platform??process.platform;return platform==="darwin"?["/Applications",path27.join(home,"Applications")].flatMap(root=>["ChatGPT.app","Codex.app"].flatMap(app=>{let resources=path27.join(root,app,"Contents","Resources");return[path27.join(resources,"codex-cli","CodexCLI.app","Contents","MacOS","codex"),path27.join(resources,"codex")]})):platform==="win32"?[path27.join(env.LOCALAPPDATA||path27.join(home,"AppData","Local"),"Programs"),env.ProgramFiles,env["ProgramFiles(x86)"]].filter(root=>typeof root=="string"&&root.length>0).flatMap(root=>["ChatGPT","Codex"].map(app=>path27.join(root,app,"resources","codex.exe"))):[]}function isIdeBundledCodexPath(candidate,home){let resolvedCandidates=[path27.resolve(candidate)];try{resolvedCandidates.push(fs20.realpathSync(candidate))}catch{}return[".vscode",".vscode-insiders",".cursor",".windsurf"].some(directory=>{let extensionsRoot=`${path27.join(home,directory,"extensions")}${path27.sep}`;return resolvedCandidates.some(resolved=>resolved.startsWith(extensionsRoot))})}function codexExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os11.homedir)(),platform=options.platform??process.platform;return agentExecutableCandidatePaths({executableNames:[platform==="win32"?"codex.cmd":"codex"],configuredPath:env.MEARL_CODEX_PATH,env,home,platform,processExecPath:options.processExecPath,readdirSync:options.readdirSync,extraUserCandidates:codexAppExecutableCandidatePaths({env,homedir:()=>home,platform})}).filter(candidate=>candidate===env.MEARL_CODEX_PATH||!isIdeBundledCodexPath(candidate,home))}function codexPackageVersion(executable){let packageFiles=[];try{let resolved=fs20.realpathSync(executable);if(resolved.split(path27.sep).includes("node_modules")){let directory=path27.dirname(resolved);for(let depth=0;depth<6;depth+=1){packageFiles.push(path27.join(directory,"package.json"));let parent=path27.dirname(directory);if(parent===directory)break;directory=parent}}}catch{}/\.(?:cmd|bat)$/i.test(executable)&&packageFiles.push(path27.join(path27.dirname(executable),"node_modules","@openai","codex","package.json"));for(let packageFile2 of packageFiles)try{let manifest=JSON.parse(fs20.readFileSync(packageFile2,"utf8"));if(manifest.name==="@openai/codex"){let version2=normalizeCodexVersion(manifest.version);if(version2)return version2}}catch{}return null}function codexExecutableVersion(executable){let packageVersion=codexPackageVersion(executable);return packageVersion?Promise.resolve(packageVersion):new Promise(resolve16=>{let settled=!1,output2="",launch=resolveSpawnCommand(executable,["--version"]),child=spawn12(launch.command,launch.args,{stdio:["ignore","pipe","pipe"],windowsHide:!0,env:prependNodePath()}),finish=version2=>{settled||(settled=!0,clearTimeout(timer),resolve16(version2))},capture=chunk=>{let remaining=MAX_VERSION_OUTPUT_CHARS-output2.length;remaining>0&&(output2+=chunk.toString("utf8").slice(0,remaining))};child.stdout.on("data",capture),child.stderr.on("data",capture),child.once("error",()=>finish(null)),child.once("exit",code=>finish(code===0?normalizeCodexVersion(output2):null));let timer=setTimeout(()=>{child.kill("SIGTERM"),finish(null)},PROBE_TIMEOUT_MS)})}function codexModelInfo(value){if(typeof value!="string")return;let id3=value.trim().slice(0,MAX_MODEL_CHARS);return id3?{id:id3}:void 0}function fullAccessWithApprovals(){return{sandbox:"danger-full-access",approvalPolicy:"untrusted"}}function timestampMs(value){if(typeof value=="number"&&Number.isFinite(value))return value<1e12?value*1e3:value;if(typeof value=="string"){let parsed=Date.parse(value);return Number.isNaN(parsed)?void 0:parsed}}function codexSkillScope(value){return value==="user"?"global":value==="repo"?"project":value==="system"||value==="admin"?value:"unknown"}function userMessageText(item){return Array.isArray(item?.content)?item.content.flatMap(part=>part?.type==="text"&&typeof part.text=="string"?[part.text]:[]).join(`
|
|
1131
1131
|
`):""}function userMessageImageCount(item){return Array.isArray(item?.content)?item.content.filter(part=>part?.type==="image"||part?.type==="localImage").length:0}function threadHistoryEvents(thread){if(!Array.isArray(thread?.turns))return[];let events=[];for(let turn of thread.turns.slice(-100)){if(!turn||typeof turn.id!="string"||!Array.isArray(turn.items))continue;let timestamp=timestampMs(turn.completedAt??turn.startedAt);for(let item of turn.items)if(!(!item||typeof item.id!="string"||typeof item.type!="string")){if(item.type==="userMessage"){let text3=userMessageText(item),imageCount=userMessageImageCount(item);(text3||imageCount>0)&&events.push({kind:"lifecycle",method:"chat/userMessage",params:{text:text3,...imageCount>0?{imageCount}:{}},...timestamp!==void 0?{timestamp}:{}});continue}events.push({kind:"notification",method:"item/completed",params:{turnId:turn.id,item},...timestamp!==void 0?{timestamp}:{}})}}return events}function codexThreadUrl(providerSessionId){if(!/^[a-zA-Z0-9_-]+$/.test(providerSessionId))throw new Error("Codex returned an invalid thread id");return`codex://threads/${providerSessionId}`}function codexWorkspaceUrl(directory){return`codex://threads/new?path=${encodeURIComponent(directory)}`}function externalOpenCommand(url,platform=process.platform){return platform==="darwin"?{command:"open",args:[url]}:platform==="win32"?{command:"cmd.exe",args:["/d","/s","/c","start","",url]}:{command:"xdg-open",args:[url]}}function openExternalUrl(url){let{command,args}=externalOpenCommand(url);return new Promise((resolve16,reject)=>{let child=spawn12(command,args,{stdio:"ignore",windowsHide:!0});child.once("error",error=>{reject(new Error(`Unable to open Codex App: ${error.message}`))}),child.once("close",code=>{code===0?resolve16():reject(new Error("Unable to open Codex App. Make sure it is installed."))})})}var REQUEST_TIMEOUT_MS,PROBE_TIMEOUT_MS,MAX_MODEL_CHARS,MAX_VERSION_OUTPUT_CHARS,CODEX_NOT_FOUND_ERROR,CODEX_VERSION_PATTERN,CodexAgentProvider,init_codex_provider=__esm({"../agent-runtime/dist/codex-provider.js"(){"use strict";init_executable_resolver();init_process_env();REQUEST_TIMEOUT_MS=3e4,PROBE_TIMEOUT_MS=5e3,MAX_MODEL_CHARS=256,MAX_VERSION_OUTPUT_CHARS=1024,CODEX_NOT_FOUND_ERROR="Codex was not found. Install @openai/codex, install the Codex App, or set MEARL_CODEX_PATH.",CODEX_VERSION_PATTERN=/^(?:codex-cli\s+)?v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/;CodexAgentProvider=class{log;clientVersion;mearlSocketPath;id="codex";process=null;initialized=!1;lifecycle=0;modelRuntime;startPromise=null;nextRequestId=1;pendingRequests=new Map;listeners=new Set;knownThreadIds=new Set;sessionModels=new Map;executableResolver;constructor(log2,clientVersion,mearlSocketPath){this.log=log2,this.clientVersion=clientVersion,this.mearlSocketPath=mearlSocketPath,this.executableResolver=new AgentExecutableResolver({candidates:()=>this.resolveExecutableCandidates(),probe:executable=>this.probeExecutable(executable),getVersion:executable=>this.readExecutableVersion(executable),compareVersions:compareCodexVersions,preferred:executable=>executable===process.env.MEARL_CODEX_PATH,notFoundError:CODEX_NOT_FOUND_ERROR,unusableError:"Codex candidates were found, but none supports app-server.",onFailure:(executable,error)=>{this.log("[Codex] Skipping unusable runtime:",executable,error)},onSelection:(executable,version2)=>{this.modelRuntime={executable,...version2?{version:version2}:{},selection:executable===process.env.MEARL_CODEX_PATH?"explicit":"automatic",started:!1},this.modelDiagnostic({runtime:this.modelRuntime}),this.log("[Codex] Selected runtime:",executable,version2?`(version ${version2})`:executable===process.env.MEARL_CODEX_PATH?"(explicitly configured)":"(version unavailable)")}})}async getDescriptor(){let{error}=await this.resolveExecutable();return{id:this.id,name:"Codex",available:error===null,capabilities:{streaming:!0,resume:!0,listSessions:!0,refreshHistory:!0,imageInput:!0,interrupt:!0,requests:!0},...error?{error}:{},setup:{installCommand:"npm install -g @openai/codex",loginCommand:"codex login",docsUrl:"https://developers.openai.com/codex/cli"}}}async prepare(){await this.ensureStarted()}async listModels(){await this.ensureStarted();let models=new Map,cursor,cursors=new Set;for(let page=0;page<4;page++){let result=await this.request("model/list",{limit:100,...cursor?{cursor}:{}});if(!Array.isArray(result?.data))throw new Error("Invalid Codex model list");for(let value of result.data){let id3=value?.model??value?.id;if(value?.hidden||typeof id3!="string"||!id3||id3.length>256||models.has(id3))continue;let efforts=["none","minimal","low","medium","high","xhigh","max"],reasoningEfforts=Array.isArray(value.supportedReasoningEfforts)?efforts.filter(effort=>value.supportedReasoningEfforts.some(option=>option?.reasoningEffort===effort)):void 0;if(models.set(id3,{id:id3,displayName:typeof value.displayName=="string"?value.displayName.slice(0,256):id3,...typeof value.description=="string"?{description:value.description.slice(0,2e3)}:{},isDefault:value.isDefault===!0,...reasoningEfforts?{reasoningEfforts}:{},...efforts.includes(value.defaultReasoningEffort)?{defaultReasoningEffort:value.defaultReasoningEffort}:{}}),models.size>=200)break}if(!result.nextCursor||models.size>=200)break;if(typeof result.nextCursor!="string"||cursors.has(result.nextCursor))throw new Error("Invalid Codex model cursor");cursor=result.nextCursor,cursors.add(result.nextCursor)}return[...models.values()]}onEvent(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}async listSessions(options){await this.ensureStarted();let result=await this.request("thread/list",{cursor:options.cursor??null,limit:options.limit,sortKey:"updated_at",sortDirection:"desc",archived:!1,...options.cwd?{cwd:options.cwd}:{}});return{sessions:Array.isArray(result?.data)?result.data.flatMap(thread=>{if(!thread||typeof thread.id!="string")return[];let title=typeof thread.name=="string"&&thread.name.trim()?thread.name.trim():typeof thread.preview=="string"&&thread.preview.trim()?thread.preview.trim():void 0,cwd=typeof thread.cwd=="string"?thread.cwd:void 0,updatedAt=timestampMs(thread.recencyAt??thread.updatedAt),ephemeral=typeof thread.ephemeral=="boolean"?thread.ephemeral:void 0;return[{providerSessionId:thread.id,...title?{title}:{},...cwd?{cwd}:{},...updatedAt!==void 0?{updatedAt}:{},...ephemeral!==void 0?{ephemeral}:{}}]}):[],...typeof result?.nextCursor=="string"?{nextCursor:result.nextCursor}:{}}}async listSkills(cwd){await this.ensureStarted();let result=await this.request("skills/list",{cwds:[cwd||os11.homedir()],forceReload:!0});return Array.isArray(result?.data)?result.data.flatMap(entry=>Array.isArray(entry?.skills)?entry.skills.flatMap(skill=>!skill||typeof skill.name!="string"||typeof skill.path!="string"?[]:[{name:skill.name,path:skill.path,scope:codexSkillScope(skill.scope)}]):[]):[]}async startSession(options){await this.ensureStarted();let cwd=options.cwd||process.env.MEARL_AGENT_CWD||os11.homedir(),config=options.modelExecution?await this.modelExecutionConfig():void 0,result=await this.request("thread/start",{...config?{config}:{},cwd,...options.modelId?{model:options.modelId}:{},...options.readOnly?{sandbox:"read-only",approvalPolicy:"never"}:fullAccessWithApprovals(),...options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...options.developerInstructions?{developerInstructions:options.developerInstructions}:{}}),threadId=result?.thread?.id;if(typeof threadId!="string"||!threadId)throw new Error("Codex did not return a thread id");options.modelExecution&&this.modelDiagnostic({threadRestrictionsAccepted:!0}),this.knownThreadIds.add(threadId);let model=codexModelInfo(result?.model);return model&&this.sessionModels.set(threadId,model),threadId}async modelExecutionConfig(){let config=(await this.request("config/read",{includeLayers:!1}))?.config;if(!config||typeof config!="object")throw new Error("Codex cannot report its effective execution configuration");let home=process.env.CODEX_HOME||path27.join(os11.homedir(),".codex"),store=config.cli_auth_credentials_store;this.modelDiagnostic({configuration:{source:process.env.CODEX_HOME?"environment":"default",home,filePresent:fs20.existsSync(path27.join(home,"config.toml")),...typeof config.model_provider=="string"?{baseProvider:config.model_provider}:{},...typeof store=="string"?{credentialStore:["file","keyring","auto","ephemeral"].includes(store)?store:"unknown"}:{}}});let mcp=config.mcp_servers??{},apps=config.apps??{};if(typeof mcp!="object"||Array.isArray(mcp)||typeof apps!="object"||Array.isArray(apps))throw new Error("Invalid Codex model tool configuration");return configOverride({mcp_servers:Object.fromEntries(Object.keys(mcp).map(name=>[name,{...mcp[name],enabled:!1}])),apps:Object.fromEntries(["_default",...Object.keys(apps)].map(name=>[name,{...apps[name]??{},enabled:!1}])),web_search:"disabled",features:{apps:!1,plugins:!1,hooks:!1,codex_hooks:!1,plugin_hooks:!1,multi_agent:!1,multi_agent_v2:!1,collab:!1,computer_use:!1,browser_use:!1,image_generation:!1,imagegenext:!1,memory_tool:!1,memories:!1,skill_search:!1}})}async resumeSession(providerSessionId,options){await this.ensureStarted();let result=await this.request("thread/resume",{threadId:providerSessionId,...options.cwd?{cwd:options.cwd}:{},...fullAccessWithApprovals(),...options.developerInstructions?{developerInstructions:options.developerInstructions}:{}}),threadId=result?.thread?.id;if(typeof threadId!="string"||!threadId)throw new Error("Codex did not return a resumed thread id");this.knownThreadIds.add(threadId);let model=codexModelInfo(result?.model);return model&&this.sessionModels.set(threadId,model),{providerSessionId:threadId,history:threadHistoryEvents(result.thread),historyComplete:!0}}getSessionModel(providerSessionId){let model=this.sessionModels.get(providerSessionId);return model?{...model}:void 0}async sendMessage(providerSessionId,message,images=[],options={}){await this.ensureStarted();let turnId=(await this.request("turn/start",{threadId:providerSessionId,input:[...message?[{type:"text",text:message,text_elements:[]}]:[],...images.map(image=>({type:"image",url:`data:${image.mimeType};base64,${image.data}`}))],summary:options.reasoningSummary??"detailed",...options.outputSchema?{outputSchema:options.outputSchema}:{},...options.modelExecution?{approvalPolicy:"never",sandboxPolicy:{type:"readOnly",networkAccess:!1}}:{},...options.reasoningEffort?{effort:options.reasoningEffort}:{}}))?.turn?.id;if(typeof turnId!="string"||!turnId)throw new Error("Codex did not return a turn id");return options.modelExecution&&this.modelDiagnostic({turnRestrictionsAccepted:!0}),{turnId}}async interrupt(providerSessionId,turnId){await this.ensureStarted(),await this.request("turn/interrupt",{threadId:providerSessionId,turnId})}async closeSession(providerSessionId){this.knownThreadIds.delete(providerSessionId),this.sessionModels.delete(providerSessionId),this.initialized&&this.request("thread/unsubscribe",{threadId:providerSessionId}).catch(error=>{this.log("[Codex] Unable to unsubscribe thread:",String(error))})}openSession(providerSessionId){return openExternalUrl(codexThreadUrl(providerSessionId))}openWorkspace(cwd){return openExternalUrl(codexWorkspaceUrl(cwd))}respondToRequest(requestId,result){this.write({id:requestId,result})}dispose(){this.lifecycle++,this.rejectPending(new Error("Codex provider disposed"));let child=this.process;this.process=null,this.initialized=!1,this.startPromise=null,this.sessionModels.clear(),this.executableResolver.reset(),child&&!child.killed&&child.kill("SIGTERM")}async ensureStarted(){if(this.process&&!this.process.killed&&this.initialized)return;if(this.startPromise)return this.startPromise;this.process&&!this.process.killed&&(this.process.kill("SIGTERM"),this.process=null);let pending=this.start();this.startPromise=pending;try{await pending}catch(error){throw this.startPromise===pending&&(this.startPromise=null),error}}async start(){let lifecycle=this.lifecycle,resolution=await this.resolveExecutable();if(lifecycle!==this.lifecycle)throw new Error("Codex provider disposed during startup");if(resolution.executable===null)throw new Error(resolution.error);let{executable}=resolution,launch=resolveSpawnCommand(executable,["app-server","--listen","stdio://"]),childEnv=prependNodePath();this.mearlSocketPath&&(childEnv.MEARL_SOCKET_PATH=this.mearlSocketPath);let child=spawn12(launch.command,launch.args,{stdio:["pipe","pipe","pipe"],windowsHide:!0,env:childEnv});this.process=child,readline.createInterface({input:child.stdout}).on("line",line=>this.handleLine(line)),child.stderr.on("data",chunk=>{let message=chunk.toString("utf8").trim();message&&this.log("[Codex]",message)}),child.once("error",error=>this.handleExit(child,error)),child.once("exit",(code,signal)=>{this.handleExit(child,new Error(`Codex app-server exited (code=${String(code)}, signal=${String(signal)})`))});try{await this.request("initialize",{clientInfo:{name:"mearl",title:"Mearl",version:this.clientVersion},capabilities:{experimentalApi:!0}}),this.write({method:"initialized",params:{}}),this.initialized=!0,this.modelRuntime&&(this.modelRuntime={...this.modelRuntime,started:!0},this.modelDiagnostic({runtime:this.modelRuntime}))}catch(error){let startupError=error instanceof Error?error:new Error(String(error));throw this.handleExit(child,startupError),child.killed||child.kill("SIGTERM"),startupError}}handleLine(line){let message;try{message=JSON.parse(line)}catch{this.log("[Codex] Invalid JSONL message:",line);return}if(message.method){let isRequest=message.id!==void 0,providerSessionId=this.extractThreadId(message.params);if(!isRequest&&providerSessionId&&message.method==="thread/settings/updated"){let model=codexModelInfo(message.params?.threadSettings?.model);model&&(this.sessionModels.set(providerSessionId,model),this.emit({providerSessionId,kind:"notification",method:"session/model/updated",params:{model}}))}else if(!isRequest&&providerSessionId&&message.method==="model/rerouted"){let model=codexModelInfo(message.params?.toModel);model&&this.emit({providerSessionId,kind:"notification",method:"session/activeModel/updated",params:{model}})}this.emit({providerSessionId,kind:isRequest?"request":message.method==="error"?"error":"notification",method:message.method,params:message.params??{},...isRequest?{requestId:message.id}:{}});return}if(typeof message.id!="number")return;let pending=this.pendingRequests.get(message.id);pending&&(clearTimeout(pending.timer),this.pendingRequests.delete(message.id),message.error?pending.reject(new Error(message.error.message||`Codex error ${message.error.code??""}`)):pending.resolve(message.result))}request(method,params){let id3=this.nextRequestId++;return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{this.pendingRequests.delete(id3),reject(new Error(`Codex request timed out: ${method}`))},REQUEST_TIMEOUT_MS);this.pendingRequests.set(id3,{resolve:resolve16,reject,timer});try{this.write({id:id3,method,params})}catch(error){clearTimeout(timer),this.pendingRequests.delete(id3),reject(error instanceof Error?error:new Error(String(error)))}})}write(message){let child=this.process;if(!child||child.killed||!child.stdin.writable)throw new Error("Codex app-server is not running");child.stdin.write(`${JSON.stringify(message)}
|
|
1132
|
-
`)}handleExit(child,error){if(this.process===child){this.process=null,this.initialized=!1,this.startPromise=null,this.executableResolver.reset(),this.rejectPending(error);for(let providerSessionId of this.knownThreadIds)this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error.message}})}}rejectPending(error){for(let[id3,pending]of this.pendingRequests)clearTimeout(pending.timer),pending.reject(error),this.pendingRequests.delete(id3)}modelDiagnostic(metadata){this.emit({kind:"notification",method:"provider/model/diagnostic",params:metadata})}emit(event){for(let listener of this.listeners)listener(event)}extractThreadId(params){return[params?.threadId,params?.conversationId,params?.thread?.id,params?.turn?.threadId].find(value=>typeof value=="string")}probeExecutable(executable){return probeAgentExecutable(executable,{args:["app-server","--help"],timeoutMs:PROBE_TIMEOUT_MS,timeoutError:"Timed out while checking Codex app-server availability.",startError:error=>`Failed to start Codex: ${error.message}`,exitError:code=>`Codex app-server check exited with code ${String(code)}`})}readExecutableVersion(executable){return codexExecutableVersion(executable)}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(codexExecutableCandidatePaths())}}}});var CODEX_MODEL_CAPABILITY,init_capabilities=__esm({"../agent-runtime/dist/capabilities.js"(){"use strict";CODEX_MODEL_CAPABILITY={provider:"codex",modes:["agent"],permissions:["read-only"],structuredOutput:!0,streaming:!0,cancellation:!0}}});import{readFileSync as readFileSync18}from"node:fs";async function runCodexModel(request,context,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync18(new URL("../package.json",import.meta.url),"utf8")).version)){if(request.provider!=="codex"||request.mode!=="agent"||request.permissions!=="read-only")throw Object.assign(new Error("Codex supports explicit read-only agent execution; strict tool-free generation is unavailable"),{code:"PLUGIN_MODEL_CAPABILITY_UNSUPPORTED"});context.signal.throwIfAborted();let session,turn,text3,bytes=0,index=0,retries=0,buffered="",streamItem,streamPhase,phases=new Map,flushTimer,flush=()=>{clearTimeout(flushTimer),flushTimer=void 0;try{for(let offset=0;offset<buffered.length;offset+=4e3)streamItem||streamPhase?context.onDelta(buffered.slice(offset,offset+4e3),++index,{...streamItem?{itemId:streamItem}:{},...streamPhase?{phase:streamPhase}:{}}):context.onDelta(buffered.slice(offset,offset+4e3),++index)}catch(error){fail2(error)}buffered=""},finish,fail2,completed=new Promise((resolve16,reject)=>{finish=resolve16,fail2=reject});completed.catch(()=>{});let listener=event=>{let params=event.params;event.method==="provider/model/diagnostic"&&context.onDiagnostic?.(params),event.method==="account/updated"&&context.onDiagnostic?.({authentication:["apikey","chatgpt","chatgptAuthTokens"].includes(params?.authMode)?params.authMode:"unknown"}),event.method==="session/model/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({selectedModel:params.model.id}),event.method==="session/activeModel/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({activeModel:params.model.id});let relevant=event.providerSessionId===void 0||event.providerSessionId===session;if(event.kind==="request"&&relevant){try{provider.respondToRequest(event.requestId,{error:"Interactive requests are disabled for background model tasks"})}catch{}fail2(Object.assign(new Error("Model requested interactive input"),{code:"PLUGIN_MODEL_INTERACTION_REQUIRED"})),provider.dispose();return}if((event.kind==="error"||event.method==="provider/exited")&&relevant){if(event.method!=="provider/exited"&¶ms?.willRetry===!0){context.onDiagnostic?.({retryCount:++retries});return}fail2(Object.assign(new Error(String(params?.error?.message??params?.message??"Model provider failed")),{code:"PLUGIN_MODEL_PROVIDER_ERROR"})),provider.dispose();return}if(!(!session||event.providerSessionId!==session))if(event.method==="item/started"&¶ms?.item?.type==="agentMessage")flush(),streamItem=params.item.id,streamPhase=params.item.phase,streamItem&&streamPhase&&phases.set(streamItem,streamPhase);else if(event.method==="item/agentMessage/delta"&&typeof params?.delta=="string"){let itemId=params.itemId??streamItem,phase=params.phase??(itemId?phases.get(itemId):streamPhase);if((itemId!==streamItem||phase!==streamPhase)&&flush(),streamItem=itemId,streamPhase=phase,bytes+=Buffer.byteLength(params.delta),bytes>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}buffered+=params.delta,buffered.length>=16e3?flush():flushTimer??=setTimeout(flush,50)}else if(event.method==="item/completed"&¶ms?.item?.type==="agentMessage"&&typeof params.item.text=="string"){if(flush(),Buffer.byteLength(params.item.text)>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}(!params.item.phase||params.item.phase==="final_answer")&&(text3=params.item.text)}else event.method==="turn/completed"&&(params?.turn?.status!=="completed"?fail2(Object.assign(new Error(`Model turn ended with ${String(params?.turn?.status)}${params?.turn?.error?.message?`: ${params.turn.error.message}`:""}`),{code:"PLUGIN_MODEL_TURN_FAILED"})):text3===void 0?fail2(new Error("Model returned no final text")):(flush(),finish(text3)))},unsubscribe=provider.onEvent(listener),abort=()=>{fail2(Object.assign(new Error("Model execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"})),session&&turn&&provider.interrupt(session,turn).catch(()=>{}),provider.dispose()};context.signal.addEventListener("abort",abort,{once:!0});try{session=context.conversation?.threadId??await provider.startSession({cwd:context.cwd,ephemeral:!0,readOnly:!0,modelExecution:!0,...request.model?{modelId:request.model}:{},...request.instructions?{developerInstructions:request.instructions}:{}}),context.conversation&&(context.conversation.threadId=session),context.onDiagnostic?.({...provider.getSessionModel(session)?.id?{selectedModel:provider.getSessionModel(session).id}:{}}),context.signal.throwIfAborted();let[,result]=await Promise.all([provider.sendMessage(session,request.prompt,[],{reasoningSummary:"none",reasoningEffort:request.reasoningEffort,outputSchema:request.outputSchema,modelExecution:!0}).then(value=>{turn=value.turnId}),completed]);return context.signal.throwIfAborted(),{text:result,provider:request.provider,mode:request.mode,...provider.getSessionModel(session)?.id?{model:provider.getSessionModel(session).id}:{}}}catch(error){throw context.conversation&&(delete context.conversation.threadId,provider.dispose()),error}finally{clearTimeout(flushTimer),context.signal.removeEventListener("abort",abort),unsubscribe(),context.conversation||provider.dispose()}}var init_model=__esm({"../agent-runtime/dist/model.js"(){"use strict";init_codex_provider();init_capabilities()}});import{readFileSync as readFileSync19}from"node:fs";async function listCodexModels(signal,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync19(new URL("../package.json",import.meta.url),"utf8")).version)){signal.throwIfAborted();let abort,cancelled=new Promise((_resolve,reject)=>{abort=()=>{provider.dispose(),reject(signal.reason??new Error("Model discovery cancelled"))},signal.addEventListener("abort",abort,{once:!0})});try{return await Promise.race([provider.listModels(),cancelled])}finally{signal.removeEventListener("abort",abort),provider.dispose()}}var init_model_catalog=__esm({"../agent-runtime/dist/model-catalog.js"(){"use strict";init_codex_provider()}});var codex_exports={};__export(codex_exports,{CODEX_MODEL_CAPABILITY:()=>CODEX_MODEL_CAPABILITY,CodexAgentProvider:()=>CodexAgentProvider,codexAppExecutableCandidatePaths:()=>codexAppExecutableCandidatePaths,codexExecutableCandidatePaths:()=>codexExecutableCandidatePaths,codexThreadUrl:()=>codexThreadUrl,codexWorkspaceUrl:()=>codexWorkspaceUrl,compareCodexVersions:()=>compareCodexVersions,externalOpenCommand:()=>externalOpenCommand,listCodexModels:()=>listCodexModels,normalizeCodexVersion:()=>normalizeCodexVersion,runCodexModel:()=>runCodexModel});var init_codex=__esm({"../agent-runtime/dist/codex.js"(){"use strict";init_codex_provider();init_model();init_model_catalog()}});init_page_runtime_store();import{execFileSync}from"node:child_process";var MAC_BROWSER_NAMES={"com.citrolabs.ego.lite":"EgoLite","com.google.Chrome":"Chrome","com.google.Chrome.beta":"Chrome Beta","com.google.Chrome.dev":"Chrome Dev","com.google.Chrome.canary":"Chrome Canary","com.microsoft.edgemac":"Edge","com.microsoft.edgemac.Beta":"Edge Beta","com.microsoft.edgemac.Dev":"Edge Dev","com.microsoft.edgemac.Canary":"Edge Canary"},commandOptions={encoding:"utf8",timeout:300,maxBuffer:8192},nativeProbe={platform:process.platform,parentPid:process.ppid,executable:pid=>execFileSync("/bin/ps",["-p",String(pid),"-o","comm="],commandOptions).trim(),bundleIdentifier:plist=>execFileSync("/usr/libexec/PlistBuddy",["-c","Print :CFBundleIdentifier",plist],commandOptions).trim()};function detectNativeBrowserName(probe=nativeProbe){if(!(probe.platform!=="darwin"||!Number.isSafeInteger(probe.parentPid)||probe.parentPid<=1))try{let executable=probe.executable(probe.parentPid),index=executable.lastIndexOf(".app/Contents/MacOS/");if(!executable.startsWith("/")||index<0||/[\r\n\0]/.test(executable))return;let plist=`${executable.slice(0,index+4)}/Contents/Info.plist`,identifier2=probe.bundleIdentifier(plist);return Object.hasOwn(MAC_BROWSER_NAMES,identifier2)?MAC_BROWSER_NAMES[identifier2]:void 0}catch{return}}function createExtensionBrowserNameResolver(detect=detectNativeBrowserName){let inspected=!1,nativeName;return reportedName=>(inspected||(inspected=!0,nativeName=detect()),nativeName??reportedName)}init_dist();init_preset2();init_installation();init_bundles();import{randomUUID as randomUUID11}from"node:crypto";import{mkdirSync as mkdirSync5,readFileSync as readFileSync5,renameSync as renameSync7,statSync as statSync6,writeFileSync as writeFileSync6}from"node:fs";import{join as join10}from"node:path";function createNativePresetAutoUpdater(dependencies){let now=dependencies.now??Date.now,statePath=join10(dependencies.directory,"auto-update.json"),read=()=>{try{if(statSync6(statePath).size<=8192)return JSON.parse(readFileSync5(statePath,"utf8"))}catch{}},write=value=>{let temporary=`${statePath}.${randomUUID11()}.tmp`;writeFileSync6(temporary,JSON.stringify(value),{mode:384}),renameSync7(temporary,statePath)},configuration=dependencies.configuration??(()=>{let url=resolveInstallationConfigUrl();return loadInstallationConfig(url,url.origin,AbortSignal.timeout(5e3))}),pending;return()=>pending||(pending=(async()=>{let current=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke}).store.current({verifyResources:!1});if(!current.receipt||!current.preset)return;let extensionOwnsUpdate=async()=>{if(!dependencies.extensionConnected())return!1;if(current.receipt.browserSyncRequired||!dependencies.browserSelection)return!0;let browser=await dependencies.browserSelection();return!browser.presetId||browser.presetId===current.preset.id&&browser.presetSource===current.receipt.snapshot.source};if(await extensionOwnsUpdate())return;let id3=current.preset.id,source=current.receipt.snapshot.source,checkedAt=now(),token=randomUUID11();if(mkdirSync5(dependencies.directory,{recursive:!0,mode:448}),!withRecordLock(statePath,()=>{let previous=read();return previous?.token&&previous.pid&&isAlive(previous.pid)&&checkedAt-previous.checkedAt<30*6e4||previous?.id===id3&&previous.source===source&&previous.checkedAt<=checkedAt&&previous.nextCheckAt>checkedAt?!1:(write({id:id3,source,checkedAt,nextCheckAt:checkedAt+PRESET_UPDATE_RETRY_MS,token,pid:process.pid}),!0)}))return;let status="failed",error;try{let config=await configuration(),trusted=trustedInstallationPreset(config,id3,source);if(!trusted){status="untrusted";return}let load=dependencies.load??createNodePresetLoader(),result=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke,load:(value,options)=>{let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||!trusted.origins.some(origin=>matchesInstallationOrigin(origin,url)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");return load(value,options)}}).apply(source,{expectedId:id3,expectedRevision:current.receipt.revision,skipUnchanged:!0,signal:AbortSignal.timeout(12e4),validatePrepared:async prepared=>{if(await extensionOwnsUpdate())throw new Error("PRESET_UPDATE_EXTENSION_CONNECTED");let latest=trustedInstallationPreset(await configuration(),id3,source);if(JSON.stringify(latest)!==JSON.stringify(trusted))throw new Error("PRESET_UPDATE_TRUST_CHANGED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,trusted.origins)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,current.preset.permissions.origins))||!current.receipt.browserSyncRequired&&presetRequiresBrowser(prepared.preset))throw new Error("PRESET_UPDATE_PERMISSION_REQUIRED")}});status=result.revision===current.receipt.revision?"current":"updated",result.ready||(error="INSTALLATION_SYNC_PENDING")}catch(failure){error=failure instanceof Error?failure.message:String(failure),dependencies.log?.("Preset update deferred:",error)}finally{withRecordLock(statePath,()=>{read()?.token===token&&write({id:id3,source,checkedAt,nextCheckAt:checkedAt+(status==="failed"||error?PRESET_UPDATE_RETRY_MS:PRESET_UPDATE_INTERVAL_MS),status,...error?{error}:{}})})}})().catch(error=>dependencies.log?.("Preset update unavailable:",String(error))).finally(()=>{pending=void 0}),pending)}init_native_capability_services();init_preset2();init_dist();var import_semver9=__toESM(require_semver2(),1);init_preset2();init_dist7();init_host();init_plugin2();import{homedir as homedir13}from"node:os";import{dirname as dirname11,join as join28,resolve as resolve14}from"node:path";init_skills();init_skillSources();init_native_capability_services();init_dist();init_plugin2();import{existsSync as existsSync12,realpathSync as realpathSync5}from"node:fs";import{homedir as homedir12}from"node:os";import{dirname as dirname10,join as join27,resolve as resolve13}from"node:path";import fs10 from"node:fs";import path12 from"node:path";import{execFile as execFile2}from"node:child_process";function selectedPath(stdout){return stdout.replace(/[\r\n]+$/,"")||null}var runDirectoryPickerCommand=(command,args)=>new Promise((resolve16,reject)=>{execFile2(command,args,{encoding:"utf8",windowsHide:!0},(error,stdout)=>{if(!error){resolve16(selectedPath(stdout));return}if(error.code===1){resolve16(null);return}reject(error)})});function isMissingCommand(error){return error instanceof Error&&error.code==="ENOENT"}async function pickWorkspaceDirectory(platform=process.platform,run=runDirectoryPickerCommand){let directory;if(platform==="darwin")directory=await run("osascript",["-e",'POSIX path of (choose folder with prompt "Select a folder")']);else if(platform==="win32"){let script=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;","$dialog.Description = 'Select a folder';","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {","[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;","Write-Output $dialog.SelectedPath;","}"].join(" ");directory=await run("powershell.exe",["-NoProfile","-STA","-Command",script])}else if(platform==="linux")try{directory=await run("zenity",["--file-selection","--directory","--title=Select a folder"])}catch(error){if(!isMissingCommand(error))throw error;try{directory=await run("kdialog",["--getexistingdirectory",".","--title","Select a folder"])}catch(fallbackError){throw isMissingCommand(fallbackError)?new Error("Install zenity or kdialog to select a folder",{cause:fallbackError}):fallbackError}}else throw new Error(`Directory selection is not supported on ${platform}`);return directory?resolveWorkspaceDirectory(directory):null}function resolveWorkspaceDirectory(directory){if(typeof directory!="string"||!directory)throw new Error("Workspace directory is required");if(!path12.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs10.realpathSync.native(directory)}catch(error){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error})}if(!fs10.statSync(resolved).isDirectory())throw new Error(`Workspace path is not a directory: ${directory}`);return resolved}var SKILL_PLUGIN_MANAGER="skills",registrationContext2={options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}};function installedSkillDirectory(name,scope,cwd){return join27(scope==="global"?homedir12():cwd,".agents","skills",name)}function canonicalDirectory(directory){try{return realpathSync5(directory)}catch{return resolve13(directory)}}function registrationConflicts(directory,existing,manager){if(!existing)return!1;let registered=dirname10(dirname10(existing.entry));return existing.managedBy===manager?resolve13(registered)!==resolve13(directory):canonicalDirectory(registered)!==canonicalDirectory(directory)}function registeredNamesForSkill(directory){let installedDirectory=resolve13(directory);return listPluginNames().filter(name=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve13(dirname10(dirname10(entry)))===installedDirectory})}async function registerInstalledSkillPlugin(directory,skillName2,manager=SKILL_PLUGIN_MANAGER,registrationManagedBy,replaceExisting=!1,expectedPluginNames){if(!skillManifestPath(directory))throw new Error(`Skill 安装完成但找不到安装目录: ${directory}`);let entry=findPluginDirectoryEntry(directory),aliases=registeredNamesForSkill(directory),managed=registrationManagedBy===OFFICIAL_PLUGIN_MANAGER,presetOwned=aliases.some(alias=>findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER);if(!entry){for(let name2 of aliases)(!managed&&!presetOwned||findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(name2);return}let plugin=await loadPlugin(entry,registrationContext2),name=plugin.name||skillName2;if(expectedPluginNames&&!expectedPluginNames.includes(name))throw new Error(`SKILL_PLUGIN_NAME_CONFLICT: ${skillName2}`);let existing=findPluginRegistration(name),replacingRegistration=registrationConflicts(directory,existing,manager);if(replacingRegistration&&!replaceExisting)throw new Error(`插件 ${name} 已由其他 Skill 注册,无法自动覆盖`);if(managed&&!presetOwned&&!replaceExisting&&aliases.some(alias=>alias!==name&&findPluginRegistration(alias)?.managedBy!==registrationManagedBy))throw new Error(`SKILL_USER_PLUGIN_ALIAS_CONFLICT: ${skillName2}`);if(plugin.setup){let registrations=()=>JSON.stringify([findPluginRegistration(name),registeredNamesForSkill(directory).map(alias=>findPluginRegistration(alias))]),before=registrations();if(await plugin.setup({runCommand}),!skillManifestPath(directory)||findPluginDirectoryEntry(directory)!==entry||registrations()!==before)throw new Error(`SKILL_PLUGIN_REGISTRATION_CHANGED: ${skillName2}`)}let managedBy=(managed||presetOwned)&&existing&&!replacingRegistration?existing.managedBy:presetOwned?OFFICIAL_PLUGIN_MANAGER:registrationManagedBy??manager;registerPlugin(name,entry,plugin.description,{managedBy,...plugin.toolbox?{toolbox:plugin.toolbox}:{},appProfiles:plugin.appProfiles,profileSources:plugin.profileSources});for(let alias of aliases)alias!==name&&(!managed&&!presetOwned||findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(alias);return name}var runSkillCli=async(executable,args,cwd)=>{let invocation2=resolveSkillsInvocation(),result=await runCommand(executable,args,{cwd,capture:!0,env:invocation2?.env,timeoutMs:12e4}),detail=stripAnsi(`${result.stdout}
|
|
1133
|
-
${result.stderr}`);if(result.code!==0||/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail))throw new Error(detail.trim()||"Skills operation failed");return{stdout:result.stdout,stderr:result.stderr}};function runResolvedSkillCli(run,args,cwd){let invocation2=resolveSkillsInvocation();if(!invocation2)throw new Error("Skills CLI and npx are unavailable");return run(invocation2.command,[...invocation2.argsPrefix,...args],cwd)}function validateProvider(value){if(typeof value!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(value))throw new Error("Skill provider must be a valid agent ID");return value}function validateScope(value){if(value!=="project"&&value!=="global")throw new Error("Skill scope must be project or global");return value}function validateArgument(value,label){if(typeof value!="string"||!value.trim()||/[\0\r\n]/.test(value))throw new Error(`${label} is invalid`);return value.trim()}function validateSkillName(value){let name=validateArgument(value,"Skill name");if(name==="."||name===".."||name.includes("/")||name.includes("\\"))throw new Error("Skill name is invalid");return name}function scopeCwd(scope,cwd){if(scope!=="global")return resolveWorkspaceDirectory(cwd)}var AgentSkillManager=class _AgentSkillManager{run;check;sources;selectedBackend;constructor(options={}){this.run=options.run??runSkillCli,this.check=options.checkUpdates??checkTrackedSkillUpdates,this.sources=options.readSources??readTrackedSkillSources,this.selectedBackend=options.backend??(()=>nativeCapabilities.get("skills.manager")?.())}backend(expectedManagerId){let backend=this.selectedBackend();if(backend&&(typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||["install","update","uninstall","checkUpdates"].some(key=>typeof backend[key]!="function")))throw new Error("Invalid Skill manager backend");if(backend?.installBatch!==void 0&&typeof backend.installBatch!="function")throw new Error("Invalid Skill batch installer");if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(backend?.normalizeSource!==void 0&&typeof backend.normalizeSource!="function")throw new Error("Invalid Skill source normalizer");if(expectedManagerId!==void 0&&(typeof expectedManagerId!="string"||expectedManagerId!==(backend?.id??SKILL_PLUGIN_MANAGER)))throw new Error("SKILL_MANAGER_CHANGED");return backend}capture(){let backend=this.backend();return new _AgentSkillManager({run:this.run,readSources:this.sources,checkUpdates:this.check,backend:()=>backend})}inspectGlobal(source,name,version2,migrateFrom){let acceptedSource=validateArgument(source,"Skill source"),acceptedName=validateSkillName(name),backend=this.backend();return inspectGlobalSkill(acceptedSource,acceptedName,version2,{migrateFrom,readSources:backend?.readSources??this.sources,externalManager:backend!==void 0,normalizeSource:backend?.normalizeSource})}hasGlobalRegistrationConflict(name,aliases){let directory=installedSkillDirectory(validateSkillName(name),"global"),manager=this.backend()?.id??SKILL_PLUGIN_MANAGER;return aliases.some(alias=>registrationConflicts(directory,findPluginRegistration(alias),manager))}async repairGlobalRegistration(name,options={}){let acceptedName=validateSkillName(name),backend=this.backend(),directory=installedSkillDirectory(acceptedName,"global");await registerInstalledSkillPlugin(directory,acceptedName,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceExisting,options.expectedPluginNames)}async install(data){let{providerId,scope,cwd}=this.mutationContext(data),source=validateArgument(data.source,"Skill source"),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId);return this.installAccepted({providerId,scope,cwd,name,source},backend)}async installGlobal(source,name){return this.installGlobals(source,[name])}async installGlobals(source,names,options={}){let acceptedSource=validateArgument(source,"Skill source");if(!Array.isArray(names)||!names.length||names.length>256)throw new Error("Expected 1–256 Skill names");let acceptedNames=names.map(validateSkillName);if(new Set(acceptedNames).size!==acceptedNames.length)throw new Error("Duplicate Skill names");if(options.replaceSkills?.some(name=>!acceptedNames.includes(name)))throw new Error("Invalid Skill replacement selection");let backend=this.backend();if(backend&&!backend.installBatch)throw new Error("The selected Skill manager requires a preset update for batch installation");let assertSources=()=>{if(options.registrationManagedBy===OFFICIAL_PLUGIN_MANAGER)for(let name of acceptedNames){let status=this.inspectGlobal(acceptedSource,name,void 0,options.migrateFrom?.[name]);if(status.state==="conflict"&&!(status.reason==="SKILL_SOURCE_CONFLICT"&&options.replaceSkills?.includes(name)))throw new Error(`${status.reason}: ${name}`)}};assertSources();let install=async()=>(assertSources(),backend?backend.installBatch({source:acceptedSource,names:acceptedNames,scope:"global"}):runResolvedSkillCli(this.run,["add",acceptedSource,"--skill",...acceptedNames,"--global","--full-depth","--yes"]));for(let name of acceptedNames){let operation=install;install=()=>preserveSkillDisabled(installedSkillDirectory(name,"global"),operation)}let output2=await install();for(let name of acceptedNames)await registerInstalledSkillPlugin(installedSkillDirectory(name,"global"),name,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceSkills?.includes(name),options.expectedPluginNames&&Object.hasOwn(options.expectedPluginNames,name)?options.expectedPluginNames[name]:void 0);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async installAccepted(data,backend){let{providerId,scope,cwd,name,source}=data,args=["add",source,"--skill",name,...providerId?["--agent",providerId]:[],...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),output2=await preserveSkillDisabled(directory,()=>backend?backend.install(data):runResolvedSkillCli(this.run,args,cwd));return await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER),{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async checkUpdates(data){validateProvider(data.providerId);let cwd=data.cwd!==void 0&&data.cwd!==null&&data.cwd!==""?resolveWorkspaceDirectory(data.cwd):void 0,backend=this.backend();return backend?backend.checkUpdates({providerId:data.providerId,cwd}):{updates:await this.check({cwd})}}async update(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source2=>source2.name===name);if(!backend&&!tracked)throw new Error(`Skill source is not tracked: ${name}`);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["add",tracked?.ref?`${tracked.source.replace(/#.*$/,"")}#${tracked.ref}`:tracked?.source??"","--skill",name,"--agent",data.providerId,...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=await preserveSkillDisabled(directory,()=>backend?backend.update({providerId,scope,cwd,name}):runResolvedSkillCli(this.run,args,cwd));if(skillManifestPath(directory))await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER);else for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async uninstall(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source=>source.name===name);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["remove",name,"--agent",providerId,...scope==="global"?["--global"]:[],"--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=backend?await backend.uninstall({providerId,scope,cwd,name}):await runResolvedSkillCli(this.run,args,cwd);if(!existsSync12(directory))for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}mutationContext(data){let providerId=validateProvider(data.providerId),scope=validateScope(data.scope),cwd=scopeCwd(scope,data.cwd);return{providerId,scope,...cwd?{cwd}:{}}}};init_native_capability_services();init_page_runtime_store();var runPresetProviderCommand=(command,args,options)=>runCommand(command,args,{...options,tee:!1,capture:!0,timeoutMs:Math.min(options?.timeoutMs??12e4,12e4)});function ordered(entries){let result=[],done=new Set,visit=id3=>{if(done.has(id3))return;done.add(id3);let entry=entries[id3];for(let dependency of entry.dependsOn??[])visit(dependency);result.push([id3,entry])};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3);return result}function providerSpec(entry){let parsed=parseProviderPackageSpec(entry.source.replace(/^npm:/,""));if(parsed.target!=="latest"&&!(0,import_semver9.validRange)(parsed.target)&&!entry.version)throw new Error("Provider dist-tags require a preset version range");if(parsed.target!=="latest"&&(0,import_semver9.validRange)(parsed.target)&&entry.version&&!(0,import_semver9.intersects)(parsed.target,entry.version))throw new Error("Provider source target conflicts with its preset version range");return`${parsed.packageName}@${parsed.target==="latest"&&entry.version?entry.version:parsed.target}`}function pluginNames(catalog,skill){return Object.entries(catalog?.plugins??{}).filter(([,plugin])=>plugin.skill===skill).map(([name])=>name)}var PresetComponentInstaller=class{store;skills;nodeStatus;listProviders;installProvider;ownerFile;pluginCatalog;constructor(options={}){this.store=options.store??new PresetInstallationStore({directory:capabilityDirectory()}),this.skills=options.skills??new AgentSkillManager,this.nodeStatus=options.nodeStatus??nativeCapabilities.status,this.listProviders=options.listProviders??listInstalledProviders,this.installProvider=options.installProvider??(source=>installProviderPackage(source,{runCommand:runPresetProviderCommand})),this.pluginCatalog=options.pluginCatalog??(()=>nativeCapabilities.require("plugins.catalog")()),this.ownerFile=options.ownerFile??join28(homedir13(),".agents",".mearl-preset-install.json")}async accepted(revision3,verifyResources=!1){if(!/^[a-f0-9]{64}$/.test(revision3))throw new Error("Expected a preset installation revision");let current=await this.store.current({verifyResources}),host=this.nodeStatus();if(!current.receipt||!current.preset||current.receipt.revision!==revision3||host.installationRevision!==revision3||host.revision!==current.receipt.nodeRevision)throw new Error("PRESET_SELECTION_CHANGED");return{receipt:current.receipt,preset:current.preset,rawHash:current.rawHash,hasCatalog:!!current.activation?.bindings["plugins.catalog"]}}catalog(current){if(!current.hasCatalog)return;let value=this.pluginCatalog();if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).length>200)throw new Error("INVALID_PLUGIN_CATALOG");let plugins=[];for(let[name,raw]of Object.entries(value)){if(!raw||typeof raw!="object"||Array.isArray(raw)||Object.keys(raw).some(key=>!["description","skill","setup"].includes(key)))throw new Error("INVALID_PLUGIN_CATALOG");let item=raw;if(typeof item.skill!="string"||!Object.hasOwn(current.preset.skills,item.skill))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let skill=current.preset.skills[item.skill];skill.enabled!==!1&&plugins.push([name,{...item,installArgs:[skill.source,"--skill",item.skill,"--yes"]}])}return validateOfficialPluginCatalog({schemaVersion:1,revision:current.receipt.revision,plugins:Object.fromEntries(plugins),selection:{path:join28(this.store.directory,"active-node.json"),sha256:current.rawHash}})}catalogReady(expected){try{return JSON.stringify(readOfficialPluginCatalog())!==JSON.stringify(expected)?!1:Object.entries(expected.plugins).every(([name,declaration])=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve14(dirname11(dirname11(entry)))===resolve14(homedir13(),".agents","skills",declaration.skill)})}catch{return!1}}providerStatus(id3,entry){try{providerSpec(entry)}catch{return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}}let{packageName,target}=parseProviderPackageSpec(entry.source.replace(/^npm:/,"")),installed=this.listProviders();if(installed.some(provider=>provider.providerId===id3&&provider.packageName!==packageName||provider.packageName===packageName&&provider.providerId!==id3))return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_SOURCE_CONFLICT"};let matching=installed.filter(provider=>provider.providerId===id3&&provider.packageName===packageName);if(matching.length>1)return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_REGISTRATION_AMBIGUOUS"};let manifest=matching[0];return!manifest||!inspectProviderPackage(manifest)?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_INSTALL_REQUIRED"}:target!=="latest"&&!(0,import_semver9.validRange)(target)&&!entry.version?{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}:[entry.version,...target!=="latest"&&(0,import_semver9.validRange)(target)?[target]:[]].filter(range2=>range2!==void 0).some(range2=>!(0,import_semver9.valid)(manifest.version)||!(0,import_semver9.satisfies)(manifest.version,range2))?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_VERSION_REQUIRED"}:{kind:"providers",id:id3,state:"ready"}}skillStatus(manager,id3,entry,catalog){let status=manager.inspectGlobal(entry.source,id3,entry.version,entry.migrateFrom),aliases=pluginNames(catalog,id3);return status.state!=="conflict"&&manager.hasGlobalRegistrationConflict(id3,aliases)?{kind:"skills",id:id3,state:"conflict",reason:"SKILL_PLUGIN_REGISTRATION_CONFLICT"}:{kind:"skills",id:id3,state:status.state==="ready"?"ready":status.state==="conflict"?"conflict":"pending",...status.reason?{reason:status.reason}:{}}}async status(revision3){let current=await this.accepted(revision3),{receipt,preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),components=[...ordered(preset.providers).map(([id3,entry])=>this.providerStatus(id3,entry)),...ordered(preset.skills).map(([id3,entry])=>this.skillStatus(manager,id3,entry,catalog))];return await this.accepted(revision3),{installationRevision:revision3,nodeRevision:receipt.nodeRevision,components,...catalog?{catalogReady:this.catalogReady(catalog)}:{}}}async install(revision3,options={}){let lease=claimPresetInstallation(this.ownerFile);try{return await withOwnedCommands(lease.lifecycle,async()=>{let current=await this.accepted(revision3,!0),{preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),providers=ordered(preset.providers),skills=ordered(preset.skills),expectedPluginNames=Object.create(null);for(let[id3]of skills){let names=pluginNames(catalog,id3);names.length&&(expectedPluginNames[id3]=names)}if(options.replaceSkills!==void 0&&(!Array.isArray(options.replaceSkills)||!options.replaceSkills.length||options.replaceSkills.length>256||new Set(options.replaceSkills).size!==options.replaceSkills.length||options.replaceSkills.some(id3=>typeof id3!="string"||!skills.some(([name])=>name===id3))))throw new Error("INVALID_SKILL_REPLACEMENT_SELECTION");let replaceable=(id3,status)=>(status.reason==="SKILL_SOURCE_CONFLICT"||status.reason==="SKILL_PLUGIN_REGISTRATION_CONFLICT")&&options.replaceSkills?.includes(id3);for(let[id3,entry]of providers)if(providerSpec(entry),this.providerStatus(id3,entry).state==="conflict")throw new Error(`PROVIDER_SOURCE_CONFLICT: ${id3}`);for(let[id3,entry]of skills){let status=this.skillStatus(manager,id3,entry,catalog);if(status.state==="conflict"&&!replaceable(id3,status))throw new Error(`${status.reason}: ${id3}`)}for(let[id3,entry]of providers){await this.accepted(revision3);let status=this.providerStatus(id3,entry);if(status.state==="conflict")throw new Error(`${status.reason}: ${id3}`);if(status.state==="ready")continue;await this.accepted(revision3),await this.installProvider(providerSpec(entry)),await this.accepted(revision3);let installed=this.providerStatus(id3,entry);if(installed.state!=="ready")throw new Error(`${installed.reason}: ${id3}`)}for(let index=0;index<skills.length;){await this.accepted(revision3);let[id3,entry]=skills[index],source=entry.source,first=manager.inspectGlobal(source,id3,entry.version,entry.migrateFrom);if(first.state==="conflict"&&!replaceable(id3,first))throw new Error(`${first.reason}: ${id3}`);if(first.state==="ready"){index++;continue}if(first.state==="registration"){if(await this.accepted(revision3),await manager.repairGlobalRegistration(id3,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,replaceExisting:options.replaceSkills?.includes(id3),expectedPluginNames:expectedPluginNames[id3]}),manager.inspectGlobal(source,id3,entry.version).state!=="ready")throw new Error(`SKILL_PLUGIN_REGISTRATION_REQUIRED: ${id3}`);index++;continue}let group=[[id3,entry]];for(index++;group.length<256&&index<skills.length&&skills[index][1].source===source;){let[nextId,next]=skills[index];if(next.dependsOn?.some(dependency=>group.some(([groupId])=>dependency===groupId)))break;let status=manager.inspectGlobal(source,nextId,next.version,next.migrateFrom);if(status.state!=="missing"&&status.state!=="version"&&status.state!=="migration"&&!replaceable(nextId,status))break;group.push([nextId,next]),index++}await this.accepted(revision3),await manager.installGlobals(source,group.map(([name])=>name),{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,migrateFrom:Object.fromEntries(group.map(([id4,entry2])=>[id4,entry2.migrateFrom??[]])),expectedPluginNames,...options.replaceSkills?.length?{replaceSkills:group.map(([name])=>name).filter(name=>options.replaceSkills.includes(name))}:{}}),await this.accepted(revision3);for(let[id4,entry2]of group){let status=manager.inspectGlobal(source,id4,entry2.version);if(status.state!=="ready")throw new Error(`${status.reason}: ${id4}`)}}return catalog&&(await this.accepted(revision3),replaceOfficialPluginCatalog(catalog.revision,catalog.plugins,catalog.selection)),await this.status(revision3)})}finally{lease.release()}}};init_bundles();init_preset2();var PRESET_INSTALLATION_PROTOCOL=1;function record3(value,fields7){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!fields7.includes(key)))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");return value}function selection(value){return value===null||typeof value=="string"&&/^(?:node:)?[a-f0-9]{64}$/.test(value)}function createInstallationResourceLoader(session,request){return async(source,options)=>{if(!Number.isSafeInteger(options.maxBytes)||options.maxBytes<0||options.maxBytes>MAX_BUNDLE_BYTES)throw new Error("INVALID_PRESET_RESOURCE_LIMIT");options.signal?.throwIfAborted();let first=await request({operation:"resource",session,source,maxBytes:options.maxBytes,offset:0},13e4);if(!first||!Number.isSafeInteger(first.byteLength)||first.byteLength<0||first.byteLength>options.maxBytes||typeof first.sha256!="string")throw new Error("INVALID_PRESET_RESOURCE_RESPONSE");return readPresetTransferResource(first.sha256,first.byteLength,{signal:options.signal,read:offset=>offset===0?Promise.resolve(first):request({operation:"resource",session,source,maxBytes:options.maxBytes,offset},15e3)})}}var NativePresetInstallation=class{constructor(dependencies){this.dependencies=dependencies}dependencies;pending=Promise.resolve();installer(session){return new PresetInstaller({directory:this.dependencies.directory,hosts:()=>[{id:"attached"}],...session?{load:createInstallationResourceLoader(session,this.dependencies.request)}:{},invoke:async(action,data={},options)=>action==="preset_browser_sync"&&session?this.dependencies.request({operation:"sync",session,installationRevision:data.installationRevision},13e4):this.dependencies.invoke(action,data,options)})}async handle(value){let input2=record3(value,["operation","session","source","presetId","expectedRevision","replaceSkills"]);if(input2.replaceSkills!==void 0&&(input2.operation!=="resume"||!Array.isArray(input2.replaceSkills)||!input2.replaceSkills.length||input2.replaceSkills.length>256||input2.replaceSkills.some(id3=>typeof id3!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(id3))||new Set(input2.replaceSkills).size!==input2.replaceSkills.length))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");if(input2.operation==="inspect"){if(Object.keys(input2).length!==1)throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let current=await this.installer().store.current({verifyResources:!1});return{protocol:PRESET_INSTALLATION_PROTOCOL,selection:presetSelectionRevision(current),id:current.preset?.id,source:current.receipt?.snapshot.source,browserRequired:current.receipt?.browserSyncRequired}}if(input2.operation==="status"){if(Object.keys(input2).some(key=>!["operation","source","presetId","expectedRevision"].includes(key))||typeof input2.presetId!="string"||typeof input2.source!="string"||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let installer=this.installer(),current=await installer.store.current({verifyResources:!1});return!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==input2.source||presetSelectionRevision(current)!==input2.expectedRevision?{ready:!1,changed:!0}:installer.status()}if(!["apply","resume","update"].includes(String(input2.operation))||typeof input2.session!="string"||!/^[a-f0-9-]{36}$/.test(input2.session)||typeof input2.source!="string"||typeof input2.presetId!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(input2.presetId)||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let source=new URL(input2.source);if(source.protocol!=="https:"||source.username||source.password||source.hash||source.href!==input2.source)throw new Error("INVALID_PRESET_INSTALLATION_SOURCE");let run=async()=>{let session=input2.session,installer=this.installer(session);if(input2.operation==="resume"){let current=await installer.store.current({verifyResources:!1});if(!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==source.href||current.receipt.revision!==input2.expectedRevision)throw new Error("INSTALLATION_SELECTION_CHANGED");return await this.dependencies.request({operation:"confirm",session},15e3),installer.resume(current.receipt.revision,{replaceSkills:input2.replaceSkills})}return installer.apply(source.href,{skipUnchanged:input2.operation==="update",validatePrepared:input2.operation==="update"?async prepared=>{await this.dependencies.request({operation:"permissions",session,origins:prepared.preset.permissions.origins,browserRevision:prepared.browser.snapshot.revision,browserRequired:presetRequiresBrowser(prepared.preset)},15e3)}:void 0,expectedId:input2.presetId,expectedRevision:input2.expectedRevision,confirm:async()=>{await this.dependencies.request({operation:"confirm",session},15e3)}})},next=this.pending.catch(()=>{}).then(run);return this.pending=next,next}};import{createHash as createHash16,randomUUID as randomUUID20}from"node:crypto";var PluginPageResults=class{values=new Map;prune(){for(let[id3,value]of this.values)Date.now()-value.updatedAt>3e4&&this.values.delete(id3)}wrap(plugin,value){this.prune();let bytes=Buffer.from(JSON.stringify(value??null));if(bytes.length<=192*1024)return{kind:"value",value:value??null};if(bytes.length>24*1024*1024||this.values.size>=8||[...this.values.values()].reduce((sum,value2)=>sum+value2.bytes.length,bytes.length)>32*1024*1024)throw new Error("Plugin page reply exceeds resource limits");let resultId=randomUUID20(),sha2562=createHash16("sha256").update(bytes).digest("hex");return this.values.set(resultId,{plugin,bytes,sha256:sha2562,updatedAt:Date.now()}),{kind:"resource",resultId,bytes:bytes.length,chunks:Math.ceil(bytes.length/(192*1024)),sha256:sha2562}}read(plugin,operation,input2){this.prune();let value=this.values.get(input2.resultId);if(!value||value.plugin!==plugin)throw new Error("Plugin page reply was not found");if(operation==="result_release")return this.values.delete(input2.resultId),{released:!0};let chunks=Math.ceil(value.bytes.length/(192*1024));if(!Number.isSafeInteger(input2.index)||input2.index<0||input2.index>=chunks)throw new Error("Invalid page reply chunk");return value.updatedAt=Date.now(),{resultId:input2.resultId,bytes:value.bytes.length,chunks,sha256:value.sha256,index:input2.index,data:value.bytes.subarray(input2.index*192*1024,(input2.index+1)*192*1024).toString("base64")}}};init_pluginHostConnection();init_pluginTasks2();init_pluginPages2();init_plugin();init_unified();init_dist2();init_unified();init_pluginState2();init_pluginModels2();init_dist2();function getClient(plugin,invoke3,event=!1,interactive=!1,scope="extension"){if(!/^[a-z][a-z0-9_-]*$/.test(plugin))throw new Error("Invalid plugin name");let key=`${scope}:${event?"runtime":interactive?"interactive":"toolbox"}:${plugin}`,client=clients.get(key);if(!client){let connection=new PluginHostConnection({plugin,access:event?"runtime":"toolbox",source:event?"runtime":"toolbox",scopeId:`${process.pid}:${scope}`,invoke:(action,payload,options)=>invoke3()(action,payload,options)});client={connection,models:new PluginModelClient({connection}),state:new PluginStateClient({connection}),pages:new PluginPageClient({},connection)},clients.set(key,client)}return client}var clients=new Map;function callPluginPageService(plugin,input2,invoke3,event=!1,interactive=!1,scope="extension"){let client=getClient(plugin,invoke3,event,interactive,scope);return event?client.connection.request("page.event",{plugin,input:input2,options:{}},4e4):client.pages.call(plugin,input2.operation,input2)}function callPluginStateService(plugin,input2,invoke3){return getClient(plugin,invoke3).state.call(plugin,input2.collection,input2.operation,input2)}async function callPluginModelService(plugin,input2,invoke3,execution={}){let client=getClient(plugin,invoke3);if(execution.signal?.throwIfAborted(),input2.operation==="capabilities")return client.models.capabilities();if(input2.operation==="list")return client.models.list(input2.provider);if(!["start","run"].includes(input2.operation))throw new Error("Invalid model operation");let options=input2.taskOptions??{};if(!options||typeof options!="object"||Array.isArray(options)||Object.keys(options).some(key=>!["cwd","executionTimeoutMs","idempotencyKey"].includes(key)))throw new Error("Invalid toolbox model execution options");let started=await client.models.start(plugin,input2.request,options);if(input2.operation==="start")return started;let cancel=()=>{client.models.tasks.cancel(started.taskId).catch(()=>{})};execution.signal?.addEventListener("abort",cancel,{once:!0});try{return execution.signal?.aborted&&cancel(),await client.models.tasks.wait(started.taskId,{onProgress:execution.onProgress})}finally{execution.signal?.removeEventListener("abort",cancel)}}init_app_profile_catalog();init_plugin2();init_dist2();init_dist2();init_dist2();var enabledDomains=new WeakMap;function ensureCdpDomain(client,domain,params={}){let domains=enabledDomains.get(client);domains||(domains=new Map,enabledDomains.set(client,domains));let existing=domains.get(domain);if(existing)return existing;let enabling=client.sendCommand(`${domain}.enable`,params).then(()=>{}).catch(error=>{throw domains?.get(domain)===enabling&&domains.delete(domain),error});return domains.set(domain,enabling),enabling}var injectedSessions=new WeakMap,indicatorQueues=new WeakMap;function enqueueIndicatorOperation(session,operation){let queued=(indicatorQueues.get(session)??Promise.resolve()).catch(()=>{}).then(operation);return indicatorQueues.set(session,queued),queued.finally(()=>{indicatorQueues.get(session)===queued&&indicatorQueues.delete(session)})}function createFaviconScript(controlSource){let iconDataUrl=createControlledFaviconDataUrl(controlSource);return`(() => {
|
|
1132
|
+
`)}handleExit(child,error){if(this.process===child){this.process=null,this.initialized=!1,this.startPromise=null,this.executableResolver.reset(),this.rejectPending(error);for(let providerSessionId of this.knownThreadIds)this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error.message}})}}rejectPending(error){for(let[id3,pending]of this.pendingRequests)clearTimeout(pending.timer),pending.reject(error),this.pendingRequests.delete(id3)}modelDiagnostic(metadata){this.emit({kind:"notification",method:"provider/model/diagnostic",params:metadata})}emit(event){for(let listener of this.listeners)listener(event)}extractThreadId(params){return[params?.threadId,params?.conversationId,params?.thread?.id,params?.turn?.threadId].find(value=>typeof value=="string")}probeExecutable(executable){return probeAgentExecutable(executable,{args:["app-server","--help"],timeoutMs:PROBE_TIMEOUT_MS,timeoutError:"Timed out while checking Codex app-server availability.",startError:error=>`Failed to start Codex: ${error.message}`,exitError:code=>`Codex app-server check exited with code ${String(code)}`})}readExecutableVersion(executable){return codexExecutableVersion(executable)}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(codexExecutableCandidatePaths())}}}});var CODEX_MODEL_CAPABILITY,init_capabilities=__esm({"../agent-runtime/dist/capabilities.js"(){"use strict";CODEX_MODEL_CAPABILITY={provider:"codex",modes:["agent"],permissions:["read-only"],structuredOutput:!0,streaming:!0,cancellation:!0}}});import{readFileSync as readFileSync18}from"node:fs";async function runCodexModel(request,context,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync18(new URL("../package.json",import.meta.url),"utf8")).version)){if(request.provider!=="codex"||request.mode!=="agent"||request.permissions!=="read-only")throw Object.assign(new Error("Codex supports explicit read-only agent execution; strict tool-free generation is unavailable"),{code:"PLUGIN_MODEL_CAPABILITY_UNSUPPORTED"});context.signal.throwIfAborted();let session,turn,text3,bytes=0,index=0,retries=0,buffered="",streamItem,streamPhase,phases=new Map,flushTimer,flush=()=>{clearTimeout(flushTimer),flushTimer=void 0;try{for(let offset=0;offset<buffered.length;offset+=4e3)streamItem||streamPhase?context.onDelta(buffered.slice(offset,offset+4e3),++index,{...streamItem?{itemId:streamItem}:{},...streamPhase?{phase:streamPhase}:{}}):context.onDelta(buffered.slice(offset,offset+4e3),++index)}catch(error){fail2(error)}buffered=""},finish,fail2,completed=new Promise((resolve16,reject)=>{finish=resolve16,fail2=reject});completed.catch(()=>{});let listener=event=>{let params=event.params;event.method==="provider/model/diagnostic"&&context.onDiagnostic?.(params),event.method==="account/updated"&&context.onDiagnostic?.({authentication:["apikey","chatgpt","chatgptAuthTokens"].includes(params?.authMode)?params.authMode:"unknown"}),event.method==="session/model/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({selectedModel:params.model.id}),event.method==="session/activeModel/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({activeModel:params.model.id});let relevant=event.providerSessionId===void 0||event.providerSessionId===session;if(event.kind==="request"&&relevant){try{provider.respondToRequest(event.requestId,{error:"Interactive requests are disabled for background model tasks"})}catch{}fail2(Object.assign(new Error("Model requested interactive input"),{code:"PLUGIN_MODEL_INTERACTION_REQUIRED"})),provider.dispose();return}if((event.kind==="error"||event.method==="provider/exited")&&relevant){if(event.method!=="provider/exited"&¶ms?.willRetry===!0){context.onDiagnostic?.({retryCount:++retries});return}fail2(Object.assign(new Error(String(params?.error?.message??params?.message??"Model provider failed")),{code:"PLUGIN_MODEL_PROVIDER_ERROR"})),provider.dispose();return}if(!(!session||event.providerSessionId!==session))if(event.method==="item/started"&¶ms?.item?.type==="agentMessage")flush(),streamItem=params.item.id,streamPhase=params.item.phase,streamItem&&streamPhase&&phases.set(streamItem,streamPhase);else if(event.method==="item/agentMessage/delta"&&typeof params?.delta=="string"){let itemId=params.itemId??streamItem,phase=params.phase??(itemId?phases.get(itemId):streamPhase);if((itemId!==streamItem||phase!==streamPhase)&&flush(),streamItem=itemId,streamPhase=phase,bytes+=Buffer.byteLength(params.delta),bytes>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}buffered+=params.delta,buffered.length>=16e3?flush():flushTimer??=setTimeout(flush,50)}else if(event.method==="item/completed"&¶ms?.item?.type==="agentMessage"&&typeof params.item.text=="string"){if(flush(),Buffer.byteLength(params.item.text)>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}(!params.item.phase||params.item.phase==="final_answer")&&(text3=params.item.text)}else event.method==="turn/completed"&&(params?.turn?.status!=="completed"?fail2(Object.assign(new Error(`Model turn ended with ${String(params?.turn?.status)}${params?.turn?.error?.message?`: ${params.turn.error.message}`:""}`),{code:"PLUGIN_MODEL_TURN_FAILED"})):text3===void 0?fail2(new Error("Model returned no final text")):(flush(),finish(text3)))},unsubscribe=provider.onEvent(listener),abort=()=>{fail2(Object.assign(new Error("Model execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"})),session&&turn&&provider.interrupt(session,turn).catch(()=>{}),provider.dispose()};context.signal.addEventListener("abort",abort,{once:!0});try{session=context.conversation?.threadId??await provider.startSession({cwd:context.cwd,ephemeral:!0,readOnly:!0,modelExecution:!0,...request.model?{modelId:request.model}:{},...request.instructions?{developerInstructions:request.instructions}:{}}),context.conversation&&(context.conversation.threadId=session),context.onDiagnostic?.({...provider.getSessionModel(session)?.id?{selectedModel:provider.getSessionModel(session).id}:{}}),context.signal.throwIfAborted();let[,result]=await Promise.all([provider.sendMessage(session,request.prompt,[],{reasoningSummary:"none",reasoningEffort:request.reasoningEffort,outputSchema:request.outputSchema,modelExecution:!0}).then(value=>{turn=value.turnId}),completed]);return context.signal.throwIfAborted(),{text:result,provider:request.provider,mode:request.mode,...provider.getSessionModel(session)?.id?{model:provider.getSessionModel(session).id}:{}}}catch(error){throw context.conversation&&(delete context.conversation.threadId,provider.dispose()),error}finally{clearTimeout(flushTimer),context.signal.removeEventListener("abort",abort),unsubscribe(),context.conversation||provider.dispose()}}var init_model=__esm({"../agent-runtime/dist/model.js"(){"use strict";init_codex_provider();init_capabilities()}});import{readFileSync as readFileSync19}from"node:fs";async function listCodexModels(signal,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync19(new URL("../package.json",import.meta.url),"utf8")).version)){signal.throwIfAborted();let abort,cancelled=new Promise((_resolve,reject)=>{abort=()=>{provider.dispose(),reject(signal.reason??new Error("Model discovery cancelled"))},signal.addEventListener("abort",abort,{once:!0})});try{return await Promise.race([provider.listModels(),cancelled])}finally{signal.removeEventListener("abort",abort),provider.dispose()}}var init_model_catalog=__esm({"../agent-runtime/dist/model-catalog.js"(){"use strict";init_codex_provider()}});var codex_exports={};__export(codex_exports,{CODEX_MODEL_CAPABILITY:()=>CODEX_MODEL_CAPABILITY,CodexAgentProvider:()=>CodexAgentProvider,codexAppExecutableCandidatePaths:()=>codexAppExecutableCandidatePaths,codexExecutableCandidatePaths:()=>codexExecutableCandidatePaths,codexThreadUrl:()=>codexThreadUrl,codexWorkspaceUrl:()=>codexWorkspaceUrl,compareCodexVersions:()=>compareCodexVersions,externalOpenCommand:()=>externalOpenCommand,listCodexModels:()=>listCodexModels,normalizeCodexVersion:()=>normalizeCodexVersion,runCodexModel:()=>runCodexModel});var init_codex=__esm({"../agent-runtime/dist/codex.js"(){"use strict";init_codex_provider();init_model();init_model_catalog()}});init_page_runtime_store();import{execFileSync}from"node:child_process";var MAC_BROWSER_NAMES={"com.citrolabs.ego.lite":"EgoLite","com.google.Chrome":"Chrome","com.google.Chrome.beta":"Chrome Beta","com.google.Chrome.dev":"Chrome Dev","com.google.Chrome.canary":"Chrome Canary","com.microsoft.edgemac":"Edge","com.microsoft.edgemac.Beta":"Edge Beta","com.microsoft.edgemac.Dev":"Edge Dev","com.microsoft.edgemac.Canary":"Edge Canary"},commandOptions={encoding:"utf8",timeout:300,maxBuffer:8192},nativeProbe={platform:process.platform,parentPid:process.ppid,executable:pid=>execFileSync("/bin/ps",["-p",String(pid),"-o","comm="],commandOptions).trim(),bundleIdentifier:plist=>execFileSync("/usr/libexec/PlistBuddy",["-c","Print :CFBundleIdentifier",plist],commandOptions).trim()};function detectNativeBrowserName(probe=nativeProbe){if(!(probe.platform!=="darwin"||!Number.isSafeInteger(probe.parentPid)||probe.parentPid<=1))try{let executable=probe.executable(probe.parentPid),index=executable.lastIndexOf(".app/Contents/MacOS/");if(!executable.startsWith("/")||index<0||/[\r\n\0]/.test(executable))return;let plist=`${executable.slice(0,index+4)}/Contents/Info.plist`,identifier2=probe.bundleIdentifier(plist);return Object.hasOwn(MAC_BROWSER_NAMES,identifier2)?MAC_BROWSER_NAMES[identifier2]:void 0}catch{return}}function createExtensionBrowserNameResolver(detect=detectNativeBrowserName){let inspected=!1,nativeName;return reportedName=>(inspected||(inspected=!0,nativeName=detect()),nativeName??reportedName)}init_dist();init_preset2();init_installation();init_bundles();import{randomUUID as randomUUID11}from"node:crypto";import{mkdirSync as mkdirSync5,readFileSync as readFileSync5,renameSync as renameSync7,statSync as statSync6,writeFileSync as writeFileSync6}from"node:fs";import{join as join10}from"node:path";function createNativePresetAutoUpdater(dependencies){let now=dependencies.now??Date.now,statePath=join10(dependencies.directory,"auto-update.json"),read=()=>{try{if(statSync6(statePath).size<=8192)return JSON.parse(readFileSync5(statePath,"utf8"))}catch{}},write=value=>{let temporary=`${statePath}.${randomUUID11()}.tmp`;writeFileSync6(temporary,JSON.stringify(value),{mode:384}),renameSync7(temporary,statePath)},configuration=dependencies.configuration??(()=>{let url=resolveInstallationConfigUrl();return loadInstallationConfig(url,url.origin,AbortSignal.timeout(5e3))}),pending;return()=>pending||(pending=(async()=>{let current=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke}).store.current({verifyResources:!1});if(!current.receipt||!current.preset)return;let extensionOwnsUpdate=async()=>{if(!dependencies.extensionConnected())return!1;if(current.receipt.browserSyncRequired||!dependencies.browserSelection)return!0;let browser=await dependencies.browserSelection();return!browser.presetId||browser.presetId===current.preset.id&&browser.presetSource===current.receipt.snapshot.source};if(await extensionOwnsUpdate())return;let id3=current.preset.id,source=current.receipt.snapshot.source,checkedAt=now(),token=randomUUID11();if(mkdirSync5(dependencies.directory,{recursive:!0,mode:448}),!withRecordLock(statePath,()=>{let previous=read();return previous?.token&&previous.pid&&isAlive(previous.pid)&&checkedAt-previous.checkedAt<30*6e4||previous?.id===id3&&previous.source===source&&previous.checkedAt<=checkedAt&&previous.nextCheckAt>checkedAt?!1:(write({id:id3,source,checkedAt,nextCheckAt:checkedAt+PRESET_UPDATE_RETRY_MS,token,pid:process.pid}),!0)}))return;let status="failed",error;try{let config=await configuration(),trusted=trustedInstallationPreset(config,id3,source);if(!trusted){status="untrusted";return}let load=dependencies.load??createNodePresetLoader(),result=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke,load:(value,options)=>{let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||!trusted.origins.some(origin=>matchesInstallationOrigin(origin,url)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");return load(value,options)}}).apply(source,{expectedId:id3,expectedRevision:current.receipt.revision,skipUnchanged:!0,signal:AbortSignal.timeout(12e4),validatePrepared:async prepared=>{if(await extensionOwnsUpdate())throw new Error("PRESET_UPDATE_EXTENSION_CONNECTED");let latest=trustedInstallationPreset(await configuration(),id3,source);if(JSON.stringify(latest)!==JSON.stringify(trusted))throw new Error("PRESET_UPDATE_TRUST_CHANGED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,trusted.origins)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,current.preset.permissions.origins))||!current.receipt.browserSyncRequired&&presetRequiresBrowser(prepared.preset))throw new Error("PRESET_UPDATE_PERMISSION_REQUIRED")}});status=result.revision===current.receipt.revision?"current":"updated",result.ready||(error="INSTALLATION_SYNC_PENDING")}catch(failure){error=failure instanceof Error?failure.message:String(failure),dependencies.log?.("Preset update deferred:",error)}finally{withRecordLock(statePath,()=>{read()?.token===token&&write({id:id3,source,checkedAt,nextCheckAt:checkedAt+(status==="failed"||error?PRESET_UPDATE_RETRY_MS:PRESET_UPDATE_INTERVAL_MS),status,...error?{error}:{}})})}})().catch(error=>dependencies.log?.("Preset update unavailable:",String(error))).finally(()=>{pending=void 0}),pending)}init_native_capability_services();init_preset2();init_dist();var import_semver2=__toESM(require_semver2(),1);init_preset2();init_dist7();init_host();init_plugin2();import{homedir as homedir13}from"node:os";import{dirname as dirname11,join as join28,resolve as resolve14}from"node:path";init_skills();init_skillSources();init_native_capability_services();init_dist();init_plugin2();import{existsSync as existsSync12,realpathSync as realpathSync5}from"node:fs";import{homedir as homedir12}from"node:os";import{dirname as dirname10,join as join27,resolve as resolve13}from"node:path";import fs10 from"node:fs";import path12 from"node:path";import{execFile as execFile2}from"node:child_process";function selectedPath(stdout){return stdout.replace(/[\r\n]+$/,"")||null}var runDirectoryPickerCommand=(command,args)=>new Promise((resolve16,reject)=>{execFile2(command,args,{encoding:"utf8",windowsHide:!0},(error,stdout)=>{if(!error){resolve16(selectedPath(stdout));return}if(error.code===1){resolve16(null);return}reject(error)})});function isMissingCommand(error){return error instanceof Error&&error.code==="ENOENT"}async function pickWorkspaceDirectory(platform=process.platform,run=runDirectoryPickerCommand){let directory;if(platform==="darwin")directory=await run("osascript",["-e",'POSIX path of (choose folder with prompt "Select a folder")']);else if(platform==="win32"){let script=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;","$dialog.Description = 'Select a folder';","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {","[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;","Write-Output $dialog.SelectedPath;","}"].join(" ");directory=await run("powershell.exe",["-NoProfile","-STA","-Command",script])}else if(platform==="linux")try{directory=await run("zenity",["--file-selection","--directory","--title=Select a folder"])}catch(error){if(!isMissingCommand(error))throw error;try{directory=await run("kdialog",["--getexistingdirectory",".","--title","Select a folder"])}catch(fallbackError){throw isMissingCommand(fallbackError)?new Error("Install zenity or kdialog to select a folder",{cause:fallbackError}):fallbackError}}else throw new Error(`Directory selection is not supported on ${platform}`);return directory?resolveWorkspaceDirectory(directory):null}function resolveWorkspaceDirectory(directory){if(typeof directory!="string"||!directory)throw new Error("Workspace directory is required");if(!path12.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs10.realpathSync.native(directory)}catch(error){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error})}if(!fs10.statSync(resolved).isDirectory())throw new Error(`Workspace path is not a directory: ${directory}`);return resolved}var SKILL_PLUGIN_MANAGER="skills",registrationContext2={options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}};function installedSkillDirectory(name,scope,cwd){return join27(scope==="global"?homedir12():cwd,".agents","skills",name)}function canonicalDirectory(directory){try{return realpathSync5(directory)}catch{return resolve13(directory)}}function registrationConflicts(directory,existing,manager){if(!existing)return!1;let registered=dirname10(dirname10(existing.entry));return existing.managedBy===manager?resolve13(registered)!==resolve13(directory):canonicalDirectory(registered)!==canonicalDirectory(directory)}function registeredNamesForSkill(directory){let installedDirectory=resolve13(directory);return listPluginNames().filter(name=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve13(dirname10(dirname10(entry)))===installedDirectory})}async function registerInstalledSkillPlugin(directory,skillName2,manager=SKILL_PLUGIN_MANAGER,registrationManagedBy,replaceExisting=!1,expectedPluginNames){if(!skillManifestPath(directory))throw new Error(`Skill 安装完成但找不到安装目录: ${directory}`);let entry=findPluginDirectoryEntry(directory),aliases=registeredNamesForSkill(directory),managed=registrationManagedBy===OFFICIAL_PLUGIN_MANAGER,presetOwned=aliases.some(alias=>findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER);if(!entry){for(let name2 of aliases)(!managed&&!presetOwned||findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(name2);return}let plugin=await loadPlugin(entry,registrationContext2),name=plugin.name||skillName2;if(expectedPluginNames&&!expectedPluginNames.includes(name))throw new Error(`SKILL_PLUGIN_NAME_CONFLICT: ${skillName2}`);let existing=findPluginRegistration(name),replacingRegistration=registrationConflicts(directory,existing,manager);if(replacingRegistration&&!replaceExisting)throw new Error(`插件 ${name} 已由其他 Skill 注册,无法自动覆盖`);if(managed&&!presetOwned&&!replaceExisting&&aliases.some(alias=>alias!==name&&findPluginRegistration(alias)?.managedBy!==registrationManagedBy))throw new Error(`SKILL_USER_PLUGIN_ALIAS_CONFLICT: ${skillName2}`);if(plugin.setup){let registrations=()=>JSON.stringify([findPluginRegistration(name),registeredNamesForSkill(directory).map(alias=>findPluginRegistration(alias))]),before=registrations();if(await plugin.setup({runCommand}),!skillManifestPath(directory)||findPluginDirectoryEntry(directory)!==entry||registrations()!==before)throw new Error(`SKILL_PLUGIN_REGISTRATION_CHANGED: ${skillName2}`)}let managedBy=(managed||presetOwned)&&existing&&!replacingRegistration?existing.managedBy:presetOwned?OFFICIAL_PLUGIN_MANAGER:registrationManagedBy??manager;registerPlugin(name,entry,plugin.description,{managedBy,...plugin.toolbox?{toolbox:plugin.toolbox}:{},appProfiles:plugin.appProfiles,profileSources:plugin.profileSources});for(let alias of aliases)alias!==name&&(!managed&&!presetOwned||findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(alias);return name}var runSkillCli=async(executable,args,cwd)=>{let invocation2=resolveSkillsInvocation(),result=await runCommand(executable,args,{cwd,capture:!0,env:invocation2?.env,timeoutMs:12e4}),detail=stripAnsi(`${result.stdout}
|
|
1133
|
+
${result.stderr}`);if(result.code!==0||/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail))throw new Error(detail.trim()||"Skills operation failed");return{stdout:result.stdout,stderr:result.stderr}};function runResolvedSkillCli(run,args,cwd){let invocation2=resolveSkillsInvocation();if(!invocation2)throw new Error("Skills CLI and npx are unavailable");return run(invocation2.command,[...invocation2.argsPrefix,...args],cwd)}function validateProvider(value){if(typeof value!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(value))throw new Error("Skill provider must be a valid agent ID");return value}function validateScope(value){if(value!=="project"&&value!=="global")throw new Error("Skill scope must be project or global");return value}function validateArgument(value,label){if(typeof value!="string"||!value.trim()||/[\0\r\n]/.test(value))throw new Error(`${label} is invalid`);return value.trim()}function validateSkillName(value){let name=validateArgument(value,"Skill name");if(name==="."||name===".."||name.includes("/")||name.includes("\\"))throw new Error("Skill name is invalid");return name}function scopeCwd(scope,cwd){if(scope!=="global")return resolveWorkspaceDirectory(cwd)}var AgentSkillManager=class _AgentSkillManager{run;check;sources;selectedBackend;constructor(options={}){this.run=options.run??runSkillCli,this.check=options.checkUpdates??checkTrackedSkillUpdates,this.sources=options.readSources??readTrackedSkillSources,this.selectedBackend=options.backend??(()=>nativeCapabilities.get("skills.manager")?.())}backend(expectedManagerId){let backend=this.selectedBackend();if(backend&&(typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||["install","update","uninstall","checkUpdates"].some(key=>typeof backend[key]!="function")))throw new Error("Invalid Skill manager backend");if(backend?.installBatch!==void 0&&typeof backend.installBatch!="function")throw new Error("Invalid Skill batch installer");if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(backend?.normalizeSource!==void 0&&typeof backend.normalizeSource!="function")throw new Error("Invalid Skill source normalizer");if(expectedManagerId!==void 0&&(typeof expectedManagerId!="string"||expectedManagerId!==(backend?.id??SKILL_PLUGIN_MANAGER)))throw new Error("SKILL_MANAGER_CHANGED");return backend}capture(){let backend=this.backend();return new _AgentSkillManager({run:this.run,readSources:this.sources,checkUpdates:this.check,backend:()=>backend})}inspectGlobal(source,name,version2,migrateFrom){let acceptedSource=validateArgument(source,"Skill source"),acceptedName=validateSkillName(name),backend=this.backend();return inspectGlobalSkill(acceptedSource,acceptedName,version2,{migrateFrom,readSources:backend?.readSources??this.sources,externalManager:backend!==void 0,normalizeSource:backend?.normalizeSource})}hasGlobalRegistrationConflict(name,aliases){let directory=installedSkillDirectory(validateSkillName(name),"global"),manager=this.backend()?.id??SKILL_PLUGIN_MANAGER;return aliases.some(alias=>registrationConflicts(directory,findPluginRegistration(alias),manager))}async repairGlobalRegistration(name,options={}){let acceptedName=validateSkillName(name),backend=this.backend(),directory=installedSkillDirectory(acceptedName,"global");await registerInstalledSkillPlugin(directory,acceptedName,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceExisting,options.expectedPluginNames)}async install(data){let{providerId,scope,cwd}=this.mutationContext(data),source=validateArgument(data.source,"Skill source"),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId);return this.installAccepted({providerId,scope,cwd,name,source},backend)}async installGlobal(source,name){return this.installGlobals(source,[name])}async installGlobals(source,names,options={}){let acceptedSource=validateArgument(source,"Skill source");if(!Array.isArray(names)||!names.length||names.length>256)throw new Error("Expected 1–256 Skill names");let acceptedNames=names.map(validateSkillName);if(new Set(acceptedNames).size!==acceptedNames.length)throw new Error("Duplicate Skill names");if(options.replaceSkills?.some(name=>!acceptedNames.includes(name)))throw new Error("Invalid Skill replacement selection");let backend=this.backend();if(backend&&!backend.installBatch)throw new Error("The selected Skill manager requires a preset update for batch installation");let assertSources=()=>{if(options.registrationManagedBy===OFFICIAL_PLUGIN_MANAGER)for(let name of acceptedNames){let status=this.inspectGlobal(acceptedSource,name,void 0,options.migrateFrom?.[name]);if(status.state==="conflict"&&!(status.reason==="SKILL_SOURCE_CONFLICT"&&options.replaceSkills?.includes(name)))throw new Error(`${status.reason}: ${name}`)}};assertSources();let install=async()=>(assertSources(),backend?backend.installBatch({source:acceptedSource,names:acceptedNames,scope:"global"}):runResolvedSkillCli(this.run,["add",acceptedSource,"--skill",...acceptedNames,"--global","--full-depth","--yes"]));for(let name of acceptedNames){let operation=install;install=()=>preserveSkillDisabled(installedSkillDirectory(name,"global"),operation)}let output2=await install();for(let name of acceptedNames)await registerInstalledSkillPlugin(installedSkillDirectory(name,"global"),name,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceSkills?.includes(name),options.expectedPluginNames&&Object.hasOwn(options.expectedPluginNames,name)?options.expectedPluginNames[name]:void 0);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async installAccepted(data,backend){let{providerId,scope,cwd,name,source}=data,args=["add",source,"--skill",name,...providerId?["--agent",providerId]:[],...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),output2=await preserveSkillDisabled(directory,()=>backend?backend.install(data):runResolvedSkillCli(this.run,args,cwd));return await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER),{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async checkUpdates(data){validateProvider(data.providerId);let cwd=data.cwd!==void 0&&data.cwd!==null&&data.cwd!==""?resolveWorkspaceDirectory(data.cwd):void 0,backend=this.backend();return backend?backend.checkUpdates({providerId:data.providerId,cwd}):{updates:await this.check({cwd})}}async update(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source2=>source2.name===name);if(!backend&&!tracked)throw new Error(`Skill source is not tracked: ${name}`);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["add",tracked?.ref?`${tracked.source.replace(/#.*$/,"")}#${tracked.ref}`:tracked?.source??"","--skill",name,"--agent",data.providerId,...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=await preserveSkillDisabled(directory,()=>backend?backend.update({providerId,scope,cwd,name}):runResolvedSkillCli(this.run,args,cwd));if(skillManifestPath(directory))await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER);else for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async uninstall(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source=>source.name===name);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["remove",name,"--agent",providerId,...scope==="global"?["--global"]:[],"--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=backend?await backend.uninstall({providerId,scope,cwd,name}):await runResolvedSkillCli(this.run,args,cwd);if(!existsSync12(directory))for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}mutationContext(data){let providerId=validateProvider(data.providerId),scope=validateScope(data.scope),cwd=scopeCwd(scope,data.cwd);return{providerId,scope,...cwd?{cwd}:{}}}};init_native_capability_services();init_page_runtime_store();var runPresetProviderCommand=(command,args,options)=>runCommand(command,args,{...options,tee:!1,capture:!0,timeoutMs:Math.min(options?.timeoutMs??12e4,12e4)});function ordered(entries){let result=[],done=new Set,visit=id3=>{if(done.has(id3))return;done.add(id3);let entry=entries[id3];for(let dependency of entry.dependsOn??[])visit(dependency);result.push([id3,entry])};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3);return result}function providerSpec(entry){let parsed=parseProviderPackageSpec(entry.source.replace(/^npm:/,""));if(parsed.target!=="latest"&&!(0,import_semver2.validRange)(parsed.target)&&!entry.version)throw new Error("Provider dist-tags require a preset version range");if(parsed.target!=="latest"&&(0,import_semver2.validRange)(parsed.target)&&entry.version&&!(0,import_semver2.intersects)(parsed.target,entry.version))throw new Error("Provider source target conflicts with its preset version range");return`${parsed.packageName}@${parsed.target==="latest"&&entry.version?entry.version:parsed.target}`}function pluginNames(catalog,skill){return Object.entries(catalog?.plugins??{}).filter(([,plugin])=>plugin.skill===skill).map(([name])=>name)}var PresetComponentInstaller=class{store;skills;nodeStatus;listProviders;installProvider;ownerFile;pluginCatalog;constructor(options={}){this.store=options.store??new PresetInstallationStore({directory:capabilityDirectory()}),this.skills=options.skills??new AgentSkillManager,this.nodeStatus=options.nodeStatus??nativeCapabilities.status,this.listProviders=options.listProviders??listInstalledProviders,this.installProvider=options.installProvider??(source=>installProviderPackage(source,{runCommand:runPresetProviderCommand})),this.pluginCatalog=options.pluginCatalog??(()=>nativeCapabilities.require("plugins.catalog")()),this.ownerFile=options.ownerFile??join28(homedir13(),".agents",".mearl-preset-install.json")}async accepted(revision3,verifyResources=!1){if(!/^[a-f0-9]{64}$/.test(revision3))throw new Error("Expected a preset installation revision");let current=await this.store.current({verifyResources}),host=this.nodeStatus();if(!current.receipt||!current.preset||current.receipt.revision!==revision3||host.installationRevision!==revision3||host.revision!==current.receipt.nodeRevision)throw new Error("PRESET_SELECTION_CHANGED");return{receipt:current.receipt,preset:current.preset,rawHash:current.rawHash,hasCatalog:!!current.activation?.bindings["plugins.catalog"]}}catalog(current){if(!current.hasCatalog)return;let value=this.pluginCatalog();if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).length>200)throw new Error("INVALID_PLUGIN_CATALOG");let plugins=[];for(let[name,raw]of Object.entries(value)){if(!raw||typeof raw!="object"||Array.isArray(raw)||Object.keys(raw).some(key=>!["description","skill","setup"].includes(key)))throw new Error("INVALID_PLUGIN_CATALOG");let item=raw;if(typeof item.skill!="string"||!Object.hasOwn(current.preset.skills,item.skill))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let skill=current.preset.skills[item.skill];skill.enabled!==!1&&plugins.push([name,{...item,installArgs:[skill.source,"--skill",item.skill,"--yes"]}])}return validateOfficialPluginCatalog({schemaVersion:1,revision:current.receipt.revision,plugins:Object.fromEntries(plugins),selection:{path:join28(this.store.directory,"active-node.json"),sha256:current.rawHash}})}catalogReady(expected){try{return JSON.stringify(readOfficialPluginCatalog())!==JSON.stringify(expected)?!1:Object.entries(expected.plugins).every(([name,declaration])=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve14(dirname11(dirname11(entry)))===resolve14(homedir13(),".agents","skills",declaration.skill)})}catch{return!1}}providerStatus(id3,entry){try{providerSpec(entry)}catch{return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}}let{packageName,target}=parseProviderPackageSpec(entry.source.replace(/^npm:/,"")),installed=this.listProviders();if(installed.some(provider=>provider.providerId===id3&&provider.packageName!==packageName||provider.packageName===packageName&&provider.providerId!==id3))return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_SOURCE_CONFLICT"};let matching=installed.filter(provider=>provider.providerId===id3&&provider.packageName===packageName);if(matching.length>1)return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_REGISTRATION_AMBIGUOUS"};let manifest=matching[0];return!manifest||!inspectProviderPackage(manifest)?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_INSTALL_REQUIRED"}:target!=="latest"&&!(0,import_semver2.validRange)(target)&&!entry.version?{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}:[entry.version,...target!=="latest"&&(0,import_semver2.validRange)(target)?[target]:[]].filter(range2=>range2!==void 0).some(range2=>!(0,import_semver2.valid)(manifest.version)||!(0,import_semver2.satisfies)(manifest.version,range2))?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_VERSION_REQUIRED"}:{kind:"providers",id:id3,state:"ready"}}skillStatus(manager,id3,entry,catalog){let status=manager.inspectGlobal(entry.source,id3,entry.version,entry.migrateFrom),aliases=pluginNames(catalog,id3);return status.state!=="conflict"&&manager.hasGlobalRegistrationConflict(id3,aliases)?{kind:"skills",id:id3,state:"conflict",reason:"SKILL_PLUGIN_REGISTRATION_CONFLICT"}:{kind:"skills",id:id3,state:status.state==="ready"?"ready":status.state==="conflict"?"conflict":"pending",...status.reason?{reason:status.reason}:{}}}async status(revision3){let current=await this.accepted(revision3),{receipt,preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),components=[...ordered(preset.providers).map(([id3,entry])=>this.providerStatus(id3,entry)),...ordered(preset.skills).map(([id3,entry])=>this.skillStatus(manager,id3,entry,catalog))];return await this.accepted(revision3),{installationRevision:revision3,nodeRevision:receipt.nodeRevision,components,...catalog?{catalogReady:this.catalogReady(catalog)}:{}}}async install(revision3,options={}){let lease=claimPresetInstallation(this.ownerFile);try{return await withOwnedCommands(lease.lifecycle,async()=>{let current=await this.accepted(revision3,!0),{preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),providers=ordered(preset.providers),skills=ordered(preset.skills),expectedPluginNames=Object.create(null);for(let[id3]of skills){let names=pluginNames(catalog,id3);names.length&&(expectedPluginNames[id3]=names)}if(options.replaceSkills!==void 0&&(!Array.isArray(options.replaceSkills)||!options.replaceSkills.length||options.replaceSkills.length>256||new Set(options.replaceSkills).size!==options.replaceSkills.length||options.replaceSkills.some(id3=>typeof id3!="string"||!skills.some(([name])=>name===id3))))throw new Error("INVALID_SKILL_REPLACEMENT_SELECTION");let replaceable=(id3,status)=>(status.reason==="SKILL_SOURCE_CONFLICT"||status.reason==="SKILL_PLUGIN_REGISTRATION_CONFLICT")&&options.replaceSkills?.includes(id3);for(let[id3,entry]of providers)if(providerSpec(entry),this.providerStatus(id3,entry).state==="conflict")throw new Error(`PROVIDER_SOURCE_CONFLICT: ${id3}`);for(let[id3,entry]of skills){let status=this.skillStatus(manager,id3,entry,catalog);if(status.state==="conflict"&&!replaceable(id3,status))throw new Error(`${status.reason}: ${id3}`)}for(let[id3,entry]of providers){await this.accepted(revision3);let status=this.providerStatus(id3,entry);if(status.state==="conflict")throw new Error(`${status.reason}: ${id3}`);if(status.state==="ready")continue;await this.accepted(revision3),await this.installProvider(providerSpec(entry)),await this.accepted(revision3);let installed=this.providerStatus(id3,entry);if(installed.state!=="ready")throw new Error(`${installed.reason}: ${id3}`)}for(let index=0;index<skills.length;){await this.accepted(revision3);let[id3,entry]=skills[index],source=entry.source,first=manager.inspectGlobal(source,id3,entry.version,entry.migrateFrom);if(first.state==="conflict"&&!replaceable(id3,first))throw new Error(`${first.reason}: ${id3}`);if(first.state==="ready"){index++;continue}if(first.state==="registration"){if(await this.accepted(revision3),await manager.repairGlobalRegistration(id3,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,replaceExisting:options.replaceSkills?.includes(id3),expectedPluginNames:expectedPluginNames[id3]}),manager.inspectGlobal(source,id3,entry.version).state!=="ready")throw new Error(`SKILL_PLUGIN_REGISTRATION_REQUIRED: ${id3}`);index++;continue}let group=[[id3,entry]];for(index++;group.length<256&&index<skills.length&&skills[index][1].source===source;){let[nextId,next]=skills[index];if(next.dependsOn?.some(dependency=>group.some(([groupId])=>dependency===groupId)))break;let status=manager.inspectGlobal(source,nextId,next.version,next.migrateFrom);if(status.state!=="missing"&&status.state!=="version"&&status.state!=="migration"&&!replaceable(nextId,status))break;group.push([nextId,next]),index++}await this.accepted(revision3),await manager.installGlobals(source,group.map(([name])=>name),{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,migrateFrom:Object.fromEntries(group.map(([id4,entry2])=>[id4,entry2.migrateFrom??[]])),expectedPluginNames,...options.replaceSkills?.length?{replaceSkills:group.map(([name])=>name).filter(name=>options.replaceSkills.includes(name))}:{}}),await this.accepted(revision3);for(let[id4,entry2]of group){let status=manager.inspectGlobal(source,id4,entry2.version);if(status.state!=="ready")throw new Error(`${status.reason}: ${id4}`)}}return catalog&&(await this.accepted(revision3),replaceOfficialPluginCatalog(catalog.revision,catalog.plugins,catalog.selection)),await this.status(revision3)})}finally{lease.release()}}};init_bundles();init_preset2();var PRESET_INSTALLATION_PROTOCOL=1;function record3(value,fields7){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!fields7.includes(key)))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");return value}function selection(value){return value===null||typeof value=="string"&&/^(?:node:)?[a-f0-9]{64}$/.test(value)}function createInstallationResourceLoader(session,request){return async(source,options)=>{if(!Number.isSafeInteger(options.maxBytes)||options.maxBytes<0||options.maxBytes>MAX_BUNDLE_BYTES)throw new Error("INVALID_PRESET_RESOURCE_LIMIT");options.signal?.throwIfAborted();let first=await request({operation:"resource",session,source,maxBytes:options.maxBytes,offset:0},13e4);if(!first||!Number.isSafeInteger(first.byteLength)||first.byteLength<0||first.byteLength>options.maxBytes||typeof first.sha256!="string")throw new Error("INVALID_PRESET_RESOURCE_RESPONSE");return readPresetTransferResource(first.sha256,first.byteLength,{signal:options.signal,read:offset=>offset===0?Promise.resolve(first):request({operation:"resource",session,source,maxBytes:options.maxBytes,offset},15e3)})}}var NativePresetInstallation=class{constructor(dependencies){this.dependencies=dependencies}dependencies;pending=Promise.resolve();installer(session){return new PresetInstaller({directory:this.dependencies.directory,hosts:()=>[{id:"attached"}],...session?{load:createInstallationResourceLoader(session,this.dependencies.request)}:{},invoke:async(action,data={},options)=>action==="preset_browser_sync"&&session?this.dependencies.request({operation:"sync",session,installationRevision:data.installationRevision},13e4):this.dependencies.invoke(action,data,options)})}async handle(value){let input2=record3(value,["operation","session","source","presetId","expectedRevision","replaceSkills"]);if(input2.replaceSkills!==void 0&&(input2.operation!=="resume"||!Array.isArray(input2.replaceSkills)||!input2.replaceSkills.length||input2.replaceSkills.length>256||input2.replaceSkills.some(id3=>typeof id3!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(id3))||new Set(input2.replaceSkills).size!==input2.replaceSkills.length))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");if(input2.operation==="inspect"){if(Object.keys(input2).length!==1)throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let current=await this.installer().store.current({verifyResources:!1});return{protocol:PRESET_INSTALLATION_PROTOCOL,selection:presetSelectionRevision(current),id:current.preset?.id,source:current.receipt?.snapshot.source,browserRequired:current.receipt?.browserSyncRequired}}if(input2.operation==="status"){if(Object.keys(input2).some(key=>!["operation","source","presetId","expectedRevision"].includes(key))||typeof input2.presetId!="string"||typeof input2.source!="string"||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let installer=this.installer(),current=await installer.store.current({verifyResources:!1});return!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==input2.source||presetSelectionRevision(current)!==input2.expectedRevision?{ready:!1,changed:!0}:installer.status()}if(!["apply","resume","update"].includes(String(input2.operation))||typeof input2.session!="string"||!/^[a-f0-9-]{36}$/.test(input2.session)||typeof input2.source!="string"||typeof input2.presetId!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(input2.presetId)||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let source=new URL(input2.source);if(source.protocol!=="https:"||source.username||source.password||source.hash||source.href!==input2.source)throw new Error("INVALID_PRESET_INSTALLATION_SOURCE");let run=async()=>{let session=input2.session,installer=this.installer(session);if(input2.operation==="resume"){let current=await installer.store.current({verifyResources:!1});if(!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==source.href||current.receipt.revision!==input2.expectedRevision)throw new Error("INSTALLATION_SELECTION_CHANGED");return await this.dependencies.request({operation:"confirm",session},15e3),installer.resume(current.receipt.revision,{replaceSkills:input2.replaceSkills})}return installer.apply(source.href,{skipUnchanged:input2.operation==="update",validatePrepared:input2.operation==="update"?async prepared=>{await this.dependencies.request({operation:"permissions",session,origins:prepared.preset.permissions.origins,browserRevision:prepared.browser.snapshot.revision,browserRequired:presetRequiresBrowser(prepared.preset)},15e3)}:void 0,expectedId:input2.presetId,expectedRevision:input2.expectedRevision,confirm:async()=>{await this.dependencies.request({operation:"confirm",session},15e3)}})},next=this.pending.catch(()=>{}).then(run);return this.pending=next,next}};import{createHash as createHash16,randomUUID as randomUUID20}from"node:crypto";var PluginPageResults=class{values=new Map;prune(){for(let[id3,value]of this.values)Date.now()-value.updatedAt>3e4&&this.values.delete(id3)}wrap(plugin,value){this.prune();let bytes=Buffer.from(JSON.stringify(value??null));if(bytes.length<=192*1024)return{kind:"value",value:value??null};if(bytes.length>24*1024*1024||this.values.size>=8||[...this.values.values()].reduce((sum,value2)=>sum+value2.bytes.length,bytes.length)>32*1024*1024)throw new Error("Plugin page reply exceeds resource limits");let resultId=randomUUID20(),sha2562=createHash16("sha256").update(bytes).digest("hex");return this.values.set(resultId,{plugin,bytes,sha256:sha2562,updatedAt:Date.now()}),{kind:"resource",resultId,bytes:bytes.length,chunks:Math.ceil(bytes.length/(192*1024)),sha256:sha2562}}read(plugin,operation,input2){this.prune();let value=this.values.get(input2.resultId);if(!value||value.plugin!==plugin)throw new Error("Plugin page reply was not found");if(operation==="result_release")return this.values.delete(input2.resultId),{released:!0};let chunks=Math.ceil(value.bytes.length/(192*1024));if(!Number.isSafeInteger(input2.index)||input2.index<0||input2.index>=chunks)throw new Error("Invalid page reply chunk");return value.updatedAt=Date.now(),{resultId:input2.resultId,bytes:value.bytes.length,chunks,sha256:value.sha256,index:input2.index,data:value.bytes.subarray(input2.index*192*1024,(input2.index+1)*192*1024).toString("base64")}}};init_pluginHostConnection();init_pluginTasks2();init_pluginPages2();init_plugin();init_unified();init_dist2();init_unified();init_pluginState2();init_pluginModels2();init_dist2();function getClient(plugin,invoke3,event=!1,interactive=!1,scope="extension"){if(!/^[a-z][a-z0-9_-]*$/.test(plugin))throw new Error("Invalid plugin name");let key=`${scope}:${event?"runtime":interactive?"interactive":"toolbox"}:${plugin}`,client=clients.get(key);if(!client){let connection=new PluginHostConnection({plugin,access:event?"runtime":"toolbox",source:event?"runtime":"toolbox",scopeId:`${process.pid}:${scope}`,invoke:(action,payload,options)=>invoke3()(action,payload,options)});client={connection,models:new PluginModelClient({connection}),state:new PluginStateClient({connection}),pages:new PluginPageClient({},connection)},clients.set(key,client)}return client}var clients=new Map;function callPluginPageService(plugin,input2,invoke3,event=!1,interactive=!1,scope="extension"){let client=getClient(plugin,invoke3,event,interactive,scope);return event?client.connection.request("page.event",{plugin,input:input2,options:{}},4e4):client.pages.call(plugin,input2.operation,input2)}function callPluginStateService(plugin,input2,invoke3){return getClient(plugin,invoke3).state.call(plugin,input2.collection,input2.operation,input2)}async function callPluginModelService(plugin,input2,invoke3,execution={}){let client=getClient(plugin,invoke3);if(execution.signal?.throwIfAborted(),input2.operation==="capabilities")return client.models.capabilities();if(input2.operation==="list")return client.models.list(input2.provider);if(!["start","run"].includes(input2.operation))throw new Error("Invalid model operation");let options=input2.taskOptions??{};if(!options||typeof options!="object"||Array.isArray(options)||Object.keys(options).some(key=>!["cwd","executionTimeoutMs","idempotencyKey"].includes(key)))throw new Error("Invalid toolbox model execution options");let started=await client.models.start(plugin,input2.request,options);if(input2.operation==="start")return started;let cancel=()=>{client.models.tasks.cancel(started.taskId).catch(()=>{})};execution.signal?.addEventListener("abort",cancel,{once:!0});try{return execution.signal?.aborted&&cancel(),await client.models.tasks.wait(started.taskId,{onProgress:execution.onProgress})}finally{execution.signal?.removeEventListener("abort",cancel)}}init_app_profile_catalog();init_plugin2();init_dist2();init_dist2();init_dist2();var enabledDomains=new WeakMap;function ensureCdpDomain(client,domain,params={}){let domains=enabledDomains.get(client);domains||(domains=new Map,enabledDomains.set(client,domains));let existing=domains.get(domain);if(existing)return existing;let enabling=client.sendCommand(`${domain}.enable`,params).then(()=>{}).catch(error=>{throw domains?.get(domain)===enabling&&domains.delete(domain),error});return domains.set(domain,enabling),enabling}var injectedSessions=new WeakMap,indicatorQueues=new WeakMap;function enqueueIndicatorOperation(session,operation){let queued=(indicatorQueues.get(session)??Promise.resolve()).catch(()=>{}).then(operation);return indicatorQueues.set(session,queued),queued.finally(()=>{indicatorQueues.get(session)===queued&&indicatorQueues.delete(session)})}function createFaviconScript(controlSource){let iconDataUrl=createControlledFaviconDataUrl(controlSource);return`(() => {
|
|
1134
1134
|
if (window !== window.top) return;
|
|
1135
1135
|
const ICON = ${JSON.stringify(iconDataUrl)};
|
|
1136
1136
|
const existing = window.__mearlControlledFavicon__;
|