mirror of
https://github.com/bolucat/Archive.git
synced 2026-04-22 16:07:49 +08:00
Update On Thu Jul 11 20:31:01 CEST 2024
This commit is contained in:
@@ -699,3 +699,4 @@ Update On Sun Jul 7 20:30:22 CEST 2024
|
||||
Update On Mon Jul 8 20:31:33 CEST 2024
|
||||
Update On Tue Jul 9 20:32:39 CEST 2024
|
||||
Update On Wed Jul 10 20:35:20 CEST 2024
|
||||
Update On Thu Jul 11 20:30:51 CEST 2024
|
||||
|
||||
Generated
+3
-3
@@ -893,7 +893,7 @@ dependencies = [
|
||||
"num_cpus",
|
||||
"objc",
|
||||
"once_cell",
|
||||
"open 5.2.0",
|
||||
"open 5.3.0",
|
||||
"parking_lot",
|
||||
"percent-encoding",
|
||||
"port_scanner",
|
||||
@@ -3825,9 +3825,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "open"
|
||||
version = "5.2.0"
|
||||
version = "5.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d2c909a3fce3bd80efef4cd1c6c056bd9376a8fe06fcfdbebaf32cb485a7e37"
|
||||
checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3"
|
||||
dependencies = [
|
||||
"is-wsl",
|
||||
"libc",
|
||||
|
||||
@@ -142,8 +142,8 @@ export const clash = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const deleteConnections = async () => {
|
||||
return (await buildRequest())(`/connections`, {
|
||||
const deleteConnections = async (id?: string) => {
|
||||
return (await buildRequest())(`/connections/${id}`, {
|
||||
method: "DELETE",
|
||||
});
|
||||
};
|
||||
|
||||
@@ -16,10 +16,9 @@
|
||||
"@generouted/react-router": "1.19.6",
|
||||
"@juggle/resize-observer": "3.4.0",
|
||||
"@material/material-color-utilities": "0.3.0",
|
||||
"@mui/icons-material": "5.16.0",
|
||||
"@mui/lab": "5.0.0-alpha.171",
|
||||
"@mui/material": "5.16.0",
|
||||
"@mui/x-data-grid": "7.9.0",
|
||||
"@mui/icons-material": "5.16.1",
|
||||
"@mui/lab": "5.0.0-alpha.172",
|
||||
"@mui/material": "5.16.1",
|
||||
"@nyanpasu/interface": "workspace:^",
|
||||
"@nyanpasu/ui": "workspace:^",
|
||||
"@tauri-apps/api": "1.6.0",
|
||||
@@ -30,41 +29,37 @@
|
||||
"framer-motion": "12.0.0-alpha.0",
|
||||
"i18next": "23.11.5",
|
||||
"jotai": "2.9.0",
|
||||
"material-react-table": "2.13.0",
|
||||
"monaco-editor": "0.50.0",
|
||||
"mui-color-input": "3.0.0",
|
||||
"react": "18.3.1",
|
||||
"react-dom": "18.3.1",
|
||||
"react-error-boundary": "4.0.13",
|
||||
"react-fast-marquee": "1.6.5",
|
||||
"react-hook-form": "7.52.1",
|
||||
"react-hook-form-mui": "7.0.1",
|
||||
"react-i18next": "14.1.2",
|
||||
"react-markdown": "9.0.1",
|
||||
"react-router-dom": "6.24.1",
|
||||
"react-transition-group": "4.4.5",
|
||||
"react-virtuoso": "4.7.10",
|
||||
"react-split-grid": "1.0.4",
|
||||
"swr": "2.2.5",
|
||||
"virtua": "0.33.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@emotion/babel-plugin": "11.11.0",
|
||||
"@emotion/react": "11.11.4",
|
||||
"@types/js-cookie": "3.0.6",
|
||||
"@types/react": "18.3.3",
|
||||
"@types/react-dom": "18.3.0",
|
||||
"@types/react-transition-group": "4.4.10",
|
||||
"@typescript-eslint/eslint-plugin": "7.16.0",
|
||||
"@typescript-eslint/parser": "7.16.0",
|
||||
"@vitejs/plugin-react": "4.3.1",
|
||||
"@vitejs/plugin-react-swc": "3.7.0",
|
||||
"clsx": "2.1.1",
|
||||
"react-resizable-panels": "2.0.20",
|
||||
"sass": "1.77.7",
|
||||
"shiki": "1.10.3",
|
||||
"tailwindcss-textshadow": "2.1.3",
|
||||
"vite": "5.3.3",
|
||||
"vite-plugin-monaco-editor": "1.1.3",
|
||||
"vite-plugin-sass-dts": "1.3.22",
|
||||
"vite-plugin-sass-dts": "1.3.24",
|
||||
"vite-plugin-svgr": "4.2.0",
|
||||
"vite-tsconfig-paths": "4.3.2"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
:root {
|
||||
--focus-border: transparent !important;
|
||||
--separator-border: transparent !important;
|
||||
}
|
||||
@@ -1,12 +1,15 @@
|
||||
import getSystem from "@/utils/get-system";
|
||||
import Paper from "@mui/material/Paper";
|
||||
import { appWindow } from "@tauri-apps/api/window";
|
||||
import { ReactNode } from "react";
|
||||
import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
|
||||
import { ReactNode, useEffect } from "react";
|
||||
import { LayoutControl } from "../layout/layout-control";
|
||||
import styles from "./app-container.module.scss";
|
||||
import AppDrawer from "./app-drawer";
|
||||
import { alpha, useTheme } from "@mui/material";
|
||||
import { Allotment } from "allotment";
|
||||
import "allotment/dist/style.css";
|
||||
import "./app-container.scss";
|
||||
import DrawerContent from "./drawer-content";
|
||||
|
||||
const OS = getSystem();
|
||||
|
||||
@@ -24,6 +27,10 @@ export const AppContainer = ({
|
||||
|
||||
const { palette } = useTheme();
|
||||
|
||||
useEffect(() => {
|
||||
console.log(isDrawer);
|
||||
}, [isDrawer]);
|
||||
|
||||
return (
|
||||
<Paper
|
||||
square
|
||||
@@ -38,33 +45,35 @@ export const AppContainer = ({
|
||||
e.preventDefault();
|
||||
}}
|
||||
>
|
||||
<PanelGroup autoSaveId="layout_sidebar" direction="horizontal">
|
||||
<AppDrawer isDrawer={isDrawer} data-windrag />
|
||||
{isDrawer && <AppDrawer data-windrag isDrawer />}
|
||||
|
||||
{!isDrawer && <PanelResizeHandle className={styles["resize-bar"]} />}
|
||||
<Allotment separator proportionalLayout={false}>
|
||||
{!isDrawer && (
|
||||
<Allotment.Pane className="h-full" minSize={96} maxSize={260}>
|
||||
<DrawerContent data-windrag />
|
||||
</Allotment.Pane>
|
||||
)}
|
||||
|
||||
<Panel order={2} minSize={50}>
|
||||
<div className={styles.container}>
|
||||
{OS === "windows" && (
|
||||
<LayoutControl className="fixed right-6 top-1.5 !z-top" />
|
||||
)}
|
||||
|
||||
{OS === "macos" && (
|
||||
<div
|
||||
className="fixed z-top left-6 top-3 h-8 w-[4.5rem] rounded-full"
|
||||
style={{ backgroundColor: alpha(palette.primary.main, 0.1) }}
|
||||
/>
|
||||
)}
|
||||
<Allotment.Pane visible={true} className={styles.container}>
|
||||
{OS === "windows" && (
|
||||
<LayoutControl className="fixed right-6 top-1.5 !z-top" />
|
||||
)}
|
||||
|
||||
{OS === "macos" && (
|
||||
<div
|
||||
className={OS === "macos" ? "h-[2.75rem]" : "h-9"}
|
||||
data-windrag
|
||||
className="fixed z-top left-6 top-3 h-8 w-[4.5rem] rounded-full"
|
||||
style={{ backgroundColor: alpha(palette.primary.main, 0.1) }}
|
||||
/>
|
||||
)}
|
||||
|
||||
{children}
|
||||
</div>
|
||||
</Panel>
|
||||
</PanelGroup>
|
||||
<div
|
||||
className={OS === "macos" ? "h-[2.75rem]" : "h-9"}
|
||||
data-windrag
|
||||
/>
|
||||
|
||||
{children}
|
||||
</Allotment.Pane>
|
||||
</Allotment>
|
||||
</Paper>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,99 +1,17 @@
|
||||
import { getRoutesWithIcon } from "@/utils/routes-utils";
|
||||
import { MenuOpen } from "@mui/icons-material";
|
||||
import { Backdrop, IconButton, alpha, useTheme } from "@mui/material";
|
||||
import clsx from "clsx";
|
||||
import { AnimatePresence, motion } from "framer-motion";
|
||||
import { useCallback, useState } from "react";
|
||||
import { Panel } from "react-resizable-panels";
|
||||
import { useState } from "react";
|
||||
import AnimatedLogo from "../layout/animated-logo";
|
||||
import RouteListItem from "./modules/route-list-item";
|
||||
import { classNames } from "@/utils";
|
||||
import getSystem from "@/utils/get-system";
|
||||
import { useNyanpasu } from "@nyanpasu/interface";
|
||||
import { languageQuirks } from "@/utils/language";
|
||||
import DrawerContent from "./drawer-content";
|
||||
|
||||
export const AppDrawer = ({ isDrawer }: { isDrawer?: boolean }) => {
|
||||
export const AppDrawer = () => {
|
||||
const { palette } = useTheme();
|
||||
|
||||
const routes = getRoutesWithIcon();
|
||||
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const { nyanpasuConfig } = useNyanpasu();
|
||||
|
||||
const [onlyIcon, setOnlyIcon] = useState(false);
|
||||
|
||||
const handleResize = useCallback(
|
||||
(value?: number) => {
|
||||
if (value) {
|
||||
if (
|
||||
value <
|
||||
languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth
|
||||
) {
|
||||
setOnlyIcon(true);
|
||||
} else {
|
||||
setOnlyIcon(false);
|
||||
}
|
||||
} else {
|
||||
setOnlyIcon(false);
|
||||
}
|
||||
},
|
||||
[nyanpasuConfig?.language],
|
||||
);
|
||||
|
||||
const Content = ({ className }: { className?: string }) => {
|
||||
return (
|
||||
<div
|
||||
className={clsx(
|
||||
isDrawer ? ["max-w-60", "min-w-28"] : "w-full",
|
||||
"p-4",
|
||||
getSystem() === "macos" ? "pt-14" : "pt-8",
|
||||
"h-full",
|
||||
"flex",
|
||||
"flex-col",
|
||||
"gap-4",
|
||||
className,
|
||||
)}
|
||||
style={{
|
||||
backgroundColor: "var(--background-color-alpha)",
|
||||
}}
|
||||
data-windrag
|
||||
>
|
||||
<div className="flex items-center justify-center gap-4 mx-2">
|
||||
<div className=" h-full max-w-28 max-h-28" data-windrag>
|
||||
<AnimatedLogo className="w-full h-full" data-windrag />
|
||||
</div>
|
||||
|
||||
{(isDrawer || !onlyIcon) && (
|
||||
<div
|
||||
className={classNames(
|
||||
"text-lg font-bold mt-1 whitespace-pre-wrap",
|
||||
isDrawer && "mr-1",
|
||||
)}
|
||||
data-windrag
|
||||
>
|
||||
{"Clash\nNyanpasu"}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-2 overflow-y-auto scrollbar-hidden !overflow-x-hidden">
|
||||
{Object.entries(routes).map(([name, { path, icon }]) => {
|
||||
return (
|
||||
<RouteListItem
|
||||
key={name}
|
||||
name={name}
|
||||
path={path}
|
||||
icon={icon}
|
||||
onlyIcon={!isDrawer && onlyIcon}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const DrawerTitle = () => {
|
||||
return (
|
||||
<div
|
||||
@@ -125,7 +43,7 @@ export const AppDrawer = ({ isDrawer }: { isDrawer?: boolean }) => {
|
||||
);
|
||||
};
|
||||
|
||||
return isDrawer ? (
|
||||
return (
|
||||
<>
|
||||
<DrawerTitle />
|
||||
|
||||
@@ -154,27 +72,12 @@ export const AppDrawer = ({ isDrawer }: { isDrawer?: boolean }) => {
|
||||
type: "tween",
|
||||
}}
|
||||
>
|
||||
<Content />
|
||||
<DrawerContent isDrawer className="max-w-64" />
|
||||
</motion.div>
|
||||
</div>
|
||||
</AnimatePresence>
|
||||
</Backdrop>
|
||||
</>
|
||||
) : (
|
||||
<Panel
|
||||
id="sidebar"
|
||||
defaultSize={
|
||||
languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth
|
||||
}
|
||||
order={1}
|
||||
minSize={languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth}
|
||||
collapsedSize={11}
|
||||
maxSize={36}
|
||||
onResize={handleResize}
|
||||
collapsible
|
||||
>
|
||||
<Content />
|
||||
</Panel>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
import getSystem from "@/utils/get-system";
|
||||
import clsx from "clsx";
|
||||
import AnimatedLogo from "../layout/animated-logo";
|
||||
import { getRoutesWithIcon } from "@/utils/routes-utils";
|
||||
import RouteListItem from "./modules/route-list-item";
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import { useSize } from "ahooks";
|
||||
import { languageQuirks } from "@/utils/language";
|
||||
import { useNyanpasu } from "@nyanpasu/interface";
|
||||
|
||||
export const DrawerContent = ({ className }: { className?: string }) => {
|
||||
const [onlyIcon, setOnlyIcon] = useState(false);
|
||||
|
||||
const { nyanpasuConfig } = useNyanpasu();
|
||||
|
||||
const routes = getRoutesWithIcon();
|
||||
|
||||
const contentRef = useRef<HTMLDivElement | null>(null);
|
||||
|
||||
const size = useSize(contentRef.current);
|
||||
|
||||
const handleResize = useCallback(
|
||||
(value?: number) => {
|
||||
if (value) {
|
||||
if (
|
||||
value <
|
||||
languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth
|
||||
) {
|
||||
setOnlyIcon(true);
|
||||
} else {
|
||||
setOnlyIcon(false);
|
||||
}
|
||||
} else {
|
||||
setOnlyIcon(false);
|
||||
}
|
||||
},
|
||||
[nyanpasuConfig?.language],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
handleResize(size?.width);
|
||||
}, [size?.width]);
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={contentRef}
|
||||
className={clsx(
|
||||
"p-4",
|
||||
getSystem() === "macos" ? "pt-14" : "pt-8",
|
||||
"w-full",
|
||||
"h-full",
|
||||
"flex",
|
||||
"flex-col",
|
||||
"gap-4",
|
||||
className,
|
||||
)}
|
||||
style={{
|
||||
backgroundColor: "var(--background-color-alpha)",
|
||||
}}
|
||||
data-windrag
|
||||
>
|
||||
<div className="flex items-center justify-center gap-4 mx-2">
|
||||
<div className=" h-full max-w-28 max-h-28" data-windrag>
|
||||
<AnimatedLogo className="w-full h-full" data-windrag />
|
||||
</div>
|
||||
|
||||
{!onlyIcon && (
|
||||
<div
|
||||
className="text-lg font-bold mt-1 mr-1 whitespace-pre-wrap"
|
||||
data-windrag
|
||||
>
|
||||
{"Clash\nNyanpasu"}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-2 overflow-y-auto scrollbar-hidden !overflow-x-hidden">
|
||||
{Object.entries(routes).map(([name, { path, icon }]) => {
|
||||
return (
|
||||
<RouteListItem
|
||||
key={name}
|
||||
name={name}
|
||||
path={path}
|
||||
icon={icon}
|
||||
onlyIcon={onlyIcon}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DrawerContent;
|
||||
+122
-86
@@ -1,24 +1,37 @@
|
||||
import parseTraffic from "@/utils/parse-traffic";
|
||||
import { GridColDef, DataGrid } from "@mui/x-data-grid";
|
||||
import { useClashWS, Connection } from "@nyanpasu/interface";
|
||||
import {
|
||||
MaterialReactTable,
|
||||
useMaterialReactTable,
|
||||
type MRT_ColumnDef,
|
||||
} from "material-react-table";
|
||||
import { useClashWS, Connection, useClash } from "@nyanpasu/interface";
|
||||
import dayjs from "dayjs";
|
||||
import { useRef, useMemo } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import HeaderSearch from "./header-search";
|
||||
import { useLockFn } from "ahooks";
|
||||
import Cancel from "@mui/icons-material/Cancel";
|
||||
import { IconButton } from "@mui/material";
|
||||
import { containsSearchTerm } from "@/utils";
|
||||
import ContentDisplay from "../base/content-display";
|
||||
|
||||
export type TableConnection = Connection.Item &
|
||||
Connection.Metadata & {
|
||||
downloadSpeed?: number;
|
||||
uploadSpeed?: number;
|
||||
};
|
||||
export type TableConnection = Connection.Item & {
|
||||
downloadSpeed?: number;
|
||||
uploadSpeed?: number;
|
||||
};
|
||||
|
||||
export interface TableMessage extends Omit<Connection.Response, "connections"> {
|
||||
connections: TableConnection[];
|
||||
}
|
||||
|
||||
export const ConnectionsTable = () => {
|
||||
export const ConnectionsTable = ({ searchTerm }: { searchTerm?: string }) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { deleteConnections } = useClash();
|
||||
|
||||
const closeConnect = useLockFn(async (id?: string) => {
|
||||
await deleteConnections(id);
|
||||
});
|
||||
|
||||
const {
|
||||
connections: { latestMessage },
|
||||
} = useClashWS();
|
||||
@@ -32,7 +45,13 @@ export const ConnectionsTable = () => {
|
||||
|
||||
const updatedConnections: TableConnection[] = [];
|
||||
|
||||
result.connections?.forEach((connection) => {
|
||||
const filteredConnections = searchTerm
|
||||
? result.connections?.filter((connection) =>
|
||||
containsSearchTerm(connection, searchTerm),
|
||||
)
|
||||
: result.connections;
|
||||
|
||||
filteredConnections?.forEach((connection) => {
|
||||
const previousConnection = historyMessage.current?.connections.find(
|
||||
(history) => history.id === connection.id,
|
||||
);
|
||||
@@ -45,14 +64,8 @@ export const ConnectionsTable = () => {
|
||||
? connection.upload - previousConnection.upload
|
||||
: 0;
|
||||
|
||||
const host = String(
|
||||
connection.metadata.host || connection.metadata.destinationIP,
|
||||
);
|
||||
|
||||
updatedConnections.push({
|
||||
...connection,
|
||||
...connection.metadata,
|
||||
host,
|
||||
downloadSpeed,
|
||||
uploadSpeed,
|
||||
});
|
||||
@@ -63,103 +76,126 @@ export const ConnectionsTable = () => {
|
||||
historyMessage.current = data;
|
||||
|
||||
return data;
|
||||
}, [latestMessage?.data]);
|
||||
}, [latestMessage?.data, searchTerm]);
|
||||
|
||||
const columns: GridColDef[] = [
|
||||
const columns: MRT_ColumnDef<TableConnection>[] = [
|
||||
{
|
||||
field: "host",
|
||||
headerName: t("Host"),
|
||||
flex: 240,
|
||||
minWidth: 240,
|
||||
header: t("Actions"),
|
||||
size: 80,
|
||||
enableSorting: false,
|
||||
enableGlobalFilter: false,
|
||||
accessorFn: ({ id }) => (
|
||||
<div className="w-full flex justify-center">
|
||||
<IconButton
|
||||
color="primary"
|
||||
className="size-5"
|
||||
onClick={closeConnect(id)}
|
||||
>
|
||||
<Cancel />
|
||||
</IconButton>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
field: "process",
|
||||
headerName: t("Process"),
|
||||
flex: 100,
|
||||
minWidth: 100,
|
||||
header: t("Host"),
|
||||
size: 240,
|
||||
accessorFn: ({ metadata }) => metadata.host || metadata.destinationIP,
|
||||
},
|
||||
{
|
||||
field: "download",
|
||||
headerName: t("Download"),
|
||||
width: 88,
|
||||
valueFormatter: (value) => parseTraffic(value).join(" "),
|
||||
header: t("Process"),
|
||||
size: 140,
|
||||
accessorFn: ({ metadata }) => metadata.process,
|
||||
},
|
||||
{
|
||||
field: "upload",
|
||||
headerName: t("Upload"),
|
||||
width: 88,
|
||||
valueFormatter: (value) => parseTraffic(value).join(" "),
|
||||
header: t("Download"),
|
||||
size: 88,
|
||||
accessorFn: ({ download }) => parseTraffic(download).join(" "),
|
||||
},
|
||||
{
|
||||
field: "downloadSpeed",
|
||||
headerName: t("DL Speed"),
|
||||
width: 88,
|
||||
valueFormatter: (value) => parseTraffic(value).join(" ") + "/s",
|
||||
header: t("Upload"),
|
||||
size: 88,
|
||||
accessorFn: ({ upload }) => parseTraffic(upload).join(" "),
|
||||
},
|
||||
{
|
||||
field: "uploadSpeed",
|
||||
headerName: t("UL Speed"),
|
||||
width: 88,
|
||||
valueFormatter: (value) => parseTraffic(value).join(" ") + "/s",
|
||||
header: t("DL Speed"),
|
||||
size: 88,
|
||||
accessorFn: ({ downloadSpeed }) =>
|
||||
parseTraffic(downloadSpeed).join(" ") + "/s",
|
||||
},
|
||||
{
|
||||
field: "chains",
|
||||
headerName: t("Chains"),
|
||||
flex: 360,
|
||||
minWidth: 360,
|
||||
valueFormatter: (value) => [...value].reverse().join(" / "),
|
||||
header: t("UL Speed"),
|
||||
size: 88,
|
||||
accessorFn: ({ uploadSpeed }) =>
|
||||
parseTraffic(uploadSpeed).join(" ") + "/s",
|
||||
},
|
||||
{
|
||||
field: "rule",
|
||||
headerName: "Rule",
|
||||
flex: 300,
|
||||
minWidth: 250,
|
||||
header: t("Chains"),
|
||||
size: 360,
|
||||
accessorFn: ({ chains }) => [...chains].reverse().join(" / "),
|
||||
},
|
||||
{
|
||||
field: "start",
|
||||
headerName: t("Time"),
|
||||
flex: 120,
|
||||
minWidth: 100,
|
||||
valueFormatter: (value) => dayjs(value).fromNow(),
|
||||
header: "Rule",
|
||||
size: 200,
|
||||
accessorFn: ({ rule, rulePayload }) =>
|
||||
rulePayload ? `${rule} (${rulePayload})` : rule,
|
||||
},
|
||||
{
|
||||
field: "source",
|
||||
headerName: "Source",
|
||||
flex: 200,
|
||||
minWidth: 130,
|
||||
header: t("Time"),
|
||||
size: 120,
|
||||
accessorFn: ({ start }) => dayjs(start).fromNow(),
|
||||
},
|
||||
{
|
||||
field: "destinationIP",
|
||||
headerName: t("Destination IP"),
|
||||
flex: 200,
|
||||
minWidth: 130,
|
||||
header: "Source",
|
||||
size: 200,
|
||||
accessorFn: ({ metadata: { sourceIP, sourcePort } }) =>
|
||||
`${sourceIP}:${sourcePort}`,
|
||||
},
|
||||
{
|
||||
field: "type",
|
||||
headerName: t("Type"),
|
||||
flex: 160,
|
||||
minWidth: 100,
|
||||
header: t("Destination"),
|
||||
size: 200,
|
||||
accessorFn: ({ metadata: { destinationIP, destinationPort } }) =>
|
||||
`${destinationIP}:${destinationPort}`,
|
||||
},
|
||||
{
|
||||
accessorKey: "type",
|
||||
header: t("Type"),
|
||||
size: 160,
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
connectionsMessage?.connections && (
|
||||
<DataGrid
|
||||
rows={connectionsMessage.connections}
|
||||
columns={columns}
|
||||
density="compact"
|
||||
autosizeOnMount
|
||||
hideFooter
|
||||
disableColumnFilter
|
||||
disableColumnSelector
|
||||
disableDensitySelector
|
||||
sx={{ border: "none", "div:focus": { outline: "none !important" } }}
|
||||
className="!absolute !h-full !w-full"
|
||||
slots={{
|
||||
toolbar: HeaderSearch,
|
||||
}}
|
||||
/>
|
||||
)
|
||||
const table = useMaterialReactTable({
|
||||
columns,
|
||||
data: connectionsMessage?.connections ?? [],
|
||||
initialState: {
|
||||
density: "compact",
|
||||
},
|
||||
defaultDisplayColumn: {
|
||||
enableResizing: true,
|
||||
},
|
||||
enableTopToolbar: false,
|
||||
enableColumnActions: false,
|
||||
enablePagination: false,
|
||||
enableBottomToolbar: false,
|
||||
enableColumnResizing: true,
|
||||
enableGlobalFilterModes: true,
|
||||
enableColumnPinning: true,
|
||||
muiTableContainerProps: {
|
||||
sx: { minHeight: "100%" },
|
||||
className: "!absolute !h-full !w-full",
|
||||
},
|
||||
enableRowVirtualization: true,
|
||||
enableColumnVirtualization: true,
|
||||
rowVirtualizerOptions: { overscan: 5 },
|
||||
columnVirtualizerOptions: { overscan: 2 },
|
||||
});
|
||||
|
||||
return connectionsMessage?.connections.length ? (
|
||||
<MaterialReactTable table={table} />
|
||||
) : (
|
||||
<ContentDisplay
|
||||
className="!absolute !h-full !w-full"
|
||||
message="No Connection"
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
import { FilledInputProps, Portal, alpha, useTheme } from "@mui/material";
|
||||
import { GridToolbarQuickFilter } from "@mui/x-data-grid";
|
||||
import { Fragment } from "react";
|
||||
import {
|
||||
FilledInputProps,
|
||||
TextField,
|
||||
TextFieldProps,
|
||||
alpha,
|
||||
useTheme,
|
||||
} from "@mui/material";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export const HeaderSearch = () => {
|
||||
export const HeaderSearch = (props: TextFieldProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { palette } = useTheme();
|
||||
@@ -24,20 +28,17 @@ export const HeaderSearch = () => {
|
||||
};
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<Portal container={() => document.getElementById("filter-panel")}>
|
||||
<GridToolbarQuickFilter
|
||||
autoComplete="off"
|
||||
spellCheck="false"
|
||||
hiddenLabel
|
||||
placeholder={t("Type to Filter")}
|
||||
variant="filled"
|
||||
className="!pb-0"
|
||||
sx={{ input: { py: 1, fontSize: 14 } }}
|
||||
InputProps={inputProps}
|
||||
/>
|
||||
</Portal>
|
||||
</Fragment>
|
||||
<TextField
|
||||
autoComplete="off"
|
||||
spellCheck="false"
|
||||
hiddenLabel
|
||||
placeholder={t("Type to Filter")}
|
||||
variant="filled"
|
||||
className="!pb-0"
|
||||
sx={{ input: { py: 1, fontSize: 14 } }}
|
||||
InputProps={inputProps}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
import useSWR, { mutate } from "swr";
|
||||
import { useLockFn } from "ahooks";
|
||||
import {
|
||||
getAxios,
|
||||
getClashConfig,
|
||||
getVersion,
|
||||
updateConfigs,
|
||||
} from "@/services/api";
|
||||
import { getClashInfo, patchClashConfig } from "@/services/cmds";
|
||||
|
||||
export const useClash = () => {
|
||||
const { data: clash, mutate: mutateClash } = useSWR(
|
||||
"getClashConfig",
|
||||
getClashConfig,
|
||||
);
|
||||
|
||||
const { data: versionData, mutate: mutateVersion } = useSWR(
|
||||
"getVersion",
|
||||
getVersion,
|
||||
);
|
||||
|
||||
const patchClash = useLockFn(async (patch: Partial<IConfigData>) => {
|
||||
await updateConfigs(patch);
|
||||
await patchClashConfig(patch);
|
||||
mutateClash();
|
||||
});
|
||||
|
||||
const version = versionData?.premium
|
||||
? `${versionData.version} Premium`
|
||||
: versionData?.meta
|
||||
? `${versionData.version} Meta`
|
||||
: versionData?.version || "-";
|
||||
|
||||
return {
|
||||
clash,
|
||||
version,
|
||||
mutateClash,
|
||||
mutateVersion,
|
||||
patchClash,
|
||||
};
|
||||
};
|
||||
|
||||
export const useClashInfo = () => {
|
||||
const { data: clashInfo, mutate: mutateInfo } = useSWR(
|
||||
"getClashInfo",
|
||||
getClashInfo,
|
||||
);
|
||||
|
||||
const patchInfo = async (
|
||||
patch: Partial<
|
||||
Pick<IConfigData, "mixed-port" | "external-controller" | "secret">
|
||||
>,
|
||||
) => {
|
||||
const hasInfo =
|
||||
patch["mixed-port"] != null ||
|
||||
patch["external-controller"] != null ||
|
||||
patch.secret != null;
|
||||
|
||||
if (!hasInfo) return;
|
||||
|
||||
if (patch["mixed-port"]) {
|
||||
const port = patch["mixed-port"];
|
||||
if (port < 1000) {
|
||||
throw new Error("The port should not < 1000");
|
||||
}
|
||||
if (port > 65536) {
|
||||
throw new Error("The port should not > 65536");
|
||||
}
|
||||
}
|
||||
|
||||
await patchClashConfig(patch);
|
||||
mutateInfo();
|
||||
mutate("getClashConfig");
|
||||
// 刷新接口
|
||||
getAxios(true);
|
||||
};
|
||||
|
||||
return {
|
||||
clashInfo,
|
||||
mutateInfo,
|
||||
patchInfo,
|
||||
};
|
||||
};
|
||||
@@ -1,20 +0,0 @@
|
||||
import useSWR from "swr";
|
||||
import { getVergeConfig, patchVergeConfig } from "@/services/cmds";
|
||||
|
||||
export const useVerge = () => {
|
||||
const { data: verge, mutate: mutateVerge } = useSWR(
|
||||
"getVergeConfig",
|
||||
getVergeConfig,
|
||||
);
|
||||
|
||||
const patchVerge = async (value: Partial<IVergeConfig>) => {
|
||||
await patchVergeConfig(value);
|
||||
mutateVerge();
|
||||
};
|
||||
|
||||
return {
|
||||
verge,
|
||||
mutateVerge,
|
||||
patchVerge,
|
||||
};
|
||||
};
|
||||
@@ -1,66 +0,0 @@
|
||||
import { useRef, useEffect } from "react";
|
||||
|
||||
export type WsMsgFn = (event: MessageEvent<any>) => void;
|
||||
|
||||
export interface WsOptions {
|
||||
errorCount?: number; // default is 5
|
||||
retryInterval?: number; // default is 2500
|
||||
onError?: () => void;
|
||||
}
|
||||
|
||||
export const useWebsocket = (onMessage: WsMsgFn, options?: WsOptions) => {
|
||||
const wsRef = useRef<WebSocket | null>(null);
|
||||
const timerRef = useRef<number | null>(null);
|
||||
|
||||
const disconnect = () => {
|
||||
if (wsRef.current) {
|
||||
wsRef.current.close();
|
||||
wsRef.current = null;
|
||||
}
|
||||
if (timerRef.current) {
|
||||
clearTimeout(timerRef.current);
|
||||
}
|
||||
};
|
||||
|
||||
const connect = (url: string) => {
|
||||
let errorCount = options?.errorCount ?? 5;
|
||||
const retryInterval = options?.retryInterval ?? 2500;
|
||||
|
||||
if (!url) return;
|
||||
|
||||
const connectHelper = () => {
|
||||
disconnect();
|
||||
|
||||
const ws = new WebSocket(url);
|
||||
wsRef.current = ws;
|
||||
|
||||
ws.addEventListener("message", onMessage);
|
||||
ws.addEventListener("error", () => {
|
||||
errorCount -= 1;
|
||||
|
||||
if (errorCount >= 0) {
|
||||
timerRef.current = window.setTimeout(connectHelper, retryInterval);
|
||||
} else {
|
||||
disconnect();
|
||||
options?.onError?.();
|
||||
}
|
||||
});
|
||||
|
||||
ws.addEventListener("close", () => {
|
||||
// WebSocket connection closed, attempt to reconnect
|
||||
timerRef.current = window.setTimeout(connectHelper, retryInterval);
|
||||
});
|
||||
};
|
||||
|
||||
connectHelper();
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
// Cleanup on component unmount
|
||||
return () => {
|
||||
disconnect();
|
||||
};
|
||||
}, []);
|
||||
|
||||
return { connect, disconnect };
|
||||
};
|
||||
@@ -1,22 +1,32 @@
|
||||
import CloseConnectionsButton from "@/components/connections/close-connections-button";
|
||||
import ConnectionsTable from "@/components/connections/connections-table";
|
||||
import HeaderSearch from "@/components/connections/header-search";
|
||||
import { BasePage } from "@nyanpasu/ui";
|
||||
import { useThrottle } from "ahooks";
|
||||
import { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export const Connections = () => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const [searchTerm, setSearchTerm] = useState<string>();
|
||||
|
||||
const throttledSearchTerm = useThrottle(searchTerm, { wait: 150 });
|
||||
|
||||
return (
|
||||
<BasePage
|
||||
title={t("Connections")}
|
||||
full
|
||||
header={
|
||||
<div className=" max-h-96">
|
||||
<div id="filter-panel" />
|
||||
<div className="max-h-96">
|
||||
<HeaderSearch
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<ConnectionsTable />
|
||||
<ConnectionsTable searchTerm={throttledSearchTerm} />
|
||||
|
||||
<CloseConnectionsButton />
|
||||
</BasePage>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { includes, isArray, isObject, isString, some } from "lodash-es";
|
||||
|
||||
/**
|
||||
* classNames filter out falsy values and join the rest with a space
|
||||
* @param classes - array of classes
|
||||
@@ -11,3 +13,17 @@ export function classNames(...classes: any[]) {
|
||||
export async function sleep(ms: number) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
export const containsSearchTerm = (obj: any, term: string): boolean => {
|
||||
if (!obj || !term) return false;
|
||||
|
||||
if (isString(obj)) {
|
||||
return includes(obj.toLowerCase(), term.toLowerCase());
|
||||
}
|
||||
|
||||
if (isObject(obj) || isArray(obj)) {
|
||||
return some(obj, (value: any) => containsSearchTerm(value, term));
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -14,18 +14,18 @@ export const languageQuirks: {
|
||||
} = {
|
||||
zh: {
|
||||
drawer: {
|
||||
minWidth: 22,
|
||||
minWidth: 180,
|
||||
itemClassNames: "text-center",
|
||||
},
|
||||
},
|
||||
en: {
|
||||
drawer: {
|
||||
minWidth: 26,
|
||||
minWidth: 240,
|
||||
},
|
||||
},
|
||||
ru: {
|
||||
drawer: {
|
||||
minWidth: 26,
|
||||
minWidth: 240,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import { FC, ReactNode, memo } from "react";
|
||||
|
||||
export const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
|
||||
function Header({
|
||||
title,
|
||||
header,
|
||||
}: {
|
||||
title?: ReactNode;
|
||||
header?: ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<header className="pl-2 select-none" data-windrag>
|
||||
<h1 className="mb-1 text-4xl font-medium" data-windrag>
|
||||
{title}
|
||||
</h1>
|
||||
|
||||
{header}
|
||||
</header>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
export default Header;
|
||||
@@ -1,7 +1,7 @@
|
||||
import { ReactNode, FC, CSSProperties, memo, useRef, useEffect } from "react";
|
||||
import Typography from "@mui/material/Typography";
|
||||
import { ReactNode, FC, CSSProperties, useRef, useEffect } from "react";
|
||||
import { BaseErrorBoundary } from "./baseErrorBoundary";
|
||||
import "./style.scss";
|
||||
import Header from "./header";
|
||||
|
||||
interface Props {
|
||||
title?: ReactNode;
|
||||
@@ -12,26 +12,6 @@ interface Props {
|
||||
children?: ReactNode;
|
||||
}
|
||||
|
||||
const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
|
||||
function Header({
|
||||
title,
|
||||
header,
|
||||
}: {
|
||||
title?: ReactNode;
|
||||
header?: ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<header style={{ userSelect: "none" }} data-windrag>
|
||||
<Typography variant="h4" component="h1" fontWeight={500} data-windrag>
|
||||
{title}
|
||||
</Typography>
|
||||
|
||||
{header}
|
||||
</header>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
export const BasePage: FC<Props> = ({
|
||||
title,
|
||||
header,
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
}
|
||||
|
||||
&.no-padding {
|
||||
scrollbar-gutter: unset;
|
||||
|
||||
.MDYBasePage-content {
|
||||
overflow: visible;
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { ReactNode, FC, memo } from "react";
|
||||
import { ReactNode, FC } from "react";
|
||||
import Divider from "@mui/material/Divider";
|
||||
import Toolbar from "@mui/material/Toolbar";
|
||||
import Typography from "@mui/material/Typography";
|
||||
import { BaseErrorBoundary } from "../basePage/baseErrorBoundary";
|
||||
import style from "./style.module.scss";
|
||||
import { motion } from "framer-motion";
|
||||
import Header from "../basePage/header";
|
||||
|
||||
interface Props {
|
||||
title?: ReactNode;
|
||||
@@ -18,26 +18,6 @@ interface Props {
|
||||
flexReverse?: boolean;
|
||||
}
|
||||
|
||||
const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
|
||||
function Header({
|
||||
title,
|
||||
header,
|
||||
}: {
|
||||
title?: ReactNode;
|
||||
header?: ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<header style={{ userSelect: "none" }} data-windrag>
|
||||
<Typography variant="h4" component="h1" fontWeight={500} data-windrag>
|
||||
{title}
|
||||
</Typography>
|
||||
|
||||
{header}
|
||||
</header>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
export const SidePage: FC<Props> = ({
|
||||
title,
|
||||
header,
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
"module": "index.ts",
|
||||
"dependencies": {
|
||||
"@material/material-color-utilities": "0.3.0",
|
||||
"@mui/icons-material": "5.16.0",
|
||||
"@mui/lab": "5.0.0-alpha.171",
|
||||
"@mui/material": "5.16.0",
|
||||
"@mui/icons-material": "5.16.1",
|
||||
"@mui/lab": "5.0.0-alpha.172",
|
||||
"@mui/material": "5.16.1",
|
||||
"@radix-ui/react-dialog": "1.1.1",
|
||||
"@tauri-apps/api": "1.6.0",
|
||||
"@types/d3": "7.4.3",
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
"stylelint-config-standard": "36.0.1",
|
||||
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
|
||||
"stylelint-order": "6.0.4",
|
||||
"stylelint-scss": "6.4.0",
|
||||
"stylelint-scss": "6.4.1",
|
||||
"tailwindcss": "3.4.4",
|
||||
"tsx": "4.16.2",
|
||||
"typescript": "5.5.3"
|
||||
|
||||
Generated
+304
-130
@@ -128,8 +128,8 @@ importers:
|
||||
specifier: 6.0.4
|
||||
version: 6.0.4(stylelint@16.6.1(typescript@5.5.3))
|
||||
stylelint-scss:
|
||||
specifier: 6.4.0
|
||||
version: 6.4.0(stylelint@16.6.1(typescript@5.5.3))
|
||||
specifier: 6.4.1
|
||||
version: 6.4.1(stylelint@16.6.1(typescript@5.5.3))
|
||||
tailwindcss:
|
||||
specifier: 3.4.4
|
||||
version: 3.4.4
|
||||
@@ -186,17 +186,14 @@ importers:
|
||||
specifier: 0.3.0
|
||||
version: 0.3.0
|
||||
'@mui/icons-material':
|
||||
specifier: 5.16.0
|
||||
version: 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
specifier: 5.16.1
|
||||
version: 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/lab':
|
||||
specifier: 5.0.0-alpha.171
|
||||
version: 5.0.0-alpha.171(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
specifier: 5.0.0-alpha.172
|
||||
version: 5.0.0-alpha.172(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material':
|
||||
specifier: 5.16.0
|
||||
version: 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/x-data-grid':
|
||||
specifier: 7.9.0
|
||||
version: 7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
specifier: 5.16.1
|
||||
version: 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@nyanpasu/interface':
|
||||
specifier: workspace:^
|
||||
version: link:../interface
|
||||
@@ -227,12 +224,15 @@ importers:
|
||||
jotai:
|
||||
specifier: 2.9.0
|
||||
version: 2.9.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
material-react-table:
|
||||
specifier: 2.13.0
|
||||
version: 2.13.0(anywsq46gdagafemjlmocwrkqu)
|
||||
monaco-editor:
|
||||
specifier: 0.50.0
|
||||
version: 0.50.0
|
||||
mui-color-input:
|
||||
specifier: 3.0.0
|
||||
version: 3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
version: 3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
react:
|
||||
specifier: npm:react@rc
|
||||
version: 19.0.0-rc-df783f9ea1-20240708
|
||||
@@ -245,12 +245,9 @@ importers:
|
||||
react-fast-marquee:
|
||||
specifier: 1.6.5
|
||||
version: 1.6.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
react-hook-form:
|
||||
specifier: 7.52.1
|
||||
version: 7.52.1(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
react-hook-form-mui:
|
||||
specifier: 7.0.1
|
||||
version: 7.0.1(addvybcbawtwkjqnoojx6y4g5m)
|
||||
version: 7.0.1(7cllkcphevtaad3vgre6vmruby)
|
||||
react-i18next:
|
||||
specifier: 14.1.2
|
||||
version: 14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
@@ -260,12 +257,9 @@ importers:
|
||||
react-router-dom:
|
||||
specifier: 6.24.1
|
||||
version: 6.24.1(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
react-transition-group:
|
||||
specifier: 4.4.5
|
||||
version: 4.4.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
react-virtuoso:
|
||||
specifier: 4.7.10
|
||||
version: 4.7.10(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
react-split-grid:
|
||||
specifier: 1.0.4
|
||||
version: 1.0.4(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
swr:
|
||||
specifier: 2.2.5
|
||||
version: 2.2.5(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
@@ -279,18 +273,12 @@ importers:
|
||||
'@emotion/react':
|
||||
specifier: 11.11.4
|
||||
version: 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/js-cookie':
|
||||
specifier: 3.0.6
|
||||
version: 3.0.6
|
||||
'@types/react':
|
||||
specifier: npm:types-react@rc
|
||||
version: types-react@19.0.0-rc.1
|
||||
'@types/react-dom':
|
||||
specifier: npm:types-react-dom@rc
|
||||
version: types-react-dom@19.0.0-rc.1
|
||||
'@types/react-transition-group':
|
||||
specifier: 4.4.10
|
||||
version: 4.4.10
|
||||
'@typescript-eslint/eslint-plugin':
|
||||
specifier: 7.16.0
|
||||
version: 7.16.0(@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)
|
||||
@@ -306,9 +294,6 @@ importers:
|
||||
clsx:
|
||||
specifier: 2.1.1
|
||||
version: 2.1.1
|
||||
react-resizable-panels:
|
||||
specifier: 2.0.20
|
||||
version: 2.0.20(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
sass:
|
||||
specifier: 1.77.7
|
||||
version: 1.77.7
|
||||
@@ -325,8 +310,8 @@ importers:
|
||||
specifier: npm:vite-plugin-monaco-editor-new@1.1.3
|
||||
version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.50.0)
|
||||
vite-plugin-sass-dts:
|
||||
specifier: 1.3.22
|
||||
version: 1.3.22(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0))
|
||||
specifier: 1.3.24
|
||||
version: 1.3.24(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0))
|
||||
vite-plugin-svgr:
|
||||
specifier: 4.2.0
|
||||
version: 4.2.0(rollup@4.17.2)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0))
|
||||
@@ -340,14 +325,14 @@ importers:
|
||||
specifier: 0.3.0
|
||||
version: 0.3.0
|
||||
'@mui/icons-material':
|
||||
specifier: 5.16.0
|
||||
version: 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
specifier: 5.16.1
|
||||
version: 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/lab':
|
||||
specifier: 5.0.0-alpha.171
|
||||
version: 5.0.0-alpha.171(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
specifier: 5.0.0-alpha.172
|
||||
version: 5.0.0-alpha.172(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material':
|
||||
specifier: 5.16.0
|
||||
version: 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
specifier: 5.16.1
|
||||
version: 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@radix-ui/react-dialog':
|
||||
specifier: 1.1.1
|
||||
version: 1.1.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
@@ -1129,11 +1114,11 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/core-downloads-tracker@5.16.0':
|
||||
resolution: {integrity: sha512-8SLffXYPRVpcZx5QzxNE8fytTqzp+IuU3deZbQWg/vSaTlDpR5YVrQ4qQtXTi5cRdhOufV5INylmwlKK+//nPw==}
|
||||
'@mui/core-downloads-tracker@5.16.1':
|
||||
resolution: {integrity: sha512-62Jq7ACYi/55Kjkh/nVfEL3F3ytTYTsdB8MGJ9iI+eRQv+Aoem5CPUAzQihUo25qqh1VkVu9/jQn3dFbyrXHgw==}
|
||||
|
||||
'@mui/icons-material@5.16.0':
|
||||
resolution: {integrity: sha512-6ISoOhkp9w5gD0PEW9JklrcbyARDkFWNTBdwXZ1Oy5IGlyu9B0zG0hnUIe4H17IaF1Vgj6C8VI+v4tkSdK0veg==}
|
||||
'@mui/icons-material@5.16.1':
|
||||
resolution: {integrity: sha512-ogQPweYba4+5XZykilwxn2/oS78uwoQ0BVBpOhhCJo0ooZsqTTsalhzP2qD/RdGqMQ8xyXPz1sYM2djTruVVVA==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@mui/material': ^5.0.0
|
||||
@@ -1143,8 +1128,8 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/lab@5.0.0-alpha.171':
|
||||
resolution: {integrity: sha512-/ZRnx0wB7hWHMsy76AAUJREVHZ7v5kOKwgJKCQrqOcaPNyo3WiwtTqKaM4Pgj+2r7O10IrC6zOniq8kTRqVAlA==}
|
||||
'@mui/lab@5.0.0-alpha.172':
|
||||
resolution: {integrity: sha512-stpa3WTsDE1HamFR4eeS6Bhxalm+u9FhzzNph/PrDMdWSRBHlJs2mqvZ6FEoO22O7MOCwNMqbXTkvEwsyEf0ew==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@emotion/react': ^11.5.0
|
||||
@@ -1161,8 +1146,8 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/material@5.16.0':
|
||||
resolution: {integrity: sha512-DbR1NckTLpjt9Zut9EGQ70th86HfN0BYQgyYro6aXQrNfjzSwe3BJS1AyBQ5mJ7TdL6YVRqohfukxj9JlqZZUg==}
|
||||
'@mui/material@5.16.1':
|
||||
resolution: {integrity: sha512-BGTgJRb0d/hX9tus5CEb6N/Fo8pE4tYA+s9r4/S0PCrtZ3urCLXlTH4qrAvggQbiF1cYRAbHCkVHoQ+4Pdxl+w==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@emotion/react': ^11.5.0
|
||||
@@ -1188,6 +1173,16 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/private-theming@5.16.1':
|
||||
resolution: {integrity: sha512-2EGCKnAlq9vRIFj61jNWNXlKAxXp56577OVvsts7fAqRx+G1y6F+N7Q198SBaz8jYQeGKSz8ZMXK/M3FqjdEyw==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@types/react': npm:types-react@rc
|
||||
react: npm:react@rc
|
||||
peerDependenciesMeta:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/styled-engine@5.15.14':
|
||||
resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
@@ -1201,6 +1196,19 @@ packages:
|
||||
'@emotion/styled':
|
||||
optional: true
|
||||
|
||||
'@mui/styled-engine@5.16.1':
|
||||
resolution: {integrity: sha512-JwWUBaYR8HHCFefSeos0z6JoTbu0MnjAuNHu4QoDgPxl2EE70XH38CsKay66Iy0QkNWmGTRXVU2sVFgUOPL/Dw==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@emotion/react': ^11.4.1
|
||||
'@emotion/styled': ^11.3.0
|
||||
react: npm:react@rc
|
||||
peerDependenciesMeta:
|
||||
'@emotion/react':
|
||||
optional: true
|
||||
'@emotion/styled':
|
||||
optional: true
|
||||
|
||||
'@mui/system@5.16.0':
|
||||
resolution: {integrity: sha512-9YbkC2m3+pNumAvubYv+ijLtog6puJ0fJ6rYfzfLCM47pWrw3m+30nXNM8zMgDaKL6vpfWJcCXm+LPaWBpy7sw==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
@@ -1217,6 +1225,22 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/system@5.16.1':
|
||||
resolution: {integrity: sha512-VaFcClC+uhvIEzhzcNmh9FRBvrG9IPjsOokhj6U1HPZsFnLzHV7AD7dJcT6LxWoiIZj9Ej0GK+MGh/b8+BtSlQ==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@emotion/react': ^11.5.0
|
||||
'@emotion/styled': ^11.3.0
|
||||
'@types/react': npm:types-react@rc
|
||||
react: npm:react@rc
|
||||
peerDependenciesMeta:
|
||||
'@emotion/react':
|
||||
optional: true
|
||||
'@emotion/styled':
|
||||
optional: true
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/types@7.2.14':
|
||||
resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==}
|
||||
peerDependencies:
|
||||
@@ -1225,6 +1249,14 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/types@7.2.15':
|
||||
resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==}
|
||||
peerDependencies:
|
||||
'@types/react': npm:types-react@rc
|
||||
peerDependenciesMeta:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/utils@5.16.0':
|
||||
resolution: {integrity: sha512-kLLi5J1xY+mwtUlMb8Ubdxf4qFAA1+U7WPBvjM/qQ4CIwLCohNb0sHo1oYPufjSIH/Z9+dhVxD7dJlfGjd1AVA==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
@@ -1235,19 +1267,51 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/x-data-grid@7.9.0':
|
||||
resolution: {integrity: sha512-RkrVD+tfcR/h3j2p2uqohxA00C5tCJIV5gb5+2ap8XdM0Y8XMF81bB8UADWenU5W83UTErWvtU7n4gCl7hJO9g==}
|
||||
'@mui/utils@5.16.1':
|
||||
resolution: {integrity: sha512-4UQzK46tAEYs2xZv79hRiIc3GxZScd00kGPDadNrGztAEZlmSaUY8cb9ITd2xCiTfzsx5AN6DH8aaQ8QEKJQeQ==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
peerDependencies:
|
||||
'@types/react': npm:types-react@rc
|
||||
react: npm:react@rc
|
||||
peerDependenciesMeta:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@mui/x-date-pickers@7.9.0':
|
||||
resolution: {integrity: sha512-GMDprioHlYmNle8Cbh6TxB4QThDGgqJxfH/R/p/5dNk+Tn5vB1gZSDMn3wVxItiEV6tDXbkyS5gPhSMVFDGvAA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
'@emotion/react': ^11.9.0
|
||||
'@emotion/styled': ^11.8.1
|
||||
'@mui/material': ^5.15.14
|
||||
date-fns: ^2.25.0 || ^3.2.0
|
||||
date-fns-jalali: ^2.13.0-0 || ^3.2.0-0
|
||||
dayjs: ^1.10.7
|
||||
luxon: ^3.0.2
|
||||
moment: ^2.29.4
|
||||
moment-hijri: ^2.1.2
|
||||
moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
'@mui/x-internals@7.9.0':
|
||||
resolution: {integrity: sha512-RJRrM6moaDZ8S11gDt8OKVclKm2v9khpIyLkpenNze+tT4dQYoU3liW5P2t31hA4Na/T6JQKNosB4qmB2TYfZw==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
peerDependenciesMeta:
|
||||
'@emotion/react':
|
||||
optional: true
|
||||
'@emotion/styled':
|
||||
optional: true
|
||||
date-fns:
|
||||
optional: true
|
||||
date-fns-jalali:
|
||||
optional: true
|
||||
dayjs:
|
||||
optional: true
|
||||
luxon:
|
||||
optional: true
|
||||
moment:
|
||||
optional: true
|
||||
moment-hijri:
|
||||
optional: true
|
||||
moment-jalaali:
|
||||
optional: true
|
||||
|
||||
'@nodelib/fs.scandir@2.1.5':
|
||||
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
||||
@@ -1830,6 +1894,30 @@ packages:
|
||||
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
'@tanstack/match-sorter-utils@8.15.1':
|
||||
resolution: {integrity: sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@tanstack/react-table@8.16.0':
|
||||
resolution: {integrity: sha512-rKRjnt8ostqN2fercRVOIH/dq7MAmOENCMvVlKx6P9Iokhh6woBGnIZEkqsY/vEJf1jN3TqLOb34xQGLVRuhAg==}
|
||||
engines: {node: '>=12'}
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
'@tanstack/react-virtual@3.3.0':
|
||||
resolution: {integrity: sha512-QFxmTSZBniq15S0vSZ55P4ToXquMXwJypPXyX/ux7sYo6a2FX3/zWoRLLc4eIOGWTjvzqcIVNKhcuFb+OZL3aQ==}
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
'@tanstack/table-core@8.16.0':
|
||||
resolution: {integrity: sha512-dCG8vQGk4js5v88/k83tTedWOwjGnIyONrKpHpfmSJB8jwFHl8GSu1sBBxbtACVAPtAQgwNxl0rw1d3RqRM1Tg==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@tanstack/virtual-core@3.3.0':
|
||||
resolution: {integrity: sha512-A0004OAa1FcUkPHeeGoKgBrAgjH+uHdDPrw1L7RpkwnODYqRvoilqsHPs8cyTjMg1byZBbiNpQAq2TlFLIaQag==}
|
||||
|
||||
'@taplo/core@0.1.1':
|
||||
resolution: {integrity: sha512-BG/zLGf5wiNXGEVPvUAAX/4ilB3PwDUY2o0MV0y47mZbDZ9ad9UK/cIQsILat3bqbPJsALVbU6k3cskNZ3vAQg==}
|
||||
|
||||
@@ -2046,9 +2134,6 @@ packages:
|
||||
'@types/http-cache-semantics@4.0.4':
|
||||
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
|
||||
|
||||
'@types/js-cookie@3.0.6':
|
||||
resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
|
||||
|
||||
'@types/json5@0.0.29':
|
||||
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
|
||||
|
||||
@@ -3594,6 +3679,10 @@ packages:
|
||||
hast-util-whitespace@3.0.0:
|
||||
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
|
||||
|
||||
highlight-words@1.2.2:
|
||||
resolution: {integrity: sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==}
|
||||
engines: {node: '>= 16', npm: '>= 8'}
|
||||
|
||||
hoist-non-react-statics@3.3.2:
|
||||
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
|
||||
|
||||
@@ -4180,6 +4269,18 @@ packages:
|
||||
resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
material-react-table@2.13.0:
|
||||
resolution: {integrity: sha512-ds4/cupDsXvoz8K8OpM3UqUyqKoAMkVdvmvP/+ovuWA23fPcjYvFFkUpBxtnZq5GKWM0+SZWzr14KQ1DgKCaFQ==}
|
||||
engines: {node: '>=16'}
|
||||
peerDependencies:
|
||||
'@emotion/react': '>=11.11'
|
||||
'@emotion/styled': '>=11.11'
|
||||
'@mui/icons-material': '>=5.11'
|
||||
'@mui/material': '>=5.13'
|
||||
'@mui/x-date-pickers': '>=6.15.0'
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
mathml-tag-names@2.1.3:
|
||||
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
|
||||
|
||||
@@ -4959,12 +5060,6 @@ packages:
|
||||
'@types/react':
|
||||
optional: true
|
||||
|
||||
react-resizable-panels@2.0.20:
|
||||
resolution: {integrity: sha512-aMbK3VF8U+VBICG+rwhE0Rr/eFZaRzmNq3akBRL1TrayIpLXz7Rbok0//kYeWj6SQRsjcQ3f4eRplJicM+oL6w==}
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
react-router-dom@6.24.1:
|
||||
resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
@@ -4978,6 +5073,11 @@ packages:
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
|
||||
react-split-grid@1.0.4:
|
||||
resolution: {integrity: sha512-RMEzFFnntgn+u5GFq+ognmv30CsTgrR97zB4RkMx2VSX9Sw8A7fjzCUfw/Avj7m8GCEw19GIjoUQGOQUOOjlcA==}
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
|
||||
react-style-singleton@2.2.1:
|
||||
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -4994,13 +5094,6 @@ packages:
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
react-virtuoso@4.7.10:
|
||||
resolution: {integrity: sha512-l+fnBf/G1Fp6pHCnhFq2Ra4lkZtT6c5XrS9rCS0OA6de7WGLZviCo0y61CUZZG79TeAw3L7O4czeNPiqh9CIrg==}
|
||||
engines: {node: '>=10'}
|
||||
peerDependencies:
|
||||
react: npm:react@rc
|
||||
react-dom: npm:react-dom@rc
|
||||
|
||||
react@19.0.0-rc-df783f9ea1-20240708:
|
||||
resolution: {integrity: sha512-sEKaKkgwW0cbYIYhUJoTGNHlcXeJDATtiwwm13RoZgzCIRYkE38nOL1RGnY5xUqalXQS1jEObSJCQSeLLi5sEg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -5046,6 +5139,9 @@ packages:
|
||||
remark-rehype@11.1.0:
|
||||
resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==}
|
||||
|
||||
remove-accents@0.5.0:
|
||||
resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
|
||||
|
||||
require-directory@2.1.1:
|
||||
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -5054,9 +5150,6 @@ packages:
|
||||
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
reselect@4.1.8:
|
||||
resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==}
|
||||
|
||||
reserved-words@0.1.2:
|
||||
resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==}
|
||||
|
||||
@@ -5268,6 +5361,9 @@ packages:
|
||||
space-separated-tokens@2.0.2:
|
||||
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
|
||||
|
||||
split-grid@1.0.11:
|
||||
resolution: {integrity: sha512-ELtFtxc3r5we5GZfe6Fi0BFFxIi2M6BY1YEntBscKRDD3zx4JVHqx2VnTRSQu1BixCYSTH3MTjKd4esI2R7EgQ==}
|
||||
|
||||
split2@4.2.0:
|
||||
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
|
||||
engines: {node: '>= 10.x'}
|
||||
@@ -5390,8 +5486,8 @@ packages:
|
||||
peerDependencies:
|
||||
stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1
|
||||
|
||||
stylelint-scss@6.4.0:
|
||||
resolution: {integrity: sha512-1BKRzh2TW38hZm/IWdvBVjlJRERB2zTiwm1xaOeDtUEmEKfxYMNr9THBQQtBV8wGxal/sN+TRsF7v9A5sqGI1A==}
|
||||
stylelint-scss@6.4.1:
|
||||
resolution: {integrity: sha512-+clI2bQC2FPOt06ZwUlXZZ95IO2C5bKTP0GLN1LNQPVvISfSNcgMKv/VTwym1mK9vnqhHbOk8lO4rj4nY7L9pw==}
|
||||
engines: {node: '>=18.12.0'}
|
||||
peerDependencies:
|
||||
stylelint: ^16.0.2
|
||||
@@ -5755,9 +5851,9 @@ packages:
|
||||
peerDependencies:
|
||||
monaco-editor: '>=0.45.0'
|
||||
|
||||
vite-plugin-sass-dts@1.3.22:
|
||||
resolution: {integrity: sha512-N09ApMznYMh8o2ab1HgGxrGnLGk1GPAtS+iZdiZWeq6ftRrKVxYSY99yyaDC6mSHczreb/JAC5HbPhrTSHaPEg==}
|
||||
engines: {node: 20.x}
|
||||
vite-plugin-sass-dts@1.3.24:
|
||||
resolution: {integrity: sha512-t6qxkC8seJJuYmlioKu2QFOJhJgIXwmAGbfOwmZ41QH1eqpqzgQkkXgWVLRf0DlO3FNMPn2y5bO9+R1N7LRgTA==}
|
||||
engines: {node: '>=20'}
|
||||
peerDependencies:
|
||||
postcss: ^8
|
||||
prettier: ^2.7 || ^3
|
||||
@@ -6599,8 +6695,8 @@ snapshots:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@floating-ui/react-dom': 2.0.9(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
'@mui/types': 7.2.14(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@popperjs/core': 2.11.8
|
||||
clsx: 2.1.1
|
||||
prop-types: 15.8.1
|
||||
@@ -6609,24 +6705,24 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/core-downloads-tracker@5.16.0': {}
|
||||
'@mui/core-downloads-tracker@5.16.1': {}
|
||||
|
||||
'@mui/icons-material@5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
'@mui/icons-material@5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/lab@5.0.0-alpha.171(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
'@mui/lab@5.0.0-alpha.172(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/system': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/types': 7.2.14(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/system': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
clsx: 2.1.1
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
@@ -6636,14 +6732,14 @@ snapshots:
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
'@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/core-downloads-tracker': 5.16.0
|
||||
'@mui/system': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/types': 7.2.14(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/core-downloads-tracker': 5.16.1
|
||||
'@mui/system': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/react-transition-group': 4.4.10
|
||||
clsx: 2.1.1
|
||||
csstype: 3.1.3
|
||||
@@ -6666,6 +6762,15 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/private-theming@5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/styled-engine@5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
@@ -6677,6 +6782,17 @@ snapshots:
|
||||
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
|
||||
'@mui/styled-engine@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@emotion/cache': 11.11.0
|
||||
csstype: 3.1.3
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
optionalDependencies:
|
||||
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
|
||||
'@mui/system@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
@@ -6693,10 +6809,30 @@ snapshots:
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/system@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/private-theming': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/styled-engine': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
clsx: 2.1.1
|
||||
csstype: 3.1.3
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
optionalDependencies:
|
||||
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/types@7.2.14(types-react@19.0.0-rc.1)':
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/types@7.2.15(types-react@19.0.0-rc.1)':
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/utils@5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
@@ -6707,28 +6843,33 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/x-data-grid@7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
'@mui/utils@5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/prop-types': 15.7.12
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-is: 18.3.1
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
'@mui/x-date-pickers@7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(dayjs@1.11.11)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/system': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/x-internals': 7.9.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@types/react-transition-group': 4.4.10
|
||||
clsx: 2.1.1
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
reselect: 4.1.8
|
||||
transitivePeerDependencies:
|
||||
- '@emotion/react'
|
||||
- '@emotion/styled'
|
||||
- '@types/react'
|
||||
|
||||
'@mui/x-internals@7.9.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.7
|
||||
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-transition-group: 4.4.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
optionalDependencies:
|
||||
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
dayjs: 1.11.11
|
||||
transitivePeerDependencies:
|
||||
- '@types/react'
|
||||
|
||||
@@ -7263,6 +7404,26 @@ snapshots:
|
||||
dependencies:
|
||||
defer-to-connect: 2.0.1
|
||||
|
||||
'@tanstack/match-sorter-utils@8.15.1':
|
||||
dependencies:
|
||||
remove-accents: 0.5.0
|
||||
|
||||
'@tanstack/react-table@8.16.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)':
|
||||
dependencies:
|
||||
'@tanstack/table-core': 8.16.0
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
'@tanstack/react-virtual@3.3.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)':
|
||||
dependencies:
|
||||
'@tanstack/virtual-core': 3.3.0
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
'@tanstack/table-core@8.16.0': {}
|
||||
|
||||
'@tanstack/virtual-core@3.3.0': {}
|
||||
|
||||
'@taplo/core@0.1.1': {}
|
||||
|
||||
'@taplo/lib@0.4.0-alpha.2':
|
||||
@@ -7494,8 +7655,6 @@ snapshots:
|
||||
|
||||
'@types/http-cache-semantics@4.0.4': {}
|
||||
|
||||
'@types/js-cookie@3.0.6': {}
|
||||
|
||||
'@types/json5@0.0.29': {}
|
||||
|
||||
'@types/jsonfile@6.1.4':
|
||||
@@ -9352,6 +9511,8 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/hast': 3.0.4
|
||||
|
||||
highlight-words@1.2.2: {}
|
||||
|
||||
hoist-non-react-statics@3.3.2:
|
||||
dependencies:
|
||||
react-is: 16.13.1
|
||||
@@ -9880,6 +10041,20 @@ snapshots:
|
||||
escape-string-regexp: 4.0.0
|
||||
optional: true
|
||||
|
||||
material-react-table@2.13.0(anywsq46gdagafemjlmocwrkqu):
|
||||
dependencies:
|
||||
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/icons-material': 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(dayjs@1.11.11)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@tanstack/match-sorter-utils': 8.15.1
|
||||
'@tanstack/react-table': 8.16.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
'@tanstack/react-virtual': 3.3.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
highlight-words: 1.2.2
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
mathml-tag-names@2.1.3: {}
|
||||
|
||||
mdast-util-from-markdown@2.0.0:
|
||||
@@ -10160,12 +10335,12 @@ snapshots:
|
||||
|
||||
ms@2.1.3: {}
|
||||
|
||||
mui-color-input@3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1):
|
||||
mui-color-input@3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1):
|
||||
dependencies:
|
||||
'@ctrl/tinycolor': 4.1.0
|
||||
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
optionalDependencies:
|
||||
@@ -10683,13 +10858,14 @@ snapshots:
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
react-hook-form-mui@7.0.1(addvybcbawtwkjqnoojx6y4g5m):
|
||||
react-hook-form-mui@7.0.1(7cllkcphevtaad3vgre6vmruby):
|
||||
dependencies:
|
||||
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-hook-form: 7.52.1(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
optionalDependencies:
|
||||
'@mui/icons-material': 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/icons-material': 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(dayjs@1.11.11)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||
|
||||
react-hook-form@7.52.1(react@19.0.0-rc-df783f9ea1-20240708):
|
||||
dependencies:
|
||||
@@ -10746,11 +10922,6 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@types/react': types-react@19.0.0-rc.1
|
||||
|
||||
react-resizable-panels@2.0.20(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
|
||||
dependencies:
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
react-router-dom@6.24.1(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
|
||||
dependencies:
|
||||
'@remix-run/router': 1.17.1
|
||||
@@ -10763,6 +10934,12 @@ snapshots:
|
||||
'@remix-run/router': 1.17.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
|
||||
react-split-grid@1.0.4(react@19.0.0-rc-df783f9ea1-20240708):
|
||||
dependencies:
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
split-grid: 1.0.11
|
||||
|
||||
react-style-singleton@2.2.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1):
|
||||
dependencies:
|
||||
get-nonce: 1.0.1
|
||||
@@ -10774,18 +10951,13 @@ snapshots:
|
||||
|
||||
react-transition-group@4.4.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@babel/runtime': 7.24.7
|
||||
dom-helpers: 5.2.1
|
||||
loose-envify: 1.4.0
|
||||
prop-types: 15.8.1
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
react-virtuoso@4.7.10(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
|
||||
dependencies:
|
||||
react: 19.0.0-rc-df783f9ea1-20240708
|
||||
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
|
||||
|
||||
react@19.0.0-rc-df783f9ea1-20240708: {}
|
||||
|
||||
read-cache@1.0.0:
|
||||
@@ -10853,12 +11025,12 @@ snapshots:
|
||||
unified: 11.0.4
|
||||
vfile: 6.0.1
|
||||
|
||||
remove-accents@0.5.0: {}
|
||||
|
||||
require-directory@2.1.1: {}
|
||||
|
||||
require-from-string@2.0.2: {}
|
||||
|
||||
reselect@4.1.8: {}
|
||||
|
||||
reserved-words@0.1.2: {}
|
||||
|
||||
resize-observer-polyfill@1.5.1: {}
|
||||
@@ -11079,6 +11251,8 @@ snapshots:
|
||||
|
||||
space-separated-tokens@2.0.2: {}
|
||||
|
||||
split-grid@1.0.11: {}
|
||||
|
||||
split2@4.2.0: {}
|
||||
|
||||
sprintf-js@1.1.3: {}
|
||||
@@ -11206,7 +11380,7 @@ snapshots:
|
||||
postcss-sorting: 8.0.2(postcss@8.4.39)
|
||||
stylelint: 16.6.1(typescript@5.5.3)
|
||||
|
||||
stylelint-scss@6.4.0(stylelint@16.6.1(typescript@5.5.3)):
|
||||
stylelint-scss@6.4.1(stylelint@16.6.1(typescript@5.5.3)):
|
||||
dependencies:
|
||||
known-css-properties: 0.34.0
|
||||
postcss-media-query-parser: 0.2.3
|
||||
@@ -11706,7 +11880,7 @@ snapshots:
|
||||
esbuild: 0.19.12
|
||||
monaco-editor: 0.50.0
|
||||
|
||||
vite-plugin-sass-dts@1.3.22(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0)):
|
||||
vite-plugin-sass-dts@1.3.24(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0)):
|
||||
dependencies:
|
||||
postcss: 8.4.39
|
||||
postcss-js: 4.0.1(postcss@8.4.39)
|
||||
|
||||
@@ -393,7 +393,11 @@ func (c *clientConfig) parseURI() bool {
|
||||
return false
|
||||
}
|
||||
if u.User != nil {
|
||||
c.Auth = u.User.String()
|
||||
auth, err := url.QueryUnescape(u.User.String())
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
c.Auth = auth
|
||||
}
|
||||
c.Server = u.Host
|
||||
q := u.Query()
|
||||
|
||||
@@ -8,7 +8,81 @@
|
||||
compatible = "hf,m7986r1-emmc", "mediatek,mt7986a";
|
||||
|
||||
chosen {
|
||||
bootargs = "root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs";
|
||||
bootargs = "root=PARTLABEL=rootfs rootwait";
|
||||
};
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
bus-width = <8>;
|
||||
cap-mmc-highspeed;
|
||||
hs400-ds-delay = <0x14014>;
|
||||
max-frequency = <200000000>;
|
||||
mmc-hs200-1_8v;
|
||||
non-removable;
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_1p8v>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
mmc0_pins_default: mmc0-pins-default {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc_51";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <6>;
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-ds {
|
||||
pins = "EMMC_DSL";
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-rst {
|
||||
pins = "EMMC_RSTB";
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-uhs-pins {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc_51";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <6>;
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-ds {
|
||||
pins = "EMMC_DSL";
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-rst {
|
||||
pins = "EMMC_RSTB";
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
led-running = &sys_led;
|
||||
led-upgrade = &sys_led;
|
||||
};
|
||||
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
@@ -68,6 +68,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
reg_1p8v: regulator-1p8v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
reg_3p3v: regulator-3p3v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-3.3V";
|
||||
@@ -85,15 +94,6 @@
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
reg_1p8v: regulator-1p8v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
|
||||
&crypto {
|
||||
@@ -188,64 +188,6 @@
|
||||
output-low;
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_default: mmc0-pins-default {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc_51";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <6>;
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-ds {
|
||||
pins = "EMMC_DSL";
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-rst {
|
||||
pins = "EMMC_RSTB";
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-uhs-pins {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc_51";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <6>;
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-ds {
|
||||
pins = "EMMC_DSL";
|
||||
mediatek,pull-down-adv = <2>;
|
||||
};
|
||||
conf-rst {
|
||||
pins = "EMMC_RSTB";
|
||||
drive-strength = <4>;
|
||||
mediatek,pull-up-adv = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&ssusb {
|
||||
@@ -310,21 +252,3 @@
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
bus-width = <8>;
|
||||
cap-mmc-highspeed;
|
||||
hs400-ds-delay = <0x14014>;
|
||||
max-frequency = <200000000>;
|
||||
mmc-hs200-1_8v;
|
||||
no-sd;
|
||||
no-sdio;
|
||||
non-removable;
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_1p8v>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -34,13 +34,13 @@ mediatek_setup_interfaces()
|
||||
qihoo,360t7)
|
||||
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" wan
|
||||
;;
|
||||
hf,m7986r1*)
|
||||
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" "lan1 usb0"
|
||||
;;
|
||||
glinet,gl-mt2500|\
|
||||
glinet,gl-mt3000)
|
||||
ucidef_set_interfaces_lan_wan eth1 eth0
|
||||
;;
|
||||
hf,m7986r1*)
|
||||
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" "lan1 usb0"
|
||||
;;
|
||||
mediatek,mt7986a-rfb|\
|
||||
mediatek,mt7986b-rfb)
|
||||
ucidef_set_interfaces_lan_wan "lan0 lan1 lan2 lan3" eth1
|
||||
|
||||
@@ -340,6 +340,35 @@ define Device/h3c_magic-nx30-pro
|
||||
endef
|
||||
TARGET_DEVICES += h3c_magic-nx30-pro
|
||||
|
||||
define Device/hf_m7986r1-emmc
|
||||
DEVICE_VENDOR := HF
|
||||
DEVICE_MODEL := M7986R1 (eMMC)
|
||||
DEVICE_DTS := mt7986a-hf-m7986r1-emmc
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-net-rndis kmod-usb-serial-option f2fsck mkf2fs
|
||||
SUPPORTED_DEVICES += HF-M7986R1
|
||||
KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
|
||||
KERNEL_INITRAMFS := kernel-bin | lzma | \
|
||||
fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES += hf_m7986r1-emmc
|
||||
|
||||
define Device/hf_m7986r1-nand
|
||||
DEVICE_VENDOR := HF
|
||||
DEVICE_MODEL := M7986R1 (NAND)
|
||||
DEVICE_DTS := mt7986a-hf-m7986r1-nand
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
UBINIZE_OPTS := -E 5
|
||||
BLOCKSIZE := 128k
|
||||
PAGESIZE := 2048
|
||||
KERNEL_IN_UBI := 1
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-net-rndis kmod-usb-serial-option
|
||||
SUPPORTED_DEVICES += HF-M7986R1
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES += hf_m7986r1-nand
|
||||
|
||||
define Device/imou_lc-hx3001
|
||||
DEVICE_VENDOR := IMOU
|
||||
DEVICE_MODEL := LC-HX3001
|
||||
@@ -479,36 +508,6 @@ define Device/mediatek_mt7988a-rfb
|
||||
endef
|
||||
TARGET_DEVICES += mediatek_mt7988a-rfb
|
||||
|
||||
define Device/hf_m7986r1-emmc
|
||||
DEVICE_VENDOR := HF
|
||||
DEVICE_MODEL := M7986R1 (eMMC version)
|
||||
DEVICE_DTS := mt7986a-hf-m7986r1-emmc
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-serial-option kmod-usb-net-rndis f2fsck mkf2fs
|
||||
SUPPORTED_DEVICES += HF-M7986R1
|
||||
KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
|
||||
KERNEL_INITRAMFS := kernel-bin | lzma | \
|
||||
fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES +=hf_m7986r1-emmc
|
||||
|
||||
define Device/hf_m7986r1-nand
|
||||
DEVICE_VENDOR := HF
|
||||
DEVICE_MODEL := M7986R1 (NAND version)
|
||||
DEVICE_DTS := mt7986a-hf-m7986r1-nand
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
UBINIZE_OPTS := -E 5
|
||||
BLOCKSIZE := 128k
|
||||
PAGESIZE := 2048
|
||||
IMAGE_SIZE := 116736k
|
||||
KERNEL_IN_UBI := 1
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-serial-option kmod-usb-net-rndis mmc-utils
|
||||
SUPPORTED_DEVICES += HF-M7986R1
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES +=hf_m7986r1-nand
|
||||
|
||||
define Device/netcore_n60
|
||||
DEVICE_VENDOR := Netcore
|
||||
DEVICE_MODEL := N60
|
||||
|
||||
@@ -8,7 +8,7 @@ define Device/advantech_rsb4810
|
||||
SOC := rk3568
|
||||
UBOOT_DEVICE_NAME := advantech-rsb4810-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-ata-ahci kmod-ata-ahci-platform -urngd
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-dwc -urngd
|
||||
endef
|
||||
TARGET_DEVICES += advantech_rsb4810
|
||||
|
||||
@@ -48,7 +48,7 @@ define Device/ezpro_mrkaio-m68s
|
||||
SOC := rk3568
|
||||
UBOOT_DEVICE_NAME := mrkaio-m68s-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script vop | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-ata-ahci kmod-ata-ahci-platform kmod-drm-rockchip
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-drm-rockchip
|
||||
endef
|
||||
TARGET_DEVICES += ezpro_mrkaio-m68s
|
||||
|
||||
@@ -58,7 +58,7 @@ define Device/ezpro_mrkaio-m68s-plus
|
||||
SOC := rk3568
|
||||
UBOOT_DEVICE_NAME := mrkaio-m68s-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script vop | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-r8125 kmod-ata-ahci kmod-ata-ahci-platform kmod-drm-rockchip
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-drm-rockchip kmod-r8125
|
||||
endef
|
||||
TARGET_DEVICES += ezpro_mrkaio-m68s-plus
|
||||
|
||||
@@ -157,7 +157,7 @@ define Device/firefly_station-p2
|
||||
DEVICE_DTS := rockchip/rk3568-roc-pc
|
||||
UBOOT_DEVICE_NAME := station-p2-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-brcmfmac kmod-ikconfig kmod-ata-ahci-platform station-p2-firmware wpad-openssl
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-brcmfmac kmod-ikconfig wpad-openssl
|
||||
endef
|
||||
TARGET_DEVICES += firefly_station-p2
|
||||
|
||||
@@ -165,7 +165,7 @@ define Device/hinlink_common
|
||||
DEVICE_VENDOR := HINLINK
|
||||
UBOOT_DEVICE_NAME := opc-h68k-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script vop | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-platform kmod-drm-rockchip kmod-hwmon-pwmfan kmod-mt7921e kmod-r8125 wpad-openssl
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-drm-rockchip kmod-hwmon-pwmfan kmod-mt7921e kmod-r8125 wpad-openssl
|
||||
endef
|
||||
|
||||
define Device/hinlink_opc-h66k
|
||||
@@ -206,7 +206,7 @@ define Device/panther_x2
|
||||
DEVICE_DTS := rockchip/rk3566-panther-x2
|
||||
UBOOT_DEVICE_NAME := panther-x2-rk3566
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-brcmfmac kmod-ikconfig panther-x2-firmware wpad-openssl
|
||||
DEVICE_PACKAGES := kmod-brcmfmac kmod-ikconfig brcmfmac-nvram-43430-sdio wpad-openssl
|
||||
endef
|
||||
TARGET_DEVICES += panther_x2
|
||||
|
||||
@@ -226,7 +226,7 @@ define Device/radxa_e25
|
||||
DEVICE_DTS := rockchip/rk3568-radxa-e25
|
||||
UBOOT_DEVICE_NAME := radxa-e25-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-platform kmod-r8125
|
||||
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-r8125
|
||||
endef
|
||||
TARGET_DEVICES += radxa_e25
|
||||
|
||||
@@ -257,7 +257,7 @@ define Device/rongpin_king3399
|
||||
SOC := rk3399
|
||||
UBOOT_DEVICE_NAME := rongpin-king3399-rk3399
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-bin | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-r8168 -urngd kmod-brcmfmac cypress-firmware-4356-sdio rongpin-king3399-firmware wpad-openssl
|
||||
DEVICE_PACKAGES := kmod-r8168 -urngd kmod-brcmfmac cypress-firmware-4356-sdio wpad-openssl
|
||||
endef
|
||||
TARGET_DEVICES += rongpin_king3399
|
||||
|
||||
@@ -278,7 +278,7 @@ define Device/seewo_sv21-rk3568
|
||||
DEVICE_DTS := rockchip/rk3568-seewo-sv21
|
||||
UBOOT_DEVICE_NAME := seewo-sv21-rk3568
|
||||
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
|
||||
DEVICE_PACKAGES := kmod-usb-net-rtl8152 kmod-ata-ahci kmod-ata-ahci-platform
|
||||
DEVICE_PACKAGES := kmod-usb-net-rtl8152 kmod-ata-ahci-dwc
|
||||
endef
|
||||
TARGET_DEVICES += seewo_sv21-rk3568
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
20240602150004
|
||||
20240708150024
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
2001:254::/31
|
||||
2001:256:100::/48
|
||||
2001:550:1601::/48
|
||||
2001:67c:aec::/48
|
||||
2001:67c:c28::/48
|
||||
2001:7fa:5::/48
|
||||
2001:c68::/32
|
||||
@@ -9,8 +10,7 @@
|
||||
2001:da8::/32
|
||||
2001:daa:1::/48
|
||||
2001:daa:2::/47
|
||||
2001:daa:4::/47
|
||||
2001:daa:6::/48
|
||||
2001:daa:4::/48
|
||||
2001:dc7::/32
|
||||
2001:dd8:1::/48
|
||||
2001:dd8:5::/48
|
||||
@@ -34,11 +34,12 @@
|
||||
2400:5400:10::/48
|
||||
2400:5a60:2::/48
|
||||
2400:5a60:100::/48
|
||||
2400:5f60::/32
|
||||
2400:6000::/32
|
||||
2400:6460::/40
|
||||
2400:6600::/32
|
||||
2400:6e60:1301::/48
|
||||
2400:73e0::/32
|
||||
2400:73e0:201::/48
|
||||
2400:75aa::/32
|
||||
2400:7bc0:20::/43
|
||||
2400:7fc0::/40
|
||||
@@ -101,17 +102,22 @@
|
||||
2400:9520:434::/48
|
||||
2400:95e0::/48
|
||||
2400:9600:8800::/48
|
||||
2400:9620::/32
|
||||
2400:a040::/32
|
||||
2400:a980::/29
|
||||
2400:ae00:1981::/48
|
||||
2400:b200::/32
|
||||
2400:b600::/32
|
||||
2400:b700::/48
|
||||
2400:be00::/48
|
||||
2400:cb80:e30::/44
|
||||
2400:cb80:e40::/44
|
||||
2400:da00::/32
|
||||
2400:dd00::/28
|
||||
2400:e3e0:aaa0::/44
|
||||
2400:e3e0:abb0::/44
|
||||
2400:ebc0::/32
|
||||
2400:ed60::/48
|
||||
2400:ee00::/32
|
||||
2400:f6e0::/32
|
||||
2400:f720::/32
|
||||
@@ -127,7 +133,6 @@
|
||||
2401:11a0:1500::/40
|
||||
2401:11a0:d150::/48
|
||||
2401:11a0:d152::/48
|
||||
2401:11a0:d158::/48
|
||||
2401:1200::/48
|
||||
2401:1320::/32
|
||||
2401:1740:2000::/48
|
||||
@@ -159,9 +164,11 @@
|
||||
2401:4a80::/32
|
||||
2401:5960:5960::/48
|
||||
2401:70e0::/32
|
||||
2401:71c0::/48
|
||||
2401:7700::/32
|
||||
2401:7d40::/32
|
||||
2401:7e00::/32
|
||||
2401:8be0::/48
|
||||
2401:8d00::/46
|
||||
2401:8d00:7::/48
|
||||
2401:8d00:8::/47
|
||||
@@ -171,6 +178,9 @@
|
||||
2401:8d00:10::/48
|
||||
2401:8d00:12::/48
|
||||
2401:8d00:14::/48
|
||||
2401:8da0::/48
|
||||
2401:95c0:f001::/48
|
||||
2401:9ca0::/48
|
||||
2401:a140:1::/48
|
||||
2401:b180::/32
|
||||
2401:b400::/45
|
||||
@@ -208,7 +218,9 @@
|
||||
2402:6f40:2::/47
|
||||
2402:6fc0::/48
|
||||
2402:7040::/32
|
||||
2402:7240::/36
|
||||
2402:7240:2000::/36
|
||||
2402:7740:2000::/36
|
||||
2402:7740:a000::/36
|
||||
2402:7d80::/32
|
||||
2402:8bc0::/32
|
||||
2402:8cc0::/40
|
||||
@@ -218,7 +230,7 @@
|
||||
2402:93c0:20::/48
|
||||
2402:93c0:100::/48
|
||||
2402:9a80::/32
|
||||
2402:9e80:60::/48
|
||||
2402:9b80:10::/48
|
||||
2402:a200::/32
|
||||
2402:b8c0::/32
|
||||
2402:b940::/40
|
||||
@@ -246,7 +258,7 @@
|
||||
2403:1ec0:1200::/48
|
||||
2403:1ec0:1400::/48
|
||||
2403:1ec0:1610::/48
|
||||
2403:2040::/32
|
||||
2403:2040::/48
|
||||
2403:27c0:c03::/48
|
||||
2403:27c0:1000::/48
|
||||
2403:2b40::/32
|
||||
@@ -255,6 +267,7 @@
|
||||
2403:4280::/47
|
||||
2403:4b40::/32
|
||||
2403:4c80::/48
|
||||
2403:4c80:128::/48
|
||||
2403:5c80::/48
|
||||
2403:6380:14::/47
|
||||
2403:6380:20::/44
|
||||
@@ -287,11 +300,12 @@
|
||||
2404:bc0:4f00::/43
|
||||
2404:1c80::/32
|
||||
2404:2280:106::/47
|
||||
2404:2280:10b::/48
|
||||
2404:2280:10d::/48
|
||||
2404:2280:10f::/48
|
||||
2404:2280:112::/47
|
||||
2404:2280:115::/48
|
||||
2404:2280:11b::/48
|
||||
2404:2280:11a::/47
|
||||
2404:2280:11c::/47
|
||||
2404:2280:11e::/48
|
||||
2404:2280:123::/48
|
||||
@@ -320,8 +334,7 @@
|
||||
2404:2280:1bf::/48
|
||||
2404:2280:1c1::/48
|
||||
2404:2280:1c2::/47
|
||||
2404:2280:1c4::/47
|
||||
2404:2280:1c7::/48
|
||||
2404:2280:1c4::/46
|
||||
2404:2280:1c8::/48
|
||||
2404:2280:1cb::/48
|
||||
2404:2280:1cc::/48
|
||||
@@ -333,8 +346,7 @@
|
||||
2404:2280:1e0::/48
|
||||
2404:2280:1e2::/47
|
||||
2404:2280:1e4::/46
|
||||
2404:2280:1e8::/48
|
||||
2404:2280:1ea::/48
|
||||
2404:2280:1e8::/46
|
||||
2404:2280:1ec::/47
|
||||
2404:2280:1ee::/48
|
||||
2404:2280:1f0::/45
|
||||
@@ -375,7 +387,6 @@
|
||||
2404:c940::/48
|
||||
2404:d7c0:2::/48
|
||||
2404:e280::/47
|
||||
2404:e5c0::/32
|
||||
2404:e8c0::/32
|
||||
2404:ea80:500:575::/64
|
||||
2404:ea80:600:623::/64
|
||||
@@ -396,6 +407,7 @@
|
||||
2405:3140:31::/48
|
||||
2405:3140:3a::/48
|
||||
2405:3bc0::/48
|
||||
2405:4540:8000::/48
|
||||
2405:57c0::/47
|
||||
2405:57c0:100::/48
|
||||
2405:66c0::/32
|
||||
@@ -432,11 +444,14 @@
|
||||
2406:840:110::/48
|
||||
2406:840:180::/48
|
||||
2406:840:1c0::/48
|
||||
2406:840:2e0::/48
|
||||
2406:840:301::/48
|
||||
2406:840:302::/48
|
||||
2406:840:3c1::/48
|
||||
2406:840:410::/48
|
||||
2406:840:420::/48
|
||||
2406:840:480::/48
|
||||
2406:840:540::/48
|
||||
2406:840:680::/48
|
||||
2406:840:801::/48
|
||||
2406:840:802::/47
|
||||
@@ -468,26 +483,31 @@
|
||||
2406:840:9700::/40
|
||||
2406:840:9801::/48
|
||||
2406:840:9810::/48
|
||||
2406:840:981a::/48
|
||||
2406:840:981c::/46
|
||||
2406:840:9960::/47
|
||||
2406:840:9962::/48
|
||||
2406:840:9969::/48
|
||||
2406:840:996f::/48
|
||||
2406:840:9980::/48
|
||||
2406:840:9984::/48
|
||||
2406:840:9ef0::/44
|
||||
2406:840:c0a8::/48
|
||||
2406:840:e010::/47
|
||||
2406:840:e014::/46
|
||||
2406:840:e018::/45
|
||||
2406:840:e030::/47
|
||||
2406:840:e033::/48
|
||||
2406:840:e03f::/48
|
||||
2406:840:e080::/44
|
||||
2406:840:e0c1::/48
|
||||
2406:840:e0cf::/48
|
||||
2406:840:e0e0::/44
|
||||
2406:840:e10f::/48
|
||||
2406:840:e14f::/48
|
||||
2406:840:e180::/44
|
||||
2406:840:e20f::/48
|
||||
2406:840:e230::/48
|
||||
2406:840:e230::/47
|
||||
2406:840:e232::/48
|
||||
2406:840:e234::/48
|
||||
2406:840:e270::/44
|
||||
2406:840:e300::/47
|
||||
2406:840:e302::/48
|
||||
@@ -510,7 +530,6 @@
|
||||
2406:840:e84f::/48
|
||||
2406:840:e880::/44
|
||||
2406:840:eab0::/46
|
||||
2406:840:eab4::/48
|
||||
2406:840:eab6::/48
|
||||
2406:840:eb00::/46
|
||||
2406:840:eb04::/47
|
||||
@@ -521,9 +540,12 @@
|
||||
2406:840:eb80::/42
|
||||
2406:840:ed02::/48
|
||||
2406:840:eed0::/44
|
||||
2406:840:efa0::/44
|
||||
2406:840:eee0::/44
|
||||
2406:840:f0a1::/48
|
||||
2406:840:f0aa::/48
|
||||
2406:840:f100::/47
|
||||
2406:840:f200::/47
|
||||
2406:840:f203::/48
|
||||
2406:840:f230::/44
|
||||
2406:840:f380::/44
|
||||
2406:840:f401::/48
|
||||
@@ -536,23 +558,33 @@
|
||||
2406:840:fa01::/48
|
||||
2406:840:fa02::/47
|
||||
2406:840:fa04::/48
|
||||
2406:840:fa40::/48
|
||||
2406:840:fc80::/45
|
||||
2406:840:fc88::/46
|
||||
2406:840:fc8c::/47
|
||||
2406:840:fc8e::/48
|
||||
2406:840:fcc0::/44
|
||||
2406:840:fd00::/47
|
||||
2406:840:fd03::/48
|
||||
2406:840:fd1f::/48
|
||||
2406:840:fdd0::/47
|
||||
2406:840:fd90::/44
|
||||
2406:840:fda0::/43
|
||||
2406:840:fdc0::/44
|
||||
2406:840:fdd1::/48
|
||||
2406:840:fde0::/48
|
||||
2406:840:fe27::/48
|
||||
2406:840:fe50::/48
|
||||
2406:840:fe60::/48
|
||||
2406:840:fe72::/47
|
||||
2406:840:fe90::/46
|
||||
2406:840:fec0::/47
|
||||
2406:840:fec4::/47
|
||||
2406:840:fec3::/48
|
||||
2406:840:fec4::/46
|
||||
2406:840:fec8::/45
|
||||
2406:840:fed1::/48
|
||||
2406:840:fed2::/47
|
||||
2406:840:fed4::/46
|
||||
2406:840:fed8::/47
|
||||
2406:840:feda::/48
|
||||
2406:840:fed8::/46
|
||||
2406:840:fedd::/48
|
||||
2406:840:fede::/47
|
||||
2406:840:feed::/48
|
||||
@@ -568,7 +600,8 @@
|
||||
2406:3340::/32
|
||||
2406:3640:1::/48
|
||||
2406:3d80::/32
|
||||
2406:4440:f000::/44
|
||||
2406:4440:f000::/48
|
||||
2406:4440:f00f::/48
|
||||
2406:4d00::/48
|
||||
2406:52c0::/32
|
||||
2406:5340:6666::/48
|
||||
@@ -583,6 +616,8 @@
|
||||
2406:d440:100::/44
|
||||
2406:d440:200::/44
|
||||
2406:d440:300::/44
|
||||
2406:d440:ff00::/48
|
||||
2406:d440:ffff::/48
|
||||
2406:e3c0::/32
|
||||
2406:e500::/33
|
||||
2407:2840::/48
|
||||
@@ -608,6 +643,7 @@
|
||||
2407:c080:5000::/37
|
||||
2407:c080:6000::/36
|
||||
2407:c080:8000::/36
|
||||
2407:d9c0::/32
|
||||
2408:4000::/22
|
||||
2408:8000::/48
|
||||
2408:8000:2::/47
|
||||
@@ -1085,8 +1121,6 @@
|
||||
2408:8a05:8000::/36
|
||||
2408:8a06::/47
|
||||
2408:8a06:100::/47
|
||||
2408:8a07:6000::/38
|
||||
2408:8a07:6400::/40
|
||||
2408:8a21:4000::/35
|
||||
2408:8a22:9200::/39
|
||||
2408:8a22:9400::/38
|
||||
@@ -1141,7 +1175,7 @@
|
||||
240a:40c3:c200::/48
|
||||
240a:40c3:c240::/48
|
||||
240a:4172::/31
|
||||
240a:41b0::/31
|
||||
240a:41b0::/34
|
||||
240a:41f2::/31
|
||||
240a:4242::/31
|
||||
240a:4280::/26
|
||||
@@ -1166,7 +1200,7 @@
|
||||
240d:c000:6000::/36
|
||||
240d:c000:7000::/44
|
||||
240d:c000:f000::/44
|
||||
240d:c000:f020::/44
|
||||
240d:c000:f020::/43
|
||||
240d:c010::/47
|
||||
240d:c010:14::/48
|
||||
240d:c010:16::/48
|
||||
@@ -1179,6 +1213,7 @@
|
||||
240d:c010:6c::/48
|
||||
240d:c040::/44
|
||||
240e::/20
|
||||
2601:1d08:4000::/44
|
||||
2602:2a3::/48
|
||||
2602:2a4:ff::/48
|
||||
2602:2c3:810::/44
|
||||
@@ -1191,19 +1226,31 @@
|
||||
2602:fa4f:600::/40
|
||||
2602:fab0:11::/48
|
||||
2602:fbda:600::/48
|
||||
2602:fbda:610::/48
|
||||
2602:fbda:660::/48
|
||||
2602:fbda:666::/48
|
||||
2602:fc52:311::/48
|
||||
2602:fc52:315::/48
|
||||
2602:fd92:801::/48
|
||||
2602:fe69:f26::/47
|
||||
2602:fed2:7020::/46
|
||||
2602:fed2:7101::/48
|
||||
2602:fed2:731d::/48
|
||||
2602:feda:182::/47
|
||||
2602:feda:1bf::/48
|
||||
2602:feda:1d1::/48
|
||||
2602:feda:1d2::/48
|
||||
2602:feda:2a0::/46
|
||||
2602:feda:2a4::/47
|
||||
2602:feda:2a6::/48
|
||||
2602:feda:2aa::/48
|
||||
2602:feda:2af::/48
|
||||
2602:feda:2d0::/47
|
||||
2602:feda:2f0::/48
|
||||
2602:feda:3c5::/48
|
||||
2602:feda:b8f::/48
|
||||
2602:feda:c34::/48
|
||||
2602:feda:ca1::/48
|
||||
2602:feda:d80::/48
|
||||
2602:feda:d83::/48
|
||||
2602:ffe4:c5f::/48
|
||||
@@ -1222,8 +1269,11 @@
|
||||
2605:9d80:9052::/48
|
||||
2605:9d80:9071::/48
|
||||
2605:9d80:9092::/48
|
||||
2605:f440:cafe::/48
|
||||
2620:57:4004::/47
|
||||
2804:1e48::/32
|
||||
2a03:5840:f3::/48
|
||||
2a03:5840:11b::/48
|
||||
2a03:5840:290::/48
|
||||
2a04:3e00:1002::/48
|
||||
2a04:f580:8010::/47
|
||||
@@ -1256,7 +1306,11 @@
|
||||
2a04:f580:9290::/48
|
||||
2a05:1085::/32
|
||||
2a05:1087::/32
|
||||
2a05:dfc1:1600::/40
|
||||
2a05:4140:66::/48
|
||||
2a05:dfc1:1600::/48
|
||||
2a05:dfc1:1604::/48
|
||||
2a05:dfc1:1607::/48
|
||||
2a05:dfc1:1608::/48
|
||||
2a05:dfc1:7106::/47
|
||||
2a05:dfc1:7108::/47
|
||||
2a05:dfc1:7110::/48
|
||||
@@ -1271,17 +1325,23 @@
|
||||
2a05:dfc1:8c22::/48
|
||||
2a05:dfc1:8c24::/48
|
||||
2a05:dfc1:8c42::/48
|
||||
2a05:dfc1:8c90::/46
|
||||
2a05:dfc1:8c94::/47
|
||||
2a05:dfc1:8d00::/48
|
||||
2a05:dfc1:8c90::/45
|
||||
2a05:dfc1:8d02::/48
|
||||
2a06:3600::/29
|
||||
2a06:9f81:4610::/44
|
||||
2a06:9f81:4620::/44
|
||||
2a06:9f81:4640::/43
|
||||
2a06:9f81:5100::/47
|
||||
2a06:9f81:5102::/48
|
||||
2a06:9f81:5400::/40
|
||||
2a06:a005:260::/43
|
||||
2a06:a005:280::/43
|
||||
2a06:a005:2a0::/44
|
||||
2a06:a005:486::/48
|
||||
2a06:a005:8d0::/47
|
||||
2a06:a005:8da::/48
|
||||
2a06:a005:9c0::/48
|
||||
2a06:a005:a13::/48
|
||||
2a06:a005:b69::/48
|
||||
2a06:a005:e80::/43
|
||||
2a06:a005:f80::/44
|
||||
2a06:a005:1340::/43
|
||||
@@ -1292,10 +1352,14 @@
|
||||
2a06:a005:13ea::/47
|
||||
2a06:a005:13ed::/48
|
||||
2a06:a005:13ef::/48
|
||||
2a06:a005:1520::/44
|
||||
2a06:a005:1800::/48
|
||||
2a06:a005:1b60::/47
|
||||
2a06:a005:1c40::/44
|
||||
2a06:a005:1ee1::/48
|
||||
2a06:a005:1ee9::/48
|
||||
2a06:a005:1eee::/48
|
||||
2a06:a005:2040::/44
|
||||
2a06:a005:2100::/44
|
||||
2a06:a005:28f3::/48
|
||||
2a06:a005:28f4::/48
|
||||
2a06:a005:2910::/44
|
||||
@@ -1306,12 +1370,32 @@
|
||||
2a06:a005:29d1::/48
|
||||
2a06:de00:de04::/48
|
||||
2a06:de00:de0e::/48
|
||||
2a06:de01:80f::/48
|
||||
2a06:de01:821::/48
|
||||
2a06:de01:854::/48
|
||||
2a06:de01:85f::/48
|
||||
2a06:de01:8a4::/48
|
||||
2a06:de01:8b8::/48
|
||||
2a06:de01:8c4::/48
|
||||
2a06:de01:8cb::/48
|
||||
2a06:de01:917::/48
|
||||
2a06:de01:92f::/48
|
||||
2a06:de01:944::/47
|
||||
2a06:de01:98c::/48
|
||||
2a06:de01:9a8::/48
|
||||
2a06:de01:acd::/48
|
||||
2a06:de01:af9::/48
|
||||
2a06:de01:b1a::/48
|
||||
2a06:de01:b32::/48
|
||||
2a06:e881:2509::/48
|
||||
2a06:e881:5501::/48
|
||||
2a06:e881:5502::/48
|
||||
2a06:e881:5506::/48
|
||||
2a06:e881:6600::/48
|
||||
2a06:e881:6602::/47
|
||||
2a06:e881:6606::/48
|
||||
2a07:54c1:2200::/47
|
||||
2a07:54c1:2202::/48
|
||||
2a09:b280:ff80::/48
|
||||
2a07:54c1:2200::/46
|
||||
2a09:b280:ff80::/47
|
||||
2a09:b280:ff83::/48
|
||||
2a09:b280:ff84::/47
|
||||
2a0a:2840:20::/43
|
||||
@@ -1338,25 +1422,40 @@
|
||||
2a0a:6040:5555::/48
|
||||
2a0a:6040:6607::/48
|
||||
2a0a:6040:6c40::/44
|
||||
2a0a:6040:7e00::/48
|
||||
2a0a:6040:a450::/47
|
||||
2a0a:6040:a740::/48
|
||||
2a0a:6040:a900::/47
|
||||
2a0a:6040:b770::/44
|
||||
2a0a:6040:c601::/48
|
||||
2a0a:6040:c700::/42
|
||||
2a0a:6040:c740::/47
|
||||
2a0a:6040:c742::/48
|
||||
2a0a:6040:c760::/47
|
||||
2a0a:6040:c770::/44
|
||||
2a0a:6040:c7a0::/48
|
||||
2a0a:6040:ce11::/48
|
||||
2a0a:6040:d310::/48
|
||||
2a0a:6040:d400::/47
|
||||
2a0a:6040:d600::/44
|
||||
2a0a:6040:d610::/48
|
||||
2a0a:6040:d612::/48
|
||||
2a0a:6040:d614::/47
|
||||
2a0a:6040:d617::/48
|
||||
2a0a:6040:d710::/44
|
||||
2a0a:6040:e300::/40
|
||||
2a0a:6040:e410::/48
|
||||
2a0a:6040:e541::/48
|
||||
2a0a:6040:e543::/48
|
||||
2a0a:6040:e544::/47
|
||||
2a0a:6040:e54c::/48
|
||||
2a0a:6040:e900::/40
|
||||
2a0a:6040:ec00::/40
|
||||
2a0a:6044:b800::/40
|
||||
2a0b:b86:ffe0::/48
|
||||
2a0b:b87:ffb5::/48
|
||||
2a0b:2542::/48
|
||||
2a0b:2542:300::/40
|
||||
2a0b:4340:30::/44
|
||||
2a0b:4340:70::/48
|
||||
2a0b:4340:90::/48
|
||||
@@ -1368,17 +1467,27 @@
|
||||
2a0b:4340:a0::/44
|
||||
2a0b:4340:c0::/44
|
||||
2a0b:4340:d8::/48
|
||||
2a0b:4340:400::/46
|
||||
2a0b:4340:404::/47
|
||||
2a0b:4340:406::/48
|
||||
2a0b:4340:434::/48
|
||||
2a0b:4340:560::/44
|
||||
2a0b:4340:1304::/48
|
||||
2a0b:4340:1340::/48
|
||||
2a0c:9a40:8cf0::/48
|
||||
2a0c:9a40:9e00::/43
|
||||
2a0c:b641:210::/47
|
||||
2a0c:b641:24f::/48
|
||||
2a0c:b641:510::/48
|
||||
2a0c:b641:570::/47
|
||||
2a0c:b641:730::/44
|
||||
2a0c:b641:a60::/44
|
||||
2a0c:b641:b21::/48
|
||||
2a0c:b642:4101::/48
|
||||
2a0c:b642:4102::/47
|
||||
2a0c:b642:4104::/46
|
||||
2a0d:2146:8040::/48
|
||||
2a0d:2406:510::/47
|
||||
2a0d:2406:512::/48
|
||||
2a0d:2580:ff00::/45
|
||||
2a0d:2580:ff08::/46
|
||||
2a0d:2581:fffc::/48
|
||||
@@ -1386,6 +1495,8 @@
|
||||
2a0d:2687::/32
|
||||
2a0d:2904::/44
|
||||
2a0d:c7c7::/32
|
||||
2a0e:800:ff00::/48
|
||||
2a0e:800:ff04::/48
|
||||
2a0e:800:ff20::/47
|
||||
2a0e:800:ff40::/42
|
||||
2a0e:15c0:6::/48
|
||||
@@ -1405,41 +1516,53 @@
|
||||
2a0e:aa06:440::/48
|
||||
2a0e:aa06:470::/44
|
||||
2a0e:aa06:490::/44
|
||||
2a0e:aa06:4e0::/44
|
||||
2a0e:aa06:500::/44
|
||||
2a0e:aa06:520::/48
|
||||
2a0e:aa06:525::/48
|
||||
2a0e:aa07:e00e::/48
|
||||
2a0e:aa07:e01b::/48
|
||||
2a0e:aa07:e024::/47
|
||||
2a0e:aa07:e027::/48
|
||||
2a0e:aa07:e030::/48
|
||||
2a0e:aa07:e035::/48
|
||||
2a0e:aa07:e039::/48
|
||||
2a0e:aa07:e043::/48
|
||||
2a0e:aa07:e050::/44
|
||||
2a0e:aa07:e060::/48
|
||||
2a0e:aa07:e071::/48
|
||||
2a0e:aa07:e0f1::/48
|
||||
2a0e:aa07:e0f7::/48
|
||||
2a0e:aa07:e120::/44
|
||||
2a0e:aa07:e130::/47
|
||||
2a0e:aa07:e140::/47
|
||||
2a0e:aa07:e143::/48
|
||||
2a0e:aa07:e145::/48
|
||||
2a0e:aa07:e146::/47
|
||||
2a0e:aa07:e146::/48
|
||||
2a0e:aa07:e148::/48
|
||||
2a0e:aa07:e16a::/48
|
||||
2a0e:aa07:e1a0::/46
|
||||
2a0e:aa07:e1b0::/47
|
||||
2a0e:aa07:e1b2::/48
|
||||
2a0e:aa07:e1b4::/47
|
||||
2a0e:aa07:e1b0::/44
|
||||
2a0e:aa07:e1e1::/48
|
||||
2a0e:aa07:e200::/44
|
||||
2a0e:aa07:f000::/48
|
||||
2a0e:aa07:f004::/48
|
||||
2a0e:aa07:f008::/48
|
||||
2a0e:aa07:f041::/48
|
||||
2a0e:aa07:f042::/48
|
||||
2a0e:aa07:f0d0::/48
|
||||
2a0e:aa07:f0d0::/47
|
||||
2a0e:aa07:f0d2::/48
|
||||
2a0e:aa07:f0d4::/47
|
||||
2a0e:aa07:f0d6::/48
|
||||
2a0e:aa07:f0d8::/45
|
||||
2a0e:aa07:f0e0::/44
|
||||
2a0e:b107:30::/48
|
||||
2a0e:b107:32::/47
|
||||
2a0e:b107:a0::/44
|
||||
2a0e:b107:12b::/48
|
||||
2a0e:b107:1c1::/48
|
||||
2a0e:b107:272::/48
|
||||
2a0e:b107:710::/48
|
||||
2a0e:b107:740::/44
|
||||
2a0e:b107:790::/45
|
||||
2a0e:b107:798::/46
|
||||
2a0e:b107:c10::/48
|
||||
2a0e:b107:da0::/44
|
||||
2a0e:b107:dce::/48
|
||||
@@ -1449,53 +1572,78 @@
|
||||
2a0e:b107:1a40::/46
|
||||
2a0e:b107:1b60::/48
|
||||
2a0e:b107:1b6e::/47
|
||||
2a0e:b107:1d25::/48
|
||||
2a0e:b107:1e85::/48
|
||||
2a0e:b107:2440::/44
|
||||
2a0f:1440::/29
|
||||
2a0f:2100::/29
|
||||
2a0f:5707:ac01::/48
|
||||
2a0f:5707:fe01::/48
|
||||
2a0f:5707:fff4::/47
|
||||
2a0f:5707:fff5::/48
|
||||
2a0f:7802:e104::/47
|
||||
2a0f:7802:e110::/47
|
||||
2a0f:7802:e120::/44
|
||||
2a0f:7802:e138::/45
|
||||
2a0f:7802:e140::/46
|
||||
2a0f:7803:dd00::/41
|
||||
2a0f:7803:dd80::/42
|
||||
2a0f:7803:f970::/44
|
||||
2a0f:7803:fa21::/48
|
||||
2a0f:7803:fa22::/47
|
||||
2a0f:7803:fc00::/43
|
||||
2a0f:7803:fc20::/44
|
||||
2a0f:7803:fc80::/44
|
||||
2a0f:7803:fcc0::/44
|
||||
2a0f:7803:fcaa::/48
|
||||
2a0f:7803:fe21::/48
|
||||
2a0f:7803:fe22::/48
|
||||
2a0f:7803:fe24::/48
|
||||
2a0f:7803:fe80::/47
|
||||
2a0f:7803:fe82::/48
|
||||
2a0f:7803:fe84::/48
|
||||
2a0f:7803:ff10::/48
|
||||
2a0f:7980::/44
|
||||
2a0f:85c1:100::/48
|
||||
2a0f:85c1:3b5::/48
|
||||
2a0f:85c1:816::/48
|
||||
2a0f:9400:6110::/48
|
||||
2a0f:9400:8016::/48
|
||||
2a0f:9400:7700::/48
|
||||
2a0f:9b00::/29
|
||||
2a0f:e401:133::/48
|
||||
2a10:2f00:13a::/48
|
||||
2a10:2f00:147::/48
|
||||
2a10:2f00:15a::/48
|
||||
2a10:2f00:18e::/48
|
||||
2a10:2f01:100::/48
|
||||
2a10:3440::/29
|
||||
2a10:cc40:180::/47
|
||||
2a10:cc40:188::/48
|
||||
2a10:cc40:190::/48
|
||||
2a10:cc42:120::/43
|
||||
2a10:ccc0:cc1::/48
|
||||
2a10:ccc0:cc2::/48
|
||||
2a10:ccc0:ccc::/48
|
||||
2a10:ccc0:c0c3::/48
|
||||
2a10:ccc0:ccc6::/48
|
||||
2a10:ccc0:cccc::/46
|
||||
2a11:f2c0:ffc4::/48
|
||||
2a12:3fc2:6600::/48
|
||||
2a12:3fc2:6666::/48
|
||||
2a12:3fc2:aa10::/44
|
||||
2a12:3fc2:aa40::/44
|
||||
2a12:3fc2:ab50::/48
|
||||
2a12:3fc2:e72e::/48
|
||||
2a12:3fc2:e810::/44
|
||||
2a12:3fc7::/48
|
||||
2a12:3fc7:8000::/48
|
||||
2a12:dd47:5c00::/40
|
||||
2a12:f8c0:1000::/40
|
||||
2a12:f8c3::/36
|
||||
2a13:1800::/48
|
||||
2a13:1800:10::/48
|
||||
2a13:1800:80::/44
|
||||
2a13:1800:300::/44
|
||||
2a13:1801:180::/43
|
||||
2a13:1802::/43
|
||||
2a13:a5c3:f000::/40
|
||||
2a13:a5c4:1000::/38
|
||||
2a13:a5c4:1400::/39
|
||||
2a13:a5c5::/48
|
||||
2a13:a5c7:1200::/40
|
||||
2a13:a5c7:1500::/40
|
||||
2a13:a5c7:1600::/45
|
||||
@@ -1505,30 +1653,39 @@
|
||||
2a13:a5c7:1801::/48
|
||||
2a13:a5c7:1802::/47
|
||||
2a13:a5c7:1804::/47
|
||||
2a13:a5c7:1888::/48
|
||||
2a13:a5c7:2102::/47
|
||||
2a13:a5c7:2104::/48
|
||||
2a13:a5c7:2106::/48
|
||||
2a13:a5c7:2109::/48
|
||||
2a13:a5c7:2200::/40
|
||||
2a13:aac4:f000::/44
|
||||
2a13:b487:11da::/48
|
||||
2a13:b487:1200::/43
|
||||
2a13:b487:1ba2::/48
|
||||
2a13:b487:1ba6::/47
|
||||
2a13:b487:1bb2::/47
|
||||
2a13:b487:1200::/44
|
||||
2a13:b487:1bb2::/48
|
||||
2a13:b487:1bba::/47
|
||||
2a13:b487:1bc0::/47
|
||||
2a13:b487:1bff::/48
|
||||
2a13:b487:1f02::/47
|
||||
2a13:b487:1f04::/46
|
||||
2a13:df80:3b00::/44
|
||||
2a13:df80:3b11::/48
|
||||
2a13:df85:a201::/48
|
||||
2a13:df85:a202::/47
|
||||
2a13:df85:a204::/48
|
||||
2a13:df85:a2ff::/48
|
||||
2a13:df85:be10::/48
|
||||
2a13:df85:be80::/48
|
||||
2a13:df85:be88::/48
|
||||
2a13:df85:be90::/48
|
||||
2a13:df85:beaa::/48
|
||||
2a13:df85:bed0::/48
|
||||
2a13:df85:bedc::/48
|
||||
2a13:df85:befe::/48
|
||||
2a14:7c0:4a01::/48
|
||||
2a14:7c0:4d00::/40
|
||||
2a14:4c41::/32
|
||||
2a14:7581:ffb::/48
|
||||
2a14:7581:ffc::/48
|
||||
2a14:7583::/32
|
||||
2a14:7586::/31
|
||||
2c0f:f7a8:8011::/48
|
||||
2c0f:f7a8:8050::/48
|
||||
2c0f:f7a8:805f::/48
|
||||
|
||||
@@ -1 +1 @@
|
||||
20240602150004
|
||||
20240708150024
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
202406062209
|
||||
202407102210
|
||||
|
||||
@@ -3177,6 +3177,7 @@ liangzhichuanmei.com
|
||||
lianyue.net
|
||||
liaowangxizang.net
|
||||
liberal.org.hk
|
||||
libertysculpturepark.com
|
||||
libertytimes.com.tw
|
||||
library.usc.cuhk.edu.hk
|
||||
libredd.it
|
||||
@@ -5846,6 +5847,7 @@ wqyd.org
|
||||
wrchina.org
|
||||
wretch.cc
|
||||
writer.zoho.com
|
||||
writesonic.com
|
||||
wsj.com
|
||||
wsj.net
|
||||
wsjhk.com
|
||||
|
||||
@@ -1 +1 @@
|
||||
202406062209
|
||||
202407102210
|
||||
|
||||
@@ -146,7 +146,7 @@ uci.foreach(uciconfig, uciserver, (cfg) => {
|
||||
max_time_difference: cfg.tls_reality_max_time_difference ? (cfg.max_time_difference + 's') : null,
|
||||
handshake: {
|
||||
server: cfg.tls_reality_server_addr,
|
||||
server_port: cfg.tls_reality_server_port
|
||||
server_port: strToInt(cfg.tls_reality_server_port)
|
||||
}
|
||||
} : null
|
||||
} : null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
20240602150004
|
||||
20240708150024
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
2001:254::/31
|
||||
2001:256:100::/48
|
||||
2001:550:1601::/48
|
||||
2001:67c:aec::/48
|
||||
2001:67c:c28::/48
|
||||
2001:7fa:5::/48
|
||||
2001:c68::/32
|
||||
@@ -9,8 +10,7 @@
|
||||
2001:da8::/32
|
||||
2001:daa:1::/48
|
||||
2001:daa:2::/47
|
||||
2001:daa:4::/47
|
||||
2001:daa:6::/48
|
||||
2001:daa:4::/48
|
||||
2001:dc7::/32
|
||||
2001:dd8:1::/48
|
||||
2001:dd8:5::/48
|
||||
@@ -34,11 +34,12 @@
|
||||
2400:5400:10::/48
|
||||
2400:5a60:2::/48
|
||||
2400:5a60:100::/48
|
||||
2400:5f60::/32
|
||||
2400:6000::/32
|
||||
2400:6460::/40
|
||||
2400:6600::/32
|
||||
2400:6e60:1301::/48
|
||||
2400:73e0::/32
|
||||
2400:73e0:201::/48
|
||||
2400:75aa::/32
|
||||
2400:7bc0:20::/43
|
||||
2400:7fc0::/40
|
||||
@@ -101,17 +102,22 @@
|
||||
2400:9520:434::/48
|
||||
2400:95e0::/48
|
||||
2400:9600:8800::/48
|
||||
2400:9620::/32
|
||||
2400:a040::/32
|
||||
2400:a980::/29
|
||||
2400:ae00:1981::/48
|
||||
2400:b200::/32
|
||||
2400:b600::/32
|
||||
2400:b700::/48
|
||||
2400:be00::/48
|
||||
2400:cb80:e30::/44
|
||||
2400:cb80:e40::/44
|
||||
2400:da00::/32
|
||||
2400:dd00::/28
|
||||
2400:e3e0:aaa0::/44
|
||||
2400:e3e0:abb0::/44
|
||||
2400:ebc0::/32
|
||||
2400:ed60::/48
|
||||
2400:ee00::/32
|
||||
2400:f6e0::/32
|
||||
2400:f720::/32
|
||||
@@ -127,7 +133,6 @@
|
||||
2401:11a0:1500::/40
|
||||
2401:11a0:d150::/48
|
||||
2401:11a0:d152::/48
|
||||
2401:11a0:d158::/48
|
||||
2401:1200::/48
|
||||
2401:1320::/32
|
||||
2401:1740:2000::/48
|
||||
@@ -159,9 +164,11 @@
|
||||
2401:4a80::/32
|
||||
2401:5960:5960::/48
|
||||
2401:70e0::/32
|
||||
2401:71c0::/48
|
||||
2401:7700::/32
|
||||
2401:7d40::/32
|
||||
2401:7e00::/32
|
||||
2401:8be0::/48
|
||||
2401:8d00::/46
|
||||
2401:8d00:7::/48
|
||||
2401:8d00:8::/47
|
||||
@@ -171,6 +178,9 @@
|
||||
2401:8d00:10::/48
|
||||
2401:8d00:12::/48
|
||||
2401:8d00:14::/48
|
||||
2401:8da0::/48
|
||||
2401:95c0:f001::/48
|
||||
2401:9ca0::/48
|
||||
2401:a140:1::/48
|
||||
2401:b180::/32
|
||||
2401:b400::/45
|
||||
@@ -208,7 +218,9 @@
|
||||
2402:6f40:2::/47
|
||||
2402:6fc0::/48
|
||||
2402:7040::/32
|
||||
2402:7240::/36
|
||||
2402:7240:2000::/36
|
||||
2402:7740:2000::/36
|
||||
2402:7740:a000::/36
|
||||
2402:7d80::/32
|
||||
2402:8bc0::/32
|
||||
2402:8cc0::/40
|
||||
@@ -218,7 +230,7 @@
|
||||
2402:93c0:20::/48
|
||||
2402:93c0:100::/48
|
||||
2402:9a80::/32
|
||||
2402:9e80:60::/48
|
||||
2402:9b80:10::/48
|
||||
2402:a200::/32
|
||||
2402:b8c0::/32
|
||||
2402:b940::/40
|
||||
@@ -246,7 +258,7 @@
|
||||
2403:1ec0:1200::/48
|
||||
2403:1ec0:1400::/48
|
||||
2403:1ec0:1610::/48
|
||||
2403:2040::/32
|
||||
2403:2040::/48
|
||||
2403:27c0:c03::/48
|
||||
2403:27c0:1000::/48
|
||||
2403:2b40::/32
|
||||
@@ -255,6 +267,7 @@
|
||||
2403:4280::/47
|
||||
2403:4b40::/32
|
||||
2403:4c80::/48
|
||||
2403:4c80:128::/48
|
||||
2403:5c80::/48
|
||||
2403:6380:14::/47
|
||||
2403:6380:20::/44
|
||||
@@ -287,11 +300,12 @@
|
||||
2404:bc0:4f00::/43
|
||||
2404:1c80::/32
|
||||
2404:2280:106::/47
|
||||
2404:2280:10b::/48
|
||||
2404:2280:10d::/48
|
||||
2404:2280:10f::/48
|
||||
2404:2280:112::/47
|
||||
2404:2280:115::/48
|
||||
2404:2280:11b::/48
|
||||
2404:2280:11a::/47
|
||||
2404:2280:11c::/47
|
||||
2404:2280:11e::/48
|
||||
2404:2280:123::/48
|
||||
@@ -320,8 +334,7 @@
|
||||
2404:2280:1bf::/48
|
||||
2404:2280:1c1::/48
|
||||
2404:2280:1c2::/47
|
||||
2404:2280:1c4::/47
|
||||
2404:2280:1c7::/48
|
||||
2404:2280:1c4::/46
|
||||
2404:2280:1c8::/48
|
||||
2404:2280:1cb::/48
|
||||
2404:2280:1cc::/48
|
||||
@@ -333,8 +346,7 @@
|
||||
2404:2280:1e0::/48
|
||||
2404:2280:1e2::/47
|
||||
2404:2280:1e4::/46
|
||||
2404:2280:1e8::/48
|
||||
2404:2280:1ea::/48
|
||||
2404:2280:1e8::/46
|
||||
2404:2280:1ec::/47
|
||||
2404:2280:1ee::/48
|
||||
2404:2280:1f0::/45
|
||||
@@ -375,7 +387,6 @@
|
||||
2404:c940::/48
|
||||
2404:d7c0:2::/48
|
||||
2404:e280::/47
|
||||
2404:e5c0::/32
|
||||
2404:e8c0::/32
|
||||
2404:ea80:500:575::/64
|
||||
2404:ea80:600:623::/64
|
||||
@@ -396,6 +407,7 @@
|
||||
2405:3140:31::/48
|
||||
2405:3140:3a::/48
|
||||
2405:3bc0::/48
|
||||
2405:4540:8000::/48
|
||||
2405:57c0::/47
|
||||
2405:57c0:100::/48
|
||||
2405:66c0::/32
|
||||
@@ -432,11 +444,14 @@
|
||||
2406:840:110::/48
|
||||
2406:840:180::/48
|
||||
2406:840:1c0::/48
|
||||
2406:840:2e0::/48
|
||||
2406:840:301::/48
|
||||
2406:840:302::/48
|
||||
2406:840:3c1::/48
|
||||
2406:840:410::/48
|
||||
2406:840:420::/48
|
||||
2406:840:480::/48
|
||||
2406:840:540::/48
|
||||
2406:840:680::/48
|
||||
2406:840:801::/48
|
||||
2406:840:802::/47
|
||||
@@ -468,26 +483,31 @@
|
||||
2406:840:9700::/40
|
||||
2406:840:9801::/48
|
||||
2406:840:9810::/48
|
||||
2406:840:981a::/48
|
||||
2406:840:981c::/46
|
||||
2406:840:9960::/47
|
||||
2406:840:9962::/48
|
||||
2406:840:9969::/48
|
||||
2406:840:996f::/48
|
||||
2406:840:9980::/48
|
||||
2406:840:9984::/48
|
||||
2406:840:9ef0::/44
|
||||
2406:840:c0a8::/48
|
||||
2406:840:e010::/47
|
||||
2406:840:e014::/46
|
||||
2406:840:e018::/45
|
||||
2406:840:e030::/47
|
||||
2406:840:e033::/48
|
||||
2406:840:e03f::/48
|
||||
2406:840:e080::/44
|
||||
2406:840:e0c1::/48
|
||||
2406:840:e0cf::/48
|
||||
2406:840:e0e0::/44
|
||||
2406:840:e10f::/48
|
||||
2406:840:e14f::/48
|
||||
2406:840:e180::/44
|
||||
2406:840:e20f::/48
|
||||
2406:840:e230::/48
|
||||
2406:840:e230::/47
|
||||
2406:840:e232::/48
|
||||
2406:840:e234::/48
|
||||
2406:840:e270::/44
|
||||
2406:840:e300::/47
|
||||
2406:840:e302::/48
|
||||
@@ -510,7 +530,6 @@
|
||||
2406:840:e84f::/48
|
||||
2406:840:e880::/44
|
||||
2406:840:eab0::/46
|
||||
2406:840:eab4::/48
|
||||
2406:840:eab6::/48
|
||||
2406:840:eb00::/46
|
||||
2406:840:eb04::/47
|
||||
@@ -521,9 +540,12 @@
|
||||
2406:840:eb80::/42
|
||||
2406:840:ed02::/48
|
||||
2406:840:eed0::/44
|
||||
2406:840:efa0::/44
|
||||
2406:840:eee0::/44
|
||||
2406:840:f0a1::/48
|
||||
2406:840:f0aa::/48
|
||||
2406:840:f100::/47
|
||||
2406:840:f200::/47
|
||||
2406:840:f203::/48
|
||||
2406:840:f230::/44
|
||||
2406:840:f380::/44
|
||||
2406:840:f401::/48
|
||||
@@ -536,23 +558,33 @@
|
||||
2406:840:fa01::/48
|
||||
2406:840:fa02::/47
|
||||
2406:840:fa04::/48
|
||||
2406:840:fa40::/48
|
||||
2406:840:fc80::/45
|
||||
2406:840:fc88::/46
|
||||
2406:840:fc8c::/47
|
||||
2406:840:fc8e::/48
|
||||
2406:840:fcc0::/44
|
||||
2406:840:fd00::/47
|
||||
2406:840:fd03::/48
|
||||
2406:840:fd1f::/48
|
||||
2406:840:fdd0::/47
|
||||
2406:840:fd90::/44
|
||||
2406:840:fda0::/43
|
||||
2406:840:fdc0::/44
|
||||
2406:840:fdd1::/48
|
||||
2406:840:fde0::/48
|
||||
2406:840:fe27::/48
|
||||
2406:840:fe50::/48
|
||||
2406:840:fe60::/48
|
||||
2406:840:fe72::/47
|
||||
2406:840:fe90::/46
|
||||
2406:840:fec0::/47
|
||||
2406:840:fec4::/47
|
||||
2406:840:fec3::/48
|
||||
2406:840:fec4::/46
|
||||
2406:840:fec8::/45
|
||||
2406:840:fed1::/48
|
||||
2406:840:fed2::/47
|
||||
2406:840:fed4::/46
|
||||
2406:840:fed8::/47
|
||||
2406:840:feda::/48
|
||||
2406:840:fed8::/46
|
||||
2406:840:fedd::/48
|
||||
2406:840:fede::/47
|
||||
2406:840:feed::/48
|
||||
@@ -568,7 +600,8 @@
|
||||
2406:3340::/32
|
||||
2406:3640:1::/48
|
||||
2406:3d80::/32
|
||||
2406:4440:f000::/44
|
||||
2406:4440:f000::/48
|
||||
2406:4440:f00f::/48
|
||||
2406:4d00::/48
|
||||
2406:52c0::/32
|
||||
2406:5340:6666::/48
|
||||
@@ -583,6 +616,8 @@
|
||||
2406:d440:100::/44
|
||||
2406:d440:200::/44
|
||||
2406:d440:300::/44
|
||||
2406:d440:ff00::/48
|
||||
2406:d440:ffff::/48
|
||||
2406:e3c0::/32
|
||||
2406:e500::/33
|
||||
2407:2840::/48
|
||||
@@ -608,6 +643,7 @@
|
||||
2407:c080:5000::/37
|
||||
2407:c080:6000::/36
|
||||
2407:c080:8000::/36
|
||||
2407:d9c0::/32
|
||||
2408:4000::/22
|
||||
2408:8000::/48
|
||||
2408:8000:2::/47
|
||||
@@ -1085,8 +1121,6 @@
|
||||
2408:8a05:8000::/36
|
||||
2408:8a06::/47
|
||||
2408:8a06:100::/47
|
||||
2408:8a07:6000::/38
|
||||
2408:8a07:6400::/40
|
||||
2408:8a21:4000::/35
|
||||
2408:8a22:9200::/39
|
||||
2408:8a22:9400::/38
|
||||
@@ -1141,7 +1175,7 @@
|
||||
240a:40c3:c200::/48
|
||||
240a:40c3:c240::/48
|
||||
240a:4172::/31
|
||||
240a:41b0::/31
|
||||
240a:41b0::/34
|
||||
240a:41f2::/31
|
||||
240a:4242::/31
|
||||
240a:4280::/26
|
||||
@@ -1166,7 +1200,7 @@
|
||||
240d:c000:6000::/36
|
||||
240d:c000:7000::/44
|
||||
240d:c000:f000::/44
|
||||
240d:c000:f020::/44
|
||||
240d:c000:f020::/43
|
||||
240d:c010::/47
|
||||
240d:c010:14::/48
|
||||
240d:c010:16::/48
|
||||
@@ -1179,6 +1213,7 @@
|
||||
240d:c010:6c::/48
|
||||
240d:c040::/44
|
||||
240e::/20
|
||||
2601:1d08:4000::/44
|
||||
2602:2a3::/48
|
||||
2602:2a4:ff::/48
|
||||
2602:2c3:810::/44
|
||||
@@ -1191,19 +1226,31 @@
|
||||
2602:fa4f:600::/40
|
||||
2602:fab0:11::/48
|
||||
2602:fbda:600::/48
|
||||
2602:fbda:610::/48
|
||||
2602:fbda:660::/48
|
||||
2602:fbda:666::/48
|
||||
2602:fc52:311::/48
|
||||
2602:fc52:315::/48
|
||||
2602:fd92:801::/48
|
||||
2602:fe69:f26::/47
|
||||
2602:fed2:7020::/46
|
||||
2602:fed2:7101::/48
|
||||
2602:fed2:731d::/48
|
||||
2602:feda:182::/47
|
||||
2602:feda:1bf::/48
|
||||
2602:feda:1d1::/48
|
||||
2602:feda:1d2::/48
|
||||
2602:feda:2a0::/46
|
||||
2602:feda:2a4::/47
|
||||
2602:feda:2a6::/48
|
||||
2602:feda:2aa::/48
|
||||
2602:feda:2af::/48
|
||||
2602:feda:2d0::/47
|
||||
2602:feda:2f0::/48
|
||||
2602:feda:3c5::/48
|
||||
2602:feda:b8f::/48
|
||||
2602:feda:c34::/48
|
||||
2602:feda:ca1::/48
|
||||
2602:feda:d80::/48
|
||||
2602:feda:d83::/48
|
||||
2602:ffe4:c5f::/48
|
||||
@@ -1222,8 +1269,11 @@
|
||||
2605:9d80:9052::/48
|
||||
2605:9d80:9071::/48
|
||||
2605:9d80:9092::/48
|
||||
2605:f440:cafe::/48
|
||||
2620:57:4004::/47
|
||||
2804:1e48::/32
|
||||
2a03:5840:f3::/48
|
||||
2a03:5840:11b::/48
|
||||
2a03:5840:290::/48
|
||||
2a04:3e00:1002::/48
|
||||
2a04:f580:8010::/47
|
||||
@@ -1256,7 +1306,11 @@
|
||||
2a04:f580:9290::/48
|
||||
2a05:1085::/32
|
||||
2a05:1087::/32
|
||||
2a05:dfc1:1600::/40
|
||||
2a05:4140:66::/48
|
||||
2a05:dfc1:1600::/48
|
||||
2a05:dfc1:1604::/48
|
||||
2a05:dfc1:1607::/48
|
||||
2a05:dfc1:1608::/48
|
||||
2a05:dfc1:7106::/47
|
||||
2a05:dfc1:7108::/47
|
||||
2a05:dfc1:7110::/48
|
||||
@@ -1271,17 +1325,23 @@
|
||||
2a05:dfc1:8c22::/48
|
||||
2a05:dfc1:8c24::/48
|
||||
2a05:dfc1:8c42::/48
|
||||
2a05:dfc1:8c90::/46
|
||||
2a05:dfc1:8c94::/47
|
||||
2a05:dfc1:8d00::/48
|
||||
2a05:dfc1:8c90::/45
|
||||
2a05:dfc1:8d02::/48
|
||||
2a06:3600::/29
|
||||
2a06:9f81:4610::/44
|
||||
2a06:9f81:4620::/44
|
||||
2a06:9f81:4640::/43
|
||||
2a06:9f81:5100::/47
|
||||
2a06:9f81:5102::/48
|
||||
2a06:9f81:5400::/40
|
||||
2a06:a005:260::/43
|
||||
2a06:a005:280::/43
|
||||
2a06:a005:2a0::/44
|
||||
2a06:a005:486::/48
|
||||
2a06:a005:8d0::/47
|
||||
2a06:a005:8da::/48
|
||||
2a06:a005:9c0::/48
|
||||
2a06:a005:a13::/48
|
||||
2a06:a005:b69::/48
|
||||
2a06:a005:e80::/43
|
||||
2a06:a005:f80::/44
|
||||
2a06:a005:1340::/43
|
||||
@@ -1292,10 +1352,14 @@
|
||||
2a06:a005:13ea::/47
|
||||
2a06:a005:13ed::/48
|
||||
2a06:a005:13ef::/48
|
||||
2a06:a005:1520::/44
|
||||
2a06:a005:1800::/48
|
||||
2a06:a005:1b60::/47
|
||||
2a06:a005:1c40::/44
|
||||
2a06:a005:1ee1::/48
|
||||
2a06:a005:1ee9::/48
|
||||
2a06:a005:1eee::/48
|
||||
2a06:a005:2040::/44
|
||||
2a06:a005:2100::/44
|
||||
2a06:a005:28f3::/48
|
||||
2a06:a005:28f4::/48
|
||||
2a06:a005:2910::/44
|
||||
@@ -1306,12 +1370,32 @@
|
||||
2a06:a005:29d1::/48
|
||||
2a06:de00:de04::/48
|
||||
2a06:de00:de0e::/48
|
||||
2a06:de01:80f::/48
|
||||
2a06:de01:821::/48
|
||||
2a06:de01:854::/48
|
||||
2a06:de01:85f::/48
|
||||
2a06:de01:8a4::/48
|
||||
2a06:de01:8b8::/48
|
||||
2a06:de01:8c4::/48
|
||||
2a06:de01:8cb::/48
|
||||
2a06:de01:917::/48
|
||||
2a06:de01:92f::/48
|
||||
2a06:de01:944::/47
|
||||
2a06:de01:98c::/48
|
||||
2a06:de01:9a8::/48
|
||||
2a06:de01:acd::/48
|
||||
2a06:de01:af9::/48
|
||||
2a06:de01:b1a::/48
|
||||
2a06:de01:b32::/48
|
||||
2a06:e881:2509::/48
|
||||
2a06:e881:5501::/48
|
||||
2a06:e881:5502::/48
|
||||
2a06:e881:5506::/48
|
||||
2a06:e881:6600::/48
|
||||
2a06:e881:6602::/47
|
||||
2a06:e881:6606::/48
|
||||
2a07:54c1:2200::/47
|
||||
2a07:54c1:2202::/48
|
||||
2a09:b280:ff80::/48
|
||||
2a07:54c1:2200::/46
|
||||
2a09:b280:ff80::/47
|
||||
2a09:b280:ff83::/48
|
||||
2a09:b280:ff84::/47
|
||||
2a0a:2840:20::/43
|
||||
@@ -1338,25 +1422,40 @@
|
||||
2a0a:6040:5555::/48
|
||||
2a0a:6040:6607::/48
|
||||
2a0a:6040:6c40::/44
|
||||
2a0a:6040:7e00::/48
|
||||
2a0a:6040:a450::/47
|
||||
2a0a:6040:a740::/48
|
||||
2a0a:6040:a900::/47
|
||||
2a0a:6040:b770::/44
|
||||
2a0a:6040:c601::/48
|
||||
2a0a:6040:c700::/42
|
||||
2a0a:6040:c740::/47
|
||||
2a0a:6040:c742::/48
|
||||
2a0a:6040:c760::/47
|
||||
2a0a:6040:c770::/44
|
||||
2a0a:6040:c7a0::/48
|
||||
2a0a:6040:ce11::/48
|
||||
2a0a:6040:d310::/48
|
||||
2a0a:6040:d400::/47
|
||||
2a0a:6040:d600::/44
|
||||
2a0a:6040:d610::/48
|
||||
2a0a:6040:d612::/48
|
||||
2a0a:6040:d614::/47
|
||||
2a0a:6040:d617::/48
|
||||
2a0a:6040:d710::/44
|
||||
2a0a:6040:e300::/40
|
||||
2a0a:6040:e410::/48
|
||||
2a0a:6040:e541::/48
|
||||
2a0a:6040:e543::/48
|
||||
2a0a:6040:e544::/47
|
||||
2a0a:6040:e54c::/48
|
||||
2a0a:6040:e900::/40
|
||||
2a0a:6040:ec00::/40
|
||||
2a0a:6044:b800::/40
|
||||
2a0b:b86:ffe0::/48
|
||||
2a0b:b87:ffb5::/48
|
||||
2a0b:2542::/48
|
||||
2a0b:2542:300::/40
|
||||
2a0b:4340:30::/44
|
||||
2a0b:4340:70::/48
|
||||
2a0b:4340:90::/48
|
||||
@@ -1368,17 +1467,27 @@
|
||||
2a0b:4340:a0::/44
|
||||
2a0b:4340:c0::/44
|
||||
2a0b:4340:d8::/48
|
||||
2a0b:4340:400::/46
|
||||
2a0b:4340:404::/47
|
||||
2a0b:4340:406::/48
|
||||
2a0b:4340:434::/48
|
||||
2a0b:4340:560::/44
|
||||
2a0b:4340:1304::/48
|
||||
2a0b:4340:1340::/48
|
||||
2a0c:9a40:8cf0::/48
|
||||
2a0c:9a40:9e00::/43
|
||||
2a0c:b641:210::/47
|
||||
2a0c:b641:24f::/48
|
||||
2a0c:b641:510::/48
|
||||
2a0c:b641:570::/47
|
||||
2a0c:b641:730::/44
|
||||
2a0c:b641:a60::/44
|
||||
2a0c:b641:b21::/48
|
||||
2a0c:b642:4101::/48
|
||||
2a0c:b642:4102::/47
|
||||
2a0c:b642:4104::/46
|
||||
2a0d:2146:8040::/48
|
||||
2a0d:2406:510::/47
|
||||
2a0d:2406:512::/48
|
||||
2a0d:2580:ff00::/45
|
||||
2a0d:2580:ff08::/46
|
||||
2a0d:2581:fffc::/48
|
||||
@@ -1386,6 +1495,8 @@
|
||||
2a0d:2687::/32
|
||||
2a0d:2904::/44
|
||||
2a0d:c7c7::/32
|
||||
2a0e:800:ff00::/48
|
||||
2a0e:800:ff04::/48
|
||||
2a0e:800:ff20::/47
|
||||
2a0e:800:ff40::/42
|
||||
2a0e:15c0:6::/48
|
||||
@@ -1405,41 +1516,53 @@
|
||||
2a0e:aa06:440::/48
|
||||
2a0e:aa06:470::/44
|
||||
2a0e:aa06:490::/44
|
||||
2a0e:aa06:4e0::/44
|
||||
2a0e:aa06:500::/44
|
||||
2a0e:aa06:520::/48
|
||||
2a0e:aa06:525::/48
|
||||
2a0e:aa07:e00e::/48
|
||||
2a0e:aa07:e01b::/48
|
||||
2a0e:aa07:e024::/47
|
||||
2a0e:aa07:e027::/48
|
||||
2a0e:aa07:e030::/48
|
||||
2a0e:aa07:e035::/48
|
||||
2a0e:aa07:e039::/48
|
||||
2a0e:aa07:e043::/48
|
||||
2a0e:aa07:e050::/44
|
||||
2a0e:aa07:e060::/48
|
||||
2a0e:aa07:e071::/48
|
||||
2a0e:aa07:e0f1::/48
|
||||
2a0e:aa07:e0f7::/48
|
||||
2a0e:aa07:e120::/44
|
||||
2a0e:aa07:e130::/47
|
||||
2a0e:aa07:e140::/47
|
||||
2a0e:aa07:e143::/48
|
||||
2a0e:aa07:e145::/48
|
||||
2a0e:aa07:e146::/47
|
||||
2a0e:aa07:e146::/48
|
||||
2a0e:aa07:e148::/48
|
||||
2a0e:aa07:e16a::/48
|
||||
2a0e:aa07:e1a0::/46
|
||||
2a0e:aa07:e1b0::/47
|
||||
2a0e:aa07:e1b2::/48
|
||||
2a0e:aa07:e1b4::/47
|
||||
2a0e:aa07:e1b0::/44
|
||||
2a0e:aa07:e1e1::/48
|
||||
2a0e:aa07:e200::/44
|
||||
2a0e:aa07:f000::/48
|
||||
2a0e:aa07:f004::/48
|
||||
2a0e:aa07:f008::/48
|
||||
2a0e:aa07:f041::/48
|
||||
2a0e:aa07:f042::/48
|
||||
2a0e:aa07:f0d0::/48
|
||||
2a0e:aa07:f0d0::/47
|
||||
2a0e:aa07:f0d2::/48
|
||||
2a0e:aa07:f0d4::/47
|
||||
2a0e:aa07:f0d6::/48
|
||||
2a0e:aa07:f0d8::/45
|
||||
2a0e:aa07:f0e0::/44
|
||||
2a0e:b107:30::/48
|
||||
2a0e:b107:32::/47
|
||||
2a0e:b107:a0::/44
|
||||
2a0e:b107:12b::/48
|
||||
2a0e:b107:1c1::/48
|
||||
2a0e:b107:272::/48
|
||||
2a0e:b107:710::/48
|
||||
2a0e:b107:740::/44
|
||||
2a0e:b107:790::/45
|
||||
2a0e:b107:798::/46
|
||||
2a0e:b107:c10::/48
|
||||
2a0e:b107:da0::/44
|
||||
2a0e:b107:dce::/48
|
||||
@@ -1449,53 +1572,78 @@
|
||||
2a0e:b107:1a40::/46
|
||||
2a0e:b107:1b60::/48
|
||||
2a0e:b107:1b6e::/47
|
||||
2a0e:b107:1d25::/48
|
||||
2a0e:b107:1e85::/48
|
||||
2a0e:b107:2440::/44
|
||||
2a0f:1440::/29
|
||||
2a0f:2100::/29
|
||||
2a0f:5707:ac01::/48
|
||||
2a0f:5707:fe01::/48
|
||||
2a0f:5707:fff4::/47
|
||||
2a0f:5707:fff5::/48
|
||||
2a0f:7802:e104::/47
|
||||
2a0f:7802:e110::/47
|
||||
2a0f:7802:e120::/44
|
||||
2a0f:7802:e138::/45
|
||||
2a0f:7802:e140::/46
|
||||
2a0f:7803:dd00::/41
|
||||
2a0f:7803:dd80::/42
|
||||
2a0f:7803:f970::/44
|
||||
2a0f:7803:fa21::/48
|
||||
2a0f:7803:fa22::/47
|
||||
2a0f:7803:fc00::/43
|
||||
2a0f:7803:fc20::/44
|
||||
2a0f:7803:fc80::/44
|
||||
2a0f:7803:fcc0::/44
|
||||
2a0f:7803:fcaa::/48
|
||||
2a0f:7803:fe21::/48
|
||||
2a0f:7803:fe22::/48
|
||||
2a0f:7803:fe24::/48
|
||||
2a0f:7803:fe80::/47
|
||||
2a0f:7803:fe82::/48
|
||||
2a0f:7803:fe84::/48
|
||||
2a0f:7803:ff10::/48
|
||||
2a0f:7980::/44
|
||||
2a0f:85c1:100::/48
|
||||
2a0f:85c1:3b5::/48
|
||||
2a0f:85c1:816::/48
|
||||
2a0f:9400:6110::/48
|
||||
2a0f:9400:8016::/48
|
||||
2a0f:9400:7700::/48
|
||||
2a0f:9b00::/29
|
||||
2a0f:e401:133::/48
|
||||
2a10:2f00:13a::/48
|
||||
2a10:2f00:147::/48
|
||||
2a10:2f00:15a::/48
|
||||
2a10:2f00:18e::/48
|
||||
2a10:2f01:100::/48
|
||||
2a10:3440::/29
|
||||
2a10:cc40:180::/47
|
||||
2a10:cc40:188::/48
|
||||
2a10:cc40:190::/48
|
||||
2a10:cc42:120::/43
|
||||
2a10:ccc0:cc1::/48
|
||||
2a10:ccc0:cc2::/48
|
||||
2a10:ccc0:ccc::/48
|
||||
2a10:ccc0:c0c3::/48
|
||||
2a10:ccc0:ccc6::/48
|
||||
2a10:ccc0:cccc::/46
|
||||
2a11:f2c0:ffc4::/48
|
||||
2a12:3fc2:6600::/48
|
||||
2a12:3fc2:6666::/48
|
||||
2a12:3fc2:aa10::/44
|
||||
2a12:3fc2:aa40::/44
|
||||
2a12:3fc2:ab50::/48
|
||||
2a12:3fc2:e72e::/48
|
||||
2a12:3fc2:e810::/44
|
||||
2a12:3fc7::/48
|
||||
2a12:3fc7:8000::/48
|
||||
2a12:dd47:5c00::/40
|
||||
2a12:f8c0:1000::/40
|
||||
2a12:f8c3::/36
|
||||
2a13:1800::/48
|
||||
2a13:1800:10::/48
|
||||
2a13:1800:80::/44
|
||||
2a13:1800:300::/44
|
||||
2a13:1801:180::/43
|
||||
2a13:1802::/43
|
||||
2a13:a5c3:f000::/40
|
||||
2a13:a5c4:1000::/38
|
||||
2a13:a5c4:1400::/39
|
||||
2a13:a5c5::/48
|
||||
2a13:a5c7:1200::/40
|
||||
2a13:a5c7:1500::/40
|
||||
2a13:a5c7:1600::/45
|
||||
@@ -1505,30 +1653,39 @@
|
||||
2a13:a5c7:1801::/48
|
||||
2a13:a5c7:1802::/47
|
||||
2a13:a5c7:1804::/47
|
||||
2a13:a5c7:1888::/48
|
||||
2a13:a5c7:2102::/47
|
||||
2a13:a5c7:2104::/48
|
||||
2a13:a5c7:2106::/48
|
||||
2a13:a5c7:2109::/48
|
||||
2a13:a5c7:2200::/40
|
||||
2a13:aac4:f000::/44
|
||||
2a13:b487:11da::/48
|
||||
2a13:b487:1200::/43
|
||||
2a13:b487:1ba2::/48
|
||||
2a13:b487:1ba6::/47
|
||||
2a13:b487:1bb2::/47
|
||||
2a13:b487:1200::/44
|
||||
2a13:b487:1bb2::/48
|
||||
2a13:b487:1bba::/47
|
||||
2a13:b487:1bc0::/47
|
||||
2a13:b487:1bff::/48
|
||||
2a13:b487:1f02::/47
|
||||
2a13:b487:1f04::/46
|
||||
2a13:df80:3b00::/44
|
||||
2a13:df80:3b11::/48
|
||||
2a13:df85:a201::/48
|
||||
2a13:df85:a202::/47
|
||||
2a13:df85:a204::/48
|
||||
2a13:df85:a2ff::/48
|
||||
2a13:df85:be10::/48
|
||||
2a13:df85:be80::/48
|
||||
2a13:df85:be88::/48
|
||||
2a13:df85:be90::/48
|
||||
2a13:df85:beaa::/48
|
||||
2a13:df85:bed0::/48
|
||||
2a13:df85:bedc::/48
|
||||
2a13:df85:befe::/48
|
||||
2a14:7c0:4a01::/48
|
||||
2a14:7c0:4d00::/40
|
||||
2a14:4c41::/32
|
||||
2a14:7581:ffb::/48
|
||||
2a14:7581:ffc::/48
|
||||
2a14:7583::/32
|
||||
2a14:7586::/31
|
||||
2c0f:f7a8:8011::/48
|
||||
2c0f:f7a8:8050::/48
|
||||
2c0f:f7a8:805f::/48
|
||||
|
||||
@@ -1 +1 @@
|
||||
20240602150004
|
||||
20240708150024
|
||||
|
||||
+5809
-546
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
202406062209
|
||||
202407102210
|
||||
|
||||
@@ -3177,6 +3177,7 @@ liangzhichuanmei.com
|
||||
lianyue.net
|
||||
liaowangxizang.net
|
||||
liberal.org.hk
|
||||
libertysculpturepark.com
|
||||
libertytimes.com.tw
|
||||
library.usc.cuhk.edu.hk
|
||||
libredd.it
|
||||
@@ -5846,6 +5847,7 @@ wqyd.org
|
||||
wrchina.org
|
||||
wretch.cc
|
||||
writer.zoho.com
|
||||
writesonic.com
|
||||
wsj.com
|
||||
wsj.net
|
||||
wsjhk.com
|
||||
|
||||
@@ -1 +1 @@
|
||||
202406062209
|
||||
202407102210
|
||||
|
||||
@@ -146,7 +146,7 @@ uci.foreach(uciconfig, uciserver, (cfg) => {
|
||||
max_time_difference: cfg.tls_reality_max_time_difference ? (cfg.max_time_difference + 's') : null,
|
||||
handshake: {
|
||||
server: cfg.tls_reality_server_addr,
|
||||
server_port: cfg.tls_reality_server_port
|
||||
server_port: strToInt(cfg.tls_reality_server_port)
|
||||
}
|
||||
} : null
|
||||
} : null,
|
||||
|
||||
+7
-6
@@ -457,14 +457,11 @@ function main() {
|
||||
node_cache[groupHash] = {};
|
||||
|
||||
const res = wGET(url);
|
||||
if (!res) {
|
||||
if (isEmpty(res)) {
|
||||
log(sprintf('Failed to fetch resources from %s.', url));
|
||||
continue;
|
||||
}
|
||||
|
||||
push(node_result, []);
|
||||
const subindex = length(node_result) - 1;
|
||||
|
||||
let nodes;
|
||||
try {
|
||||
nodes = json(res).servers || json(res);
|
||||
@@ -502,7 +499,8 @@ function main() {
|
||||
config.packet_encoding = packet_encoding;
|
||||
|
||||
config.grouphash = groupHash;
|
||||
push(node_result[subindex], config);
|
||||
push(node_result, []);
|
||||
push(node_result[length(node_result)-1], config);
|
||||
node_cache[groupHash][confHash] = config;
|
||||
node_cache[groupHash][nameHash] = config;
|
||||
|
||||
@@ -510,7 +508,10 @@ function main() {
|
||||
}
|
||||
}
|
||||
|
||||
log(sprintf('Successfully fetched %s nodes of total %s from %s.', count, length(nodes), url));
|
||||
if (count == 0)
|
||||
log(sprintf('No valid node found in %s.', url));
|
||||
else
|
||||
log(sprintf('Successfully fetched %s nodes of total %s from %s.', count, length(nodes), url));
|
||||
}
|
||||
|
||||
if (isEmpty(node_result)) {
|
||||
|
||||
@@ -9,7 +9,7 @@ LUCI_TITLE:=LuCI support for quickstart
|
||||
LUCI_DEPENDS:=+quickstart +luci-app-store
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_VERSION:=0.8.13-2
|
||||
PKG_VERSION:=0.8.13-3
|
||||
# PKG_RELEASE MUST be empty for luci.mk
|
||||
PKG_RELEASE:=
|
||||
|
||||
|
||||
@@ -1,2 +1,11 @@
|
||||
|
||||
<% luci.template.render("quickstart/main", {prefix=luci.dispatcher.build_url("admin", "quickstart")}) %>
|
||||
<%
|
||||
local function vue_lang()
|
||||
local i18n = require("luci.i18n")
|
||||
local lang = i18n.translate("quickstart_vue_lang")
|
||||
if lang == "quickstart_vue_lang" or lang == "" then
|
||||
lang = "en"
|
||||
end
|
||||
return lang
|
||||
end
|
||||
-%>
|
||||
<% luci.template.render("quickstart/main", {prefix=luci.dispatcher.build_url("admin", "quickstart"),lang=vue_lang()}) %>
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
queue,
|
||||
queueLock,
|
||||
_gd.QueueFamilyIndex,
|
||||
_gd.IsConcurrentFenceWaitUnsupported,
|
||||
_gd.IsQualcommProprietary,
|
||||
isLight: true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1021,7 +1021,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
_newState.RasterizerDiscardEnable = discard;
|
||||
SignalStateChange();
|
||||
|
||||
if (!discard && Gd.Vendor == Vendor.Qualcomm)
|
||||
if (!discard && Gd.IsQualcommProprietary)
|
||||
{
|
||||
// On Adreno, enabling rasterizer discard somehow corrupts the viewport state.
|
||||
// Force it to be updated on next use to work around this bug.
|
||||
|
||||
@@ -47,10 +47,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
return;
|
||||
}
|
||||
|
||||
if (componentMask != 0xf)
|
||||
if (componentMask != 0xf || Gd.IsQualcommProprietary)
|
||||
{
|
||||
// We can't use CmdClearAttachments if not writing all components,
|
||||
// because on Vulkan, the pipeline state does not affect clears.
|
||||
// On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
|
||||
var dstTexture = FramebufferParams.GetColorView(index);
|
||||
if (dstTexture == null)
|
||||
{
|
||||
@@ -87,10 +88,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
return;
|
||||
}
|
||||
|
||||
if (stencilMask != 0 && stencilMask != 0xff)
|
||||
if ((stencilMask != 0 && stencilMask != 0xff) || Gd.IsQualcommProprietary)
|
||||
{
|
||||
// We can't use CmdClearAttachments if not clearing all (mask is all ones, 0xFF) or none (mask is 0) of the stencil bits,
|
||||
// because on Vulkan, the pipeline state does not affect clears.
|
||||
// On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
|
||||
var dstTexture = FramebufferParams.GetDepthStencilView();
|
||||
if (dstTexture == null)
|
||||
{
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
Templates = BuildTemplates(usePushDescriptors);
|
||||
|
||||
// Updating buffer texture bindings using template updates crashes the Adreno driver on Windows.
|
||||
UpdateTexturesWithoutTemplate = gd.Vendor == Vendor.Qualcomm && usesBufferTextures;
|
||||
UpdateTexturesWithoutTemplate = gd.IsQualcommProprietary && usesBufferTextures;
|
||||
|
||||
_compileTask = Task.CompletedTask;
|
||||
_firstBackgroundUse = false;
|
||||
|
||||
@@ -87,10 +87,10 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
internal bool IsAmdGcn { get; private set; }
|
||||
internal bool IsNvidiaPreTuring { get; private set; }
|
||||
internal bool IsIntelArc { get; private set; }
|
||||
internal bool IsQualcommProprietary { get; private set; }
|
||||
internal bool IsMoltenVk { get; private set; }
|
||||
internal bool IsTBDR { get; private set; }
|
||||
internal bool IsSharedMemory { get; private set; }
|
||||
internal bool IsConcurrentFenceWaitUnsupported { get; private set; }
|
||||
|
||||
public string GpuVendor { get; private set; }
|
||||
public string GpuDriver { get; private set; }
|
||||
@@ -325,8 +325,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
Vendor == Vendor.Broadcom ||
|
||||
Vendor == Vendor.ImgTec;
|
||||
|
||||
IsConcurrentFenceWaitUnsupported = Vendor == Vendor.Qualcomm;
|
||||
|
||||
GpuVendor = VendorUtils.GetNameFromId(properties.VendorID);
|
||||
GpuDriver = hasDriverProperties && !OperatingSystem.IsMacOS() ?
|
||||
VendorUtils.GetFriendlyDriverName(driverProperties.DriverID) : GpuVendor; // Fallback to vendor name if driver is unavailable or on MacOS where vendor is preferred.
|
||||
@@ -348,7 +346,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
{
|
||||
IsNvidiaPreTuring = gpuNumber < 2000;
|
||||
}
|
||||
else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
|
||||
else if (GpuRenderer.Contains("TITAN") && !GpuRenderer.Contains("RTX"))
|
||||
{
|
||||
IsNvidiaPreTuring = true;
|
||||
}
|
||||
@@ -358,6 +356,8 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
IsIntelArc = GpuRenderer.StartsWith("Intel(R) Arc(TM)");
|
||||
}
|
||||
|
||||
IsQualcommProprietary = hasDriverProperties && driverProperties.DriverID == DriverId.QualcommProprietary;
|
||||
|
||||
ulong minResourceAlignment = Math.Max(
|
||||
Math.Max(
|
||||
properties.Limits.MinStorageBufferOffsetAlignment,
|
||||
@@ -415,7 +415,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtExternalMemoryHost hostMemoryApi);
|
||||
HostMemoryAllocator = new HostMemoryAllocator(MemoryAllocator, Api, hostMemoryApi, _device);
|
||||
|
||||
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsConcurrentFenceWaitUnsupported);
|
||||
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsQualcommProprietary);
|
||||
|
||||
PipelineLayoutCache = new PipelineLayoutCache();
|
||||
|
||||
@@ -692,7 +692,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
GpuVendor,
|
||||
memoryType: memoryType,
|
||||
hasFrontFacingBug: IsIntelWindows,
|
||||
hasVectorIndexingBug: Vendor == Vendor.Qualcomm,
|
||||
hasVectorIndexingBug: IsQualcommProprietary,
|
||||
needsFragmentOutputSpecialization: IsMoltenVk,
|
||||
reduceShaderPrecision: IsMoltenVk,
|
||||
supportsAstcCompression: features2.Features.TextureCompressionAstcLdr && supportsAstcFormats,
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dns2tcp
|
||||
PKG_VERSION:=1.1.1
|
||||
PKG_VERSION:=1.1.2
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/zfl9/dns2tcp/tar.gz/v$(PKG_VERSION)?
|
||||
PKG_HASH:=35251fbe1645601086f21cdbd5a2f75471d812f99ed8017bb05158840456b43c
|
||||
PKG_HASH:=5e8c6302a1d32c16ae7d4b8e39cd9aad1f2d7e68fe18813e76cb1e48ec5940d2
|
||||
|
||||
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
|
||||
PKG_LICENSE:=AGPL-3.0-only
|
||||
|
||||
@@ -12,13 +12,13 @@ PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
GEOIP_VER:=202407040043
|
||||
GEOIP_VER:=202407110044
|
||||
GEOIP_FILE:=geoip.dat.$(GEOIP_VER)
|
||||
define Download/geoip
|
||||
URL:=https://github.com/v2fly/geoip/releases/download/$(GEOIP_VER)/
|
||||
URL_FILE:=geoip.dat
|
||||
FILE:=$(GEOIP_FILE)
|
||||
HASH:=c55f7e9866acb963873b0d907404b395bd3b7447470b5407d79868c3d1c0cb04
|
||||
HASH:=83c8d38a4fff932fcbfe726c1f85c0debb1bf169afcfa18566c731a2f2c1f7b6
|
||||
endef
|
||||
|
||||
GEOSITE_VER:=20240710044910
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization.NamingConventions;
|
||||
|
||||
namespace v2rayN.Common
|
||||
@@ -60,4 +55,4 @@ namespace v2rayN.Common
|
||||
|
||||
#endregion YAML
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -59,6 +59,10 @@ namespace v2rayN.Handler.Fmt
|
||||
{
|
||||
dicQuery.Add("spx", Utils.UrlEncode(item.spiderX));
|
||||
}
|
||||
if (item.allowInsecure.Equals("true"))
|
||||
{
|
||||
dicQuery.Add("allowInsecure", "1");
|
||||
}
|
||||
|
||||
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : nameof(ETransport.tcp));
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using v2rayN.Enums;
|
||||
using v2rayN.Enums;
|
||||
using v2rayN.Models;
|
||||
using v2rayN.Resx;
|
||||
|
||||
@@ -7,17 +6,13 @@ namespace v2rayN.Handler.Fmt
|
||||
{
|
||||
internal class VmessFmt : BaseFmt
|
||||
{
|
||||
private static readonly Regex StdVmessUserInfo = new(
|
||||
@"^(?<network>[a-z]+)(\+(?<streamSecurity>[a-z]+))?:(?<id>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$", RegexOptions.Compiled);
|
||||
|
||||
public static ProfileItem? Resolve(string str, out string msg)
|
||||
{
|
||||
msg = ResUI.ConfigurationFormatIncorrect;
|
||||
ProfileItem? item;
|
||||
int indexSplit = str.IndexOf("?");
|
||||
if (indexSplit > 0)
|
||||
if (str.IndexOf('?') > 0 && str.IndexOf('&') > 0)
|
||||
{
|
||||
item = ResolveStdVmess(str) ?? ResolveVmess4Kitsunebi(str);
|
||||
item = ResolveStdVmess(str);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -107,7 +102,7 @@ namespace v2rayN.Handler.Fmt
|
||||
return item;
|
||||
}
|
||||
|
||||
private static ProfileItem? ResolveStdVmess(string result)
|
||||
public static ProfileItem? ResolveStdVmess(string str)
|
||||
{
|
||||
ProfileItem item = new()
|
||||
{
|
||||
@@ -115,113 +110,15 @@ namespace v2rayN.Handler.Fmt
|
||||
security = "auto"
|
||||
};
|
||||
|
||||
Uri u = new(result);
|
||||
Uri url = new(str);
|
||||
|
||||
item.address = u.IdnHost;
|
||||
item.port = u.Port;
|
||||
item.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
|
||||
var query = Utils.ParseQueryString(u.Query);
|
||||
item.address = url.IdnHost;
|
||||
item.port = url.Port;
|
||||
item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
|
||||
item.id = Utils.UrlDecode(url.UserInfo);
|
||||
|
||||
var m = StdVmessUserInfo.Match(u.UserInfo);
|
||||
if (!m.Success) return null;
|
||||
|
||||
item.id = m.Groups["id"].Value;
|
||||
|
||||
if (m.Groups["streamSecurity"].Success)
|
||||
{
|
||||
item.streamSecurity = m.Groups["streamSecurity"].Value;
|
||||
}
|
||||
switch (item.streamSecurity)
|
||||
{
|
||||
case Global.StreamSecurity:
|
||||
break;
|
||||
|
||||
default:
|
||||
if (!Utils.IsNullOrEmpty(item.streamSecurity))
|
||||
return null;
|
||||
break;
|
||||
}
|
||||
|
||||
item.network = m.Groups["network"].Value;
|
||||
switch (item.network)
|
||||
{
|
||||
case nameof(ETransport.tcp):
|
||||
string t1 = query["type"] ?? Global.None;
|
||||
item.headerType = t1;
|
||||
break;
|
||||
|
||||
case nameof(ETransport.kcp):
|
||||
item.headerType = query["type"] ?? Global.None;
|
||||
break;
|
||||
|
||||
case nameof(ETransport.ws):
|
||||
case nameof(ETransport.httpupgrade):
|
||||
case nameof(ETransport.splithttp):
|
||||
string p1 = query["path"] ?? "/";
|
||||
string h1 = query["host"] ?? "";
|
||||
item.requestHost = Utils.UrlDecode(h1);
|
||||
item.path = p1;
|
||||
break;
|
||||
|
||||
case nameof(ETransport.http):
|
||||
case nameof(ETransport.h2):
|
||||
item.network = nameof(ETransport.h2);
|
||||
string p2 = query["path"] ?? "/";
|
||||
string h2 = query["host"] ?? "";
|
||||
item.requestHost = Utils.UrlDecode(h2);
|
||||
item.path = p2;
|
||||
break;
|
||||
|
||||
case nameof(ETransport.quic):
|
||||
string s = query["security"] ?? Global.None;
|
||||
string k = query["key"] ?? "";
|
||||
string t3 = query["type"] ?? Global.None;
|
||||
item.headerType = t3;
|
||||
item.requestHost = Utils.UrlDecode(s);
|
||||
item.path = k;
|
||||
break;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
private static ProfileItem? ResolveVmess4Kitsunebi(string result)
|
||||
{
|
||||
ProfileItem item = new()
|
||||
{
|
||||
configType = EConfigType.VMess
|
||||
};
|
||||
result = result[Global.ProtocolShares[EConfigType.VMess].Length..];
|
||||
int indexSplit = result.IndexOf("?");
|
||||
if (indexSplit > 0)
|
||||
{
|
||||
result = result[..indexSplit];
|
||||
}
|
||||
result = Utils.Base64Decode(result);
|
||||
|
||||
string[] arr1 = result.Split('@');
|
||||
if (arr1.Length != 2)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
string[] arr21 = arr1[0].Split(':');
|
||||
string[] arr22 = arr1[1].Split(':');
|
||||
if (arr21.Length != 2 || arr22.Length != 2)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
item.address = arr22[0];
|
||||
item.port = Utils.ToInt(arr22[1]);
|
||||
item.security = arr21[0];
|
||||
item.id = arr21[1];
|
||||
|
||||
item.network = Global.DefaultNetwork;
|
||||
item.headerType = Global.None;
|
||||
item.remarks = "Alien";
|
||||
var query = Utils.ParseQueryString(url.Query);
|
||||
ResolveStdTransport(query, ref item);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
|
||||
|
||||
using static v2rayN.Models.ClashProxies;
|
||||
using static v2rayN.Models.ClashProxies;
|
||||
|
||||
namespace v2rayN.Models
|
||||
{
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace v2rayN.ViewModels
|
||||
public void ProxiesDelayTest()
|
||||
{
|
||||
ProxiesDelayTest(true);
|
||||
}
|
||||
}
|
||||
|
||||
#region proxy function
|
||||
|
||||
@@ -337,7 +337,7 @@ namespace v2rayN.ViewModels
|
||||
|
||||
private ProxiesItem? TryGetProxy(string name)
|
||||
{
|
||||
if(proxies is null)
|
||||
if (proxies is null)
|
||||
return null;
|
||||
proxies.TryGetValue(name, out ProxiesItem proxy2);
|
||||
if (proxy2 != null)
|
||||
@@ -479,7 +479,7 @@ namespace v2rayN.ViewModels
|
||||
}
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
#endregion task
|
||||
|
||||
@@ -151,6 +151,7 @@ namespace v2rayN.ViewModels
|
||||
|
||||
//CheckUpdate
|
||||
public ReactiveCommand<Unit, Unit> CheckUpdateNCmd { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> CheckUpdateXrayCoreCmd { get; }
|
||||
public ReactiveCommand<Unit, Unit> CheckUpdateClashMetaCoreCmd { get; }
|
||||
public ReactiveCommand<Unit, Unit> CheckUpdateSingBoxCoreCmd { get; }
|
||||
@@ -1519,11 +1520,11 @@ namespace v2rayN.ViewModels
|
||||
{
|
||||
BlReloadEnabled = true;
|
||||
ShowCalshUI = (_config.runningCoreType is ECoreType.clash or ECoreType.clash_meta or ECoreType.mihomo);
|
||||
if (ShowCalshUI) {
|
||||
if (ShowCalshUI)
|
||||
{
|
||||
Locator.Current.GetService<ClashProxiesViewModel>()?.ProxiesReload();
|
||||
}
|
||||
}));
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using v2rayN.ViewModels;
|
||||
using ReactiveUI;
|
||||
using System.Reactive.Disposables;
|
||||
using v2rayN.ViewModels;
|
||||
|
||||
namespace v2rayN.Views
|
||||
{
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
<reactiveui:ReactiveUserControl
|
||||
x:Class="v2rayN.Views.ClashProxiesView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:converters="clr-namespace:v2rayN.Converters"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:v2rayN.Views"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:reactiveui="http://reactiveui.net"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:converters="clr-namespace:v2rayN.Converters"
|
||||
xmlns:resx="clr-namespace:v2rayN.Resx"
|
||||
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
||||
d:DesignHeight="450"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using v2rayN.ViewModels;
|
||||
using ReactiveUI;
|
||||
using Splat;
|
||||
using System.Reactive.Disposables;
|
||||
using System.Windows.Input;
|
||||
using v2rayN.ViewModels;
|
||||
|
||||
namespace v2rayN.Views
|
||||
{
|
||||
|
||||
@@ -38,7 +38,6 @@ namespace v2rayN.Views
|
||||
{
|
||||
cmbdomainStrategy4Out.Items.Add(it);
|
||||
});
|
||||
|
||||
|
||||
this.WhenActivated(disposables =>
|
||||
{
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<reactiveui:ReactiveWindow
|
||||
x:Class="v2rayN.Views.RoutingRuleDetailsWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:reactiveui="http://reactiveui.net"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||
xmlns:resx="clr-namespace:v2rayN.Resx"
|
||||
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
||||
Title="{x:Static resx:ResUI.menuRoutingRuleDetailsSetting}"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<reactiveui:ReactiveWindow
|
||||
x:Class="v2rayN.Views.RoutingRuleSettingWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:reactiveui="http://reactiveui.net"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||
xmlns:resx="clr-namespace:v2rayN.Resx"
|
||||
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
||||
Title="{x:Static resx:ResUI.menuRoutingRuleSetting}"
|
||||
|
||||
@@ -395,14 +395,18 @@ object AngConfigManager {
|
||||
count = parseCustomConfigServer(server, subid)
|
||||
}
|
||||
|
||||
if (parseBatchSubscription(server, subid) > 0) {
|
||||
updateConfigViaSubAll()
|
||||
return 1
|
||||
var countSub = parseBatchSubscription(server)
|
||||
if (countSub <= 0) {
|
||||
countSub = parseBatchSubscription(Utils.decode(server))
|
||||
}
|
||||
return count
|
||||
if (countSub > 0) {
|
||||
updateConfigViaSubAll()
|
||||
}
|
||||
|
||||
return count + countSub
|
||||
}
|
||||
|
||||
fun parseBatchSubscription(servers: String?, subid: String): Int {
|
||||
fun parseBatchSubscription(servers: String?): Int {
|
||||
try {
|
||||
if (servers == null) {
|
||||
return 0
|
||||
@@ -410,7 +414,6 @@ object AngConfigManager {
|
||||
|
||||
var count = 0
|
||||
servers.lines()
|
||||
.reversed()
|
||||
.forEach { str ->
|
||||
if (str.startsWith(AppConfig.PROTOCOL_HTTP) || str.startsWith(AppConfig.PROTOCOL_HTTPS)) {
|
||||
count += MmkvManager.importUrlAsSubscription(str)
|
||||
@@ -488,7 +491,7 @@ object AngConfigManager {
|
||||
|
||||
if (serverList.isNotEmpty()) {
|
||||
var count = 0
|
||||
for (srv in serverList) {
|
||||
for (srv in serverList.reversed()) {
|
||||
val config = ServerConfig.create(EConfigType.CUSTOM)
|
||||
config.fullConfig =
|
||||
Gson().fromJson(Gson().toJson(srv), V2rayConfig::class.java)
|
||||
|
||||
@@ -7,7 +7,6 @@ import android.content.pm.PackageInfo
|
||||
import android.content.pm.PackageManager
|
||||
import com.v2ray.ang.dto.AppInfo
|
||||
import rx.Observable
|
||||
import java.util.*
|
||||
|
||||
object AppManagerUtil {
|
||||
fun loadNetworkAppList(ctx: Context): ArrayList<AppInfo> {
|
||||
@@ -31,9 +30,10 @@ object AppManagerUtil {
|
||||
return apps
|
||||
}
|
||||
|
||||
fun rxLoadNetworkAppList(ctx: Context): Observable<ArrayList<AppInfo>> = Observable.unsafeCreate {
|
||||
it.onNext(loadNetworkAppList(ctx))
|
||||
}
|
||||
fun rxLoadNetworkAppList(ctx: Context): Observable<ArrayList<AppInfo>> =
|
||||
Observable.unsafeCreate {
|
||||
it.onNext(loadNetworkAppList(ctx))
|
||||
}
|
||||
|
||||
val PackageInfo.hasInternetPermission: Boolean
|
||||
get() {
|
||||
|
||||
@@ -179,7 +179,7 @@ object MmkvManager {
|
||||
}
|
||||
}
|
||||
|
||||
fun sortByTestResults( ) {
|
||||
fun sortByTestResults() {
|
||||
data class ServerDelay(var guid: String, var testDelayMillis: Long)
|
||||
|
||||
val serverDelays = mutableListOf<ServerDelay>()
|
||||
|
||||
@@ -7,7 +7,7 @@ import android.content.res.Resources
|
||||
import android.os.Build
|
||||
import android.os.LocaleList
|
||||
import androidx.annotation.RequiresApi
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
open class MyContextWrapper(base: Context?) : ContextWrapper(base) {
|
||||
companion object {
|
||||
|
||||
@@ -52,7 +52,8 @@ object SpeedtestUtil {
|
||||
val allText = process.inputStream.bufferedReader().use { it.readText() }
|
||||
if (!TextUtils.isEmpty(allText)) {
|
||||
val tempInfo = allText.substring(allText.indexOf("min/avg/max/mdev") + 19)
|
||||
val temps = tempInfo.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
val temps =
|
||||
tempInfo.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
if (temps.count() > 0 && temps[0].length < 10) {
|
||||
return temps[0].toFloat().toInt().toString() + "ms"
|
||||
}
|
||||
@@ -70,7 +71,7 @@ object SpeedtestUtil {
|
||||
tcpTestingSockets.add(socket)
|
||||
}
|
||||
val start = System.currentTimeMillis()
|
||||
socket.connect(InetSocketAddress(url, port),3000)
|
||||
socket.connect(InetSocketAddress(url, port), 3000)
|
||||
val time = System.currentTimeMillis() - start
|
||||
synchronized(this) {
|
||||
tcpTestingSockets.remove(socket)
|
||||
@@ -105,8 +106,11 @@ object SpeedtestUtil {
|
||||
val url = URL(Utils.getDelayTestUrl())
|
||||
|
||||
conn = url.openConnection(
|
||||
Proxy(Proxy.Type.HTTP,
|
||||
InetSocketAddress("127.0.0.1", port))) as HttpURLConnection
|
||||
Proxy(
|
||||
Proxy.Type.HTTP,
|
||||
InetSocketAddress("127.0.0.1", port)
|
||||
)
|
||||
) as HttpURLConnection
|
||||
conn.connectTimeout = 30000
|
||||
conn.readTimeout = 30000
|
||||
conn.setRequestProperty("Connection", "close")
|
||||
@@ -120,11 +124,19 @@ object SpeedtestUtil {
|
||||
if (code == 204 || code == 200 && conn.responseLength == 0L) {
|
||||
result = context.getString(R.string.connection_test_available, elapsed)
|
||||
} else {
|
||||
throw IOException(context.getString(R.string.connection_test_error_status_code, code))
|
||||
throw IOException(
|
||||
context.getString(
|
||||
R.string.connection_test_error_status_code,
|
||||
code
|
||||
)
|
||||
)
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
// network exception
|
||||
Log.d(AppConfig.ANG_PACKAGE, "testConnection IOException: " + Log.getStackTraceString(e))
|
||||
Log.d(
|
||||
AppConfig.ANG_PACKAGE,
|
||||
"testConnection IOException: " + Log.getStackTraceString(e)
|
||||
)
|
||||
result = context.getString(R.string.connection_test_error, e.message)
|
||||
} catch (e: Exception) {
|
||||
// library exception, eg sumsung
|
||||
|
||||
@@ -142,7 +142,8 @@ object V2rayConfigUtil {
|
||||
settingsStorage?.decodeBool(AppConfig.PREF_SNIFFING_ENABLED, true)
|
||||
?: true
|
||||
v2rayConfig.inbounds[0].sniffing?.enabled = fakedns || sniffAllTlsAndHttp
|
||||
v2rayConfig.inbounds[0].sniffing?.routeOnly = settingsStorage?.decodeBool(AppConfig.PREF_ROUTE_ONLY_ENABLED, false)
|
||||
v2rayConfig.inbounds[0].sniffing?.routeOnly =
|
||||
settingsStorage?.decodeBool(AppConfig.PREF_ROUTE_ONLY_ENABLED, false)
|
||||
if (!sniffAllTlsAndHttp) {
|
||||
v2rayConfig.inbounds[0].sniffing?.destOverride?.clear()
|
||||
}
|
||||
@@ -188,7 +189,7 @@ object V2rayConfigUtil {
|
||||
)
|
||||
routingUserRule(
|
||||
settingsStorage?.decodeString(AppConfig.PREF_V2RAY_ROUTING_DIRECT)
|
||||
?: "", AppConfig.TAG_DIRECT, v2rayConfig
|
||||
?: "", TAG_DIRECT, v2rayConfig
|
||||
)
|
||||
routingUserRule(
|
||||
settingsStorage?.decodeString(AppConfig.PREF_V2RAY_ROUTING_BLOCKED)
|
||||
@@ -210,37 +211,38 @@ object V2rayConfigUtil {
|
||||
|
||||
when (routingMode) {
|
||||
ERoutingMode.BYPASS_LAN.value -> {
|
||||
routingGeo("ip", "private", AppConfig.TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("ip", "private", TAG_DIRECT, v2rayConfig)
|
||||
}
|
||||
|
||||
ERoutingMode.BYPASS_MAINLAND.value -> {
|
||||
routingGeo("", "cn", AppConfig.TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("domain", "geolocation-cn", AppConfig.TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("", "cn", TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("domain", "geolocation-cn", TAG_DIRECT, v2rayConfig)
|
||||
v2rayConfig.routing.rules.add(0, googleapisRoute)
|
||||
}
|
||||
|
||||
ERoutingMode.BYPASS_LAN_MAINLAND.value -> {
|
||||
routingGeo("ip", "private", AppConfig.TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("", "cn", AppConfig.TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("domain", "geolocation-cn", AppConfig.TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("ip", "private", TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("", "cn", TAG_DIRECT, v2rayConfig)
|
||||
routingGeo("domain", "geolocation-cn", TAG_DIRECT, v2rayConfig)
|
||||
v2rayConfig.routing.rules.add(0, googleapisRoute)
|
||||
}
|
||||
|
||||
ERoutingMode.GLOBAL_DIRECT.value -> {
|
||||
val globalDirect = V2rayConfig.RoutingBean.RulesBean(
|
||||
outboundTag = AppConfig.TAG_DIRECT,
|
||||
outboundTag = TAG_DIRECT,
|
||||
port = "0-65535"
|
||||
)
|
||||
v2rayConfig.routing.rules.add(globalDirect)
|
||||
}
|
||||
}
|
||||
|
||||
if(routingMode != ERoutingMode.GLOBAL_DIRECT.value) {
|
||||
if (routingMode != ERoutingMode.GLOBAL_DIRECT.value) {
|
||||
v2rayConfig.routing.rules.add(
|
||||
V2rayConfig.RoutingBean.RulesBean(
|
||||
outboundTag = AppConfig.TAG_PROXY,
|
||||
port = "0-65535"
|
||||
))
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
} catch (e: Exception) {
|
||||
@@ -465,7 +467,7 @@ object V2rayConfigUtil {
|
||||
if (Utils.isPureIpAddress(domesticDns.first())) {
|
||||
v2rayConfig.routing.rules.add(
|
||||
0, V2rayConfig.RoutingBean.RulesBean(
|
||||
outboundTag = AppConfig.TAG_DIRECT,
|
||||
outboundTag = TAG_DIRECT,
|
||||
port = "53",
|
||||
ip = arrayListOf(domesticDns.first()),
|
||||
domain = null
|
||||
@@ -597,7 +599,8 @@ object V2rayConfigUtil {
|
||||
mux = null
|
||||
)
|
||||
|
||||
var packets = settingsStorage?.decodeString(AppConfig.PREF_FRAGMENT_PACKETS) ?: "tlshello"
|
||||
var packets =
|
||||
settingsStorage?.decodeString(AppConfig.PREF_FRAGMENT_PACKETS) ?: "tlshello"
|
||||
if (v2rayConfig.outbounds[0].streamSettings?.security == V2rayConfig.REALITY
|
||||
&& packets == "tlshello"
|
||||
) {
|
||||
|
||||
@@ -96,7 +96,7 @@ object ShadowsocksFmt {
|
||||
for (pair in pairs) {
|
||||
val idx = pair.indexOf("=")
|
||||
if (idx == -1) {
|
||||
queryPairs[Utils.urlDecode(pair)] = "";
|
||||
queryPairs[Utils.urlDecode(pair)] = ""
|
||||
} else {
|
||||
queryPairs[Utils.urlDecode(pair.substring(0, idx))] =
|
||||
Utils.urlDecode(pair.substring(idx + 1))
|
||||
@@ -118,9 +118,9 @@ object ShadowsocksFmt {
|
||||
null
|
||||
)
|
||||
} else if (queryPairs["plugin"] == "v2ray-plugin") {
|
||||
var network = "ws";
|
||||
var network = "ws"
|
||||
if (queryPairs["mode"] == "quic") {
|
||||
network = "quic";
|
||||
network = "quic"
|
||||
}
|
||||
sni = config.outboundBean?.streamSettings?.populateTransportSettings(
|
||||
network,
|
||||
|
||||
@@ -20,7 +20,7 @@ object TrojanFmt {
|
||||
}
|
||||
|
||||
fun parseTrojan(str: String): ServerConfig? {
|
||||
val allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
|
||||
var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
|
||||
val config = ServerConfig.create(EConfigType.TROJAN)
|
||||
|
||||
val uri = URI(Utils.fixIllegalUrl(str))
|
||||
@@ -28,35 +28,37 @@ object TrojanFmt {
|
||||
|
||||
var flow = ""
|
||||
var fingerprint = config.outboundBean?.streamSettings?.tlsSettings?.fingerprint
|
||||
if (uri.rawQuery.isNullOrEmpty()) {
|
||||
config.outboundBean?.streamSettings?.populateTlsSettings(
|
||||
V2rayConfig.TLS, allowInsecure, "",
|
||||
fingerprint, null, null, null, null
|
||||
)
|
||||
} else {
|
||||
val queryParam = uri.rawQuery.split("&")
|
||||
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
|
||||
if (uri.rawQuery.isNullOrEmpty()) return null
|
||||
|
||||
val sni = config.outboundBean?.streamSettings?.populateTransportSettings(
|
||||
queryParam["type"] ?: "tcp",
|
||||
queryParam["headerType"],
|
||||
queryParam["host"],
|
||||
queryParam["path"],
|
||||
queryParam["seed"],
|
||||
queryParam["quicSecurity"],
|
||||
queryParam["key"],
|
||||
queryParam["mode"],
|
||||
queryParam["serviceName"],
|
||||
queryParam["authority"]
|
||||
)
|
||||
fingerprint = queryParam["fp"] ?: ""
|
||||
config.outboundBean?.streamSettings?.populateTlsSettings(
|
||||
queryParam["security"] ?: V2rayConfig.TLS,
|
||||
allowInsecure, queryParam["sni"] ?: sni?:"", fingerprint, queryParam["alpn"],
|
||||
null, null, null
|
||||
)
|
||||
flow = queryParam["flow"] ?: ""
|
||||
}
|
||||
|
||||
val queryParam = uri.rawQuery.split("&")
|
||||
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
|
||||
|
||||
val sni = config.outboundBean?.streamSettings?.populateTransportSettings(
|
||||
queryParam["type"] ?: "tcp",
|
||||
queryParam["headerType"],
|
||||
queryParam["host"],
|
||||
queryParam["path"],
|
||||
queryParam["seed"],
|
||||
queryParam["quicSecurity"],
|
||||
queryParam["key"],
|
||||
queryParam["mode"],
|
||||
queryParam["serviceName"],
|
||||
queryParam["authority"]
|
||||
)
|
||||
fingerprint = queryParam["fp"] ?: ""
|
||||
allowInsecure = if ((queryParam["allowInsecure"] ?: "") == "1") true else allowInsecure
|
||||
config.outboundBean?.streamSettings?.populateTlsSettings(
|
||||
queryParam["security"] ?: V2rayConfig.TLS,
|
||||
allowInsecure,
|
||||
queryParam["sni"] ?: sni ?: "",
|
||||
fingerprint,
|
||||
queryParam["alpn"],
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
flow = queryParam["flow"] ?: ""
|
||||
|
||||
config.outboundBean?.settings?.servers?.get(0)?.let { server ->
|
||||
server.address = uri.idnHost
|
||||
@@ -78,7 +80,6 @@ object TrojanFmt {
|
||||
if (!TextUtils.isEmpty(it)) {
|
||||
dicQuery["flow"] = it
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
dicQuery["security"] = streamSetting.security.ifEmpty { "none" }
|
||||
@@ -92,16 +93,16 @@ object TrojanFmt {
|
||||
Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty()
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.fingerprint)) {
|
||||
dicQuery["fp"] = tlsSetting.fingerprint?:""
|
||||
dicQuery["fp"] = tlsSetting.fingerprint ?: ""
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.publicKey)) {
|
||||
dicQuery["pbk"] = tlsSetting.publicKey?:""
|
||||
dicQuery["pbk"] = tlsSetting.publicKey ?: ""
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.shortId)) {
|
||||
dicQuery["sid"] = tlsSetting.shortId?:""
|
||||
dicQuery["sid"] = tlsSetting.shortId ?: ""
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.spiderX)) {
|
||||
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX?:"")
|
||||
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX ?: "")
|
||||
}
|
||||
}
|
||||
dicQuery["type"] =
|
||||
|
||||
@@ -20,7 +20,7 @@ object VlessFmt {
|
||||
}
|
||||
|
||||
fun parseVless(str: String): ServerConfig? {
|
||||
val allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
|
||||
var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
|
||||
val config = ServerConfig.create(EConfigType.VLESS)
|
||||
|
||||
val uri = URI(Utils.fixIllegalUrl(str))
|
||||
@@ -31,7 +31,7 @@ object VlessFmt {
|
||||
val streamSetting = config.outboundBean?.streamSettings ?: return null
|
||||
|
||||
config.remarks = Utils.urlDecode(uri.fragment ?: "")
|
||||
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
|
||||
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
|
||||
vnext.address = uri.idnHost
|
||||
vnext.port = uri.port
|
||||
vnext.users[0].id = uri.userInfo
|
||||
@@ -51,6 +51,7 @@ object VlessFmt {
|
||||
queryParam["serviceName"],
|
||||
queryParam["authority"]
|
||||
)
|
||||
allowInsecure = if ((queryParam["allowInsecure"] ?: "") == "1") true else allowInsecure
|
||||
streamSetting.populateTlsSettings(
|
||||
queryParam["security"] ?: "",
|
||||
allowInsecure,
|
||||
@@ -92,16 +93,16 @@ object VlessFmt {
|
||||
Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty()
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.fingerprint)) {
|
||||
dicQuery["fp"] = tlsSetting.fingerprint?:""
|
||||
dicQuery["fp"] = tlsSetting.fingerprint ?: ""
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.publicKey)) {
|
||||
dicQuery["pbk"] = tlsSetting.publicKey?:""
|
||||
dicQuery["pbk"] = tlsSetting.publicKey ?: ""
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.shortId)) {
|
||||
dicQuery["sid"] = tlsSetting.shortId?:""
|
||||
dicQuery["sid"] = tlsSetting.shortId ?: ""
|
||||
}
|
||||
if (!TextUtils.isEmpty(tlsSetting.spiderX)) {
|
||||
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX?:"")
|
||||
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX ?: "")
|
||||
}
|
||||
}
|
||||
dicQuery["type"] =
|
||||
|
||||
@@ -22,68 +22,64 @@ object VmessFmt {
|
||||
}
|
||||
|
||||
fun parseVmess(str: String): ServerConfig? {
|
||||
if (str.indexOf('?') > 0 && str.indexOf('&') > 0) {
|
||||
return parseVmessStd(str)
|
||||
}
|
||||
|
||||
val allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
|
||||
val config = ServerConfig.create(EConfigType.VMESS)
|
||||
val streamSetting = config.outboundBean?.streamSettings ?: return null
|
||||
|
||||
if (!tryParseNewVmess(str, config, allowInsecure)) {
|
||||
if (str.indexOf("?") > 0) {
|
||||
if (!tryResolveVmess4Kitsunebi(str, config)) {
|
||||
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_incorrect_protocol")
|
||||
return null
|
||||
}
|
||||
} else {
|
||||
var result = str.replace(EConfigType.VMESS.protocolScheme, "")
|
||||
result = Utils.decode(result)
|
||||
if (TextUtils.isEmpty(result)) {
|
||||
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_decoding_failed")
|
||||
return null
|
||||
}
|
||||
val vmessQRCode = Gson().fromJson(result, VmessQRCode::class.java)
|
||||
// Although VmessQRCode fields are non null, looks like Gson may still create null fields
|
||||
if (TextUtils.isEmpty(vmessQRCode.add) || TextUtils.isEmpty(vmessQRCode.port) || TextUtils.isEmpty(
|
||||
vmessQRCode.id
|
||||
) || TextUtils.isEmpty(vmessQRCode.net)
|
||||
) {
|
||||
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_incorrect_protocol")
|
||||
return null
|
||||
}
|
||||
|
||||
config.remarks = vmessQRCode.ps
|
||||
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
|
||||
vnext.address = vmessQRCode.add
|
||||
vnext.port = Utils.parseInt(vmessQRCode.port)
|
||||
vnext.users[0].id = vmessQRCode.id
|
||||
vnext.users[0].security =
|
||||
if (TextUtils.isEmpty(vmessQRCode.scy)) V2rayConfig.DEFAULT_SECURITY else vmessQRCode.scy
|
||||
vnext.users[0].alterId = Utils.parseInt(vmessQRCode.aid)
|
||||
}
|
||||
val sni = streamSetting.populateTransportSettings(
|
||||
vmessQRCode.net,
|
||||
vmessQRCode.type,
|
||||
vmessQRCode.host,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.host,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.type,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.host
|
||||
)
|
||||
|
||||
val fingerprint = vmessQRCode.fp ?: streamSetting.tlsSettings?.fingerprint
|
||||
streamSetting.populateTlsSettings(
|
||||
vmessQRCode.tls,
|
||||
allowInsecure,
|
||||
if (TextUtils.isEmpty(vmessQRCode.sni)) sni else vmessQRCode.sni,
|
||||
fingerprint,
|
||||
vmessQRCode.alpn,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
}
|
||||
var result = str.replace(EConfigType.VMESS.protocolScheme, "")
|
||||
result = Utils.decode(result)
|
||||
if (TextUtils.isEmpty(result)) {
|
||||
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_decoding_failed")
|
||||
return null
|
||||
}
|
||||
val vmessQRCode = Gson().fromJson(result, VmessQRCode::class.java)
|
||||
// Although VmessQRCode fields are non null, looks like Gson may still create null fields
|
||||
if (TextUtils.isEmpty(vmessQRCode.add)
|
||||
|| TextUtils.isEmpty(vmessQRCode.port)
|
||||
|| TextUtils.isEmpty(vmessQRCode.id)
|
||||
|| TextUtils.isEmpty(vmessQRCode.net)
|
||||
) {
|
||||
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_incorrect_protocol")
|
||||
return null
|
||||
}
|
||||
|
||||
config.remarks = vmessQRCode.ps
|
||||
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
|
||||
vnext.address = vmessQRCode.add
|
||||
vnext.port = Utils.parseInt(vmessQRCode.port)
|
||||
vnext.users[0].id = vmessQRCode.id
|
||||
vnext.users[0].security =
|
||||
if (TextUtils.isEmpty(vmessQRCode.scy)) V2rayConfig.DEFAULT_SECURITY else vmessQRCode.scy
|
||||
vnext.users[0].alterId = Utils.parseInt(vmessQRCode.aid)
|
||||
}
|
||||
val sni = streamSetting.populateTransportSettings(
|
||||
vmessQRCode.net,
|
||||
vmessQRCode.type,
|
||||
vmessQRCode.host,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.host,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.type,
|
||||
vmessQRCode.path,
|
||||
vmessQRCode.host
|
||||
)
|
||||
|
||||
val fingerprint = vmessQRCode.fp
|
||||
streamSetting.populateTlsSettings(
|
||||
vmessQRCode.tls,
|
||||
allowInsecure,
|
||||
if (TextUtils.isEmpty(vmessQRCode.sni)) sni else vmessQRCode.sni,
|
||||
fingerprint,
|
||||
vmessQRCode.alpn,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
|
||||
return config
|
||||
}
|
||||
|
||||
@@ -114,80 +110,51 @@ object VmessFmt {
|
||||
return Utils.encode(json)
|
||||
}
|
||||
|
||||
private fun tryParseNewVmess(
|
||||
uriString: String, config: ServerConfig, allowInsecure: Boolean
|
||||
): Boolean {
|
||||
return runCatching {
|
||||
val uri = URI(Utils.fixIllegalUrl(uriString))
|
||||
check(uri.scheme == "vmess")
|
||||
val (_, protocol, tlsStr, uuid, alterId) = Regex("(tcp|http|ws|kcp|quic|grpc)(\\+tls)?:([0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12})").matchEntire(
|
||||
uri.userInfo
|
||||
)?.groupValues ?: error("parse user info fail.")
|
||||
val tls = tlsStr.isNotBlank()
|
||||
val queryParam = uri.rawQuery.split("&")
|
||||
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
|
||||
fun parseVmessStd(str: String): ServerConfig? {
|
||||
var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
|
||||
val config = ServerConfig.create(EConfigType.VMESS)
|
||||
|
||||
val streamSetting = config.outboundBean?.streamSettings ?: return false
|
||||
config.remarks = Utils.urlDecode(uri.fragment ?: "")
|
||||
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
|
||||
vnext.address = uri.idnHost
|
||||
vnext.port = uri.port
|
||||
vnext.users[0].id = uuid
|
||||
vnext.users[0].security = V2rayConfig.DEFAULT_SECURITY
|
||||
vnext.users[0].alterId = alterId.toInt()
|
||||
}
|
||||
var fingerprint = streamSetting.tlsSettings?.fingerprint
|
||||
val sni = streamSetting.populateTransportSettings(protocol,
|
||||
queryParam["type"],
|
||||
queryParam["host"]?.split("|")?.get(0) ?: "",
|
||||
queryParam["path"]?.takeIf { it.trim() != "/" } ?: "",
|
||||
queryParam["seed"],
|
||||
queryParam["security"],
|
||||
queryParam["key"],
|
||||
queryParam["mode"],
|
||||
queryParam["serviceName"],
|
||||
queryParam["authority"])
|
||||
streamSetting.populateTlsSettings(
|
||||
if (tls) V2rayConfig.TLS else "",
|
||||
allowInsecure,
|
||||
sni,
|
||||
fingerprint,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
true
|
||||
}.getOrElse { false }
|
||||
}
|
||||
val uri = URI(Utils.fixIllegalUrl(str))
|
||||
if (uri.rawQuery.isNullOrEmpty()) return null
|
||||
val queryParam = uri.rawQuery.split("&")
|
||||
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
|
||||
|
||||
private fun tryResolveVmess4Kitsunebi(server: String, config: ServerConfig): Boolean {
|
||||
val streamSetting = config.outboundBean?.streamSettings ?: return null
|
||||
|
||||
var result = server.replace(EConfigType.VMESS.protocolScheme, "")
|
||||
val indexSplit = result.indexOf("?")
|
||||
if (indexSplit > 0) {
|
||||
result = result.substring(0, indexSplit)
|
||||
}
|
||||
result = Utils.decode(result)
|
||||
|
||||
val arr1 = result.split('@')
|
||||
if (arr1.count() != 2) {
|
||||
return false
|
||||
}
|
||||
val arr21 = arr1[0].split(':')
|
||||
val arr22 = arr1[1].split(':')
|
||||
if (arr21.count() != 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
config.remarks = "Alien"
|
||||
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
|
||||
vnext.address = arr22[0]
|
||||
vnext.port = Utils.parseInt(arr22[1])
|
||||
vnext.users[0].id = arr21[1]
|
||||
vnext.users[0].security = arr21[0]
|
||||
config.remarks = Utils.urlDecode(uri.fragment ?: "")
|
||||
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
|
||||
vnext.address = uri.idnHost
|
||||
vnext.port = uri.port
|
||||
vnext.users[0].id = uri.userInfo
|
||||
vnext.users[0].security = V2rayConfig.DEFAULT_SECURITY
|
||||
vnext.users[0].alterId = 0
|
||||
}
|
||||
return true
|
||||
|
||||
val sni = streamSetting.populateTransportSettings(
|
||||
queryParam["type"] ?: "tcp",
|
||||
queryParam["headerType"],
|
||||
queryParam["host"],
|
||||
queryParam["path"],
|
||||
queryParam["seed"],
|
||||
queryParam["quicSecurity"],
|
||||
queryParam["key"],
|
||||
queryParam["mode"],
|
||||
queryParam["serviceName"],
|
||||
queryParam["authority"]
|
||||
)
|
||||
|
||||
allowInsecure = if ((queryParam["allowInsecure"] ?: "") == "1") true else allowInsecure
|
||||
streamSetting.populateTlsSettings(
|
||||
queryParam["security"] ?: "",
|
||||
allowInsecure,
|
||||
queryParam["sni"] ?: sni,
|
||||
queryParam["fp"] ?: "",
|
||||
queryParam["alpn"],
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
|
||||
return config
|
||||
}
|
||||
}
|
||||
@@ -25,14 +25,15 @@ object WireguardFmt {
|
||||
?: AppConfig.WIREGUARD_LOCAL_ADDRESS_V4).removeWhiteSpace()
|
||||
.split(",")
|
||||
wireguard.peers?.get(0)?.publicKey = queryParam["publickey"] ?: ""
|
||||
wireguard.peers?.get(0)?.endpoint = Utils.getIpv6Address(uri.idnHost) + ":${uri.port}"
|
||||
wireguard.peers?.get(0)?.endpoint =
|
||||
Utils.getIpv6Address(uri.idnHost) + ":${uri.port}"
|
||||
wireguard.mtu = Utils.parseInt(queryParam["mtu"] ?: AppConfig.WIREGUARD_LOCAL_MTU)
|
||||
wireguard.reserved =
|
||||
(queryParam["reserved"] ?: "0,0,0").removeWhiteSpace().split(",")
|
||||
.map { it.toInt() }
|
||||
}
|
||||
return config
|
||||
}else {
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ require (
|
||||
github.com/stretchr/testify v1.9.0
|
||||
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e
|
||||
github.com/vishvananda/netlink v1.2.1-beta.2.0.20230316163032-ced5aaba43e3
|
||||
github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc
|
||||
github.com/xtls/reality v0.0.0-20240711105359-4dbe0df83874
|
||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
|
||||
golang.org/x/crypto v0.25.0
|
||||
golang.org/x/net v0.27.0
|
||||
|
||||
+2
-2
@@ -163,8 +163,8 @@ github.com/vishvananda/netlink v1.2.1-beta.2.0.20230316163032-ced5aaba43e3/go.mo
|
||||
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
|
||||
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||
github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc h1:0Nj8T1n7F7+v4vRVroaJIvY6R0vNABLfPH+lzPHRJvI=
|
||||
github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc/go.mod h1:dm4y/1QwzjGaK17ofi0Vs6NpKAHegZky8qk6J2JJZAE=
|
||||
github.com/xtls/reality v0.0.0-20240711105359-4dbe0df83874 h1:Y6YuIN3XH/x+klNP7C/BfY2EUJzqXyNkQNfqGa+OCS4=
|
||||
github.com/xtls/reality v0.0.0-20240711105359-4dbe0df83874/go.mod h1:dm4y/1QwzjGaK17ofi0Vs6NpKAHegZky8qk6J2JJZAE=
|
||||
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
package browser_dialer
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
_ "embed"
|
||||
"encoding/base64"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/xtls/xray-core/common/errors"
|
||||
"github.com/xtls/xray-core/common/platform"
|
||||
"github.com/xtls/xray-core/common/uuid"
|
||||
)
|
||||
|
||||
//go:embed dialer.html
|
||||
var webpage []byte
|
||||
|
||||
var conns chan *websocket.Conn
|
||||
|
||||
var upgrader = &websocket.Upgrader{
|
||||
ReadBufferSize: 0,
|
||||
WriteBufferSize: 0,
|
||||
HandshakeTimeout: time.Second * 4,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
addr := platform.NewEnvFlag(platform.BrowserDialerAddress).GetValue(func() string { return "" })
|
||||
if addr != "" {
|
||||
token := uuid.New()
|
||||
csrfToken := token.String()
|
||||
webpage = bytes.ReplaceAll(webpage, []byte("csrfToken"), []byte(csrfToken))
|
||||
conns = make(chan *websocket.Conn, 256)
|
||||
go http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.Path == "/websocket" {
|
||||
if r.URL.Query().Get("token") == csrfToken {
|
||||
if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
|
||||
conns <- conn
|
||||
} else {
|
||||
errors.LogError(context.Background(), "Browser dialer http upgrade unexpected error")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
w.Write(webpage)
|
||||
}
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
func HasBrowserDialer() bool {
|
||||
return conns != nil
|
||||
}
|
||||
|
||||
func DialWS(uri string, ed []byte) (*websocket.Conn, error) {
|
||||
data := []byte("WS " + uri)
|
||||
if ed != nil {
|
||||
data = append(data, " "+base64.RawURLEncoding.EncodeToString(ed)...)
|
||||
}
|
||||
|
||||
return dialRaw(data)
|
||||
}
|
||||
|
||||
func DialGet(uri string) (*websocket.Conn, error) {
|
||||
data := []byte("GET " + uri)
|
||||
return dialRaw(data)
|
||||
}
|
||||
|
||||
func DialPost(uri string, payload []byte) error {
|
||||
data := []byte("POST " + uri)
|
||||
conn, err := dialRaw(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = conn.WriteMessage(websocket.BinaryMessage, payload)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = CheckOK(conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
conn.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func dialRaw(data []byte) (*websocket.Conn, error) {
|
||||
var conn *websocket.Conn
|
||||
for {
|
||||
conn = <-conns
|
||||
if conn.WriteMessage(websocket.TextMessage, data) != nil {
|
||||
conn.Close()
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
err := CheckOK(conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
func CheckOK(conn *websocket.Conn) error {
|
||||
if _, p, err := conn.ReadMessage(); err != nil {
|
||||
conn.Close()
|
||||
return err
|
||||
} else if s := string(p); s != "ok" {
|
||||
conn.Close()
|
||||
return errors.New(s)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Browser Dialer</title>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
// Copyright (c) 2021 XRAY. Mozilla Public License 2.0.
|
||||
var url = "ws://" + window.location.host + "/websocket?token=csrfToken";
|
||||
var clientIdleCount = 0;
|
||||
var upstreamGetCount = 0;
|
||||
var upstreamWsCount = 0;
|
||||
var upstreamPostCount = 0;
|
||||
setInterval(check, 1000);
|
||||
function check() {
|
||||
if (clientIdleCount > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
clientIdleCount += 1;
|
||||
console.log("Prepare", url);
|
||||
var ws = new WebSocket(url);
|
||||
// arraybuffer is significantly faster in chrome than default
|
||||
// blob, tested with chrome 123
|
||||
ws.binaryType = "arraybuffer";
|
||||
ws.onmessage = function (event) {
|
||||
clientIdleCount -= 1;
|
||||
let [method, url, protocol] = event.data.split(" ");
|
||||
if (method == "WS") {
|
||||
upstreamWsCount += 1;
|
||||
console.log("Dial WS", url, protocol);
|
||||
const wss = new WebSocket(url, protocol);
|
||||
wss.binaryType = "arraybuffer";
|
||||
var opened = false;
|
||||
ws.onmessage = function (event) {
|
||||
wss.send(event.data)
|
||||
}
|
||||
wss.onopen = function (event) {
|
||||
opened = true;
|
||||
ws.send("ok")
|
||||
}
|
||||
wss.onmessage = function (event) {
|
||||
ws.send(event.data)
|
||||
}
|
||||
wss.onclose = function (event) {
|
||||
upstreamWsCount -= 1;
|
||||
console.log("Dial WS DONE, remaining: ", upstreamWsCount);
|
||||
ws.close()
|
||||
}
|
||||
wss.onerror = function (event) {
|
||||
!opened && ws.send("fail")
|
||||
wss.close()
|
||||
}
|
||||
ws.onclose = function (event) {
|
||||
wss.close()
|
||||
}
|
||||
} else if (method == "GET") {
|
||||
(async () => {
|
||||
console.log("Dial GET", url);
|
||||
ws.send("ok");
|
||||
const controller = new AbortController();
|
||||
|
||||
/*
|
||||
Aborting a streaming response in JavaScript
|
||||
requires two levers to be pulled:
|
||||
|
||||
First, the streaming read itself has to be cancelled using
|
||||
reader.cancel(), only then controller.abort() will actually work.
|
||||
|
||||
If controller.abort() alone is called while a
|
||||
reader.read() is ongoing, it will block until the server closes the
|
||||
response, the page is refreshed or the network connection is lost.
|
||||
*/
|
||||
|
||||
let reader = null;
|
||||
ws.onclose = (event) => {
|
||||
try {
|
||||
reader && reader.cancel();
|
||||
} catch(e) {}
|
||||
|
||||
try {
|
||||
controller.abort();
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
try {
|
||||
upstreamGetCount += 1;
|
||||
const response = await fetch(url, {signal: controller.signal});
|
||||
|
||||
const body = await response.body;
|
||||
reader = body.getReader();
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
ws.send(value);
|
||||
if (done) break;
|
||||
}
|
||||
} finally {
|
||||
upstreamGetCount -= 1;
|
||||
console.log("Dial GET DONE, remaining: ", upstreamGetCount);
|
||||
ws.close();
|
||||
}
|
||||
})()
|
||||
} else if (method == "POST") {
|
||||
upstreamPostCount += 1;
|
||||
console.log("Dial POST", url);
|
||||
ws.send("ok");
|
||||
ws.onmessage = async (event) => {
|
||||
try {
|
||||
const response = await fetch(
|
||||
url,
|
||||
{method: "POST", body: event.data}
|
||||
);
|
||||
if (response.ok) {
|
||||
ws.send("ok");
|
||||
} else {
|
||||
console.error("bad status code");
|
||||
ws.send("fail");
|
||||
}
|
||||
} finally {
|
||||
upstreamPostCount -= 1;
|
||||
console.log("Dial POST DONE, remaining: ", upstreamPostCount);
|
||||
ws.close();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
check()
|
||||
}
|
||||
ws.onerror = function (event) {
|
||||
ws.close()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,39 @@
|
||||
package splithttp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
gonet "net"
|
||||
|
||||
"github.com/xtls/xray-core/transport/internet/browser_dialer"
|
||||
"github.com/xtls/xray-core/transport/internet/websocket"
|
||||
)
|
||||
|
||||
// implements splithttp.DialerClient in terms of browser dialer
|
||||
// has no fields because everything is global state :O)
|
||||
type BrowserDialerClient struct{}
|
||||
|
||||
func (c *BrowserDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) {
|
||||
conn, err := browser_dialer.DialGet(baseURL)
|
||||
dummyAddr := &gonet.IPAddr{}
|
||||
if err != nil {
|
||||
return nil, dummyAddr, dummyAddr, err
|
||||
}
|
||||
|
||||
return websocket.NewConnection(conn, dummyAddr, nil), conn.RemoteAddr(), conn.LocalAddr(), nil
|
||||
}
|
||||
|
||||
func (c *BrowserDialerClient) SendUploadRequest(ctx context.Context, url string, payload io.ReadWriteCloser, contentLength int64) error {
|
||||
bytes, err := ioutil.ReadAll(payload)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = browser_dialer.DialPost(url, bytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
package splithttp
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"io"
|
||||
gonet "net"
|
||||
"net/http"
|
||||
"net/http/httptrace"
|
||||
"sync"
|
||||
|
||||
"github.com/xtls/xray-core/common"
|
||||
"github.com/xtls/xray-core/common/errors"
|
||||
"github.com/xtls/xray-core/common/net"
|
||||
"github.com/xtls/xray-core/common/signal/done"
|
||||
)
|
||||
|
||||
// interface to abstract between use of browser dialer, vs net/http
|
||||
type DialerClient interface {
|
||||
// (ctx, baseURL, payload) -> err
|
||||
// baseURL already contains sessionId and seq
|
||||
SendUploadRequest(context.Context, string, io.ReadWriteCloser, int64) error
|
||||
|
||||
// (ctx, baseURL) -> (downloadReader, remoteAddr, localAddr)
|
||||
// baseURL already contains sessionId
|
||||
OpenDownload(context.Context, string) (io.ReadCloser, net.Addr, net.Addr, error)
|
||||
}
|
||||
|
||||
// implements splithttp.DialerClient in terms of direct network connections
|
||||
type DefaultDialerClient struct {
|
||||
transportConfig *Config
|
||||
download *http.Client
|
||||
upload *http.Client
|
||||
isH2 bool
|
||||
// pool of net.Conn, created using dialUploadConn
|
||||
uploadRawPool *sync.Pool
|
||||
dialUploadConn func(ctxInner context.Context) (net.Conn, error)
|
||||
}
|
||||
|
||||
func (c *DefaultDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) {
|
||||
var remoteAddr gonet.Addr
|
||||
var localAddr gonet.Addr
|
||||
// this is done when the TCP/UDP connection to the server was established,
|
||||
// and we can unblock the Dial function and print correct net addresses in
|
||||
// logs
|
||||
gotConn := done.New()
|
||||
|
||||
var downResponse io.ReadCloser
|
||||
gotDownResponse := done.New()
|
||||
|
||||
go func() {
|
||||
trace := &httptrace.ClientTrace{
|
||||
GotConn: func(connInfo httptrace.GotConnInfo) {
|
||||
remoteAddr = connInfo.Conn.RemoteAddr()
|
||||
localAddr = connInfo.Conn.LocalAddr()
|
||||
gotConn.Close()
|
||||
},
|
||||
}
|
||||
|
||||
// in case we hit an error, we want to unblock this part
|
||||
defer gotConn.Close()
|
||||
|
||||
req, err := http.NewRequestWithContext(
|
||||
httptrace.WithClientTrace(ctx, trace),
|
||||
"GET",
|
||||
baseURL,
|
||||
nil,
|
||||
)
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to construct download http request")
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
|
||||
req.Header = c.transportConfig.GetRequestHeader()
|
||||
|
||||
response, err := c.download.Do(req)
|
||||
gotConn.Close()
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to send download http request")
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
|
||||
if response.StatusCode != 200 {
|
||||
response.Body.Close()
|
||||
errors.LogInfo(ctx, "invalid status code on download:", response.Status)
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
|
||||
downResponse = response.Body
|
||||
gotDownResponse.Close()
|
||||
}()
|
||||
|
||||
// we want to block Dial until we know the remote address of the server,
|
||||
// for logging purposes
|
||||
<-gotConn.Wait()
|
||||
|
||||
lazyDownload := &LazyReader{
|
||||
CreateReader: func() (io.ReadCloser, error) {
|
||||
<-gotDownResponse.Wait()
|
||||
if downResponse == nil {
|
||||
return nil, errors.New("downResponse failed")
|
||||
}
|
||||
return downResponse, nil
|
||||
},
|
||||
}
|
||||
|
||||
return lazyDownload, remoteAddr, localAddr, nil
|
||||
}
|
||||
|
||||
func (c *DefaultDialerClient) SendUploadRequest(ctx context.Context, url string, payload io.ReadWriteCloser, contentLength int64) error {
|
||||
req, err := http.NewRequest("POST", url, payload)
|
||||
req.ContentLength = contentLength
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header = c.transportConfig.GetRequestHeader()
|
||||
|
||||
if c.isH2 {
|
||||
resp, err := c.upload.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
return errors.New("bad status code:", resp.Status)
|
||||
}
|
||||
} else {
|
||||
// stringify the entire HTTP/1.1 request so it can be
|
||||
// safely retried. if instead req.Write is called multiple
|
||||
// times, the body is already drained after the first
|
||||
// request
|
||||
requestBytes := new(bytes.Buffer)
|
||||
common.Must(req.Write(requestBytes))
|
||||
|
||||
var uploadConn any
|
||||
|
||||
for {
|
||||
uploadConn = c.uploadRawPool.Get()
|
||||
newConnection := uploadConn == nil
|
||||
if newConnection {
|
||||
uploadConn, err = c.dialUploadConn(context.WithoutCancel(ctx))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
_, err = uploadConn.(net.Conn).Write(requestBytes.Bytes())
|
||||
|
||||
// if the write failed, we try another connection from
|
||||
// the pool, until the write on a new connection fails.
|
||||
// failed writes to a pooled connection are normal when
|
||||
// the connection has been closed in the meantime.
|
||||
if err == nil {
|
||||
break
|
||||
} else if newConnection {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
c.uploadRawPool.Put(uploadConn)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,13 +1,10 @@
|
||||
package splithttp
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
gotls "crypto/tls"
|
||||
"io"
|
||||
gonet "net"
|
||||
"net/http"
|
||||
"net/http/httptrace"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"sync"
|
||||
@@ -17,10 +14,10 @@ import (
|
||||
"github.com/xtls/xray-core/common/buf"
|
||||
"github.com/xtls/xray-core/common/errors"
|
||||
"github.com/xtls/xray-core/common/net"
|
||||
"github.com/xtls/xray-core/common/signal/done"
|
||||
"github.com/xtls/xray-core/common/signal/semaphore"
|
||||
"github.com/xtls/xray-core/common/uuid"
|
||||
"github.com/xtls/xray-core/transport/internet"
|
||||
"github.com/xtls/xray-core/transport/internet/browser_dialer"
|
||||
"github.com/xtls/xray-core/transport/internet/stat"
|
||||
"github.com/xtls/xray-core/transport/internet/tls"
|
||||
"github.com/xtls/xray-core/transport/pipe"
|
||||
@@ -32,32 +29,31 @@ type dialerConf struct {
|
||||
*internet.MemoryStreamConfig
|
||||
}
|
||||
|
||||
type reusedClient struct {
|
||||
download *http.Client
|
||||
upload *http.Client
|
||||
isH2 bool
|
||||
// pool of net.Conn, created using dialUploadConn
|
||||
uploadRawPool *sync.Pool
|
||||
dialUploadConn func(ctxInner context.Context) (net.Conn, error)
|
||||
}
|
||||
|
||||
var (
|
||||
globalDialerMap map[dialerConf]reusedClient
|
||||
globalDialerMap map[dialerConf]DialerClient
|
||||
globalDialerAccess sync.Mutex
|
||||
)
|
||||
|
||||
func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) reusedClient {
|
||||
func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) DialerClient {
|
||||
if browser_dialer.HasBrowserDialer() {
|
||||
return &BrowserDialerClient{}
|
||||
}
|
||||
|
||||
globalDialerAccess.Lock()
|
||||
defer globalDialerAccess.Unlock()
|
||||
|
||||
if globalDialerMap == nil {
|
||||
globalDialerMap = make(map[dialerConf]reusedClient)
|
||||
globalDialerMap = make(map[dialerConf]DialerClient)
|
||||
}
|
||||
|
||||
if client, found := globalDialerMap[dialerConf{dest, streamSettings}]; found {
|
||||
return client
|
||||
}
|
||||
|
||||
if browser_dialer.HasBrowserDialer() {
|
||||
return &BrowserDialerClient{}
|
||||
}
|
||||
|
||||
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
|
||||
isH2 := tlsConfig != nil && !(len(tlsConfig.NextProtocol) == 1 && tlsConfig.NextProtocol[0] == "http/1.1")
|
||||
|
||||
@@ -116,7 +112,8 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
|
||||
uploadTransport = nil
|
||||
}
|
||||
|
||||
client := reusedClient{
|
||||
client := &DefaultDialerClient{
|
||||
transportConfig: streamSettings.ProtocolSettings.(*Config),
|
||||
download: &http.Client{
|
||||
Transport: downloadTransport,
|
||||
},
|
||||
@@ -160,80 +157,9 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
||||
|
||||
httpClient := getHTTPClient(ctx, dest, streamSettings)
|
||||
|
||||
var remoteAddr gonet.Addr
|
||||
var localAddr gonet.Addr
|
||||
// this is done when the TCP/UDP connection to the server was established,
|
||||
// and we can unblock the Dial function and print correct net addresses in
|
||||
// logs
|
||||
gotConn := done.New()
|
||||
|
||||
var downResponse io.ReadCloser
|
||||
gotDownResponse := done.New()
|
||||
|
||||
sessionIdUuid := uuid.New()
|
||||
sessionId := sessionIdUuid.String()
|
||||
|
||||
go func() {
|
||||
trace := &httptrace.ClientTrace{
|
||||
GotConn: func(connInfo httptrace.GotConnInfo) {
|
||||
remoteAddr = connInfo.Conn.RemoteAddr()
|
||||
localAddr = connInfo.Conn.LocalAddr()
|
||||
gotConn.Close()
|
||||
},
|
||||
}
|
||||
|
||||
// in case we hit an error, we want to unblock this part
|
||||
defer gotConn.Close()
|
||||
|
||||
req, err := http.NewRequestWithContext(
|
||||
httptrace.WithClientTrace(context.WithoutCancel(ctx), trace),
|
||||
"GET",
|
||||
requestURL.String()+sessionId,
|
||||
nil,
|
||||
)
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to construct download http request")
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
|
||||
req.Header = transportConfiguration.GetRequestHeader()
|
||||
|
||||
response, err := httpClient.download.Do(req)
|
||||
gotConn.Close()
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to send download http request")
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
|
||||
if response.StatusCode != 200 {
|
||||
response.Body.Close()
|
||||
errors.LogInfo(ctx, "invalid status code on download:", response.Status)
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
|
||||
// skip "ooooooooook" response
|
||||
trashHeader := []byte{0}
|
||||
for {
|
||||
_, err = io.ReadFull(response.Body, trashHeader)
|
||||
if err != nil {
|
||||
response.Body.Close()
|
||||
errors.LogInfoInner(ctx, err, "failed to read initial response")
|
||||
gotDownResponse.Close()
|
||||
return
|
||||
}
|
||||
if trashHeader[0] == 'k' {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
downResponse = response.Body
|
||||
gotDownResponse.Close()
|
||||
}()
|
||||
|
||||
uploadUrl := requestURL.String() + sessionId + "/"
|
||||
baseURL := requestURL.String() + sessionId
|
||||
|
||||
uploadPipeReader, uploadPipeWriter := pipe.New(pipe.WithSizeLimit(maxUploadSize))
|
||||
|
||||
@@ -252,97 +178,55 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
||||
|
||||
<-requestsLimiter.Wait()
|
||||
|
||||
url := uploadUrl + strconv.FormatInt(requestCounter, 10)
|
||||
seq := requestCounter
|
||||
requestCounter += 1
|
||||
|
||||
go func() {
|
||||
defer requestsLimiter.Signal()
|
||||
req, err := http.NewRequest("POST", url, &buf.MultiBufferContainer{MultiBuffer: chunk})
|
||||
|
||||
err := httpClient.SendUploadRequest(
|
||||
context.WithoutCancel(ctx),
|
||||
baseURL+"/"+strconv.FormatInt(seq, 10),
|
||||
&buf.MultiBufferContainer{MultiBuffer: chunk},
|
||||
int64(chunk.Len()),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to send upload")
|
||||
uploadPipeReader.Interrupt()
|
||||
return
|
||||
}
|
||||
|
||||
req.ContentLength = int64(chunk.Len())
|
||||
req.Header = transportConfiguration.GetRequestHeader()
|
||||
|
||||
if httpClient.isH2 {
|
||||
resp, err := httpClient.upload.Do(req)
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to send upload")
|
||||
uploadPipeReader.Interrupt()
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
errors.LogInfo(ctx, "failed to send upload, bad status code:", resp.Status)
|
||||
uploadPipeReader.Interrupt()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
var uploadConn any
|
||||
|
||||
// stringify the entire HTTP/1.1 request so it can be
|
||||
// safely retried. if instead req.Write is called multiple
|
||||
// times, the body is already drained after the first
|
||||
// request
|
||||
requestBytes := new(bytes.Buffer)
|
||||
common.Must(req.Write(requestBytes))
|
||||
|
||||
for {
|
||||
uploadConn = httpClient.uploadRawPool.Get()
|
||||
newConnection := uploadConn == nil
|
||||
if newConnection {
|
||||
uploadConn, err = httpClient.dialUploadConn(context.WithoutCancel(ctx))
|
||||
if err != nil {
|
||||
errors.LogInfoInner(ctx, err, "failed to connect upload")
|
||||
uploadPipeReader.Interrupt()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
_, err = uploadConn.(net.Conn).Write(requestBytes.Bytes())
|
||||
|
||||
// if the write failed, we try another connection from
|
||||
// the pool, until the write on a new connection fails.
|
||||
// failed writes to a pooled connection are normal when
|
||||
// the connection has been closed in the meantime.
|
||||
if err == nil {
|
||||
break
|
||||
} else if newConnection {
|
||||
errors.LogInfoInner(ctx, err, "failed to send upload")
|
||||
uploadPipeReader.Interrupt()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
httpClient.uploadRawPool.Put(uploadConn)
|
||||
}
|
||||
}()
|
||||
|
||||
}
|
||||
}()
|
||||
|
||||
// we want to block Dial until we know the remote address of the server,
|
||||
// for logging purposes
|
||||
<-gotConn.Wait()
|
||||
lazyRawDownload, remoteAddr, localAddr, err := httpClient.OpenDownload(context.WithoutCancel(ctx), baseURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
lazyDownload := &LazyReader{
|
||||
CreateReader: func() (io.ReadCloser, error) {
|
||||
// skip "ooooooooook" response
|
||||
trashHeader := []byte{0}
|
||||
for {
|
||||
_, err := io.ReadFull(lazyRawDownload, trashHeader)
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to read initial response").Base(err)
|
||||
}
|
||||
if trashHeader[0] == 'k' {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return lazyRawDownload, nil
|
||||
},
|
||||
}
|
||||
|
||||
// necessary in order to send larger chunks in upload
|
||||
bufferedUploadPipeWriter := buf.NewBufferedWriter(uploadPipeWriter)
|
||||
bufferedUploadPipeWriter.SetBuffered(false)
|
||||
|
||||
lazyDownload := &LazyReader{
|
||||
CreateReader: func() (io.ReadCloser, error) {
|
||||
<-gotDownResponse.Wait()
|
||||
if downResponse == nil {
|
||||
return nil, errors.New("downResponse failed")
|
||||
}
|
||||
return downResponse, nil
|
||||
},
|
||||
}
|
||||
|
||||
conn := splitConn{
|
||||
writer: bufferedUploadPipeWriter,
|
||||
reader: lazyDownload,
|
||||
|
||||
@@ -32,7 +32,7 @@ type requestHandler struct {
|
||||
}
|
||||
|
||||
type httpSession struct {
|
||||
uploadQueue *UploadQueue
|
||||
uploadQueue *uploadQueue
|
||||
// for as long as the GET request is not opened by the client, this will be
|
||||
// open ("undone"), and the session may be expired within a certain TTL.
|
||||
// after the client connects, this becomes "done" and the session lives as
|
||||
@@ -163,7 +163,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
|
||||
writer.Header().Set("X-Accel-Buffering", "no")
|
||||
// magic header to make the HTTP middle box consider this as SSE to disable buffer
|
||||
writer.Header().Set("Content-Type", "text/event-stream")
|
||||
|
||||
|
||||
writer.WriteHeader(http.StatusOK)
|
||||
// send a chunk immediately to enable CDN streaming.
|
||||
// many CDN buffer the response headers until the origin starts sending
|
||||
|
||||
@@ -15,7 +15,7 @@ type Packet struct {
|
||||
Seq uint64
|
||||
}
|
||||
|
||||
type UploadQueue struct {
|
||||
type uploadQueue struct {
|
||||
pushedPackets chan Packet
|
||||
heap uploadHeap
|
||||
nextSeq uint64
|
||||
@@ -23,8 +23,8 @@ type UploadQueue struct {
|
||||
maxPackets int
|
||||
}
|
||||
|
||||
func NewUploadQueue(maxPackets int) *UploadQueue {
|
||||
return &UploadQueue{
|
||||
func NewUploadQueue(maxPackets int) *uploadQueue {
|
||||
return &uploadQueue{
|
||||
pushedPackets: make(chan Packet, maxPackets),
|
||||
heap: uploadHeap{},
|
||||
nextSeq: 0,
|
||||
@@ -33,7 +33,7 @@ func NewUploadQueue(maxPackets int) *UploadQueue {
|
||||
}
|
||||
}
|
||||
|
||||
func (h *UploadQueue) Push(p Packet) error {
|
||||
func (h *uploadQueue) Push(p Packet) error {
|
||||
if h.closed {
|
||||
return errors.New("splithttp packet queue closed")
|
||||
}
|
||||
@@ -42,13 +42,13 @@ func (h *UploadQueue) Push(p Packet) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *UploadQueue) Close() error {
|
||||
func (h *uploadQueue) Close() error {
|
||||
h.closed = true
|
||||
close(h.pushedPackets)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *UploadQueue) Read(b []byte) (int, error) {
|
||||
func (h *uploadQueue) Read(b []byte) (int, error) {
|
||||
if h.closed {
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
@@ -15,16 +15,14 @@ var _ buf.Writer = (*connection)(nil)
|
||||
|
||||
// connection is a wrapper for net.Conn over WebSocket connection.
|
||||
type connection struct {
|
||||
conn *websocket.Conn
|
||||
reader io.Reader
|
||||
remoteAddr net.Addr
|
||||
conn *websocket.Conn
|
||||
reader io.Reader
|
||||
}
|
||||
|
||||
func newConnection(conn *websocket.Conn, remoteAddr net.Addr, extraReader io.Reader) *connection {
|
||||
func NewConnection(conn *websocket.Conn, remoteAddr net.Addr, extraReader io.Reader) *connection {
|
||||
return &connection{
|
||||
conn: conn,
|
||||
remoteAddr: remoteAddr,
|
||||
reader: extraReader,
|
||||
conn: conn,
|
||||
reader: extraReader,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +90,7 @@ func (c *connection) LocalAddr() net.Addr {
|
||||
}
|
||||
|
||||
func (c *connection) RemoteAddr() net.Addr {
|
||||
return c.remoteAddr
|
||||
return c.conn.RemoteAddr()
|
||||
}
|
||||
|
||||
func (c *connection) SetDeadline(t time.Time) error {
|
||||
|
||||
@@ -1,54 +1,23 @@
|
||||
package websocket
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
_ "embed"
|
||||
"encoding/base64"
|
||||
"io"
|
||||
gonet "net"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/xtls/xray-core/common"
|
||||
"github.com/xtls/xray-core/common/errors"
|
||||
"github.com/xtls/xray-core/common/net"
|
||||
"github.com/xtls/xray-core/common/platform"
|
||||
"github.com/xtls/xray-core/common/uuid"
|
||||
"github.com/xtls/xray-core/transport/internet"
|
||||
"github.com/xtls/xray-core/transport/internet/browser_dialer"
|
||||
"github.com/xtls/xray-core/transport/internet/stat"
|
||||
"github.com/xtls/xray-core/transport/internet/tls"
|
||||
)
|
||||
|
||||
//go:embed dialer.html
|
||||
var webpage []byte
|
||||
|
||||
var conns chan *websocket.Conn
|
||||
|
||||
func init() {
|
||||
addr := platform.NewEnvFlag(platform.BrowserDialerAddress).GetValue(func() string { return "" })
|
||||
if addr != "" {
|
||||
token := uuid.New()
|
||||
csrfToken := token.String()
|
||||
webpage = bytes.ReplaceAll(webpage, []byte("csrfToken"), []byte(csrfToken))
|
||||
conns = make(chan *websocket.Conn, 256)
|
||||
go http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.Path == "/websocket" {
|
||||
if r.URL.Query().Get("token") == csrfToken {
|
||||
if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
|
||||
conns <- conn
|
||||
} else {
|
||||
errors.LogError(context.Background(), "Browser dialer http upgrade unexpected error")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
w.Write(webpage)
|
||||
}
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
// Dial dials a WebSocket connection to the given destination.
|
||||
func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) {
|
||||
errors.LogInfo(ctx, "creating connection to ", dest)
|
||||
@@ -98,18 +67,18 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
|
||||
// Like the NetDial in the dialer
|
||||
pconn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
||||
if err != nil {
|
||||
errors.LogErrorInner(ctx, err, "failed to dial to " + addr)
|
||||
errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
|
||||
return nil, err
|
||||
}
|
||||
// TLS and apply the handshake
|
||||
cn := tls.UClient(pconn, tlsConfig, fingerprint).(*tls.UConn)
|
||||
if err := cn.WebsocketHandshakeContext(ctx); err != nil {
|
||||
errors.LogErrorInner(ctx, err, "failed to dial to " + addr)
|
||||
errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
|
||||
return nil, err
|
||||
}
|
||||
if !tlsConfig.InsecureSkipVerify {
|
||||
if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil {
|
||||
errors.LogErrorInner(ctx, err, "failed to dial to " + addr)
|
||||
errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
@@ -124,28 +93,13 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
|
||||
}
|
||||
uri := protocol + "://" + host + wsSettings.GetNormalizedPath()
|
||||
|
||||
if conns != nil {
|
||||
data := []byte(uri)
|
||||
if ed != nil {
|
||||
data = append(data, " "+base64.RawURLEncoding.EncodeToString(ed)...)
|
||||
}
|
||||
var conn *websocket.Conn
|
||||
for {
|
||||
conn = <-conns
|
||||
if conn.WriteMessage(websocket.TextMessage, data) != nil {
|
||||
conn.Close()
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
if _, p, err := conn.ReadMessage(); err != nil {
|
||||
conn.Close()
|
||||
if browser_dialer.HasBrowserDialer() {
|
||||
conn, err := browser_dialer.DialWS(uri, ed)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if s := string(p); s != "ok" {
|
||||
conn.Close()
|
||||
return nil, errors.New(s)
|
||||
}
|
||||
return newConnection(conn, conn.RemoteAddr(), nil), nil
|
||||
|
||||
return NewConnection(conn, conn.RemoteAddr(), nil), nil
|
||||
}
|
||||
|
||||
header := wsSettings.GetRequestHeader()
|
||||
@@ -163,7 +117,7 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
|
||||
return nil, errors.New("failed to dial to (", uri, "): ", reason).Base(err)
|
||||
}
|
||||
|
||||
return newConnection(conn, conn.RemoteAddr(), nil), nil
|
||||
return NewConnection(conn, conn.RemoteAddr(), nil), nil
|
||||
}
|
||||
|
||||
type delayDialConn struct {
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Browser Dialer</title>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
// Copyright (c) 2021 XRAY. Mozilla Public License 2.0.
|
||||
var url = "ws://" + window.location.host + "/websocket?token=csrfToken"
|
||||
var count = 0
|
||||
setInterval(check, 1000)
|
||||
function check() {
|
||||
if (count <= 0) {
|
||||
count += 1
|
||||
console.log("Prepare", url)
|
||||
var ws = new WebSocket(url)
|
||||
// arraybuffer is significantly faster in chrome than default
|
||||
// blob, tested with chrome 123
|
||||
ws.binaryType = "arraybuffer";
|
||||
var wss = undefined
|
||||
var first = true
|
||||
ws.onmessage = function (event) {
|
||||
if (first) {
|
||||
first = false
|
||||
count -= 1
|
||||
var arr = event.data.split(" ")
|
||||
console.log("Dial", arr[0], arr[1])
|
||||
wss = new WebSocket(arr[0], arr[1])
|
||||
wss.binaryType = "arraybuffer";
|
||||
var opened = false
|
||||
wss.onopen = function (event) {
|
||||
opened = true
|
||||
ws.send("ok")
|
||||
}
|
||||
wss.onmessage = function (event) {
|
||||
ws.send(event.data)
|
||||
}
|
||||
wss.onclose = function (event) {
|
||||
ws.close()
|
||||
}
|
||||
wss.onerror = function (event) {
|
||||
!opened && ws.send("fail")
|
||||
wss.close()
|
||||
}
|
||||
check()
|
||||
} else wss.send(event.data)
|
||||
}
|
||||
ws.onclose = function (event) {
|
||||
if (first) count -= 1
|
||||
else wss.close()
|
||||
}
|
||||
ws.onerror = function (event) {
|
||||
ws.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -73,7 +73,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
|
||||
}
|
||||
}
|
||||
|
||||
h.ln.addConn(newConnection(conn, remoteAddr, extraReader))
|
||||
h.ln.addConn(NewConnection(conn, remoteAddr, extraReader))
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
|
||||
@@ -8,3 +8,4 @@
|
||||
*.qm binary
|
||||
*.mo binary
|
||||
*.gmo binary
|
||||
*.strings binary
|
||||
|
||||
+1
-1
@@ -96,7 +96,7 @@ jobs:
|
||||
:SetNewVCToolsVersion
|
||||
set VCToolsVersion=
|
||||
mingw64-clang-tidy:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
if: ${{ github.event_name != 'release' }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
+7
-8
@@ -39,7 +39,7 @@ env:
|
||||
GOPROXY: direct
|
||||
jobs:
|
||||
mingw64-release:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -131,15 +131,14 @@ jobs:
|
||||
- name: Populate depedencies (i686)
|
||||
if: ${{ matrix.arch == 'i686' }}
|
||||
run: |
|
||||
# fix for missing i386 deb packages from deb.sury.org repository
|
||||
sudo add-apt-repository ppa:ondrej/php
|
||||
# alternative fix is to downgrade overloaded libpcre2 versions with five locally installed packages which are PHP-related and came from deb.sury.org repository.
|
||||
# sudo apt-get install -y --allow-downgrades libpcre2-8-0=10.34-7ubuntu0.1 libpcre2-16-0=10.34-7ubuntu0.1 libpcre2-32-0=10.34-7ubuntu0.1 libpcre2-dev=10.34-7ubuntu0.1 libgd3=2.2.5-5.2ubuntu2.1
|
||||
sudo dpkg --add-architecture i386 && sudo apt-get update -qq && sudo apt-get install -y wine wine32
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y wine wine32
|
||||
- name: Populate depedencies (x86_64)
|
||||
if: ${{ matrix.arch == 'x86_64' || matrix.arch == 'aarch64' }}
|
||||
if: ${{ matrix.arch == 'x86_64' }}
|
||||
run: |
|
||||
sudo apt-get update -qq && sudo apt-get install -y wine wine64
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y wine wine64
|
||||
- name: Patch libcxx for windows xp
|
||||
if: ${{ matrix.arch == 'i686' || matrix.arch == 'x86_64' }}
|
||||
run: |
|
||||
|
||||
@@ -23,7 +23,7 @@ BOOL WINAPI ProcessPrng(PBYTE pbData, SIZE_T cbData);
|
||||
namespace {
|
||||
|
||||
// wine's trick
|
||||
decltype(&ProcessPrng) GetProcessPrngFallback(void) {
|
||||
decltype(&ProcessPrng) GetProcessPrngFallback() {
|
||||
HMODULE hmod = LoadLibraryW(L"advapi32");
|
||||
CHECK(hmod);
|
||||
auto process_prng_fn =
|
||||
|
||||
@@ -79,7 +79,7 @@ TEST(UtilsTest, StringToInteger) {
|
||||
ASSERT_TRUE(i.has_value());
|
||||
ASSERT_EQ(i.value(), 123);
|
||||
|
||||
const char s3[] = "123";
|
||||
constexpr const char s3[] = "123\1";
|
||||
i = StringToInteger(std::string(s3, 3));
|
||||
ASSERT_TRUE(i.has_value());
|
||||
ASSERT_EQ(i.value(), 123);
|
||||
@@ -87,7 +87,7 @@ TEST(UtilsTest, StringToInteger) {
|
||||
i = StringToInteger(std::string(s3, 4));
|
||||
ASSERT_FALSE(i.has_value());
|
||||
|
||||
const char s4[] = "123a";
|
||||
constexpr const char s4[] = "123a\1";
|
||||
|
||||
i = StringToInteger(std::string(s4, 4));
|
||||
ASSERT_FALSE(i.has_value());
|
||||
@@ -97,13 +97,13 @@ TEST(UtilsTest, GetTempDir) {
|
||||
std::string tmp_dir;
|
||||
ASSERT_TRUE(GetTempDir(&tmp_dir));
|
||||
ASSERT_FALSE(tmp_dir.empty());
|
||||
LOG(ERROR) << "tmp_dir: " << tmp_dir;
|
||||
LOG(WARNING) << "tmp_dir: " << tmp_dir;
|
||||
}
|
||||
|
||||
TEST(UtilsTest, GetHomeDir) {
|
||||
std::string home_dir = GetHomeDir();
|
||||
ASSERT_FALSE(home_dir.empty());
|
||||
LOG(ERROR) << "home_dir: " << home_dir;
|
||||
LOG(WARNING) << "home_dir: " << home_dir;
|
||||
}
|
||||
|
||||
TEST(UtilsTest, ReadFileAndWrite4K) {
|
||||
|
||||
@@ -31,7 +31,7 @@ FARPROC WINAPI HandleDelayLoadFailureCommon(unsigned reason,
|
||||
// behavior or be hard to diagnose. See https://crbug.com/1320845.
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
namespace {
|
||||
@@ -44,7 +44,7 @@ bool g_hooks_enabled = true;
|
||||
FARPROC WINAPI DelayLoadFailureHookEXE(unsigned reason,
|
||||
DelayLoadInfo* dll_info) {
|
||||
if (!g_hooks_enabled)
|
||||
return 0;
|
||||
return nullptr;
|
||||
|
||||
return HandleDelayLoadFailureCommon(reason, dll_info);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user