diff --git a/.eslintignore b/.eslintignore index 0baf8092f7..7b17dcf634 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,3 @@ -*.min.js \ No newline at end of file +*.min.js +*.ts +*.tsx \ No newline at end of file diff --git a/README.md b/README.md index 6a4752e76f..e99a174fb8 100644 --- a/README.md +++ b/README.md @@ -101,3 +101,43 @@ Install golint. (see https://github.com/golang/lint) The explorer uses Highsoft charts which are not free for commercial and governmental use. If you plan to use the explorer for commercial purposes you currently need to purchase an appropriate HighSoft license. We are planning to switch out the Highsoft chart library with a less restrictive charting library (suggestions are welcome). + + +# TypeScript development +TypeScript development support is provided via esbuild. The existing build pipeline and project structure is mostly unchanged; TypeScript files are compiled to JavaScript files which are then picked up by the existing build pipeline. +Bundling is done by esbuild via the Go server (no Node build step required). + +### Guidelines +- Place feature code under `static//` with a small entry module (e.g., `.entry.ts`), then reference the emitted JS from the template. +- You may separate the code in different files, only `.entry.ts` files are compiled. +- Templates load ESM bundles via ``. +- If you add a new `.entry.ts`, restart the server so esbuild picks it up. + +#### Compiling + Watch + sourcemaps +Install first `npm` dependencies: +```bash +npm install +``` +To compile TS files, run: +```bash +go run ./cmd/bundle -compile-ts +``` +For continuous rebuilding while editing TypeScript: +```bash +go run ./cmd/bundle -watch-ts +``` +to enable sourcemaps during development, run with the `-ts-sourcemap` flag: +```bash +go run ./cmd/bundle -watch-ts -ts-sourcemap +``` +- `-compile-ts` compiles all `.entry.ts` files once. +- `-watch-ts` enables incremental rebuilds on file change. +- `-ts-sourcemap` emits sourcemaps so DevTools shows original `.ts` sources. Use external maps for prod-like dev; inline maps are fine for quick local debugging. + +#### Typed globals (jQuery, Bootstrap, DataTables) +- Make sure to run: `npm install` in order to install ambient types so you get IntelliSense on globals: @types/jquery, @types/bootstrap, @types/datatables.net +- You can use $ / jQuery, bootstrap namespace, and DataTables without imports; the editor knows their types. +- These libraries are considered to be provided as globals by the templates at runtime; do not import them in TS. + +### Notes +- No ESLint for TS yet; Solution for now relies on the editor to provide TypeScript diagnostics. \ No newline at end of file diff --git a/cmd/bundle/main.go b/cmd/bundle/main.go index bde003908d..9e8108d7ca 100644 --- a/cmd/bundle/main.go +++ b/cmd/bundle/main.go @@ -2,17 +2,169 @@ package main import ( "crypto/md5" + "flag" "fmt" + "io/fs" "log" "os" "path" + "path/filepath" "strings" + "time" + "github.com/fsnotify/fsnotify" "github.com/gobitfly/eth2-beaconchain-explorer/utils" "github.com/evanw/esbuild/pkg/api" ) +var tsSourceMap = flag.Bool("ts-sourcemap", false, "emit inline sourcemaps for TS (dev)") + +// buildTypeScript compiles all TS/TSX under static/ into static/js/[name].js +func buildTypeScript(staticDir string) error { + // Only explicit entry files; imports will be bundled into those outputs. + isEntry := func(p string) bool { + return strings.HasSuffix(p, ".entry.ts") || strings.HasSuffix(p, ".entry.tsx") + } + + var entries []string + err := filepath.WalkDir(staticDir, func(p string, d fs.DirEntry, walkErr error) error { + if walkErr != nil { + return walkErr + } + if d.IsDir() { + switch d.Name() { + case "js", "bundle", "node_modules": + return filepath.SkipDir + } + return nil + } + if strings.HasSuffix(p, ".d.ts") { + return nil + } + if (strings.HasSuffix(p, ".ts") || strings.HasSuffix(p, ".tsx")) && isEntry(p) { + entries = append(entries, p) + } + return nil + }) + if err != nil { + return err + } + if len(entries) == 0 { + return nil + } + + opts := api.BuildOptions{ + EntryPoints: entries, + Outdir: path.Join(staticDir, "js"), + Outbase: staticDir, + Bundle: true, + Format: api.FormatESModule, + Platform: api.PlatformBrowser, + Loader: map[string]api.Loader{ + ".ts": api.LoaderTS, + ".tsx": api.LoaderTSX, + ".json": api.LoaderJSON, + }, + // Add source maps (inline for dev only) + Sourcemap: func() api.SourceMap { + if tsSourceMap != nil && *tsSourceMap { + return api.SourceMapInline + } + return api.SourceMapNone + }(), + Write: true, + LogLevel: api.LogLevelInfo, + } + + result := api.Build(opts) + if len(result.Errors) > 0 { + return fmt.Errorf("ts build failed: %v", result.Errors) + } + + return nil +} + +// Very small watcher for .ts/.tsx that calls buildTypeScript once per change. +func watchTypeScript(staticDir string) error { + // initial build + if err := buildTypeScript(staticDir); err != nil { + return err + } + + w, err := fsnotify.NewWatcher() + if err != nil { + return fmt.Errorf("watcher init: %w", err) + } + defer w.Close() + + // watch all subdirs under static/, except outputs to avoid loops + err = filepath.WalkDir(staticDir, func(p string, d fs.DirEntry, walkErr error) error { + if walkErr != nil { + return nil + } + if d.IsDir() { + base := filepath.Base(p) + switch base { + case "js", "bundle", "node_modules": + return filepath.SkipDir + } + _ = w.Add(p) + } + return nil + }) + if err != nil { + return fmt.Errorf("walk watch dirs: %w", err) + } + + isOutput := func(p string) bool { + sep := string(filepath.Separator) + return strings.Contains(p, sep+"js"+sep) || strings.Contains(p, sep+"bundle"+sep) + } + okExt := func(p string) bool { + ext := strings.ToLower(filepath.Ext(p)) + return ext == ".ts" || ext == ".tsx" + } + + // debounce rapid events + var timer *time.Timer + trigger := func() { + if timer != nil { + timer.Stop() + } + timer = time.AfterFunc(200*time.Millisecond, func() { + if err := buildTypeScript(staticDir); err != nil { + log.Printf("TS rebuild failed: %v", err) + } else { + log.Println("TS rebuilt") + } + }) + } + + log.Println("Watching TypeScript for changes...") + for { + select { + case ev := <-w.Events: + if ev.Op&(fsnotify.Create|fsnotify.Write|fsnotify.Rename|fsnotify.Remove) == 0 { + continue + } + if isOutput(ev.Name) || !okExt(ev.Name) { + continue + } + + if ev.Op&fsnotify.Create != 0 { + if fi, e := os.Stat(ev.Name); e == nil && fi.IsDir() { + _ = w.Add(ev.Name) + } + } + trigger() + + case e := <-w.Errors: + log.Printf("watch error: %v", e) + } + } +} + func bundle(staticDir string) (map[string]string, error) { nameMapping := make(map[string]string, 0) @@ -32,7 +184,7 @@ func bundle(staticDir string) (map[string]string, error) { bundleDir := path.Join(staticDir, "bundle") if _, err := os.Stat(bundleDir); os.IsNotExist(err) { - os.Mkdir(bundleDir, 0755) + os.MkdirAll(bundleDir, 0755) } else if err != nil { return nameMapping, fmt.Errorf("error getting stats about the bundle dir: %v", err) } @@ -72,9 +224,9 @@ func bundle(staticDir string) (map[string]string, error) { } for _, match := range matches { - code, err := os.ReadFile(match) - if err != nil { - return nameMapping, fmt.Errorf("error reading file %v", err) + code, readErr := os.ReadFile(match) + if readErr != nil { + return nameMapping, fmt.Errorf("error reading file %v", readErr) } if !strings.Contains(match, ".min") { content := string(code) @@ -87,7 +239,7 @@ func bundle(staticDir string) (map[string]string, error) { matchBundle := strings.Replace(match, typeDir, bundleTypeDir, -1) if _, err := os.Stat(path.Dir(matchBundle)); os.IsNotExist(err) { - os.Mkdir(path.Dir(matchBundle), 0755) + os.MkdirAll(path.Dir(matchBundle), 0755) } codeHash := fmt.Sprintf("%x", md5.Sum([]byte(code))) @@ -135,12 +287,30 @@ func replaceFilesNames(files map[string]string) error { } func main() { - files, err := bundle("./static") - if err != nil { - log.Fatalf("error bundling: %v", err) - } + staticDir := flag.String("static", "./static", "path to static directory") + watchTS := flag.Bool("watch-ts", false, "watch and rebuild TypeScript on changes (dev only)") + compileTS := flag.Bool("compile-ts", false, "compile TypeScript assets before bundling (dev only)") + flag.Parse() - if err := replaceFilesNames(files); err != nil { - log.Fatalf("error replacing dependencies err: %v", err) - } + if *watchTS { + if err := watchTypeScript(*staticDir); err != nil { + log.Fatal(err) + } + return + } + + if *compileTS { + if err := buildTypeScript(*staticDir); err != nil { + log.Fatalf("error compiling typescript: %v", err) + } + } + + files, err := bundle(*staticDir) + if err != nil { + log.Fatalf("error bundling: %v", err) + } + + if err := replaceFilesNames(files); err != nil { + log.Fatalf("error replacing dependencies err: %v", err) + } } diff --git a/cmd/explorer/main.go b/cmd/explorer/main.go index 4824a974ed..bf2ca9ec08 100644 --- a/cmd/explorer/main.go +++ b/cmd/explorer/main.go @@ -569,6 +569,9 @@ func main() { authRouter.HandleFunc("/mobile/delete", handlers.MobileDeviceDeletePOST).Methods("POST", "OPTIONS") authRouter.HandleFunc("/authorize", handlers.UserAuthorizeConfirmPost).Methods("POST") authRouter.HandleFunc("/settings", handlers.UserSettings).Methods("GET") + + authRouter.HandleFunc("/api-key-management", handlers.APIKeyManagement).Methods("GET") + authRouter.HandleFunc("/settings/password", handlers.UserUpdatePasswordPost).Methods("POST") authRouter.HandleFunc("/settings/flags", handlers.UserUpdateFlagsPost).Methods("POST") authRouter.HandleFunc("/settings/delete", handlers.UserDeletePost).Methods("POST") @@ -596,6 +599,7 @@ func main() { authRouter.HandleFunc("/subscriptions/data", handlers.UserSubscriptionsData).Methods("GET") authRouter.HandleFunc("/generateKey", handlers.GenerateAPIKey).Methods("POST") + authRouter.HandleFunc("/ethClients", handlers.EthClientsServices).Methods("GET") authRouter.HandleFunc("/webhooks", handlers.NotificationWebhookPage).Methods("GET") authRouter.HandleFunc("/webhooks/add", handlers.UsersAddWebhook).Methods("POST") diff --git a/go.mod b/go.mod index 5cfbf80f6a..55a58960f5 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,8 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/doug-martin/goqu/v9 v9.19.0 github.com/ethereum/go-ethereum v1.14.6-0.20250124151602-75526bb8e01b - github.com/evanw/esbuild v0.8.23 + github.com/evanw/esbuild v0.25.11 + github.com/fsnotify/fsnotify v1.6.0 github.com/go-redis/redis/v8 v8.11.5 github.com/gobitfly/eth-rewards v0.1.2-0.20230403064929-411ddc40a5f7 github.com/gobitfly/scs/v2 v2.0.0-20240516120302-8754831e6b9b @@ -36,7 +37,6 @@ require ( github.com/gorilla/websocket v1.5.3 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/jackc/pgx-shopspring-decimal v0.0.0-20220624020537-1d36b5a1853e - github.com/jackc/pgx/v4 v4.18.1 github.com/jackc/pgx/v5 v5.4.3 github.com/jmoiron/sqlx v1.2.0 github.com/juliangruber/go-intersect v1.1.0 @@ -131,7 +131,6 @@ require ( github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/glendc/go-external-ip v0.1.0 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect @@ -160,9 +159,6 @@ require ( github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/ipld/go-codec-dagpb v1.6.0 // indirect github.com/ipld/go-ipld-prime v0.20.0 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.14.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.2 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect diff --git a/go.sum b/go.sum index d88d3be041..bcafd919e2 100644 --- a/go.sum +++ b/go.sum @@ -37,7 +37,6 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Gurpartap/storekit-go v0.0.0-20201205024111-36b6cd5c6a21 h1:HcdvlzaQ4CJfH7xbfJZ3ZHN//BTEpId46iKEMuP3wHE= github.com/Gurpartap/storekit-go v0.0.0-20201205024111-36b6cd5c6a21/go.mod h1:7PODFS++oNZ6khojmPBvkrDeFO/hrc3jmvWvQAOXorw= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= @@ -119,7 +118,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= @@ -190,8 +188,8 @@ github.com/ethereum/go-ethereum v1.14.6-0.20250124151602-75526bb8e01b h1:G8jJ0o1 github.com/ethereum/go-ethereum v1.14.6-0.20250124151602-75526bb8e01b/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= -github.com/evanw/esbuild v0.8.23 h1:eRRG1fNtQ9KPG3lM62EUYagLVMSuxSTBEgukqY0et3w= -github.com/evanw/esbuild v0.8.23/go.mod h1:y2AFBAGVelPqPodpdtxWWqe6n2jYf5FrsJbligmRmuw= +github.com/evanw/esbuild v0.25.11 h1:NGtezc+xk+Mti4fgWaoD3dncZNCzcTA+r0BxMV3Koyw= +github.com/evanw/esbuild v0.25.11/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -270,7 +268,6 @@ github.com/goccy/go-yaml v1.10.0 h1:rBi+5HGuznOxx0JZ+60LDY85gc0dyIJCIMvsMJTKSKQ= github.com/goccy/go-yaml v1.10.0/go.mod h1:h/18Lr6oSQ3mvmqFoWmQ47KChOgpfHpTyIHl3yVmpiY= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -425,6 +422,7 @@ github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYt github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -441,10 +439,10 @@ github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -476,7 +474,6 @@ github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSlj github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -817,8 +814,6 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -827,10 +822,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stripe/stripe-go/v72 v72.50.0 h1:oy+EsSKMrFS3zzayb8Ic+2LZ04Ux0vJ4990/7psaYsc= @@ -890,7 +882,6 @@ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7Jul github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= @@ -955,9 +946,7 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= @@ -968,7 +957,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -988,8 +976,6 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= @@ -999,7 +985,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1021,7 +1006,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1036,7 +1020,6 @@ golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1049,7 +1032,6 @@ golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1058,7 +1040,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= @@ -1077,7 +1058,6 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/handlers/pageData.go b/handlers/pageData.go index 1fac561358..09586e2c78 100644 --- a/handlers/pageData.go +++ b/handlers/pageData.go @@ -253,7 +253,7 @@ func createMenuItems(active string, isMain bool, hasV1Notifications types.UserV1 Links: []types.NavigationLink{ { Label: "Get API Key", - Path: "/user/settings#api", + Path: "/user/api-key-management", Icon: "fa-key", }, { diff --git a/handlers/stripe.go b/handlers/stripe.go index e5a66a3e82..7b5a58d6b0 100644 --- a/handlers/stripe.go +++ b/handlers/stripe.go @@ -712,7 +712,7 @@ func emailCustomerAboutPlanChange(email, plan string) { } else if plan == utils.Config.Frontend.Stripe.OrcaYearly { p = "Orca (yearly)" } - page := "/user/settings#api" + page := "/user/api-key-management" if !isApi { page = "/premium" } diff --git a/handlers/user.go b/handlers/user.go index f0c330fbf5..865d7e522b 100644 --- a/handlers/user.go +++ b/handlers/user.go @@ -172,6 +172,71 @@ func GenerateAPIKey(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, r.Referer(), http.StatusSeeOther) } +func APIKeyManagement(w http.ResponseWriter, r *http.Request) { + templateFiles := append(layoutTemplateFiles, + "user/api-key-management/api-key-management.html", + "user/api-key-management/create-key.html", + "user/api-key-management/list-keys.html", + "user/api-key-management/disable-key.html", + "user/api-key-management/delete-key.html", + "user/api-key-management/api-statistics.html", + ) + t := templates.GetTemplate(templateFiles...) + + w.Header().Set("Content-Type", "text/html") + apiKeyManagementData := &types.ApiKeyManagementPageData{} + + user := getUser(r) + + apiKeyManagementData.APIKeyMngBaseURL = utils.Config.Frontend.APIKeyManagement.BaseURL + + subscription, err := db.StripeGetUserSubscription(user.UserID, utils.GROUP_API) + if err != nil && err != sql.ErrNoRows { + logger.Errorf("Error retrieving the subscriptions for user: %v %v", user.UserID, err) + utils.SetFlash(w, r, "", "Error: Something went wrong.") + http.Redirect(w, r, "/user/api-key-management", http.StatusSeeOther) + return + } + + rl, err := ratelimit.DBGetUserApiRateLimit(int64(user.UserID)) + if err != nil { + logger.Errorf("Error retrieving the api-ratelimit for user: %v %v", user.UserID, err) + utils.SetFlash(w, r, "", "Error: Something went wrong.") + http.Redirect(w, r, "/user/api-key-management", http.StatusSeeOther) + return + } + maxDaily := int(rl.Second * 24 * 3600) + maxMonthly := int(rl.Month) + if maxDaily > maxMonthly { + maxDaily = maxMonthly + } + + apiKeyManagementData.ApiStatistics = &types.ApiStatistics{} + if subscription.ApiKey != nil && len(*subscription.ApiKey) > 0 { + apiStats, err := db.GetUserAPIKeyStatistics(subscription.ApiKey) + if err != nil { + logger.Errorf("Error retrieving user api key usage: %v %v", user.UserID, err) + } + if apiStats != nil { + apiKeyManagementData.ApiStatistics = apiStats + } + } + apiKeyManagementData.ApiStatistics.MaxDaily = &maxDaily + apiKeyManagementData.ApiStatistics.MaxMonthly = &maxMonthly + + apiKeyManagementData.Subscription = subscription + apiKeyManagementData.Sapphire = &utils.Config.Frontend.Stripe.Sapphire + apiKeyManagementData.Emerald = &utils.Config.Frontend.Stripe.Emerald + apiKeyManagementData.Diamond = &utils.Config.Frontend.Stripe.Diamond + + data := InitPageData(w, r, "user", "/user/api-key-management", "API Management", templateFiles) + data.Data = apiKeyManagementData + + if handleTemplateError(w, r, "user.go", "APIKeyManagement", "", t.ExecuteTemplate(w, "layout", data)) != nil { + return + } +} + // UserAuthorizeConfirm renders the user-authorize template func UserAuthorizeConfirm(w http.ResponseWriter, r *http.Request) { templateFiles := append(layoutTemplateFiles, "user/authorize.html") diff --git a/package-lock.json b/package-lock.json index a8b7f78ad7..0bca0a4a7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,15 @@ "dependencies": { "eslint": "^8.18.0", "eslint-plugin-html": "^6.2.0", + "openapi-fetch": "^0.15.0", "prettier-plugin-go-template": "^0.0.13" }, "devDependencies": { + "@types/bootstrap": "^5.2.10", + "@types/datatables.net": "^1.10.28", + "@types/popper.js": "^1.10.1", "espree": "^9.3.2", + "msw": "^2.11.5", "prettier": "^2.8.0" } }, @@ -55,6 +60,199 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "node_modules/@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@types/bootstrap": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz", + "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.2" + } + }, + "node_modules/@types/datatables.net": { + "version": "1.10.28", + "resolved": "https://registry.npmjs.org/@types/datatables.net/-/datatables.net-1.10.28.tgz", + "integrity": "sha512-Y6SZZCdJt7vXROaTBc/ifwhAqSBg7V0urM+RqZt3Tj9JN1U8KSgQ7EKpFG88g/j4MVrlYDfSH+yqSnK0MaIwMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jquery": "*" + } + }, + "node_modules/@types/jquery": { + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz", + "integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/popper.js": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@types/popper.js/-/popper.js-1.10.1.tgz", + "integrity": "sha512-MRKItCTCj+8zVPtfli7T9QPOzmQ9zqdgRXiNsfNdK7HofapFnCbqKMNrIVJ9TIKqAR3uvuFK6Nj+Wb15qrnvzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, "node_modules/acorn": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", @@ -153,6 +351,49 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -174,6 +415,16 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -278,6 +529,13 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", @@ -289,6 +547,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -508,6 +776,16 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -552,6 +830,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graphql": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -560,6 +848,13 @@ "node": ">=8" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/htmlparser2": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", @@ -631,6 +926,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -642,6 +947,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -701,6 +1013,74 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/msw": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.11.6.tgz", + "integrity": "sha512-MCYMykvmiYScyUm7I6y0VCxpNq1rgd5v7kG8ks5dKtvmxRUUPjribX6mUoUNBbM5/3PhUyoelEWiKXGOz84c+w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.4", + "cookie": "^1.0.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^4.26.1", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -714,6 +1094,21 @@ "wrappy": "1" } }, + "node_modules/openapi-fetch": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.15.0.tgz", + "integrity": "sha512-OjQUdi61WO4HYhr9+byCPMj0+bgste/LtSBEcV6FzDdONTs7x0fWn8/ndoYwzqCsKWIxEZwo4FN/TG1c1rI8IQ==", + "license": "MIT", + "dependencies": { + "openapi-typescript-helpers": "^0.0.15" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", + "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", + "license": "MIT" + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -730,6 +1125,13 @@ "node": ">= 0.8.0" } }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -757,6 +1159,20 @@ "node": ">=8" } }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -812,6 +1228,16 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -820,6 +1246,13 @@ "node": ">=4" } }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -853,6 +1286,51 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -891,6 +1369,39 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tldts": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.17.tgz", + "integrity": "sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.17" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz", + "integrity": "sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -921,6 +1432,16 @@ "ulid": "bin/cli.js" } }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -956,10 +1477,77 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -994,6 +1582,138 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "dev": true + }, + "@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "dev": true, + "requires": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + } + }, + "@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "dev": true, + "requires": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + } + }, + "@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "dev": true + }, + "@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "dev": true, + "requires": {} + }, + "@mswjs/interceptors": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", + "dev": true, + "requires": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + } + }, + "@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "requires": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true + }, + "@types/bootstrap": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz", + "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==", + "dev": true, + "requires": { + "@popperjs/core": "^2.9.2" + } + }, + "@types/datatables.net": { + "version": "1.10.28", + "resolved": "https://registry.npmjs.org/@types/datatables.net/-/datatables.net-1.10.28.tgz", + "integrity": "sha512-Y6SZZCdJt7vXROaTBc/ifwhAqSBg7V0urM+RqZt3Tj9JN1U8KSgQ7EKpFG88g/j4MVrlYDfSH+yqSnK0MaIwMw==", + "dev": true, + "requires": { + "@types/jquery": "*" + } + }, + "@types/jquery": { + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz", + "integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==", + "dev": true, + "requires": { + "@types/sizzle": "*" + } + }, + "@types/popper.js": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@types/popper.js/-/popper.js-1.10.1.tgz", + "integrity": "sha512-MRKItCTCj+8zVPtfli7T9QPOzmQ9zqdgRXiNsfNdK7HofapFnCbqKMNrIVJ9TIKqAR3uvuFK6Nj+Wb15qrnvzw==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true + }, + "@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true + }, "acorn": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", @@ -1062,6 +1782,36 @@ "supports-color": "^7.1.0" } }, + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1080,6 +1830,12 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1151,11 +1907,23 @@ "domhandler": "^4.2.0" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1323,6 +2091,12 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1352,11 +2126,23 @@ "type-fest": "^0.20.2" } }, + "graphql": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, "htmlparser2": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", @@ -1406,6 +2192,12 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1414,6 +2206,12 @@ "is-extglob": "^2.1.1" } }, + "is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1464,6 +2262,46 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "msw": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.11.6.tgz", + "integrity": "sha512-MCYMykvmiYScyUm7I6y0VCxpNq1rgd5v7kG8ks5dKtvmxRUUPjribX6mUoUNBbM5/3PhUyoelEWiKXGOz84c+w==", + "dev": true, + "requires": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.4", + "cookie": "^1.0.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^4.26.1", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "dependencies": { + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true + } + } + }, + "mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1477,6 +2315,19 @@ "wrappy": "1" } }, + "openapi-fetch": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.15.0.tgz", + "integrity": "sha512-OjQUdi61WO4HYhr9+byCPMj0+bgste/LtSBEcV6FzDdONTs7x0fWn8/ndoYwzqCsKWIxEZwo4FN/TG1c1rI8IQ==", + "requires": { + "openapi-typescript-helpers": "^0.0.15" + } + }, + "openapi-typescript-helpers": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", + "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==" + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -1490,6 +2341,12 @@ "word-wrap": "^1.2.3" } }, + "outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1508,6 +2365,18 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, + "path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1536,11 +2405,23 @@ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1562,6 +2443,35 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true + }, + "strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1588,6 +2498,30 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "tldts": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.17.tgz", + "integrity": "sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==", + "dev": true, + "requires": { + "tldts-core": "^7.0.17" + } + }, + "tldts-core": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz", + "integrity": "sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==", + "dev": true + }, + "tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "requires": { + "tldts": "^7.0.5" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -1606,6 +2540,12 @@ "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==" }, + "until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1632,10 +2572,54 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true } } } diff --git a/package.json b/package.json index 8ec99871e2..142d85830e 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,20 @@ "dependencies": { "eslint": "^8.18.0", "eslint-plugin-html": "^6.2.0", + "openapi-fetch": "^0.15.0", "prettier-plugin-go-template": "^0.0.13" }, "devDependencies": { + "@types/bootstrap": "^5.2.10", + "@types/datatables.net": "^1.10.28", + "@types/popper.js": "^1.10.1", "espree": "^9.3.2", + "msw": "^2.11.5", "prettier": "^2.8.0" + }, + "msw": { + "workerDirectory": [ + "static" + ] } } diff --git a/static/api-key-management/api-key-management.entry.ts b/static/api-key-management/api-key-management.entry.ts new file mode 100644 index 0000000000..d07448d02f --- /dev/null +++ b/static/api-key-management/api-key-management.entry.ts @@ -0,0 +1,42 @@ +import { createAPIClient } from './api'; +import { initApiKeysTable } from "./list-keys"; +import { useAPIKeyCreation } from "./create-keys"; +import { startMocks } from "./api/mocking/browser"; + +declare global { + interface Window { + __APIKEYMANAGEMENT_CONFIG__: { + apiBaseUrl: string; + }; + } +} + +const APiBaseUrl = window.__APIKEYMANAGEMENT_CONFIG__.apiBaseUrl; + +const ApiClient = createAPIClient(APiBaseUrl); + +function initializeApiKeyManagement() { + const apiKeysTables = initApiKeysTable(ApiClient); + + useAPIKeyCreation(ApiClient, { + onCreated: () => { + apiKeysTables?.ajax.reload() + }, + }); + + document.querySelector("#simmulateReload")?.addEventListener("click", () => { + apiKeysTables?.ajax.reload(); + }); +} + +(async () => { + // Start MSW unconditionally (temporary) + await startMocks(APiBaseUrl); + + initializeApiKeyManagement(); + +})(); + +// document.addEventListener("DOMContentLoaded", () => { +// initializeApiKeyManagement(); +// }); \ No newline at end of file diff --git a/static/api-key-management/api/index.ts b/static/api-key-management/api/index.ts new file mode 100644 index 0000000000..7bf82ecf7a --- /dev/null +++ b/static/api-key-management/api/index.ts @@ -0,0 +1,71 @@ +import createClient from "openapi-fetch"; +import type { paths, components } from "./schema"; + +export type APIKey = components["schemas"]["APIKey"]; +export type CreateAPIKeyBody = components["schemas"]["CreateAPIKeyBody"]; +export type CreateAPIKeyData = components["schemas"]["CreateAPIKeyData"]; +export type GetAPIKeysData = components["schemas"]["GetAPIKeysData"]; +export type GetAPIKeyData = components["schemas"]["GetAPIKeyData"]; +export type DisableAPIKeyData = components["schemas"]["DisableAPIKeyData"]; +export type EnableAPIKeyData = components["schemas"]["EnableAPIKeyData"]; + +export function createAPIClient(baseURL: string) { + const baseUrl = (baseURL || "").replace(/\/+$/, ""); + const client = createClient({ baseUrl }); + + return { + // Raw typed client (GET/POST/etc) if you ever need it + raw: client, + + // GET /api-keys → APIKey[] + async getAPIKeys(): Promise { + const { data, error } = await client.GET("/api-keys"); + if (error) throw error; + return data; + }, + + // POST /api-keys { name } → { raw_api_key, api_key } + async createAPIKey(body: CreateAPIKeyBody): Promise { + const { data, error } = await client.POST("/api-keys", { body }); + if (error) throw error; + return data; + }, + + // GET /api-keys/{name} → APIKey | null + async getAPIKey(name: string): Promise { + const { data, error } = await client.GET("/api-keys/{name}", { + params: { path: { name } }, + }); + if (error) throw error; + return data?.api_key ?? null; + }, + + // DELETE /api-keys/{name} → void (204) + async deleteAPIKey(name: string): Promise { + const { error } = await client.DELETE("/api-keys/{name}", { + params: { path: { name } }, + }); + if (error) throw error; + }, + + // POST /api-keys/{name}/disable → APIKey + async disableAPIKey(name: string): Promise { + const { data, error } = await client.POST("/api-keys/{name}/disable", { + params: { path: { name } }, + }); + if (error) throw error; + return data.api_key!; + }, + + // POST /api-keys/{name}/enable → APIKey + async enableAPIKey(name: string): Promise { + const { data, error } = await client.POST("/api-keys/{name}/enable", { + params: { path: { name } }, + }); + if (error) throw error; + return (data as EnableAPIKeyData).api_key!; + }, + }; +} + +export type ApiKeysClient = ReturnType; \ No newline at end of file diff --git a/static/api-key-management/api/mocking/browser.ts b/static/api-key-management/api/mocking/browser.ts new file mode 100644 index 0000000000..403e5486b4 --- /dev/null +++ b/static/api-key-management/api/mocking/browser.ts @@ -0,0 +1,12 @@ +import { setupWorker } from "msw/browser"; +import { createHandlers } from "./handlers"; + +// Start MSW for the given base prefix (e.g., "/mocked-api-keys" or "http://localhost:8088/mocked-api-keys") +export async function startMocks(basePrefix: string) { + const worker = setupWorker(...createHandlers(basePrefix)); + await worker.start({ + onUnhandledRequest: "bypass", + serviceWorker: { url: "/mockServiceWorker.js" }, // created by `msw init ./static` + }); + return worker; +} \ No newline at end of file diff --git a/static/api-key-management/api/mocking/handlers.ts b/static/api-key-management/api/mocking/handlers.ts new file mode 100644 index 0000000000..6eb1424c8c --- /dev/null +++ b/static/api-key-management/api/mocking/handlers.ts @@ -0,0 +1,79 @@ +import { http, HttpResponse, type HttpHandler } from "msw"; +import type { APIKey } from "../"; +import { apiKeys, findIndexByName, shortKeyFrom } from "./state"; + +function randomRawKey(): string { + const bytes = new Uint8Array(24); + crypto.getRandomValues(bytes); + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} + +// Create handlers for a given base prefix, e.g. "/mocked-api-keys" +export function createHandlers(basePrefix: string): HttpHandler[] { + const base = basePrefix.replace(/\/+$/, ""); + + return [ + // GET /api-keys → limit to 10 items + http.get(`${base}/api-keys`, () => { + return HttpResponse.json({ api_keys: apiKeys.api_keys.slice(0, 10) }); + }), + + // Create + http.post(`${base}/api-keys`, async ({ request }) => { + const body = (await request.json()) as { name?: string }; + const name = (body.name || "").trim(); + + if (!/^[A-Za-z0-9._-]{3,35}$/.test(name)) { + return HttpResponse.json({ error: "invalid name" }, { status: 400 }); + } + if (findIndexByName(name) !== -1) { + return HttpResponse.json({ error: "name already exists" }, { status: 409 }); + } + + const raw = randomRawKey(); + const now = new Date().toISOString(); + const created: APIKey = { + name, + short_key: shortKeyFrom(raw), + created_at: now, + last_used_at: null, + disabled_at: null, + }; + apiKeys.api_keys.unshift(created); + + // Return both camel and snake variants if your schema differs; harmless for UI not using it yet + return HttpResponse.json({ raw_api_key: raw, api_key: created }); + }), + + // Get by name + http.get(`${base}/api-keys/:name`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + return HttpResponse.json({ api_key: apiKeys.api_keys[idx] }); + }), + + // Delete + http.delete(`${base}/api-keys/:name`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + apiKeys.api_keys.splice(idx, 1); + return new HttpResponse(null, { status: 204 }); + }), + + // Disable + http.post(`${base}/api-keys/:name/disable`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + apiKeys.api_keys[idx].disabled_at = new Date().toISOString(); + return HttpResponse.json({ api_key: apiKeys.api_keys[idx] }); + }), + + // Enable + http.post(`${base}/api-keys/:name/enable`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + apiKeys.api_keys[idx].disabled_at = null; + return HttpResponse.json({ api_key: apiKeys.api_keys[idx] }); + }), + ]; +} \ No newline at end of file diff --git a/static/api-key-management/api/mocking/state.ts b/static/api-key-management/api/mocking/state.ts new file mode 100644 index 0000000000..b913932f00 --- /dev/null +++ b/static/api-key-management/api/mocking/state.ts @@ -0,0 +1,114 @@ +// In-memory store for API keys (camelCase to match your UI columns) +import type { APIKey } from "../"; + +// Deterministic RNG +function mulberry32(seed: number) { + return function () { + let t = (seed += 0x6d2b79f5); + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} +const rand = mulberry32(42); + +function randInt(min: number, max: number) { + return Math.floor(rand() * (max - min + 1)) + min; +} +function chance(p: number) { + return rand() < p; +} +function sample(arr: T[]) { + return arr[randInt(0, arr.length - 1)]; +} + +const adjectives = [ + "alpha","bravo","charlie","delta","echo","foxtrot","gamma","omega","nova","prime", + "rapid","silent","stellar","terra","ultra","vector","zen","spark","quantum","lunar", +]; +const nouns = [ + "key","access","token","gateway","switch","bridge","anchor","beacon","signal","pilot", + "runner","mirror","rocket","engine","circuit","tensor","matrix","nexus","orbit","pulse", +]; + +function randomName(): string { + const base = `${sample(adjectives)}-${sample(nouns)}`; + const suffix = chance(0.6) ? `_${randInt(1, 999)}` : chance(0.5) ? `.v${randInt(1, 9)}` : ""; + const name = base + suffix; + return name.slice(0, Math.max(3, Math.min(35, name.length))); +} + +function randomRawKey(): string { + const bytes = new Uint8Array(24); + crypto.getRandomValues(bytes); + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} + +export function shortKeyFrom(raw: string) { + if (raw.length <= 6) return raw; + return `${raw.slice(0, 3)}...${raw.slice(-3)}`; +} + +function dateDaysAgo(days: number) { + const d = new Date(); + d.setDate(d.getDate() - days); + return d; +} +function dateBetweenDaysAgo(minDays: number, maxDays: number) { + return dateDaysAgo(randInt(minDays, maxDays)); +} +function iso(d: Date | null) { + return d ? d.toISOString() : null; +} + +export function generateAPIKeys(count: number): APIKey[] { + const set = new Set(); + const out: APIKey[] = []; + + while (out.length < count) { + let name = randomName(); + while (set.has(name)) name = `${name}-${randInt(1, 9999)}`; + set.add(name); + + const createdAt = dateBetweenDaysAgo(0, 540); + const neverUsed = chance(0.2); + const recentlyUsed = !neverUsed && chance(0.3); + + const maxAgeDays = Math.max(0, Math.floor((Date.now() - createdAt.getTime()) / 86400000)); + const last_used_at = neverUsed + ? null + : recentlyUsed + ? dateBetweenDaysAgo(0, maxAgeDays) + : dateBetweenDaysAgo(Math.floor(maxAgeDays / 2), maxAgeDays); + + const disabled = chance(0.15); + const disabled_at = disabled + ? dateBetweenDaysAgo(0, Math.max(0, Math.floor(((last_used_at ?? createdAt).getTime() - createdAt.getTime()) / 86400000))) + : null; + + const raw = randomRawKey(); + out.push({ + name, + short_key: shortKeyFrom(raw), + created_at: createdAt.toISOString(), + last_used_at: iso(last_used_at), + disabled_at: iso(disabled_at), + }); + } + + // Edge cases + if (out[0]) out[0] = { ...out[0], name: "a-b", last_used_at: null }; + if (out[1]) out[1] = { ...out[1], name: "prod.key_v1", disabled_at: out[1].disabled_at ?? new Date().toISOString() }; + if (out[2]) out[2] = { ...out[2], name: "this-is-a-very-long-key-name-version-1", short_key: "aaa...bbb" }; + + return out; +} + +// Public state that matches your client list shape +export const apiKeys: { api_keys: APIKey[] } = { + api_keys: generateAPIKeys(150), +}; + +export function findIndexByName(name: string) { + return apiKeys.api_keys.findIndex((k) => k.name === name); +} \ No newline at end of file diff --git a/static/api-key-management/api/schema.ts b/static/api-key-management/api/schema.ts new file mode 100644 index 0000000000..ccfee491c0 --- /dev/null +++ b/static/api-key-management/api/schema.ts @@ -0,0 +1,274 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/api-keys": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all API keys */ + get: operations["GetAPIKeys"]; + put?: never; + /** Create a new API key */ + post: operations["CreateAPIKey"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api-keys/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a specific API key */ + get: operations["GetAPIKey"]; + put?: never; + post?: never; + /** Delete an API key */ + delete: operations["DeleteAPIKey"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api-keys/{name}/disable": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Disable an API key */ + post: operations["DisableAPIKey"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api-keys/{name}/enable": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Enable an API key */ + post: operations["EnableAPIKey"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + CreateAPIKeyBody: { + /** @description API key name (3-35 chars, alphanumeric, _, ., -) */ + name: string; + }; + CreateAPIKeyData: { + /** + * @description Full API key (only returned once) + * @example abc123xyz456abc123xyz456 + */ + raw_api_key?: string; + api_key?: components["schemas"]["APIKey"]; + }; + DisableAPIKeyData: { + api_key?: components["schemas"]["APIKey"]; + }; + EnableAPIKeyData: { + api_key?: components["schemas"]["APIKey"]; + }; + GetAPIKeysData: { + api_keys: components["schemas"]["APIKey"][]; + }; + GetAPIKeyData: { + api_key?: components["schemas"]["APIKey"]; + }; + APIKey: { + /** + * @description The name of the API key. + * @example my-api-key + */ + name: string; + /** + * @description First 3 and last 3 characters of the raw API-key, separated by ... + * @example abc...xyz + */ + short_key: string; + /** + * Format: date-time + * @description Creation time in RFC 3339 format (ISO 8601). + * @example 2025-10-14T12:26:50.123Z + */ + created_at: string; + /** + * Format: date-time + * @description Last used time in RFC 3339 format (ISO 8601). + * @example 2025-10-14T12:26:50.123Z + */ + last_used_at?: string | null; + /** + * Format: date-time + * @description Disabled time in RFC 3339 format (ISO 8601). + * @example 2025-10-14T12:26:50.123Z + */ + disabled_at?: string | null; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + GetAPIKeys: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of API keys */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAPIKeysData"]; + }; + }; + }; + }; + CreateAPIKey: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateAPIKeyBody"]; + }; + }; + responses: { + /** @description Successfully created API key */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreateAPIKeyData"]; + }; + }; + }; + }; + GetAPIKey: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Retrieved API key */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAPIKeyData"]; + }; + }; + }; + }; + DeleteAPIKey: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description API key deleted successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + DisableAPIKey: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description API key disabled */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DisableAPIKeyData"]; + }; + }; + }; + }; + EnableAPIKey: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description API key enabled */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["EnableAPIKeyData"]; + }; + }; + }; + }; +} diff --git a/static/api-key-management/create-keys.ts b/static/api-key-management/create-keys.ts new file mode 100644 index 0000000000..bc7f5849b9 --- /dev/null +++ b/static/api-key-management/create-keys.ts @@ -0,0 +1,201 @@ +import type { ApiKeysClient, APIKey, CreateAPIKeyData } from "./api"; +import { useModal } from "./modal"; +import { copyTextWithToast, validateApiKeyName, renderKeyData, clearKeyData } from "./utils"; + +const DEFAULTOPTIONS = { + // Form options + createFormSelector: "#createKeyForm", + keyNameinputSelector: "#newApiKeyField", + submitBtnSelector: "[type=submit]", + rulesSelector: 'ul.list-unstyled [data-validate-rule]', +}; + +export function useAPIKeyCreation(api: ApiKeysClient, options: Partial & { onCreated?: () => void; } = {}) { + const config = { ...DEFAULTOPTIONS, ...options }; + + const createForm = document.querySelector(config.createFormSelector) as HTMLFormElement | null; + const keyNameinput = document.querySelector(config.keyNameinputSelector) as HTMLInputElement | null; + + if (!createForm || !keyNameinput) return; + + const validateNameAndSetStatus = useNameValidator(createForm, config.rulesSelector); + const creationModal = useCreationModal(); + + // Immediate validation of key name on input + keyNameinput.addEventListener("input", () => { + validateNameAndSetStatus(keyNameinput.value); + }); + + // submit flow + const submitBtn = createForm.querySelector(config.submitBtnSelector); + let submitting = false; + let createdKey: string | null = null; + createForm.addEventListener("submit", async (e) => { + e.preventDefault(); + if (submitting) return; + + const v = validateNameAndSetStatus(keyNameinput.value); + if (!(v.okLen && v.okChars && v.okSpaces)) { + keyNameinput.focus(); + return + }; + + const name = v.trimmed; + + submitting = true; + submitBtn && (submitBtn.disabled = true); + + creationModal?.showLoading(); + try { + const response = await api.createAPIKey({ name }); + creationModal?.showSuccess(response); + keyNameinput.value = ""; + createdKey = name; + validateNameAndSetStatus(""); + try { config.onCreated?.(); } catch (err) { console.error("onCreated callback failed:", err); } + } catch (err) { + creationModal?.showError(); + console.error("Failed to create API key:", err); + } finally { + submitting = false; + submitBtn && (submitBtn.disabled = false); + } + }); +} + +type RuleKey = "length" | "chars" | "spaces"; + +function useNameValidator(root: ParentNode, rulesSelector = DEFAULTOPTIONS.rulesSelector) { + const rulesMap = buildRulesMap(root, rulesSelector); + + return function (raw: string) { + const v = validateApiKeyName(raw); + + const isEmpty = v.raw.length === 0; + const state = (ok: boolean) => (isEmpty ? "idle" : ok ? "ok" : "err") as "idle" | "ok" | "err"; + + if (rulesMap.length) setValidationStatus(rulesMap.length, state(v.okLen)); + if (rulesMap.chars) setValidationStatus(rulesMap.chars, state(v.okChars)); + if (rulesMap.spaces) setValidationStatus(rulesMap.spaces, state(v.okSpaces)); + + return v; + }; +} + +function buildRulesMap(root: ParentNode, rulesSelector = DEFAULTOPTIONS.rulesSelector) { + const map: Partial> = {}; + const els = Array.from(root.querySelectorAll(rulesSelector)); + for (const el of els) { + const key = el.dataset.validateRule as RuleKey | undefined; + if (key) map[key] = el; + } + return map; +} + +function setValidationStatus(el: HTMLElement, state: "idle" | "ok" | "err") { + el.classList.remove("text-muted", "text-success", "text-danger"); + el.classList.add(state === "idle" ? "text-muted" : state === "ok" ? "text-success" : "text-danger"); +} + +const DEFAULTCREATIONMODALOPTIONS = { + creationModalSelector: "#createKeyModal", + loadingSectionSelector: "#createKeyModalLoading", + successSectionSelector: "#createKeyModalSuccess", + errorSectionSelector: "#createKeyModalError", + createdApiKeyRawSelector: "#createdApiKeyRaw", +}; +function useCreationModal(options?: Partial) { + const config = { ...DEFAULTCREATIONMODALOPTIONS, ...options }; + const modalContainer = document.querySelector(config.creationModalSelector) as HTMLElement | null; + if (!modalContainer) return null; + + let createdKey: CreateAPIKeyData | null = null; + const modal = useModal(modalContainer, { + onHidden: () => { + clearAPIKeyInSuccessSection(); + createdKey = null; + } + }); + + const loadingContainer = modalContainer.querySelector(config.loadingSectionSelector) as HTMLElement | null; + const successContainer = modalContainer.querySelector(config.successSectionSelector) as HTMLElement | null; + const errorContainer = modalContainer.querySelector(config.errorSectionSelector) as HTMLElement | null; + + function showSection(which: "loading" | "success" | "error") { + if (loadingContainer) seSectionVisibility(loadingContainer, which === "loading"); + if (successContainer) seSectionVisibility(successContainer, which === "success"); + if (errorContainer) seSectionVisibility(errorContainer, which === "error"); + } + + function setAPIKeyInSuccessSection(key: CreateAPIKeyData) { + createdKey = key; + if (!successContainer) return; + renderKeyData(successContainer, createdKey.api_key as APIKey); + const keyField = successContainer.querySelector(config.createdApiKeyRawSelector) as HTMLInputElement | null; + if (keyField) { + keyField.value = key.raw_api_key ?? ""; + } + } + function clearAPIKeyInSuccessSection() { + if (!successContainer) return; + clearKeyData(successContainer); + const keyField = successContainer.querySelector(config.createdApiKeyRawSelector) as HTMLInputElement | null; + if (keyField) { + keyField.value = ""; + } + } + + modalContainer.addEventListener("click", (event) => { + const target = event.target as HTMLElement; + const triggerCopy = target && target.closest("[data-copy-api-key]") as HTMLElement | null; + if (triggerCopy) { + event.preventDefault(); + copyTextWithToast(createdKey?.raw_api_key ?? "asdadas", { title: "API Key Copied", successMessage: "Your API key has been copied to clipboard." }); + } + const triggerToggle = target && target.closest("[data-toggle-api-key]") as HTMLElement | null; + if (triggerToggle) { + event.preventDefault(); + const keyField = successContainer?.querySelector(config.createdApiKeyRawSelector) as HTMLInputElement | null; + if (keyField) { + if (keyField.type === "password") { + keyField.type = "text"; + (triggerToggle.querySelector("i") as HTMLElement | null)?.classList.replace("fa-eye", "fa-eye-slash"); + } else { + keyField.type = "password"; + (triggerToggle.querySelector("i") as HTMLElement | null)?.classList.replace("fa-eye-slash", "fa-eye"); + } + } + } + }); + + return { + showLoading() { + modal.setOptions({ backdrop: "static", keyboard: false }); + modal.hideHeader(); + showSection("loading"); + modal.open(); + }, + showSuccess(key: CreateAPIKeyData) { + modal.setOptions({ backdrop: "static", keyboard: false }); + modal.setTitle("Operation successful"); + setAPIKeyInSuccessSection(key); + showSection("success"); + modal.open(); + }, + showError() { + modal.setOptions({ backdrop: true, keyboard: true }); + modal.setTitle("Something went wrong."); + showSection("error"); + modal.open(); + }, + } +} + +function seSectionVisibility(section: HTMLElement, visible: boolean) { + section.style.display = visible ? "block" : "none"; + if (visible) { + section.classList.remove("d-none"); + } else { + section.classList.add("d-none"); + } +} \ No newline at end of file diff --git a/static/api-key-management/list-keys.ts b/static/api-key-management/list-keys.ts new file mode 100644 index 0000000000..f2df2363f9 --- /dev/null +++ b/static/api-key-management/list-keys.ts @@ -0,0 +1,315 @@ +import type { ApiKeysClient, APIKey } from "./api"; +import { useModal } from "./modal"; +import { debounce, formatDate, useValidationState, useToast, renderKeyData, clearKeyData } from "./utils"; + +const DEFAULTOPTIONS = { + listContainerSelector: "#apiKeysListContainer", + tableSelector: "#apiKeysList", + searchSelector: "#apiKeysListSearchfield", + deleteModalSelector: "#deleteKeyModal", +} + +export function initApiKeysTable(api: ApiKeysClient, options?: Partial) { + const config = { ...DEFAULTOPTIONS, ...options }; + const listContainer = document.querySelector(config.listContainerSelector) as HTMLElement | null; + const apiKeysTable = $(config.tableSelector).DataTable({ + serverSide: false, + processing: true, + ajax: (_req: any, callback: any, settings: any) => { + // This hack is needed to support aborting previous requests when using custom fetch function + let canceled = false; + settings.jqXHR = { abort() { canceled = true; } }; + + // Avoid using async/await here as for some reason it breaks DataTables' ajax handling. It will trigger unhandled rejections on aborts. + api.getAPIKeys() + .then((response) => { + if (canceled) return; + callback({ data: response.api_keys ?? [] }); + updateKeysCount(response.api_keys ?? []); + }) + .catch((err) => { + if (canceled) return; + console.error("error fetching api keys", err); + callback({ data: [] }); + updateKeysCount([]); + }); + }, + responsive: false, + autoWidth: false, + paging: false, + searching: true, + info: false, + lengthChange: false, + pageLength: 0, + columns: [ + { data: "name" }, + { data: "short_key" }, + { data: "created_at", render: (v: string) => formatDate(v) }, + { data: "last_used_at", render: (v: string) => formatDate(v) }, + { data: "disabled_at", render: (v: string) => formatDate(v) }, + { + orderable: false, searchable: false, data: null, defaultContent: "", + render: (_data: any, _type: any, row: APIKey) => { + const isActiveKey = !row.disabled_at; + return ` +
+ ${makeKeyActionBtn({ + action: isActiveKey ? 'disable' : 'enable', + keyName: row.name, + label: isActiveKey ? 'Disable' : 'Enable', + class: 'text-white flex-fill' + })} + ${makeKeyActionBtn({ + action: 'delete', + keyName: row.name, + title: isActiveKey ? 'Cannot delete an active key' : 'Delete key', + disabled: isActiveKey, + })} +
+ `; + } + }, + ], + dom: "<'row'<'col-12'tr>>", + language: { + emptyTable: ` +
+ +

No API Keys

+

Create an API key and it will be listed here

+
+ `, + }, + }); + + const input = document.querySelector(config.searchSelector) as HTMLInputElement | null; + if (input) { + const onType = debounce(() => { + apiKeysTable.search(input.value).draw(); + }, 100); + input.addEventListener("input", onType); + } + + function updateKeysCount(api_keys: APIKey[]) { + const totalKeysEls = document.querySelectorAll('[data-role="total-keys-count"]') as NodeListOf; + totalKeysEls.forEach(el => { + el.textContent = String(api_keys.length); + }); + const activeCountEls = document.querySelectorAll('[data-role="active-keys-count"]') as NodeListOf; + const activeKeys = api_keys.filter(k => !k.disabled_at); + activeCountEls.forEach(el => { + el.textContent = String(activeKeys.length); + }); + } + + const disableKeyConfirmModal = useKeyActionConfirmModal('#disableKeyModal', { + onConfirm: async (key) => { await api.disableAPIKey(key.name); }, + onSuccess: () => { + apiKeysTable.ajax.reload(); + } + }); + const deleteKeyConfirmModal = useKeyActionConfirmModal('#deleteKeyModal', { + onConfirm: async (key) => { await api.deleteAPIKey(key.name); }, + onSuccess: () => { + apiKeysTable.ajax.reload(); + } + }); + const enableKey = useEnableKey({ + onConfirm: async (key) => { await api.enableAPIKey(key.name); }, + onSuccess: () => { + apiKeysTable.ajax.reload(); + } + }); + + listContainer?.addEventListener('click', (e) => { + const target = e.target as HTMLElement; + const keyActionBtn = target.closest('[data-key-action]') as HTMLButtonElement | null; + if (keyActionBtn) { + keyActionBtn.focus(); // Ensure the button retains focus for accessibility + const keyData = apiKeysTable.rows().data().toArray().find(k => k.name === keyActionBtn.getAttribute('data-key')); + if (!keyData) return; + const actionType = keyActionBtn.getAttribute('data-key-action') + if (!isValidKeyAction(actionType)) return + if (actionType === 'disable') disableKeyConfirmModal?.open(keyData); + else if (actionType === 'enable') enableKey(keyData, keyActionBtn) + else if (actionType === 'delete') deleteKeyConfirmModal?.open(keyData) + } + }); + + return apiKeysTable; +} + +function useEnableKey(options: { + onConfirm?: (key: APIKey) => Promise; + onSuccess?: (key: APIKey) => void; +}) { + let isEnabling = false; + function setLoadingState(btn: HTMLElement) { + const iconEl = btn.querySelector('i'); + if (isEnabling) { + iconEl?.classList.remove('fa-play'); + iconEl?.classList.add('fa-spinner', 'fa-spin'); + } else { + iconEl?.classList.remove('fa-spinner', 'fa-spin'); + iconEl?.classList.add('fa-play'); + } + } + return async (keyData: APIKey, triggerBtn: HTMLElement) => { + if(isEnabling) return; + try { + isEnabling = true; + setLoadingState(triggerBtn); + await options.onConfirm?.(keyData); + useToast({ type: "success", message: `API Key ${keyData.name} has been enabled.` }); + options.onSuccess?.(keyData); + } catch (err) { + console.error("Failed to enable API key:", err); + useToast({ type: "error", message: `Failed to enable API Key ${keyData.name}. Please try again.` }); + } finally { + isEnabling = false; + setLoadingState(triggerBtn); + } + }; +} + + +const DEFAULTKEYACTIONMODALOPTIONS = { + confirmKeyFormSelector: "[data-key-form]", + keyConfirmNameInputSelector: "[data-key-confirm-name]", + keyConfirmCheckboxSelector: "[data-key-confirm-checkbox]", + keySubmitErrorsSelector: "[data-key-submit-errors]", + validationMissingNameMessage: "Please enter the API Key name to confirm.", + validationNameMismatchMessage: "API Key name does not match.", + validationCheckboxUncheckedMessage: "You must confirm to continue.", +} + +function useKeyActionConfirmModal( + modalSelector: string, + options: Partial & { + onConfirm?: (key: APIKey) => Promise; + onSuccess?: (key: APIKey) => void; + } = {} +) { + const config = { ...DEFAULTKEYACTIONMODALOPTIONS, ...options }; + const modalContainer = document.querySelector(modalSelector) as HTMLElement | null; + if (!modalContainer) return null; + + let apiKey: APIKey | null = null; + + const keyForm = modalContainer.querySelector(config.confirmKeyFormSelector) as HTMLFormElement | null; + const keyConfirmNameInput = modalContainer.querySelector(config.keyConfirmNameInputSelector) as HTMLInputElement | null; + const keyConfirmCheckbox = modalContainer.querySelector(config.keyConfirmCheckboxSelector) as HTMLInputElement | null; + const keySubmitErrors = modalContainer.querySelector(config.keySubmitErrorsSelector) as HTMLElement | null; + + const keyActionConfirmModal = useModal(modalContainer, { + backdrop: true, + keyboard: true, + onHidden() { + // Need to reset data after the modal is fully hidden to avoid flickering + apiKey = null; + clearKeyData(modalContainer); + keyForm?.reset(); + clearValidationState(); + }, + }); + + const getErrorMessage = (key: 'validationMissingName' | 'validationNameMismatch' | 'validationCheckboxUnchecked' | 'successMessage' | 'errorMessage') => + modalContainer.dataset[key] || `Please check the ${key} field.`; + + let isSubmitting = false; + keyForm?.addEventListener("submit", async (e) => { + e.preventDefault(); + if (!apiKey || isSubmitting || !options.onConfirm) return; + + if (!validateForm()) return; + + try { + isSubmitting = true; + keyActionConfirmModal.showLoading(); + await options.onConfirm(apiKey); + + // Show success and close modal + const successMessage = getErrorMessage('successMessage').replace('{keyName}', apiKey.name); + useToast({ type: "success", message: successMessage }); + keyActionConfirmModal.close(); + options.onSuccess?.(apiKey); + + } catch (err) { + console.error("API call failed:", err); + const errorMessage = getErrorMessage('errorMessage').replace('{keyName}', apiKey.name); + useToast({ type: "error", message: errorMessage }); + } finally { + isSubmitting = false; + keyActionConfirmModal.hideLoading(); + } + }); + + const setValidationState = useValidationState(keySubmitErrors); + const clearValidationState = () => { + setValidationState("", keyConfirmNameInput); + setValidationState("", keyConfirmCheckbox); + } + function validateForm() { + let isValid = true; + + clearValidationState(); + + // Validate confirmation name + const nameValue = keyConfirmNameInput?.value?.trim(); + if (!nameValue) { + isValid = false; + setValidationState(getErrorMessage('validationMissingName'), keyConfirmNameInput); + } else if (nameValue !== apiKey?.name) { + isValid = false; + setValidationState(getErrorMessage('validationNameMismatch'), keyConfirmNameInput); + } + + // Validate checkbox + else if (!keyConfirmCheckbox?.checked) { + isValid = false; + setValidationState(getErrorMessage('validationCheckboxUnchecked'), keyConfirmCheckbox); + } + + return isValid; + } + + keyForm?.addEventListener("change", () => { + validateForm(); + }); + + function openKeyActionConfirmModal(keyData: APIKey, trigger?: HTMLElement) { + apiKey = keyData; + modalContainer && renderKeyData(modalContainer, apiKey!); + keyActionConfirmModal.open(trigger); + } + + return { + open: openKeyActionConfirmModal, + }; + +} + + +type KeyAction = 'disable' | 'enable' | 'delete'; + +function isValidKeyAction(action: string | null): action is KeyAction { + return action === 'disable' || action === 'enable' || action === 'delete'; +} + +function makeKeyActionBtn(options: { action: KeyAction; keyName: string; label?: string; title?: string, class?: string; disabled?: boolean }): string { + const classType = options.action !== 'delete' ? 'btn-secondary' : 'btn-danger'; + const iconType = options.action === 'disable' ? 'fa-ban' : options.action === 'enable' ? 'fa-play' : 'fa-trash'; + return ` + + ` +} \ No newline at end of file diff --git a/static/api-key-management/modal.ts b/static/api-key-management/modal.ts new file mode 100644 index 0000000000..052b8aed80 --- /dev/null +++ b/static/api-key-management/modal.ts @@ -0,0 +1,129 @@ +import type { Modal } from "bootstrap"; + +type BSModalOptions = Partial & { + onHide?: () => void; + onShow?: () => void; + onShown?: () => void; + onHidden?: () => void; +}; + +export function useModal(modalEl: HTMLElement, options: BSModalOptions = {}) { + // Allow Esc to close and let Bootstrap move focus. + const modalOptions: Partial = { backdrop: "static", keyboard: true, focus: true, ...options }; + const modalInstance = $(modalEl).modal({ + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + focus: modalOptions.focus, + // @ts-ignore silence false error due to wrong typping + show: false + }) + + // Remember the element that had focus before opening, to restore it on close. + let lastTrigger: HTMLElement | null = null; + + if (options.onShow) { + $(modalEl).on("show.bs.modal", function () { + options.onShow && options.onShow(); + }); + } + $(modalEl).on("shown.bs.modal", function () { + // Move focus into the modal so Esc works and screen readers enter the dialog + const focusTarget = + modalEl.querySelector('[autofocus], [data-initial-focus], input, button, select, textarea, [tabindex]:not([tabindex="-1"])') + || modalEl; + focusTarget.focus(); + options.onShown && options.onShown(); + }); + + $(modalEl).on("hide.bs.modal", function () { + const active = document.activeElement as HTMLElement | null + if (active && modalEl?.contains(active)) { + active.blur() // or triggerButton.focus() + } + options.onHide && options.onHide(); + }); + if (options.onHidden) { + $(modalEl).on("hidden.bs.modal", function () { + options.onHidden && options.onHidden(); + hideLoading(); + // Restore focus to the opener after fully hidden + lastTrigger?.focus(); + lastTrigger = null; + }); + } + + const headerEl = modalEl?.querySelector(".modal-header") as HTMLElement | null | undefined; + const titleEl = headerEl?.querySelector(".modal-title") as HTMLElement | null | undefined; + + // + let loadingOverlay: HTMLElement | null = null; + + function showLoading() { + loadingOverlay = createLoadingOverlay(); + loadingOverlay.style.top = headerEl ? `${headerEl.offsetHeight}px` : '0'; + modalEl.querySelector('.modal-content')?.appendChild(loadingOverlay); + } + + function hideLoading() { + if (loadingOverlay) { + loadingOverlay.remove(); + loadingOverlay = null; + } + } + + return { + setOptions(config?: Partial) { + const instance = modalInstance?.data("bs.modal"); + const instanceConfig = modalInstance?.data("bs.modal")?._config as Modal.Options | undefined; + instance && (instance._config = { ...instanceConfig, ...config }); + }, + setTitle(title: string) { + titleEl && (titleEl.textContent = title); + headerEl?.classList.remove("d-none") + }, + hideHeader() { + headerEl?.classList.add("d-none"); + }, + // Prefer passing the actual trigger element. Falls back to activeElement. + open(trigger?: HTMLElement) { + lastTrigger = trigger ?? (document.activeElement as HTMLElement | null); + modalInstance && modalInstance.modal("show"); + }, + close() { + modalInstance && modalInstance.modal("hide"); + }, + showLoading, + hideLoading + }; +} + +/** Helper function to create loading overlay */ +function createLoadingOverlay(): HTMLElement { + const overlay = document.createElement('div'); + overlay.style.cssText = ` + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(255, 255, 255, 0.8); + display: flex; + align-items: center; + justify-content: center; + z-index: 1050; + backdrop-filter: blur(1px); + `; + + const spinner = document.createElement('div'); + spinner.innerHTML = ` +
+
+ Loading... +
+
Processing...
+
+ `; + + overlay.appendChild(spinner); + return overlay; +} \ No newline at end of file diff --git a/static/api-key-management/utils.ts b/static/api-key-management/utils.ts new file mode 100644 index 0000000000..a82fe463b9 --- /dev/null +++ b/static/api-key-management/utils.ts @@ -0,0 +1,264 @@ +import { APIKey } from "./api"; + +/** + * Formats an ISO date. + * - withTime=false: "Jul 14, 2025" + * - withTime=true: "Jul 14, 2025, 1:45 PM" (locale-dependent) + */ +export function formatDate( + iso: string | null | undefined, + options: { utc?: boolean; withTime?: boolean } = {} +): string { + if (!iso) return ""; + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return ""; + + const { utc = false, withTime = false } = options; + + const base: Intl.DateTimeFormatOptions = { + month: "short", + day: "numeric", + year: "numeric", + timeZone: utc ? "UTC" : undefined, + }; + + return withTime + ? d.toLocaleString("en-US", { ...base, hour: "2-digit", minute: "2-digit" }) + : d.toLocaleDateString("en-US", base); +} + +/** + * Returns a debounced version of the given function. + */ +export function debounce void>(fn: F, wait = 300) { + let t: ReturnType | null = null; + return (...args: Parameters) => { + if (t) clearTimeout(t); + t = setTimeout(() => fn(...args), wait); + }; +} + +/** + * Validates an API key name. + * - Spaces/whitespace are disallowed (okSpaces=false if any) + * - Allowed chars (for the non-whitespace part): A-Z a-z 0-9 . _ - + * - Length is checked on the trimmed value (3–35) + */ +export function validateApiKeyName(raw: string) { + const isEmpty = raw.length === 0; + const hasWhitespace = /\s/.test(raw); + const trimmed = raw.trim(); + const okLen = trimmed.length >= 3 && trimmed.length <= 35; + // Ignore whitespace for the allowed-characters rule + const cleanedForChars = trimmed.replace(/\s/g, ""); + const okChars = /^[A-Za-z0-9._-]+$/.test(cleanedForChars) || cleanedForChars.length === 0; + const okSpaces = !hasWhitespace; + + return { raw, trimmed, isEmpty, okLen, okChars, okSpaces }; +} + +/** + * Shows a Bootstrap toast notification. + */ +export function useToast(options: { + message: string; + title?: string; + /** @default: 2000 */ + delay?: number; + /** @default: true */ + autohide?: boolean; + /** default: body-level container we create if missing */ + containerSelector?: string; + type?: 'success' | 'error' | 'info'; + /** extra classes on .toast (e.g., "bg-success text-white") */ + className?: string; +}): HTMLElement { + const { + message, + title, + delay = 4000, + autohide = true, + containerSelector = "#_toast_container", + className = "", + } = options; + + let container = document.querySelector(containerSelector) as HTMLElement | null; + if (!container) { + container = document.createElement("div"); + container.id = containerSelector.replace(/^#/, ""); + container.style.position = "fixed"; + container.style.top = "1rem"; + container.style.right = "1rem"; + container.style.zIndex = "1080"; + container.style.pointerEvents = "none"; + document.body.appendChild(container); + } + + const toast = document.createElement("div"); + toast.className = `toast ${className}`.trim(); + toast.setAttribute("role", "alert"); + toast.setAttribute("aria-live", "assertive"); + toast.setAttribute("aria-atomic", "true"); + toast.style.pointerEvents = "auto"; + const icon = options.type === "success" ? { type: "fa-check-circle", color: "text-success" } : + options.type === "error" ? { type: "fa-times-circle", color: "text-danger" } : + options.type === "info" ? { type: "fa-info-circle", color: "text-info" } : + null; + toast.innerHTML = ` +
+ ${icon ? `` : ""} +
+ ${title ? ` +
${title}
+ ` : ""} + ${message} +
+ +
+ `; + container.appendChild(toast); + + const $ = (window as any).$; + if ($?.fn?.toast) { + $(toast).toast({ delay, autohide }).toast("show"); + $(toast).on("hidden.bs.toast", () => toast.remove()); + } else { + // Fallback show/hide if Bootstrap JS not present + toast.classList.add("show"); + setTimeout(() => toast.remove(), delay); + } + return toast; +} + +/** + * Copies the given text to clipboard. + */ +export async function useCopyToClipboard(text: string): Promise { + if (!text) return false; + try { + if (navigator.clipboard && (window.isSecureContext ?? location.protocol === "https:")) { + await navigator.clipboard.writeText(text); + } else { + const ta = document.createElement("textarea"); + ta.value = text; + ta.setAttribute("readonly", ""); + ta.style.position = "fixed"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + const ok = document.execCommand("copy"); + document.body.removeChild(ta); + if (!ok) throw new Error("execCommand copy failed"); + } + return true; + } catch { + return false; + } +} + +/** + * Copies text to clipboard and shows a toast notification on success/failure. + * If you dont want a toast, use directly `useCopyToClipboard`. + * @see useCopyToClipboard + */ +export async function copyTextWithToast(text: string, options?: { + successMessage?: string; + failureMessage?: string; + title?: string; + delay?: number; + containerSelector?: string; +}) { + const ok = await useCopyToClipboard(text); + if (ok) { + useToast({ + message: options?.successMessage ?? "Copied to clipboard", + title: options?.title ?? "Success", + delay: options?.delay ?? 2000, + containerSelector: options?.containerSelector, + type: 'success', + className: "bg-white", // keep default BS look; adjust if you want + }); + } else { + useToast({ + message: options?.failureMessage ?? "Copy failed", + title: "Error", + delay: options?.delay ?? 2500, + containerSelector: options?.containerSelector, + type: 'error', + className: "bg-danger text-white", + }); + } + return ok; +} + +/** + * Downloads the given data as a JSON file. + */ +export function downloadJSON(data: unknown, filename: string) { + const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + a.remove(); + URL.revokeObjectURL(url); +} + +/** + * Generates a safe filename for an API key export. + */ +export function safeFilename(base: string, ext = "json") { + const name = (base || "api-key").trim().replace(/[^\w.-]+/g, "-").replace(/-+/g, "-"); + return `${name || "api-key"}.${ext}`; +} + +/** + * Returns a function to set validation state on an input and error container. + */ +export function useValidationState(errorContainer: HTMLElement | null) { + return (errorMsg: string, inputEl: HTMLElement | null = null) => { + if (errorContainer) { + if (errorMsg.length > 0) { + errorContainer.textContent = errorMsg; + errorContainer.style.display = "block"; + inputEl?.focus(); + inputEl?.classList.add("is-invalid"); + } else { + errorContainer.textContent = ""; + errorContainer.style.display = "none"; + inputEl?.classList.remove("is-invalid"); + } + } + } +} + +/** + * Renders API key data into the given container. + */ +export function renderKeyData(container: HTMLElement, key: APIKey) { + const elements = container.querySelectorAll("[data-key-prop]"); + elements.forEach((el) => { + const prop = el.getAttribute("data-key-prop") as keyof APIKey; + if (prop in key) { + let value = (key as any)[prop]; + if (prop === "created_at" || prop === "disabled_at" || prop === "last_used_at") { + value = formatDate(value, { withTime: true }); + } + el.textContent = value ?? "—"; + } + }); +} + +/** + * Clears API key data from the given container. + */ +export function clearKeyData(container: HTMLElement) { + const elements = container.querySelectorAll("[data-key-prop]"); + elements.forEach((el) => { + el.textContent = ""; + }); +} \ No newline at end of file diff --git a/static/css/layout.css b/static/css/layout.css index b105f621a5..ff2a10c92f 100644 --- a/static/css/layout.css +++ b/static/css/layout.css @@ -1,3 +1,7 @@ +html { + scroll-behavior: smooth; +} + /* Revive ad server responsive images */ ins[data-revive-zoneid] > a > img { max-width: 100%; diff --git a/static/js/api-key-management/api-key-management.entry.js b/static/js/api-key-management/api-key-management.entry.js new file mode 100644 index 0000000000..df8aabc3ea --- /dev/null +++ b/static/js/api-key-management/api-key-management.entry.js @@ -0,0 +1,11186 @@ +// node_modules/openapi-fetch/dist/index.mjs +var PATH_PARAM_RE = /\{[^{}]+\}/g; +var supportsRequestInitExt = () => { + return typeof process === "object" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici; +}; +function randomID() { + return Math.random().toString(36).slice(2, 11); +} +function createClient(clientOptions) { + let { + baseUrl = "", + Request: CustomRequest = globalThis.Request, + fetch: baseFetch = globalThis.fetch, + querySerializer: globalQuerySerializer, + bodySerializer: globalBodySerializer, + headers: baseHeaders, + requestInitExt = void 0, + ...baseOptions + } = { ...clientOptions }; + requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0; + baseUrl = removeTrailingSlash(baseUrl); + const globalMiddlewares = []; + async function coreFetch(schemaPath, fetchOptions) { + const { + baseUrl: localBaseUrl, + fetch: fetch2 = baseFetch, + Request: Request2 = CustomRequest, + headers, + params = {}, + parseAs = "json", + querySerializer: requestQuerySerializer, + bodySerializer = globalBodySerializer ?? defaultBodySerializer, + body, + middleware: requestMiddlewares = [], + ...init + } = fetchOptions || {}; + let finalBaseUrl = baseUrl; + if (localBaseUrl) { + finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl; + } + let querySerializer = typeof globalQuerySerializer === "function" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer); + if (requestQuerySerializer) { + querySerializer = typeof requestQuerySerializer === "function" ? requestQuerySerializer : createQuerySerializer({ + ...typeof globalQuerySerializer === "object" ? globalQuerySerializer : {}, + ...requestQuerySerializer + }); + } + const serializedBody = body === void 0 ? void 0 : bodySerializer( + body, + // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation: + // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however, + // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below, + // setting the content-type at the very beginning to be overwritten. + // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers. + mergeHeaders(baseHeaders, headers, params.header) + ); + const finalHeaders = mergeHeaders( + // with no body, we should not to set Content-Type + serializedBody === void 0 || // if serialized body is FormData; browser will correctly set Content-Type & boundary expression + serializedBody instanceof FormData ? {} : { + "Content-Type": "application/json" + }, + baseHeaders, + headers, + params.header + ); + const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares]; + const requestInit = { + redirect: "follow", + ...baseOptions, + ...init, + body: serializedBody, + headers: finalHeaders + }; + let id; + let options; + let request = new Request2( + createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }), + requestInit + ); + let response; + for (const key in init) { + if (!(key in request)) { + request[key] = init[key]; + } + } + if (finalMiddlewares.length) { + id = randomID(); + options = Object.freeze({ + baseUrl: finalBaseUrl, + fetch: fetch2, + parseAs, + querySerializer, + bodySerializer + }); + for (const m of finalMiddlewares) { + if (m && typeof m === "object" && typeof m.onRequest === "function") { + const result = await m.onRequest({ + request, + schemaPath, + params, + options, + id + }); + if (result) { + if (result instanceof Request2) { + request = result; + } else if (result instanceof Response) { + response = result; + break; + } else { + throw new Error("onRequest: must return new Request() or Response() when modifying the request"); + } + } + } + } + } + if (!response) { + try { + response = await fetch2(request, requestInitExt); + } catch (error22) { + let errorAfterMiddleware = error22; + if (finalMiddlewares.length) { + for (let i = finalMiddlewares.length - 1; i >= 0; i--) { + const m = finalMiddlewares[i]; + if (m && typeof m === "object" && typeof m.onError === "function") { + const result = await m.onError({ + request, + error: errorAfterMiddleware, + schemaPath, + params, + options, + id + }); + if (result) { + if (result instanceof Response) { + errorAfterMiddleware = void 0; + response = result; + break; + } + if (result instanceof Error) { + errorAfterMiddleware = result; + continue; + } + throw new Error("onError: must return new Response() or instance of Error"); + } + } + } + } + if (errorAfterMiddleware) { + throw errorAfterMiddleware; + } + } + if (finalMiddlewares.length) { + for (let i = finalMiddlewares.length - 1; i >= 0; i--) { + const m = finalMiddlewares[i]; + if (m && typeof m === "object" && typeof m.onResponse === "function") { + const result = await m.onResponse({ + request, + response, + schemaPath, + params, + options, + id + }); + if (result) { + if (!(result instanceof Response)) { + throw new Error("onResponse: must return new Response() when modifying the response"); + } + response = result; + } + } + } + } + } + if (response.status === 204 || request.method === "HEAD" || response.headers.get("Content-Length") === "0") { + return response.ok ? { data: void 0, response } : { error: void 0, response }; + } + if (response.ok) { + if (parseAs === "stream") { + return { data: response.body, response }; + } + return { data: await response[parseAs](), response }; + } + let error4 = await response.text(); + try { + error4 = JSON.parse(error4); + } catch { + } + return { error: error4, response }; + } + return { + request(method, url, init) { + return coreFetch(url, { ...init, method: method.toUpperCase() }); + }, + /** Call a GET endpoint */ + GET(url, init) { + return coreFetch(url, { ...init, method: "GET" }); + }, + /** Call a PUT endpoint */ + PUT(url, init) { + return coreFetch(url, { ...init, method: "PUT" }); + }, + /** Call a POST endpoint */ + POST(url, init) { + return coreFetch(url, { ...init, method: "POST" }); + }, + /** Call a DELETE endpoint */ + DELETE(url, init) { + return coreFetch(url, { ...init, method: "DELETE" }); + }, + /** Call a OPTIONS endpoint */ + OPTIONS(url, init) { + return coreFetch(url, { ...init, method: "OPTIONS" }); + }, + /** Call a HEAD endpoint */ + HEAD(url, init) { + return coreFetch(url, { ...init, method: "HEAD" }); + }, + /** Call a PATCH endpoint */ + PATCH(url, init) { + return coreFetch(url, { ...init, method: "PATCH" }); + }, + /** Call a TRACE endpoint */ + TRACE(url, init) { + return coreFetch(url, { ...init, method: "TRACE" }); + }, + /** Register middleware */ + use(...middleware) { + for (const m of middleware) { + if (!m) { + continue; + } + if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) { + throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`"); + } + globalMiddlewares.push(m); + } + }, + /** Unregister middleware */ + eject(...middleware) { + for (const m of middleware) { + const i = globalMiddlewares.indexOf(m); + if (i !== -1) { + globalMiddlewares.splice(i, 1); + } + } + } + }; +} +function serializePrimitiveParam(name, value, options) { + if (value === void 0 || value === null) { + return ""; + } + if (typeof value === "object") { + throw new Error( + "Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these." + ); + } + return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`; +} +function serializeObjectParam(name, value, options) { + if (!value || typeof value !== "object") { + return ""; + } + const values = []; + const joiner = { + simple: ",", + label: ".", + matrix: ";" + }[options.style] || "&"; + if (options.style !== "deepObject" && options.explode === false) { + for (const k in value) { + values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k])); + } + const final2 = values.join(","); + switch (options.style) { + case "form": { + return `${name}=${final2}`; + } + case "label": { + return `.${final2}`; + } + case "matrix": { + return `;${name}=${final2}`; + } + default: { + return final2; + } + } + } + for (const k in value) { + const finalName = options.style === "deepObject" ? `${name}[${k}]` : k; + values.push(serializePrimitiveParam(finalName, value[k], options)); + } + const final = values.join(joiner); + return options.style === "label" || options.style === "matrix" ? `${joiner}${final}` : final; +} +function serializeArrayParam(name, value, options) { + if (!Array.isArray(value)) { + return ""; + } + if (options.explode === false) { + const joiner2 = { form: ",", spaceDelimited: "%20", pipeDelimited: "|" }[options.style] || ","; + const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2); + switch (options.style) { + case "simple": { + return final; + } + case "label": { + return `.${final}`; + } + case "matrix": { + return `;${name}=${final}`; + } + // case "spaceDelimited": + // case "pipeDelimited": + default: { + return `${name}=${final}`; + } + } + } + const joiner = { simple: ",", label: ".", matrix: ";" }[options.style] || "&"; + const values = []; + for (const v of value) { + if (options.style === "simple" || options.style === "label") { + values.push(options.allowReserved === true ? v : encodeURIComponent(v)); + } else { + values.push(serializePrimitiveParam(name, v, options)); + } + } + return options.style === "label" || options.style === "matrix" ? `${joiner}${values.join(joiner)}` : values.join(joiner); +} +function createQuerySerializer(options) { + return function querySerializer(queryParams) { + const search = []; + if (queryParams && typeof queryParams === "object") { + for (const name in queryParams) { + const value = queryParams[name]; + if (value === void 0 || value === null) { + continue; + } + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + search.push( + serializeArrayParam(name, value, { + style: "form", + explode: true, + ...options?.array, + allowReserved: options?.allowReserved || false + }) + ); + continue; + } + if (typeof value === "object") { + search.push( + serializeObjectParam(name, value, { + style: "deepObject", + explode: true, + ...options?.object, + allowReserved: options?.allowReserved || false + }) + ); + continue; + } + search.push(serializePrimitiveParam(name, value, options)); + } + } + return search.join("&"); + }; +} +function defaultPathSerializer(pathname, pathParams) { + let nextURL = pathname; + for (const match2 of pathname.match(PATH_PARAM_RE) ?? []) { + let name = match2.substring(1, match2.length - 1); + let explode = false; + let style = "simple"; + if (name.endsWith("*")) { + explode = true; + name = name.substring(0, name.length - 1); + } + if (name.startsWith(".")) { + style = "label"; + name = name.substring(1); + } else if (name.startsWith(";")) { + style = "matrix"; + name = name.substring(1); + } + if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) { + continue; + } + const value = pathParams[name]; + if (Array.isArray(value)) { + nextURL = nextURL.replace(match2, serializeArrayParam(name, value, { style, explode })); + continue; + } + if (typeof value === "object") { + nextURL = nextURL.replace(match2, serializeObjectParam(name, value, { style, explode })); + continue; + } + if (style === "matrix") { + nextURL = nextURL.replace(match2, `;${serializePrimitiveParam(name, value)}`); + continue; + } + nextURL = nextURL.replace(match2, style === "label" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value)); + } + return nextURL; +} +function defaultBodySerializer(body, headers) { + if (body instanceof FormData) { + return body; + } + if (headers) { + const contentType = headers.get instanceof Function ? headers.get("Content-Type") ?? headers.get("content-type") : headers["Content-Type"] ?? headers["content-type"]; + if (contentType === "application/x-www-form-urlencoded") { + return new URLSearchParams(body).toString(); + } + } + return JSON.stringify(body); +} +function createFinalURL(pathname, options) { + let finalURL = `${options.baseUrl}${pathname}`; + if (options.params?.path) { + finalURL = defaultPathSerializer(finalURL, options.params.path); + } + let search = options.querySerializer(options.params.query ?? {}); + if (search.startsWith("?")) { + search = search.substring(1); + } + if (search) { + finalURL += `?${search}`; + } + return finalURL; +} +function mergeHeaders(...allHeaders) { + const finalHeaders = new Headers(); + for (const h of allHeaders) { + if (!h || typeof h !== "object") { + continue; + } + const iterator = h instanceof Headers ? h.entries() : Object.entries(h); + for (const [k, v] of iterator) { + if (v === null) { + finalHeaders.delete(k); + } else if (Array.isArray(v)) { + for (const v2 of v) { + finalHeaders.append(k, v2); + } + } else if (v !== void 0) { + finalHeaders.set(k, v); + } + } + } + return finalHeaders; +} +function removeTrailingSlash(url) { + if (url.endsWith("/")) { + return url.substring(0, url.length - 1); + } + return url; +} + +// static/api-key-management/api/index.ts +function createAPIClient(baseURL) { + const baseUrl = (baseURL || "").replace(/\/+$/, ""); + const client = createClient({ baseUrl }); + return { + // Raw typed client (GET/POST/etc) if you ever need it + raw: client, + // GET /api-keys → APIKey[] + async getAPIKeys() { + const { data, error: error4 } = await client.GET("/api-keys"); + if (error4) throw error4; + return data; + }, + // POST /api-keys { name } → { raw_api_key, api_key } + async createAPIKey(body) { + const { data, error: error4 } = await client.POST("/api-keys", { body }); + if (error4) throw error4; + return data; + }, + // GET /api-keys/{name} → APIKey | null + async getAPIKey(name) { + const { data, error: error4 } = await client.GET("/api-keys/{name}", { + params: { path: { name } } + }); + if (error4) throw error4; + return data?.api_key ?? null; + }, + // DELETE /api-keys/{name} → void (204) + async deleteAPIKey(name) { + const { error: error4 } = await client.DELETE("/api-keys/{name}", { + params: { path: { name } } + }); + if (error4) throw error4; + }, + // POST /api-keys/{name}/disable → APIKey + async disableAPIKey(name) { + const { data, error: error4 } = await client.POST("/api-keys/{name}/disable", { + params: { path: { name } } + }); + if (error4) throw error4; + return data.api_key; + }, + // POST /api-keys/{name}/enable → APIKey + async enableAPIKey(name) { + const { data, error: error4 } = await client.POST("/api-keys/{name}/enable", { + params: { path: { name } } + }); + if (error4) throw error4; + return data.api_key; + } + }; +} + +// static/api-key-management/modal.ts +function useModal(modalEl, options = {}) { + const modalOptions = { backdrop: "static", keyboard: true, focus: true, ...options }; + const modalInstance = $(modalEl).modal({ + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + focus: modalOptions.focus, + // @ts-ignore silence false error due to wrong typping + show: false + }); + let lastTrigger = null; + if (options.onShow) { + $(modalEl).on("show.bs.modal", function() { + options.onShow && options.onShow(); + }); + } + $(modalEl).on("shown.bs.modal", function() { + const focusTarget = modalEl.querySelector('[autofocus], [data-initial-focus], input, button, select, textarea, [tabindex]:not([tabindex="-1"])') || modalEl; + focusTarget.focus(); + options.onShown && options.onShown(); + }); + $(modalEl).on("hide.bs.modal", function() { + const active = document.activeElement; + if (active && modalEl?.contains(active)) { + active.blur(); + } + options.onHide && options.onHide(); + }); + if (options.onHidden) { + $(modalEl).on("hidden.bs.modal", function() { + options.onHidden && options.onHidden(); + hideLoading(); + lastTrigger?.focus(); + lastTrigger = null; + }); + } + const headerEl = modalEl?.querySelector(".modal-header"); + const titleEl = headerEl?.querySelector(".modal-title"); + let loadingOverlay = null; + function showLoading() { + loadingOverlay = createLoadingOverlay(); + loadingOverlay.style.top = headerEl ? `${headerEl.offsetHeight}px` : "0"; + modalEl.querySelector(".modal-content")?.appendChild(loadingOverlay); + } + function hideLoading() { + if (loadingOverlay) { + loadingOverlay.remove(); + loadingOverlay = null; + } + } + return { + setOptions(config) { + const instance = modalInstance?.data("bs.modal"); + const instanceConfig = modalInstance?.data("bs.modal")?._config; + instance && (instance._config = { ...instanceConfig, ...config }); + }, + setTitle(title) { + titleEl && (titleEl.textContent = title); + headerEl?.classList.remove("d-none"); + }, + hideHeader() { + headerEl?.classList.add("d-none"); + }, + // Prefer passing the actual trigger element. Falls back to activeElement. + open(trigger) { + lastTrigger = trigger ?? document.activeElement; + modalInstance && modalInstance.modal("show"); + }, + close() { + modalInstance && modalInstance.modal("hide"); + }, + showLoading, + hideLoading + }; +} +function createLoadingOverlay() { + const overlay = document.createElement("div"); + overlay.style.cssText = ` + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(255, 255, 255, 0.8); + display: flex; + align-items: center; + justify-content: center; + z-index: 1050; + backdrop-filter: blur(1px); + `; + const spinner = document.createElement("div"); + spinner.innerHTML = ` +
+
+ Loading... +
+
Processing...
+
+ `; + overlay.appendChild(spinner); + return overlay; +} + +// static/api-key-management/utils.ts +function formatDate(iso2, options = {}) { + if (!iso2) return ""; + const d = new Date(iso2); + if (Number.isNaN(d.getTime())) return ""; + const { utc = false, withTime = false } = options; + const base = { + month: "short", + day: "numeric", + year: "numeric", + timeZone: utc ? "UTC" : void 0 + }; + return withTime ? d.toLocaleString("en-US", { ...base, hour: "2-digit", minute: "2-digit" }) : d.toLocaleDateString("en-US", base); +} +function debounce(fn, wait = 300) { + let t = null; + return (...args) => { + if (t) clearTimeout(t); + t = setTimeout(() => fn(...args), wait); + }; +} +function validateApiKeyName(raw) { + const isEmpty = raw.length === 0; + const hasWhitespace = /\s/.test(raw); + const trimmed = raw.trim(); + const okLen = trimmed.length >= 3 && trimmed.length <= 35; + const cleanedForChars = trimmed.replace(/\s/g, ""); + const okChars = /^[A-Za-z0-9._-]+$/.test(cleanedForChars) || cleanedForChars.length === 0; + const okSpaces = !hasWhitespace; + return { raw, trimmed, isEmpty, okLen, okChars, okSpaces }; +} +function useToast(options) { + const { + message: message4, + title, + delay = 4e3, + autohide = true, + containerSelector = "#_toast_container", + className = "" + } = options; + let container = document.querySelector(containerSelector); + if (!container) { + container = document.createElement("div"); + container.id = containerSelector.replace(/^#/, ""); + container.style.position = "fixed"; + container.style.top = "1rem"; + container.style.right = "1rem"; + container.style.zIndex = "1080"; + container.style.pointerEvents = "none"; + document.body.appendChild(container); + } + const toast = document.createElement("div"); + toast.className = `toast ${className}`.trim(); + toast.setAttribute("role", "alert"); + toast.setAttribute("aria-live", "assertive"); + toast.setAttribute("aria-atomic", "true"); + toast.style.pointerEvents = "auto"; + const icon = options.type === "success" ? { type: "fa-check-circle", color: "text-success" } : options.type === "error" ? { type: "fa-times-circle", color: "text-danger" } : options.type === "info" ? { type: "fa-info-circle", color: "text-info" } : null; + toast.innerHTML = ` +
+ ${icon ? `` : ""} +
+ ${title ? ` +
${title}
+ ` : ""} + ${message4} +
+ +
+ `; + container.appendChild(toast); + const $2 = window.$; + if ($2?.fn?.toast) { + $2(toast).toast({ delay, autohide }).toast("show"); + $2(toast).on("hidden.bs.toast", () => toast.remove()); + } else { + toast.classList.add("show"); + setTimeout(() => toast.remove(), delay); + } + return toast; +} +async function useCopyToClipboard(text) { + if (!text) return false; + try { + if (navigator.clipboard && (window.isSecureContext ?? location.protocol === "https:")) { + await navigator.clipboard.writeText(text); + } else { + const ta = document.createElement("textarea"); + ta.value = text; + ta.setAttribute("readonly", ""); + ta.style.position = "fixed"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + const ok = document.execCommand("copy"); + document.body.removeChild(ta); + if (!ok) throw new Error("execCommand copy failed"); + } + return true; + } catch { + return false; + } +} +async function copyTextWithToast(text, options) { + const ok = await useCopyToClipboard(text); + if (ok) { + useToast({ + message: options?.successMessage ?? "Copied to clipboard", + title: options?.title ?? "Success", + delay: options?.delay ?? 2e3, + containerSelector: options?.containerSelector, + type: "success", + className: "bg-white" + // keep default BS look; adjust if you want + }); + } else { + useToast({ + message: options?.failureMessage ?? "Copy failed", + title: "Error", + delay: options?.delay ?? 2500, + containerSelector: options?.containerSelector, + type: "error", + className: "bg-danger text-white" + }); + } + return ok; +} +function useValidationState(errorContainer) { + return (errorMsg, inputEl = null) => { + if (errorContainer) { + if (errorMsg.length > 0) { + errorContainer.textContent = errorMsg; + errorContainer.style.display = "block"; + inputEl?.focus(); + inputEl?.classList.add("is-invalid"); + } else { + errorContainer.textContent = ""; + errorContainer.style.display = "none"; + inputEl?.classList.remove("is-invalid"); + } + } + }; +} +function renderKeyData(container, key) { + const elements = container.querySelectorAll("[data-key-prop]"); + elements.forEach((el) => { + const prop = el.getAttribute("data-key-prop"); + if (prop in key) { + let value = key[prop]; + if (prop === "created_at" || prop === "disabled_at" || prop === "last_used_at") { + value = formatDate(value, { withTime: true }); + } + el.textContent = value ?? "\u2014"; + } + }); +} +function clearKeyData(container) { + const elements = container.querySelectorAll("[data-key-prop]"); + elements.forEach((el) => { + el.textContent = ""; + }); +} + +// static/api-key-management/list-keys.ts +var DEFAULTOPTIONS = { + listContainerSelector: "#apiKeysListContainer", + tableSelector: "#apiKeysList", + searchSelector: "#apiKeysListSearchfield", + deleteModalSelector: "#deleteKeyModal" +}; +function initApiKeysTable(api, options) { + const config = { ...DEFAULTOPTIONS, ...options }; + const listContainer = document.querySelector(config.listContainerSelector); + const apiKeysTable = $(config.tableSelector).DataTable({ + serverSide: false, + processing: true, + ajax: (_req, callback, settings) => { + let canceled = false; + settings.jqXHR = { abort() { + canceled = true; + } }; + api.getAPIKeys().then((response) => { + if (canceled) return; + callback({ data: response.api_keys ?? [] }); + updateKeysCount(response.api_keys ?? []); + }).catch((err) => { + if (canceled) return; + console.error("error fetching api keys", err); + callback({ data: [] }); + updateKeysCount([]); + }); + }, + responsive: false, + autoWidth: false, + paging: false, + searching: true, + info: false, + lengthChange: false, + pageLength: 0, + columns: [ + { data: "name" }, + { data: "short_key" }, + { data: "created_at", render: (v) => formatDate(v) }, + { data: "last_used_at", render: (v) => formatDate(v) }, + { data: "disabled_at", render: (v) => formatDate(v) }, + { + orderable: false, + searchable: false, + data: null, + defaultContent: "", + render: (_data, _type, row) => { + const isActiveKey = !row.disabled_at; + return ` +
+ ${makeKeyActionBtn({ + action: isActiveKey ? "disable" : "enable", + keyName: row.name, + label: isActiveKey ? "Disable" : "Enable", + class: "text-white flex-fill" + })} + ${makeKeyActionBtn({ + action: "delete", + keyName: row.name, + title: isActiveKey ? "Cannot delete an active key" : "Delete key", + disabled: isActiveKey + })} +
+ `; + } + } + ], + dom: "<'row'<'col-12'tr>>", + language: { + emptyTable: ` +
+ +

No API Keys

+

Create an API key and it will be listed here

+
+ ` + } + }); + const input = document.querySelector(config.searchSelector); + if (input) { + const onType = debounce(() => { + apiKeysTable.search(input.value).draw(); + }, 100); + input.addEventListener("input", onType); + } + function updateKeysCount(api_keys) { + const totalKeysEls = document.querySelectorAll('[data-role="total-keys-count"]'); + totalKeysEls.forEach((el) => { + el.textContent = String(api_keys.length); + }); + const activeCountEls = document.querySelectorAll('[data-role="active-keys-count"]'); + const activeKeys = api_keys.filter((k) => !k.disabled_at); + activeCountEls.forEach((el) => { + el.textContent = String(activeKeys.length); + }); + } + const disableKeyConfirmModal = useKeyActionConfirmModal("#disableKeyModal", { + onConfirm: async (key) => { + await api.disableAPIKey(key.name); + }, + onSuccess: () => { + apiKeysTable.ajax.reload(); + } + }); + const deleteKeyConfirmModal = useKeyActionConfirmModal("#deleteKeyModal", { + onConfirm: async (key) => { + await api.deleteAPIKey(key.name); + }, + onSuccess: () => { + apiKeysTable.ajax.reload(); + } + }); + const enableKey = useEnableKey({ + onConfirm: async (key) => { + await api.enableAPIKey(key.name); + }, + onSuccess: () => { + apiKeysTable.ajax.reload(); + } + }); + listContainer?.addEventListener("click", (e) => { + const target = e.target; + const keyActionBtn = target.closest("[data-key-action]"); + if (keyActionBtn) { + keyActionBtn.focus(); + const keyData = apiKeysTable.rows().data().toArray().find((k) => k.name === keyActionBtn.getAttribute("data-key")); + if (!keyData) return; + const actionType = keyActionBtn.getAttribute("data-key-action"); + if (!isValidKeyAction(actionType)) return; + if (actionType === "disable") disableKeyConfirmModal?.open(keyData); + else if (actionType === "enable") enableKey(keyData, keyActionBtn); + else if (actionType === "delete") deleteKeyConfirmModal?.open(keyData); + } + }); + return apiKeysTable; +} +function useEnableKey(options) { + let isEnabling = false; + function setLoadingState(btn) { + const iconEl = btn.querySelector("i"); + if (isEnabling) { + iconEl?.classList.remove("fa-play"); + iconEl?.classList.add("fa-spinner", "fa-spin"); + } else { + iconEl?.classList.remove("fa-spinner", "fa-spin"); + iconEl?.classList.add("fa-play"); + } + } + return async (keyData, triggerBtn) => { + if (isEnabling) return; + try { + isEnabling = true; + setLoadingState(triggerBtn); + await options.onConfirm?.(keyData); + useToast({ type: "success", message: `API Key ${keyData.name} has been enabled.` }); + options.onSuccess?.(keyData); + } catch (err) { + console.error("Failed to enable API key:", err); + useToast({ type: "error", message: `Failed to enable API Key ${keyData.name}. Please try again.` }); + } finally { + isEnabling = false; + setLoadingState(triggerBtn); + } + }; +} +var DEFAULTKEYACTIONMODALOPTIONS = { + confirmKeyFormSelector: "[data-key-form]", + keyConfirmNameInputSelector: "[data-key-confirm-name]", + keyConfirmCheckboxSelector: "[data-key-confirm-checkbox]", + keySubmitErrorsSelector: "[data-key-submit-errors]", + validationMissingNameMessage: "Please enter the API Key name to confirm.", + validationNameMismatchMessage: "API Key name does not match.", + validationCheckboxUncheckedMessage: "You must confirm to continue." +}; +function useKeyActionConfirmModal(modalSelector, options = {}) { + const config = { ...DEFAULTKEYACTIONMODALOPTIONS, ...options }; + const modalContainer = document.querySelector(modalSelector); + if (!modalContainer) return null; + let apiKey = null; + const keyForm = modalContainer.querySelector(config.confirmKeyFormSelector); + const keyConfirmNameInput = modalContainer.querySelector(config.keyConfirmNameInputSelector); + const keyConfirmCheckbox = modalContainer.querySelector(config.keyConfirmCheckboxSelector); + const keySubmitErrors = modalContainer.querySelector(config.keySubmitErrorsSelector); + const keyActionConfirmModal = useModal(modalContainer, { + backdrop: true, + keyboard: true, + onHidden() { + apiKey = null; + clearKeyData(modalContainer); + keyForm?.reset(); + clearValidationState(); + } + }); + const getErrorMessage = (key) => modalContainer.dataset[key] || `Please check the ${key} field.`; + let isSubmitting = false; + keyForm?.addEventListener("submit", async (e) => { + e.preventDefault(); + if (!apiKey || isSubmitting || !options.onConfirm) return; + if (!validateForm()) return; + try { + isSubmitting = true; + keyActionConfirmModal.showLoading(); + await options.onConfirm(apiKey); + const successMessage = getErrorMessage("successMessage").replace("{keyName}", apiKey.name); + useToast({ type: "success", message: successMessage }); + keyActionConfirmModal.close(); + options.onSuccess?.(apiKey); + } catch (err) { + console.error("API call failed:", err); + const errorMessage = getErrorMessage("errorMessage").replace("{keyName}", apiKey.name); + useToast({ type: "error", message: errorMessage }); + } finally { + isSubmitting = false; + keyActionConfirmModal.hideLoading(); + } + }); + const setValidationState = useValidationState(keySubmitErrors); + const clearValidationState = () => { + setValidationState("", keyConfirmNameInput); + setValidationState("", keyConfirmCheckbox); + }; + function validateForm() { + let isValid = true; + clearValidationState(); + const nameValue = keyConfirmNameInput?.value?.trim(); + if (!nameValue) { + isValid = false; + setValidationState(getErrorMessage("validationMissingName"), keyConfirmNameInput); + } else if (nameValue !== apiKey?.name) { + isValid = false; + setValidationState(getErrorMessage("validationNameMismatch"), keyConfirmNameInput); + } else if (!keyConfirmCheckbox?.checked) { + isValid = false; + setValidationState(getErrorMessage("validationCheckboxUnchecked"), keyConfirmCheckbox); + } + return isValid; + } + keyForm?.addEventListener("change", () => { + validateForm(); + }); + function openKeyActionConfirmModal(keyData, trigger) { + apiKey = keyData; + modalContainer && renderKeyData(modalContainer, apiKey); + keyActionConfirmModal.open(trigger); + } + return { + open: openKeyActionConfirmModal + }; +} +function isValidKeyAction(action) { + return action === "disable" || action === "enable" || action === "delete"; +} +function makeKeyActionBtn(options) { + const classType = options.action !== "delete" ? "btn-secondary" : "btn-danger"; + const iconType = options.action === "disable" ? "fa-ban" : options.action === "enable" ? "fa-play" : "fa-trash"; + return ` + + `; +} + +// static/api-key-management/create-keys.ts +var DEFAULTOPTIONS2 = { + // Form options + createFormSelector: "#createKeyForm", + keyNameinputSelector: "#newApiKeyField", + submitBtnSelector: "[type=submit]", + rulesSelector: "ul.list-unstyled [data-validate-rule]" +}; +function useAPIKeyCreation(api, options = {}) { + const config = { ...DEFAULTOPTIONS2, ...options }; + const createForm = document.querySelector(config.createFormSelector); + const keyNameinput = document.querySelector(config.keyNameinputSelector); + if (!createForm || !keyNameinput) return; + const validateNameAndSetStatus = useNameValidator(createForm, config.rulesSelector); + const creationModal = useCreationModal(); + keyNameinput.addEventListener("input", () => { + validateNameAndSetStatus(keyNameinput.value); + }); + const submitBtn = createForm.querySelector(config.submitBtnSelector); + let submitting = false; + let createdKey = null; + createForm.addEventListener("submit", async (e) => { + e.preventDefault(); + if (submitting) return; + const v = validateNameAndSetStatus(keyNameinput.value); + if (!(v.okLen && v.okChars && v.okSpaces)) { + keyNameinput.focus(); + return; + } + ; + const name = v.trimmed; + submitting = true; + submitBtn && (submitBtn.disabled = true); + creationModal?.showLoading(); + try { + const response = await api.createAPIKey({ name }); + creationModal?.showSuccess(response); + keyNameinput.value = ""; + createdKey = name; + validateNameAndSetStatus(""); + try { + config.onCreated?.(); + } catch (err) { + console.error("onCreated callback failed:", err); + } + } catch (err) { + creationModal?.showError(); + console.error("Failed to create API key:", err); + } finally { + submitting = false; + submitBtn && (submitBtn.disabled = false); + } + }); +} +function useNameValidator(root, rulesSelector = DEFAULTOPTIONS2.rulesSelector) { + const rulesMap = buildRulesMap(root, rulesSelector); + return function(raw) { + const v = validateApiKeyName(raw); + const isEmpty = v.raw.length === 0; + const state = (ok) => isEmpty ? "idle" : ok ? "ok" : "err"; + if (rulesMap.length) setValidationStatus(rulesMap.length, state(v.okLen)); + if (rulesMap.chars) setValidationStatus(rulesMap.chars, state(v.okChars)); + if (rulesMap.spaces) setValidationStatus(rulesMap.spaces, state(v.okSpaces)); + return v; + }; +} +function buildRulesMap(root, rulesSelector = DEFAULTOPTIONS2.rulesSelector) { + const map = {}; + const els = Array.from(root.querySelectorAll(rulesSelector)); + for (const el of els) { + const key = el.dataset.validateRule; + if (key) map[key] = el; + } + return map; +} +function setValidationStatus(el, state) { + el.classList.remove("text-muted", "text-success", "text-danger"); + el.classList.add(state === "idle" ? "text-muted" : state === "ok" ? "text-success" : "text-danger"); +} +var DEFAULTCREATIONMODALOPTIONS = { + creationModalSelector: "#createKeyModal", + loadingSectionSelector: "#createKeyModalLoading", + successSectionSelector: "#createKeyModalSuccess", + errorSectionSelector: "#createKeyModalError", + createdApiKeyRawSelector: "#createdApiKeyRaw" +}; +function useCreationModal(options) { + const config = { ...DEFAULTCREATIONMODALOPTIONS, ...options }; + const modalContainer = document.querySelector(config.creationModalSelector); + if (!modalContainer) return null; + let createdKey = null; + const modal = useModal(modalContainer, { + onHidden: () => { + clearAPIKeyInSuccessSection(); + createdKey = null; + } + }); + const loadingContainer = modalContainer.querySelector(config.loadingSectionSelector); + const successContainer = modalContainer.querySelector(config.successSectionSelector); + const errorContainer = modalContainer.querySelector(config.errorSectionSelector); + function showSection(which) { + if (loadingContainer) seSectionVisibility(loadingContainer, which === "loading"); + if (successContainer) seSectionVisibility(successContainer, which === "success"); + if (errorContainer) seSectionVisibility(errorContainer, which === "error"); + } + function setAPIKeyInSuccessSection(key) { + createdKey = key; + if (!successContainer) return; + renderKeyData(successContainer, createdKey.api_key); + const keyField = successContainer.querySelector(config.createdApiKeyRawSelector); + if (keyField) { + keyField.value = key.raw_api_key ?? ""; + } + } + function clearAPIKeyInSuccessSection() { + if (!successContainer) return; + clearKeyData(successContainer); + const keyField = successContainer.querySelector(config.createdApiKeyRawSelector); + if (keyField) { + keyField.value = ""; + } + } + modalContainer.addEventListener("click", (event) => { + const target = event.target; + const triggerCopy = target && target.closest("[data-copy-api-key]"); + if (triggerCopy) { + event.preventDefault(); + copyTextWithToast(createdKey?.raw_api_key ?? "asdadas", { title: "API Key Copied", successMessage: "Your API key has been copied to clipboard." }); + } + const triggerToggle = target && target.closest("[data-toggle-api-key]"); + if (triggerToggle) { + event.preventDefault(); + const keyField = successContainer?.querySelector(config.createdApiKeyRawSelector); + if (keyField) { + if (keyField.type === "password") { + keyField.type = "text"; + triggerToggle.querySelector("i")?.classList.replace("fa-eye", "fa-eye-slash"); + } else { + keyField.type = "password"; + triggerToggle.querySelector("i")?.classList.replace("fa-eye-slash", "fa-eye"); + } + } + } + }); + return { + showLoading() { + modal.setOptions({ backdrop: "static", keyboard: false }); + modal.hideHeader(); + showSection("loading"); + modal.open(); + }, + showSuccess(key) { + modal.setOptions({ backdrop: "static", keyboard: false }); + modal.setTitle("Operation successful"); + setAPIKeyInSuccessSection(key); + showSection("success"); + modal.open(); + }, + showError() { + modal.setOptions({ backdrop: true, keyboard: true }); + modal.setTitle("Something went wrong."); + showSection("error"); + modal.open(); + } + }; +} +function seSectionVisibility(section, visible) { + section.style.display = visible ? "block" : "none"; + if (visible) { + section.classList.remove("d-none"); + } else { + section.classList.add("d-none"); + } +} + +// node_modules/msw/lib/core/utils/internal/isObject.mjs +function isObject(value) { + return value != null && typeof value === "object" && !Array.isArray(value); +} + +// node_modules/msw/lib/core/utils/internal/mergeRight.mjs +function mergeRight(left, right) { + return Object.entries(right).reduce( + (result, [key, rightValue]) => { + const leftValue = result[key]; + if (Array.isArray(leftValue) && Array.isArray(rightValue)) { + result[key] = leftValue.concat(rightValue); + return result; + } + if (isObject(leftValue) && isObject(rightValue)) { + result[key] = mergeRight(leftValue, rightValue); + return result; + } + result[key] = rightValue; + return result; + }, + Object.assign({}, left) + ); +} + +// node_modules/outvariant/lib/index.mjs +var POSITIONALS_EXP = /(%?)(%([sdijo]))/g; +function serializePositional(positional, flag) { + switch (flag) { + case "s": + return positional; + case "d": + case "i": + return Number(positional); + case "j": + return JSON.stringify(positional); + case "o": { + if (typeof positional === "string") { + return positional; + } + const json = JSON.stringify(positional); + if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) { + return positional; + } + return json; + } + } +} +function format(message4, ...positionals) { + if (positionals.length === 0) { + return message4; + } + let positionalIndex = 0; + let formattedMessage = message4.replace( + POSITIONALS_EXP, + (match2, isEscaped, _, flag) => { + const positional = positionals[positionalIndex]; + const value = serializePositional(positional, flag); + if (!isEscaped) { + positionalIndex++; + return value; + } + return match2; + } + ); + if (positionalIndex < positionals.length) { + formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`; + } + formattedMessage = formattedMessage.replace(/%{2,2}/g, "%"); + return formattedMessage; +} +var STACK_FRAMES_TO_IGNORE = 2; +function cleanErrorStack(error4) { + if (!error4.stack) { + return; + } + const nextStack = error4.stack.split("\n"); + nextStack.splice(1, STACK_FRAMES_TO_IGNORE); + error4.stack = nextStack.join("\n"); +} +var InvariantError = class extends Error { + constructor(message4, ...positionals) { + super(message4); + this.message = message4; + this.name = "Invariant Violation"; + this.message = format(message4, ...positionals); + cleanErrorStack(this); + } +}; +var invariant = (predicate, message4, ...positionals) => { + if (!predicate) { + throw new InvariantError(message4, ...positionals); + } +}; +invariant.as = (ErrorConstructor, predicate, message4, ...positionals) => { + if (!predicate) { + const formatMessage2 = positionals.length === 0 ? message4 : format(message4, ...positionals); + let error4; + try { + error4 = Reflect.construct(ErrorConstructor, [ + formatMessage2 + ]); + } catch (err) { + error4 = ErrorConstructor(formatMessage2); + } + throw error4; + } +}; + +// node_modules/msw/lib/core/utils/internal/devUtils.mjs +var LIBRARY_PREFIX = "[MSW]"; +function formatMessage(message4, ...positionals) { + const interpolatedMessage = format(message4, ...positionals); + return `${LIBRARY_PREFIX} ${interpolatedMessage}`; +} +function warn(message4, ...positionals) { + console.warn(formatMessage(message4, ...positionals)); +} +function error(message4, ...positionals) { + console.error(formatMessage(message4, ...positionals)); +} +var devUtils = { + formatMessage, + warn, + error +}; +var InternalError = class extends Error { + constructor(message4) { + super(message4); + this.name = "InternalError"; + } +}; + +// node_modules/msw/lib/core/utils/internal/getCallFrame.mjs +var SOURCE_FRAME = /[/\\]msw[/\\]src[/\\](.+)/; +var BUILD_FRAME = /(node_modules)?[/\\]lib[/\\](core|browser|node|native|iife)[/\\]|^[^/\\]*$/; +function getCallFrame(error4) { + const stack = error4.stack; + if (!stack) { + return; + } + const frames = stack.split("\n").slice(1); + const declarationFrame = frames.find((frame) => { + return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame)); + }); + if (!declarationFrame) { + return; + } + const declarationPath = declarationFrame.replace(/\s*at [^()]*\(([^)]+)\)/, "$1").replace(/^@/, ""); + return declarationPath; +} + +// node_modules/msw/lib/core/utils/internal/isIterable.mjs +function isIterable(fn) { + if (!fn) { + return false; + } + return Reflect.has(fn, Symbol.iterator) || Reflect.has(fn, Symbol.asyncIterator); +} + +// node_modules/msw/lib/core/handlers/RequestHandler.mjs +var RequestHandler = class _RequestHandler { + static cache = /* @__PURE__ */ new WeakMap(); + __kind; + info; + /** + * Indicates whether this request handler has been used + * (its resolver has successfully executed). + */ + isUsed; + resolver; + resolverIterator; + resolverIteratorResult; + options; + constructor(args) { + this.resolver = args.resolver; + this.options = args.options; + const callFrame = getCallFrame(new Error()); + this.info = { + ...args.info, + callFrame + }; + this.isUsed = false; + this.__kind = "RequestHandler"; + } + /** + * Parse the intercepted request to extract additional information from it. + * Parsed result is then exposed to other methods of this request handler. + */ + async parse(_args) { + return {}; + } + /** + * Test if this handler matches the given request. + * + * This method is not used internally but is exposed + * as a convenience method for consumers writing custom + * handlers. + */ + async test(args) { + const parsedResult = await this.parse({ + request: args.request, + resolutionContext: args.resolutionContext + }); + return this.predicate({ + request: args.request, + parsedResult, + resolutionContext: args.resolutionContext + }); + } + extendResolverArgs(_args) { + return {}; + } + // Clone the request instance before it's passed to the handler phases + // and the response resolver so we can always read it for logging. + // We only clone it once per request to avoid unnecessary overhead. + cloneRequestOrGetFromCache(request) { + const existingClone = _RequestHandler.cache.get(request); + if (typeof existingClone !== "undefined") { + return existingClone; + } + const clonedRequest = request.clone(); + _RequestHandler.cache.set(request, clonedRequest); + return clonedRequest; + } + /** + * Execute this request handler and produce a mocked response + * using the given resolver function. + */ + async run(args) { + if (this.isUsed && this.options?.once) { + return null; + } + const requestClone = this.cloneRequestOrGetFromCache(args.request); + const parsedResult = await this.parse({ + request: args.request, + resolutionContext: args.resolutionContext + }); + const shouldInterceptRequest = await this.predicate({ + request: args.request, + parsedResult, + resolutionContext: args.resolutionContext + }); + if (!shouldInterceptRequest) { + return null; + } + if (this.isUsed && this.options?.once) { + return null; + } + this.isUsed = true; + const executeResolver = this.wrapResolver(this.resolver); + const resolverExtras = this.extendResolverArgs({ + request: args.request, + parsedResult + }); + const mockedResponsePromise = executeResolver({ + ...resolverExtras, + requestId: args.requestId, + request: args.request + }).catch((errorOrResponse) => { + if (errorOrResponse instanceof Response) { + return errorOrResponse; + } + throw errorOrResponse; + }); + const mockedResponse = await mockedResponsePromise; + const executionResult = this.createExecutionResult({ + // Pass the cloned request to the result so that logging + // and other consumers could read its body once more. + request: requestClone, + requestId: args.requestId, + response: mockedResponse, + parsedResult + }); + return executionResult; + } + wrapResolver(resolver) { + return async (info) => { + if (!this.resolverIterator) { + const result = await resolver(info); + if (!isIterable(result)) { + return result; + } + this.resolverIterator = Symbol.iterator in result ? result[Symbol.iterator]() : result[Symbol.asyncIterator](); + } + this.isUsed = false; + const { done, value } = await this.resolverIterator.next(); + const nextResponse = await value; + if (nextResponse) { + this.resolverIteratorResult = nextResponse.clone(); + } + if (done) { + this.isUsed = true; + return this.resolverIteratorResult?.clone(); + } + return nextResponse; + }; + } + createExecutionResult(args) { + return { + handler: this, + request: args.request, + requestId: args.requestId, + response: args.response, + parsedResult: args.parsedResult + }; + } +}; + +// node_modules/until-async/lib/index.js +async function until(callback) { + try { + return [null, await callback().catch((error4) => { + throw error4; + })]; + } catch (error4) { + return [error4, null]; + } +} + +// node_modules/msw/lib/core/utils/executeHandlers.mjs +var executeHandlers = async ({ + request, + requestId, + handlers, + resolutionContext +}) => { + let matchingHandler = null; + let result = null; + for (const handler of handlers) { + result = await handler.run({ request, requestId, resolutionContext }); + if (result !== null) { + matchingHandler = handler; + } + if (result?.response) { + break; + } + } + if (matchingHandler) { + return { + handler: matchingHandler, + parsedResult: result?.parsedResult, + response: result?.response + }; + } + return null; +}; + +// node_modules/msw/lib/core/utils/request/toPublicUrl.mjs +function toPublicUrl(url) { + if (typeof location === "undefined") { + return url.toString(); + } + const urlInstance = url instanceof URL ? url : new URL(url); + return urlInstance.origin === location.origin ? urlInstance.pathname : urlInstance.origin + urlInstance.pathname; +} + +// node_modules/msw/lib/core/isCommonAssetRequest.mjs +function isCommonAssetRequest(request) { + const url = new URL(request.url); + if (url.protocol === "file:") { + return true; + } + if (/(fonts\.googleapis\.com)/.test(url.hostname)) { + return true; + } + if (/node_modules/.test(url.pathname)) { + return true; + } + if (url.pathname.includes("@vite")) { + return true; + } + return /\.(s?css|less|m?jsx?|m?tsx?|html|ttf|otf|woff|woff2|eot|gif|jpe?g|png|avif|webp|svg|mp4|webm|ogg|mov|mp3|wav|ogg|flac|aac|pdf|txt|csv|json|xml|md|zip|tar|gz|rar|7z)$/i.test( + url.pathname + ); +} + +// node_modules/msw/lib/core/utils/request/onUnhandledRequest.mjs +async function onUnhandledRequest(request, strategy = "warn") { + const url = new URL(request.url); + const publicUrl = toPublicUrl(url) + url.search; + const requestBody = request.method === "HEAD" || request.method === "GET" ? null : await request.clone().text(); + const messageDetails = ` + + \u2022 ${request.method} ${publicUrl} + +${requestBody ? ` \u2022 Request body: ${requestBody} + +` : ""}`; + const unhandledRequestMessage = `intercepted a request without a matching request handler:${messageDetails}If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/http/intercepting-requests`; + function applyStrategy(strategy2) { + switch (strategy2) { + case "error": { + devUtils.error("Error: %s", unhandledRequestMessage); + throw new InternalError( + devUtils.formatMessage( + 'Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.' + ) + ); + } + case "warn": { + devUtils.warn("Warning: %s", unhandledRequestMessage); + break; + } + case "bypass": + break; + default: + throw new InternalError( + devUtils.formatMessage( + 'Failed to react to an unhandled request: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', + strategy2 + ) + ); + } + } + if (typeof strategy === "function") { + strategy(request, { + warning: applyStrategy.bind(null, "warn"), + error: applyStrategy.bind(null, "error") + }); + return; + } + if (!isCommonAssetRequest(request)) { + applyStrategy(strategy); + } +} + +// node_modules/is-node-process/lib/index.mjs +function isNodeProcess() { + if (typeof navigator !== "undefined" && navigator.product === "ReactNative") { + return true; + } + if (typeof process !== "undefined") { + const type = process.type; + if (type === "renderer" || type === "worker") { + return false; + } + return !!(process.versions && process.versions.node); + } + return false; +} + +// node_modules/tldts-core/dist/es6/src/domain.js +function shareSameDomainSuffix(hostname, vhost) { + if (hostname.endsWith(vhost)) { + return hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === "."; + } + return false; +} +function extractDomainWithSuffix(hostname, publicSuffix) { + const publicSuffixIndex = hostname.length - publicSuffix.length - 2; + const lastDotBeforeSuffixIndex = hostname.lastIndexOf(".", publicSuffixIndex); + if (lastDotBeforeSuffixIndex === -1) { + return hostname; + } + return hostname.slice(lastDotBeforeSuffixIndex + 1); +} +function getDomain(suffix, hostname, options) { + if (options.validHosts !== null) { + const validHosts = options.validHosts; + for (const vhost of validHosts) { + if ( + /*@__INLINE__*/ + shareSameDomainSuffix(hostname, vhost) + ) { + return vhost; + } + } + } + let numberOfLeadingDots = 0; + if (hostname.startsWith(".")) { + while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === ".") { + numberOfLeadingDots += 1; + } + } + if (suffix.length === hostname.length - numberOfLeadingDots) { + return null; + } + return ( + /*@__INLINE__*/ + extractDomainWithSuffix(hostname, suffix) + ); +} + +// node_modules/tldts-core/dist/es6/src/domain-without-suffix.js +function getDomainWithoutSuffix(domain, suffix) { + return domain.slice(0, -suffix.length - 1); +} + +// node_modules/tldts-core/dist/es6/src/extract-hostname.js +function extractHostname(url, urlIsValidHostname) { + let start = 0; + let end = url.length; + let hasUpper = false; + if (!urlIsValidHostname) { + if (url.startsWith("data:")) { + return null; + } + while (start < url.length && url.charCodeAt(start) <= 32) { + start += 1; + } + while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { + end -= 1; + } + if (url.charCodeAt(start) === 47 && url.charCodeAt(start + 1) === 47) { + start += 2; + } else { + const indexOfProtocol = url.indexOf(":/", start); + if (indexOfProtocol !== -1) { + const protocolSize = indexOfProtocol - start; + const c0 = url.charCodeAt(start); + const c1 = url.charCodeAt(start + 1); + const c2 = url.charCodeAt(start + 2); + const c3 = url.charCodeAt(start + 3); + const c4 = url.charCodeAt(start + 4); + if (protocolSize === 5 && c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112 && c4 === 115) { + } else if (protocolSize === 4 && c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112) { + } else if (protocolSize === 3 && c0 === 119 && c1 === 115 && c2 === 115) { + } else if (protocolSize === 2 && c0 === 119 && c1 === 115) { + } else { + for (let i = start; i < indexOfProtocol; i += 1) { + const lowerCaseCode = url.charCodeAt(i) | 32; + if (!(lowerCaseCode >= 97 && lowerCaseCode <= 122 || // [a, z] + lowerCaseCode >= 48 && lowerCaseCode <= 57 || // [0, 9] + lowerCaseCode === 46 || // '.' + lowerCaseCode === 45 || // '-' + lowerCaseCode === 43)) { + return null; + } + } + } + start = indexOfProtocol + 2; + while (url.charCodeAt(start) === 47) { + start += 1; + } + } + } + let indexOfIdentifier = -1; + let indexOfClosingBracket = -1; + let indexOfPort = -1; + for (let i = start; i < end; i += 1) { + const code = url.charCodeAt(i); + if (code === 35 || // '#' + code === 47 || // '/' + code === 63) { + end = i; + break; + } else if (code === 64) { + indexOfIdentifier = i; + } else if (code === 93) { + indexOfClosingBracket = i; + } else if (code === 58) { + indexOfPort = i; + } else if (code >= 65 && code <= 90) { + hasUpper = true; + } + } + if (indexOfIdentifier !== -1 && indexOfIdentifier > start && indexOfIdentifier < end) { + start = indexOfIdentifier + 1; + } + if (url.charCodeAt(start) === 91) { + if (indexOfClosingBracket !== -1) { + return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); + } + return null; + } else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { + end = indexOfPort; + } + } + while (end > start + 1 && url.charCodeAt(end - 1) === 46) { + end -= 1; + } + const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; + if (hasUpper) { + return hostname.toLowerCase(); + } + return hostname; +} + +// node_modules/tldts-core/dist/es6/src/is-ip.js +function isProbablyIpv4(hostname) { + if (hostname.length < 7) { + return false; + } + if (hostname.length > 15) { + return false; + } + let numberOfDots = 0; + for (let i = 0; i < hostname.length; i += 1) { + const code = hostname.charCodeAt(i); + if (code === 46) { + numberOfDots += 1; + } else if (code < 48 || code > 57) { + return false; + } + } + return numberOfDots === 3 && hostname.charCodeAt(0) !== 46 && hostname.charCodeAt(hostname.length - 1) !== 46; +} +function isProbablyIpv6(hostname) { + if (hostname.length < 3) { + return false; + } + let start = hostname.startsWith("[") ? 1 : 0; + let end = hostname.length; + if (hostname[end - 1] === "]") { + end -= 1; + } + if (end - start > 39) { + return false; + } + let hasColon = false; + for (; start < end; start += 1) { + const code = hostname.charCodeAt(start); + if (code === 58) { + hasColon = true; + } else if (!(code >= 48 && code <= 57 || // 0-9 + code >= 97 && code <= 102 || // a-f + code >= 65 && code <= 90)) { + return false; + } + } + return hasColon; +} +function isIp(hostname) { + return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); +} + +// node_modules/tldts-core/dist/es6/src/is-valid.js +function isValidAscii(code) { + return code >= 97 && code <= 122 || code >= 48 && code <= 57 || code > 127; +} +function is_valid_default(hostname) { + if (hostname.length > 255) { + return false; + } + if (hostname.length === 0) { + return false; + } + if ( + /*@__INLINE__*/ + !isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot) + hostname.charCodeAt(0) !== 95 + ) { + return false; + } + let lastDotIndex = -1; + let lastCharCode = -1; + const len = hostname.length; + for (let i = 0; i < len; i += 1) { + const code = hostname.charCodeAt(i); + if (code === 46) { + if ( + // Check that previous label is < 63 bytes long (64 = 63 + '.') + i - lastDotIndex > 64 || // Check that previous character was not already a '.' + lastCharCode === 46 || // Check that the previous label does not end with a '-' (dash) + lastCharCode === 45 || // Check that the previous label does not end with a '_' (underscore) + lastCharCode === 95 + ) { + return false; + } + lastDotIndex = i; + } else if (!/*@__INLINE__*/ + (isValidAscii(code) || code === 45 || code === 95)) { + return false; + } + lastCharCode = code; + } + return ( + // Check that last label is shorter than 63 chars + len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character. + // Since we already checked that the char is a valid hostname character, + // we only need to check that it's different from '-'. + lastCharCode !== 45 + ); +} + +// node_modules/tldts-core/dist/es6/src/options.js +function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname: extractHostname2 = true, mixedInputs = true, validHosts = null, validateHostname = true }) { + return { + allowIcannDomains, + allowPrivateDomains, + detectIp, + extractHostname: extractHostname2, + mixedInputs, + validHosts, + validateHostname + }; +} +var DEFAULT_OPTIONS = ( + /*@__INLINE__*/ + setDefaultsImpl({}) +); +function setDefaults(options) { + if (options === void 0) { + return DEFAULT_OPTIONS; + } + return ( + /*@__INLINE__*/ + setDefaultsImpl(options) + ); +} + +// node_modules/tldts-core/dist/es6/src/subdomain.js +function getSubdomain(hostname, domain) { + if (domain.length === hostname.length) { + return ""; + } + return hostname.slice(0, -domain.length - 1); +} + +// node_modules/tldts-core/dist/es6/src/factory.js +function getEmptyResult() { + return { + domain: null, + domainWithoutSuffix: null, + hostname: null, + isIcann: null, + isIp: null, + isPrivate: null, + publicSuffix: null, + subdomain: null + }; +} +function resetResult(result) { + result.domain = null; + result.domainWithoutSuffix = null; + result.hostname = null; + result.isIcann = null; + result.isIp = null; + result.isPrivate = null; + result.publicSuffix = null; + result.subdomain = null; +} +function parseImpl(url, step, suffixLookup2, partialOptions, result) { + const options = ( + /*@__INLINE__*/ + setDefaults(partialOptions) + ); + if (typeof url !== "string") { + return result; + } + if (!options.extractHostname) { + result.hostname = url; + } else if (options.mixedInputs) { + result.hostname = extractHostname(url, is_valid_default(url)); + } else { + result.hostname = extractHostname(url, false); + } + if (options.detectIp && result.hostname !== null) { + result.isIp = isIp(result.hostname); + if (result.isIp) { + return result; + } + } + if (options.validateHostname && options.extractHostname && result.hostname !== null && !is_valid_default(result.hostname)) { + result.hostname = null; + return result; + } + if (step === 0 || result.hostname === null) { + return result; + } + suffixLookup2(result.hostname, options, result); + if (step === 2 || result.publicSuffix === null) { + return result; + } + result.domain = getDomain(result.publicSuffix, result.hostname, options); + if (step === 3 || result.domain === null) { + return result; + } + result.subdomain = getSubdomain(result.hostname, result.domain); + if (step === 4) { + return result; + } + result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix); + return result; +} + +// node_modules/tldts-core/dist/es6/src/lookup/fast-path.js +function fast_path_default(hostname, options, out) { + if (!options.allowPrivateDomains && hostname.length > 3) { + const last = hostname.length - 1; + const c3 = hostname.charCodeAt(last); + const c2 = hostname.charCodeAt(last - 1); + const c1 = hostname.charCodeAt(last - 2); + const c0 = hostname.charCodeAt(last - 3); + if (c3 === 109 && c2 === 111 && c1 === 99 && c0 === 46) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = "com"; + return true; + } else if (c3 === 103 && c2 === 114 && c1 === 111 && c0 === 46) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = "org"; + return true; + } else if (c3 === 117 && c2 === 100 && c1 === 101 && c0 === 46) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = "edu"; + return true; + } else if (c3 === 118 && c2 === 111 && c1 === 103 && c0 === 46) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = "gov"; + return true; + } else if (c3 === 116 && c2 === 101 && c1 === 110 && c0 === 46) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = "net"; + return true; + } else if (c3 === 101 && c2 === 100 && c1 === 46) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = "de"; + return true; + } + } + return false; +} + +// node_modules/tldts/dist/es6/src/data/trie.js +var exceptions = /* @__PURE__ */ (function() { + const _0 = [1, {}], _1 = [0, { "city": _0 }]; + const exceptions2 = [0, { "ck": [0, { "www": _0 }], "jp": [0, { "kawasaki": _1, "kitakyushu": _1, "kobe": _1, "nagoya": _1, "sapporo": _1, "sendai": _1, "yokohama": _1 }] }]; + return exceptions2; +})(); +var rules = /* @__PURE__ */ (function() { + const _2 = [1, {}], _3 = [2, {}], _4 = [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2 }], _5 = [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], _6 = [0, { "*": _3 }], _7 = [2, { "s": _6 }], _8 = [0, { "relay": _3 }], _9 = [2, { "id": _3 }], _10 = [1, { "gov": _2 }], _11 = [2, { "vps": _3 }], _12 = [0, { "airflow": _6, "transfer-webapp": _3 }], _13 = [0, { "transfer-webapp": _3, "transfer-webapp-fips": _3 }], _14 = [0, { "notebook": _3, "studio": _3 }], _15 = [0, { "labeling": _3, "notebook": _3, "studio": _3 }], _16 = [0, { "notebook": _3 }], _17 = [0, { "labeling": _3, "notebook": _3, "notebook-fips": _3, "studio": _3 }], _18 = [0, { "notebook": _3, "notebook-fips": _3, "studio": _3, "studio-fips": _3 }], _19 = [0, { "shop": _3 }], _20 = [0, { "*": _2 }], _21 = [1, { "co": _3 }], _22 = [0, { "objects": _3 }], _23 = [2, { "nodes": _3 }], _24 = [0, { "my": _3 }], _25 = [0, { "s3": _3, "s3-accesspoint": _3, "s3-website": _3 }], _26 = [0, { "s3": _3, "s3-accesspoint": _3 }], _27 = [0, { "direct": _3 }], _28 = [0, { "webview-assets": _3 }], _29 = [0, { "vfs": _3, "webview-assets": _3 }], _30 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-object-lambda": _3, "s3-website": _3, "aws-cloud9": _28, "cloud9": _29 }], _31 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _26, "s3": _3, "s3-accesspoint": _3, "s3-object-lambda": _3, "s3-website": _3, "aws-cloud9": _28, "cloud9": _29 }], _32 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-object-lambda": _3, "s3-website": _3, "analytics-gateway": _3, "aws-cloud9": _28, "cloud9": _29 }], _33 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-object-lambda": _3, "s3-website": _3 }], _34 = [0, { "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-fips": _3, "s3-website": _3 }], _35 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _34, "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-fips": _3, "s3-object-lambda": _3, "s3-website": _3, "aws-cloud9": _28, "cloud9": _29 }], _36 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _34, "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-deprecated": _3, "s3-fips": _3, "s3-object-lambda": _3, "s3-website": _3, "analytics-gateway": _3, "aws-cloud9": _28, "cloud9": _29 }], _37 = [0, { "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-fips": _3 }], _38 = [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _37, "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-fips": _3, "s3-object-lambda": _3, "s3-website": _3 }], _39 = [0, { "auth": _3 }], _40 = [0, { "auth": _3, "auth-fips": _3 }], _41 = [0, { "auth-fips": _3 }], _42 = [0, { "apps": _3 }], _43 = [0, { "paas": _3 }], _44 = [2, { "eu": _3 }], _45 = [0, { "app": _3 }], _46 = [0, { "site": _3 }], _47 = [1, { "com": _2, "edu": _2, "net": _2, "org": _2 }], _48 = [0, { "j": _3 }], _49 = [0, { "dyn": _3 }], _50 = [2, { "web": _3 }], _51 = [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2 }], _52 = [0, { "p": _3 }], _53 = [0, { "user": _3 }], _54 = [0, { "cdn": _3 }], _55 = [2, { "raw": _6 }], _56 = [0, { "cust": _3, "reservd": _3 }], _57 = [0, { "cust": _3 }], _58 = [0, { "s3": _3 }], _59 = [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2 }], _60 = [0, { "ipfs": _3 }], _61 = [1, { "framer": _3 }], _62 = [0, { "forgot": _3 }], _63 = [1, { "gs": _2 }], _64 = [0, { "nes": _2 }], _65 = [1, { "k12": _2, "cc": _2, "lib": _2 }], _66 = [1, { "cc": _2 }], _67 = [1, { "cc": _2, "lib": _2 }]; + const rules2 = [0, { "ac": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "drr": _3, "feedback": _3, "forms": _3 }], "ad": _2, "ae": [1, { "ac": _2, "co": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "sch": _2 }], "aero": [1, { "airline": _2, "airport": _2, "accident-investigation": _2, "accident-prevention": _2, "aerobatic": _2, "aeroclub": _2, "aerodrome": _2, "agents": _2, "air-surveillance": _2, "air-traffic-control": _2, "aircraft": _2, "airtraffic": _2, "ambulance": _2, "association": _2, "author": _2, "ballooning": _2, "broker": _2, "caa": _2, "cargo": _2, "catering": _2, "certification": _2, "championship": _2, "charter": _2, "civilaviation": _2, "club": _2, "conference": _2, "consultant": _2, "consulting": _2, "control": _2, "council": _2, "crew": _2, "design": _2, "dgca": _2, "educator": _2, "emergency": _2, "engine": _2, "engineer": _2, "entertainment": _2, "equipment": _2, "exchange": _2, "express": _2, "federation": _2, "flight": _2, "freight": _2, "fuel": _2, "gliding": _2, "government": _2, "groundhandling": _2, "group": _2, "hanggliding": _2, "homebuilt": _2, "insurance": _2, "journal": _2, "journalist": _2, "leasing": _2, "logistics": _2, "magazine": _2, "maintenance": _2, "marketplace": _2, "media": _2, "microlight": _2, "modelling": _2, "navigation": _2, "parachuting": _2, "paragliding": _2, "passenger-association": _2, "pilot": _2, "press": _2, "production": _2, "recreation": _2, "repbody": _2, "res": _2, "research": _2, "rotorcraft": _2, "safety": _2, "scientist": _2, "services": _2, "show": _2, "skydiving": _2, "software": _2, "student": _2, "taxi": _2, "trader": _2, "trading": _2, "trainer": _2, "union": _2, "workinggroup": _2, "works": _2 }], "af": _4, "ag": [1, { "co": _2, "com": _2, "net": _2, "nom": _2, "org": _2, "obj": _3 }], "ai": [1, { "com": _2, "net": _2, "off": _2, "org": _2, "uwu": _3, "framer": _3 }], "al": _5, "am": [1, { "co": _2, "com": _2, "commune": _2, "net": _2, "org": _2, "radio": _3 }], "ao": [1, { "co": _2, "ed": _2, "edu": _2, "gov": _2, "gv": _2, "it": _2, "og": _2, "org": _2, "pb": _2 }], "aq": _2, "ar": [1, { "bet": _2, "com": _2, "coop": _2, "edu": _2, "gob": _2, "gov": _2, "int": _2, "mil": _2, "musica": _2, "mutual": _2, "net": _2, "org": _2, "seg": _2, "senasa": _2, "tur": _2 }], "arpa": [1, { "e164": _2, "home": _2, "in-addr": _2, "ip6": _2, "iris": _2, "uri": _2, "urn": _2 }], "as": _10, "asia": [1, { "cloudns": _3, "daemon": _3, "dix": _3 }], "at": [1, { "4": _3, "ac": [1, { "sth": _2 }], "co": _2, "gv": _2, "or": _2, "funkfeuer": [0, { "wien": _3 }], "futurecms": [0, { "*": _3, "ex": _6, "in": _6 }], "futurehosting": _3, "futuremailing": _3, "ortsinfo": [0, { "ex": _6, "kunden": _6 }], "biz": _3, "info": _3, "123webseite": _3, "priv": _3, "my": _3, "myspreadshop": _3, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3 }], "au": [1, { "asn": _2, "com": [1, { "cloudlets": [0, { "mel": _3 }], "myspreadshop": _3 }], "edu": [1, { "act": _2, "catholic": _2, "nsw": _2, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 }], "gov": [1, { "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 }], "id": _2, "net": _2, "org": _2, "conf": _2, "oz": _2, "act": _2, "nsw": _2, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2, "hrsn": _11 }], "aw": [1, { "com": _2 }], "ax": _2, "az": [1, { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pp": _2, "pro": _2 }], "ba": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "brendly": _19, "rs": _3 }], "bb": [1, { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "store": _2, "tv": _2 }], "bd": _20, "be": [1, { "ac": _2, "cloudns": _3, "webhosting": _3, "interhostsolutions": [0, { "cloud": _3 }], "kuleuven": [0, { "ezproxy": _3 }], "123website": _3, "myspreadshop": _3, "transurl": _6 }], "bf": _10, "bg": [1, { "0": _2, "1": _2, "2": _2, "3": _2, "4": _2, "5": _2, "6": _2, "7": _2, "8": _2, "9": _2, "a": _2, "b": _2, "c": _2, "d": _2, "e": _2, "f": _2, "g": _2, "h": _2, "i": _2, "j": _2, "k": _2, "l": _2, "m": _2, "n": _2, "o": _2, "p": _2, "q": _2, "r": _2, "s": _2, "t": _2, "u": _2, "v": _2, "w": _2, "x": _2, "y": _2, "z": _2, "barsy": _3 }], "bh": _4, "bi": [1, { "co": _2, "com": _2, "edu": _2, "or": _2, "org": _2 }], "biz": [1, { "activetrail": _3, "cloud-ip": _3, "cloudns": _3, "jozi": _3, "dyndns": _3, "for-better": _3, "for-more": _3, "for-some": _3, "for-the": _3, "selfip": _3, "webhop": _3, "orx": _3, "mmafan": _3, "myftp": _3, "no-ip": _3, "dscloud": _3 }], "bj": [1, { "africa": _2, "agro": _2, "architectes": _2, "assur": _2, "avocats": _2, "co": _2, "com": _2, "eco": _2, "econo": _2, "edu": _2, "info": _2, "loisirs": _2, "money": _2, "net": _2, "org": _2, "ote": _2, "restaurant": _2, "resto": _2, "tourism": _2, "univ": _2 }], "bm": _4, "bn": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "co": _3 }], "bo": [1, { "com": _2, "edu": _2, "gob": _2, "int": _2, "mil": _2, "net": _2, "org": _2, "tv": _2, "web": _2, "academia": _2, "agro": _2, "arte": _2, "blog": _2, "bolivia": _2, "ciencia": _2, "cooperativa": _2, "democracia": _2, "deporte": _2, "ecologia": _2, "economia": _2, "empresa": _2, "indigena": _2, "industria": _2, "info": _2, "medicina": _2, "movimiento": _2, "musica": _2, "natural": _2, "nombre": _2, "noticias": _2, "patria": _2, "plurinacional": _2, "politica": _2, "profesional": _2, "pueblo": _2, "revista": _2, "salud": _2, "tecnologia": _2, "tksat": _2, "transporte": _2, "wiki": _2 }], "br": [1, { "9guacu": _2, "abc": _2, "adm": _2, "adv": _2, "agr": _2, "aju": _2, "am": _2, "anani": _2, "aparecida": _2, "api": _2, "app": _2, "arq": _2, "art": _2, "ato": _2, "b": _2, "barueri": _2, "belem": _2, "bet": _2, "bhz": _2, "bib": _2, "bio": _2, "blog": _2, "bmd": _2, "boavista": _2, "bsb": _2, "campinagrande": _2, "campinas": _2, "caxias": _2, "cim": _2, "cng": _2, "cnt": _2, "com": [1, { "simplesite": _3 }], "contagem": _2, "coop": _2, "coz": _2, "cri": _2, "cuiaba": _2, "curitiba": _2, "def": _2, "des": _2, "det": _2, "dev": _2, "ecn": _2, "eco": _2, "edu": _2, "emp": _2, "enf": _2, "eng": _2, "esp": _2, "etc": _2, "eti": _2, "far": _2, "feira": _2, "flog": _2, "floripa": _2, "fm": _2, "fnd": _2, "fortal": _2, "fot": _2, "foz": _2, "fst": _2, "g12": _2, "geo": _2, "ggf": _2, "goiania": _2, "gov": [1, { "ac": _2, "al": _2, "am": _2, "ap": _2, "ba": _2, "ce": _2, "df": _2, "es": _2, "go": _2, "ma": _2, "mg": _2, "ms": _2, "mt": _2, "pa": _2, "pb": _2, "pe": _2, "pi": _2, "pr": _2, "rj": _2, "rn": _2, "ro": _2, "rr": _2, "rs": _2, "sc": _2, "se": _2, "sp": _2, "to": _2 }], "gru": _2, "ia": _2, "imb": _2, "ind": _2, "inf": _2, "jab": _2, "jampa": _2, "jdf": _2, "joinville": _2, "jor": _2, "jus": _2, "leg": [1, { "ac": _3, "al": _3, "am": _3, "ap": _3, "ba": _3, "ce": _3, "df": _3, "es": _3, "go": _3, "ma": _3, "mg": _3, "ms": _3, "mt": _3, "pa": _3, "pb": _3, "pe": _3, "pi": _3, "pr": _3, "rj": _3, "rn": _3, "ro": _3, "rr": _3, "rs": _3, "sc": _3, "se": _3, "sp": _3, "to": _3 }], "leilao": _2, "lel": _2, "log": _2, "londrina": _2, "macapa": _2, "maceio": _2, "manaus": _2, "maringa": _2, "mat": _2, "med": _2, "mil": _2, "morena": _2, "mp": _2, "mus": _2, "natal": _2, "net": _2, "niteroi": _2, "nom": _20, "not": _2, "ntr": _2, "odo": _2, "ong": _2, "org": _2, "osasco": _2, "palmas": _2, "poa": _2, "ppg": _2, "pro": _2, "psc": _2, "psi": _2, "pvh": _2, "qsl": _2, "radio": _2, "rec": _2, "recife": _2, "rep": _2, "ribeirao": _2, "rio": _2, "riobranco": _2, "riopreto": _2, "salvador": _2, "sampa": _2, "santamaria": _2, "santoandre": _2, "saobernardo": _2, "saogonca": _2, "seg": _2, "sjc": _2, "slg": _2, "slz": _2, "social": _2, "sorocaba": _2, "srv": _2, "taxi": _2, "tc": _2, "tec": _2, "teo": _2, "the": _2, "tmp": _2, "trd": _2, "tur": _2, "tv": _2, "udi": _2, "vet": _2, "vix": _2, "vlog": _2, "wiki": _2, "xyz": _2, "zlg": _2, "tche": _3 }], "bs": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "we": _3 }], "bt": _4, "bv": _2, "bw": [1, { "ac": _2, "co": _2, "gov": _2, "net": _2, "org": _2 }], "by": [1, { "gov": _2, "mil": _2, "com": _2, "of": _2, "mediatech": _3 }], "bz": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "za": _3, "mydns": _3, "gsj": _3 }], "ca": [1, { "ab": _2, "bc": _2, "mb": _2, "nb": _2, "nf": _2, "nl": _2, "ns": _2, "nt": _2, "nu": _2, "on": _2, "pe": _2, "qc": _2, "sk": _2, "yk": _2, "gc": _2, "barsy": _3, "awdev": _6, "co": _3, "no-ip": _3, "onid": _3, "myspreadshop": _3, "box": _3 }], "cat": _2, "cc": [1, { "cleverapps": _3, "cloud-ip": _3, "cloudns": _3, "ftpaccess": _3, "game-server": _3, "myphotos": _3, "scrapping": _3, "twmail": _3, "csx": _3, "fantasyleague": _3, "spawn": [0, { "instances": _3 }] }], "cd": _10, "cf": _2, "cg": _2, "ch": [1, { "square7": _3, "cloudns": _3, "cloudscale": [0, { "cust": _3, "lpg": _22, "rma": _22 }], "objectstorage": [0, { "lpg": _3, "rma": _3 }], "flow": [0, { "ae": [0, { "alp1": _3 }], "appengine": _3 }], "linkyard-cloud": _3, "gotdns": _3, "dnsking": _3, "123website": _3, "myspreadshop": _3, "firenet": [0, { "*": _3, "svc": _6 }], "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3 }], "ci": [1, { "ac": _2, "xn--aroport-bya": _2, "a\xE9roport": _2, "asso": _2, "co": _2, "com": _2, "ed": _2, "edu": _2, "go": _2, "gouv": _2, "int": _2, "net": _2, "or": _2, "org": _2 }], "ck": _20, "cl": [1, { "co": _2, "gob": _2, "gov": _2, "mil": _2, "cloudns": _3 }], "cm": [1, { "co": _2, "com": _2, "gov": _2, "net": _2 }], "cn": [1, { "ac": _2, "com": [1, { "amazonaws": [0, { "cn-north-1": [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-deprecated": _3, "s3-object-lambda": _3, "s3-website": _3 }], "cn-northwest-1": [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _26, "s3": _3, "s3-accesspoint": _3, "s3-object-lambda": _3, "s3-website": _3 }], "compute": _6, "airflow": [0, { "cn-north-1": _6, "cn-northwest-1": _6 }], "eb": [0, { "cn-north-1": _3, "cn-northwest-1": _3 }], "elb": _6 }], "amazonwebservices": [0, { "on": [0, { "cn-north-1": _12, "cn-northwest-1": _12 }] }], "sagemaker": [0, { "cn-north-1": _14, "cn-northwest-1": _14 }] }], "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "xn--55qx5d": _2, "\u516C\u53F8": _2, "xn--od0alg": _2, "\u7DB2\u7D61": _2, "xn--io0a7i": _2, "\u7F51\u7EDC": _2, "ah": _2, "bj": _2, "cq": _2, "fj": _2, "gd": _2, "gs": _2, "gx": _2, "gz": _2, "ha": _2, "hb": _2, "he": _2, "hi": _2, "hk": _2, "hl": _2, "hn": _2, "jl": _2, "js": _2, "jx": _2, "ln": _2, "mo": _2, "nm": _2, "nx": _2, "qh": _2, "sc": _2, "sd": _2, "sh": [1, { "as": _3 }], "sn": _2, "sx": _2, "tj": _2, "tw": _2, "xj": _2, "xz": _2, "yn": _2, "zj": _2, "canva-apps": _3, "canvasite": _24, "myqnapcloud": _3, "quickconnect": _27 }], "co": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "carrd": _3, "crd": _3, "otap": _6, "hidns": _3, "leadpages": _3, "lpages": _3, "mypi": _3, "xmit": _6, "firewalledreplit": _9, "repl": _9, "supabase": [2, { "realtime": _3, "storage": _3 }] }], "com": [1, { "a2hosted": _3, "cpserver": _3, "adobeaemcloud": [2, { "dev": _6 }], "africa": _3, "aivencloud": _3, "alibabacloudcs": _3, "kasserver": _3, "amazonaws": [0, { "af-south-1": _30, "ap-east-1": _31, "ap-northeast-1": _32, "ap-northeast-2": _32, "ap-northeast-3": _30, "ap-south-1": _32, "ap-south-2": _33, "ap-southeast-1": _32, "ap-southeast-2": _32, "ap-southeast-3": _33, "ap-southeast-4": _33, "ap-southeast-5": [0, { "execute-api": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-deprecated": _3, "s3-object-lambda": _3, "s3-website": _3 }], "ca-central-1": _35, "ca-west-1": [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _34, "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-fips": _3, "s3-object-lambda": _3, "s3-website": _3 }], "eu-central-1": _32, "eu-central-2": _33, "eu-north-1": _31, "eu-south-1": _30, "eu-south-2": _33, "eu-west-1": [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-deprecated": _3, "s3-object-lambda": _3, "s3-website": _3, "analytics-gateway": _3, "aws-cloud9": _28, "cloud9": _29 }], "eu-west-2": _31, "eu-west-3": _30, "il-central-1": [0, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _25, "s3": _3, "s3-accesspoint": _3, "s3-object-lambda": _3, "s3-website": _3, "aws-cloud9": _28, "cloud9": [0, { "vfs": _3 }] }], "me-central-1": _33, "me-south-1": _31, "sa-east-1": _30, "us-east-1": [2, { "execute-api": _3, "emrappui-prod": _3, "emrnotebooks-prod": _3, "emrstudio-prod": _3, "dualstack": _34, "s3": _3, "s3-accesspoint": _3, "s3-accesspoint-fips": _3, "s3-deprecated": _3, "s3-fips": _3, "s3-object-lambda": _3, "s3-website": _3, "analytics-gateway": _3, "aws-cloud9": _28, "cloud9": _29 }], "us-east-2": _36, "us-gov-east-1": _38, "us-gov-west-1": _38, "us-west-1": _35, "us-west-2": _36, "compute": _6, "compute-1": _6, "airflow": [0, { "af-south-1": _6, "ap-east-1": _6, "ap-northeast-1": _6, "ap-northeast-2": _6, "ap-northeast-3": _6, "ap-south-1": _6, "ap-south-2": _6, "ap-southeast-1": _6, "ap-southeast-2": _6, "ap-southeast-3": _6, "ap-southeast-4": _6, "ap-southeast-5": _6, "ca-central-1": _6, "ca-west-1": _6, "eu-central-1": _6, "eu-central-2": _6, "eu-north-1": _6, "eu-south-1": _6, "eu-south-2": _6, "eu-west-1": _6, "eu-west-2": _6, "eu-west-3": _6, "il-central-1": _6, "me-central-1": _6, "me-south-1": _6, "sa-east-1": _6, "us-east-1": _6, "us-east-2": _6, "us-west-1": _6, "us-west-2": _6 }], "s3": _3, "s3-1": _3, "s3-ap-east-1": _3, "s3-ap-northeast-1": _3, "s3-ap-northeast-2": _3, "s3-ap-northeast-3": _3, "s3-ap-south-1": _3, "s3-ap-southeast-1": _3, "s3-ap-southeast-2": _3, "s3-ca-central-1": _3, "s3-eu-central-1": _3, "s3-eu-north-1": _3, "s3-eu-west-1": _3, "s3-eu-west-2": _3, "s3-eu-west-3": _3, "s3-external-1": _3, "s3-fips-us-gov-east-1": _3, "s3-fips-us-gov-west-1": _3, "s3-global": [0, { "accesspoint": [0, { "mrap": _3 }] }], "s3-me-south-1": _3, "s3-sa-east-1": _3, "s3-us-east-2": _3, "s3-us-gov-east-1": _3, "s3-us-gov-west-1": _3, "s3-us-west-1": _3, "s3-us-west-2": _3, "s3-website-ap-northeast-1": _3, "s3-website-ap-southeast-1": _3, "s3-website-ap-southeast-2": _3, "s3-website-eu-west-1": _3, "s3-website-sa-east-1": _3, "s3-website-us-east-1": _3, "s3-website-us-gov-west-1": _3, "s3-website-us-west-1": _3, "s3-website-us-west-2": _3, "elb": _6 }], "amazoncognito": [0, { "af-south-1": _39, "ap-east-1": _39, "ap-northeast-1": _39, "ap-northeast-2": _39, "ap-northeast-3": _39, "ap-south-1": _39, "ap-south-2": _39, "ap-southeast-1": _39, "ap-southeast-2": _39, "ap-southeast-3": _39, "ap-southeast-4": _39, "ap-southeast-5": _39, "ap-southeast-7": _39, "ca-central-1": _39, "ca-west-1": _39, "eu-central-1": _39, "eu-central-2": _39, "eu-north-1": _39, "eu-south-1": _39, "eu-south-2": _39, "eu-west-1": _39, "eu-west-2": _39, "eu-west-3": _39, "il-central-1": _39, "me-central-1": _39, "me-south-1": _39, "mx-central-1": _39, "sa-east-1": _39, "us-east-1": _40, "us-east-2": _40, "us-gov-east-1": _41, "us-gov-west-1": _41, "us-west-1": _40, "us-west-2": _40 }], "amplifyapp": _3, "awsapprunner": _6, "awsapps": _3, "elasticbeanstalk": [2, { "af-south-1": _3, "ap-east-1": _3, "ap-northeast-1": _3, "ap-northeast-2": _3, "ap-northeast-3": _3, "ap-south-1": _3, "ap-southeast-1": _3, "ap-southeast-2": _3, "ap-southeast-3": _3, "ca-central-1": _3, "eu-central-1": _3, "eu-north-1": _3, "eu-south-1": _3, "eu-west-1": _3, "eu-west-2": _3, "eu-west-3": _3, "il-central-1": _3, "me-south-1": _3, "sa-east-1": _3, "us-east-1": _3, "us-east-2": _3, "us-gov-east-1": _3, "us-gov-west-1": _3, "us-west-1": _3, "us-west-2": _3 }], "awsglobalaccelerator": _3, "siiites": _3, "appspacehosted": _3, "appspaceusercontent": _3, "on-aptible": _3, "myasustor": _3, "balena-devices": _3, "boutir": _3, "bplaced": _3, "cafjs": _3, "canva-apps": _3, "rice-labs": _3, "cdn77-storage": _3, "br": _3, "cn": _3, "de": _3, "eu": _3, "jpn": _3, "mex": _3, "ru": _3, "sa": _3, "uk": _3, "us": _3, "za": _3, "clever-cloud": [0, { "services": _6 }], "abrdns": _3, "dnsabr": _3, "ip-ddns": _3, "jdevcloud": _3, "wpdevcloud": _3, "cf-ipfs": _3, "cloudflare-ipfs": _3, "trycloudflare": _3, "co": _3, "devinapps": _6, "builtwithdark": _3, "datadetect": [0, { "demo": _3, "instance": _3 }], "dattolocal": _3, "dattorelay": _3, "dattoweb": _3, "mydatto": _3, "digitaloceanspaces": _6, "discordsays": _3, "discordsez": _3, "drayddns": _3, "dreamhosters": _3, "durumis": _3, "blogdns": _3, "cechire": _3, "dnsalias": _3, "dnsdojo": _3, "doesntexist": _3, "dontexist": _3, "doomdns": _3, "dyn-o-saur": _3, "dynalias": _3, "dyndns-at-home": _3, "dyndns-at-work": _3, "dyndns-blog": _3, "dyndns-free": _3, "dyndns-home": _3, "dyndns-ip": _3, "dyndns-mail": _3, "dyndns-office": _3, "dyndns-pics": _3, "dyndns-remote": _3, "dyndns-server": _3, "dyndns-web": _3, "dyndns-wiki": _3, "dyndns-work": _3, "est-a-la-maison": _3, "est-a-la-masion": _3, "est-le-patron": _3, "est-mon-blogueur": _3, "from-ak": _3, "from-al": _3, "from-ar": _3, "from-ca": _3, "from-ct": _3, "from-dc": _3, "from-de": _3, "from-fl": _3, "from-ga": _3, "from-hi": _3, "from-ia": _3, "from-id": _3, "from-il": _3, "from-in": _3, "from-ks": _3, "from-ky": _3, "from-ma": _3, "from-md": _3, "from-mi": _3, "from-mn": _3, "from-mo": _3, "from-ms": _3, "from-mt": _3, "from-nc": _3, "from-nd": _3, "from-ne": _3, "from-nh": _3, "from-nj": _3, "from-nm": _3, "from-nv": _3, "from-oh": _3, "from-ok": _3, "from-or": _3, "from-pa": _3, "from-pr": _3, "from-ri": _3, "from-sc": _3, "from-sd": _3, "from-tn": _3, "from-tx": _3, "from-ut": _3, "from-va": _3, "from-vt": _3, "from-wa": _3, "from-wi": _3, "from-wv": _3, "from-wy": _3, "getmyip": _3, "gotdns": _3, "hobby-site": _3, "homelinux": _3, "homeunix": _3, "iamallama": _3, "is-a-anarchist": _3, "is-a-blogger": _3, "is-a-bookkeeper": _3, "is-a-bulls-fan": _3, "is-a-caterer": _3, "is-a-chef": _3, "is-a-conservative": _3, "is-a-cpa": _3, "is-a-cubicle-slave": _3, "is-a-democrat": _3, "is-a-designer": _3, "is-a-doctor": _3, "is-a-financialadvisor": _3, "is-a-geek": _3, "is-a-green": _3, "is-a-guru": _3, "is-a-hard-worker": _3, "is-a-hunter": _3, "is-a-landscaper": _3, "is-a-lawyer": _3, "is-a-liberal": _3, "is-a-libertarian": _3, "is-a-llama": _3, "is-a-musician": _3, "is-a-nascarfan": _3, "is-a-nurse": _3, "is-a-painter": _3, "is-a-personaltrainer": _3, "is-a-photographer": _3, "is-a-player": _3, "is-a-republican": _3, "is-a-rockstar": _3, "is-a-socialist": _3, "is-a-student": _3, "is-a-teacher": _3, "is-a-techie": _3, "is-a-therapist": _3, "is-an-accountant": _3, "is-an-actor": _3, "is-an-actress": _3, "is-an-anarchist": _3, "is-an-artist": _3, "is-an-engineer": _3, "is-an-entertainer": _3, "is-certified": _3, "is-gone": _3, "is-into-anime": _3, "is-into-cars": _3, "is-into-cartoons": _3, "is-into-games": _3, "is-leet": _3, "is-not-certified": _3, "is-slick": _3, "is-uberleet": _3, "is-with-theband": _3, "isa-geek": _3, "isa-hockeynut": _3, "issmarterthanyou": _3, "likes-pie": _3, "likescandy": _3, "neat-url": _3, "saves-the-whales": _3, "selfip": _3, "sells-for-less": _3, "sells-for-u": _3, "servebbs": _3, "simple-url": _3, "space-to-rent": _3, "teaches-yoga": _3, "writesthisblog": _3, "ddnsfree": _3, "ddnsgeek": _3, "giize": _3, "gleeze": _3, "kozow": _3, "loseyourip": _3, "ooguy": _3, "theworkpc": _3, "mytuleap": _3, "tuleap-partners": _3, "encoreapi": _3, "evennode": [0, { "eu-1": _3, "eu-2": _3, "eu-3": _3, "eu-4": _3, "us-1": _3, "us-2": _3, "us-3": _3, "us-4": _3 }], "onfabrica": _3, "fastly-edge": _3, "fastly-terrarium": _3, "fastvps-server": _3, "mydobiss": _3, "firebaseapp": _3, "fldrv": _3, "forgeblocks": _3, "framercanvas": _3, "freebox-os": _3, "freeboxos": _3, "freemyip": _3, "aliases121": _3, "gentapps": _3, "gentlentapis": _3, "githubusercontent": _3, "0emm": _6, "appspot": [2, { "r": _6 }], "blogspot": _3, "codespot": _3, "googleapis": _3, "googlecode": _3, "pagespeedmobilizer": _3, "withgoogle": _3, "withyoutube": _3, "grayjayleagues": _3, "hatenablog": _3, "hatenadiary": _3, "herokuapp": _3, "gr": _3, "smushcdn": _3, "wphostedmail": _3, "wpmucdn": _3, "pixolino": _3, "apps-1and1": _3, "live-website": _3, "webspace-host": _3, "dopaas": _3, "hosted-by-previder": _43, "hosteur": [0, { "rag-cloud": _3, "rag-cloud-ch": _3 }], "ik-server": [0, { "jcloud": _3, "jcloud-ver-jpc": _3 }], "jelastic": [0, { "demo": _3 }], "massivegrid": _43, "wafaicloud": [0, { "jed": _3, "ryd": _3 }], "jote-dr-lt1": _3, "jote-rd-lt1": _3, "webadorsite": _3, "joyent": [0, { "cns": _6 }], "on-forge": _3, "on-vapor": _3, "lpusercontent": _3, "linode": [0, { "members": _3, "nodebalancer": _6 }], "linodeobjects": _6, "linodeusercontent": [0, { "ip": _3 }], "localtonet": _3, "lovableproject": _3, "barsycenter": _3, "barsyonline": _3, "lutrausercontent": _6, "modelscape": _3, "mwcloudnonprod": _3, "polyspace": _3, "mazeplay": _3, "miniserver": _3, "atmeta": _3, "fbsbx": _42, "meteorapp": _44, "routingthecloud": _3, "same-app": _3, "same-preview": _3, "mydbserver": _3, "hostedpi": _3, "mythic-beasts": [0, { "caracal": _3, "customer": _3, "fentiger": _3, "lynx": _3, "ocelot": _3, "oncilla": _3, "onza": _3, "sphinx": _3, "vs": _3, "x": _3, "yali": _3 }], "nospamproxy": [0, { "cloud": [2, { "o365": _3 }] }], "4u": _3, "nfshost": _3, "3utilities": _3, "blogsyte": _3, "ciscofreak": _3, "damnserver": _3, "ddnsking": _3, "ditchyourip": _3, "dnsiskinky": _3, "dynns": _3, "geekgalaxy": _3, "health-carereform": _3, "homesecuritymac": _3, "homesecuritypc": _3, "myactivedirectory": _3, "mysecuritycamera": _3, "myvnc": _3, "net-freaks": _3, "onthewifi": _3, "point2this": _3, "quicksytes": _3, "securitytactics": _3, "servebeer": _3, "servecounterstrike": _3, "serveexchange": _3, "serveftp": _3, "servegame": _3, "servehalflife": _3, "servehttp": _3, "servehumour": _3, "serveirc": _3, "servemp3": _3, "servep2p": _3, "servepics": _3, "servequake": _3, "servesarcasm": _3, "stufftoread": _3, "unusualperson": _3, "workisboring": _3, "myiphost": _3, "observableusercontent": [0, { "static": _3 }], "simplesite": _3, "oaiusercontent": _6, "orsites": _3, "operaunite": _3, "customer-oci": [0, { "*": _3, "oci": _6, "ocp": _6, "ocs": _6 }], "oraclecloudapps": _6, "oraclegovcloudapps": _6, "authgear-staging": _3, "authgearapps": _3, "skygearapp": _3, "outsystemscloud": _3, "ownprovider": _3, "pgfog": _3, "pagexl": _3, "gotpantheon": _3, "paywhirl": _6, "upsunapp": _3, "postman-echo": _3, "prgmr": [0, { "xen": _3 }], "project-study": [0, { "dev": _3 }], "pythonanywhere": _44, "qa2": _3, "alpha-myqnapcloud": _3, "dev-myqnapcloud": _3, "mycloudnas": _3, "mynascloud": _3, "myqnapcloud": _3, "qualifioapp": _3, "ladesk": _3, "qualyhqpartner": _6, "qualyhqportal": _6, "qbuser": _3, "quipelements": _6, "rackmaze": _3, "readthedocs-hosted": _3, "rhcloud": _3, "onrender": _3, "render": _45, "subsc-pay": _3, "180r": _3, "dojin": _3, "sakuratan": _3, "sakuraweb": _3, "x0": _3, "code": [0, { "builder": _6, "dev-builder": _6, "stg-builder": _6 }], "salesforce": [0, { "platform": [0, { "code-builder-stg": [0, { "test": [0, { "001": _6 }] }] }] }], "logoip": _3, "scrysec": _3, "firewall-gateway": _3, "myshopblocks": _3, "myshopify": _3, "shopitsite": _3, "1kapp": _3, "appchizi": _3, "applinzi": _3, "sinaapp": _3, "vipsinaapp": _3, "streamlitapp": _3, "try-snowplow": _3, "playstation-cloud": _3, "myspreadshop": _3, "w-corp-staticblitz": _3, "w-credentialless-staticblitz": _3, "w-staticblitz": _3, "stackhero-network": _3, "stdlib": [0, { "api": _3 }], "strapiapp": [2, { "media": _3 }], "streak-link": _3, "streaklinks": _3, "streakusercontent": _3, "temp-dns": _3, "dsmynas": _3, "familyds": _3, "mytabit": _3, "taveusercontent": _3, "tb-hosting": _46, "reservd": _3, "thingdustdata": _3, "townnews-staging": _3, "typeform": [0, { "pro": _3 }], "hk": _3, "it": _3, "deus-canvas": _3, "vultrobjects": _6, "wafflecell": _3, "hotelwithflight": _3, "reserve-online": _3, "cprapid": _3, "pleskns": _3, "remotewd": _3, "wiardweb": [0, { "pages": _3 }], "wixsite": _3, "wixstudio": _3, "messwithdns": _3, "woltlab-demo": _3, "wpenginepowered": [2, { "js": _3 }], "xnbay": [2, { "u2": _3, "u2-local": _3 }], "yolasite": _3 }], "coop": _2, "cr": [1, { "ac": _2, "co": _2, "ed": _2, "fi": _2, "go": _2, "or": _2, "sa": _2 }], "cu": [1, { "com": _2, "edu": _2, "gob": _2, "inf": _2, "nat": _2, "net": _2, "org": _2 }], "cv": [1, { "com": _2, "edu": _2, "id": _2, "int": _2, "net": _2, "nome": _2, "org": _2, "publ": _2 }], "cw": _47, "cx": [1, { "gov": _2, "cloudns": _3, "ath": _3, "info": _3, "assessments": _3, "calculators": _3, "funnels": _3, "paynow": _3, "quizzes": _3, "researched": _3, "tests": _3 }], "cy": [1, { "ac": _2, "biz": _2, "com": [1, { "scaleforce": _48 }], "ekloges": _2, "gov": _2, "ltd": _2, "mil": _2, "net": _2, "org": _2, "press": _2, "pro": _2, "tm": _2 }], "cz": [1, { "gov": _2, "contentproxy9": [0, { "rsc": _3 }], "realm": _3, "e4": _3, "co": _3, "metacentrum": [0, { "cloud": _6, "custom": _3 }], "muni": [0, { "cloud": [0, { "flt": _3, "usr": _3 }] }] }], "de": [1, { "bplaced": _3, "square7": _3, "com": _3, "cosidns": _49, "dnsupdater": _3, "dynamisches-dns": _3, "internet-dns": _3, "l-o-g-i-n": _3, "ddnss": [2, { "dyn": _3, "dyndns": _3 }], "dyn-ip24": _3, "dyndns1": _3, "home-webserver": [2, { "dyn": _3 }], "myhome-server": _3, "dnshome": _3, "fuettertdasnetz": _3, "isteingeek": _3, "istmein": _3, "lebtimnetz": _3, "leitungsen": _3, "traeumtgerade": _3, "frusky": _6, "goip": _3, "xn--gnstigbestellen-zvb": _3, "g\xFCnstigbestellen": _3, "xn--gnstigliefern-wob": _3, "g\xFCnstigliefern": _3, "hs-heilbronn": [0, { "it": [0, { "pages": _3, "pages-research": _3 }] }], "dyn-berlin": _3, "in-berlin": _3, "in-brb": _3, "in-butter": _3, "in-dsl": _3, "in-vpn": _3, "iservschule": _3, "mein-iserv": _3, "schuldock": _3, "schulplattform": _3, "schulserver": _3, "test-iserv": _3, "keymachine": _3, "co": _3, "git-repos": _3, "lcube-server": _3, "svn-repos": _3, "barsy": _3, "webspaceconfig": _3, "123webseite": _3, "rub": _3, "ruhr-uni-bochum": [2, { "noc": [0, { "io": _3 }] }], "logoip": _3, "firewall-gateway": _3, "my-gateway": _3, "my-router": _3, "spdns": _3, "my": _3, "speedpartner": [0, { "customer": _3 }], "myspreadshop": _3, "taifun-dns": _3, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3, "dd-dns": _3, "dray-dns": _3, "draydns": _3, "dyn-vpn": _3, "dynvpn": _3, "mein-vigor": _3, "my-vigor": _3, "my-wan": _3, "syno-ds": _3, "synology-diskstation": _3, "synology-ds": _3, "virtual-user": _3, "virtualuser": _3, "community-pro": _3, "diskussionsbereich": _3, "xenonconnect": _6 }], "dj": _2, "dk": [1, { "biz": _3, "co": _3, "firm": _3, "reg": _3, "store": _3, "123hjemmeside": _3, "myspreadshop": _3 }], "dm": _51, "do": [1, { "art": _2, "com": _2, "edu": _2, "gob": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "sld": _2, "web": _2 }], "dz": [1, { "art": _2, "asso": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "pol": _2, "soc": _2, "tm": _2 }], "ec": [1, { "abg": _2, "adm": _2, "agron": _2, "arqt": _2, "art": _2, "bar": _2, "chef": _2, "com": _2, "cont": _2, "cpa": _2, "cue": _2, "dent": _2, "dgn": _2, "disco": _2, "doc": _2, "edu": _2, "eng": _2, "esm": _2, "fin": _2, "fot": _2, "gal": _2, "gob": _2, "gov": _2, "gye": _2, "ibr": _2, "info": _2, "k12": _2, "lat": _2, "loj": _2, "med": _2, "mil": _2, "mktg": _2, "mon": _2, "net": _2, "ntr": _2, "odont": _2, "org": _2, "pro": _2, "prof": _2, "psic": _2, "psiq": _2, "pub": _2, "rio": _2, "rrpp": _2, "sal": _2, "tech": _2, "tul": _2, "tur": _2, "uio": _2, "vet": _2, "xxx": _2, "base": _3, "official": _3 }], "edu": [1, { "rit": [0, { "git-pages": _3 }] }], "ee": [1, { "aip": _2, "com": _2, "edu": _2, "fie": _2, "gov": _2, "lib": _2, "med": _2, "org": _2, "pri": _2, "riik": _2 }], "eg": [1, { "ac": _2, "com": _2, "edu": _2, "eun": _2, "gov": _2, "info": _2, "me": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sci": _2, "sport": _2, "tv": _2 }], "er": _20, "es": [1, { "com": _2, "edu": _2, "gob": _2, "nom": _2, "org": _2, "123miweb": _3, "myspreadshop": _3 }], "et": [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "name": _2, "net": _2, "org": _2 }], "eu": [1, { "cloudns": _3, "dogado": [0, { "jelastic": _3 }], "barsy": _3, "spdns": _3, "nxa": _6, "transurl": _6, "diskstation": _3 }], "fi": [1, { "aland": _2, "dy": _3, "xn--hkkinen-5wa": _3, "h\xE4kkinen": _3, "iki": _3, "cloudplatform": [0, { "fi": _3 }], "datacenter": [0, { "demo": _3, "paas": _3 }], "kapsi": _3, "123kotisivu": _3, "myspreadshop": _3 }], "fj": [1, { "ac": _2, "biz": _2, "com": _2, "gov": _2, "info": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pro": _2 }], "fk": _20, "fm": [1, { "com": _2, "edu": _2, "net": _2, "org": _2, "radio": _3, "user": _6 }], "fo": _2, "fr": [1, { "asso": _2, "com": _2, "gouv": _2, "nom": _2, "prd": _2, "tm": _2, "avoues": _2, "cci": _2, "greta": _2, "huissier-justice": _2, "en-root": _3, "fbx-os": _3, "fbxos": _3, "freebox-os": _3, "freeboxos": _3, "goupile": _3, "123siteweb": _3, "on-web": _3, "chirurgiens-dentistes-en-france": _3, "dedibox": _3, "aeroport": _3, "avocat": _3, "chambagri": _3, "chirurgiens-dentistes": _3, "experts-comptables": _3, "medecin": _3, "notaires": _3, "pharmacien": _3, "port": _3, "veterinaire": _3, "myspreadshop": _3, "ynh": _3 }], "ga": _2, "gb": _2, "gd": [1, { "edu": _2, "gov": _2 }], "ge": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "pvt": _2, "school": _2 }], "gf": _2, "gg": [1, { "co": _2, "net": _2, "org": _2, "botdash": _3, "kaas": _3, "stackit": _3, "panel": [2, { "daemon": _3 }] }], "gh": [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "gi": [1, { "com": _2, "edu": _2, "gov": _2, "ltd": _2, "mod": _2, "org": _2 }], "gl": [1, { "co": _2, "com": _2, "edu": _2, "net": _2, "org": _2 }], "gm": _2, "gn": [1, { "ac": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2 }], "gov": _2, "gp": [1, { "asso": _2, "com": _2, "edu": _2, "mobi": _2, "net": _2, "org": _2 }], "gq": _2, "gr": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "barsy": _3, "simplesite": _3 }], "gs": _2, "gt": [1, { "com": _2, "edu": _2, "gob": _2, "ind": _2, "mil": _2, "net": _2, "org": _2 }], "gu": [1, { "com": _2, "edu": _2, "gov": _2, "guam": _2, "info": _2, "net": _2, "org": _2, "web": _2 }], "gw": [1, { "nx": _3 }], "gy": _51, "hk": [1, { "com": _2, "edu": _2, "gov": _2, "idv": _2, "net": _2, "org": _2, "xn--ciqpn": _2, "\u4E2A\u4EBA": _2, "xn--gmqw5a": _2, "\u500B\u4EBA": _2, "xn--55qx5d": _2, "\u516C\u53F8": _2, "xn--mxtq1m": _2, "\u653F\u5E9C": _2, "xn--lcvr32d": _2, "\u654E\u80B2": _2, "xn--wcvs22d": _2, "\u6559\u80B2": _2, "xn--gmq050i": _2, "\u7B87\u4EBA": _2, "xn--uc0atv": _2, "\u7D44\u7E54": _2, "xn--uc0ay4a": _2, "\u7D44\u7EC7": _2, "xn--od0alg": _2, "\u7DB2\u7D61": _2, "xn--zf0avx": _2, "\u7DB2\u7EDC": _2, "xn--mk0axi": _2, "\u7EC4\u7E54": _2, "xn--tn0ag": _2, "\u7EC4\u7EC7": _2, "xn--od0aq3b": _2, "\u7F51\u7D61": _2, "xn--io0a7i": _2, "\u7F51\u7EDC": _2, "inc": _3, "ltd": _3 }], "hm": _2, "hn": [1, { "com": _2, "edu": _2, "gob": _2, "mil": _2, "net": _2, "org": _2 }], "hr": [1, { "com": _2, "from": _2, "iz": _2, "name": _2, "brendly": _19 }], "ht": [1, { "adult": _2, "art": _2, "asso": _2, "com": _2, "coop": _2, "edu": _2, "firm": _2, "gouv": _2, "info": _2, "med": _2, "net": _2, "org": _2, "perso": _2, "pol": _2, "pro": _2, "rel": _2, "shop": _2, "rt": _3 }], "hu": [1, { "2000": _2, "agrar": _2, "bolt": _2, "casino": _2, "city": _2, "co": _2, "erotica": _2, "erotika": _2, "film": _2, "forum": _2, "games": _2, "hotel": _2, "info": _2, "ingatlan": _2, "jogasz": _2, "konyvelo": _2, "lakas": _2, "media": _2, "news": _2, "org": _2, "priv": _2, "reklam": _2, "sex": _2, "shop": _2, "sport": _2, "suli": _2, "szex": _2, "tm": _2, "tozsde": _2, "utazas": _2, "video": _2 }], "id": [1, { "ac": _2, "biz": _2, "co": _2, "desa": _2, "go": _2, "kop": _2, "mil": _2, "my": _2, "net": _2, "or": _2, "ponpes": _2, "sch": _2, "web": _2, "e": _3, "zone": _3 }], "ie": [1, { "gov": _2, "myspreadshop": _3 }], "il": [1, { "ac": _2, "co": [1, { "ravpage": _3, "mytabit": _3, "tabitorder": _3 }], "gov": _2, "idf": _2, "k12": _2, "muni": _2, "net": _2, "org": _2 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _2, "xn--5dbhl8d": _2, "xn--8dbq2a": _2, "xn--hebda8b": _2 }], "\u05D9\u05E9\u05E8\u05D0\u05DC": [1, { "\u05D0\u05E7\u05D3\u05DE\u05D9\u05D4": _2, "\u05D9\u05E9\u05D5\u05D1": _2, "\u05E6\u05D4\u05DC": _2, "\u05DE\u05DE\u05E9\u05DC": _2 }], "im": [1, { "ac": _2, "co": [1, { "ltd": _2, "plc": _2 }], "com": _2, "net": _2, "org": _2, "tt": _2, "tv": _2 }], "in": [1, { "5g": _2, "6g": _2, "ac": _2, "ai": _2, "am": _2, "bihar": _2, "biz": _2, "business": _2, "ca": _2, "cn": _2, "co": _2, "com": _2, "coop": _2, "cs": _2, "delhi": _2, "dr": _2, "edu": _2, "er": _2, "firm": _2, "gen": _2, "gov": _2, "gujarat": _2, "ind": _2, "info": _2, "int": _2, "internet": _2, "io": _2, "me": _2, "mil": _2, "net": _2, "nic": _2, "org": _2, "pg": _2, "post": _2, "pro": _2, "res": _2, "travel": _2, "tv": _2, "uk": _2, "up": _2, "us": _2, "cloudns": _3, "barsy": _3, "web": _3, "supabase": _3 }], "info": [1, { "cloudns": _3, "dynamic-dns": _3, "barrel-of-knowledge": _3, "barrell-of-knowledge": _3, "dyndns": _3, "for-our": _3, "groks-the": _3, "groks-this": _3, "here-for-more": _3, "knowsitall": _3, "selfip": _3, "webhop": _3, "barsy": _3, "mayfirst": _3, "mittwald": _3, "mittwaldserver": _3, "typo3server": _3, "dvrcam": _3, "ilovecollege": _3, "no-ip": _3, "forumz": _3, "nsupdate": _3, "dnsupdate": _3, "v-info": _3 }], "int": [1, { "eu": _2 }], "io": [1, { "2038": _3, "co": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "on-acorn": _6, "myaddr": _3, "apigee": _3, "b-data": _3, "beagleboard": _3, "bitbucket": _3, "bluebite": _3, "boxfuse": _3, "brave": _7, "browsersafetymark": _3, "bubble": _54, "bubbleapps": _3, "bigv": [0, { "uk0": _3 }], "cleverapps": _3, "cloudbeesusercontent": _3, "dappnode": [0, { "dyndns": _3 }], "darklang": _3, "definima": _3, "dedyn": _3, "icp0": _55, "icp1": _55, "qzz": _3, "fh-muenster": _3, "shw": _3, "forgerock": [0, { "id": _3 }], "github": _3, "gitlab": _3, "lolipop": _3, "hasura-app": _3, "hostyhosting": _3, "hypernode": _3, "moonscale": _6, "beebyte": _43, "beebyteapp": [0, { "sekd1": _3 }], "jele": _3, "webthings": _3, "loginline": _3, "barsy": _3, "azurecontainer": _6, "ngrok": [2, { "ap": _3, "au": _3, "eu": _3, "in": _3, "jp": _3, "sa": _3, "us": _3 }], "nodeart": [0, { "stage": _3 }], "pantheonsite": _3, "pstmn": [2, { "mock": _3 }], "protonet": _3, "qcx": [2, { "sys": _6 }], "qoto": _3, "vaporcloud": _3, "myrdbx": _3, "rb-hosting": _46, "on-k3s": _6, "on-rio": _6, "readthedocs": _3, "resindevice": _3, "resinstaging": [0, { "devices": _3 }], "hzc": _3, "sandcats": _3, "scrypted": [0, { "client": _3 }], "mo-siemens": _3, "lair": _42, "stolos": _6, "musician": _3, "utwente": _3, "edugit": _3, "telebit": _3, "thingdust": [0, { "dev": _56, "disrec": _56, "prod": _57, "testing": _56 }], "tickets": _3, "webflow": _3, "webflowtest": _3, "editorx": _3, "wixstudio": _3, "basicserver": _3, "virtualserver": _3 }], "iq": _5, "ir": [1, { "ac": _2, "co": _2, "gov": _2, "id": _2, "net": _2, "org": _2, "sch": _2, "xn--mgba3a4f16a": _2, "\u0627\u06CC\u0631\u0627\u0646": _2, "xn--mgba3a4fra": _2, "\u0627\u064A\u0631\u0627\u0646": _2, "arvanedge": _3, "vistablog": _3 }], "is": _2, "it": [1, { "edu": _2, "gov": _2, "abr": _2, "abruzzo": _2, "aosta-valley": _2, "aostavalley": _2, "bas": _2, "basilicata": _2, "cal": _2, "calabria": _2, "cam": _2, "campania": _2, "emilia-romagna": _2, "emiliaromagna": _2, "emr": _2, "friuli-v-giulia": _2, "friuli-ve-giulia": _2, "friuli-vegiulia": _2, "friuli-venezia-giulia": _2, "friuli-veneziagiulia": _2, "friuli-vgiulia": _2, "friuliv-giulia": _2, "friulive-giulia": _2, "friulivegiulia": _2, "friulivenezia-giulia": _2, "friuliveneziagiulia": _2, "friulivgiulia": _2, "fvg": _2, "laz": _2, "lazio": _2, "lig": _2, "liguria": _2, "lom": _2, "lombardia": _2, "lombardy": _2, "lucania": _2, "mar": _2, "marche": _2, "mol": _2, "molise": _2, "piedmont": _2, "piemonte": _2, "pmn": _2, "pug": _2, "puglia": _2, "sar": _2, "sardegna": _2, "sardinia": _2, "sic": _2, "sicilia": _2, "sicily": _2, "taa": _2, "tos": _2, "toscana": _2, "trentin-sud-tirol": _2, "xn--trentin-sd-tirol-rzb": _2, "trentin-s\xFCd-tirol": _2, "trentin-sudtirol": _2, "xn--trentin-sdtirol-7vb": _2, "trentin-s\xFCdtirol": _2, "trentin-sued-tirol": _2, "trentin-suedtirol": _2, "trentino": _2, "trentino-a-adige": _2, "trentino-aadige": _2, "trentino-alto-adige": _2, "trentino-altoadige": _2, "trentino-s-tirol": _2, "trentino-stirol": _2, "trentino-sud-tirol": _2, "xn--trentino-sd-tirol-c3b": _2, "trentino-s\xFCd-tirol": _2, "trentino-sudtirol": _2, "xn--trentino-sdtirol-szb": _2, "trentino-s\xFCdtirol": _2, "trentino-sued-tirol": _2, "trentino-suedtirol": _2, "trentinoa-adige": _2, "trentinoaadige": _2, "trentinoalto-adige": _2, "trentinoaltoadige": _2, "trentinos-tirol": _2, "trentinostirol": _2, "trentinosud-tirol": _2, "xn--trentinosd-tirol-rzb": _2, "trentinos\xFCd-tirol": _2, "trentinosudtirol": _2, "xn--trentinosdtirol-7vb": _2, "trentinos\xFCdtirol": _2, "trentinosued-tirol": _2, "trentinosuedtirol": _2, "trentinsud-tirol": _2, "xn--trentinsd-tirol-6vb": _2, "trentins\xFCd-tirol": _2, "trentinsudtirol": _2, "xn--trentinsdtirol-nsb": _2, "trentins\xFCdtirol": _2, "trentinsued-tirol": _2, "trentinsuedtirol": _2, "tuscany": _2, "umb": _2, "umbria": _2, "val-d-aosta": _2, "val-daosta": _2, "vald-aosta": _2, "valdaosta": _2, "valle-aosta": _2, "valle-d-aosta": _2, "valle-daosta": _2, "valleaosta": _2, "valled-aosta": _2, "valledaosta": _2, "vallee-aoste": _2, "xn--valle-aoste-ebb": _2, "vall\xE9e-aoste": _2, "vallee-d-aoste": _2, "xn--valle-d-aoste-ehb": _2, "vall\xE9e-d-aoste": _2, "valleeaoste": _2, "xn--valleaoste-e7a": _2, "vall\xE9eaoste": _2, "valleedaoste": _2, "xn--valledaoste-ebb": _2, "vall\xE9edaoste": _2, "vao": _2, "vda": _2, "ven": _2, "veneto": _2, "ag": _2, "agrigento": _2, "al": _2, "alessandria": _2, "alto-adige": _2, "altoadige": _2, "an": _2, "ancona": _2, "andria-barletta-trani": _2, "andria-trani-barletta": _2, "andriabarlettatrani": _2, "andriatranibarletta": _2, "ao": _2, "aosta": _2, "aoste": _2, "ap": _2, "aq": _2, "aquila": _2, "ar": _2, "arezzo": _2, "ascoli-piceno": _2, "ascolipiceno": _2, "asti": _2, "at": _2, "av": _2, "avellino": _2, "ba": _2, "balsan": _2, "balsan-sudtirol": _2, "xn--balsan-sdtirol-nsb": _2, "balsan-s\xFCdtirol": _2, "balsan-suedtirol": _2, "bari": _2, "barletta-trani-andria": _2, "barlettatraniandria": _2, "belluno": _2, "benevento": _2, "bergamo": _2, "bg": _2, "bi": _2, "biella": _2, "bl": _2, "bn": _2, "bo": _2, "bologna": _2, "bolzano": _2, "bolzano-altoadige": _2, "bozen": _2, "bozen-sudtirol": _2, "xn--bozen-sdtirol-2ob": _2, "bozen-s\xFCdtirol": _2, "bozen-suedtirol": _2, "br": _2, "brescia": _2, "brindisi": _2, "bs": _2, "bt": _2, "bulsan": _2, "bulsan-sudtirol": _2, "xn--bulsan-sdtirol-nsb": _2, "bulsan-s\xFCdtirol": _2, "bulsan-suedtirol": _2, "bz": _2, "ca": _2, "cagliari": _2, "caltanissetta": _2, "campidano-medio": _2, "campidanomedio": _2, "campobasso": _2, "carbonia-iglesias": _2, "carboniaiglesias": _2, "carrara-massa": _2, "carraramassa": _2, "caserta": _2, "catania": _2, "catanzaro": _2, "cb": _2, "ce": _2, "cesena-forli": _2, "xn--cesena-forl-mcb": _2, "cesena-forl\xEC": _2, "cesenaforli": _2, "xn--cesenaforl-i8a": _2, "cesenaforl\xEC": _2, "ch": _2, "chieti": _2, "ci": _2, "cl": _2, "cn": _2, "co": _2, "como": _2, "cosenza": _2, "cr": _2, "cremona": _2, "crotone": _2, "cs": _2, "ct": _2, "cuneo": _2, "cz": _2, "dell-ogliastra": _2, "dellogliastra": _2, "en": _2, "enna": _2, "fc": _2, "fe": _2, "fermo": _2, "ferrara": _2, "fg": _2, "fi": _2, "firenze": _2, "florence": _2, "fm": _2, "foggia": _2, "forli-cesena": _2, "xn--forl-cesena-fcb": _2, "forl\xEC-cesena": _2, "forlicesena": _2, "xn--forlcesena-c8a": _2, "forl\xECcesena": _2, "fr": _2, "frosinone": _2, "ge": _2, "genoa": _2, "genova": _2, "go": _2, "gorizia": _2, "gr": _2, "grosseto": _2, "iglesias-carbonia": _2, "iglesiascarbonia": _2, "im": _2, "imperia": _2, "is": _2, "isernia": _2, "kr": _2, "la-spezia": _2, "laquila": _2, "laspezia": _2, "latina": _2, "lc": _2, "le": _2, "lecce": _2, "lecco": _2, "li": _2, "livorno": _2, "lo": _2, "lodi": _2, "lt": _2, "lu": _2, "lucca": _2, "macerata": _2, "mantova": _2, "massa-carrara": _2, "massacarrara": _2, "matera": _2, "mb": _2, "mc": _2, "me": _2, "medio-campidano": _2, "mediocampidano": _2, "messina": _2, "mi": _2, "milan": _2, "milano": _2, "mn": _2, "mo": _2, "modena": _2, "monza": _2, "monza-brianza": _2, "monza-e-della-brianza": _2, "monzabrianza": _2, "monzaebrianza": _2, "monzaedellabrianza": _2, "ms": _2, "mt": _2, "na": _2, "naples": _2, "napoli": _2, "no": _2, "novara": _2, "nu": _2, "nuoro": _2, "og": _2, "ogliastra": _2, "olbia-tempio": _2, "olbiatempio": _2, "or": _2, "oristano": _2, "ot": _2, "pa": _2, "padova": _2, "padua": _2, "palermo": _2, "parma": _2, "pavia": _2, "pc": _2, "pd": _2, "pe": _2, "perugia": _2, "pesaro-urbino": _2, "pesarourbino": _2, "pescara": _2, "pg": _2, "pi": _2, "piacenza": _2, "pisa": _2, "pistoia": _2, "pn": _2, "po": _2, "pordenone": _2, "potenza": _2, "pr": _2, "prato": _2, "pt": _2, "pu": _2, "pv": _2, "pz": _2, "ra": _2, "ragusa": _2, "ravenna": _2, "rc": _2, "re": _2, "reggio-calabria": _2, "reggio-emilia": _2, "reggiocalabria": _2, "reggioemilia": _2, "rg": _2, "ri": _2, "rieti": _2, "rimini": _2, "rm": _2, "rn": _2, "ro": _2, "roma": _2, "rome": _2, "rovigo": _2, "sa": _2, "salerno": _2, "sassari": _2, "savona": _2, "si": _2, "siena": _2, "siracusa": _2, "so": _2, "sondrio": _2, "sp": _2, "sr": _2, "ss": _2, "xn--sdtirol-n2a": _2, "s\xFCdtirol": _2, "suedtirol": _2, "sv": _2, "ta": _2, "taranto": _2, "te": _2, "tempio-olbia": _2, "tempioolbia": _2, "teramo": _2, "terni": _2, "tn": _2, "to": _2, "torino": _2, "tp": _2, "tr": _2, "trani-andria-barletta": _2, "trani-barletta-andria": _2, "traniandriabarletta": _2, "tranibarlettaandria": _2, "trapani": _2, "trento": _2, "treviso": _2, "trieste": _2, "ts": _2, "turin": _2, "tv": _2, "ud": _2, "udine": _2, "urbino-pesaro": _2, "urbinopesaro": _2, "va": _2, "varese": _2, "vb": _2, "vc": _2, "ve": _2, "venezia": _2, "venice": _2, "verbania": _2, "vercelli": _2, "verona": _2, "vi": _2, "vibo-valentia": _2, "vibovalentia": _2, "vicenza": _2, "viterbo": _2, "vr": _2, "vs": _2, "vt": _2, "vv": _2, "12chars": _3, "ibxos": _3, "iliadboxos": _3, "neen": [0, { "jc": _3 }], "123homepage": _3, "16-b": _3, "32-b": _3, "64-b": _3, "myspreadshop": _3, "syncloud": _3 }], "je": [1, { "co": _2, "net": _2, "org": _2, "of": _3 }], "jm": _20, "jo": [1, { "agri": _2, "ai": _2, "com": _2, "edu": _2, "eng": _2, "fm": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "per": _2, "phd": _2, "sch": _2, "tv": _2 }], "jobs": _2, "jp": [1, { "ac": _2, "ad": _2, "co": _2, "ed": _2, "go": _2, "gr": _2, "lg": _2, "ne": [1, { "aseinet": _53, "gehirn": _3, "ivory": _3, "mail-box": _3, "mints": _3, "mokuren": _3, "opal": _3, "sakura": _3, "sumomo": _3, "topaz": _3 }], "or": _2, "aichi": [1, { "aisai": _2, "ama": _2, "anjo": _2, "asuke": _2, "chiryu": _2, "chita": _2, "fuso": _2, "gamagori": _2, "handa": _2, "hazu": _2, "hekinan": _2, "higashiura": _2, "ichinomiya": _2, "inazawa": _2, "inuyama": _2, "isshiki": _2, "iwakura": _2, "kanie": _2, "kariya": _2, "kasugai": _2, "kira": _2, "kiyosu": _2, "komaki": _2, "konan": _2, "kota": _2, "mihama": _2, "miyoshi": _2, "nishio": _2, "nisshin": _2, "obu": _2, "oguchi": _2, "oharu": _2, "okazaki": _2, "owariasahi": _2, "seto": _2, "shikatsu": _2, "shinshiro": _2, "shitara": _2, "tahara": _2, "takahama": _2, "tobishima": _2, "toei": _2, "togo": _2, "tokai": _2, "tokoname": _2, "toyoake": _2, "toyohashi": _2, "toyokawa": _2, "toyone": _2, "toyota": _2, "tsushima": _2, "yatomi": _2 }], "akita": [1, { "akita": _2, "daisen": _2, "fujisato": _2, "gojome": _2, "hachirogata": _2, "happou": _2, "higashinaruse": _2, "honjo": _2, "honjyo": _2, "ikawa": _2, "kamikoani": _2, "kamioka": _2, "katagami": _2, "kazuno": _2, "kitaakita": _2, "kosaka": _2, "kyowa": _2, "misato": _2, "mitane": _2, "moriyoshi": _2, "nikaho": _2, "noshiro": _2, "odate": _2, "oga": _2, "ogata": _2, "semboku": _2, "yokote": _2, "yurihonjo": _2 }], "aomori": [1, { "aomori": _2, "gonohe": _2, "hachinohe": _2, "hashikami": _2, "hiranai": _2, "hirosaki": _2, "itayanagi": _2, "kuroishi": _2, "misawa": _2, "mutsu": _2, "nakadomari": _2, "noheji": _2, "oirase": _2, "owani": _2, "rokunohe": _2, "sannohe": _2, "shichinohe": _2, "shingo": _2, "takko": _2, "towada": _2, "tsugaru": _2, "tsuruta": _2 }], "chiba": [1, { "abiko": _2, "asahi": _2, "chonan": _2, "chosei": _2, "choshi": _2, "chuo": _2, "funabashi": _2, "futtsu": _2, "hanamigawa": _2, "ichihara": _2, "ichikawa": _2, "ichinomiya": _2, "inzai": _2, "isumi": _2, "kamagaya": _2, "kamogawa": _2, "kashiwa": _2, "katori": _2, "katsuura": _2, "kimitsu": _2, "kisarazu": _2, "kozaki": _2, "kujukuri": _2, "kyonan": _2, "matsudo": _2, "midori": _2, "mihama": _2, "minamiboso": _2, "mobara": _2, "mutsuzawa": _2, "nagara": _2, "nagareyama": _2, "narashino": _2, "narita": _2, "noda": _2, "oamishirasato": _2, "omigawa": _2, "onjuku": _2, "otaki": _2, "sakae": _2, "sakura": _2, "shimofusa": _2, "shirako": _2, "shiroi": _2, "shisui": _2, "sodegaura": _2, "sosa": _2, "tako": _2, "tateyama": _2, "togane": _2, "tohnosho": _2, "tomisato": _2, "urayasu": _2, "yachimata": _2, "yachiyo": _2, "yokaichiba": _2, "yokoshibahikari": _2, "yotsukaido": _2 }], "ehime": [1, { "ainan": _2, "honai": _2, "ikata": _2, "imabari": _2, "iyo": _2, "kamijima": _2, "kihoku": _2, "kumakogen": _2, "masaki": _2, "matsuno": _2, "matsuyama": _2, "namikata": _2, "niihama": _2, "ozu": _2, "saijo": _2, "seiyo": _2, "shikokuchuo": _2, "tobe": _2, "toon": _2, "uchiko": _2, "uwajima": _2, "yawatahama": _2 }], "fukui": [1, { "echizen": _2, "eiheiji": _2, "fukui": _2, "ikeda": _2, "katsuyama": _2, "mihama": _2, "minamiechizen": _2, "obama": _2, "ohi": _2, "ono": _2, "sabae": _2, "sakai": _2, "takahama": _2, "tsuruga": _2, "wakasa": _2 }], "fukuoka": [1, { "ashiya": _2, "buzen": _2, "chikugo": _2, "chikuho": _2, "chikujo": _2, "chikushino": _2, "chikuzen": _2, "chuo": _2, "dazaifu": _2, "fukuchi": _2, "hakata": _2, "higashi": _2, "hirokawa": _2, "hisayama": _2, "iizuka": _2, "inatsuki": _2, "kaho": _2, "kasuga": _2, "kasuya": _2, "kawara": _2, "keisen": _2, "koga": _2, "kurate": _2, "kurogi": _2, "kurume": _2, "minami": _2, "miyako": _2, "miyama": _2, "miyawaka": _2, "mizumaki": _2, "munakata": _2, "nakagawa": _2, "nakama": _2, "nishi": _2, "nogata": _2, "ogori": _2, "okagaki": _2, "okawa": _2, "oki": _2, "omuta": _2, "onga": _2, "onojo": _2, "oto": _2, "saigawa": _2, "sasaguri": _2, "shingu": _2, "shinyoshitomi": _2, "shonai": _2, "soeda": _2, "sue": _2, "tachiarai": _2, "tagawa": _2, "takata": _2, "toho": _2, "toyotsu": _2, "tsuiki": _2, "ukiha": _2, "umi": _2, "usui": _2, "yamada": _2, "yame": _2, "yanagawa": _2, "yukuhashi": _2 }], "fukushima": [1, { "aizubange": _2, "aizumisato": _2, "aizuwakamatsu": _2, "asakawa": _2, "bandai": _2, "date": _2, "fukushima": _2, "furudono": _2, "futaba": _2, "hanawa": _2, "higashi": _2, "hirata": _2, "hirono": _2, "iitate": _2, "inawashiro": _2, "ishikawa": _2, "iwaki": _2, "izumizaki": _2, "kagamiishi": _2, "kaneyama": _2, "kawamata": _2, "kitakata": _2, "kitashiobara": _2, "koori": _2, "koriyama": _2, "kunimi": _2, "miharu": _2, "mishima": _2, "namie": _2, "nango": _2, "nishiaizu": _2, "nishigo": _2, "okuma": _2, "omotego": _2, "ono": _2, "otama": _2, "samegawa": _2, "shimogo": _2, "shirakawa": _2, "showa": _2, "soma": _2, "sukagawa": _2, "taishin": _2, "tamakawa": _2, "tanagura": _2, "tenei": _2, "yabuki": _2, "yamato": _2, "yamatsuri": _2, "yanaizu": _2, "yugawa": _2 }], "gifu": [1, { "anpachi": _2, "ena": _2, "gifu": _2, "ginan": _2, "godo": _2, "gujo": _2, "hashima": _2, "hichiso": _2, "hida": _2, "higashishirakawa": _2, "ibigawa": _2, "ikeda": _2, "kakamigahara": _2, "kani": _2, "kasahara": _2, "kasamatsu": _2, "kawaue": _2, "kitagata": _2, "mino": _2, "minokamo": _2, "mitake": _2, "mizunami": _2, "motosu": _2, "nakatsugawa": _2, "ogaki": _2, "sakahogi": _2, "seki": _2, "sekigahara": _2, "shirakawa": _2, "tajimi": _2, "takayama": _2, "tarui": _2, "toki": _2, "tomika": _2, "wanouchi": _2, "yamagata": _2, "yaotsu": _2, "yoro": _2 }], "gunma": [1, { "annaka": _2, "chiyoda": _2, "fujioka": _2, "higashiagatsuma": _2, "isesaki": _2, "itakura": _2, "kanna": _2, "kanra": _2, "katashina": _2, "kawaba": _2, "kiryu": _2, "kusatsu": _2, "maebashi": _2, "meiwa": _2, "midori": _2, "minakami": _2, "naganohara": _2, "nakanojo": _2, "nanmoku": _2, "numata": _2, "oizumi": _2, "ora": _2, "ota": _2, "shibukawa": _2, "shimonita": _2, "shinto": _2, "showa": _2, "takasaki": _2, "takayama": _2, "tamamura": _2, "tatebayashi": _2, "tomioka": _2, "tsukiyono": _2, "tsumagoi": _2, "ueno": _2, "yoshioka": _2 }], "hiroshima": [1, { "asaminami": _2, "daiwa": _2, "etajima": _2, "fuchu": _2, "fukuyama": _2, "hatsukaichi": _2, "higashihiroshima": _2, "hongo": _2, "jinsekikogen": _2, "kaita": _2, "kui": _2, "kumano": _2, "kure": _2, "mihara": _2, "miyoshi": _2, "naka": _2, "onomichi": _2, "osakikamijima": _2, "otake": _2, "saka": _2, "sera": _2, "seranishi": _2, "shinichi": _2, "shobara": _2, "takehara": _2 }], "hokkaido": [1, { "abashiri": _2, "abira": _2, "aibetsu": _2, "akabira": _2, "akkeshi": _2, "asahikawa": _2, "ashibetsu": _2, "ashoro": _2, "assabu": _2, "atsuma": _2, "bibai": _2, "biei": _2, "bifuka": _2, "bihoro": _2, "biratori": _2, "chippubetsu": _2, "chitose": _2, "date": _2, "ebetsu": _2, "embetsu": _2, "eniwa": _2, "erimo": _2, "esan": _2, "esashi": _2, "fukagawa": _2, "fukushima": _2, "furano": _2, "furubira": _2, "haboro": _2, "hakodate": _2, "hamatonbetsu": _2, "hidaka": _2, "higashikagura": _2, "higashikawa": _2, "hiroo": _2, "hokuryu": _2, "hokuto": _2, "honbetsu": _2, "horokanai": _2, "horonobe": _2, "ikeda": _2, "imakane": _2, "ishikari": _2, "iwamizawa": _2, "iwanai": _2, "kamifurano": _2, "kamikawa": _2, "kamishihoro": _2, "kamisunagawa": _2, "kamoenai": _2, "kayabe": _2, "kembuchi": _2, "kikonai": _2, "kimobetsu": _2, "kitahiroshima": _2, "kitami": _2, "kiyosato": _2, "koshimizu": _2, "kunneppu": _2, "kuriyama": _2, "kuromatsunai": _2, "kushiro": _2, "kutchan": _2, "kyowa": _2, "mashike": _2, "matsumae": _2, "mikasa": _2, "minamifurano": _2, "mombetsu": _2, "moseushi": _2, "mukawa": _2, "muroran": _2, "naie": _2, "nakagawa": _2, "nakasatsunai": _2, "nakatombetsu": _2, "nanae": _2, "nanporo": _2, "nayoro": _2, "nemuro": _2, "niikappu": _2, "niki": _2, "nishiokoppe": _2, "noboribetsu": _2, "numata": _2, "obihiro": _2, "obira": _2, "oketo": _2, "okoppe": _2, "otaru": _2, "otobe": _2, "otofuke": _2, "otoineppu": _2, "oumu": _2, "ozora": _2, "pippu": _2, "rankoshi": _2, "rebun": _2, "rikubetsu": _2, "rishiri": _2, "rishirifuji": _2, "saroma": _2, "sarufutsu": _2, "shakotan": _2, "shari": _2, "shibecha": _2, "shibetsu": _2, "shikabe": _2, "shikaoi": _2, "shimamaki": _2, "shimizu": _2, "shimokawa": _2, "shinshinotsu": _2, "shintoku": _2, "shiranuka": _2, "shiraoi": _2, "shiriuchi": _2, "sobetsu": _2, "sunagawa": _2, "taiki": _2, "takasu": _2, "takikawa": _2, "takinoue": _2, "teshikaga": _2, "tobetsu": _2, "tohma": _2, "tomakomai": _2, "tomari": _2, "toya": _2, "toyako": _2, "toyotomi": _2, "toyoura": _2, "tsubetsu": _2, "tsukigata": _2, "urakawa": _2, "urausu": _2, "uryu": _2, "utashinai": _2, "wakkanai": _2, "wassamu": _2, "yakumo": _2, "yoichi": _2 }], "hyogo": [1, { "aioi": _2, "akashi": _2, "ako": _2, "amagasaki": _2, "aogaki": _2, "asago": _2, "ashiya": _2, "awaji": _2, "fukusaki": _2, "goshiki": _2, "harima": _2, "himeji": _2, "ichikawa": _2, "inagawa": _2, "itami": _2, "kakogawa": _2, "kamigori": _2, "kamikawa": _2, "kasai": _2, "kasuga": _2, "kawanishi": _2, "miki": _2, "minamiawaji": _2, "nishinomiya": _2, "nishiwaki": _2, "ono": _2, "sanda": _2, "sannan": _2, "sasayama": _2, "sayo": _2, "shingu": _2, "shinonsen": _2, "shiso": _2, "sumoto": _2, "taishi": _2, "taka": _2, "takarazuka": _2, "takasago": _2, "takino": _2, "tamba": _2, "tatsuno": _2, "toyooka": _2, "yabu": _2, "yashiro": _2, "yoka": _2, "yokawa": _2 }], "ibaraki": [1, { "ami": _2, "asahi": _2, "bando": _2, "chikusei": _2, "daigo": _2, "fujishiro": _2, "hitachi": _2, "hitachinaka": _2, "hitachiomiya": _2, "hitachiota": _2, "ibaraki": _2, "ina": _2, "inashiki": _2, "itako": _2, "iwama": _2, "joso": _2, "kamisu": _2, "kasama": _2, "kashima": _2, "kasumigaura": _2, "koga": _2, "miho": _2, "mito": _2, "moriya": _2, "naka": _2, "namegata": _2, "oarai": _2, "ogawa": _2, "omitama": _2, "ryugasaki": _2, "sakai": _2, "sakuragawa": _2, "shimodate": _2, "shimotsuma": _2, "shirosato": _2, "sowa": _2, "suifu": _2, "takahagi": _2, "tamatsukuri": _2, "tokai": _2, "tomobe": _2, "tone": _2, "toride": _2, "tsuchiura": _2, "tsukuba": _2, "uchihara": _2, "ushiku": _2, "yachiyo": _2, "yamagata": _2, "yawara": _2, "yuki": _2 }], "ishikawa": [1, { "anamizu": _2, "hakui": _2, "hakusan": _2, "kaga": _2, "kahoku": _2, "kanazawa": _2, "kawakita": _2, "komatsu": _2, "nakanoto": _2, "nanao": _2, "nomi": _2, "nonoichi": _2, "noto": _2, "shika": _2, "suzu": _2, "tsubata": _2, "tsurugi": _2, "uchinada": _2, "wajima": _2 }], "iwate": [1, { "fudai": _2, "fujisawa": _2, "hanamaki": _2, "hiraizumi": _2, "hirono": _2, "ichinohe": _2, "ichinoseki": _2, "iwaizumi": _2, "iwate": _2, "joboji": _2, "kamaishi": _2, "kanegasaki": _2, "karumai": _2, "kawai": _2, "kitakami": _2, "kuji": _2, "kunohe": _2, "kuzumaki": _2, "miyako": _2, "mizusawa": _2, "morioka": _2, "ninohe": _2, "noda": _2, "ofunato": _2, "oshu": _2, "otsuchi": _2, "rikuzentakata": _2, "shiwa": _2, "shizukuishi": _2, "sumita": _2, "tanohata": _2, "tono": _2, "yahaba": _2, "yamada": _2 }], "kagawa": [1, { "ayagawa": _2, "higashikagawa": _2, "kanonji": _2, "kotohira": _2, "manno": _2, "marugame": _2, "mitoyo": _2, "naoshima": _2, "sanuki": _2, "tadotsu": _2, "takamatsu": _2, "tonosho": _2, "uchinomi": _2, "utazu": _2, "zentsuji": _2 }], "kagoshima": [1, { "akune": _2, "amami": _2, "hioki": _2, "isa": _2, "isen": _2, "izumi": _2, "kagoshima": _2, "kanoya": _2, "kawanabe": _2, "kinko": _2, "kouyama": _2, "makurazaki": _2, "matsumoto": _2, "minamitane": _2, "nakatane": _2, "nishinoomote": _2, "satsumasendai": _2, "soo": _2, "tarumizu": _2, "yusui": _2 }], "kanagawa": [1, { "aikawa": _2, "atsugi": _2, "ayase": _2, "chigasaki": _2, "ebina": _2, "fujisawa": _2, "hadano": _2, "hakone": _2, "hiratsuka": _2, "isehara": _2, "kaisei": _2, "kamakura": _2, "kiyokawa": _2, "matsuda": _2, "minamiashigara": _2, "miura": _2, "nakai": _2, "ninomiya": _2, "odawara": _2, "oi": _2, "oiso": _2, "sagamihara": _2, "samukawa": _2, "tsukui": _2, "yamakita": _2, "yamato": _2, "yokosuka": _2, "yugawara": _2, "zama": _2, "zushi": _2 }], "kochi": [1, { "aki": _2, "geisei": _2, "hidaka": _2, "higashitsuno": _2, "ino": _2, "kagami": _2, "kami": _2, "kitagawa": _2, "kochi": _2, "mihara": _2, "motoyama": _2, "muroto": _2, "nahari": _2, "nakamura": _2, "nankoku": _2, "nishitosa": _2, "niyodogawa": _2, "ochi": _2, "okawa": _2, "otoyo": _2, "otsuki": _2, "sakawa": _2, "sukumo": _2, "susaki": _2, "tosa": _2, "tosashimizu": _2, "toyo": _2, "tsuno": _2, "umaji": _2, "yasuda": _2, "yusuhara": _2 }], "kumamoto": [1, { "amakusa": _2, "arao": _2, "aso": _2, "choyo": _2, "gyokuto": _2, "kamiamakusa": _2, "kikuchi": _2, "kumamoto": _2, "mashiki": _2, "mifune": _2, "minamata": _2, "minamioguni": _2, "nagasu": _2, "nishihara": _2, "oguni": _2, "ozu": _2, "sumoto": _2, "takamori": _2, "uki": _2, "uto": _2, "yamaga": _2, "yamato": _2, "yatsushiro": _2 }], "kyoto": [1, { "ayabe": _2, "fukuchiyama": _2, "higashiyama": _2, "ide": _2, "ine": _2, "joyo": _2, "kameoka": _2, "kamo": _2, "kita": _2, "kizu": _2, "kumiyama": _2, "kyotamba": _2, "kyotanabe": _2, "kyotango": _2, "maizuru": _2, "minami": _2, "minamiyamashiro": _2, "miyazu": _2, "muko": _2, "nagaokakyo": _2, "nakagyo": _2, "nantan": _2, "oyamazaki": _2, "sakyo": _2, "seika": _2, "tanabe": _2, "uji": _2, "ujitawara": _2, "wazuka": _2, "yamashina": _2, "yawata": _2 }], "mie": [1, { "asahi": _2, "inabe": _2, "ise": _2, "kameyama": _2, "kawagoe": _2, "kiho": _2, "kisosaki": _2, "kiwa": _2, "komono": _2, "kumano": _2, "kuwana": _2, "matsusaka": _2, "meiwa": _2, "mihama": _2, "minamiise": _2, "misugi": _2, "miyama": _2, "nabari": _2, "shima": _2, "suzuka": _2, "tado": _2, "taiki": _2, "taki": _2, "tamaki": _2, "toba": _2, "tsu": _2, "udono": _2, "ureshino": _2, "watarai": _2, "yokkaichi": _2 }], "miyagi": [1, { "furukawa": _2, "higashimatsushima": _2, "ishinomaki": _2, "iwanuma": _2, "kakuda": _2, "kami": _2, "kawasaki": _2, "marumori": _2, "matsushima": _2, "minamisanriku": _2, "misato": _2, "murata": _2, "natori": _2, "ogawara": _2, "ohira": _2, "onagawa": _2, "osaki": _2, "rifu": _2, "semine": _2, "shibata": _2, "shichikashuku": _2, "shikama": _2, "shiogama": _2, "shiroishi": _2, "tagajo": _2, "taiwa": _2, "tome": _2, "tomiya": _2, "wakuya": _2, "watari": _2, "yamamoto": _2, "zao": _2 }], "miyazaki": [1, { "aya": _2, "ebino": _2, "gokase": _2, "hyuga": _2, "kadogawa": _2, "kawaminami": _2, "kijo": _2, "kitagawa": _2, "kitakata": _2, "kitaura": _2, "kobayashi": _2, "kunitomi": _2, "kushima": _2, "mimata": _2, "miyakonojo": _2, "miyazaki": _2, "morotsuka": _2, "nichinan": _2, "nishimera": _2, "nobeoka": _2, "saito": _2, "shiiba": _2, "shintomi": _2, "takaharu": _2, "takanabe": _2, "takazaki": _2, "tsuno": _2 }], "nagano": [1, { "achi": _2, "agematsu": _2, "anan": _2, "aoki": _2, "asahi": _2, "azumino": _2, "chikuhoku": _2, "chikuma": _2, "chino": _2, "fujimi": _2, "hakuba": _2, "hara": _2, "hiraya": _2, "iida": _2, "iijima": _2, "iiyama": _2, "iizuna": _2, "ikeda": _2, "ikusaka": _2, "ina": _2, "karuizawa": _2, "kawakami": _2, "kiso": _2, "kisofukushima": _2, "kitaaiki": _2, "komagane": _2, "komoro": _2, "matsukawa": _2, "matsumoto": _2, "miasa": _2, "minamiaiki": _2, "minamimaki": _2, "minamiminowa": _2, "minowa": _2, "miyada": _2, "miyota": _2, "mochizuki": _2, "nagano": _2, "nagawa": _2, "nagiso": _2, "nakagawa": _2, "nakano": _2, "nozawaonsen": _2, "obuse": _2, "ogawa": _2, "okaya": _2, "omachi": _2, "omi": _2, "ookuwa": _2, "ooshika": _2, "otaki": _2, "otari": _2, "sakae": _2, "sakaki": _2, "saku": _2, "sakuho": _2, "shimosuwa": _2, "shinanomachi": _2, "shiojiri": _2, "suwa": _2, "suzaka": _2, "takagi": _2, "takamori": _2, "takayama": _2, "tateshina": _2, "tatsuno": _2, "togakushi": _2, "togura": _2, "tomi": _2, "ueda": _2, "wada": _2, "yamagata": _2, "yamanouchi": _2, "yasaka": _2, "yasuoka": _2 }], "nagasaki": [1, { "chijiwa": _2, "futsu": _2, "goto": _2, "hasami": _2, "hirado": _2, "iki": _2, "isahaya": _2, "kawatana": _2, "kuchinotsu": _2, "matsuura": _2, "nagasaki": _2, "obama": _2, "omura": _2, "oseto": _2, "saikai": _2, "sasebo": _2, "seihi": _2, "shimabara": _2, "shinkamigoto": _2, "togitsu": _2, "tsushima": _2, "unzen": _2 }], "nara": [1, { "ando": _2, "gose": _2, "heguri": _2, "higashiyoshino": _2, "ikaruga": _2, "ikoma": _2, "kamikitayama": _2, "kanmaki": _2, "kashiba": _2, "kashihara": _2, "katsuragi": _2, "kawai": _2, "kawakami": _2, "kawanishi": _2, "koryo": _2, "kurotaki": _2, "mitsue": _2, "miyake": _2, "nara": _2, "nosegawa": _2, "oji": _2, "ouda": _2, "oyodo": _2, "sakurai": _2, "sango": _2, "shimoichi": _2, "shimokitayama": _2, "shinjo": _2, "soni": _2, "takatori": _2, "tawaramoto": _2, "tenkawa": _2, "tenri": _2, "uda": _2, "yamatokoriyama": _2, "yamatotakada": _2, "yamazoe": _2, "yoshino": _2 }], "niigata": [1, { "aga": _2, "agano": _2, "gosen": _2, "itoigawa": _2, "izumozaki": _2, "joetsu": _2, "kamo": _2, "kariwa": _2, "kashiwazaki": _2, "minamiuonuma": _2, "mitsuke": _2, "muika": _2, "murakami": _2, "myoko": _2, "nagaoka": _2, "niigata": _2, "ojiya": _2, "omi": _2, "sado": _2, "sanjo": _2, "seiro": _2, "seirou": _2, "sekikawa": _2, "shibata": _2, "tagami": _2, "tainai": _2, "tochio": _2, "tokamachi": _2, "tsubame": _2, "tsunan": _2, "uonuma": _2, "yahiko": _2, "yoita": _2, "yuzawa": _2 }], "oita": [1, { "beppu": _2, "bungoono": _2, "bungotakada": _2, "hasama": _2, "hiji": _2, "himeshima": _2, "hita": _2, "kamitsue": _2, "kokonoe": _2, "kuju": _2, "kunisaki": _2, "kusu": _2, "oita": _2, "saiki": _2, "taketa": _2, "tsukumi": _2, "usa": _2, "usuki": _2, "yufu": _2 }], "okayama": [1, { "akaiwa": _2, "asakuchi": _2, "bizen": _2, "hayashima": _2, "ibara": _2, "kagamino": _2, "kasaoka": _2, "kibichuo": _2, "kumenan": _2, "kurashiki": _2, "maniwa": _2, "misaki": _2, "nagi": _2, "niimi": _2, "nishiawakura": _2, "okayama": _2, "satosho": _2, "setouchi": _2, "shinjo": _2, "shoo": _2, "soja": _2, "takahashi": _2, "tamano": _2, "tsuyama": _2, "wake": _2, "yakage": _2 }], "okinawa": [1, { "aguni": _2, "ginowan": _2, "ginoza": _2, "gushikami": _2, "haebaru": _2, "higashi": _2, "hirara": _2, "iheya": _2, "ishigaki": _2, "ishikawa": _2, "itoman": _2, "izena": _2, "kadena": _2, "kin": _2, "kitadaito": _2, "kitanakagusuku": _2, "kumejima": _2, "kunigami": _2, "minamidaito": _2, "motobu": _2, "nago": _2, "naha": _2, "nakagusuku": _2, "nakijin": _2, "nanjo": _2, "nishihara": _2, "ogimi": _2, "okinawa": _2, "onna": _2, "shimoji": _2, "taketomi": _2, "tarama": _2, "tokashiki": _2, "tomigusuku": _2, "tonaki": _2, "urasoe": _2, "uruma": _2, "yaese": _2, "yomitan": _2, "yonabaru": _2, "yonaguni": _2, "zamami": _2 }], "osaka": [1, { "abeno": _2, "chihayaakasaka": _2, "chuo": _2, "daito": _2, "fujiidera": _2, "habikino": _2, "hannan": _2, "higashiosaka": _2, "higashisumiyoshi": _2, "higashiyodogawa": _2, "hirakata": _2, "ibaraki": _2, "ikeda": _2, "izumi": _2, "izumiotsu": _2, "izumisano": _2, "kadoma": _2, "kaizuka": _2, "kanan": _2, "kashiwara": _2, "katano": _2, "kawachinagano": _2, "kishiwada": _2, "kita": _2, "kumatori": _2, "matsubara": _2, "minato": _2, "minoh": _2, "misaki": _2, "moriguchi": _2, "neyagawa": _2, "nishi": _2, "nose": _2, "osakasayama": _2, "sakai": _2, "sayama": _2, "sennan": _2, "settsu": _2, "shijonawate": _2, "shimamoto": _2, "suita": _2, "tadaoka": _2, "taishi": _2, "tajiri": _2, "takaishi": _2, "takatsuki": _2, "tondabayashi": _2, "toyonaka": _2, "toyono": _2, "yao": _2 }], "saga": [1, { "ariake": _2, "arita": _2, "fukudomi": _2, "genkai": _2, "hamatama": _2, "hizen": _2, "imari": _2, "kamimine": _2, "kanzaki": _2, "karatsu": _2, "kashima": _2, "kitagata": _2, "kitahata": _2, "kiyama": _2, "kouhoku": _2, "kyuragi": _2, "nishiarita": _2, "ogi": _2, "omachi": _2, "ouchi": _2, "saga": _2, "shiroishi": _2, "taku": _2, "tara": _2, "tosu": _2, "yoshinogari": _2 }], "saitama": [1, { "arakawa": _2, "asaka": _2, "chichibu": _2, "fujimi": _2, "fujimino": _2, "fukaya": _2, "hanno": _2, "hanyu": _2, "hasuda": _2, "hatogaya": _2, "hatoyama": _2, "hidaka": _2, "higashichichibu": _2, "higashimatsuyama": _2, "honjo": _2, "ina": _2, "iruma": _2, "iwatsuki": _2, "kamiizumi": _2, "kamikawa": _2, "kamisato": _2, "kasukabe": _2, "kawagoe": _2, "kawaguchi": _2, "kawajima": _2, "kazo": _2, "kitamoto": _2, "koshigaya": _2, "kounosu": _2, "kuki": _2, "kumagaya": _2, "matsubushi": _2, "minano": _2, "misato": _2, "miyashiro": _2, "miyoshi": _2, "moroyama": _2, "nagatoro": _2, "namegawa": _2, "niiza": _2, "ogano": _2, "ogawa": _2, "ogose": _2, "okegawa": _2, "omiya": _2, "otaki": _2, "ranzan": _2, "ryokami": _2, "saitama": _2, "sakado": _2, "satte": _2, "sayama": _2, "shiki": _2, "shiraoka": _2, "soka": _2, "sugito": _2, "toda": _2, "tokigawa": _2, "tokorozawa": _2, "tsurugashima": _2, "urawa": _2, "warabi": _2, "yashio": _2, "yokoze": _2, "yono": _2, "yorii": _2, "yoshida": _2, "yoshikawa": _2, "yoshimi": _2 }], "shiga": [1, { "aisho": _2, "gamo": _2, "higashiomi": _2, "hikone": _2, "koka": _2, "konan": _2, "kosei": _2, "koto": _2, "kusatsu": _2, "maibara": _2, "moriyama": _2, "nagahama": _2, "nishiazai": _2, "notogawa": _2, "omihachiman": _2, "otsu": _2, "ritto": _2, "ryuoh": _2, "takashima": _2, "takatsuki": _2, "torahime": _2, "toyosato": _2, "yasu": _2 }], "shimane": [1, { "akagi": _2, "ama": _2, "gotsu": _2, "hamada": _2, "higashiizumo": _2, "hikawa": _2, "hikimi": _2, "izumo": _2, "kakinoki": _2, "masuda": _2, "matsue": _2, "misato": _2, "nishinoshima": _2, "ohda": _2, "okinoshima": _2, "okuizumo": _2, "shimane": _2, "tamayu": _2, "tsuwano": _2, "unnan": _2, "yakumo": _2, "yasugi": _2, "yatsuka": _2 }], "shizuoka": [1, { "arai": _2, "atami": _2, "fuji": _2, "fujieda": _2, "fujikawa": _2, "fujinomiya": _2, "fukuroi": _2, "gotemba": _2, "haibara": _2, "hamamatsu": _2, "higashiizu": _2, "ito": _2, "iwata": _2, "izu": _2, "izunokuni": _2, "kakegawa": _2, "kannami": _2, "kawanehon": _2, "kawazu": _2, "kikugawa": _2, "kosai": _2, "makinohara": _2, "matsuzaki": _2, "minamiizu": _2, "mishima": _2, "morimachi": _2, "nishiizu": _2, "numazu": _2, "omaezaki": _2, "shimada": _2, "shimizu": _2, "shimoda": _2, "shizuoka": _2, "susono": _2, "yaizu": _2, "yoshida": _2 }], "tochigi": [1, { "ashikaga": _2, "bato": _2, "haga": _2, "ichikai": _2, "iwafune": _2, "kaminokawa": _2, "kanuma": _2, "karasuyama": _2, "kuroiso": _2, "mashiko": _2, "mibu": _2, "moka": _2, "motegi": _2, "nasu": _2, "nasushiobara": _2, "nikko": _2, "nishikata": _2, "nogi": _2, "ohira": _2, "ohtawara": _2, "oyama": _2, "sakura": _2, "sano": _2, "shimotsuke": _2, "shioya": _2, "takanezawa": _2, "tochigi": _2, "tsuga": _2, "ujiie": _2, "utsunomiya": _2, "yaita": _2 }], "tokushima": [1, { "aizumi": _2, "anan": _2, "ichiba": _2, "itano": _2, "kainan": _2, "komatsushima": _2, "matsushige": _2, "mima": _2, "minami": _2, "miyoshi": _2, "mugi": _2, "nakagawa": _2, "naruto": _2, "sanagochi": _2, "shishikui": _2, "tokushima": _2, "wajiki": _2 }], "tokyo": [1, { "adachi": _2, "akiruno": _2, "akishima": _2, "aogashima": _2, "arakawa": _2, "bunkyo": _2, "chiyoda": _2, "chofu": _2, "chuo": _2, "edogawa": _2, "fuchu": _2, "fussa": _2, "hachijo": _2, "hachioji": _2, "hamura": _2, "higashikurume": _2, "higashimurayama": _2, "higashiyamato": _2, "hino": _2, "hinode": _2, "hinohara": _2, "inagi": _2, "itabashi": _2, "katsushika": _2, "kita": _2, "kiyose": _2, "kodaira": _2, "koganei": _2, "kokubunji": _2, "komae": _2, "koto": _2, "kouzushima": _2, "kunitachi": _2, "machida": _2, "meguro": _2, "minato": _2, "mitaka": _2, "mizuho": _2, "musashimurayama": _2, "musashino": _2, "nakano": _2, "nerima": _2, "ogasawara": _2, "okutama": _2, "ome": _2, "oshima": _2, "ota": _2, "setagaya": _2, "shibuya": _2, "shinagawa": _2, "shinjuku": _2, "suginami": _2, "sumida": _2, "tachikawa": _2, "taito": _2, "tama": _2, "toshima": _2 }], "tottori": [1, { "chizu": _2, "hino": _2, "kawahara": _2, "koge": _2, "kotoura": _2, "misasa": _2, "nanbu": _2, "nichinan": _2, "sakaiminato": _2, "tottori": _2, "wakasa": _2, "yazu": _2, "yonago": _2 }], "toyama": [1, { "asahi": _2, "fuchu": _2, "fukumitsu": _2, "funahashi": _2, "himi": _2, "imizu": _2, "inami": _2, "johana": _2, "kamiichi": _2, "kurobe": _2, "nakaniikawa": _2, "namerikawa": _2, "nanto": _2, "nyuzen": _2, "oyabe": _2, "taira": _2, "takaoka": _2, "tateyama": _2, "toga": _2, "tonami": _2, "toyama": _2, "unazuki": _2, "uozu": _2, "yamada": _2 }], "wakayama": [1, { "arida": _2, "aridagawa": _2, "gobo": _2, "hashimoto": _2, "hidaka": _2, "hirogawa": _2, "inami": _2, "iwade": _2, "kainan": _2, "kamitonda": _2, "katsuragi": _2, "kimino": _2, "kinokawa": _2, "kitayama": _2, "koya": _2, "koza": _2, "kozagawa": _2, "kudoyama": _2, "kushimoto": _2, "mihama": _2, "misato": _2, "nachikatsuura": _2, "shingu": _2, "shirahama": _2, "taiji": _2, "tanabe": _2, "wakayama": _2, "yuasa": _2, "yura": _2 }], "yamagata": [1, { "asahi": _2, "funagata": _2, "higashine": _2, "iide": _2, "kahoku": _2, "kaminoyama": _2, "kaneyama": _2, "kawanishi": _2, "mamurogawa": _2, "mikawa": _2, "murayama": _2, "nagai": _2, "nakayama": _2, "nanyo": _2, "nishikawa": _2, "obanazawa": _2, "oe": _2, "oguni": _2, "ohkura": _2, "oishida": _2, "sagae": _2, "sakata": _2, "sakegawa": _2, "shinjo": _2, "shirataka": _2, "shonai": _2, "takahata": _2, "tendo": _2, "tozawa": _2, "tsuruoka": _2, "yamagata": _2, "yamanobe": _2, "yonezawa": _2, "yuza": _2 }], "yamaguchi": [1, { "abu": _2, "hagi": _2, "hikari": _2, "hofu": _2, "iwakuni": _2, "kudamatsu": _2, "mitou": _2, "nagato": _2, "oshima": _2, "shimonoseki": _2, "shunan": _2, "tabuse": _2, "tokuyama": _2, "toyota": _2, "ube": _2, "yuu": _2 }], "yamanashi": [1, { "chuo": _2, "doshi": _2, "fuefuki": _2, "fujikawa": _2, "fujikawaguchiko": _2, "fujiyoshida": _2, "hayakawa": _2, "hokuto": _2, "ichikawamisato": _2, "kai": _2, "kofu": _2, "koshu": _2, "kosuge": _2, "minami-alps": _2, "minobu": _2, "nakamichi": _2, "nanbu": _2, "narusawa": _2, "nirasaki": _2, "nishikatsura": _2, "oshino": _2, "otsuki": _2, "showa": _2, "tabayama": _2, "tsuru": _2, "uenohara": _2, "yamanakako": _2, "yamanashi": _2 }], "xn--ehqz56n": _2, "\u4E09\u91CD": _2, "xn--1lqs03n": _2, "\u4EAC\u90FD": _2, "xn--qqqt11m": _2, "\u4F50\u8CC0": _2, "xn--f6qx53a": _2, "\u5175\u5EAB": _2, "xn--djrs72d6uy": _2, "\u5317\u6D77\u9053": _2, "xn--mkru45i": _2, "\u5343\u8449": _2, "xn--0trq7p7nn": _2, "\u548C\u6B4C\u5C71": _2, "xn--5js045d": _2, "\u57FC\u7389": _2, "xn--kbrq7o": _2, "\u5927\u5206": _2, "xn--pssu33l": _2, "\u5927\u962A": _2, "xn--ntsq17g": _2, "\u5948\u826F": _2, "xn--uisz3g": _2, "\u5BAE\u57CE": _2, "xn--6btw5a": _2, "\u5BAE\u5D0E": _2, "xn--1ctwo": _2, "\u5BCC\u5C71": _2, "xn--6orx2r": _2, "\u5C71\u53E3": _2, "xn--rht61e": _2, "\u5C71\u5F62": _2, "xn--rht27z": _2, "\u5C71\u68A8": _2, "xn--nit225k": _2, "\u5C90\u961C": _2, "xn--rht3d": _2, "\u5CA1\u5C71": _2, "xn--djty4k": _2, "\u5CA9\u624B": _2, "xn--klty5x": _2, "\u5CF6\u6839": _2, "xn--kltx9a": _2, "\u5E83\u5CF6": _2, "xn--kltp7d": _2, "\u5FB3\u5CF6": _2, "xn--c3s14m": _2, "\u611B\u5A9B": _2, "xn--vgu402c": _2, "\u611B\u77E5": _2, "xn--efvn9s": _2, "\u65B0\u6F5F": _2, "xn--1lqs71d": _2, "\u6771\u4EAC": _2, "xn--4pvxs": _2, "\u6803\u6728": _2, "xn--uuwu58a": _2, "\u6C96\u7E04": _2, "xn--zbx025d": _2, "\u6ECB\u8CC0": _2, "xn--8pvr4u": _2, "\u718A\u672C": _2, "xn--5rtp49c": _2, "\u77F3\u5DDD": _2, "xn--ntso0iqx3a": _2, "\u795E\u5948\u5DDD": _2, "xn--elqq16h": _2, "\u798F\u4E95": _2, "xn--4it168d": _2, "\u798F\u5CA1": _2, "xn--klt787d": _2, "\u798F\u5CF6": _2, "xn--rny31h": _2, "\u79CB\u7530": _2, "xn--7t0a264c": _2, "\u7FA4\u99AC": _2, "xn--uist22h": _2, "\u8328\u57CE": _2, "xn--8ltr62k": _2, "\u9577\u5D0E": _2, "xn--2m4a15e": _2, "\u9577\u91CE": _2, "xn--32vp30h": _2, "\u9752\u68EE": _2, "xn--4it797k": _2, "\u9759\u5CA1": _2, "xn--5rtq34k": _2, "\u9999\u5DDD": _2, "xn--k7yn95e": _2, "\u9AD8\u77E5": _2, "xn--tor131o": _2, "\u9CE5\u53D6": _2, "xn--d5qv7z876c": _2, "\u9E7F\u5150\u5CF6": _2, "kawasaki": _20, "kitakyushu": _20, "kobe": _20, "nagoya": _20, "sapporo": _20, "sendai": _20, "yokohama": _20, "buyshop": _3, "fashionstore": _3, "handcrafted": _3, "kawaiishop": _3, "supersale": _3, "theshop": _3, "0am": _3, "0g0": _3, "0j0": _3, "0t0": _3, "mydns": _3, "pgw": _3, "wjg": _3, "usercontent": _3, "angry": _3, "babyblue": _3, "babymilk": _3, "backdrop": _3, "bambina": _3, "bitter": _3, "blush": _3, "boo": _3, "boy": _3, "boyfriend": _3, "but": _3, "candypop": _3, "capoo": _3, "catfood": _3, "cheap": _3, "chicappa": _3, "chillout": _3, "chips": _3, "chowder": _3, "chu": _3, "ciao": _3, "cocotte": _3, "coolblog": _3, "cranky": _3, "cutegirl": _3, "daa": _3, "deca": _3, "deci": _3, "digick": _3, "egoism": _3, "fakefur": _3, "fem": _3, "flier": _3, "floppy": _3, "fool": _3, "frenchkiss": _3, "girlfriend": _3, "girly": _3, "gloomy": _3, "gonna": _3, "greater": _3, "hacca": _3, "heavy": _3, "her": _3, "hiho": _3, "hippy": _3, "holy": _3, "hungry": _3, "icurus": _3, "itigo": _3, "jellybean": _3, "kikirara": _3, "kill": _3, "kilo": _3, "kuron": _3, "littlestar": _3, "lolipopmc": _3, "lolitapunk": _3, "lomo": _3, "lovepop": _3, "lovesick": _3, "main": _3, "mods": _3, "mond": _3, "mongolian": _3, "moo": _3, "namaste": _3, "nikita": _3, "nobushi": _3, "noor": _3, "oops": _3, "parallel": _3, "parasite": _3, "pecori": _3, "peewee": _3, "penne": _3, "pepper": _3, "perma": _3, "pigboat": _3, "pinoko": _3, "punyu": _3, "pupu": _3, "pussycat": _3, "pya": _3, "raindrop": _3, "readymade": _3, "sadist": _3, "schoolbus": _3, "secret": _3, "staba": _3, "stripper": _3, "sub": _3, "sunnyday": _3, "thick": _3, "tonkotsu": _3, "under": _3, "upper": _3, "velvet": _3, "verse": _3, "versus": _3, "vivian": _3, "watson": _3, "weblike": _3, "whitesnow": _3, "zombie": _3, "hateblo": _3, "hatenablog": _3, "hatenadiary": _3, "2-d": _3, "bona": _3, "crap": _3, "daynight": _3, "eek": _3, "flop": _3, "halfmoon": _3, "jeez": _3, "matrix": _3, "mimoza": _3, "netgamers": _3, "nyanta": _3, "o0o0": _3, "rdy": _3, "rgr": _3, "rulez": _3, "sakurastorage": [0, { "isk01": _58, "isk02": _58 }], "saloon": _3, "sblo": _3, "skr": _3, "tank": _3, "uh-oh": _3, "undo": _3, "webaccel": [0, { "rs": _3, "user": _3 }], "websozai": _3, "xii": _3 }], "ke": [1, { "ac": _2, "co": _2, "go": _2, "info": _2, "me": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2 }], "kg": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "us": _3, "xx": _3 }], "kh": _20, "ki": _59, "km": [1, { "ass": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "nom": _2, "org": _2, "prd": _2, "tm": _2, "asso": _2, "coop": _2, "gouv": _2, "medecin": _2, "notaires": _2, "pharmaciens": _2, "presse": _2, "veterinaire": _2 }], "kn": [1, { "edu": _2, "gov": _2, "net": _2, "org": _2 }], "kp": [1, { "com": _2, "edu": _2, "gov": _2, "org": _2, "rep": _2, "tra": _2 }], "kr": [1, { "ac": _2, "ai": _2, "co": _2, "es": _2, "go": _2, "hs": _2, "io": _2, "it": _2, "kg": _2, "me": _2, "mil": _2, "ms": _2, "ne": _2, "or": _2, "pe": _2, "re": _2, "sc": _2, "busan": _2, "chungbuk": _2, "chungnam": _2, "daegu": _2, "daejeon": _2, "gangwon": _2, "gwangju": _2, "gyeongbuk": _2, "gyeonggi": _2, "gyeongnam": _2, "incheon": _2, "jeju": _2, "jeonbuk": _2, "jeonnam": _2, "seoul": _2, "ulsan": _2, "c01": _3, "eliv-cdn": _3, "eliv-dns": _3, "mmv": _3, "vki": _3 }], "kw": [1, { "com": _2, "edu": _2, "emb": _2, "gov": _2, "ind": _2, "net": _2, "org": _2 }], "ky": _47, "kz": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "jcloud": _3 }], "la": [1, { "com": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "net": _2, "org": _2, "per": _2, "bnr": _3 }], "lb": _4, "lc": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "oy": _3 }], "li": _2, "lk": [1, { "ac": _2, "assn": _2, "com": _2, "edu": _2, "gov": _2, "grp": _2, "hotel": _2, "int": _2, "ltd": _2, "net": _2, "ngo": _2, "org": _2, "sch": _2, "soc": _2, "web": _2 }], "lr": _4, "ls": [1, { "ac": _2, "biz": _2, "co": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "sc": _2 }], "lt": _10, "lu": [1, { "123website": _3 }], "lv": [1, { "asn": _2, "com": _2, "conf": _2, "edu": _2, "gov": _2, "id": _2, "mil": _2, "net": _2, "org": _2 }], "ly": [1, { "com": _2, "edu": _2, "gov": _2, "id": _2, "med": _2, "net": _2, "org": _2, "plc": _2, "sch": _2 }], "ma": [1, { "ac": _2, "co": _2, "gov": _2, "net": _2, "org": _2, "press": _2 }], "mc": [1, { "asso": _2, "tm": _2 }], "md": [1, { "ir": _3 }], "me": [1, { "ac": _2, "co": _2, "edu": _2, "gov": _2, "its": _2, "net": _2, "org": _2, "priv": _2, "c66": _3, "craft": _3, "edgestack": _3, "filegear": _3, "filegear-sg": _3, "lohmus": _3, "barsy": _3, "mcdir": _3, "brasilia": _3, "ddns": _3, "dnsfor": _3, "hopto": _3, "loginto": _3, "noip": _3, "webhop": _3, "soundcast": _3, "tcp4": _3, "vp4": _3, "diskstation": _3, "dscloud": _3, "i234": _3, "myds": _3, "synology": _3, "transip": _46, "nohost": _3 }], "mg": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "nom": _2, "org": _2, "prd": _2 }], "mh": _2, "mil": _2, "mk": [1, { "com": _2, "edu": _2, "gov": _2, "inf": _2, "name": _2, "net": _2, "org": _2 }], "ml": [1, { "ac": _2, "art": _2, "asso": _2, "com": _2, "edu": _2, "gouv": _2, "gov": _2, "info": _2, "inst": _2, "net": _2, "org": _2, "pr": _2, "presse": _2 }], "mm": _20, "mn": [1, { "edu": _2, "gov": _2, "org": _2, "nyc": _3 }], "mo": _4, "mobi": [1, { "barsy": _3, "dscloud": _3 }], "mp": [1, { "ju": _3 }], "mq": _2, "mr": _10, "ms": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "minisite": _3 }], "mt": _47, "mu": [1, { "ac": _2, "co": _2, "com": _2, "gov": _2, "net": _2, "or": _2, "org": _2 }], "museum": _2, "mv": [1, { "aero": _2, "biz": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "museum": _2, "name": _2, "net": _2, "org": _2, "pro": _2 }], "mw": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "int": _2, "net": _2, "org": _2 }], "mx": [1, { "com": _2, "edu": _2, "gob": _2, "net": _2, "org": _2 }], "my": [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2 }], "mz": [1, { "ac": _2, "adv": _2, "co": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "na": [1, { "alt": _2, "co": _2, "com": _2, "gov": _2, "net": _2, "org": _2 }], "name": [1, { "her": _62, "his": _62 }], "nc": [1, { "asso": _2, "nom": _2 }], "ne": _2, "net": [1, { "adobeaemcloud": _3, "adobeio-static": _3, "adobeioruntime": _3, "akadns": _3, "akamai": _3, "akamai-staging": _3, "akamaiedge": _3, "akamaiedge-staging": _3, "akamaihd": _3, "akamaihd-staging": _3, "akamaiorigin": _3, "akamaiorigin-staging": _3, "akamaized": _3, "akamaized-staging": _3, "edgekey": _3, "edgekey-staging": _3, "edgesuite": _3, "edgesuite-staging": _3, "alwaysdata": _3, "myamaze": _3, "cloudfront": _3, "appudo": _3, "atlassian-dev": [0, { "prod": _54 }], "myfritz": _3, "onavstack": _3, "shopselect": _3, "blackbaudcdn": _3, "boomla": _3, "bplaced": _3, "square7": _3, "cdn77": [0, { "r": _3 }], "cdn77-ssl": _3, "gb": _3, "hu": _3, "jp": _3, "se": _3, "uk": _3, "clickrising": _3, "ddns-ip": _3, "dns-cloud": _3, "dns-dynamic": _3, "cloudaccess": _3, "cloudflare": [2, { "cdn": _3 }], "cloudflareanycast": _54, "cloudflarecn": _54, "cloudflareglobal": _54, "ctfcloud": _3, "feste-ip": _3, "knx-server": _3, "static-access": _3, "cryptonomic": _6, "dattolocal": _3, "mydatto": _3, "debian": _3, "definima": _3, "deno": _3, "icp": _6, "at-band-camp": _3, "blogdns": _3, "broke-it": _3, "buyshouses": _3, "dnsalias": _3, "dnsdojo": _3, "does-it": _3, "dontexist": _3, "dynalias": _3, "dynathome": _3, "endofinternet": _3, "from-az": _3, "from-co": _3, "from-la": _3, "from-ny": _3, "gets-it": _3, "ham-radio-op": _3, "homeftp": _3, "homeip": _3, "homelinux": _3, "homeunix": _3, "in-the-band": _3, "is-a-chef": _3, "is-a-geek": _3, "isa-geek": _3, "kicks-ass": _3, "office-on-the": _3, "podzone": _3, "scrapper-site": _3, "selfip": _3, "sells-it": _3, "servebbs": _3, "serveftp": _3, "thruhere": _3, "webhop": _3, "casacam": _3, "dynu": _3, "dynv6": _3, "twmail": _3, "ru": _3, "channelsdvr": [2, { "u": _3 }], "fastly": [0, { "freetls": _3, "map": _3, "prod": [0, { "a": _3, "global": _3 }], "ssl": [0, { "a": _3, "b": _3, "global": _3 }] }], "fastlylb": [2, { "map": _3 }], "edgeapp": _3, "keyword-on": _3, "live-on": _3, "server-on": _3, "cdn-edges": _3, "heteml": _3, "cloudfunctions": _3, "grafana-dev": _3, "iobb": _3, "moonscale": _3, "in-dsl": _3, "in-vpn": _3, "oninferno": _3, "botdash": _3, "apps-1and1": _3, "ipifony": _3, "cloudjiffy": [2, { "fra1-de": _3, "west1-us": _3 }], "elastx": [0, { "jls-sto1": _3, "jls-sto2": _3, "jls-sto3": _3 }], "massivegrid": [0, { "paas": [0, { "fr-1": _3, "lon-1": _3, "lon-2": _3, "ny-1": _3, "ny-2": _3, "sg-1": _3 }] }], "saveincloud": [0, { "jelastic": _3, "nordeste-idc": _3 }], "scaleforce": _48, "kinghost": _3, "uni5": _3, "krellian": _3, "ggff": _3, "localto": _6, "barsy": _3, "luyani": _3, "memset": _3, "azure-api": _3, "azure-mobile": _3, "azureedge": _3, "azurefd": _3, "azurestaticapps": [2, { "1": _3, "2": _3, "3": _3, "4": _3, "5": _3, "6": _3, "7": _3, "centralus": _3, "eastasia": _3, "eastus2": _3, "westeurope": _3, "westus2": _3 }], "azurewebsites": _3, "cloudapp": _3, "trafficmanager": _3, "windows": [0, { "core": [0, { "blob": _3 }], "servicebus": _3 }], "mynetname": [0, { "sn": _3 }], "routingthecloud": _3, "bounceme": _3, "ddns": _3, "eating-organic": _3, "mydissent": _3, "myeffect": _3, "mymediapc": _3, "mypsx": _3, "mysecuritycamera": _3, "nhlfan": _3, "no-ip": _3, "pgafan": _3, "privatizehealthinsurance": _3, "redirectme": _3, "serveblog": _3, "serveminecraft": _3, "sytes": _3, "dnsup": _3, "hicam": _3, "now-dns": _3, "ownip": _3, "vpndns": _3, "cloudycluster": _3, "ovh": [0, { "hosting": _6, "webpaas": _6 }], "rackmaze": _3, "myradweb": _3, "in": _3, "subsc-pay": _3, "squares": _3, "schokokeks": _3, "firewall-gateway": _3, "seidat": _3, "senseering": _3, "siteleaf": _3, "mafelo": _3, "myspreadshop": _3, "vps-host": [2, { "jelastic": [0, { "atl": _3, "njs": _3, "ric": _3 }] }], "srcf": [0, { "soc": _3, "user": _3 }], "supabase": _3, "dsmynas": _3, "familyds": _3, "ts": [2, { "c": _6 }], "torproject": [2, { "pages": _3 }], "vusercontent": _3, "reserve-online": _3, "localcert": _3, "community-pro": _3, "meinforum": _3, "yandexcloud": [2, { "storage": _3, "website": _3 }], "za": _3, "zabc": _3 }], "nf": [1, { "arts": _2, "com": _2, "firm": _2, "info": _2, "net": _2, "other": _2, "per": _2, "rec": _2, "store": _2, "web": _2 }], "ng": [1, { "com": _2, "edu": _2, "gov": _2, "i": _2, "mil": _2, "mobi": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "biz": [2, { "co": _3, "dl": _3, "go": _3, "lg": _3, "on": _3 }], "col": _3, "firm": _3, "gen": _3, "ltd": _3, "ngo": _3, "plc": _3 }], "ni": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gob": _2, "in": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "web": _2 }], "nl": [1, { "co": _3, "hosting-cluster": _3, "gov": _3, "khplay": _3, "123website": _3, "myspreadshop": _3, "transurl": _6, "cistron": _3, "demon": _3 }], "no": [1, { "fhs": _2, "folkebibl": _2, "fylkesbibl": _2, "idrett": _2, "museum": _2, "priv": _2, "vgs": _2, "dep": _2, "herad": _2, "kommune": _2, "mil": _2, "stat": _2, "aa": _63, "ah": _63, "bu": _63, "fm": _63, "hl": _63, "hm": _63, "jan-mayen": _63, "mr": _63, "nl": _63, "nt": _63, "of": _63, "ol": _63, "oslo": _63, "rl": _63, "sf": _63, "st": _63, "svalbard": _63, "tm": _63, "tr": _63, "va": _63, "vf": _63, "akrehamn": _2, "xn--krehamn-dxa": _2, "\xE5krehamn": _2, "algard": _2, "xn--lgrd-poac": _2, "\xE5lg\xE5rd": _2, "arna": _2, "bronnoysund": _2, "xn--brnnysund-m8ac": _2, "br\xF8nn\xF8ysund": _2, "brumunddal": _2, "bryne": _2, "drobak": _2, "xn--drbak-wua": _2, "dr\xF8bak": _2, "egersund": _2, "fetsund": _2, "floro": _2, "xn--flor-jra": _2, "flor\xF8": _2, "fredrikstad": _2, "hokksund": _2, "honefoss": _2, "xn--hnefoss-q1a": _2, "h\xF8nefoss": _2, "jessheim": _2, "jorpeland": _2, "xn--jrpeland-54a": _2, "j\xF8rpeland": _2, "kirkenes": _2, "kopervik": _2, "krokstadelva": _2, "langevag": _2, "xn--langevg-jxa": _2, "langev\xE5g": _2, "leirvik": _2, "mjondalen": _2, "xn--mjndalen-64a": _2, "mj\xF8ndalen": _2, "mo-i-rana": _2, "mosjoen": _2, "xn--mosjen-eya": _2, "mosj\xF8en": _2, "nesoddtangen": _2, "orkanger": _2, "osoyro": _2, "xn--osyro-wua": _2, "os\xF8yro": _2, "raholt": _2, "xn--rholt-mra": _2, "r\xE5holt": _2, "sandnessjoen": _2, "xn--sandnessjen-ogb": _2, "sandnessj\xF8en": _2, "skedsmokorset": _2, "slattum": _2, "spjelkavik": _2, "stathelle": _2, "stavern": _2, "stjordalshalsen": _2, "xn--stjrdalshalsen-sqb": _2, "stj\xF8rdalshalsen": _2, "tananger": _2, "tranby": _2, "vossevangen": _2, "aarborte": _2, "aejrie": _2, "afjord": _2, "xn--fjord-lra": _2, "\xE5fjord": _2, "agdenes": _2, "akershus": _64, "aknoluokta": _2, "xn--koluokta-7ya57h": _2, "\xE1k\u014Boluokta": _2, "al": _2, "xn--l-1fa": _2, "\xE5l": _2, "alaheadju": _2, "xn--laheadju-7ya": _2, "\xE1laheadju": _2, "alesund": _2, "xn--lesund-hua": _2, "\xE5lesund": _2, "alstahaug": _2, "alta": _2, "xn--lt-liac": _2, "\xE1lt\xE1": _2, "alvdal": _2, "amli": _2, "xn--mli-tla": _2, "\xE5mli": _2, "amot": _2, "xn--mot-tla": _2, "\xE5mot": _2, "andasuolo": _2, "andebu": _2, "andoy": _2, "xn--andy-ira": _2, "and\xF8y": _2, "ardal": _2, "xn--rdal-poa": _2, "\xE5rdal": _2, "aremark": _2, "arendal": _2, "xn--s-1fa": _2, "\xE5s": _2, "aseral": _2, "xn--seral-lra": _2, "\xE5seral": _2, "asker": _2, "askim": _2, "askoy": _2, "xn--asky-ira": _2, "ask\xF8y": _2, "askvoll": _2, "asnes": _2, "xn--snes-poa": _2, "\xE5snes": _2, "audnedaln": _2, "aukra": _2, "aure": _2, "aurland": _2, "aurskog-holand": _2, "xn--aurskog-hland-jnb": _2, "aurskog-h\xF8land": _2, "austevoll": _2, "austrheim": _2, "averoy": _2, "xn--avery-yua": _2, "aver\xF8y": _2, "badaddja": _2, "xn--bdddj-mrabd": _2, "b\xE5d\xE5ddj\xE5": _2, "xn--brum-voa": _2, "b\xE6rum": _2, "bahcavuotna": _2, "xn--bhcavuotna-s4a": _2, "b\xE1hcavuotna": _2, "bahccavuotna": _2, "xn--bhccavuotna-k7a": _2, "b\xE1hccavuotna": _2, "baidar": _2, "xn--bidr-5nac": _2, "b\xE1id\xE1r": _2, "bajddar": _2, "xn--bjddar-pta": _2, "b\xE1jddar": _2, "balat": _2, "xn--blt-elab": _2, "b\xE1l\xE1t": _2, "balestrand": _2, "ballangen": _2, "balsfjord": _2, "bamble": _2, "bardu": _2, "barum": _2, "batsfjord": _2, "xn--btsfjord-9za": _2, "b\xE5tsfjord": _2, "bearalvahki": _2, "xn--bearalvhki-y4a": _2, "bearalv\xE1hki": _2, "beardu": _2, "beiarn": _2, "berg": _2, "bergen": _2, "berlevag": _2, "xn--berlevg-jxa": _2, "berlev\xE5g": _2, "bievat": _2, "xn--bievt-0qa": _2, "biev\xE1t": _2, "bindal": _2, "birkenes": _2, "bjarkoy": _2, "xn--bjarky-fya": _2, "bjark\xF8y": _2, "bjerkreim": _2, "bjugn": _2, "bodo": _2, "xn--bod-2na": _2, "bod\xF8": _2, "bokn": _2, "bomlo": _2, "xn--bmlo-gra": _2, "b\xF8mlo": _2, "bremanger": _2, "bronnoy": _2, "xn--brnny-wuac": _2, "br\xF8nn\xF8y": _2, "budejju": _2, "buskerud": _64, "bygland": _2, "bykle": _2, "cahcesuolo": _2, "xn--hcesuolo-7ya35b": _2, "\u010D\xE1hcesuolo": _2, "davvenjarga": _2, "xn--davvenjrga-y4a": _2, "davvenj\xE1rga": _2, "davvesiida": _2, "deatnu": _2, "dielddanuorri": _2, "divtasvuodna": _2, "divttasvuotna": _2, "donna": _2, "xn--dnna-gra": _2, "d\xF8nna": _2, "dovre": _2, "drammen": _2, "drangedal": _2, "dyroy": _2, "xn--dyry-ira": _2, "dyr\xF8y": _2, "eid": _2, "eidfjord": _2, "eidsberg": _2, "eidskog": _2, "eidsvoll": _2, "eigersund": _2, "elverum": _2, "enebakk": _2, "engerdal": _2, "etne": _2, "etnedal": _2, "evenassi": _2, "xn--eveni-0qa01ga": _2, "even\xE1\u0161\u0161i": _2, "evenes": _2, "evje-og-hornnes": _2, "farsund": _2, "fauske": _2, "fedje": _2, "fet": _2, "finnoy": _2, "xn--finny-yua": _2, "finn\xF8y": _2, "fitjar": _2, "fjaler": _2, "fjell": _2, "fla": _2, "xn--fl-zia": _2, "fl\xE5": _2, "flakstad": _2, "flatanger": _2, "flekkefjord": _2, "flesberg": _2, "flora": _2, "folldal": _2, "forde": _2, "xn--frde-gra": _2, "f\xF8rde": _2, "forsand": _2, "fosnes": _2, "xn--frna-woa": _2, "fr\xE6na": _2, "frana": _2, "frei": _2, "frogn": _2, "froland": _2, "frosta": _2, "froya": _2, "xn--frya-hra": _2, "fr\xF8ya": _2, "fuoisku": _2, "fuossko": _2, "fusa": _2, "fyresdal": _2, "gaivuotna": _2, "xn--givuotna-8ya": _2, "g\xE1ivuotna": _2, "galsa": _2, "xn--gls-elac": _2, "g\xE1ls\xE1": _2, "gamvik": _2, "gangaviika": _2, "xn--ggaviika-8ya47h": _2, "g\xE1\u014Bgaviika": _2, "gaular": _2, "gausdal": _2, "giehtavuoatna": _2, "gildeskal": _2, "xn--gildeskl-g0a": _2, "gildesk\xE5l": _2, "giske": _2, "gjemnes": _2, "gjerdrum": _2, "gjerstad": _2, "gjesdal": _2, "gjovik": _2, "xn--gjvik-wua": _2, "gj\xF8vik": _2, "gloppen": _2, "gol": _2, "gran": _2, "grane": _2, "granvin": _2, "gratangen": _2, "grimstad": _2, "grong": _2, "grue": _2, "gulen": _2, "guovdageaidnu": _2, "ha": _2, "xn--h-2fa": _2, "h\xE5": _2, "habmer": _2, "xn--hbmer-xqa": _2, "h\xE1bmer": _2, "hadsel": _2, "xn--hgebostad-g3a": _2, "h\xE6gebostad": _2, "hagebostad": _2, "halden": _2, "halsa": _2, "hamar": _2, "hamaroy": _2, "hammarfeasta": _2, "xn--hmmrfeasta-s4ac": _2, "h\xE1mm\xE1rfeasta": _2, "hammerfest": _2, "hapmir": _2, "xn--hpmir-xqa": _2, "h\xE1pmir": _2, "haram": _2, "hareid": _2, "harstad": _2, "hasvik": _2, "hattfjelldal": _2, "haugesund": _2, "hedmark": [0, { "os": _2, "valer": _2, "xn--vler-qoa": _2, "v\xE5ler": _2 }], "hemne": _2, "hemnes": _2, "hemsedal": _2, "hitra": _2, "hjartdal": _2, "hjelmeland": _2, "hobol": _2, "xn--hobl-ira": _2, "hob\xF8l": _2, "hof": _2, "hol": _2, "hole": _2, "holmestrand": _2, "holtalen": _2, "xn--holtlen-hxa": _2, "holt\xE5len": _2, "hordaland": [0, { "os": _2 }], "hornindal": _2, "horten": _2, "hoyanger": _2, "xn--hyanger-q1a": _2, "h\xF8yanger": _2, "hoylandet": _2, "xn--hylandet-54a": _2, "h\xF8ylandet": _2, "hurdal": _2, "hurum": _2, "hvaler": _2, "hyllestad": _2, "ibestad": _2, "inderoy": _2, "xn--indery-fya": _2, "inder\xF8y": _2, "iveland": _2, "ivgu": _2, "jevnaker": _2, "jolster": _2, "xn--jlster-bya": _2, "j\xF8lster": _2, "jondal": _2, "kafjord": _2, "xn--kfjord-iua": _2, "k\xE5fjord": _2, "karasjohka": _2, "xn--krjohka-hwab49j": _2, "k\xE1r\xE1\u0161johka": _2, "karasjok": _2, "karlsoy": _2, "karmoy": _2, "xn--karmy-yua": _2, "karm\xF8y": _2, "kautokeino": _2, "klabu": _2, "xn--klbu-woa": _2, "kl\xE6bu": _2, "klepp": _2, "kongsberg": _2, "kongsvinger": _2, "kraanghke": _2, "xn--kranghke-b0a": _2, "kr\xE5anghke": _2, "kragero": _2, "xn--krager-gya": _2, "krager\xF8": _2, "kristiansand": _2, "kristiansund": _2, "krodsherad": _2, "xn--krdsherad-m8a": _2, "kr\xF8dsherad": _2, "xn--kvfjord-nxa": _2, "kv\xE6fjord": _2, "xn--kvnangen-k0a": _2, "kv\xE6nangen": _2, "kvafjord": _2, "kvalsund": _2, "kvam": _2, "kvanangen": _2, "kvinesdal": _2, "kvinnherad": _2, "kviteseid": _2, "kvitsoy": _2, "xn--kvitsy-fya": _2, "kvits\xF8y": _2, "laakesvuemie": _2, "xn--lrdal-sra": _2, "l\xE6rdal": _2, "lahppi": _2, "xn--lhppi-xqa": _2, "l\xE1hppi": _2, "lardal": _2, "larvik": _2, "lavagis": _2, "lavangen": _2, "leangaviika": _2, "xn--leagaviika-52b": _2, "lea\u014Bgaviika": _2, "lebesby": _2, "leikanger": _2, "leirfjord": _2, "leka": _2, "leksvik": _2, "lenvik": _2, "lerdal": _2, "lesja": _2, "levanger": _2, "lier": _2, "lierne": _2, "lillehammer": _2, "lillesand": _2, "lindas": _2, "xn--linds-pra": _2, "lind\xE5s": _2, "lindesnes": _2, "loabat": _2, "xn--loabt-0qa": _2, "loab\xE1t": _2, "lodingen": _2, "xn--ldingen-q1a": _2, "l\xF8dingen": _2, "lom": _2, "loppa": _2, "lorenskog": _2, "xn--lrenskog-54a": _2, "l\xF8renskog": _2, "loten": _2, "xn--lten-gra": _2, "l\xF8ten": _2, "lund": _2, "lunner": _2, "luroy": _2, "xn--lury-ira": _2, "lur\xF8y": _2, "luster": _2, "lyngdal": _2, "lyngen": _2, "malatvuopmi": _2, "xn--mlatvuopmi-s4a": _2, "m\xE1latvuopmi": _2, "malselv": _2, "xn--mlselv-iua": _2, "m\xE5lselv": _2, "malvik": _2, "mandal": _2, "marker": _2, "marnardal": _2, "masfjorden": _2, "masoy": _2, "xn--msy-ula0h": _2, "m\xE5s\xF8y": _2, "matta-varjjat": _2, "xn--mtta-vrjjat-k7af": _2, "m\xE1tta-v\xE1rjjat": _2, "meland": _2, "meldal": _2, "melhus": _2, "meloy": _2, "xn--mely-ira": _2, "mel\xF8y": _2, "meraker": _2, "xn--merker-kua": _2, "mer\xE5ker": _2, "midsund": _2, "midtre-gauldal": _2, "moareke": _2, "xn--moreke-jua": _2, "mo\xE5reke": _2, "modalen": _2, "modum": _2, "molde": _2, "more-og-romsdal": [0, { "heroy": _2, "sande": _2 }], "xn--mre-og-romsdal-qqb": [0, { "xn--hery-ira": _2, "sande": _2 }], "m\xF8re-og-romsdal": [0, { "her\xF8y": _2, "sande": _2 }], "moskenes": _2, "moss": _2, "mosvik": _2, "muosat": _2, "xn--muost-0qa": _2, "muos\xE1t": _2, "naamesjevuemie": _2, "xn--nmesjevuemie-tcba": _2, "n\xE5\xE5mesjevuemie": _2, "xn--nry-yla5g": _2, "n\xE6r\xF8y": _2, "namdalseid": _2, "namsos": _2, "namsskogan": _2, "nannestad": _2, "naroy": _2, "narviika": _2, "narvik": _2, "naustdal": _2, "navuotna": _2, "xn--nvuotna-hwa": _2, "n\xE1vuotna": _2, "nedre-eiker": _2, "nesna": _2, "nesodden": _2, "nesseby": _2, "nesset": _2, "nissedal": _2, "nittedal": _2, "nord-aurdal": _2, "nord-fron": _2, "nord-odal": _2, "norddal": _2, "nordkapp": _2, "nordland": [0, { "bo": _2, "xn--b-5ga": _2, "b\xF8": _2, "heroy": _2, "xn--hery-ira": _2, "her\xF8y": _2 }], "nordre-land": _2, "nordreisa": _2, "nore-og-uvdal": _2, "notodden": _2, "notteroy": _2, "xn--nttery-byae": _2, "n\xF8tter\xF8y": _2, "odda": _2, "oksnes": _2, "xn--ksnes-uua": _2, "\xF8ksnes": _2, "omasvuotna": _2, "oppdal": _2, "oppegard": _2, "xn--oppegrd-ixa": _2, "oppeg\xE5rd": _2, "orkdal": _2, "orland": _2, "xn--rland-uua": _2, "\xF8rland": _2, "orskog": _2, "xn--rskog-uua": _2, "\xF8rskog": _2, "orsta": _2, "xn--rsta-fra": _2, "\xF8rsta": _2, "osen": _2, "osteroy": _2, "xn--ostery-fya": _2, "oster\xF8y": _2, "ostfold": [0, { "valer": _2 }], "xn--stfold-9xa": [0, { "xn--vler-qoa": _2 }], "\xF8stfold": [0, { "v\xE5ler": _2 }], "ostre-toten": _2, "xn--stre-toten-zcb": _2, "\xF8stre-toten": _2, "overhalla": _2, "ovre-eiker": _2, "xn--vre-eiker-k8a": _2, "\xF8vre-eiker": _2, "oyer": _2, "xn--yer-zna": _2, "\xF8yer": _2, "oygarden": _2, "xn--ygarden-p1a": _2, "\xF8ygarden": _2, "oystre-slidre": _2, "xn--ystre-slidre-ujb": _2, "\xF8ystre-slidre": _2, "porsanger": _2, "porsangu": _2, "xn--porsgu-sta26f": _2, "pors\xE1\u014Bgu": _2, "porsgrunn": _2, "rade": _2, "xn--rde-ula": _2, "r\xE5de": _2, "radoy": _2, "xn--rady-ira": _2, "rad\xF8y": _2, "xn--rlingen-mxa": _2, "r\xE6lingen": _2, "rahkkeravju": _2, "xn--rhkkervju-01af": _2, "r\xE1hkker\xE1vju": _2, "raisa": _2, "xn--risa-5na": _2, "r\xE1isa": _2, "rakkestad": _2, "ralingen": _2, "rana": _2, "randaberg": _2, "rauma": _2, "rendalen": _2, "rennebu": _2, "rennesoy": _2, "xn--rennesy-v1a": _2, "rennes\xF8y": _2, "rindal": _2, "ringebu": _2, "ringerike": _2, "ringsaker": _2, "risor": _2, "xn--risr-ira": _2, "ris\xF8r": _2, "rissa": _2, "roan": _2, "rodoy": _2, "xn--rdy-0nab": _2, "r\xF8d\xF8y": _2, "rollag": _2, "romsa": _2, "romskog": _2, "xn--rmskog-bya": _2, "r\xF8mskog": _2, "roros": _2, "xn--rros-gra": _2, "r\xF8ros": _2, "rost": _2, "xn--rst-0na": _2, "r\xF8st": _2, "royken": _2, "xn--ryken-vua": _2, "r\xF8yken": _2, "royrvik": _2, "xn--ryrvik-bya": _2, "r\xF8yrvik": _2, "ruovat": _2, "rygge": _2, "salangen": _2, "salat": _2, "xn--slat-5na": _2, "s\xE1lat": _2, "xn--slt-elab": _2, "s\xE1l\xE1t": _2, "saltdal": _2, "samnanger": _2, "sandefjord": _2, "sandnes": _2, "sandoy": _2, "xn--sandy-yua": _2, "sand\xF8y": _2, "sarpsborg": _2, "sauda": _2, "sauherad": _2, "sel": _2, "selbu": _2, "selje": _2, "seljord": _2, "siellak": _2, "sigdal": _2, "siljan": _2, "sirdal": _2, "skanit": _2, "xn--sknit-yqa": _2, "sk\xE1nit": _2, "skanland": _2, "xn--sknland-fxa": _2, "sk\xE5nland": _2, "skaun": _2, "skedsmo": _2, "ski": _2, "skien": _2, "skierva": _2, "xn--skierv-uta": _2, "skierv\xE1": _2, "skiptvet": _2, "skjak": _2, "xn--skjk-soa": _2, "skj\xE5k": _2, "skjervoy": _2, "xn--skjervy-v1a": _2, "skjerv\xF8y": _2, "skodje": _2, "smola": _2, "xn--smla-hra": _2, "sm\xF8la": _2, "snaase": _2, "xn--snase-nra": _2, "sn\xE5ase": _2, "snasa": _2, "xn--snsa-roa": _2, "sn\xE5sa": _2, "snillfjord": _2, "snoasa": _2, "sogndal": _2, "sogne": _2, "xn--sgne-gra": _2, "s\xF8gne": _2, "sokndal": _2, "sola": _2, "solund": _2, "somna": _2, "xn--smna-gra": _2, "s\xF8mna": _2, "sondre-land": _2, "xn--sndre-land-0cb": _2, "s\xF8ndre-land": _2, "songdalen": _2, "sor-aurdal": _2, "xn--sr-aurdal-l8a": _2, "s\xF8r-aurdal": _2, "sor-fron": _2, "xn--sr-fron-q1a": _2, "s\xF8r-fron": _2, "sor-odal": _2, "xn--sr-odal-q1a": _2, "s\xF8r-odal": _2, "sor-varanger": _2, "xn--sr-varanger-ggb": _2, "s\xF8r-varanger": _2, "sorfold": _2, "xn--srfold-bya": _2, "s\xF8rfold": _2, "sorreisa": _2, "xn--srreisa-q1a": _2, "s\xF8rreisa": _2, "sortland": _2, "sorum": _2, "xn--srum-gra": _2, "s\xF8rum": _2, "spydeberg": _2, "stange": _2, "stavanger": _2, "steigen": _2, "steinkjer": _2, "stjordal": _2, "xn--stjrdal-s1a": _2, "stj\xF8rdal": _2, "stokke": _2, "stor-elvdal": _2, "stord": _2, "stordal": _2, "storfjord": _2, "strand": _2, "stranda": _2, "stryn": _2, "sula": _2, "suldal": _2, "sund": _2, "sunndal": _2, "surnadal": _2, "sveio": _2, "svelvik": _2, "sykkylven": _2, "tana": _2, "telemark": [0, { "bo": _2, "xn--b-5ga": _2, "b\xF8": _2 }], "time": _2, "tingvoll": _2, "tinn": _2, "tjeldsund": _2, "tjome": _2, "xn--tjme-hra": _2, "tj\xF8me": _2, "tokke": _2, "tolga": _2, "tonsberg": _2, "xn--tnsberg-q1a": _2, "t\xF8nsberg": _2, "torsken": _2, "xn--trna-woa": _2, "tr\xE6na": _2, "trana": _2, "tranoy": _2, "xn--trany-yua": _2, "tran\xF8y": _2, "troandin": _2, "trogstad": _2, "xn--trgstad-r1a": _2, "tr\xF8gstad": _2, "tromsa": _2, "tromso": _2, "xn--troms-zua": _2, "troms\xF8": _2, "trondheim": _2, "trysil": _2, "tvedestrand": _2, "tydal": _2, "tynset": _2, "tysfjord": _2, "tysnes": _2, "xn--tysvr-vra": _2, "tysv\xE6r": _2, "tysvar": _2, "ullensaker": _2, "ullensvang": _2, "ulvik": _2, "unjarga": _2, "xn--unjrga-rta": _2, "unj\xE1rga": _2, "utsira": _2, "vaapste": _2, "vadso": _2, "xn--vads-jra": _2, "vads\xF8": _2, "xn--vry-yla5g": _2, "v\xE6r\xF8y": _2, "vaga": _2, "xn--vg-yiab": _2, "v\xE5g\xE5": _2, "vagan": _2, "xn--vgan-qoa": _2, "v\xE5gan": _2, "vagsoy": _2, "xn--vgsy-qoa0j": _2, "v\xE5gs\xF8y": _2, "vaksdal": _2, "valle": _2, "vang": _2, "vanylven": _2, "vardo": _2, "xn--vard-jra": _2, "vard\xF8": _2, "varggat": _2, "xn--vrggt-xqad": _2, "v\xE1rgg\xE1t": _2, "varoy": _2, "vefsn": _2, "vega": _2, "vegarshei": _2, "xn--vegrshei-c0a": _2, "veg\xE5rshei": _2, "vennesla": _2, "verdal": _2, "verran": _2, "vestby": _2, "vestfold": [0, { "sande": _2 }], "vestnes": _2, "vestre-slidre": _2, "vestre-toten": _2, "vestvagoy": _2, "xn--vestvgy-ixa6o": _2, "vestv\xE5g\xF8y": _2, "vevelstad": _2, "vik": _2, "vikna": _2, "vindafjord": _2, "voagat": _2, "volda": _2, "voss": _2, "co": _3, "123hjemmeside": _3, "myspreadshop": _3 }], "np": _20, "nr": _59, "nu": [1, { "merseine": _3, "mine": _3, "shacknet": _3, "enterprisecloud": _3 }], "nz": [1, { "ac": _2, "co": _2, "cri": _2, "geek": _2, "gen": _2, "govt": _2, "health": _2, "iwi": _2, "kiwi": _2, "maori": _2, "xn--mori-qsa": _2, "m\u0101ori": _2, "mil": _2, "net": _2, "org": _2, "parliament": _2, "school": _2, "cloudns": _3 }], "om": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "med": _2, "museum": _2, "net": _2, "org": _2, "pro": _2 }], "onion": _2, "org": [1, { "altervista": _3, "pimienta": _3, "poivron": _3, "potager": _3, "sweetpepper": _3, "cdn77": [0, { "c": _3, "rsc": _3 }], "cdn77-secure": [0, { "origin": [0, { "ssl": _3 }] }], "ae": _3, "cloudns": _3, "ip-dynamic": _3, "ddnss": _3, "dpdns": _3, "duckdns": _3, "tunk": _3, "blogdns": _3, "blogsite": _3, "boldlygoingnowhere": _3, "dnsalias": _3, "dnsdojo": _3, "doesntexist": _3, "dontexist": _3, "doomdns": _3, "dvrdns": _3, "dynalias": _3, "dyndns": [2, { "go": _3, "home": _3 }], "endofinternet": _3, "endoftheinternet": _3, "from-me": _3, "game-host": _3, "gotdns": _3, "hobby-site": _3, "homedns": _3, "homeftp": _3, "homelinux": _3, "homeunix": _3, "is-a-bruinsfan": _3, "is-a-candidate": _3, "is-a-celticsfan": _3, "is-a-chef": _3, "is-a-geek": _3, "is-a-knight": _3, "is-a-linux-user": _3, "is-a-patsfan": _3, "is-a-soxfan": _3, "is-found": _3, "is-lost": _3, "is-saved": _3, "is-very-bad": _3, "is-very-evil": _3, "is-very-good": _3, "is-very-nice": _3, "is-very-sweet": _3, "isa-geek": _3, "kicks-ass": _3, "misconfused": _3, "podzone": _3, "readmyblog": _3, "selfip": _3, "sellsyourhome": _3, "servebbs": _3, "serveftp": _3, "servegame": _3, "stuff-4-sale": _3, "webhop": _3, "accesscam": _3, "camdvr": _3, "freeddns": _3, "mywire": _3, "webredirect": _3, "twmail": _3, "eu": [2, { "al": _3, "asso": _3, "at": _3, "au": _3, "be": _3, "bg": _3, "ca": _3, "cd": _3, "ch": _3, "cn": _3, "cy": _3, "cz": _3, "de": _3, "dk": _3, "edu": _3, "ee": _3, "es": _3, "fi": _3, "fr": _3, "gr": _3, "hr": _3, "hu": _3, "ie": _3, "il": _3, "in": _3, "int": _3, "is": _3, "it": _3, "jp": _3, "kr": _3, "lt": _3, "lu": _3, "lv": _3, "me": _3, "mk": _3, "mt": _3, "my": _3, "net": _3, "ng": _3, "nl": _3, "no": _3, "nz": _3, "pl": _3, "pt": _3, "ro": _3, "ru": _3, "se": _3, "si": _3, "sk": _3, "tr": _3, "uk": _3, "us": _3 }], "fedorainfracloud": _3, "fedorapeople": _3, "fedoraproject": [0, { "cloud": _3, "os": _45, "stg": [0, { "os": _45 }] }], "freedesktop": _3, "hatenadiary": _3, "hepforge": _3, "in-dsl": _3, "in-vpn": _3, "js": _3, "barsy": _3, "mayfirst": _3, "routingthecloud": _3, "bmoattachments": _3, "cable-modem": _3, "collegefan": _3, "couchpotatofries": _3, "hopto": _3, "mlbfan": _3, "myftp": _3, "mysecuritycamera": _3, "nflfan": _3, "no-ip": _3, "read-books": _3, "ufcfan": _3, "zapto": _3, "dynserv": _3, "now-dns": _3, "is-local": _3, "httpbin": _3, "pubtls": _3, "jpn": _3, "my-firewall": _3, "myfirewall": _3, "spdns": _3, "small-web": _3, "dsmynas": _3, "familyds": _3, "teckids": _58, "tuxfamily": _3, "diskstation": _3, "hk": _3, "us": _3, "toolforge": _3, "wmcloud": [2, { "beta": _3 }], "wmflabs": _3, "za": _3 }], "pa": [1, { "abo": _2, "ac": _2, "com": _2, "edu": _2, "gob": _2, "ing": _2, "med": _2, "net": _2, "nom": _2, "org": _2, "sld": _2 }], "pe": [1, { "com": _2, "edu": _2, "gob": _2, "mil": _2, "net": _2, "nom": _2, "org": _2 }], "pf": [1, { "com": _2, "edu": _2, "org": _2 }], "pg": _20, "ph": [1, { "com": _2, "edu": _2, "gov": _2, "i": _2, "mil": _2, "net": _2, "ngo": _2, "org": _2, "cloudns": _3 }], "pk": [1, { "ac": _2, "biz": _2, "com": _2, "edu": _2, "fam": _2, "gkp": _2, "gob": _2, "gog": _2, "gok": _2, "gop": _2, "gos": _2, "gov": _2, "net": _2, "org": _2, "web": _2 }], "pl": [1, { "com": _2, "net": _2, "org": _2, "agro": _2, "aid": _2, "atm": _2, "auto": _2, "biz": _2, "edu": _2, "gmina": _2, "gsm": _2, "info": _2, "mail": _2, "media": _2, "miasta": _2, "mil": _2, "nieruchomosci": _2, "nom": _2, "pc": _2, "powiat": _2, "priv": _2, "realestate": _2, "rel": _2, "sex": _2, "shop": _2, "sklep": _2, "sos": _2, "szkola": _2, "targi": _2, "tm": _2, "tourism": _2, "travel": _2, "turystyka": _2, "gov": [1, { "ap": _2, "griw": _2, "ic": _2, "is": _2, "kmpsp": _2, "konsulat": _2, "kppsp": _2, "kwp": _2, "kwpsp": _2, "mup": _2, "mw": _2, "oia": _2, "oirm": _2, "oke": _2, "oow": _2, "oschr": _2, "oum": _2, "pa": _2, "pinb": _2, "piw": _2, "po": _2, "pr": _2, "psp": _2, "psse": _2, "pup": _2, "rzgw": _2, "sa": _2, "sdn": _2, "sko": _2, "so": _2, "sr": _2, "starostwo": _2, "ug": _2, "ugim": _2, "um": _2, "umig": _2, "upow": _2, "uppo": _2, "us": _2, "uw": _2, "uzs": _2, "wif": _2, "wiih": _2, "winb": _2, "wios": _2, "witd": _2, "wiw": _2, "wkz": _2, "wsa": _2, "wskr": _2, "wsse": _2, "wuoz": _2, "wzmiuw": _2, "zp": _2, "zpisdn": _2 }], "augustow": _2, "babia-gora": _2, "bedzin": _2, "beskidy": _2, "bialowieza": _2, "bialystok": _2, "bielawa": _2, "bieszczady": _2, "boleslawiec": _2, "bydgoszcz": _2, "bytom": _2, "cieszyn": _2, "czeladz": _2, "czest": _2, "dlugoleka": _2, "elblag": _2, "elk": _2, "glogow": _2, "gniezno": _2, "gorlice": _2, "grajewo": _2, "ilawa": _2, "jaworzno": _2, "jelenia-gora": _2, "jgora": _2, "kalisz": _2, "karpacz": _2, "kartuzy": _2, "kaszuby": _2, "katowice": _2, "kazimierz-dolny": _2, "kepno": _2, "ketrzyn": _2, "klodzko": _2, "kobierzyce": _2, "kolobrzeg": _2, "konin": _2, "konskowola": _2, "kutno": _2, "lapy": _2, "lebork": _2, "legnica": _2, "lezajsk": _2, "limanowa": _2, "lomza": _2, "lowicz": _2, "lubin": _2, "lukow": _2, "malbork": _2, "malopolska": _2, "mazowsze": _2, "mazury": _2, "mielec": _2, "mielno": _2, "mragowo": _2, "naklo": _2, "nowaruda": _2, "nysa": _2, "olawa": _2, "olecko": _2, "olkusz": _2, "olsztyn": _2, "opoczno": _2, "opole": _2, "ostroda": _2, "ostroleka": _2, "ostrowiec": _2, "ostrowwlkp": _2, "pila": _2, "pisz": _2, "podhale": _2, "podlasie": _2, "polkowice": _2, "pomorskie": _2, "pomorze": _2, "prochowice": _2, "pruszkow": _2, "przeworsk": _2, "pulawy": _2, "radom": _2, "rawa-maz": _2, "rybnik": _2, "rzeszow": _2, "sanok": _2, "sejny": _2, "skoczow": _2, "slask": _2, "slupsk": _2, "sosnowiec": _2, "stalowa-wola": _2, "starachowice": _2, "stargard": _2, "suwalki": _2, "swidnica": _2, "swiebodzin": _2, "swinoujscie": _2, "szczecin": _2, "szczytno": _2, "tarnobrzeg": _2, "tgory": _2, "turek": _2, "tychy": _2, "ustka": _2, "walbrzych": _2, "warmia": _2, "warszawa": _2, "waw": _2, "wegrow": _2, "wielun": _2, "wlocl": _2, "wloclawek": _2, "wodzislaw": _2, "wolomin": _2, "wroclaw": _2, "zachpomor": _2, "zagan": _2, "zarow": _2, "zgora": _2, "zgorzelec": _2, "art": _3, "gliwice": _3, "krakow": _3, "poznan": _3, "wroc": _3, "zakopane": _3, "beep": _3, "ecommerce-shop": _3, "cfolks": _3, "dfirma": _3, "dkonto": _3, "you2": _3, "shoparena": _3, "homesklep": _3, "sdscloud": _3, "unicloud": _3, "lodz": _3, "pabianice": _3, "plock": _3, "sieradz": _3, "skierniewice": _3, "zgierz": _3, "krasnik": _3, "leczna": _3, "lubartow": _3, "lublin": _3, "poniatowa": _3, "swidnik": _3, "co": _3, "torun": _3, "simplesite": _3, "myspreadshop": _3, "gda": _3, "gdansk": _3, "gdynia": _3, "med": _3, "sopot": _3, "bielsko": _3 }], "pm": [1, { "own": _3, "name": _3 }], "pn": [1, { "co": _2, "edu": _2, "gov": _2, "net": _2, "org": _2 }], "post": _2, "pr": [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "isla": _2, "name": _2, "net": _2, "org": _2, "pro": _2, "ac": _2, "est": _2, "prof": _2 }], "pro": [1, { "aaa": _2, "aca": _2, "acct": _2, "avocat": _2, "bar": _2, "cpa": _2, "eng": _2, "jur": _2, "law": _2, "med": _2, "recht": _2, "12chars": _3, "cloudns": _3, "barsy": _3, "ngrok": _3 }], "ps": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "plo": _2, "sec": _2 }], "pt": [1, { "com": _2, "edu": _2, "gov": _2, "int": _2, "net": _2, "nome": _2, "org": _2, "publ": _2, "123paginaweb": _3 }], "pw": [1, { "gov": _2, "cloudns": _3, "x443": _3 }], "py": [1, { "com": _2, "coop": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "qa": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sch": _2 }], "re": [1, { "asso": _2, "com": _2, "netlib": _3, "can": _3 }], "ro": [1, { "arts": _2, "com": _2, "firm": _2, "info": _2, "nom": _2, "nt": _2, "org": _2, "rec": _2, "store": _2, "tm": _2, "www": _2, "co": _3, "shop": _3, "barsy": _3 }], "rs": [1, { "ac": _2, "co": _2, "edu": _2, "gov": _2, "in": _2, "org": _2, "brendly": _19, "barsy": _3, "ox": _3 }], "ru": [1, { "ac": _3, "edu": _3, "gov": _3, "int": _3, "mil": _3, "eurodir": _3, "adygeya": _3, "bashkiria": _3, "bir": _3, "cbg": _3, "com": _3, "dagestan": _3, "grozny": _3, "kalmykia": _3, "kustanai": _3, "marine": _3, "mordovia": _3, "msk": _3, "mytis": _3, "nalchik": _3, "nov": _3, "pyatigorsk": _3, "spb": _3, "vladikavkaz": _3, "vladimir": _3, "na4u": _3, "mircloud": _3, "myjino": [2, { "hosting": _6, "landing": _6, "spectrum": _6, "vps": _6 }], "cldmail": [0, { "hb": _3 }], "mcdir": _11, "mcpre": _3, "net": _3, "org": _3, "pp": _3, "lk3": _3, "ras": _3 }], "rw": [1, { "ac": _2, "co": _2, "coop": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "sa": [1, { "com": _2, "edu": _2, "gov": _2, "med": _2, "net": _2, "org": _2, "pub": _2, "sch": _2 }], "sb": _4, "sc": _4, "sd": [1, { "com": _2, "edu": _2, "gov": _2, "info": _2, "med": _2, "net": _2, "org": _2, "tv": _2 }], "se": [1, { "a": _2, "ac": _2, "b": _2, "bd": _2, "brand": _2, "c": _2, "d": _2, "e": _2, "f": _2, "fh": _2, "fhsk": _2, "fhv": _2, "g": _2, "h": _2, "i": _2, "k": _2, "komforb": _2, "kommunalforbund": _2, "komvux": _2, "l": _2, "lanbib": _2, "m": _2, "n": _2, "naturbruksgymn": _2, "o": _2, "org": _2, "p": _2, "parti": _2, "pp": _2, "press": _2, "r": _2, "s": _2, "t": _2, "tm": _2, "u": _2, "w": _2, "x": _2, "y": _2, "z": _2, "com": _3, "iopsys": _3, "123minsida": _3, "itcouldbewor": _3, "myspreadshop": _3 }], "sg": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "enscaled": _3 }], "sh": [1, { "com": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "hashbang": _3, "botda": _3, "lovable": _3, "platform": [0, { "ent": _3, "eu": _3, "us": _3 }], "teleport": _3, "now": _3 }], "si": [1, { "f5": _3, "gitapp": _3, "gitpage": _3 }], "sj": _2, "sk": _2, "sl": _4, "sm": _2, "sn": [1, { "art": _2, "com": _2, "edu": _2, "gouv": _2, "org": _2, "perso": _2, "univ": _2 }], "so": [1, { "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "surveys": _3 }], "sr": _2, "ss": [1, { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _2 }], "st": [1, { "co": _2, "com": _2, "consulado": _2, "edu": _2, "embaixada": _2, "mil": _2, "net": _2, "org": _2, "principe": _2, "saotome": _2, "store": _2, "helioho": _3, "kirara": _3, "noho": _3 }], "su": [1, { "abkhazia": _3, "adygeya": _3, "aktyubinsk": _3, "arkhangelsk": _3, "armenia": _3, "ashgabad": _3, "azerbaijan": _3, "balashov": _3, "bashkiria": _3, "bryansk": _3, "bukhara": _3, "chimkent": _3, "dagestan": _3, "east-kazakhstan": _3, "exnet": _3, "georgia": _3, "grozny": _3, "ivanovo": _3, "jambyl": _3, "kalmykia": _3, "kaluga": _3, "karacol": _3, "karaganda": _3, "karelia": _3, "khakassia": _3, "krasnodar": _3, "kurgan": _3, "kustanai": _3, "lenug": _3, "mangyshlak": _3, "mordovia": _3, "msk": _3, "murmansk": _3, "nalchik": _3, "navoi": _3, "north-kazakhstan": _3, "nov": _3, "obninsk": _3, "penza": _3, "pokrovsk": _3, "sochi": _3, "spb": _3, "tashkent": _3, "termez": _3, "togliatti": _3, "troitsk": _3, "tselinograd": _3, "tula": _3, "tuva": _3, "vladikavkaz": _3, "vladimir": _3, "vologda": _3 }], "sv": [1, { "com": _2, "edu": _2, "gob": _2, "org": _2, "red": _2 }], "sx": _10, "sy": _5, "sz": [1, { "ac": _2, "co": _2, "org": _2 }], "tc": _2, "td": _2, "tel": _2, "tf": [1, { "sch": _3 }], "tg": _2, "th": [1, { "ac": _2, "co": _2, "go": _2, "in": _2, "mi": _2, "net": _2, "or": _2, "online": _3, "shop": _3 }], "tj": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "go": _2, "gov": _2, "int": _2, "mil": _2, "name": _2, "net": _2, "nic": _2, "org": _2, "test": _2, "web": _2 }], "tk": _2, "tl": _10, "tm": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "nom": _2, "org": _2 }], "tn": [1, { "com": _2, "ens": _2, "fin": _2, "gov": _2, "ind": _2, "info": _2, "intl": _2, "mincom": _2, "nat": _2, "net": _2, "org": _2, "perso": _2, "tourism": _2, "orangecloud": _3 }], "to": [1, { "611": _3, "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "oya": _3, "x0": _3, "quickconnect": _27, "vpnplus": _3 }], "tr": [1, { "av": _2, "bbs": _2, "bel": _2, "biz": _2, "com": _2, "dr": _2, "edu": _2, "gen": _2, "gov": _2, "info": _2, "k12": _2, "kep": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pol": _2, "tel": _2, "tsk": _2, "tv": _2, "web": _2, "nc": _10 }], "tt": [1, { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pro": _2 }], "tv": [1, { "better-than": _3, "dyndns": _3, "on-the-web": _3, "worse-than": _3, "from": _3, "sakura": _3 }], "tw": [1, { "club": _2, "com": [1, { "mymailer": _3 }], "ebiz": _2, "edu": _2, "game": _2, "gov": _2, "idv": _2, "mil": _2, "net": _2, "org": _2, "url": _3, "mydns": _3 }], "tz": [1, { "ac": _2, "co": _2, "go": _2, "hotel": _2, "info": _2, "me": _2, "mil": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "tv": _2 }], "ua": [1, { "com": _2, "edu": _2, "gov": _2, "in": _2, "net": _2, "org": _2, "cherkassy": _2, "cherkasy": _2, "chernigov": _2, "chernihiv": _2, "chernivtsi": _2, "chernovtsy": _2, "ck": _2, "cn": _2, "cr": _2, "crimea": _2, "cv": _2, "dn": _2, "dnepropetrovsk": _2, "dnipropetrovsk": _2, "donetsk": _2, "dp": _2, "if": _2, "ivano-frankivsk": _2, "kh": _2, "kharkiv": _2, "kharkov": _2, "kherson": _2, "khmelnitskiy": _2, "khmelnytskyi": _2, "kiev": _2, "kirovograd": _2, "km": _2, "kr": _2, "kropyvnytskyi": _2, "krym": _2, "ks": _2, "kv": _2, "kyiv": _2, "lg": _2, "lt": _2, "lugansk": _2, "luhansk": _2, "lutsk": _2, "lv": _2, "lviv": _2, "mk": _2, "mykolaiv": _2, "nikolaev": _2, "od": _2, "odesa": _2, "odessa": _2, "pl": _2, "poltava": _2, "rivne": _2, "rovno": _2, "rv": _2, "sb": _2, "sebastopol": _2, "sevastopol": _2, "sm": _2, "sumy": _2, "te": _2, "ternopil": _2, "uz": _2, "uzhgorod": _2, "uzhhorod": _2, "vinnica": _2, "vinnytsia": _2, "vn": _2, "volyn": _2, "yalta": _2, "zakarpattia": _2, "zaporizhzhe": _2, "zaporizhzhia": _2, "zhitomir": _2, "zhytomyr": _2, "zp": _2, "zt": _2, "cc": _3, "inf": _3, "ltd": _3, "cx": _3, "biz": _3, "co": _3, "pp": _3, "v": _3 }], "ug": [1, { "ac": _2, "co": _2, "com": _2, "edu": _2, "go": _2, "gov": _2, "mil": _2, "ne": _2, "or": _2, "org": _2, "sc": _2, "us": _2 }], "uk": [1, { "ac": _2, "co": [1, { "bytemark": [0, { "dh": _3, "vm": _3 }], "layershift": _48, "barsy": _3, "barsyonline": _3, "retrosnub": _57, "nh-serv": _3, "no-ip": _3, "adimo": _3, "myspreadshop": _3 }], "gov": [1, { "api": _3, "campaign": _3, "service": _3 }], "ltd": _2, "me": _2, "net": _2, "nhs": _2, "org": [1, { "glug": _3, "lug": _3, "lugs": _3, "affinitylottery": _3, "raffleentry": _3, "weeklylottery": _3 }], "plc": _2, "police": _2, "sch": _20, "conn": _3, "copro": _3, "hosp": _3, "independent-commission": _3, "independent-inquest": _3, "independent-inquiry": _3, "independent-panel": _3, "independent-review": _3, "public-inquiry": _3, "royal-commission": _3, "pymnt": _3, "barsy": _3, "nimsite": _3, "oraclegovcloudapps": _6 }], "us": [1, { "dni": _2, "isa": _2, "nsn": _2, "ak": _65, "al": _65, "ar": _65, "as": _65, "az": _65, "ca": _65, "co": _65, "ct": _65, "dc": _65, "de": _66, "fl": _65, "ga": _65, "gu": _65, "hi": _67, "ia": _65, "id": _65, "il": _65, "in": _65, "ks": _65, "ky": _65, "la": _65, "ma": [1, { "k12": [1, { "chtr": _2, "paroch": _2, "pvt": _2 }], "cc": _2, "lib": _2 }], "md": _65, "me": _65, "mi": [1, { "k12": _2, "cc": _2, "lib": _2, "ann-arbor": _2, "cog": _2, "dst": _2, "eaton": _2, "gen": _2, "mus": _2, "tec": _2, "washtenaw": _2 }], "mn": _65, "mo": _65, "ms": [1, { "k12": _2, "cc": _2 }], "mt": _65, "nc": _65, "nd": _67, "ne": _65, "nh": _65, "nj": _65, "nm": _65, "nv": _65, "ny": _65, "oh": _65, "ok": _65, "or": _65, "pa": _65, "pr": _65, "ri": _67, "sc": _65, "sd": _67, "tn": _65, "tx": _65, "ut": _65, "va": _65, "vi": _65, "vt": _65, "wa": _65, "wi": _65, "wv": _66, "wy": _65, "cloudns": _3, "is-by": _3, "land-4-sale": _3, "stuff-4-sale": _3, "heliohost": _3, "enscaled": [0, { "phx": _3 }], "mircloud": _3, "ngo": _3, "golffan": _3, "noip": _3, "pointto": _3, "freeddns": _3, "srv": [2, { "gh": _3, "gl": _3 }], "platterp": _3, "servername": _3 }], "uy": [1, { "com": _2, "edu": _2, "gub": _2, "mil": _2, "net": _2, "org": _2 }], "uz": [1, { "co": _2, "com": _2, "net": _2, "org": _2 }], "va": _2, "vc": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "gv": [2, { "d": _3 }], "0e": _6, "mydns": _3 }], "ve": [1, { "arts": _2, "bib": _2, "co": _2, "com": _2, "e12": _2, "edu": _2, "emprende": _2, "firm": _2, "gob": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rar": _2, "rec": _2, "store": _2, "tec": _2, "web": _2 }], "vg": [1, { "edu": _2 }], "vi": [1, { "co": _2, "com": _2, "k12": _2, "net": _2, "org": _2 }], "vn": [1, { "ac": _2, "ai": _2, "biz": _2, "com": _2, "edu": _2, "gov": _2, "health": _2, "id": _2, "info": _2, "int": _2, "io": _2, "name": _2, "net": _2, "org": _2, "pro": _2, "angiang": _2, "bacgiang": _2, "backan": _2, "baclieu": _2, "bacninh": _2, "baria-vungtau": _2, "bentre": _2, "binhdinh": _2, "binhduong": _2, "binhphuoc": _2, "binhthuan": _2, "camau": _2, "cantho": _2, "caobang": _2, "daklak": _2, "daknong": _2, "danang": _2, "dienbien": _2, "dongnai": _2, "dongthap": _2, "gialai": _2, "hagiang": _2, "haiduong": _2, "haiphong": _2, "hanam": _2, "hanoi": _2, "hatinh": _2, "haugiang": _2, "hoabinh": _2, "hungyen": _2, "khanhhoa": _2, "kiengiang": _2, "kontum": _2, "laichau": _2, "lamdong": _2, "langson": _2, "laocai": _2, "longan": _2, "namdinh": _2, "nghean": _2, "ninhbinh": _2, "ninhthuan": _2, "phutho": _2, "phuyen": _2, "quangbinh": _2, "quangnam": _2, "quangngai": _2, "quangninh": _2, "quangtri": _2, "soctrang": _2, "sonla": _2, "tayninh": _2, "thaibinh": _2, "thainguyen": _2, "thanhhoa": _2, "thanhphohochiminh": _2, "thuathienhue": _2, "tiengiang": _2, "travinh": _2, "tuyenquang": _2, "vinhlong": _2, "vinhphuc": _2, "yenbai": _2 }], "vu": _47, "wf": [1, { "biz": _3, "sch": _3 }], "ws": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "advisor": _6, "cloud66": _3, "dyndns": _3, "mypets": _3 }], "yt": [1, { "org": _3 }], "xn--mgbaam7a8h": _2, "\u0627\u0645\u0627\u0631\u0627\u062A": _2, "xn--y9a3aq": _2, "\u0570\u0561\u0575": _2, "xn--54b7fta0cc": _2, "\u09AC\u09BE\u0982\u09B2\u09BE": _2, "xn--90ae": _2, "\u0431\u0433": _2, "xn--mgbcpq6gpa1a": _2, "\u0627\u0644\u0628\u062D\u0631\u064A\u0646": _2, "xn--90ais": _2, "\u0431\u0435\u043B": _2, "xn--fiqs8s": _2, "\u4E2D\u56FD": _2, "xn--fiqz9s": _2, "\u4E2D\u570B": _2, "xn--lgbbat1ad8j": _2, "\u0627\u0644\u062C\u0632\u0627\u0626\u0631": _2, "xn--wgbh1c": _2, "\u0645\u0635\u0631": _2, "xn--e1a4c": _2, "\u0435\u044E": _2, "xn--qxa6a": _2, "\u03B5\u03C5": _2, "xn--mgbah1a3hjkrd": _2, "\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627": _2, "xn--node": _2, "\u10D2\u10D4": _2, "xn--qxam": _2, "\u03B5\u03BB": _2, "xn--j6w193g": [1, { "xn--gmqw5a": _2, "xn--55qx5d": _2, "xn--mxtq1m": _2, "xn--wcvs22d": _2, "xn--uc0atv": _2, "xn--od0alg": _2 }], "\u9999\u6E2F": [1, { "\u500B\u4EBA": _2, "\u516C\u53F8": _2, "\u653F\u5E9C": _2, "\u6559\u80B2": _2, "\u7D44\u7E54": _2, "\u7DB2\u7D61": _2 }], "xn--2scrj9c": _2, "\u0CAD\u0CBE\u0CB0\u0CA4": _2, "xn--3hcrj9c": _2, "\u0B2D\u0B3E\u0B30\u0B24": _2, "xn--45br5cyl": _2, "\u09AD\u09BE\u09F0\u09A4": _2, "xn--h2breg3eve": _2, "\u092D\u093E\u0930\u0924\u092E\u094D": _2, "xn--h2brj9c8c": _2, "\u092D\u093E\u0930\u094B\u0924": _2, "xn--mgbgu82a": _2, "\u0680\u0627\u0631\u062A": _2, "xn--rvc1e0am3e": _2, "\u0D2D\u0D3E\u0D30\u0D24\u0D02": _2, "xn--h2brj9c": _2, "\u092D\u093E\u0930\u0924": _2, "xn--mgbbh1a": _2, "\u0628\u0627\u0631\u062A": _2, "xn--mgbbh1a71e": _2, "\u0628\u06BE\u0627\u0631\u062A": _2, "xn--fpcrj9c3d": _2, "\u0C2D\u0C3E\u0C30\u0C24\u0C4D": _2, "xn--gecrj9c": _2, "\u0AAD\u0ABE\u0AB0\u0AA4": _2, "xn--s9brj9c": _2, "\u0A2D\u0A3E\u0A30\u0A24": _2, "xn--45brj9c": _2, "\u09AD\u09BE\u09B0\u09A4": _2, "xn--xkc2dl3a5ee0h": _2, "\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE": _2, "xn--mgba3a4f16a": _2, "\u0627\u06CC\u0631\u0627\u0646": _2, "xn--mgba3a4fra": _2, "\u0627\u064A\u0631\u0627\u0646": _2, "xn--mgbtx2b": _2, "\u0639\u0631\u0627\u0642": _2, "xn--mgbayh7gpa": _2, "\u0627\u0644\u0627\u0631\u062F\u0646": _2, "xn--3e0b707e": _2, "\uD55C\uAD6D": _2, "xn--80ao21a": _2, "\u049B\u0430\u0437": _2, "xn--q7ce6a": _2, "\u0EA5\u0EB2\u0EA7": _2, "xn--fzc2c9e2c": _2, "\u0DBD\u0D82\u0D9A\u0DCF": _2, "xn--xkc2al3hye2a": _2, "\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8": _2, "xn--mgbc0a9azcg": _2, "\u0627\u0644\u0645\u063A\u0631\u0628": _2, "xn--d1alf": _2, "\u043C\u043A\u0434": _2, "xn--l1acc": _2, "\u043C\u043E\u043D": _2, "xn--mix891f": _2, "\u6FB3\u9580": _2, "xn--mix082f": _2, "\u6FB3\u95E8": _2, "xn--mgbx4cd0ab": _2, "\u0645\u0644\u064A\u0633\u064A\u0627": _2, "xn--mgb9awbf": _2, "\u0639\u0645\u0627\u0646": _2, "xn--mgbai9azgqp6j": _2, "\u067E\u0627\u06A9\u0633\u062A\u0627\u0646": _2, "xn--mgbai9a5eva00b": _2, "\u067E\u0627\u0643\u0633\u062A\u0627\u0646": _2, "xn--ygbi2ammx": _2, "\u0641\u0644\u0633\u0637\u064A\u0646": _2, "xn--90a3ac": [1, { "xn--80au": _2, "xn--90azh": _2, "xn--d1at": _2, "xn--c1avg": _2, "xn--o1ac": _2, "xn--o1ach": _2 }], "\u0441\u0440\u0431": [1, { "\u0430\u043A": _2, "\u043E\u0431\u0440": _2, "\u043E\u0434": _2, "\u043E\u0440\u0433": _2, "\u043F\u0440": _2, "\u0443\u043F\u0440": _2 }], "xn--p1ai": _2, "\u0440\u0444": _2, "xn--wgbl6a": _2, "\u0642\u0637\u0631": _2, "xn--mgberp4a5d4ar": _2, "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629": _2, "xn--mgberp4a5d4a87g": _2, "\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u0629": _2, "xn--mgbqly7c0a67fbc": _2, "\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u06C3": _2, "xn--mgbqly7cvafr": _2, "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0647": _2, "xn--mgbpl2fh": _2, "\u0633\u0648\u062F\u0627\u0646": _2, "xn--yfro4i67o": _2, "\u65B0\u52A0\u5761": _2, "xn--clchc0ea0b2g2a9gcd": _2, "\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD": _2, "xn--ogbpf8fl": _2, "\u0633\u0648\u0631\u064A\u0629": _2, "xn--mgbtf8fl": _2, "\u0633\u0648\u0631\u064A\u0627": _2, "xn--o3cw4h": [1, { "xn--o3cyx2a": _2, "xn--12co0c3b4eva": _2, "xn--m3ch0j3a": _2, "xn--h3cuzk1di": _2, "xn--12c1fe0br": _2, "xn--12cfi8ixb8l": _2 }], "\u0E44\u0E17\u0E22": [1, { "\u0E17\u0E2B\u0E32\u0E23": _2, "\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08": _2, "\u0E40\u0E19\u0E47\u0E15": _2, "\u0E23\u0E31\u0E10\u0E1A\u0E32\u0E25": _2, "\u0E28\u0E36\u0E01\u0E29\u0E32": _2, "\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23": _2 }], "xn--pgbs0dh": _2, "\u062A\u0648\u0646\u0633": _2, "xn--kpry57d": _2, "\u53F0\u7063": _2, "xn--kprw13d": _2, "\u53F0\u6E7E": _2, "xn--nnx388a": _2, "\u81FA\u7063": _2, "xn--j1amh": _2, "\u0443\u043A\u0440": _2, "xn--mgb2ddes": _2, "\u0627\u0644\u064A\u0645\u0646": _2, "xxx": _2, "ye": _5, "za": [0, { "ac": _2, "agric": _2, "alt": _2, "co": _2, "edu": _2, "gov": _2, "grondar": _2, "law": _2, "mil": _2, "net": _2, "ngo": _2, "nic": _2, "nis": _2, "nom": _2, "org": _2, "school": _2, "tm": _2, "web": _2 }], "zm": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "mil": _2, "net": _2, "org": _2, "sch": _2 }], "zw": [1, { "ac": _2, "co": _2, "gov": _2, "mil": _2, "org": _2 }], "aaa": _2, "aarp": _2, "abb": _2, "abbott": _2, "abbvie": _2, "abc": _2, "able": _2, "abogado": _2, "abudhabi": _2, "academy": [1, { "official": _3 }], "accenture": _2, "accountant": _2, "accountants": _2, "aco": _2, "actor": _2, "ads": _2, "adult": _2, "aeg": _2, "aetna": _2, "afl": _2, "africa": _2, "agakhan": _2, "agency": _2, "aig": _2, "airbus": _2, "airforce": _2, "airtel": _2, "akdn": _2, "alibaba": _2, "alipay": _2, "allfinanz": _2, "allstate": _2, "ally": _2, "alsace": _2, "alstom": _2, "amazon": _2, "americanexpress": _2, "americanfamily": _2, "amex": _2, "amfam": _2, "amica": _2, "amsterdam": _2, "analytics": _2, "android": _2, "anquan": _2, "anz": _2, "aol": _2, "apartments": _2, "app": [1, { "adaptable": _3, "aiven": _3, "beget": _6, "brave": _7, "clerk": _3, "clerkstage": _3, "wnext": _3, "csb": [2, { "preview": _3 }], "convex": _3, "deta": _3, "ondigitalocean": _3, "easypanel": _3, "encr": [2, { "frontend": _3 }], "evervault": _8, "expo": [2, { "staging": _3 }], "edgecompute": _3, "on-fleek": _3, "flutterflow": _3, "e2b": _3, "framer": _3, "github": _3, "hosted": _6, "run": [0, { "*": _3, "mtls": _6 }], "web": _3, "hackclub": _3, "hasura": _3, "botdash": _3, "leapcell": _3, "loginline": _3, "lovable": _3, "luyani": _3, "medusajs": _3, "messerli": _3, "netfy": _3, "netlify": _3, "ngrok": _3, "ngrok-free": _3, "developer": _6, "noop": _3, "northflank": _6, "upsun": _6, "railway": [0, { "up": _3 }], "replit": _9, "nyat": _3, "snowflake": [0, { "*": _3, "privatelink": _6 }], "streamlit": _3, "storipress": _3, "telebit": _3, "typedream": _3, "vercel": _3, "wal": _3, "bookonline": _3, "wdh": _3, "windsurf": _3, "zeabur": _3, "zerops": _6 }], "apple": _2, "aquarelle": _2, "arab": _2, "aramco": _2, "archi": _2, "army": _2, "art": _2, "arte": _2, "asda": _2, "associates": _2, "athleta": _2, "attorney": _2, "auction": _2, "audi": _2, "audible": _2, "audio": _2, "auspost": _2, "author": _2, "auto": _2, "autos": _2, "aws": [1, { "on": [0, { "af-south-1": _12, "ap-east-1": _12, "ap-northeast-1": _12, "ap-northeast-2": _12, "ap-northeast-3": _12, "ap-south-1": _12, "ap-south-2": _12, "ap-southeast-1": _12, "ap-southeast-2": _12, "ap-southeast-3": _12, "ap-southeast-4": _12, "ap-southeast-5": _12, "ca-central-1": _12, "ca-west-1": _12, "eu-central-1": _12, "eu-central-2": _12, "eu-north-1": _12, "eu-south-1": _12, "eu-south-2": _12, "eu-west-1": _12, "eu-west-2": _12, "eu-west-3": _12, "il-central-1": _12, "me-central-1": _12, "me-south-1": _12, "sa-east-1": _12, "us-east-1": _12, "us-east-2": _12, "us-west-1": _12, "us-west-2": _12, "us-gov-east-1": _13, "us-gov-west-1": _13 }], "sagemaker": [0, { "ap-northeast-1": _15, "ap-northeast-2": _15, "ap-south-1": _15, "ap-southeast-1": _15, "ap-southeast-2": _15, "ca-central-1": _17, "eu-central-1": _15, "eu-west-1": _15, "eu-west-2": _15, "us-east-1": _17, "us-east-2": _17, "us-west-2": _17, "af-south-1": _14, "ap-east-1": _14, "ap-northeast-3": _14, "ap-south-2": _16, "ap-southeast-3": _14, "ap-southeast-4": _16, "ca-west-1": [0, { "notebook": _3, "notebook-fips": _3 }], "eu-central-2": _14, "eu-north-1": _14, "eu-south-1": _14, "eu-south-2": _14, "eu-west-3": _14, "il-central-1": _14, "me-central-1": _14, "me-south-1": _14, "sa-east-1": _14, "us-gov-east-1": _18, "us-gov-west-1": _18, "us-west-1": [0, { "notebook": _3, "notebook-fips": _3, "studio": _3 }], "experiments": _6 }], "repost": [0, { "private": _6 }] }], "axa": _2, "azure": _2, "baby": _2, "baidu": _2, "banamex": _2, "band": _2, "bank": _2, "bar": _2, "barcelona": _2, "barclaycard": _2, "barclays": _2, "barefoot": _2, "bargains": _2, "baseball": _2, "basketball": [1, { "aus": _3, "nz": _3 }], "bauhaus": _2, "bayern": _2, "bbc": _2, "bbt": _2, "bbva": _2, "bcg": _2, "bcn": _2, "beats": _2, "beauty": _2, "beer": _2, "berlin": _2, "best": _2, "bestbuy": _2, "bet": _2, "bharti": _2, "bible": _2, "bid": _2, "bike": _2, "bing": _2, "bingo": _2, "bio": _2, "black": _2, "blackfriday": _2, "blockbuster": _2, "blog": _2, "bloomberg": _2, "blue": _2, "bms": _2, "bmw": _2, "bnpparibas": _2, "boats": _2, "boehringer": _2, "bofa": _2, "bom": _2, "bond": _2, "boo": _2, "book": _2, "booking": _2, "bosch": _2, "bostik": _2, "boston": _2, "bot": _2, "boutique": _2, "box": _2, "bradesco": _2, "bridgestone": _2, "broadway": _2, "broker": _2, "brother": _2, "brussels": _2, "build": [1, { "v0": _3, "windsurf": _3 }], "builders": [1, { "cloudsite": _3 }], "business": _21, "buy": _2, "buzz": _2, "bzh": _2, "cab": _2, "cafe": _2, "cal": _2, "call": _2, "calvinklein": _2, "cam": _2, "camera": _2, "camp": [1, { "emf": [0, { "at": _3 }] }], "canon": _2, "capetown": _2, "capital": _2, "capitalone": _2, "car": _2, "caravan": _2, "cards": _2, "care": _2, "career": _2, "careers": _2, "cars": _2, "casa": [1, { "nabu": [0, { "ui": _3 }] }], "case": _2, "cash": _2, "casino": _2, "catering": _2, "catholic": _2, "cba": _2, "cbn": _2, "cbre": _2, "center": _2, "ceo": _2, "cern": _2, "cfa": _2, "cfd": _2, "chanel": _2, "channel": _2, "charity": _2, "chase": _2, "chat": _2, "cheap": _2, "chintai": _2, "christmas": _2, "chrome": _2, "church": _2, "cipriani": _2, "circle": _2, "cisco": _2, "citadel": _2, "citi": _2, "citic": _2, "city": _2, "claims": _2, "cleaning": _2, "click": _2, "clinic": _2, "clinique": _2, "clothing": _2, "cloud": [1, { "convex": _3, "elementor": _3, "encoway": [0, { "eu": _3 }], "statics": _6, "ravendb": _3, "axarnet": [0, { "es-1": _3 }], "diadem": _3, "jelastic": [0, { "vip": _3 }], "jele": _3, "jenv-aruba": [0, { "aruba": [0, { "eur": [0, { "it1": _3 }] }], "it1": _3 }], "keliweb": [2, { "cs": _3 }], "oxa": [2, { "tn": _3, "uk": _3 }], "primetel": [2, { "uk": _3 }], "reclaim": [0, { "ca": _3, "uk": _3, "us": _3 }], "trendhosting": [0, { "ch": _3, "de": _3 }], "jote": _3, "jotelulu": _3, "kuleuven": _3, "laravel": _3, "linkyard": _3, "magentosite": _6, "matlab": _3, "observablehq": _3, "perspecta": _3, "vapor": _3, "on-rancher": _6, "scw": [0, { "baremetal": [0, { "fr-par-1": _3, "fr-par-2": _3, "nl-ams-1": _3 }], "fr-par": [0, { "cockpit": _3, "ddl": _3, "dtwh": _3, "fnc": [2, { "functions": _3 }], "ifr": _3, "k8s": _23, "kafk": _3, "mgdb": _3, "rdb": _3, "s3": _3, "s3-website": _3, "scbl": _3, "whm": _3 }], "instances": [0, { "priv": _3, "pub": _3 }], "k8s": _3, "nl-ams": [0, { "cockpit": _3, "ddl": _3, "dtwh": _3, "ifr": _3, "k8s": _23, "kafk": _3, "mgdb": _3, "rdb": _3, "s3": _3, "s3-website": _3, "scbl": _3, "whm": _3 }], "pl-waw": [0, { "cockpit": _3, "ddl": _3, "dtwh": _3, "ifr": _3, "k8s": _23, "kafk": _3, "mgdb": _3, "rdb": _3, "s3": _3, "s3-website": _3, "scbl": _3 }], "scalebook": _3, "smartlabeling": _3 }], "servebolt": _3, "onstackit": [0, { "runs": _3 }], "trafficplex": _3, "unison-services": _3, "urown": _3, "voorloper": _3, "zap": _3 }], "club": [1, { "cloudns": _3, "jele": _3, "barsy": _3 }], "clubmed": _2, "coach": _2, "codes": [1, { "owo": _6 }], "coffee": _2, "college": _2, "cologne": _2, "commbank": _2, "community": [1, { "nog": _3, "ravendb": _3, "myforum": _3 }], "company": _2, "compare": _2, "computer": _2, "comsec": _2, "condos": _2, "construction": _2, "consulting": _2, "contact": _2, "contractors": _2, "cooking": _2, "cool": [1, { "elementor": _3, "de": _3 }], "corsica": _2, "country": _2, "coupon": _2, "coupons": _2, "courses": _2, "cpa": _2, "credit": _2, "creditcard": _2, "creditunion": _2, "cricket": _2, "crown": _2, "crs": _2, "cruise": _2, "cruises": _2, "cuisinella": _2, "cymru": _2, "cyou": _2, "dad": _2, "dance": _2, "data": _2, "date": _2, "dating": _2, "datsun": _2, "day": _2, "dclk": _2, "dds": _2, "deal": _2, "dealer": _2, "deals": _2, "degree": _2, "delivery": _2, "dell": _2, "deloitte": _2, "delta": _2, "democrat": _2, "dental": _2, "dentist": _2, "desi": _2, "design": [1, { "graphic": _3, "bss": _3 }], "dev": [1, { "12chars": _3, "myaddr": _3, "panel": _3, "lcl": _6, "lclstage": _6, "stg": _6, "stgstage": _6, "pages": _3, "r2": _3, "workers": _3, "deno": _3, "deno-staging": _3, "deta": _3, "lp": [2, { "api": _3, "objects": _3 }], "evervault": _8, "fly": _3, "githubpreview": _3, "gateway": _6, "botdash": _3, "inbrowser": _6, "is-a-good": _3, "iserv": _3, "leapcell": _3, "runcontainers": _3, "localcert": [0, { "user": _6 }], "loginline": _3, "barsy": _3, "mediatech": _3, "modx": _3, "ngrok": _3, "ngrok-free": _3, "is-a-fullstack": _3, "is-cool": _3, "is-not-a": _3, "localplayer": _3, "xmit": _3, "platter-app": _3, "replit": [2, { "archer": _3, "bones": _3, "canary": _3, "global": _3, "hacker": _3, "id": _3, "janeway": _3, "kim": _3, "kira": _3, "kirk": _3, "odo": _3, "paris": _3, "picard": _3, "pike": _3, "prerelease": _3, "reed": _3, "riker": _3, "sisko": _3, "spock": _3, "staging": _3, "sulu": _3, "tarpit": _3, "teams": _3, "tucker": _3, "wesley": _3, "worf": _3 }], "crm": [0, { "d": _6, "w": _6, "wa": _6, "wb": _6, "wc": _6, "wd": _6, "we": _6, "wf": _6 }], "erp": _50, "vercel": _3, "webhare": _6, "hrsn": _3, "is-a": _3 }], "dhl": _2, "diamonds": _2, "diet": _2, "digital": [1, { "cloudapps": [2, { "london": _3 }] }], "direct": [1, { "libp2p": _3 }], "directory": _2, "discount": _2, "discover": _2, "dish": _2, "diy": _2, "dnp": _2, "docs": _2, "doctor": _2, "dog": _2, "domains": _2, "dot": _2, "download": _2, "drive": _2, "dtv": _2, "dubai": _2, "dunlop": _2, "dupont": _2, "durban": _2, "dvag": _2, "dvr": _2, "earth": _2, "eat": _2, "eco": _2, "edeka": _2, "education": _21, "email": [1, { "crisp": [0, { "on": _3 }], "tawk": _52, "tawkto": _52 }], "emerck": _2, "energy": _2, "engineer": _2, "engineering": _2, "enterprises": _2, "epson": _2, "equipment": _2, "ericsson": _2, "erni": _2, "esq": _2, "estate": [1, { "compute": _6 }], "eurovision": _2, "eus": [1, { "party": _53 }], "events": [1, { "koobin": _3, "co": _3 }], "exchange": _2, "expert": _2, "exposed": _2, "express": _2, "extraspace": _2, "fage": _2, "fail": _2, "fairwinds": _2, "faith": _2, "family": _2, "fan": _2, "fans": _2, "farm": [1, { "storj": _3 }], "farmers": _2, "fashion": _2, "fast": _2, "fedex": _2, "feedback": _2, "ferrari": _2, "ferrero": _2, "fidelity": _2, "fido": _2, "film": _2, "final": _2, "finance": _2, "financial": _21, "fire": _2, "firestone": _2, "firmdale": _2, "fish": _2, "fishing": _2, "fit": _2, "fitness": _2, "flickr": _2, "flights": _2, "flir": _2, "florist": _2, "flowers": _2, "fly": _2, "foo": _2, "food": _2, "football": _2, "ford": _2, "forex": _2, "forsale": _2, "forum": _2, "foundation": _2, "fox": _2, "free": _2, "fresenius": _2, "frl": _2, "frogans": _2, "frontier": _2, "ftr": _2, "fujitsu": _2, "fun": _2, "fund": _2, "furniture": _2, "futbol": _2, "fyi": _2, "gal": _2, "gallery": _2, "gallo": _2, "gallup": _2, "game": _2, "games": [1, { "pley": _3, "sheezy": _3 }], "gap": _2, "garden": _2, "gay": [1, { "pages": _3 }], "gbiz": _2, "gdn": [1, { "cnpy": _3 }], "gea": _2, "gent": _2, "genting": _2, "george": _2, "ggee": _2, "gift": _2, "gifts": _2, "gives": _2, "giving": _2, "glass": _2, "gle": _2, "global": [1, { "appwrite": _3 }], "globo": _2, "gmail": _2, "gmbh": _2, "gmo": _2, "gmx": _2, "godaddy": _2, "gold": _2, "goldpoint": _2, "golf": _2, "goo": _2, "goodyear": _2, "goog": [1, { "cloud": _3, "translate": _3, "usercontent": _6 }], "google": _2, "gop": _2, "got": _2, "grainger": _2, "graphics": _2, "gratis": _2, "green": _2, "gripe": _2, "grocery": _2, "group": [1, { "discourse": _3 }], "gucci": _2, "guge": _2, "guide": _2, "guitars": _2, "guru": _2, "hair": _2, "hamburg": _2, "hangout": _2, "haus": _2, "hbo": _2, "hdfc": _2, "hdfcbank": _2, "health": [1, { "hra": _3 }], "healthcare": _2, "help": _2, "helsinki": _2, "here": _2, "hermes": _2, "hiphop": _2, "hisamitsu": _2, "hitachi": _2, "hiv": _2, "hkt": _2, "hockey": _2, "holdings": _2, "holiday": _2, "homedepot": _2, "homegoods": _2, "homes": _2, "homesense": _2, "honda": _2, "horse": _2, "hospital": _2, "host": [1, { "cloudaccess": _3, "freesite": _3, "easypanel": _3, "fastvps": _3, "myfast": _3, "tempurl": _3, "wpmudev": _3, "iserv": _3, "jele": _3, "mircloud": _3, "bolt": _3, "wp2": _3, "half": _3 }], "hosting": [1, { "opencraft": _3 }], "hot": _2, "hotel": _2, "hotels": _2, "hotmail": _2, "house": _2, "how": _2, "hsbc": _2, "hughes": _2, "hyatt": _2, "hyundai": _2, "ibm": _2, "icbc": _2, "ice": _2, "icu": _2, "ieee": _2, "ifm": _2, "ikano": _2, "imamat": _2, "imdb": _2, "immo": _2, "immobilien": _2, "inc": _2, "industries": _2, "infiniti": _2, "ing": _2, "ink": _2, "institute": _2, "insurance": _2, "insure": _2, "international": _2, "intuit": _2, "investments": _2, "ipiranga": _2, "irish": _2, "ismaili": _2, "ist": _2, "istanbul": _2, "itau": _2, "itv": _2, "jaguar": _2, "java": _2, "jcb": _2, "jeep": _2, "jetzt": _2, "jewelry": _2, "jio": _2, "jll": _2, "jmp": _2, "jnj": _2, "joburg": _2, "jot": _2, "joy": _2, "jpmorgan": _2, "jprs": _2, "juegos": _2, "juniper": _2, "kaufen": _2, "kddi": _2, "kerryhotels": _2, "kerryproperties": _2, "kfh": _2, "kia": _2, "kids": _2, "kim": _2, "kindle": _2, "kitchen": _2, "kiwi": _2, "koeln": _2, "komatsu": _2, "kosher": _2, "kpmg": _2, "kpn": _2, "krd": [1, { "co": _3, "edu": _3 }], "kred": _2, "kuokgroup": _2, "kyoto": _2, "lacaixa": _2, "lamborghini": _2, "lamer": _2, "land": _2, "landrover": _2, "lanxess": _2, "lasalle": _2, "lat": _2, "latino": _2, "latrobe": _2, "law": _2, "lawyer": _2, "lds": _2, "lease": _2, "leclerc": _2, "lefrak": _2, "legal": _2, "lego": _2, "lexus": _2, "lgbt": _2, "lidl": _2, "life": _2, "lifeinsurance": _2, "lifestyle": _2, "lighting": _2, "like": _2, "lilly": _2, "limited": _2, "limo": _2, "lincoln": _2, "link": [1, { "myfritz": _3, "cyon": _3, "dweb": _6, "inbrowser": _6, "nftstorage": _60, "mypep": _3, "storacha": _60, "w3s": _60 }], "live": [1, { "aem": _3, "hlx": _3, "ewp": _6 }], "living": _2, "llc": _2, "llp": _2, "loan": _2, "loans": _2, "locker": _2, "locus": _2, "lol": [1, { "omg": _3 }], "london": _2, "lotte": _2, "lotto": _2, "love": _2, "lpl": _2, "lplfinancial": _2, "ltd": _2, "ltda": _2, "lundbeck": _2, "luxe": _2, "luxury": _2, "madrid": _2, "maif": _2, "maison": _2, "makeup": _2, "man": _2, "management": _2, "mango": _2, "map": _2, "market": _2, "marketing": _2, "markets": _2, "marriott": _2, "marshalls": _2, "mattel": _2, "mba": _2, "mckinsey": _2, "med": _2, "media": _61, "meet": _2, "melbourne": _2, "meme": _2, "memorial": _2, "men": _2, "menu": [1, { "barsy": _3, "barsyonline": _3 }], "merck": _2, "merckmsd": _2, "miami": _2, "microsoft": _2, "mini": _2, "mint": _2, "mit": _2, "mitsubishi": _2, "mlb": _2, "mls": _2, "mma": _2, "mobile": _2, "moda": _2, "moe": _2, "moi": _2, "mom": _2, "monash": _2, "money": _2, "monster": _2, "mormon": _2, "mortgage": _2, "moscow": _2, "moto": _2, "motorcycles": _2, "mov": _2, "movie": _2, "msd": _2, "mtn": _2, "mtr": _2, "music": _2, "nab": _2, "nagoya": _2, "navy": _2, "nba": _2, "nec": _2, "netbank": _2, "netflix": _2, "network": [1, { "aem": _3, "alces": _6, "co": _3, "arvo": _3, "azimuth": _3, "tlon": _3 }], "neustar": _2, "new": _2, "news": [1, { "noticeable": _3 }], "next": _2, "nextdirect": _2, "nexus": _2, "nfl": _2, "ngo": _2, "nhk": _2, "nico": _2, "nike": _2, "nikon": _2, "ninja": _2, "nissan": _2, "nissay": _2, "nokia": _2, "norton": _2, "now": _2, "nowruz": _2, "nowtv": _2, "nra": _2, "nrw": _2, "ntt": _2, "nyc": _2, "obi": _2, "observer": _2, "office": _2, "okinawa": _2, "olayan": _2, "olayangroup": _2, "ollo": _2, "omega": _2, "one": [1, { "kin": _6, "service": _3 }], "ong": [1, { "obl": _3 }], "onl": _2, "online": [1, { "eero": _3, "eero-stage": _3, "websitebuilder": _3, "leapcell": _3, "barsy": _3 }], "ooo": _2, "open": _2, "oracle": _2, "orange": [1, { "tech": _3 }], "organic": _2, "origins": _2, "osaka": _2, "otsuka": _2, "ott": _2, "ovh": [1, { "nerdpol": _3 }], "page": [1, { "aem": _3, "hlx": _3, "translated": _3, "codeberg": _3, "heyflow": _3, "prvcy": _3, "rocky": _3, "pdns": _3, "plesk": _3 }], "panasonic": _2, "paris": _2, "pars": _2, "partners": _2, "parts": _2, "party": _2, "pay": _2, "pccw": _2, "pet": _2, "pfizer": _2, "pharmacy": _2, "phd": _2, "philips": _2, "phone": _2, "photo": _2, "photography": _2, "photos": _61, "physio": _2, "pics": _2, "pictet": _2, "pictures": [1, { "1337": _3 }], "pid": _2, "pin": _2, "ping": _2, "pink": _2, "pioneer": _2, "pizza": [1, { "ngrok": _3 }], "place": _21, "play": _2, "playstation": _2, "plumbing": _2, "plus": _2, "pnc": _2, "pohl": _2, "poker": _2, "politie": _2, "porn": _2, "praxi": _2, "press": _2, "prime": _2, "prod": _2, "productions": _2, "prof": _2, "progressive": _2, "promo": _2, "properties": _2, "property": _2, "protection": _2, "pru": _2, "prudential": _2, "pub": [1, { "id": _6, "kin": _6, "barsy": _3 }], "pwc": _2, "qpon": _2, "quebec": _2, "quest": _2, "racing": _2, "radio": _2, "read": _2, "realestate": _2, "realtor": _2, "realty": _2, "recipes": _2, "red": _2, "redumbrella": _2, "rehab": _2, "reise": _2, "reisen": _2, "reit": _2, "reliance": _2, "ren": _2, "rent": _2, "rentals": _2, "repair": _2, "report": _2, "republican": _2, "rest": _2, "restaurant": _2, "review": _2, "reviews": [1, { "aem": _3 }], "rexroth": _2, "rich": _2, "richardli": _2, "ricoh": _2, "ril": _2, "rio": _2, "rip": [1, { "clan": _3 }], "rocks": [1, { "myddns": _3, "stackit": _3, "lima-city": _3, "webspace": _3 }], "rodeo": _2, "rogers": _2, "room": _2, "rsvp": _2, "rugby": _2, "ruhr": _2, "run": [1, { "appwrite": _6, "canva": _3, "development": _3, "ravendb": _3, "liara": [2, { "iran": _3 }], "lovable": _3, "build": _6, "code": _6, "database": _6, "migration": _6, "onporter": _3, "repl": _3, "stackit": _3, "val": _50, "vercel": _3, "wix": _3 }], "rwe": _2, "ryukyu": _2, "saarland": _2, "safe": _2, "safety": _2, "sakura": _2, "sale": _2, "salon": _2, "samsclub": _2, "samsung": _2, "sandvik": _2, "sandvikcoromant": _2, "sanofi": _2, "sap": _2, "sarl": _2, "sas": _2, "save": _2, "saxo": _2, "sbi": _2, "sbs": _2, "scb": _2, "schaeffler": _2, "schmidt": _2, "scholarships": _2, "school": _2, "schule": _2, "schwarz": _2, "science": _2, "scot": [1, { "gov": [2, { "service": _3 }] }], "search": _2, "seat": _2, "secure": _2, "security": _2, "seek": _2, "select": _2, "sener": _2, "services": [1, { "loginline": _3 }], "seven": _2, "sew": _2, "sex": _2, "sexy": _2, "sfr": _2, "shangrila": _2, "sharp": _2, "shell": _2, "shia": _2, "shiksha": _2, "shoes": _2, "shop": [1, { "base": _3, "hoplix": _3, "barsy": _3, "barsyonline": _3, "shopware": _3 }], "shopping": _2, "shouji": _2, "show": _2, "silk": _2, "sina": _2, "singles": _2, "site": [1, { "square": _3, "canva": _24, "cloudera": _6, "convex": _3, "cyon": _3, "caffeine": _3, "fastvps": _3, "figma": _3, "preview": _3, "heyflow": _3, "jele": _3, "jouwweb": _3, "loginline": _3, "barsy": _3, "notion": _3, "omniwe": _3, "opensocial": _3, "madethis": _3, "support": _3, "platformsh": _6, "tst": _6, "byen": _3, "srht": _3, "novecore": _3, "cpanel": _3, "wpsquared": _3, "sourcecraft": _3 }], "ski": _2, "skin": _2, "sky": _2, "skype": _2, "sling": _2, "smart": _2, "smile": _2, "sncf": _2, "soccer": _2, "social": _2, "softbank": _2, "software": _2, "sohu": _2, "solar": _2, "solutions": _2, "song": _2, "sony": _2, "soy": _2, "spa": _2, "space": [1, { "myfast": _3, "heiyu": _3, "hf": [2, { "static": _3 }], "app-ionos": _3, "project": _3, "uber": _3, "xs4all": _3 }], "sport": _2, "spot": _2, "srl": _2, "stada": _2, "staples": _2, "star": _2, "statebank": _2, "statefarm": _2, "stc": _2, "stcgroup": _2, "stockholm": _2, "storage": _2, "store": [1, { "barsy": _3, "sellfy": _3, "shopware": _3, "storebase": _3 }], "stream": _2, "studio": _2, "study": _2, "style": _2, "sucks": _2, "supplies": _2, "supply": _2, "support": [1, { "barsy": _3 }], "surf": _2, "surgery": _2, "suzuki": _2, "swatch": _2, "swiss": _2, "sydney": _2, "systems": [1, { "knightpoint": _3 }], "tab": _2, "taipei": _2, "talk": _2, "taobao": _2, "target": _2, "tatamotors": _2, "tatar": _2, "tattoo": _2, "tax": _2, "taxi": _2, "tci": _2, "tdk": _2, "team": [1, { "discourse": _3, "jelastic": _3 }], "tech": [1, { "cleverapps": _3 }], "technology": _21, "temasek": _2, "tennis": _2, "teva": _2, "thd": _2, "theater": _2, "theatre": _2, "tiaa": _2, "tickets": _2, "tienda": _2, "tips": _2, "tires": _2, "tirol": _2, "tjmaxx": _2, "tjx": _2, "tkmaxx": _2, "tmall": _2, "today": [1, { "prequalifyme": _3 }], "tokyo": _2, "tools": [1, { "addr": _49, "myaddr": _3 }], "top": [1, { "ntdll": _3, "wadl": _6 }], "toray": _2, "toshiba": _2, "total": _2, "tours": _2, "town": _2, "toyota": _2, "toys": _2, "trade": _2, "trading": _2, "training": _2, "travel": _2, "travelers": _2, "travelersinsurance": _2, "trust": _2, "trv": _2, "tube": _2, "tui": _2, "tunes": _2, "tushu": _2, "tvs": _2, "ubank": _2, "ubs": _2, "unicom": _2, "university": _2, "uno": _2, "uol": _2, "ups": _2, "vacations": _2, "vana": _2, "vanguard": _2, "vegas": _2, "ventures": _2, "verisign": _2, "versicherung": _2, "vet": _2, "viajes": _2, "video": _2, "vig": _2, "viking": _2, "villas": _2, "vin": _2, "vip": [1, { "hidns": _3 }], "virgin": _2, "visa": _2, "vision": _2, "viva": _2, "vivo": _2, "vlaanderen": _2, "vodka": _2, "volvo": _2, "vote": _2, "voting": _2, "voto": _2, "voyage": _2, "wales": _2, "walmart": _2, "walter": _2, "wang": _2, "wanggou": _2, "watch": _2, "watches": _2, "weather": _2, "weatherchannel": _2, "webcam": _2, "weber": _2, "website": _61, "wed": _2, "wedding": _2, "weibo": _2, "weir": _2, "whoswho": _2, "wien": _2, "wiki": _61, "williamhill": _2, "win": _2, "windows": _2, "wine": _2, "winners": _2, "wme": _2, "wolterskluwer": _2, "woodside": _2, "work": _2, "works": _2, "world": _2, "wow": _2, "wtc": _2, "wtf": _2, "xbox": _2, "xerox": _2, "xihuan": _2, "xin": _2, "xn--11b4c3d": _2, "\u0915\u0949\u092E": _2, "xn--1ck2e1b": _2, "\u30BB\u30FC\u30EB": _2, "xn--1qqw23a": _2, "\u4F5B\u5C71": _2, "xn--30rr7y": _2, "\u6148\u5584": _2, "xn--3bst00m": _2, "\u96C6\u56E2": _2, "xn--3ds443g": _2, "\u5728\u7EBF": _2, "xn--3pxu8k": _2, "\u70B9\u770B": _2, "xn--42c2d9a": _2, "\u0E04\u0E2D\u0E21": _2, "xn--45q11c": _2, "\u516B\u5366": _2, "xn--4gbrim": _2, "\u0645\u0648\u0642\u0639": _2, "xn--55qw42g": _2, "\u516C\u76CA": _2, "xn--55qx5d": _2, "\u516C\u53F8": _2, "xn--5su34j936bgsg": _2, "\u9999\u683C\u91CC\u62C9": _2, "xn--5tzm5g": _2, "\u7F51\u7AD9": _2, "xn--6frz82g": _2, "\u79FB\u52A8": _2, "xn--6qq986b3xl": _2, "\u6211\u7231\u4F60": _2, "xn--80adxhks": _2, "\u043C\u043E\u0441\u043A\u0432\u0430": _2, "xn--80aqecdr1a": _2, "\u043A\u0430\u0442\u043E\u043B\u0438\u043A": _2, "xn--80asehdb": _2, "\u043E\u043D\u043B\u0430\u0439\u043D": _2, "xn--80aswg": _2, "\u0441\u0430\u0439\u0442": _2, "xn--8y0a063a": _2, "\u8054\u901A": _2, "xn--9dbq2a": _2, "\u05E7\u05D5\u05DD": _2, "xn--9et52u": _2, "\u65F6\u5C1A": _2, "xn--9krt00a": _2, "\u5FAE\u535A": _2, "xn--b4w605ferd": _2, "\u6DE1\u9A6C\u9521": _2, "xn--bck1b9a5dre4c": _2, "\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3": _2, "xn--c1avg": _2, "\u043E\u0440\u0433": _2, "xn--c2br7g": _2, "\u0928\u0947\u091F": _2, "xn--cck2b3b": _2, "\u30B9\u30C8\u30A2": _2, "xn--cckwcxetd": _2, "\u30A2\u30DE\u30BE\u30F3": _2, "xn--cg4bki": _2, "\uC0BC\uC131": _2, "xn--czr694b": _2, "\u5546\u6807": _2, "xn--czrs0t": _2, "\u5546\u5E97": _2, "xn--czru2d": _2, "\u5546\u57CE": _2, "xn--d1acj3b": _2, "\u0434\u0435\u0442\u0438": _2, "xn--eckvdtc9d": _2, "\u30DD\u30A4\u30F3\u30C8": _2, "xn--efvy88h": _2, "\u65B0\u95FB": _2, "xn--fct429k": _2, "\u5BB6\u96FB": _2, "xn--fhbei": _2, "\u0643\u0648\u0645": _2, "xn--fiq228c5hs": _2, "\u4E2D\u6587\u7F51": _2, "xn--fiq64b": _2, "\u4E2D\u4FE1": _2, "xn--fjq720a": _2, "\u5A31\u4E50": _2, "xn--flw351e": _2, "\u8C37\u6B4C": _2, "xn--fzys8d69uvgm": _2, "\u96FB\u8A0A\u76C8\u79D1": _2, "xn--g2xx48c": _2, "\u8D2D\u7269": _2, "xn--gckr3f0f": _2, "\u30AF\u30E9\u30A6\u30C9": _2, "xn--gk3at1e": _2, "\u901A\u8CA9": _2, "xn--hxt814e": _2, "\u7F51\u5E97": _2, "xn--i1b6b1a6a2e": _2, "\u0938\u0902\u0917\u0920\u0928": _2, "xn--imr513n": _2, "\u9910\u5385": _2, "xn--io0a7i": _2, "\u7F51\u7EDC": _2, "xn--j1aef": _2, "\u043A\u043E\u043C": _2, "xn--jlq480n2rg": _2, "\u4E9A\u9A6C\u900A": _2, "xn--jvr189m": _2, "\u98DF\u54C1": _2, "xn--kcrx77d1x4a": _2, "\u98DE\u5229\u6D66": _2, "xn--kput3i": _2, "\u624B\u673A": _2, "xn--mgba3a3ejt": _2, "\u0627\u0631\u0627\u0645\u0643\u0648": _2, "xn--mgba7c0bbn0a": _2, "\u0627\u0644\u0639\u0644\u064A\u0627\u0646": _2, "xn--mgbab2bd": _2, "\u0628\u0627\u0632\u0627\u0631": _2, "xn--mgbca7dzdo": _2, "\u0627\u0628\u0648\u0638\u0628\u064A": _2, "xn--mgbi4ecexp": _2, "\u0643\u0627\u062B\u0648\u0644\u064A\u0643": _2, "xn--mgbt3dhd": _2, "\u0647\u0645\u0631\u0627\u0647": _2, "xn--mk1bu44c": _2, "\uB2F7\uCEF4": _2, "xn--mxtq1m": _2, "\u653F\u5E9C": _2, "xn--ngbc5azd": _2, "\u0634\u0628\u0643\u0629": _2, "xn--ngbe9e0a": _2, "\u0628\u064A\u062A\u0643": _2, "xn--ngbrx": _2, "\u0639\u0631\u0628": _2, "xn--nqv7f": _2, "\u673A\u6784": _2, "xn--nqv7fs00ema": _2, "\u7EC4\u7EC7\u673A\u6784": _2, "xn--nyqy26a": _2, "\u5065\u5EB7": _2, "xn--otu796d": _2, "\u62DB\u8058": _2, "xn--p1acf": [1, { "xn--90amc": _3, "xn--j1aef": _3, "xn--j1ael8b": _3, "xn--h1ahn": _3, "xn--j1adp": _3, "xn--c1avg": _3, "xn--80aaa0cvac": _3, "xn--h1aliz": _3, "xn--90a1af": _3, "xn--41a": _3 }], "\u0440\u0443\u0441": [1, { "\u0431\u0438\u0437": _3, "\u043A\u043E\u043C": _3, "\u043A\u0440\u044B\u043C": _3, "\u043C\u0438\u0440": _3, "\u043C\u0441\u043A": _3, "\u043E\u0440\u0433": _3, "\u0441\u0430\u043C\u0430\u0440\u0430": _3, "\u0441\u043E\u0447\u0438": _3, "\u0441\u043F\u0431": _3, "\u044F": _3 }], "xn--pssy2u": _2, "\u5927\u62FF": _2, "xn--q9jyb4c": _2, "\u307F\u3093\u306A": _2, "xn--qcka1pmc": _2, "\u30B0\u30FC\u30B0\u30EB": _2, "xn--rhqv96g": _2, "\u4E16\u754C": _2, "xn--rovu88b": _2, "\u66F8\u7C4D": _2, "xn--ses554g": _2, "\u7F51\u5740": _2, "xn--t60b56a": _2, "\uB2F7\uB137": _2, "xn--tckwe": _2, "\u30B3\u30E0": _2, "xn--tiq49xqyj": _2, "\u5929\u4E3B\u6559": _2, "xn--unup4y": _2, "\u6E38\u620F": _2, "xn--vermgensberater-ctb": _2, "verm\xF6gensberater": _2, "xn--vermgensberatung-pwb": _2, "verm\xF6gensberatung": _2, "xn--vhquv": _2, "\u4F01\u4E1A": _2, "xn--vuq861b": _2, "\u4FE1\u606F": _2, "xn--w4r85el8fhu5dnra": _2, "\u5609\u91CC\u5927\u9152\u5E97": _2, "xn--w4rs40l": _2, "\u5609\u91CC": _2, "xn--xhq521b": _2, "\u5E7F\u4E1C": _2, "xn--zfr164b": _2, "\u653F\u52A1": _2, "xyz": [1, { "botdash": _3, "telebit": _6 }], "yachts": _2, "yahoo": _2, "yamaxun": _2, "yandex": _2, "yodobashi": _2, "yoga": _2, "yokohama": _2, "you": _2, "youtube": _2, "yun": _2, "zappos": _2, "zara": _2, "zero": _2, "zip": _2, "zone": [1, { "triton": _6, "stackit": _3, "lima": _3 }], "zuerich": _2 }]; + return rules2; +})(); + +// node_modules/tldts/dist/es6/src/suffix-trie.js +function lookupInTrie(parts, trie, index, allowedMask) { + let result = null; + let node = trie; + while (node !== void 0) { + if ((node[0] & allowedMask) !== 0) { + result = { + index: index + 1, + isIcann: node[0] === 1, + isPrivate: node[0] === 2 + }; + } + if (index === -1) { + break; + } + const succ = node[1]; + node = Object.prototype.hasOwnProperty.call(succ, parts[index]) ? succ[parts[index]] : succ["*"]; + index -= 1; + } + return result; +} +function suffixLookup(hostname, options, out) { + var _a2; + if (fast_path_default(hostname, options, out)) { + return; + } + const hostnameParts = hostname.split("."); + const allowedMask = (options.allowPrivateDomains ? 2 : 0) | (options.allowIcannDomains ? 1 : 0); + const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask); + if (exceptionMatch !== null) { + out.isIcann = exceptionMatch.isIcann; + out.isPrivate = exceptionMatch.isPrivate; + out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join("."); + return; + } + const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask); + if (rulesMatch !== null) { + out.isIcann = rulesMatch.isIcann; + out.isPrivate = rulesMatch.isPrivate; + out.publicSuffix = hostnameParts.slice(rulesMatch.index).join("."); + return; + } + out.isIcann = false; + out.isPrivate = false; + out.publicSuffix = (_a2 = hostnameParts[hostnameParts.length - 1]) !== null && _a2 !== void 0 ? _a2 : null; +} + +// node_modules/tldts/dist/es6/index.js +var RESULT = getEmptyResult(); +function getDomain2(url, options = {}) { + resetResult(RESULT); + return parseImpl(url, 3, suffixLookup, options, RESULT).domain; +} + +// node_modules/tough-cookie/dist/index.js +function pathMatch(reqPath, cookiePath) { + if (cookiePath === reqPath) { + return true; + } + const idx = reqPath.indexOf(cookiePath); + if (idx === 0) { + if (cookiePath[cookiePath.length - 1] === "/") { + return true; + } + if (reqPath.startsWith(cookiePath) && reqPath[cookiePath.length] === "/") { + return true; + } + } + return false; +} +var SPECIAL_USE_DOMAINS = ["local", "example", "invalid", "localhost", "test"]; +var SPECIAL_TREATMENT_DOMAINS = ["localhost", "invalid"]; +var defaultGetPublicSuffixOptions = { + allowSpecialUseDomain: false, + ignoreError: false +}; +function getPublicSuffix(domain, options = {}) { + options = { ...defaultGetPublicSuffixOptions, ...options }; + const domainParts = domain.split("."); + const topLevelDomain = domainParts[domainParts.length - 1]; + const allowSpecialUseDomain = !!options.allowSpecialUseDomain; + const ignoreError = !!options.ignoreError; + if (allowSpecialUseDomain && topLevelDomain !== void 0 && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) { + if (domainParts.length > 1) { + const secondLevelDomain = domainParts[domainParts.length - 2]; + return `${secondLevelDomain}.${topLevelDomain}`; + } else if (SPECIAL_TREATMENT_DOMAINS.includes(topLevelDomain)) { + return topLevelDomain; + } + } + if (!ignoreError && topLevelDomain !== void 0 && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) { + throw new Error( + `Cookie has domain set to the public suffix "${topLevelDomain}" which is a special use domain. To allow this, configure your CookieJar with {allowSpecialUseDomain: true, rejectPublicSuffixes: false}.` + ); + } + const publicSuffix = getDomain2(domain, { + allowIcannDomains: true, + allowPrivateDomains: true + }); + if (publicSuffix) return publicSuffix; +} +function permuteDomain(domain, allowSpecialUseDomain) { + const pubSuf = getPublicSuffix(domain, { + allowSpecialUseDomain + }); + if (!pubSuf) { + return void 0; + } + if (pubSuf == domain) { + return [domain]; + } + if (domain.slice(-1) == ".") { + domain = domain.slice(0, -1); + } + const prefix = domain.slice(0, -(pubSuf.length + 1)); + const parts = prefix.split(".").reverse(); + let cur = pubSuf; + const permutations = [cur]; + while (parts.length) { + const part = parts.shift(); + cur = `${part}.${cur}`; + permutations.push(cur); + } + return permutations; +} +var Store = class { + constructor() { + this.synchronous = false; + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + findCookie(_domain, _path, _key, _callback) { + throw new Error("findCookie is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + findCookies(_domain, _path, _allowSpecialUseDomain = false, _callback) { + throw new Error("findCookies is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + putCookie(_cookie, _callback) { + throw new Error("putCookie is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + updateCookie(_oldCookie, _newCookie, _callback) { + throw new Error("updateCookie is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + removeCookie(_domain, _path, _key, _callback) { + throw new Error("removeCookie is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + removeCookies(_domain, _path, _callback) { + throw new Error("removeCookies is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + removeAllCookies(_callback) { + throw new Error("removeAllCookies is not implemented"); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + getAllCookies(_callback) { + throw new Error( + "getAllCookies is not implemented (therefore jar cannot be serialized)" + ); + } +}; +var objectToString = (obj) => Object.prototype.toString.call(obj); +var safeArrayToString = (arr, seenArrays) => { + if (typeof arr.join !== "function") return objectToString(arr); + seenArrays.add(arr); + const mapped = arr.map( + (val) => val === null || val === void 0 || seenArrays.has(val) ? "" : safeToStringImpl(val, seenArrays) + ); + return mapped.join(); +}; +var safeToStringImpl = (val, seenArrays = /* @__PURE__ */ new WeakSet()) => { + if (typeof val !== "object" || val === null) { + return String(val); + } else if (typeof val.toString === "function") { + return Array.isArray(val) ? ( + // Arrays have a weird custom toString that we need to replicate + safeArrayToString(val, seenArrays) + ) : ( + // eslint-disable-next-line @typescript-eslint/no-base-to-string + String(val) + ); + } else { + return objectToString(val); + } +}; +var safeToString = (val) => safeToStringImpl(val); +function createPromiseCallback(cb) { + let callback; + let resolve; + let reject; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); + if (typeof cb === "function") { + callback = (err, result) => { + try { + if (err) cb(err); + else cb(null, result); + } catch (e) { + reject(e instanceof Error ? e : new Error()); + } + }; + } else { + callback = (err, result) => { + try { + if (err) reject(err); + else resolve(result); + } catch (e) { + reject(e instanceof Error ? e : new Error()); + } + }; + } + return { + promise, + callback, + resolve: (value) => { + callback(null, value); + return promise; + }, + reject: (error4) => { + callback(error4); + return promise; + } + }; +} +function inOperator(k, o) { + return k in o; +} +var MemoryCookieStore = class extends Store { + /** + * Create a new {@link MemoryCookieStore}. + */ + constructor() { + super(); + this.synchronous = true; + this.idx = /* @__PURE__ */ Object.create(null); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + findCookie(domain, path, key, callback) { + const promiseCallback = createPromiseCallback(callback); + if (domain == null || path == null || key == null) { + return promiseCallback.resolve(void 0); + } + const result = this.idx[domain]?.[path]?.[key]; + return promiseCallback.resolve(result); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + findCookies(domain, path, allowSpecialUseDomain = false, callback) { + if (typeof allowSpecialUseDomain === "function") { + callback = allowSpecialUseDomain; + allowSpecialUseDomain = true; + } + const results = []; + const promiseCallback = createPromiseCallback(callback); + if (!domain) { + return promiseCallback.resolve([]); + } + let pathMatcher; + if (!path) { + pathMatcher = function matchAll(domainIndex) { + for (const curPath in domainIndex) { + const pathIndex = domainIndex[curPath]; + for (const key in pathIndex) { + const value = pathIndex[key]; + if (value) { + results.push(value); + } + } + } + }; + } else { + pathMatcher = function matchRFC(domainIndex) { + for (const cookiePath in domainIndex) { + if (pathMatch(path, cookiePath)) { + const pathIndex = domainIndex[cookiePath]; + for (const key in pathIndex) { + const value = pathIndex[key]; + if (value) { + results.push(value); + } + } + } + } + }; + } + const domains = permuteDomain(domain, allowSpecialUseDomain) || [domain]; + const idx = this.idx; + domains.forEach((curDomain) => { + const domainIndex = idx[curDomain]; + if (!domainIndex) { + return; + } + pathMatcher(domainIndex); + }); + return promiseCallback.resolve(results); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + putCookie(cookie2, callback) { + const promiseCallback = createPromiseCallback(callback); + const { domain, path, key } = cookie2; + if (domain == null || path == null || key == null) { + return promiseCallback.resolve(void 0); + } + const domainEntry = this.idx[domain] ?? /* @__PURE__ */ Object.create(null); + this.idx[domain] = domainEntry; + const pathEntry = domainEntry[path] ?? /* @__PURE__ */ Object.create(null); + domainEntry[path] = pathEntry; + pathEntry[key] = cookie2; + return promiseCallback.resolve(void 0); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + updateCookie(_oldCookie, newCookie, callback) { + if (callback) this.putCookie(newCookie, callback); + else return this.putCookie(newCookie); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + removeCookie(domain, path, key, callback) { + const promiseCallback = createPromiseCallback(callback); + delete this.idx[domain]?.[path]?.[key]; + return promiseCallback.resolve(void 0); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + removeCookies(domain, path, callback) { + const promiseCallback = createPromiseCallback(callback); + const domainEntry = this.idx[domain]; + if (domainEntry) { + if (path) { + delete domainEntry[path]; + } else { + delete this.idx[domain]; + } + } + return promiseCallback.resolve(void 0); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + removeAllCookies(callback) { + const promiseCallback = createPromiseCallback(callback); + this.idx = /* @__PURE__ */ Object.create(null); + return promiseCallback.resolve(void 0); + } + /** + * @internal No doc because this is an overload that supports the implementation + */ + getAllCookies(callback) { + const promiseCallback = createPromiseCallback(callback); + const cookies = []; + const idx = this.idx; + const domains = Object.keys(idx); + domains.forEach((domain) => { + const domainEntry = idx[domain] ?? {}; + const paths = Object.keys(domainEntry); + paths.forEach((path) => { + const pathEntry = domainEntry[path] ?? {}; + const keys = Object.keys(pathEntry); + keys.forEach((key) => { + const keyEntry = pathEntry[key]; + if (keyEntry != null) { + cookies.push(keyEntry); + } + }); + }); + }); + cookies.sort((a, b) => { + return (a.creationIndex || 0) - (b.creationIndex || 0); + }); + return promiseCallback.resolve(cookies); + } +}; +function isNonEmptyString(data) { + return isString(data) && data !== ""; +} +function isEmptyString(data) { + return data === "" || data instanceof String && data.toString() === ""; +} +function isString(data) { + return typeof data === "string" || data instanceof String; +} +function isObject2(data) { + return objectToString(data) === "[object Object]"; +} +function validate(bool, cbOrMessage, message4) { + if (bool) return; + const cb = typeof cbOrMessage === "function" ? cbOrMessage : void 0; + let options = typeof cbOrMessage === "function" ? message4 : cbOrMessage; + if (!isObject2(options)) options = "[object Object]"; + const err = new ParameterError(safeToString(options)); + if (cb) cb(err); + else throw err; +} +var ParameterError = class extends Error { +}; +var version = "6.0.0"; +var PrefixSecurityEnum = { + SILENT: "silent", + STRICT: "strict", + DISABLED: "unsafe-disabled" +}; +Object.freeze(PrefixSecurityEnum); +var IP_V6_REGEX = ` +\\[?(?: +(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)| +(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)| +(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)| +(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)| +(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)| +(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)| +(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)| +(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)) +)(?:%[0-9a-zA-Z]{1,})?\\]? +`.replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim(); +var IP_V6_REGEX_OBJECT = new RegExp(`^${IP_V6_REGEX}$`); +var IP_V4_REGEX = `(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])`; +var IP_V4_REGEX_OBJECT = new RegExp(`^${IP_V4_REGEX}$`); +function domainToASCII(domain) { + return new URL(`http://${domain}`).hostname; +} +function canonicalDomain(domainName) { + if (domainName == null) { + return void 0; + } + let str = domainName.trim().replace(/^\./, ""); + if (IP_V6_REGEX_OBJECT.test(str)) { + if (!str.startsWith("[")) { + str = "[" + str; + } + if (!str.endsWith("]")) { + str = str + "]"; + } + return domainToASCII(str).slice(1, -1); + } + if (/[^\u0001-\u007f]/.test(str)) { + return domainToASCII(str); + } + return str.toLowerCase(); +} +function formatDate2(date) { + return date.toUTCString(); +} +var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; +var MONTH_TO_NUM = { + jan: 0, + feb: 1, + mar: 2, + apr: 3, + may: 4, + jun: 5, + jul: 6, + aug: 7, + sep: 8, + oct: 9, + nov: 10, + dec: 11 +}; +function parseDigits(token, minDigits, maxDigits, trailingOK) { + let count = 0; + while (count < token.length) { + const c = token.charCodeAt(count); + if (c <= 47 || c >= 58) { + break; + } + count++; + } + if (count < minDigits || count > maxDigits) { + return; + } + if (!trailingOK && count != token.length) { + return; + } + return parseInt(token.slice(0, count), 10); +} +function parseTime(token) { + const parts = token.split(":"); + const result = [0, 0, 0]; + if (parts.length !== 3) { + return; + } + for (let i = 0; i < 3; i++) { + const trailingOK = i == 2; + const numPart = parts[i]; + if (numPart === void 0) { + return; + } + const num = parseDigits(numPart, 1, 2, trailingOK); + if (num === void 0) { + return; + } + result[i] = num; + } + return result; +} +function parseMonth(token) { + token = String(token).slice(0, 3).toLowerCase(); + switch (token) { + case "jan": + return MONTH_TO_NUM.jan; + case "feb": + return MONTH_TO_NUM.feb; + case "mar": + return MONTH_TO_NUM.mar; + case "apr": + return MONTH_TO_NUM.apr; + case "may": + return MONTH_TO_NUM.may; + case "jun": + return MONTH_TO_NUM.jun; + case "jul": + return MONTH_TO_NUM.jul; + case "aug": + return MONTH_TO_NUM.aug; + case "sep": + return MONTH_TO_NUM.sep; + case "oct": + return MONTH_TO_NUM.oct; + case "nov": + return MONTH_TO_NUM.nov; + case "dec": + return MONTH_TO_NUM.dec; + default: + return; + } +} +function parseDate(cookieDate) { + if (!cookieDate) { + return; + } + const tokens = cookieDate.split(DATE_DELIM); + let hour; + let minute; + let second; + let dayOfMonth; + let month; + let year; + for (let i = 0; i < tokens.length; i++) { + const token = (tokens[i] ?? "").trim(); + if (!token.length) { + continue; + } + if (second === void 0) { + const result = parseTime(token); + if (result) { + hour = result[0]; + minute = result[1]; + second = result[2]; + continue; + } + } + if (dayOfMonth === void 0) { + const result = parseDigits(token, 1, 2, true); + if (result !== void 0) { + dayOfMonth = result; + continue; + } + } + if (month === void 0) { + const result = parseMonth(token); + if (result !== void 0) { + month = result; + continue; + } + } + if (year === void 0) { + const result = parseDigits(token, 2, 4, true); + if (result !== void 0) { + year = result; + if (year >= 70 && year <= 99) { + year += 1900; + } else if (year >= 0 && year <= 69) { + year += 2e3; + } + } + } + } + if (dayOfMonth === void 0 || month === void 0 || year === void 0 || hour === void 0 || minute === void 0 || second === void 0 || dayOfMonth < 1 || dayOfMonth > 31 || year < 1601 || hour > 23 || minute > 59 || second > 59) { + return; + } + return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); +} +var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; +var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; +var CONTROL_CHARS = /[\x00-\x1F]/; +var TERMINATORS = ["\n", "\r", "\0"]; +function trimTerminator(str) { + if (isEmptyString(str)) return str; + for (let t = 0; t < TERMINATORS.length; t++) { + const terminator = TERMINATORS[t]; + const terminatorIdx = terminator ? str.indexOf(terminator) : -1; + if (terminatorIdx !== -1) { + str = str.slice(0, terminatorIdx); + } + } + return str; +} +function parseCookiePair(cookiePair, looseMode) { + cookiePair = trimTerminator(cookiePair); + let firstEq = cookiePair.indexOf("="); + if (looseMode) { + if (firstEq === 0) { + cookiePair = cookiePair.substring(1); + firstEq = cookiePair.indexOf("="); + } + } else { + if (firstEq <= 0) { + return void 0; + } + } + let cookieName, cookieValue; + if (firstEq <= 0) { + cookieName = ""; + cookieValue = cookiePair.trim(); + } else { + cookieName = cookiePair.slice(0, firstEq).trim(); + cookieValue = cookiePair.slice(firstEq + 1).trim(); + } + if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { + return void 0; + } + const c = new Cookie(); + c.key = cookieName; + c.value = cookieValue; + return c; +} +function parse(str, options) { + if (isEmptyString(str) || !isString(str)) { + return void 0; + } + str = str.trim(); + const firstSemi = str.indexOf(";"); + const cookiePair = firstSemi === -1 ? str : str.slice(0, firstSemi); + const c = parseCookiePair(cookiePair, options?.loose ?? false); + if (!c) { + return void 0; + } + if (firstSemi === -1) { + return c; + } + const unparsed = str.slice(firstSemi + 1).trim(); + if (unparsed.length === 0) { + return c; + } + const cookie_avs = unparsed.split(";"); + while (cookie_avs.length) { + const av = (cookie_avs.shift() ?? "").trim(); + if (av.length === 0) { + continue; + } + const av_sep = av.indexOf("="); + let av_key, av_value; + if (av_sep === -1) { + av_key = av; + av_value = null; + } else { + av_key = av.slice(0, av_sep); + av_value = av.slice(av_sep + 1); + } + av_key = av_key.trim().toLowerCase(); + if (av_value) { + av_value = av_value.trim(); + } + switch (av_key) { + case "expires": + if (av_value) { + const exp = parseDate(av_value); + if (exp) { + c.expires = exp; + } + } + break; + case "max-age": + if (av_value) { + if (/^-?[0-9]+$/.test(av_value)) { + const delta = parseInt(av_value, 10); + c.setMaxAge(delta); + } + } + break; + case "domain": + if (av_value) { + const domain = av_value.trim().replace(/^\./, ""); + if (domain) { + c.domain = domain.toLowerCase(); + } + } + break; + case "path": + c.path = av_value && av_value[0] === "/" ? av_value : null; + break; + case "secure": + c.secure = true; + break; + case "httponly": + c.httpOnly = true; + break; + case "samesite": + switch (av_value ? av_value.toLowerCase() : "") { + case "strict": + c.sameSite = "strict"; + break; + case "lax": + c.sameSite = "lax"; + break; + case "none": + c.sameSite = "none"; + break; + default: + c.sameSite = void 0; + break; + } + break; + default: + c.extensions = c.extensions || []; + c.extensions.push(av); + break; + } + } + return c; +} +function fromJSON(str) { + if (!str || isEmptyString(str)) { + return void 0; + } + let obj; + if (typeof str === "string") { + try { + obj = JSON.parse(str); + } catch { + return void 0; + } + } else { + obj = str; + } + const c = new Cookie(); + Cookie.serializableProperties.forEach((prop) => { + if (obj && typeof obj === "object" && inOperator(prop, obj)) { + const val = obj[prop]; + if (val === void 0) { + return; + } + if (inOperator(prop, cookieDefaults) && val === cookieDefaults[prop]) { + return; + } + switch (prop) { + case "key": + case "value": + case "sameSite": + if (typeof val === "string") { + c[prop] = val; + } + break; + case "expires": + case "creation": + case "lastAccessed": + if (typeof val === "number" || typeof val === "string" || val instanceof Date) { + c[prop] = obj[prop] == "Infinity" ? "Infinity" : new Date(val); + } else if (val === null) { + c[prop] = null; + } + break; + case "maxAge": + if (typeof val === "number" || val === "Infinity" || val === "-Infinity") { + c[prop] = val; + } + break; + case "domain": + case "path": + if (typeof val === "string" || val === null) { + c[prop] = val; + } + break; + case "secure": + case "httpOnly": + if (typeof val === "boolean") { + c[prop] = val; + } + break; + case "extensions": + if (Array.isArray(val) && val.every((item) => typeof item === "string")) { + c[prop] = val; + } + break; + case "hostOnly": + case "pathIsDefault": + if (typeof val === "boolean" || val === null) { + c[prop] = val; + } + break; + } + } + }); + return c; +} +var cookieDefaults = { + // the order in which the RFC has them: + key: "", + value: "", + expires: "Infinity", + maxAge: null, + domain: null, + path: null, + secure: false, + httpOnly: false, + extensions: null, + // set by the CookieJar: + hostOnly: null, + pathIsDefault: null, + creation: null, + lastAccessed: null, + sameSite: void 0 +}; +var _Cookie = class _Cookie2 { + /** + * Create a new Cookie instance. + * @public + * @param options - The attributes to set on the cookie + */ + constructor(options = {}) { + this.key = options.key ?? cookieDefaults.key; + this.value = options.value ?? cookieDefaults.value; + this.expires = options.expires ?? cookieDefaults.expires; + this.maxAge = options.maxAge ?? cookieDefaults.maxAge; + this.domain = options.domain ?? cookieDefaults.domain; + this.path = options.path ?? cookieDefaults.path; + this.secure = options.secure ?? cookieDefaults.secure; + this.httpOnly = options.httpOnly ?? cookieDefaults.httpOnly; + this.extensions = options.extensions ?? cookieDefaults.extensions; + this.creation = options.creation ?? cookieDefaults.creation; + this.hostOnly = options.hostOnly ?? cookieDefaults.hostOnly; + this.pathIsDefault = options.pathIsDefault ?? cookieDefaults.pathIsDefault; + this.lastAccessed = options.lastAccessed ?? cookieDefaults.lastAccessed; + this.sameSite = options.sameSite ?? cookieDefaults.sameSite; + this.creation = options.creation ?? /* @__PURE__ */ new Date(); + Object.defineProperty(this, "creationIndex", { + configurable: false, + enumerable: false, + // important for assert.deepEqual checks + writable: true, + value: ++_Cookie2.cookiesCreated + }); + this.creationIndex = _Cookie2.cookiesCreated; + } + [Symbol.for("nodejs.util.inspect.custom")]() { + const now = Date.now(); + const hostOnly = this.hostOnly != null ? this.hostOnly.toString() : "?"; + const createAge = this.creation && this.creation !== "Infinity" ? `${String(now - this.creation.getTime())}ms` : "?"; + const accessAge = this.lastAccessed && this.lastAccessed !== "Infinity" ? `${String(now - this.lastAccessed.getTime())}ms` : "?"; + return `Cookie="${this.toString()}; hostOnly=${hostOnly}; aAge=${accessAge}; cAge=${createAge}"`; + } + /** + * For convenience in using `JSON.stringify(cookie)`. Returns a plain-old Object that can be JSON-serialized. + * + * @remarks + * - Any `Date` properties (such as {@link Cookie.expires}, {@link Cookie.creation}, and {@link Cookie.lastAccessed}) are exported in ISO format (`Date.toISOString()`). + * + * - Custom Cookie properties are discarded. In tough-cookie 1.x, since there was no {@link Cookie.toJSON} method explicitly defined, all enumerable properties were captured. + * If you want a property to be serialized, add the property name to {@link Cookie.serializableProperties}. + */ + toJSON() { + const obj = {}; + for (const prop of _Cookie2.serializableProperties) { + const val = this[prop]; + if (val === cookieDefaults[prop]) { + continue; + } + switch (prop) { + case "key": + case "value": + case "sameSite": + if (typeof val === "string") { + obj[prop] = val; + } + break; + case "expires": + case "creation": + case "lastAccessed": + if (typeof val === "number" || typeof val === "string" || val instanceof Date) { + obj[prop] = val == "Infinity" ? "Infinity" : new Date(val).toISOString(); + } else if (val === null) { + obj[prop] = null; + } + break; + case "maxAge": + if (typeof val === "number" || val === "Infinity" || val === "-Infinity") { + obj[prop] = val; + } + break; + case "domain": + case "path": + if (typeof val === "string" || val === null) { + obj[prop] = val; + } + break; + case "secure": + case "httpOnly": + if (typeof val === "boolean") { + obj[prop] = val; + } + break; + case "extensions": + if (Array.isArray(val)) { + obj[prop] = val; + } + break; + case "hostOnly": + case "pathIsDefault": + if (typeof val === "boolean" || val === null) { + obj[prop] = val; + } + break; + } + } + return obj; + } + /** + * Does a deep clone of this cookie, implemented exactly as `Cookie.fromJSON(cookie.toJSON())`. + * @public + */ + clone() { + return fromJSON(this.toJSON()); + } + /** + * Validates cookie attributes for semantic correctness. Useful for "lint" checking any `Set-Cookie` headers you generate. + * For now, it returns a boolean, but eventually could return a reason string. + * + * @remarks + * Works for a few things, but is by no means comprehensive. + * + * @beta + */ + validate() { + if (!this.value || !COOKIE_OCTETS.test(this.value)) { + return false; + } + if (this.expires != "Infinity" && !(this.expires instanceof Date) && !parseDate(this.expires)) { + return false; + } + if (this.maxAge != null && this.maxAge !== "Infinity" && (this.maxAge === "-Infinity" || this.maxAge <= 0)) { + return false; + } + if (this.path != null && !PATH_VALUE.test(this.path)) { + return false; + } + const cdomain = this.cdomain(); + if (cdomain) { + if (cdomain.match(/\.$/)) { + return false; + } + const suffix = getPublicSuffix(cdomain); + if (suffix == null) { + return false; + } + } + return true; + } + /** + * Sets the 'Expires' attribute on a cookie. + * + * @remarks + * When given a `string` value it will be parsed with {@link parseDate}. If the value can't be parsed as a cookie date + * then the 'Expires' attribute will be set to `"Infinity"`. + * + * @param exp - the new value for the 'Expires' attribute of the cookie. + */ + setExpires(exp) { + if (exp instanceof Date) { + this.expires = exp; + } else { + this.expires = parseDate(exp) || "Infinity"; + } + } + /** + * Sets the 'Max-Age' attribute (in seconds) on a cookie. + * + * @remarks + * Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it can be serialized to JSON. + * + * @param age - the new value for the 'Max-Age' attribute (in seconds). + */ + setMaxAge(age) { + if (age === Infinity) { + this.maxAge = "Infinity"; + } else if (age === -Infinity) { + this.maxAge = "-Infinity"; + } else { + this.maxAge = age; + } + } + /** + * Encodes to a `Cookie` header value (specifically, the {@link Cookie.key} and {@link Cookie.value} properties joined with "="). + * @public + */ + cookieString() { + const val = this.value || ""; + if (this.key) { + return `${this.key}=${val}`; + } + return val; + } + /** + * Encodes to a `Set-Cookie header` value. + * @public + */ + toString() { + let str = this.cookieString(); + if (this.expires != "Infinity") { + if (this.expires instanceof Date) { + str += `; Expires=${formatDate2(this.expires)}`; + } + } + if (this.maxAge != null && this.maxAge != Infinity) { + str += `; Max-Age=${String(this.maxAge)}`; + } + if (this.domain && !this.hostOnly) { + str += `; Domain=${this.domain}`; + } + if (this.path) { + str += `; Path=${this.path}`; + } + if (this.secure) { + str += "; Secure"; + } + if (this.httpOnly) { + str += "; HttpOnly"; + } + if (this.sameSite && this.sameSite !== "none") { + if (this.sameSite.toLowerCase() === _Cookie2.sameSiteCanonical.lax.toLowerCase()) { + str += `; SameSite=${_Cookie2.sameSiteCanonical.lax}`; + } else if (this.sameSite.toLowerCase() === _Cookie2.sameSiteCanonical.strict.toLowerCase()) { + str += `; SameSite=${_Cookie2.sameSiteCanonical.strict}`; + } else { + str += `; SameSite=${this.sameSite}`; + } + } + if (this.extensions) { + this.extensions.forEach((ext) => { + str += `; ${ext}`; + }); + } + return str; + } + /** + * Computes the TTL relative to now (milliseconds). + * + * @remarks + * - `Infinity` is returned for cookies without an explicit expiry + * + * - `0` is returned if the cookie is expired. + * + * - Otherwise a time-to-live in milliseconds is returned. + * + * @param now - passing an explicit value is mostly used for testing purposes since this defaults to the `Date.now()` + * @public + */ + TTL(now = Date.now()) { + if (this.maxAge != null && typeof this.maxAge === "number") { + return this.maxAge <= 0 ? 0 : this.maxAge * 1e3; + } + const expires = this.expires; + if (expires === "Infinity") { + return Infinity; + } + return (expires?.getTime() ?? now) - (now || Date.now()); + } + /** + * Computes the absolute unix-epoch milliseconds that this cookie expires. + * + * The "Max-Age" attribute takes precedence over "Expires" (as per the RFC). The {@link Cookie.lastAccessed} attribute + * (or the `now` parameter if given) is used to offset the {@link Cookie.maxAge} attribute. + * + * If Expires ({@link Cookie.expires}) is set, that's returned. + * + * @param now - can be used to provide a time offset (instead of {@link Cookie.lastAccessed}) to use when calculating the "Max-Age" value + */ + expiryTime(now) { + if (this.maxAge != null) { + const relativeTo = now || this.lastAccessed || /* @__PURE__ */ new Date(); + const maxAge = typeof this.maxAge === "number" ? this.maxAge : -Infinity; + const age = maxAge <= 0 ? -Infinity : maxAge * 1e3; + if (relativeTo === "Infinity") { + return Infinity; + } + return relativeTo.getTime() + age; + } + if (this.expires == "Infinity") { + return Infinity; + } + return this.expires ? this.expires.getTime() : void 0; + } + /** + * Similar to {@link Cookie.expiryTime}, computes the absolute unix-epoch milliseconds that this cookie expires and returns it as a Date. + * + * The "Max-Age" attribute takes precedence over "Expires" (as per the RFC). The {@link Cookie.lastAccessed} attribute + * (or the `now` parameter if given) is used to offset the {@link Cookie.maxAge} attribute. + * + * If Expires ({@link Cookie.expires}) is set, that's returned. + * + * @param now - can be used to provide a time offset (instead of {@link Cookie.lastAccessed}) to use when calculating the "Max-Age" value + */ + expiryDate(now) { + const millisec = this.expiryTime(now); + if (millisec == Infinity) { + return /* @__PURE__ */ new Date(2147483647e3); + } else if (millisec == -Infinity) { + return /* @__PURE__ */ new Date(0); + } else { + return millisec == void 0 ? void 0 : new Date(millisec); + } + } + /** + * Indicates if the cookie has been persisted to a store or not. + * @public + */ + isPersistent() { + return this.maxAge != null || this.expires != "Infinity"; + } + /** + * Calls {@link canonicalDomain} with the {@link Cookie.domain} property. + * @public + */ + canonicalizedDomain() { + return canonicalDomain(this.domain); + } + /** + * Alias for {@link Cookie.canonicalizedDomain} + * @public + */ + cdomain() { + return canonicalDomain(this.domain); + } + /** + * Parses a string into a Cookie object. + * + * @remarks + * Note: when parsing a `Cookie` header it must be split by ';' before each Cookie string can be parsed. + * + * @example + * ``` + * // parse a `Set-Cookie` header + * const setCookieHeader = 'a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT' + * const cookie = Cookie.parse(setCookieHeader) + * cookie.key === 'a' + * cookie.value === 'bcd' + * cookie.expires === new Date(Date.parse('Tue, 18 Oct 2011 07:05:03 GMT')) + * ``` + * + * @example + * ``` + * // parse a `Cookie` header + * const cookieHeader = 'name=value; name2=value2; name3=value3' + * const cookies = cookieHeader.split(';').map(Cookie.parse) + * cookies[0].name === 'name' + * cookies[0].value === 'value' + * cookies[1].name === 'name2' + * cookies[1].value === 'value2' + * cookies[2].name === 'name3' + * cookies[2].value === 'value3' + * ``` + * + * @param str - The `Set-Cookie` header or a Cookie string to parse. + * @param options - Configures `strict` or `loose` mode for cookie parsing + */ + static parse(str, options) { + return parse(str, options); + } + /** + * Does the reverse of {@link Cookie.toJSON}. + * + * @remarks + * Any Date properties (such as .expires, .creation, and .lastAccessed) are parsed via Date.parse, not tough-cookie's parseDate, since ISO timestamps are being handled at this layer. + * + * @example + * ``` + * const json = JSON.stringify({ + * key: 'alpha', + * value: 'beta', + * domain: 'example.com', + * path: '/foo', + * expires: '2038-01-19T03:14:07.000Z', + * }) + * const cookie = Cookie.fromJSON(json) + * cookie.key === 'alpha' + * cookie.value === 'beta' + * cookie.domain === 'example.com' + * cookie.path === '/foo' + * cookie.expires === new Date(Date.parse('2038-01-19T03:14:07.000Z')) + * ``` + * + * @param str - An unparsed JSON string or a value that has already been parsed as JSON + */ + static fromJSON(str) { + return fromJSON(str); + } +}; +_Cookie.cookiesCreated = 0; +_Cookie.sameSiteLevel = { + strict: 3, + lax: 2, + none: 1 +}; +_Cookie.sameSiteCanonical = { + strict: "Strict", + lax: "Lax" +}; +_Cookie.serializableProperties = [ + "key", + "value", + "expires", + "maxAge", + "domain", + "path", + "secure", + "httpOnly", + "extensions", + "hostOnly", + "pathIsDefault", + "creation", + "lastAccessed", + "sameSite" +]; +var Cookie = _Cookie; +var MAX_TIME = 2147483647e3; +function cookieCompare(a, b) { + let cmp; + const aPathLen = a.path ? a.path.length : 0; + const bPathLen = b.path ? b.path.length : 0; + cmp = bPathLen - aPathLen; + if (cmp !== 0) { + return cmp; + } + const aTime = a.creation && a.creation instanceof Date ? a.creation.getTime() : MAX_TIME; + const bTime = b.creation && b.creation instanceof Date ? b.creation.getTime() : MAX_TIME; + cmp = aTime - bTime; + if (cmp !== 0) { + return cmp; + } + cmp = (a.creationIndex || 0) - (b.creationIndex || 0); + return cmp; +} +function defaultPath(path) { + if (!path || path.slice(0, 1) !== "/") { + return "/"; + } + if (path === "/") { + return path; + } + const rightSlash = path.lastIndexOf("/"); + if (rightSlash === 0) { + return "/"; + } + return path.slice(0, rightSlash); +} +var IP_REGEX_LOWERCASE = /(?:^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$)|(?:^(?:(?:[a-f\d]{1,4}:){7}(?:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,2}|:)|(?:[a-f\d]{1,4}:){4}(?:(?::[a-f\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,3}|:)|(?:[a-f\d]{1,4}:){3}(?:(?::[a-f\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,4}|:)|(?:[a-f\d]{1,4}:){2}(?:(?::[a-f\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,5}|:)|(?:[a-f\d]{1,4}:){1}(?:(?::[a-f\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,6}|:)|(?::(?:(?::[a-f\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,7}|:)))$)/; +function domainMatch(domain, cookieDomain, canonicalize) { + if (domain == null || cookieDomain == null) { + return void 0; + } + let _str; + let _domStr; + if (canonicalize !== false) { + _str = canonicalDomain(domain); + _domStr = canonicalDomain(cookieDomain); + } else { + _str = domain; + _domStr = cookieDomain; + } + if (_str == null || _domStr == null) { + return void 0; + } + if (_str == _domStr) { + return true; + } + const idx = _str.lastIndexOf(_domStr); + if (idx <= 0) { + return false; + } + if (_str.length !== _domStr.length + idx) { + return false; + } + if (_str.substring(idx - 1, idx) !== ".") { + return false; + } + return !IP_REGEX_LOWERCASE.test(_str); +} +function isLoopbackV4(address) { + const octets = address.split("."); + return octets.length === 4 && octets[0] !== void 0 && parseInt(octets[0], 10) === 127; +} +function isLoopbackV6(address) { + return address === "::1"; +} +function isNormalizedLocalhostTLD(lowerHost) { + return lowerHost.endsWith(".localhost"); +} +function isLocalHostname(host) { + const lowerHost = host.toLowerCase(); + return lowerHost === "localhost" || isNormalizedLocalhostTLD(lowerHost); +} +function hostNoBrackets(host) { + if (host.length >= 2 && host.startsWith("[") && host.endsWith("]")) { + return host.substring(1, host.length - 1); + } + return host; +} +function isPotentiallyTrustworthy(inputUrl, allowSecureOnLocal = true) { + let url; + if (typeof inputUrl === "string") { + try { + url = new URL(inputUrl); + } catch { + return false; + } + } else { + url = inputUrl; + } + const scheme = url.protocol.replace(":", "").toLowerCase(); + const hostname = hostNoBrackets(url.hostname).replace(/\.+$/, ""); + if (scheme === "https" || scheme === "wss") { + return true; + } + if (!allowSecureOnLocal) { + return false; + } + if (IP_V4_REGEX_OBJECT.test(hostname)) { + return isLoopbackV4(hostname); + } + if (IP_V6_REGEX_OBJECT.test(hostname)) { + return isLoopbackV6(hostname); + } + return isLocalHostname(hostname); +} +var defaultSetCookieOptions = { + loose: false, + sameSiteContext: void 0, + ignoreError: false, + http: true +}; +var defaultGetCookieOptions = { + http: true, + expire: true, + allPaths: false, + sameSiteContext: void 0, + sort: void 0 +}; +var SAME_SITE_CONTEXT_VAL_ERR = 'Invalid sameSiteContext option for getCookies(); expected one of "strict", "lax", or "none"'; +function getCookieContext(url) { + if (url && typeof url === "object" && "hostname" in url && typeof url.hostname === "string" && "pathname" in url && typeof url.pathname === "string" && "protocol" in url && typeof url.protocol === "string") { + return { + hostname: url.hostname, + pathname: url.pathname, + protocol: url.protocol + }; + } else if (typeof url === "string") { + try { + return new URL(decodeURI(url)); + } catch { + return new URL(url); + } + } else { + throw new ParameterError("`url` argument is not a string or URL."); + } +} +function checkSameSiteContext(value) { + const context = String(value).toLowerCase(); + if (context === "none" || context === "lax" || context === "strict") { + return context; + } else { + return void 0; + } +} +function isSecurePrefixConditionMet(cookie2) { + const startsWithSecurePrefix = typeof cookie2.key === "string" && cookie2.key.startsWith("__Secure-"); + return !startsWithSecurePrefix || cookie2.secure; +} +function isHostPrefixConditionMet(cookie2) { + const startsWithHostPrefix = typeof cookie2.key === "string" && cookie2.key.startsWith("__Host-"); + return !startsWithHostPrefix || Boolean( + cookie2.secure && cookie2.hostOnly && cookie2.path != null && cookie2.path === "/" + ); +} +function getNormalizedPrefixSecurity(prefixSecurity) { + const normalizedPrefixSecurity = prefixSecurity.toLowerCase(); + switch (normalizedPrefixSecurity) { + case PrefixSecurityEnum.STRICT: + case PrefixSecurityEnum.SILENT: + case PrefixSecurityEnum.DISABLED: + return normalizedPrefixSecurity; + default: + return PrefixSecurityEnum.SILENT; + } +} +var CookieJar = class _CookieJar { + /** + * Creates a new `CookieJar` instance. + * + * @remarks + * - If a custom store is not passed to the constructor, an in-memory store ({@link MemoryCookieStore} will be created and used. + * - If a boolean value is passed as the `options` parameter, this is equivalent to passing `{ rejectPublicSuffixes: }` + * + * @param store - a custom {@link Store} implementation (defaults to {@link MemoryCookieStore}) + * @param options - configures how cookies are processed by the cookie jar + */ + constructor(store, options) { + if (typeof options === "boolean") { + options = { rejectPublicSuffixes: options }; + } + this.rejectPublicSuffixes = options?.rejectPublicSuffixes ?? true; + this.enableLooseMode = options?.looseMode ?? false; + this.allowSpecialUseDomain = options?.allowSpecialUseDomain ?? true; + this.allowSecureOnLocal = options?.allowSecureOnLocal ?? true; + this.prefixSecurity = getNormalizedPrefixSecurity( + options?.prefixSecurity ?? "silent" + ); + this.store = store ?? new MemoryCookieStore(); + } + callSync(fn) { + if (!this.store.synchronous) { + throw new Error( + "CookieJar store is not synchronous; use async API instead." + ); + } + let syncErr = null; + let syncResult = void 0; + try { + fn.call(this, (error4, result) => { + syncErr = error4; + syncResult = result; + }); + } catch (err) { + syncErr = err; + } + if (syncErr) throw syncErr; + return syncResult; + } + /** + * @internal No doc because this is the overload implementation + */ + setCookie(cookie2, url, options, callback) { + if (typeof options === "function") { + callback = options; + options = void 0; + } + const promiseCallback = createPromiseCallback(callback); + const cb = promiseCallback.callback; + let context; + try { + if (typeof url === "string") { + validate( + isNonEmptyString(url), + callback, + safeToString(options) + ); + } + context = getCookieContext(url); + if (typeof url === "function") { + return promiseCallback.reject(new Error("No URL was specified")); + } + if (typeof options === "function") { + options = defaultSetCookieOptions; + } + validate(typeof cb === "function", cb); + if (!isNonEmptyString(cookie2) && !isObject2(cookie2) && cookie2 instanceof String && cookie2.length == 0) { + return promiseCallback.resolve(void 0); + } + } catch (err) { + return promiseCallback.reject(err); + } + const host = canonicalDomain(context.hostname) ?? null; + const loose = options?.loose || this.enableLooseMode; + let sameSiteContext = null; + if (options?.sameSiteContext) { + sameSiteContext = checkSameSiteContext(options.sameSiteContext); + if (!sameSiteContext) { + return promiseCallback.reject(new Error(SAME_SITE_CONTEXT_VAL_ERR)); + } + } + if (typeof cookie2 === "string" || cookie2 instanceof String) { + const parsedCookie = Cookie.parse(cookie2.toString(), { loose }); + if (!parsedCookie) { + const err = new Error("Cookie failed to parse"); + return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err); + } + cookie2 = parsedCookie; + } else if (!(cookie2 instanceof Cookie)) { + const err = new Error( + "First argument to setCookie must be a Cookie object or string" + ); + return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err); + } + const now = options?.now || /* @__PURE__ */ new Date(); + if (this.rejectPublicSuffixes && cookie2.domain) { + try { + const cdomain = cookie2.cdomain(); + const suffix = typeof cdomain === "string" ? getPublicSuffix(cdomain, { + allowSpecialUseDomain: this.allowSpecialUseDomain, + ignoreError: options?.ignoreError + }) : null; + if (suffix == null && !IP_V6_REGEX_OBJECT.test(cookie2.domain)) { + const err = new Error("Cookie has domain set to a public suffix"); + return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err); + } + } catch (err) { + return options?.ignoreError ? promiseCallback.resolve(void 0) : ( + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + promiseCallback.reject(err) + ); + } + } + if (cookie2.domain) { + if (!domainMatch(host ?? void 0, cookie2.cdomain() ?? void 0, false)) { + const err = new Error( + `Cookie not in this host's domain. Cookie:${cookie2.cdomain() ?? "null"} Request:${host ?? "null"}` + ); + return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err); + } + if (cookie2.hostOnly == null) { + cookie2.hostOnly = false; + } + } else { + cookie2.hostOnly = true; + cookie2.domain = host; + } + if (!cookie2.path || cookie2.path[0] !== "/") { + cookie2.path = defaultPath(context.pathname); + cookie2.pathIsDefault = true; + } + if (options?.http === false && cookie2.httpOnly) { + const err = new Error("Cookie is HttpOnly and this isn't an HTTP API"); + return options.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err); + } + if (cookie2.sameSite !== "none" && cookie2.sameSite !== void 0 && sameSiteContext) { + if (sameSiteContext === "none") { + const err = new Error( + "Cookie is SameSite but this is a cross-origin request" + ); + return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err); + } + } + const ignoreErrorForPrefixSecurity = this.prefixSecurity === PrefixSecurityEnum.SILENT; + const prefixSecurityDisabled = this.prefixSecurity === PrefixSecurityEnum.DISABLED; + if (!prefixSecurityDisabled) { + let errorFound = false; + let errorMsg; + if (!isSecurePrefixConditionMet(cookie2)) { + errorFound = true; + errorMsg = "Cookie has __Secure prefix but Secure attribute is not set"; + } else if (!isHostPrefixConditionMet(cookie2)) { + errorFound = true; + errorMsg = "Cookie has __Host prefix but either Secure or HostOnly attribute is not set or Path is not '/'"; + } + if (errorFound) { + return options?.ignoreError || ignoreErrorForPrefixSecurity ? promiseCallback.resolve(void 0) : promiseCallback.reject(new Error(errorMsg)); + } + } + const store = this.store; + if (!store.updateCookie) { + store.updateCookie = async function(_oldCookie, newCookie, cb2) { + return this.putCookie(newCookie).then( + () => cb2?.(null), + (error4) => cb2?.(error4) + ); + }; + } + const withCookie = function withCookie2(err, oldCookie) { + if (err) { + cb(err); + return; + } + const next = function(err2) { + if (err2) { + cb(err2); + } else if (typeof cookie2 === "string") { + cb(null, void 0); + } else { + cb(null, cookie2); + } + }; + if (oldCookie) { + if (options && "http" in options && options.http === false && oldCookie.httpOnly) { + err = new Error("old Cookie is HttpOnly and this isn't an HTTP API"); + if (options.ignoreError) cb(null, void 0); + else cb(err); + return; + } + if (cookie2 instanceof Cookie) { + cookie2.creation = oldCookie.creation; + cookie2.creationIndex = oldCookie.creationIndex; + cookie2.lastAccessed = now; + store.updateCookie(oldCookie, cookie2, next); + } + } else { + if (cookie2 instanceof Cookie) { + cookie2.creation = cookie2.lastAccessed = now; + store.putCookie(cookie2, next); + } + } + }; + store.findCookie(cookie2.domain, cookie2.path, cookie2.key, withCookie); + return promiseCallback.promise; + } + /** + * Synchronously attempt to set the {@link Cookie} in the {@link CookieJar}. + * + * Note: Only works if the configured {@link Store} is also synchronous. + * + * @remarks + * - If successfully persisted, the {@link Cookie} will have updated + * {@link Cookie.creation}, {@link Cookie.lastAccessed} and {@link Cookie.hostOnly} + * properties. + * + * - As per the RFC, the {@link Cookie.hostOnly} flag is set if there was no `Domain={value}` + * attribute on the cookie string. The {@link Cookie.domain} property is set to the + * fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an + * exact hostname match (not a {@link domainMatch} as per usual) + * + * @param cookie - The cookie object or cookie string to store. A string value will be parsed into a cookie using {@link Cookie.parse}. + * @param url - The domain to store the cookie with. + * @param options - Configuration settings to use when storing the cookie. + * @public + */ + setCookieSync(cookie2, url, options) { + const setCookieFn = options ? this.setCookie.bind(this, cookie2, url, options) : this.setCookie.bind(this, cookie2, url); + return this.callSync(setCookieFn); + } + /** + * @internal No doc because this is the overload implementation + */ + getCookies(url, options, callback) { + if (typeof options === "function") { + callback = options; + options = defaultGetCookieOptions; + } else if (options === void 0) { + options = defaultGetCookieOptions; + } + const promiseCallback = createPromiseCallback(callback); + const cb = promiseCallback.callback; + let context; + try { + if (typeof url === "string") { + validate(isNonEmptyString(url), cb, url); + } + context = getCookieContext(url); + validate( + isObject2(options), + cb, + safeToString(options) + ); + validate(typeof cb === "function", cb); + } catch (parameterError) { + return promiseCallback.reject(parameterError); + } + const host = canonicalDomain(context.hostname); + const path = context.pathname || "/"; + const potentiallyTrustworthy = isPotentiallyTrustworthy( + url, + this.allowSecureOnLocal + ); + let sameSiteLevel = 0; + if (options.sameSiteContext) { + const sameSiteContext = checkSameSiteContext(options.sameSiteContext); + if (sameSiteContext == null) { + return promiseCallback.reject(new Error(SAME_SITE_CONTEXT_VAL_ERR)); + } + sameSiteLevel = Cookie.sameSiteLevel[sameSiteContext]; + if (!sameSiteLevel) { + return promiseCallback.reject(new Error(SAME_SITE_CONTEXT_VAL_ERR)); + } + } + const http2 = options.http ?? true; + const now = Date.now(); + const expireCheck = options.expire ?? true; + const allPaths = options.allPaths ?? false; + const store = this.store; + function matchingCookie(c) { + if (c.hostOnly) { + if (c.domain != host) { + return false; + } + } else { + if (!domainMatch(host ?? void 0, c.domain ?? void 0, false)) { + return false; + } + } + if (!allPaths && typeof c.path === "string" && !pathMatch(path, c.path)) { + return false; + } + if (c.secure && !potentiallyTrustworthy) { + return false; + } + if (c.httpOnly && !http2) { + return false; + } + if (sameSiteLevel) { + let cookieLevel; + if (c.sameSite === "lax") { + cookieLevel = Cookie.sameSiteLevel.lax; + } else if (c.sameSite === "strict") { + cookieLevel = Cookie.sameSiteLevel.strict; + } else { + cookieLevel = Cookie.sameSiteLevel.none; + } + if (cookieLevel > sameSiteLevel) { + return false; + } + } + const expiryTime = c.expiryTime(); + if (expireCheck && expiryTime != void 0 && expiryTime <= now) { + store.removeCookie(c.domain, c.path, c.key, () => { + }); + return false; + } + return true; + } + store.findCookies( + host, + allPaths ? null : path, + this.allowSpecialUseDomain, + (err, cookies) => { + if (err) { + cb(err); + return; + } + if (cookies == null) { + cb(null, []); + return; + } + cookies = cookies.filter(matchingCookie); + if ("sort" in options && options.sort !== false) { + cookies = cookies.sort(cookieCompare); + } + const now2 = /* @__PURE__ */ new Date(); + for (const cookie2 of cookies) { + cookie2.lastAccessed = now2; + } + cb(null, cookies); + } + ); + return promiseCallback.promise; + } + /** + * Synchronously retrieve the list of cookies that can be sent in a Cookie header for the + * current URL. + * + * Note: Only works if the configured Store is also synchronous. + * + * @remarks + * - The array of cookies returned will be sorted according to {@link cookieCompare}. + * + * - The {@link Cookie.lastAccessed} property will be updated on all returned cookies. + * + * @param url - The domain to store the cookie with. + * @param options - Configuration settings to use when retrieving the cookies. + */ + getCookiesSync(url, options) { + return this.callSync(this.getCookies.bind(this, url, options)) ?? []; + } + /** + * @internal No doc because this is the overload implementation + */ + getCookieString(url, options, callback) { + if (typeof options === "function") { + callback = options; + options = void 0; + } + const promiseCallback = createPromiseCallback(callback); + const next = function(err, cookies) { + if (err) { + promiseCallback.callback(err); + } else { + promiseCallback.callback( + null, + cookies?.sort(cookieCompare).map((c) => c.cookieString()).join("; ") + ); + } + }; + this.getCookies(url, options, next); + return promiseCallback.promise; + } + /** + * Synchronous version of `.getCookieString()`. Accepts the same options as `.getCookies()` but returns a string suitable for a + * `Cookie` header rather than an Array. + * + * Note: Only works if the configured Store is also synchronous. + * + * @param url - The domain to store the cookie with. + * @param options - Configuration settings to use when retrieving the cookies. + */ + getCookieStringSync(url, options) { + return this.callSync( + options ? this.getCookieString.bind(this, url, options) : this.getCookieString.bind(this, url) + ) ?? ""; + } + /** + * @internal No doc because this is the overload implementation + */ + getSetCookieStrings(url, options, callback) { + if (typeof options === "function") { + callback = options; + options = void 0; + } + const promiseCallback = createPromiseCallback( + callback + ); + const next = function(err, cookies) { + if (err) { + promiseCallback.callback(err); + } else { + promiseCallback.callback( + null, + cookies?.map((c) => { + return c.toString(); + }) + ); + } + }; + this.getCookies(url, options, next); + return promiseCallback.promise; + } + /** + * Synchronous version of `.getSetCookieStrings()`. Returns an array of strings suitable for `Set-Cookie` headers. + * Accepts the same options as `.getCookies()`. + * + * Note: Only works if the configured Store is also synchronous. + * + * @param url - The domain to store the cookie with. + * @param options - Configuration settings to use when retrieving the cookies. + */ + getSetCookieStringsSync(url, options = {}) { + return this.callSync(this.getSetCookieStrings.bind(this, url, options)) ?? []; + } + /** + * @internal No doc because this is the overload implementation + */ + serialize(callback) { + const promiseCallback = createPromiseCallback(callback); + let type = this.store.constructor.name; + if (isObject2(type)) { + type = null; + } + const serialized = { + // The version of tough-cookie that serialized this jar. Generally a good + // practice since future versions can make data import decisions based on + // known past behavior. When/if this matters, use `semver`. + version: `tough-cookie@${version}`, + // add the store type, to make humans happy: + storeType: type, + // CookieJar configuration: + rejectPublicSuffixes: this.rejectPublicSuffixes, + enableLooseMode: this.enableLooseMode, + allowSpecialUseDomain: this.allowSpecialUseDomain, + prefixSecurity: getNormalizedPrefixSecurity(this.prefixSecurity), + // this gets filled from getAllCookies: + cookies: [] + }; + if (typeof this.store.getAllCookies !== "function") { + return promiseCallback.reject( + new Error( + "store does not support getAllCookies and cannot be serialized" + ) + ); + } + this.store.getAllCookies((err, cookies) => { + if (err) { + promiseCallback.callback(err); + return; + } + if (cookies == null) { + promiseCallback.callback(null, serialized); + return; + } + serialized.cookies = cookies.map((cookie2) => { + const serializedCookie = cookie2.toJSON(); + delete serializedCookie.creationIndex; + return serializedCookie; + }); + promiseCallback.callback(null, serialized); + }); + return promiseCallback.promise; + } + /** + * Serialize the CookieJar if the underlying store supports `.getAllCookies`. + * + * Note: Only works if the configured Store is also synchronous. + */ + serializeSync() { + return this.callSync((callback) => { + this.serialize(callback); + }); + } + /** + * Alias of {@link CookieJar.serializeSync}. Allows the cookie to be serialized + * with `JSON.stringify(cookieJar)`. + */ + toJSON() { + return this.serializeSync(); + } + /** + * Use the class method CookieJar.deserialize instead of calling this directly + * @internal + */ + _importCookies(serialized, callback) { + let cookies = void 0; + if (serialized && typeof serialized === "object" && inOperator("cookies", serialized) && Array.isArray(serialized.cookies)) { + cookies = serialized.cookies; + } + if (!cookies) { + callback(new Error("serialized jar has no cookies array"), void 0); + return; + } + cookies = cookies.slice(); + const putNext = (err) => { + if (err) { + callback(err, void 0); + return; + } + if (Array.isArray(cookies)) { + if (!cookies.length) { + callback(err, this); + return; + } + let cookie2; + try { + cookie2 = Cookie.fromJSON(cookies.shift()); + } catch (e) { + callback(e instanceof Error ? e : new Error(), void 0); + return; + } + if (cookie2 === void 0) { + putNext(null); + return; + } + this.store.putCookie(cookie2, putNext); + } + }; + putNext(null); + } + /** + * @internal + */ + _importCookiesSync(serialized) { + this.callSync(this._importCookies.bind(this, serialized)); + } + /** + * @internal No doc because this is the overload implementation + */ + clone(newStore, callback) { + if (typeof newStore === "function") { + callback = newStore; + newStore = void 0; + } + const promiseCallback = createPromiseCallback(callback); + const cb = promiseCallback.callback; + this.serialize((err, serialized) => { + if (err) { + return promiseCallback.reject(err); + } + return _CookieJar.deserialize(serialized ?? "", newStore, cb); + }); + return promiseCallback.promise; + } + /** + * @internal + */ + _cloneSync(newStore) { + const cloneFn = newStore && typeof newStore !== "function" ? this.clone.bind(this, newStore) : this.clone.bind(this); + return this.callSync((callback) => { + cloneFn(callback); + }); + } + /** + * Produces a deep clone of this CookieJar. Modifications to the original do + * not affect the clone, and vice versa. + * + * Note: Only works if both the configured Store and destination + * Store are synchronous. + * + * @remarks + * - When no {@link Store} is provided, a new {@link MemoryCookieStore} will be used. + * + * - Transferring between store types is supported so long as the source + * implements `.getAllCookies()` and the destination implements `.putCookie()`. + * + * @param newStore - The target {@link Store} to clone cookies into. + */ + cloneSync(newStore) { + if (!newStore) { + return this._cloneSync(); + } + if (!newStore.synchronous) { + throw new Error( + "CookieJar clone destination store is not synchronous; use async API instead." + ); + } + return this._cloneSync(newStore); + } + /** + * @internal No doc because this is the overload implementation + */ + removeAllCookies(callback) { + const promiseCallback = createPromiseCallback(callback); + const cb = promiseCallback.callback; + const store = this.store; + if (typeof store.removeAllCookies === "function" && store.removeAllCookies !== Store.prototype.removeAllCookies) { + store.removeAllCookies(cb); + return promiseCallback.promise; + } + store.getAllCookies((err, cookies) => { + if (err) { + cb(err); + return; + } + if (!cookies) { + cookies = []; + } + if (cookies.length === 0) { + cb(null, void 0); + return; + } + let completedCount = 0; + const removeErrors = []; + const removeCookieCb = function removeCookieCb2(removeErr) { + if (removeErr) { + removeErrors.push(removeErr); + } + completedCount++; + if (completedCount === cookies.length) { + if (removeErrors[0]) cb(removeErrors[0]); + else cb(null, void 0); + return; + } + }; + cookies.forEach((cookie2) => { + store.removeCookie( + cookie2.domain, + cookie2.path, + cookie2.key, + removeCookieCb + ); + }); + }); + return promiseCallback.promise; + } + /** + * Removes all cookies from the CookieJar. + * + * Note: Only works if the configured Store is also synchronous. + * + * @remarks + * - This is a new backwards-compatible feature of tough-cookie version 2.5, + * so not all Stores will implement it efficiently. For Stores that do not + * implement `removeAllCookies`, the fallback is to call `removeCookie` after + * `getAllCookies`. + * + * - If `getAllCookies` fails or isn't implemented in the Store, an error is returned. + * + * - If one or more of the `removeCookie` calls fail, only the first error is returned. + */ + removeAllCookiesSync() { + this.callSync((callback) => { + this.removeAllCookies(callback); + }); + } + /** + * @internal No doc because this is the overload implementation + */ + static deserialize(strOrObj, store, callback) { + if (typeof store === "function") { + callback = store; + store = void 0; + } + const promiseCallback = createPromiseCallback(callback); + let serialized; + if (typeof strOrObj === "string") { + try { + serialized = JSON.parse(strOrObj); + } catch (e) { + return promiseCallback.reject(e instanceof Error ? e : new Error()); + } + } else { + serialized = strOrObj; + } + const readSerializedProperty = (property) => { + return serialized && typeof serialized === "object" && inOperator(property, serialized) ? serialized[property] : void 0; + }; + const readSerializedBoolean = (property) => { + const value = readSerializedProperty(property); + return typeof value === "boolean" ? value : void 0; + }; + const readSerializedString = (property) => { + const value = readSerializedProperty(property); + return typeof value === "string" ? value : void 0; + }; + const jar = new _CookieJar(store, { + rejectPublicSuffixes: readSerializedBoolean("rejectPublicSuffixes"), + looseMode: readSerializedBoolean("enableLooseMode"), + allowSpecialUseDomain: readSerializedBoolean("allowSpecialUseDomain"), + prefixSecurity: getNormalizedPrefixSecurity( + readSerializedString("prefixSecurity") ?? "silent" + ) + }); + jar._importCookies(serialized, (err) => { + if (err) { + promiseCallback.callback(err); + return; + } + promiseCallback.callback(null, jar); + }); + return promiseCallback.promise; + } + /** + * A new CookieJar is created and the serialized {@link Cookie} values are added to + * the underlying store. Each {@link Cookie} is added via `store.putCookie(...)` in + * the order in which they appear in the serialization. + * + * Note: Only works if the configured Store is also synchronous. + * + * @remarks + * - When no {@link Store} is provided, a new {@link MemoryCookieStore} will be used. + * + * - As a convenience, if `strOrObj` is a string, it is passed through `JSON.parse` first. + * + * @param strOrObj - A JSON string or object representing the deserialized cookies. + * @param store - The underlying store to persist the deserialized cookies into. + */ + static deserializeSync(strOrObj, store) { + const serialized = typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj; + const readSerializedProperty = (property) => { + return serialized && typeof serialized === "object" && inOperator(property, serialized) ? serialized[property] : void 0; + }; + const readSerializedBoolean = (property) => { + const value = readSerializedProperty(property); + return typeof value === "boolean" ? value : void 0; + }; + const readSerializedString = (property) => { + const value = readSerializedProperty(property); + return typeof value === "string" ? value : void 0; + }; + const jar = new _CookieJar(store, { + rejectPublicSuffixes: readSerializedBoolean("rejectPublicSuffixes"), + looseMode: readSerializedBoolean("enableLooseMode"), + allowSpecialUseDomain: readSerializedBoolean("allowSpecialUseDomain"), + prefixSecurity: getNormalizedPrefixSecurity( + readSerializedString("prefixSecurity") ?? "silent" + ) + }); + if (!jar.store.synchronous) { + throw new Error( + "CookieJar store is not synchronous; use async API instead." + ); + } + jar._importCookiesSync(serialized); + return jar; + } + /** + * Alias of {@link CookieJar.deserializeSync}. + * + * @remarks + * - When no {@link Store} is provided, a new {@link MemoryCookieStore} will be used. + * + * - As a convenience, if `strOrObj` is a string, it is passed through `JSON.parse` first. + * + * @param jsonString - A JSON string or object representing the deserialized cookies. + * @param store - The underlying store to persist the deserialized cookies into. + */ + static fromJSON(jsonString, store) { + return _CookieJar.deserializeSync(jsonString, store); + } +}; + +// node_modules/msw/lib/core/utils/internal/jsonParse.mjs +function jsonParse(value) { + try { + return JSON.parse(value); + } catch { + return void 0; + } +} + +// node_modules/msw/lib/core/utils/cookieStore.mjs +var CookieStore = class { + #storageKey = "__msw-cookie-store__"; + #jar; + #memoryStore; + constructor() { + if (!isNodeProcess()) { + invariant( + typeof localStorage !== "undefined", + "Failed to create a CookieStore: `localStorage` is not available in this environment. This is likely an issue with your environment, which has been detected as browser (or browser-like) environment and must implement global browser APIs correctly." + ); + } + this.#memoryStore = new MemoryCookieStore(); + this.#memoryStore.idx = this.getCookieStoreIndex(); + this.#jar = new CookieJar(this.#memoryStore); + } + getCookies(url) { + return this.#jar.getCookiesSync(url); + } + async setCookie(cookieName, url) { + await this.#jar.setCookie(cookieName, url); + this.persist(); + } + getCookieStoreIndex() { + if (typeof localStorage === "undefined") { + return {}; + } + const cookiesString = localStorage.getItem(this.#storageKey); + if (cookiesString == null) { + return {}; + } + const rawCookies = jsonParse(cookiesString); + if (rawCookies == null) { + return {}; + } + const cookies = {}; + for (const rawCookie of rawCookies) { + const cookie2 = Cookie.fromJSON(rawCookie); + if (cookie2 != null && cookie2.domain != null && cookie2.path != null) { + cookies[cookie2.domain] ||= {}; + cookies[cookie2.domain][cookie2.path] ||= {}; + cookies[cookie2.domain][cookie2.path][cookie2.key] = cookie2; + } + } + return cookies; + } + persist() { + if (typeof localStorage === "undefined") { + return; + } + const data = []; + const { idx } = this.#memoryStore; + for (const domain in idx) { + for (const path in idx[domain]) { + for (const key in idx[domain][path]) { + data.push(idx[domain][path][key].toJSON()); + } + } + } + localStorage.setItem(this.#storageKey, JSON.stringify(data)); + } +}; +var cookieStore = new CookieStore(); + +// node_modules/msw/lib/shims/statuses.mjs +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var require_codes = __commonJS({ + "node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/codes.json"(exports, module) { + module.exports = { + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a Teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Too Early", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" + }; + } +}); +var require_statuses = __commonJS({ + "node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/index.js"(exports, module) { + "use strict"; + var codes = require_codes(); + module.exports = status; + status.message = codes; + status.code = createMessageToStatusCodeMap(codes); + status.codes = createStatusCodeList(codes); + status.redirect = { + 300: true, + 301: true, + 302: true, + 303: true, + 305: true, + 307: true, + 308: true + }; + status.empty = { + 204: true, + 205: true, + 304: true + }; + status.retry = { + 502: true, + 503: true, + 504: true + }; + function createMessageToStatusCodeMap(codes2) { + var map = {}; + Object.keys(codes2).forEach(function forEachCode(code) { + var message22 = codes2[code]; + var status2 = Number(code); + map[message22.toLowerCase()] = status2; + }); + return map; + } + function createStatusCodeList(codes2) { + return Object.keys(codes2).map(function mapCode(code) { + return Number(code); + }); + } + function getStatusCode(message22) { + var msg = message22.toLowerCase(); + if (!Object.prototype.hasOwnProperty.call(status.code, msg)) { + throw new Error('invalid status message: "' + message22 + '"'); + } + return status.code[msg]; + } + function getStatusMessage(code) { + if (!Object.prototype.hasOwnProperty.call(status.message, code)) { + throw new Error("invalid status code: " + code); + } + return status.message[code]; + } + function status(code) { + if (typeof code === "number") { + return getStatusMessage(code); + } + if (typeof code !== "string") { + throw new TypeError("code must be a number or string"); + } + var n = parseInt(code, 10); + if (!isNaN(n)) { + return getStatusMessage(n); + } + return getStatusCode(code); + } + } +}); +var allStatuses = __toESM(require_statuses(), 1); +var statuses = allStatuses.default || allStatuses; +var message = statuses.message; +var statuses_default = statuses; + +// node_modules/headers-polyfill/lib/index.mjs +var __create2 = Object.create; +var __defProp2 = Object.defineProperty; +var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; +var __getOwnPropNames2 = Object.getOwnPropertyNames; +var __getProtoOf2 = Object.getPrototypeOf; +var __hasOwnProp2 = Object.prototype.hasOwnProperty; +var __commonJS2 = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps2( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var require_set_cookie = __commonJS2({ + "node_modules/set-cookie-parser/lib/set-cookie.js"(exports, module) { + "use strict"; + var defaultParseOptions = { + decodeValues: true, + map: false, + silent: false + }; + function isNonEmptyString2(str) { + return typeof str === "string" && !!str.trim(); + } + function parseString(setCookieValue, options) { + var parts = setCookieValue.split(";").filter(isNonEmptyString2); + var nameValuePairStr = parts.shift(); + var parsed = parseNameValuePair(nameValuePairStr); + var name = parsed.name; + var value = parsed.value; + options = options ? Object.assign({}, defaultParseOptions, options) : defaultParseOptions; + try { + value = options.decodeValues ? decodeURIComponent(value) : value; + } catch (e) { + console.error( + "set-cookie-parser encountered an error while decoding a cookie with value '" + value + "'. Set options.decodeValues to false to disable this feature.", + e + ); + } + var cookie2 = { + name, + value + }; + parts.forEach(function(part) { + var sides = part.split("="); + var key = sides.shift().trimLeft().toLowerCase(); + var value2 = sides.join("="); + if (key === "expires") { + cookie2.expires = new Date(value2); + } else if (key === "max-age") { + cookie2.maxAge = parseInt(value2, 10); + } else if (key === "secure") { + cookie2.secure = true; + } else if (key === "httponly") { + cookie2.httpOnly = true; + } else if (key === "samesite") { + cookie2.sameSite = value2; + } else { + cookie2[key] = value2; + } + }); + return cookie2; + } + function parseNameValuePair(nameValuePairStr) { + var name = ""; + var value = ""; + var nameValueArr = nameValuePairStr.split("="); + if (nameValueArr.length > 1) { + name = nameValueArr.shift(); + value = nameValueArr.join("="); + } else { + value = nameValuePairStr; + } + return { name, value }; + } + function parse4(input, options) { + options = options ? Object.assign({}, defaultParseOptions, options) : defaultParseOptions; + if (!input) { + if (!options.map) { + return []; + } else { + return {}; + } + } + if (input.headers) { + if (typeof input.headers.getSetCookie === "function") { + input = input.headers.getSetCookie(); + } else if (input.headers["set-cookie"]) { + input = input.headers["set-cookie"]; + } else { + var sch = input.headers[Object.keys(input.headers).find(function(key) { + return key.toLowerCase() === "set-cookie"; + })]; + if (!sch && input.headers.cookie && !options.silent) { + console.warn( + "Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning." + ); + } + input = sch; + } + } + if (!Array.isArray(input)) { + input = [input]; + } + options = options ? Object.assign({}, defaultParseOptions, options) : defaultParseOptions; + if (!options.map) { + return input.filter(isNonEmptyString2).map(function(str) { + return parseString(str, options); + }); + } else { + var cookies = {}; + return input.filter(isNonEmptyString2).reduce(function(cookies2, str) { + var cookie2 = parseString(str, options); + cookies2[cookie2.name] = cookie2; + return cookies2; + }, cookies); + } + } + function splitCookiesString2(cookiesString) { + if (Array.isArray(cookiesString)) { + return cookiesString; + } + if (typeof cookiesString !== "string") { + return []; + } + var cookiesStrings = []; + var pos = 0; + var start; + var ch; + var lastComma; + var nextStart; + var cookiesSeparatorFound; + function skipWhitespace() { + while (pos < cookiesString.length && /\s/.test(cookiesString.charAt(pos))) { + pos += 1; + } + return pos < cookiesString.length; + } + function notSpecialChar() { + ch = cookiesString.charAt(pos); + return ch !== "=" && ch !== ";" && ch !== ","; + } + while (pos < cookiesString.length) { + start = pos; + cookiesSeparatorFound = false; + while (skipWhitespace()) { + ch = cookiesString.charAt(pos); + if (ch === ",") { + lastComma = pos; + pos += 1; + skipWhitespace(); + nextStart = pos; + while (pos < cookiesString.length && notSpecialChar()) { + pos += 1; + } + if (pos < cookiesString.length && cookiesString.charAt(pos) === "=") { + cookiesSeparatorFound = true; + pos = nextStart; + cookiesStrings.push(cookiesString.substring(start, lastComma)); + start = pos; + } else { + pos = lastComma + 1; + } + } else { + pos += 1; + } + } + if (!cookiesSeparatorFound || pos >= cookiesString.length) { + cookiesStrings.push(cookiesString.substring(start, cookiesString.length)); + } + } + return cookiesStrings; + } + module.exports = parse4; + module.exports.parse = parse4; + module.exports.parseString = parseString; + module.exports.splitCookiesString = splitCookiesString2; + } +}); +var import_set_cookie_parser = __toESM2(require_set_cookie()); +var HEADERS_INVALID_CHARACTERS = /[^a-z0-9\-#$%&'*+.^_`|~]/i; +function normalizeHeaderName(name) { + if (HEADERS_INVALID_CHARACTERS.test(name) || name.trim() === "") { + throw new TypeError("Invalid character in header field name"); + } + return name.trim().toLowerCase(); +} +var charCodesToRemove = [ + String.fromCharCode(10), + String.fromCharCode(13), + String.fromCharCode(9), + String.fromCharCode(32) +]; +var HEADER_VALUE_REMOVE_REGEXP = new RegExp( + `(^[${charCodesToRemove.join("")}]|$[${charCodesToRemove.join("")}])`, + "g" +); +function normalizeHeaderValue(value) { + const nextValue = value.replace(HEADER_VALUE_REMOVE_REGEXP, ""); + return nextValue; +} +function isValidHeaderName(value) { + if (typeof value !== "string") { + return false; + } + if (value.length === 0) { + return false; + } + for (let i = 0; i < value.length; i++) { + const character = value.charCodeAt(i); + if (character > 127 || !isToken(character)) { + return false; + } + } + return true; +} +function isToken(value) { + return ![ + 127, + 32, + "(", + ")", + "<", + ">", + "@", + ",", + ";", + ":", + "\\", + '"', + "/", + "[", + "]", + "?", + "=", + "{", + "}" + ].includes(value); +} +function isValidHeaderValue(value) { + if (typeof value !== "string") { + return false; + } + if (value.trim() !== value) { + return false; + } + for (let i = 0; i < value.length; i++) { + const character = value.charCodeAt(i); + if ( + // NUL. + character === 0 || // HTTP newline bytes. + character === 10 || character === 13 + ) { + return false; + } + } + return true; +} +var NORMALIZED_HEADERS = Symbol("normalizedHeaders"); +var RAW_HEADER_NAMES = Symbol("rawHeaderNames"); +var HEADER_VALUE_DELIMITER = ", "; +var _a; +var _b; +var _c; +var Headers2 = class _Headers { + constructor(init) { + this[_a] = {}; + this[_b] = /* @__PURE__ */ new Map(); + this[_c] = "Headers"; + if (["Headers", "HeadersPolyfill"].includes(init?.constructor.name) || init instanceof _Headers || typeof globalThis.Headers !== "undefined" && init instanceof globalThis.Headers) { + const initialHeaders = init; + initialHeaders.forEach((value, name) => { + this.append(name, value); + }, this); + } else if (Array.isArray(init)) { + init.forEach(([name, value]) => { + this.append( + name, + Array.isArray(value) ? value.join(HEADER_VALUE_DELIMITER) : value + ); + }); + } else if (init) { + Object.getOwnPropertyNames(init).forEach((name) => { + const value = init[name]; + this.append( + name, + Array.isArray(value) ? value.join(HEADER_VALUE_DELIMITER) : value + ); + }); + } + } + [(_a = NORMALIZED_HEADERS, _b = RAW_HEADER_NAMES, _c = Symbol.toStringTag, Symbol.iterator)]() { + return this.entries(); + } + *keys() { + for (const [name] of this.entries()) { + yield name; + } + } + *values() { + for (const [, value] of this.entries()) { + yield value; + } + } + *entries() { + let sortedKeys = Object.keys(this[NORMALIZED_HEADERS]).sort( + (a, b) => a.localeCompare(b) + ); + for (const name of sortedKeys) { + if (name === "set-cookie") { + for (const value of this.getSetCookie()) { + yield [name, value]; + } + } else { + yield [name, this.get(name)]; + } + } + } + /** + * Returns a boolean stating whether a `Headers` object contains a certain header. + */ + has(name) { + if (!isValidHeaderName(name)) { + throw new TypeError(`Invalid header name "${name}"`); + } + return this[NORMALIZED_HEADERS].hasOwnProperty(normalizeHeaderName(name)); + } + /** + * Returns a `ByteString` sequence of all the values of a header with a given name. + */ + get(name) { + if (!isValidHeaderName(name)) { + throw TypeError(`Invalid header name "${name}"`); + } + return this[NORMALIZED_HEADERS][normalizeHeaderName(name)] ?? null; + } + /** + * Sets a new value for an existing header inside a `Headers` object, or adds the header if it does not already exist. + */ + set(name, value) { + if (!isValidHeaderName(name) || !isValidHeaderValue(value)) { + return; + } + const normalizedName = normalizeHeaderName(name); + const normalizedValue = normalizeHeaderValue(value); + this[NORMALIZED_HEADERS][normalizedName] = normalizeHeaderValue(normalizedValue); + this[RAW_HEADER_NAMES].set(normalizedName, name); + } + /** + * Appends a new value onto an existing header inside a `Headers` object, or adds the header if it does not already exist. + */ + append(name, value) { + if (!isValidHeaderName(name) || !isValidHeaderValue(value)) { + return; + } + const normalizedName = normalizeHeaderName(name); + const normalizedValue = normalizeHeaderValue(value); + let resolvedValue = this.has(normalizedName) ? `${this.get(normalizedName)}, ${normalizedValue}` : normalizedValue; + this.set(name, resolvedValue); + } + /** + * Deletes a header from the `Headers` object. + */ + delete(name) { + if (!isValidHeaderName(name)) { + return; + } + if (!this.has(name)) { + return; + } + const normalizedName = normalizeHeaderName(name); + delete this[NORMALIZED_HEADERS][normalizedName]; + this[RAW_HEADER_NAMES].delete(normalizedName); + } + /** + * Traverses the `Headers` object, + * calling the given callback for each header. + */ + forEach(callback, thisArg) { + for (const [name, value] of this.entries()) { + callback.call(thisArg, value, name, this); + } + } + /** + * Returns an array containing the values + * of all Set-Cookie headers associated + * with a response + */ + getSetCookie() { + const setCookieHeader = this.get("set-cookie"); + if (setCookieHeader === null) { + return []; + } + if (setCookieHeader === "") { + return [""]; + } + return (0, import_set_cookie_parser.splitCookiesString)(setCookieHeader); + } +}; + +// node_modules/msw/lib/core/utils/HttpResponse/decorators.mjs +var { message: message2 } = statuses_default; +var kSetCookie = Symbol("kSetCookie"); +function normalizeResponseInit(init = {}) { + const status = init?.status || 200; + const statusText = init?.statusText || message2[status] || ""; + const headers = new Headers(init?.headers); + return { + ...init, + headers, + status, + statusText + }; +} +function decorateResponse(response, init) { + if (init.type) { + Object.defineProperty(response, "type", { + value: init.type, + enumerable: true, + writable: false + }); + } + const responseCookies = init.headers.get("set-cookie"); + if (responseCookies) { + Object.defineProperty(response, kSetCookie, { + value: responseCookies, + enumerable: false, + writable: false + }); + if (typeof document !== "undefined") { + const responseCookiePairs = Headers2.prototype.getSetCookie.call( + init.headers + ); + for (const cookieString of responseCookiePairs) { + document.cookie = cookieString; + } + } + } + return response; +} + +// node_modules/msw/lib/core/utils/request/storeResponseCookies.mjs +async function storeResponseCookies(request, response) { + const responseCookies = Reflect.get(response, kSetCookie); + if (responseCookies) { + await cookieStore.setCookie(responseCookies, request.url); + } +} + +// node_modules/msw/lib/core/utils/handleRequest.mjs +async function handleRequest(request, requestId, handlers, options, emitter, handleRequestOptions) { + emitter.emit("request:start", { request, requestId }); + if (request.headers.get("accept")?.includes("msw/passthrough")) { + emitter.emit("request:end", { request, requestId }); + handleRequestOptions?.onPassthroughResponse?.(request); + return; + } + const [lookupError, lookupResult] = await until(() => { + return executeHandlers({ + request, + requestId, + handlers, + resolutionContext: handleRequestOptions?.resolutionContext + }); + }); + if (lookupError) { + emitter.emit("unhandledException", { + error: lookupError, + request, + requestId + }); + throw lookupError; + } + if (!lookupResult) { + await onUnhandledRequest(request, options.onUnhandledRequest); + emitter.emit("request:unhandled", { request, requestId }); + emitter.emit("request:end", { request, requestId }); + handleRequestOptions?.onPassthroughResponse?.(request); + return; + } + const { response } = lookupResult; + if (!response) { + emitter.emit("request:end", { request, requestId }); + handleRequestOptions?.onPassthroughResponse?.(request); + return; + } + if (response.status === 302 && response.headers.get("x-msw-intention") === "passthrough") { + emitter.emit("request:end", { request, requestId }); + handleRequestOptions?.onPassthroughResponse?.(request); + return; + } + await storeResponseCookies(request, response); + emitter.emit("request:match", { request, requestId }); + const requiredLookupResult = lookupResult; + handleRequestOptions?.onMockedResponse?.(response, requiredLookupResult); + emitter.emit("request:end", { request, requestId }); + return response; +} + +// node_modules/msw/lib/core/utils/toResponseInit.mjs +function toResponseInit(response) { + return { + status: response.status, + statusText: response.statusText, + headers: Object.fromEntries(response.headers.entries()) + }; +} + +// node_modules/msw/lib/core/utils/internal/isHandlerKind.mjs +function isHandlerKind(kind) { + return (input) => { + return input != null && typeof input === "object" && "__kind" in input && input.__kind === kind; + }; +} + +// node_modules/strict-event-emitter/lib/index.mjs +var MemoryLeakError = class extends Error { + constructor(emitter, type, count) { + super( + `Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit` + ); + this.emitter = emitter; + this.type = type; + this.count = count; + this.name = "MaxListenersExceededWarning"; + } +}; +var _Emitter = class { + static listenerCount(emitter, eventName) { + return emitter.listenerCount(eventName); + } + constructor() { + this.events = /* @__PURE__ */ new Map(); + this.maxListeners = _Emitter.defaultMaxListeners; + this.hasWarnedAboutPotentialMemoryLeak = false; + } + _emitInternalEvent(internalEventName, eventName, listener) { + this.emit( + internalEventName, + ...[eventName, listener] + ); + } + _getListeners(eventName) { + return Array.prototype.concat.apply([], this.events.get(eventName)) || []; + } + _removeListener(listeners, listener) { + const index = listeners.indexOf(listener); + if (index > -1) { + listeners.splice(index, 1); + } + return []; + } + _wrapOnceListener(eventName, listener) { + const onceListener = (...data) => { + this.removeListener(eventName, onceListener); + return listener.apply(this, data); + }; + Object.defineProperty(onceListener, "name", { value: listener.name }); + return onceListener; + } + setMaxListeners(maxListeners) { + this.maxListeners = maxListeners; + return this; + } + /** + * Returns the current max listener value for the `Emitter` which is + * either set by `emitter.setMaxListeners(n)` or defaults to + * `Emitter.defaultMaxListeners`. + */ + getMaxListeners() { + return this.maxListeners; + } + /** + * Returns an array listing the events for which the emitter has registered listeners. + * The values in the array will be strings or Symbols. + */ + eventNames() { + return Array.from(this.events.keys()); + } + /** + * Synchronously calls each of the listeners registered for the event named `eventName`, + * in the order they were registered, passing the supplied arguments to each. + * Returns `true` if the event has listeners, `false` otherwise. + * + * @example + * const emitter = new Emitter<{ hello: [string] }>() + * emitter.emit('hello', 'John') + */ + emit(eventName, ...data) { + const listeners = this._getListeners(eventName); + listeners.forEach((listener) => { + listener.apply(this, data); + }); + return listeners.length > 0; + } + addListener(eventName, listener) { + this._emitInternalEvent("newListener", eventName, listener); + const nextListeners = this._getListeners(eventName).concat(listener); + this.events.set(eventName, nextListeners); + if (this.maxListeners > 0 && this.listenerCount(eventName) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) { + this.hasWarnedAboutPotentialMemoryLeak = true; + const memoryLeakWarning = new MemoryLeakError( + this, + eventName, + this.listenerCount(eventName) + ); + console.warn(memoryLeakWarning); + } + return this; + } + on(eventName, listener) { + return this.addListener(eventName, listener); + } + once(eventName, listener) { + return this.addListener( + eventName, + this._wrapOnceListener(eventName, listener) + ); + } + prependListener(eventName, listener) { + const listeners = this._getListeners(eventName); + if (listeners.length > 0) { + const nextListeners = [listener].concat(listeners); + this.events.set(eventName, nextListeners); + } else { + this.events.set(eventName, listeners.concat(listener)); + } + return this; + } + prependOnceListener(eventName, listener) { + return this.prependListener( + eventName, + this._wrapOnceListener(eventName, listener) + ); + } + removeListener(eventName, listener) { + const listeners = this._getListeners(eventName); + if (listeners.length > 0) { + this._removeListener(listeners, listener); + this.events.set(eventName, listeners); + this._emitInternalEvent("removeListener", eventName, listener); + } + return this; + } + /** + * Alias for `emitter.removeListener()`. + * + * @example + * emitter.off('hello', listener) + */ + off(eventName, listener) { + return this.removeListener(eventName, listener); + } + removeAllListeners(eventName) { + if (eventName) { + this.events.delete(eventName); + } else { + this.events.clear(); + } + return this; + } + /** + * Returns a copy of the array of listeners for the event named `eventName`. + */ + listeners(eventName) { + return Array.from(this._getListeners(eventName)); + } + /** + * Returns the number of listeners listening to the event named `eventName`. + */ + listenerCount(eventName) { + return this._getListeners(eventName).length; + } + rawListeners(eventName) { + return this.listeners(eventName); + } +}; +var Emitter = _Emitter; +Emitter.defaultMaxListeners = 10; + +// node_modules/msw/lib/core/utils/internal/pipeEvents.mjs +function pipeEvents(source, destination) { + const rawEmit = source.emit; + if (rawEmit._isPiped) { + return; + } + const sourceEmit = function sourceEmit2(event, ...data) { + destination.emit(event, ...data); + return rawEmit.call(this, event, ...data); + }; + sourceEmit._isPiped = true; + source.emit = sourceEmit; +} + +// node_modules/msw/lib/core/utils/internal/toReadonlyArray.mjs +function toReadonlyArray(source) { + const clone = [...source]; + Object.freeze(clone); + return clone; +} + +// node_modules/msw/lib/core/utils/internal/Disposable.mjs +var Disposable = class { + subscriptions = []; + dispose() { + let subscription; + while (subscription = this.subscriptions.shift()) { + subscription(); + } + } +}; + +// node_modules/msw/lib/core/SetupApi.mjs +var InMemoryHandlersController = class { + constructor(initialHandlers) { + this.initialHandlers = initialHandlers; + this.handlers = [...initialHandlers]; + } + handlers; + prepend(runtimeHandles) { + this.handlers.unshift(...runtimeHandles); + } + reset(nextHandlers) { + this.handlers = nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]; + } + currentHandlers() { + return this.handlers; + } +}; +var SetupApi = class extends Disposable { + handlersController; + emitter; + publicEmitter; + events; + constructor(...initialHandlers) { + super(); + invariant( + this.validateHandlers(initialHandlers), + devUtils.formatMessage( + `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?` + ) + ); + this.handlersController = new InMemoryHandlersController(initialHandlers); + this.emitter = new Emitter(); + this.publicEmitter = new Emitter(); + pipeEvents(this.emitter, this.publicEmitter); + this.events = this.createLifeCycleEvents(); + this.subscriptions.push(() => { + this.emitter.removeAllListeners(); + this.publicEmitter.removeAllListeners(); + }); + } + validateHandlers(handlers) { + return handlers.every((handler) => !Array.isArray(handler)); + } + use(...runtimeHandlers) { + invariant( + this.validateHandlers(runtimeHandlers), + devUtils.formatMessage( + `Failed to call "use()" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?` + ) + ); + this.handlersController.prepend(runtimeHandlers); + } + restoreHandlers() { + this.handlersController.currentHandlers().forEach((handler) => { + if ("isUsed" in handler) { + handler.isUsed = false; + } + }); + } + resetHandlers(...nextHandlers) { + this.handlersController.reset(nextHandlers); + } + listHandlers() { + return toReadonlyArray(this.handlersController.currentHandlers()); + } + createLifeCycleEvents() { + return { + on: (...args) => { + return this.publicEmitter.on(...args); + }, + removeListener: (...args) => { + return this.publicEmitter.removeListener(...args); + }, + removeAllListeners: (...args) => { + return this.publicEmitter.removeAllListeners(...args); + } + }; + } +}; + +// node_modules/@mswjs/interceptors/lib/browser/chunk-VYSDLBSS.mjs +async function emitAsync(emitter, eventName, ...data) { + const listeners = emitter.listeners(eventName); + if (listeners.length === 0) { + return; + } + for (const listener of listeners) { + await listener.apply(emitter, data); + } +} +function hasConfigurableGlobal(propertyName) { + const descriptor = Object.getOwnPropertyDescriptor(globalThis, propertyName); + if (typeof descriptor === "undefined") { + return false; + } + if (typeof descriptor.get === "function" && typeof descriptor.get() === "undefined") { + return false; + } + if (typeof descriptor.get === "undefined" && descriptor.value == null) { + return false; + } + if (typeof descriptor.set === "undefined" && !descriptor.configurable) { + console.error( + `[MSW] Failed to apply interceptor: the global \`${propertyName}\` property is non-configurable. This is likely an issue with your environment. If you are using a framework, please open an issue about this in their repository.` + ); + return false; + } + return true; +} + +// node_modules/@open-draft/logger/lib/index.mjs +var __defProp3 = Object.defineProperty; +var __export = (target, all) => { + for (var name in all) + __defProp3(target, name, { get: all[name], enumerable: true }); +}; +var colors_exports = {}; +__export(colors_exports, { + blue: () => blue, + gray: () => gray, + green: () => green, + red: () => red, + yellow: () => yellow +}); +function yellow(text) { + return `\x1B[33m${text}\x1B[0m`; +} +function blue(text) { + return `\x1B[34m${text}\x1B[0m`; +} +function gray(text) { + return `\x1B[90m${text}\x1B[0m`; +} +function red(text) { + return `\x1B[31m${text}\x1B[0m`; +} +function green(text) { + return `\x1B[32m${text}\x1B[0m`; +} +var IS_NODE = isNodeProcess(); +var Logger = class { + constructor(name) { + this.name = name; + this.prefix = `[${this.name}]`; + const LOGGER_NAME = getVariable("DEBUG"); + const LOGGER_LEVEL = getVariable("LOG_LEVEL"); + const isLoggingEnabled = LOGGER_NAME === "1" || LOGGER_NAME === "true" || typeof LOGGER_NAME !== "undefined" && this.name.startsWith(LOGGER_NAME); + if (isLoggingEnabled) { + this.debug = isDefinedAndNotEquals(LOGGER_LEVEL, "debug") ? noop : this.debug; + this.info = isDefinedAndNotEquals(LOGGER_LEVEL, "info") ? noop : this.info; + this.success = isDefinedAndNotEquals(LOGGER_LEVEL, "success") ? noop : this.success; + this.warning = isDefinedAndNotEquals(LOGGER_LEVEL, "warning") ? noop : this.warning; + this.error = isDefinedAndNotEquals(LOGGER_LEVEL, "error") ? noop : this.error; + } else { + this.info = noop; + this.success = noop; + this.warning = noop; + this.error = noop; + this.only = noop; + } + } + prefix; + extend(domain) { + return new Logger(`${this.name}:${domain}`); + } + /** + * Print a debug message. + * @example + * logger.debug('no duplicates found, creating a document...') + */ + debug(message4, ...positionals) { + this.logEntry({ + level: "debug", + message: gray(message4), + positionals, + prefix: this.prefix, + colors: { + prefix: "gray" + } + }); + } + /** + * Print an info message. + * @example + * logger.info('start parsing...') + */ + info(message4, ...positionals) { + this.logEntry({ + level: "info", + message: message4, + positionals, + prefix: this.prefix, + colors: { + prefix: "blue" + } + }); + const performance2 = new PerformanceEntry(); + return (message22, ...positionals2) => { + performance2.measure(); + this.logEntry({ + level: "info", + message: `${message22} ${gray(`${performance2.deltaTime}ms`)}`, + positionals: positionals2, + prefix: this.prefix, + colors: { + prefix: "blue" + } + }); + }; + } + /** + * Print a success message. + * @example + * logger.success('successfully created document') + */ + success(message4, ...positionals) { + this.logEntry({ + level: "info", + message: message4, + positionals, + prefix: `\u2714 ${this.prefix}`, + colors: { + timestamp: "green", + prefix: "green" + } + }); + } + /** + * Print a warning. + * @example + * logger.warning('found legacy document format') + */ + warning(message4, ...positionals) { + this.logEntry({ + level: "warning", + message: message4, + positionals, + prefix: `\u26A0 ${this.prefix}`, + colors: { + timestamp: "yellow", + prefix: "yellow" + } + }); + } + /** + * Print an error message. + * @example + * logger.error('something went wrong') + */ + error(message4, ...positionals) { + this.logEntry({ + level: "error", + message: message4, + positionals, + prefix: `\u2716 ${this.prefix}`, + colors: { + timestamp: "red", + prefix: "red" + } + }); + } + /** + * Execute the given callback only when the logging is enabled. + * This is skipped in its entirety and has no runtime cost otherwise. + * This executes regardless of the log level. + * @example + * logger.only(() => { + * logger.info('additional info') + * }) + */ + only(callback) { + callback(); + } + createEntry(level, message4) { + return { + timestamp: /* @__PURE__ */ new Date(), + level, + message: message4 + }; + } + logEntry(args) { + const { + level, + message: message4, + prefix, + colors: customColors, + positionals = [] + } = args; + const entry = this.createEntry(level, message4); + const timestampColor = customColors?.timestamp || "gray"; + const prefixColor = customColors?.prefix || "gray"; + const colorize = { + timestamp: colors_exports[timestampColor], + prefix: colors_exports[prefixColor] + }; + const write = this.getWriter(level); + write( + [colorize.timestamp(this.formatTimestamp(entry.timestamp))].concat(prefix != null ? colorize.prefix(prefix) : []).concat(serializeInput(message4)).join(" "), + ...positionals.map(serializeInput) + ); + } + formatTimestamp(timestamp) { + return `${timestamp.toLocaleTimeString( + "en-GB" + )}:${timestamp.getMilliseconds()}`; + } + getWriter(level) { + switch (level) { + case "debug": + case "success": + case "info": { + return log; + } + case "warning": { + return warn2; + } + case "error": { + return error2; + } + } + } +}; +var PerformanceEntry = class { + startTime; + endTime; + deltaTime; + constructor() { + this.startTime = performance.now(); + } + measure() { + this.endTime = performance.now(); + const deltaTime = this.endTime - this.startTime; + this.deltaTime = deltaTime.toFixed(2); + } +}; +var noop = () => void 0; +function log(message4, ...positionals) { + if (IS_NODE) { + process.stdout.write(format(message4, ...positionals) + "\n"); + return; + } + console.log(message4, ...positionals); +} +function warn2(message4, ...positionals) { + if (IS_NODE) { + process.stderr.write(format(message4, ...positionals) + "\n"); + return; + } + console.warn(message4, ...positionals); +} +function error2(message4, ...positionals) { + if (IS_NODE) { + process.stderr.write(format(message4, ...positionals) + "\n"); + return; + } + console.error(message4, ...positionals); +} +function getVariable(variableName) { + if (IS_NODE) { + return process.env[variableName]; + } + return globalThis[variableName]?.toString(); +} +function isDefinedAndNotEquals(value, expected) { + return value !== void 0 && value !== expected; +} +function serializeInput(message4) { + if (typeof message4 === "undefined") { + return "undefined"; + } + if (message4 === null) { + return "null"; + } + if (typeof message4 === "string") { + return message4; + } + if (typeof message4 === "object") { + return JSON.stringify(message4); + } + return message4.toString(); +} + +// node_modules/@mswjs/interceptors/lib/browser/chunk-Z5TSB3T6.mjs +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +function getGlobalSymbol(symbol) { + return ( + // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587 + globalThis[symbol] || void 0 + ); +} +function setGlobalSymbol(symbol, value) { + globalThis[symbol] = value; +} +function deleteGlobalSymbol(symbol) { + delete globalThis[symbol]; +} +var Interceptor = class { + constructor(symbol) { + this.symbol = symbol; + this.readyState = "INACTIVE"; + this.emitter = new Emitter(); + this.subscriptions = []; + this.logger = new Logger(symbol.description); + this.emitter.setMaxListeners(0); + this.logger.info("constructing the interceptor..."); + } + /** + * Determine if this interceptor can be applied + * in the current environment. + */ + checkEnvironment() { + return true; + } + /** + * Apply this interceptor to the current process. + * Returns an already running interceptor instance if it's present. + */ + apply() { + const logger = this.logger.extend("apply"); + logger.info("applying the interceptor..."); + if (this.readyState === "APPLIED") { + logger.info("intercepted already applied!"); + return; + } + const shouldApply = this.checkEnvironment(); + if (!shouldApply) { + logger.info("the interceptor cannot be applied in this environment!"); + return; + } + this.readyState = "APPLYING"; + const runningInstance = this.getInstance(); + if (runningInstance) { + logger.info("found a running instance, reusing..."); + this.on = (event, listener) => { + logger.info('proxying the "%s" listener', event); + runningInstance.emitter.addListener(event, listener); + this.subscriptions.push(() => { + runningInstance.emitter.removeListener(event, listener); + logger.info('removed proxied "%s" listener!', event); + }); + return this; + }; + this.readyState = "APPLIED"; + return; + } + logger.info("no running instance found, setting up a new instance..."); + this.setup(); + this.setInstance(); + this.readyState = "APPLIED"; + } + /** + * Setup the module augments and stubs necessary for this interceptor. + * This method is not run if there's a running interceptor instance + * to prevent instantiating an interceptor multiple times. + */ + setup() { + } + /** + * Listen to the interceptor's public events. + */ + on(event, listener) { + const logger = this.logger.extend("on"); + if (this.readyState === "DISPOSING" || this.readyState === "DISPOSED") { + logger.info("cannot listen to events, already disposed!"); + return this; + } + logger.info('adding "%s" event listener:', event, listener); + this.emitter.on(event, listener); + return this; + } + once(event, listener) { + this.emitter.once(event, listener); + return this; + } + off(event, listener) { + this.emitter.off(event, listener); + return this; + } + removeAllListeners(event) { + this.emitter.removeAllListeners(event); + return this; + } + /** + * Disposes of any side-effects this interceptor has introduced. + */ + dispose() { + const logger = this.logger.extend("dispose"); + if (this.readyState === "DISPOSED") { + logger.info("cannot dispose, already disposed!"); + return; + } + logger.info("disposing the interceptor..."); + this.readyState = "DISPOSING"; + if (!this.getInstance()) { + logger.info("no interceptors running, skipping dispose..."); + return; + } + this.clearInstance(); + logger.info("global symbol deleted:", getGlobalSymbol(this.symbol)); + if (this.subscriptions.length > 0) { + logger.info("disposing of %d subscriptions...", this.subscriptions.length); + for (const dispose of this.subscriptions) { + dispose(); + } + this.subscriptions = []; + logger.info("disposed of all subscriptions!", this.subscriptions.length); + } + this.emitter.removeAllListeners(); + logger.info("destroyed the listener!"); + this.readyState = "DISPOSED"; + } + getInstance() { + var _a2; + const instance = getGlobalSymbol(this.symbol); + this.logger.info("retrieved global instance:", (_a2 = instance == null ? void 0 : instance.constructor) == null ? void 0 : _a2.name); + return instance; + } + setInstance() { + setGlobalSymbol(this.symbol, this); + this.logger.info("set global instance!", this.symbol.description); + } + clearInstance() { + deleteGlobalSymbol(this.symbol); + this.logger.info("cleared global instance!", this.symbol.description); + } +}; +function createRequestId() { + return Math.random().toString(16).slice(2); +} + +// node_modules/@open-draft/deferred-promise/build/index.mjs +function createDeferredExecutor() { + const executor = (resolve, reject) => { + executor.state = "pending"; + executor.resolve = (data) => { + if (executor.state !== "pending") { + return; + } + executor.result = data; + const onFulfilled = (value) => { + executor.state = "fulfilled"; + return value; + }; + return resolve( + data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled) + ); + }; + executor.reject = (reason) => { + if (executor.state !== "pending") { + return; + } + queueMicrotask(() => { + executor.state = "rejected"; + }); + return reject(executor.rejectionReason = reason); + }; + }; + return executor; +} +var DeferredPromise = class extends Promise { + #executor; + resolve; + reject; + constructor(executor = null) { + const deferredExecutor = createDeferredExecutor(); + super((originalResolve, originalReject) => { + deferredExecutor(originalResolve, originalReject); + executor?.(deferredExecutor.resolve, deferredExecutor.reject); + }); + this.#executor = deferredExecutor; + this.resolve = this.#executor.resolve; + this.reject = this.#executor.reject; + } + get state() { + return this.#executor.state; + } + get rejectionReason() { + return this.#executor.rejectionReason; + } + then(onFulfilled, onRejected) { + return this.#decorate(super.then(onFulfilled, onRejected)); + } + catch(onRejected) { + return this.#decorate(super.catch(onRejected)); + } + finally(onfinally) { + return this.#decorate(super.finally(onfinally)); + } + #decorate(promise) { + return Object.defineProperties(promise, { + resolve: { configurable: true, value: this.resolve }, + reject: { configurable: true, value: this.reject } + }); + } +}; + +// node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs +function bindEvent(target, event) { + Object.defineProperties(event, { + target: { + value: target, + enumerable: true, + writable: true + }, + currentTarget: { + value: target, + enumerable: true, + writable: true + } + }); + return event; +} +var kCancelable = Symbol("kCancelable"); +var kDefaultPrevented = Symbol("kDefaultPrevented"); +var CancelableMessageEvent = class extends MessageEvent { + constructor(type, init) { + super(type, init); + this[kCancelable] = !!init.cancelable; + this[kDefaultPrevented] = false; + } + get cancelable() { + return this[kCancelable]; + } + set cancelable(nextCancelable) { + this[kCancelable] = nextCancelable; + } + get defaultPrevented() { + return this[kDefaultPrevented]; + } + set defaultPrevented(nextDefaultPrevented) { + this[kDefaultPrevented] = nextDefaultPrevented; + } + preventDefault() { + if (this.cancelable && !this[kDefaultPrevented]) { + this[kDefaultPrevented] = true; + } + } +}; +var CloseEvent = class extends Event { + constructor(type, init = {}) { + super(type, init); + this.code = init.code === void 0 ? 0 : init.code; + this.reason = init.reason === void 0 ? "" : init.reason; + this.wasClean = init.wasClean === void 0 ? false : init.wasClean; + } +}; +var CancelableCloseEvent = class extends CloseEvent { + constructor(type, init = {}) { + super(type, init); + this[kCancelable] = !!init.cancelable; + this[kDefaultPrevented] = false; + } + get cancelable() { + return this[kCancelable]; + } + set cancelable(nextCancelable) { + this[kCancelable] = nextCancelable; + } + get defaultPrevented() { + return this[kDefaultPrevented]; + } + set defaultPrevented(nextDefaultPrevented) { + this[kDefaultPrevented] = nextDefaultPrevented; + } + preventDefault() { + if (this.cancelable && !this[kDefaultPrevented]) { + this[kDefaultPrevented] = true; + } + } +}; +var kEmitter = Symbol("kEmitter"); +var kBoundListener = Symbol("kBoundListener"); +var WebSocketClientConnection = class { + constructor(socket, transport) { + this.socket = socket; + this.transport = transport; + this.id = createRequestId(); + this.url = new URL(socket.url); + this[kEmitter] = new EventTarget(); + this.transport.addEventListener("outgoing", (event) => { + const message4 = bindEvent( + this.socket, + new CancelableMessageEvent("message", { + data: event.data, + origin: event.origin, + cancelable: true + }) + ); + this[kEmitter].dispatchEvent(message4); + if (message4.defaultPrevented) { + event.preventDefault(); + } + }); + this.transport.addEventListener("close", (event) => { + this[kEmitter].dispatchEvent( + bindEvent(this.socket, new CloseEvent("close", event)) + ); + }); + } + /** + * Listen for the outgoing events from the connected WebSocket client. + */ + addEventListener(type, listener, options) { + if (!Reflect.has(listener, kBoundListener)) { + const boundListener = listener.bind(this.socket); + Object.defineProperty(listener, kBoundListener, { + value: boundListener, + enumerable: false, + configurable: false + }); + } + this[kEmitter].addEventListener( + type, + Reflect.get(listener, kBoundListener), + options + ); + } + /** + * Removes the listener for the given event. + */ + removeEventListener(event, listener, options) { + this[kEmitter].removeEventListener( + event, + Reflect.get(listener, kBoundListener), + options + ); + } + /** + * Send data to the connected client. + */ + send(data) { + this.transport.send(data); + } + /** + * Close the WebSocket connection. + * @param {number} code A status code (see https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1). + * @param {string} reason A custom connection close reason. + */ + close(code, reason) { + this.transport.close(code, reason); + } +}; +var WEBSOCKET_CLOSE_CODE_RANGE_ERROR = "InvalidAccessError: close code out of user configurable range"; +var kPassthroughPromise = Symbol("kPassthroughPromise"); +var kOnSend = Symbol("kOnSend"); +var kClose = Symbol("kClose"); +var WebSocketOverride = class extends EventTarget { + constructor(url, protocols) { + super(); + this.CONNECTING = 0; + this.OPEN = 1; + this.CLOSING = 2; + this.CLOSED = 3; + this._onopen = null; + this._onmessage = null; + this._onerror = null; + this._onclose = null; + this.url = url.toString(); + this.protocol = ""; + this.extensions = ""; + this.binaryType = "blob"; + this.readyState = this.CONNECTING; + this.bufferedAmount = 0; + this[kPassthroughPromise] = new DeferredPromise(); + queueMicrotask(async () => { + if (await this[kPassthroughPromise]) { + return; + } + this.protocol = typeof protocols === "string" ? protocols : Array.isArray(protocols) && protocols.length > 0 ? protocols[0] : ""; + if (this.readyState === this.CONNECTING) { + this.readyState = this.OPEN; + this.dispatchEvent(bindEvent(this, new Event("open"))); + } + }); + } + set onopen(listener) { + this.removeEventListener("open", this._onopen); + this._onopen = listener; + if (listener !== null) { + this.addEventListener("open", listener); + } + } + get onopen() { + return this._onopen; + } + set onmessage(listener) { + this.removeEventListener( + "message", + this._onmessage + ); + this._onmessage = listener; + if (listener !== null) { + this.addEventListener("message", listener); + } + } + get onmessage() { + return this._onmessage; + } + set onerror(listener) { + this.removeEventListener("error", this._onerror); + this._onerror = listener; + if (listener !== null) { + this.addEventListener("error", listener); + } + } + get onerror() { + return this._onerror; + } + set onclose(listener) { + this.removeEventListener("close", this._onclose); + this._onclose = listener; + if (listener !== null) { + this.addEventListener("close", listener); + } + } + get onclose() { + return this._onclose; + } + /** + * @see https://websockets.spec.whatwg.org/#ref-for-dom-websocket-send%E2%91%A0 + */ + send(data) { + if (this.readyState === this.CONNECTING) { + this.close(); + throw new DOMException("InvalidStateError"); + } + if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) { + return; + } + this.bufferedAmount += getDataSize(data); + queueMicrotask(() => { + var _a2; + this.bufferedAmount = 0; + (_a2 = this[kOnSend]) == null ? void 0 : _a2.call(this, data); + }); + } + close(code = 1e3, reason) { + invariant(code, WEBSOCKET_CLOSE_CODE_RANGE_ERROR); + invariant( + code === 1e3 || code >= 3e3 && code <= 4999, + WEBSOCKET_CLOSE_CODE_RANGE_ERROR + ); + this[kClose](code, reason); + } + [(kPassthroughPromise, kOnSend, kClose)](code = 1e3, reason, wasClean = true) { + if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) { + return; + } + this.readyState = this.CLOSING; + queueMicrotask(() => { + this.readyState = this.CLOSED; + this.dispatchEvent( + bindEvent( + this, + new CloseEvent("close", { + code, + reason, + wasClean + }) + ) + ); + this._onopen = null; + this._onmessage = null; + this._onerror = null; + this._onclose = null; + }); + } + addEventListener(type, listener, options) { + return super.addEventListener( + type, + listener, + options + ); + } + removeEventListener(type, callback, options) { + return super.removeEventListener(type, callback, options); + } +}; +WebSocketOverride.CONNECTING = 0; +WebSocketOverride.OPEN = 1; +WebSocketOverride.CLOSING = 2; +WebSocketOverride.CLOSED = 3; +function getDataSize(data) { + if (typeof data === "string") { + return data.length; + } + if (data instanceof Blob) { + return data.size; + } + return data.byteLength; +} +var kEmitter2 = Symbol("kEmitter"); +var kBoundListener2 = Symbol("kBoundListener"); +var kSend = Symbol("kSend"); +var WebSocketServerConnection = class { + constructor(client, transport, createConnection) { + this.client = client; + this.transport = transport; + this.createConnection = createConnection; + this[kEmitter2] = new EventTarget(); + this.mockCloseController = new AbortController(); + this.realCloseController = new AbortController(); + this.transport.addEventListener("outgoing", (event) => { + if (typeof this.realWebSocket === "undefined") { + return; + } + queueMicrotask(() => { + if (!event.defaultPrevented) { + this[kSend](event.data); + } + }); + }); + this.transport.addEventListener( + "incoming", + this.handleIncomingMessage.bind(this) + ); + } + /** + * The `WebSocket` instance connected to the original server. + * Accessing this before calling `server.connect()` will throw. + */ + get socket() { + invariant( + this.realWebSocket, + 'Cannot access "socket" on the original WebSocket server object: the connection is not open. Did you forget to call `server.connect()`?' + ); + return this.realWebSocket; + } + /** + * Open connection to the original WebSocket server. + */ + connect() { + invariant( + !this.realWebSocket || this.realWebSocket.readyState !== WebSocket.OPEN, + 'Failed to call "connect()" on the original WebSocket instance: the connection already open' + ); + const realWebSocket = this.createConnection(); + realWebSocket.binaryType = this.client.binaryType; + realWebSocket.addEventListener( + "open", + (event) => { + this[kEmitter2].dispatchEvent( + bindEvent(this.realWebSocket, new Event("open", event)) + ); + }, + { once: true } + ); + realWebSocket.addEventListener("message", (event) => { + this.transport.dispatchEvent( + bindEvent( + this.realWebSocket, + new MessageEvent("incoming", { + data: event.data, + origin: event.origin + }) + ) + ); + }); + this.client.addEventListener( + "close", + (event) => { + this.handleMockClose(event); + }, + { + signal: this.mockCloseController.signal + } + ); + realWebSocket.addEventListener( + "close", + (event) => { + this.handleRealClose(event); + }, + { + signal: this.realCloseController.signal + } + ); + realWebSocket.addEventListener("error", () => { + const errorEvent = bindEvent( + realWebSocket, + new Event("error", { cancelable: true }) + ); + this[kEmitter2].dispatchEvent(errorEvent); + if (!errorEvent.defaultPrevented) { + this.client.dispatchEvent(bindEvent(this.client, new Event("error"))); + } + }); + this.realWebSocket = realWebSocket; + } + /** + * Listen for the incoming events from the original WebSocket server. + */ + addEventListener(event, listener, options) { + if (!Reflect.has(listener, kBoundListener2)) { + const boundListener = listener.bind(this.client); + Object.defineProperty(listener, kBoundListener2, { + value: boundListener, + enumerable: false + }); + } + this[kEmitter2].addEventListener( + event, + Reflect.get(listener, kBoundListener2), + options + ); + } + /** + * Remove the listener for the given event. + */ + removeEventListener(event, listener, options) { + this[kEmitter2].removeEventListener( + event, + Reflect.get(listener, kBoundListener2), + options + ); + } + /** + * Send data to the original WebSocket server. + * @example + * server.send('hello') + * server.send(new Blob(['hello'])) + * server.send(new TextEncoder().encode('hello')) + */ + send(data) { + this[kSend](data); + } + [(kEmitter2, kSend)](data) { + const { realWebSocket } = this; + invariant( + realWebSocket, + 'Failed to call "server.send()" for "%s": the connection is not open. Did you forget to call "server.connect()"?', + this.client.url + ); + if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) { + return; + } + if (realWebSocket.readyState === WebSocket.CONNECTING) { + realWebSocket.addEventListener( + "open", + () => { + realWebSocket.send(data); + }, + { once: true } + ); + return; + } + realWebSocket.send(data); + } + /** + * Close the actual server connection. + */ + close() { + const { realWebSocket } = this; + invariant( + realWebSocket, + 'Failed to close server connection for "%s": the connection is not open. Did you forget to call "server.connect()"?', + this.client.url + ); + this.realCloseController.abort(); + if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) { + return; + } + realWebSocket.close(); + queueMicrotask(() => { + this[kEmitter2].dispatchEvent( + bindEvent( + this.realWebSocket, + new CancelableCloseEvent("close", { + /** + * @note `server.close()` in the interceptor + * always results in clean closures. + */ + code: 1e3, + cancelable: true + }) + ) + ); + }); + } + handleIncomingMessage(event) { + const messageEvent = bindEvent( + event.target, + new CancelableMessageEvent("message", { + data: event.data, + origin: event.origin, + cancelable: true + }) + ); + this[kEmitter2].dispatchEvent(messageEvent); + if (!messageEvent.defaultPrevented) { + this.client.dispatchEvent( + bindEvent( + /** + * @note Bind the forwarded original server events + * to the mock WebSocket instance so it would + * dispatch them straight away. + */ + this.client, + // Clone the message event again to prevent + // the "already being dispatched" exception. + new MessageEvent("message", { + data: event.data, + origin: event.origin + }) + ) + ); + } + } + handleMockClose(_event) { + if (this.realWebSocket) { + this.realWebSocket.close(); + } + } + handleRealClose(event) { + this.mockCloseController.abort(); + const closeEvent = bindEvent( + this.realWebSocket, + new CancelableCloseEvent("close", { + code: event.code, + reason: event.reason, + wasClean: event.wasClean, + cancelable: true + }) + ); + this[kEmitter2].dispatchEvent(closeEvent); + if (!closeEvent.defaultPrevented) { + this.client[kClose](event.code, event.reason); + } + } +}; +var WebSocketClassTransport = class extends EventTarget { + constructor(socket) { + super(); + this.socket = socket; + this.socket.addEventListener("close", (event) => { + this.dispatchEvent(bindEvent(this.socket, new CloseEvent("close", event))); + }); + this.socket[kOnSend] = (data) => { + this.dispatchEvent( + bindEvent( + this.socket, + // Dispatch this as cancelable because "client" connection + // re-creates this message event (cannot dispatch the same event). + new CancelableMessageEvent("outgoing", { + data, + origin: this.socket.url, + cancelable: true + }) + ) + ); + }; + } + addEventListener(type, callback, options) { + return super.addEventListener(type, callback, options); + } + dispatchEvent(event) { + return super.dispatchEvent(event); + } + send(data) { + queueMicrotask(() => { + if (this.socket.readyState === this.socket.CLOSING || this.socket.readyState === this.socket.CLOSED) { + return; + } + const dispatchEvent = () => { + this.socket.dispatchEvent( + bindEvent( + /** + * @note Setting this event's "target" to the + * WebSocket override instance is important. + * This way it can tell apart original incoming events + * (must be forwarded to the transport) from the + * mocked message events like the one below + * (must be dispatched on the client instance). + */ + this.socket, + new MessageEvent("message", { + data, + origin: this.socket.url + }) + ) + ); + }; + if (this.socket.readyState === this.socket.CONNECTING) { + this.socket.addEventListener( + "open", + () => { + dispatchEvent(); + }, + { once: true } + ); + } else { + dispatchEvent(); + } + }); + } + close(code, reason) { + this.socket[kClose](code, reason); + } +}; +var _WebSocketInterceptor = class extends Interceptor { + constructor() { + super(_WebSocketInterceptor.symbol); + } + checkEnvironment() { + return hasConfigurableGlobal("WebSocket"); + } + setup() { + const originalWebSocketDescriptor = Object.getOwnPropertyDescriptor( + globalThis, + "WebSocket" + ); + const WebSocketProxy = new Proxy(globalThis.WebSocket, { + construct: (target, args, newTarget) => { + const [url, protocols] = args; + const createConnection = () => { + return Reflect.construct(target, args, newTarget); + }; + const socket = new WebSocketOverride(url, protocols); + const transport = new WebSocketClassTransport(socket); + queueMicrotask(async () => { + try { + const server = new WebSocketServerConnection( + socket, + transport, + createConnection + ); + const hasConnectionListeners = this.emitter.listenerCount("connection") > 0; + await emitAsync(this.emitter, "connection", { + client: new WebSocketClientConnection(socket, transport), + server, + info: { + protocols + } + }); + if (hasConnectionListeners) { + socket[kPassthroughPromise].resolve(false); + } else { + socket[kPassthroughPromise].resolve(true); + server.connect(); + server.addEventListener("open", () => { + socket.dispatchEvent(bindEvent(socket, new Event("open"))); + if (server["realWebSocket"]) { + socket.protocol = server["realWebSocket"].protocol; + } + }); + } + } catch (error4) { + if (error4 instanceof Error) { + socket.dispatchEvent(new Event("error")); + if (socket.readyState !== WebSocket.CLOSING && socket.readyState !== WebSocket.CLOSED) { + socket[kClose](1011, error4.message, false); + } + console.error(error4); + } + } + }); + return socket; + } + }); + Object.defineProperty(globalThis, "WebSocket", { + value: WebSocketProxy, + configurable: true + }); + this.subscriptions.push(() => { + Object.defineProperty( + globalThis, + "WebSocket", + originalWebSocketDescriptor + ); + }); + } +}; +var WebSocketInterceptor = _WebSocketInterceptor; +WebSocketInterceptor.symbol = Symbol("websocket"); + +// node_modules/msw/lib/core/ws/webSocketInterceptor.mjs +var webSocketInterceptor = new WebSocketInterceptor(); + +// node_modules/msw/lib/core/ws/handleWebSocketEvent.mjs +function handleWebSocketEvent(options) { + webSocketInterceptor.on("connection", async (connection) => { + const handlers = options.getHandlers().filter(isHandlerKind("EventHandler")); + if (handlers.length > 0) { + options?.onMockedConnection(connection); + await Promise.all( + handlers.map((handler) => { + return handler.run(connection); + }) + ); + return; + } + const request = new Request(connection.client.url, { + headers: { + upgrade: "websocket", + connection: "upgrade" + } + }); + await onUnhandledRequest( + request, + options.getUnhandledRequestStrategy() + ).catch((error4) => { + const errorEvent = new Event("error"); + Object.defineProperty(errorEvent, "cause", { + enumerable: true, + configurable: false, + value: error4 + }); + connection.client.socket.dispatchEvent(errorEvent); + }); + options?.onPassthroughConnection(connection); + connection.server.connect(); + }); +} + +// node_modules/msw/lib/core/utils/logging/getTimestamp.mjs +function getTimestamp(options) { + const now = /* @__PURE__ */ new Date(); + const timestamp = `${now.getHours().toString().padStart(2, "0")}:${now.getMinutes().toString().padStart(2, "0")}:${now.getSeconds().toString().padStart(2, "0")}`; + if (options?.milliseconds) { + return `${timestamp}.${now.getMilliseconds().toString().padStart(3, "0")}`; + } + return timestamp; +} + +// node_modules/msw/lib/core/ws/utils/getMessageLength.mjs +function getMessageLength(data) { + if (data instanceof Blob) { + return data.size; + } + if (data instanceof ArrayBuffer) { + return data.byteLength; + } + return new Blob([data]).size; +} + +// node_modules/msw/lib/core/ws/utils/truncateMessage.mjs +var MAX_LENGTH = 24; +function truncateMessage(message4) { + if (message4.length <= MAX_LENGTH) { + return message4; + } + return `${message4.slice(0, MAX_LENGTH)}\u2026`; +} + +// node_modules/msw/lib/core/ws/utils/getPublicData.mjs +async function getPublicData(data) { + if (data instanceof Blob) { + const text = await data.text(); + return `Blob(${truncateMessage(text)})`; + } + if (typeof data === "object" && "byteLength" in data) { + const text = new TextDecoder().decode(data); + return `ArrayBuffer(${truncateMessage(text)})`; + } + return truncateMessage(data); +} + +// node_modules/msw/lib/core/ws/utils/attachWebSocketLogger.mjs +var colors = { + system: "#3b82f6", + outgoing: "#22c55e", + incoming: "#ef4444", + mocked: "#ff6a33" +}; +function attachWebSocketLogger(connection) { + const { client, server } = connection; + logConnectionOpen(client); + client.addEventListener("message", (event) => { + logOutgoingClientMessage(event); + }); + client.addEventListener("close", (event) => { + logConnectionClose(event); + }); + client.socket.addEventListener("error", (event) => { + logClientError(event); + }); + client.send = new Proxy(client.send, { + apply(target, thisArg, args) { + const [data] = args; + const messageEvent = new MessageEvent("message", { data }); + Object.defineProperties(messageEvent, { + currentTarget: { + enumerable: true, + writable: false, + value: client.socket + }, + target: { + enumerable: true, + writable: false, + value: client.socket + } + }); + queueMicrotask(() => { + logIncomingMockedClientMessage(messageEvent); + }); + return Reflect.apply(target, thisArg, args); + } + }); + server.addEventListener( + "open", + () => { + server.addEventListener("message", (event) => { + logIncomingServerMessage(event); + }); + }, + { once: true } + ); + server.send = new Proxy(server.send, { + apply(target, thisArg, args) { + const [data] = args; + const messageEvent = new MessageEvent("message", { data }); + Object.defineProperties(messageEvent, { + currentTarget: { + enumerable: true, + writable: false, + value: server.socket + }, + target: { + enumerable: true, + writable: false, + value: server.socket + } + }); + logOutgoingMockedClientMessage(messageEvent); + return Reflect.apply(target, thisArg, args); + } + }); +} +function logConnectionOpen(client) { + const publicUrl = toPublicUrl(client.url); + console.groupCollapsed( + devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`), + `color:${colors.system}`, + "color:inherit" + ); + console.log("Client:", client.socket); + console.groupEnd(); +} +function logConnectionClose(event) { + const target = event.target; + const publicUrl = toPublicUrl(target.url); + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}` + ), + `color:${colors.system}`, + "color:inherit" + ); + console.log(event); + console.groupEnd(); +} +function logClientError(event) { + const socket = event.target; + const publicUrl = toPublicUrl(socket.url); + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}` + ), + `color:${colors.system}`, + "color:inherit" + ); + console.log(event); + console.groupEnd(); +} +async function logOutgoingClientMessage(event) { + const byteLength = getMessageLength(event.data); + const publicData = await getPublicData(event.data); + const arrow = event.defaultPrevented ? "\u21E1" : "\u2B06"; + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c` + ), + `color:${colors.outgoing}`, + "color:inherit", + "color:gray;font-weight:normal", + "color:inherit;font-weight:inherit" + ); + console.log(event); + console.groupEnd(); +} +async function logOutgoingMockedClientMessage(event) { + const byteLength = getMessageLength(event.data); + const publicData = await getPublicData(event.data); + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp({ milliseconds: true })} %c\u2B06%c ${publicData} %c${byteLength}%c` + ), + `color:${colors.mocked}`, + "color:inherit", + "color:gray;font-weight:normal", + "color:inherit;font-weight:inherit" + ); + console.log(event); + console.groupEnd(); +} +async function logIncomingMockedClientMessage(event) { + const byteLength = getMessageLength(event.data); + const publicData = await getPublicData(event.data); + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp({ milliseconds: true })} %c\u2B07%c ${publicData} %c${byteLength}%c` + ), + `color:${colors.mocked}`, + "color:inherit", + "color:gray;font-weight:normal", + "color:inherit;font-weight:inherit" + ); + console.log(event); + console.groupEnd(); +} +async function logIncomingServerMessage(event) { + const byteLength = getMessageLength(event.data); + const publicData = await getPublicData(event.data); + const arrow = event.defaultPrevented ? "\u21E3" : "\u2B07"; + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c` + ), + `color:${colors.incoming}`, + "color:inherit", + "color:gray;font-weight:normal", + "color:inherit;font-weight:inherit" + ); + console.log(event); + console.groupEnd(); +} + +// node_modules/msw/lib/browser/index.mjs +var POSITIONALS_EXP2 = /(%?)(%([sdijo]))/g; +function serializePositional2(positional, flag) { + switch (flag) { + case "s": + return positional; + case "d": + case "i": + return Number(positional); + case "j": + return JSON.stringify(positional); + case "o": { + if (typeof positional === "string") { + return positional; + } + const json = JSON.stringify(positional); + if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) { + return positional; + } + return json; + } + } +} +function format2(message4, ...positionals) { + if (positionals.length === 0) { + return message4; + } + let positionalIndex = 0; + let formattedMessage = message4.replace( + POSITIONALS_EXP2, + (match2, isEscaped, _, flag) => { + const positional = positionals[positionalIndex]; + const value = serializePositional2(positional, flag); + if (!isEscaped) { + positionalIndex++; + return value; + } + return match2; + } + ); + if (positionalIndex < positionals.length) { + formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`; + } + formattedMessage = formattedMessage.replace(/%{2,2}/g, "%"); + return formattedMessage; +} +var STACK_FRAMES_TO_IGNORE2 = 2; +function cleanErrorStack2(error22) { + if (!error22.stack) { + return; + } + const nextStack = error22.stack.split("\n"); + nextStack.splice(1, STACK_FRAMES_TO_IGNORE2); + error22.stack = nextStack.join("\n"); +} +var InvariantError2 = class extends Error { + constructor(message4, ...positionals) { + super(message4); + this.message = message4; + this.name = "Invariant Violation"; + this.message = format2(message4, ...positionals); + cleanErrorStack2(this); + } +}; +var invariant2 = (predicate, message4, ...positionals) => { + if (!predicate) { + throw new InvariantError2(message4, ...positionals); + } +}; +invariant2.as = (ErrorConstructor, predicate, message4, ...positionals) => { + if (!predicate) { + const formatMessage2 = positionals.length === 0 ? message4 : format2(message4, ...positionals); + let error22; + try { + error22 = Reflect.construct(ErrorConstructor, [ + formatMessage2 + ]); + } catch (err) { + error22 = ErrorConstructor(formatMessage2); + } + throw error22; + } +}; +function isNodeProcess2() { + if (typeof navigator !== "undefined" && navigator.product === "ReactNative") { + return true; + } + if (typeof process !== "undefined") { + const type = process.type; + if (type === "renderer" || type === "worker") { + return false; + } + return !!(process.versions && process.versions.node); + } + return false; +} +function createDeferredExecutor2() { + const executor = (resolve, reject) => { + executor.state = "pending"; + executor.resolve = (data) => { + if (executor.state !== "pending") { + return; + } + executor.result = data; + const onFulfilled = (value) => { + executor.state = "fulfilled"; + return value; + }; + return resolve( + data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled) + ); + }; + executor.reject = (reason) => { + if (executor.state !== "pending") { + return; + } + queueMicrotask(() => { + executor.state = "rejected"; + }); + return reject(executor.rejectionReason = reason); + }; + }; + return executor; +} +var DeferredPromise2 = class extends Promise { + #executor; + resolve; + reject; + constructor(executor = null) { + const deferredExecutor = createDeferredExecutor2(); + super((originalResolve, originalReject) => { + deferredExecutor(originalResolve, originalReject); + executor?.(deferredExecutor.resolve, deferredExecutor.reject); + }); + this.#executor = deferredExecutor; + this.resolve = this.#executor.resolve; + this.reject = this.#executor.reject; + } + get state() { + return this.#executor.state; + } + get rejectionReason() { + return this.#executor.rejectionReason; + } + then(onFulfilled, onRejected) { + return this.#decorate(super.then(onFulfilled, onRejected)); + } + catch(onRejected) { + return this.#decorate(super.catch(onRejected)); + } + finally(onfinally) { + return this.#decorate(super.finally(onfinally)); + } + #decorate(promise) { + return Object.defineProperties(promise, { + resolve: { configurable: true, value: this.resolve }, + reject: { configurable: true, value: this.reject } + }); + } +}; +var DEFAULT_START_OPTIONS = { + serviceWorker: { + url: "/mockServiceWorker.js", + options: null + }, + quiet: false, + waitUntilReady: true, + onUnhandledRequest: "warn", + findWorker(scriptURL, mockServiceWorkerUrl) { + return scriptURL === mockServiceWorkerUrl; + } +}; +async function until2(callback) { + try { + return [null, await callback().catch((error22) => { + throw error22; + })]; + } catch (error22) { + return [error22, null]; + } +} +function getAbsoluteWorkerUrl(workerUrl) { + return new URL(workerUrl, location.href).href; +} +function getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker) { + const allStates = [ + registration.active, + registration.installing, + registration.waiting + ]; + const relevantStates = allStates.filter((state) => { + return state != null; + }); + const worker = relevantStates.find((worker2) => { + return findWorker(worker2.scriptURL, absoluteWorkerUrl); + }); + return worker || null; +} +var getWorkerInstance = async (url, options = {}, findWorker) => { + const absoluteWorkerUrl = getAbsoluteWorkerUrl(url); + const mockRegistrations = await navigator.serviceWorker.getRegistrations().then( + (registrations) => registrations.filter( + (registration) => getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker) + ) + ); + if (!navigator.serviceWorker.controller && mockRegistrations.length > 0) { + location.reload(); + } + const [existingRegistration] = mockRegistrations; + if (existingRegistration) { + existingRegistration.update(); + return [ + getWorkerByRegistration( + existingRegistration, + absoluteWorkerUrl, + findWorker + ), + existingRegistration + ]; + } + const [registrationError, registrationResult] = await until2(async () => { + const registration = await navigator.serviceWorker.register(url, options); + return [ + // Compare existing worker registration by its worker URL, + // to prevent irrelevant workers to resolve here (such as Codesandbox worker). + getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker), + registration + ]; + }); + if (registrationError) { + const isWorkerMissing = registrationError.message.includes("(404)"); + if (isWorkerMissing) { + const scopeUrl = new URL(options?.scope || "/", location.href); + throw new Error( + devUtils.formatMessage(`Failed to register a Service Worker for scope ('${scopeUrl.href}') with script ('${absoluteWorkerUrl}'): Service Worker script does not exist at the given path. + +Did you forget to run "npx msw init "? + +Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/init`) + ); + } + throw new Error( + devUtils.formatMessage( + "Failed to register the Service Worker:\n\n%s", + registrationError.message + ) + ); + } + return registrationResult; +}; +function printStartMessage(args = {}) { + if (args.quiet) { + return; + } + const message4 = args.message || "Mocking enabled."; + console.groupCollapsed( + `%c${devUtils.formatMessage(message4)}`, + "color:orangered;font-weight:bold;" + ); + console.log( + "%cDocumentation: %chttps://mswjs.io/docs", + "font-weight:bold", + "font-weight:normal" + ); + console.log("Found an issue? https://github.com/mswjs/msw/issues"); + if (args.workerUrl) { + console.log("Worker script URL:", args.workerUrl); + } + if (args.workerScope) { + console.log("Worker scope:", args.workerScope); + } + if (args.client) { + console.log("Client ID: %s (%s)", args.client.id, args.client.frameType); + } + console.groupEnd(); +} +function enableMocking(context, options) { + const mockingEnabledPromise = new DeferredPromise2(); + context.workerChannel.postMessage("MOCK_ACTIVATE"); + context.workerChannel.once("MOCKING_ENABLED", async (event) => { + context.isMockingEnabled = true; + const worker = await context.workerPromise; + printStartMessage({ + quiet: options.quiet, + workerScope: context.registration?.scope, + workerUrl: worker.scriptURL, + client: event.data.client + }); + mockingEnabledPromise.resolve(true); + }); + return mockingEnabledPromise; +} +function pruneGetRequestBody(request) { + if (["HEAD", "GET"].includes(request.method)) { + return void 0; + } + return request.body; +} +function deserializeRequest(serializedRequest) { + return new Request(serializedRequest.url, { + ...serializedRequest, + body: pruneGetRequestBody(serializedRequest) + }); +} +function supportsServiceWorker() { + return typeof navigator !== "undefined" && "serviceWorker" in navigator && typeof location !== "undefined" && location.protocol !== "file:"; +} +function supportsReadableStreamTransfer() { + try { + const stream = new ReadableStream({ + start: (controller) => controller.close() + }); + const message4 = new MessageChannel(); + message4.port1.postMessage(stream, [stream]); + return true; + } catch { + return false; + } +} +var SUPPORTS_READABLE_STREAM_TRANSFER = supportsReadableStreamTransfer(); +var createRequestListener = (context, options) => { + return async (event) => { + if (!context.isMockingEnabled && context.workerStoppedAt && event.data.interceptedAt > context.workerStoppedAt) { + event.postMessage("PASSTHROUGH"); + return; + } + const requestId = event.data.id; + const request = deserializeRequest(event.data); + const requestCloneForLogs = request.clone(); + const requestClone = request.clone(); + RequestHandler.cache.set(request, requestClone); + try { + await handleRequest( + request, + requestId, + context.getRequestHandlers().filter(isHandlerKind("RequestHandler")), + options, + context.emitter, + { + onPassthroughResponse() { + event.postMessage("PASSTHROUGH"); + }, + async onMockedResponse(response, { handler, parsedResult }) { + const responseClone = response.clone(); + const responseCloneForLogs = response.clone(); + const responseInit = toResponseInit(response); + if (SUPPORTS_READABLE_STREAM_TRANSFER) { + const responseStreamOrNull = response.body; + event.postMessage( + "MOCK_RESPONSE", + { + ...responseInit, + body: responseStreamOrNull + }, + responseStreamOrNull ? [responseStreamOrNull] : void 0 + ); + } else { + const responseBufferOrNull = response.body === null ? null : await responseClone.arrayBuffer(); + event.postMessage("MOCK_RESPONSE", { + ...responseInit, + body: responseBufferOrNull + }); + } + if (!options.quiet) { + context.emitter.once("response:mocked", () => { + handler.log({ + request: requestCloneForLogs, + response: responseCloneForLogs, + parsedResult + }); + }); + } + } + } + ); + } catch (error22) { + if (error22 instanceof Error) { + devUtils.error( + `Uncaught exception in the request handler for "%s %s": + +%s + +This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/http/mocking-responses/error-responses`, + request.method, + request.url, + error22.stack ?? error22 + ); + event.postMessage("MOCK_RESPONSE", { + status: 500, + statusText: "Request Handler Error", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + name: error22.name, + message: error22.message, + stack: error22.stack + }) + }); + } + } + }; +}; +function checkWorkerIntegrity(context) { + const integrityCheckPromise = new DeferredPromise2(); + context.workerChannel.postMessage("INTEGRITY_CHECK_REQUEST"); + context.workerChannel.once("INTEGRITY_CHECK_RESPONSE", (event) => { + const { checksum, packageVersion } = event.data; + if (checksum !== "4db4a41e972cec1b64cc569c66952d82") { + devUtils.warn( + `The currently registered Service Worker has been generated by a different version of MSW (${packageVersion}) and may not be fully compatible with the installed version. + +It's recommended you update your worker script by running this command: + + \u2022 npx msw init + +You can also automate this process and make the worker script update automatically upon the library installations. Read more: https://mswjs.io/docs/cli/init.` + ); + } + integrityCheckPromise.resolve(); + }); + return integrityCheckPromise; +} +var encoder = new TextEncoder(); +function encodeBuffer(text) { + return encoder.encode(text); +} +function decodeBuffer(buffer, encoding) { + const decoder = new TextDecoder(encoding); + return decoder.decode(buffer); +} +function toArrayBuffer(array) { + return array.buffer.slice( + array.byteOffset, + array.byteOffset + array.byteLength + ); +} +var __defProp4 = Object.defineProperty; +var __export2 = (target, all) => { + for (var name in all) + __defProp4(target, name, { get: all[name], enumerable: true }); +}; +var colors_exports2 = {}; +__export2(colors_exports2, { + blue: () => blue2, + gray: () => gray2, + green: () => green2, + red: () => red2, + yellow: () => yellow2 +}); +function yellow2(text) { + return `\x1B[33m${text}\x1B[0m`; +} +function blue2(text) { + return `\x1B[34m${text}\x1B[0m`; +} +function gray2(text) { + return `\x1B[90m${text}\x1B[0m`; +} +function red2(text) { + return `\x1B[31m${text}\x1B[0m`; +} +function green2(text) { + return `\x1B[32m${text}\x1B[0m`; +} +var IS_NODE2 = isNodeProcess2(); +var Logger2 = class { + constructor(name) { + this.name = name; + this.prefix = `[${this.name}]`; + const LOGGER_NAME = getVariable2("DEBUG"); + const LOGGER_LEVEL = getVariable2("LOG_LEVEL"); + const isLoggingEnabled = LOGGER_NAME === "1" || LOGGER_NAME === "true" || typeof LOGGER_NAME !== "undefined" && this.name.startsWith(LOGGER_NAME); + if (isLoggingEnabled) { + this.debug = isDefinedAndNotEquals2(LOGGER_LEVEL, "debug") ? noop2 : this.debug; + this.info = isDefinedAndNotEquals2(LOGGER_LEVEL, "info") ? noop2 : this.info; + this.success = isDefinedAndNotEquals2(LOGGER_LEVEL, "success") ? noop2 : this.success; + this.warning = isDefinedAndNotEquals2(LOGGER_LEVEL, "warning") ? noop2 : this.warning; + this.error = isDefinedAndNotEquals2(LOGGER_LEVEL, "error") ? noop2 : this.error; + } else { + this.info = noop2; + this.success = noop2; + this.warning = noop2; + this.error = noop2; + this.only = noop2; + } + } + prefix; + extend(domain) { + return new Logger2(`${this.name}:${domain}`); + } + /** + * Print a debug message. + * @example + * logger.debug('no duplicates found, creating a document...') + */ + debug(message4, ...positionals) { + this.logEntry({ + level: "debug", + message: gray2(message4), + positionals, + prefix: this.prefix, + colors: { + prefix: "gray" + } + }); + } + /** + * Print an info message. + * @example + * logger.info('start parsing...') + */ + info(message4, ...positionals) { + this.logEntry({ + level: "info", + message: message4, + positionals, + prefix: this.prefix, + colors: { + prefix: "blue" + } + }); + const performance2 = new PerformanceEntry2(); + return (message22, ...positionals2) => { + performance2.measure(); + this.logEntry({ + level: "info", + message: `${message22} ${gray2(`${performance2.deltaTime}ms`)}`, + positionals: positionals2, + prefix: this.prefix, + colors: { + prefix: "blue" + } + }); + }; + } + /** + * Print a success message. + * @example + * logger.success('successfully created document') + */ + success(message4, ...positionals) { + this.logEntry({ + level: "info", + message: message4, + positionals, + prefix: `\u2714 ${this.prefix}`, + colors: { + timestamp: "green", + prefix: "green" + } + }); + } + /** + * Print a warning. + * @example + * logger.warning('found legacy document format') + */ + warning(message4, ...positionals) { + this.logEntry({ + level: "warning", + message: message4, + positionals, + prefix: `\u26A0 ${this.prefix}`, + colors: { + timestamp: "yellow", + prefix: "yellow" + } + }); + } + /** + * Print an error message. + * @example + * logger.error('something went wrong') + */ + error(message4, ...positionals) { + this.logEntry({ + level: "error", + message: message4, + positionals, + prefix: `\u2716 ${this.prefix}`, + colors: { + timestamp: "red", + prefix: "red" + } + }); + } + /** + * Execute the given callback only when the logging is enabled. + * This is skipped in its entirety and has no runtime cost otherwise. + * This executes regardless of the log level. + * @example + * logger.only(() => { + * logger.info('additional info') + * }) + */ + only(callback) { + callback(); + } + createEntry(level, message4) { + return { + timestamp: /* @__PURE__ */ new Date(), + level, + message: message4 + }; + } + logEntry(args) { + const { + level, + message: message4, + prefix, + colors: customColors, + positionals = [] + } = args; + const entry = this.createEntry(level, message4); + const timestampColor = customColors?.timestamp || "gray"; + const prefixColor = customColors?.prefix || "gray"; + const colorize = { + timestamp: colors_exports2[timestampColor], + prefix: colors_exports2[prefixColor] + }; + const write = this.getWriter(level); + write( + [colorize.timestamp(this.formatTimestamp(entry.timestamp))].concat(prefix != null ? colorize.prefix(prefix) : []).concat(serializeInput2(message4)).join(" "), + ...positionals.map(serializeInput2) + ); + } + formatTimestamp(timestamp) { + return `${timestamp.toLocaleTimeString( + "en-GB" + )}:${timestamp.getMilliseconds()}`; + } + getWriter(level) { + switch (level) { + case "debug": + case "success": + case "info": { + return log2; + } + case "warning": { + return warn3; + } + case "error": { + return error3; + } + } + } +}; +var PerformanceEntry2 = class { + startTime; + endTime; + deltaTime; + constructor() { + this.startTime = performance.now(); + } + measure() { + this.endTime = performance.now(); + const deltaTime = this.endTime - this.startTime; + this.deltaTime = deltaTime.toFixed(2); + } +}; +var noop2 = () => void 0; +function log2(message4, ...positionals) { + if (IS_NODE2) { + process.stdout.write(format2(message4, ...positionals) + "\n"); + return; + } + console.log(message4, ...positionals); +} +function warn3(message4, ...positionals) { + if (IS_NODE2) { + process.stderr.write(format2(message4, ...positionals) + "\n"); + return; + } + console.warn(message4, ...positionals); +} +function error3(message4, ...positionals) { + if (IS_NODE2) { + process.stderr.write(format2(message4, ...positionals) + "\n"); + return; + } + console.error(message4, ...positionals); +} +function getVariable2(variableName) { + if (IS_NODE2) { + return process.env[variableName]; + } + return globalThis[variableName]?.toString(); +} +function isDefinedAndNotEquals2(value, expected) { + return value !== void 0 && value !== expected; +} +function serializeInput2(message4) { + if (typeof message4 === "undefined") { + return "undefined"; + } + if (message4 === null) { + return "null"; + } + if (typeof message4 === "string") { + return message4; + } + if (typeof message4 === "object") { + return JSON.stringify(message4); + } + return message4.toString(); +} +var MemoryLeakError2 = class extends Error { + constructor(emitter, type, count) { + super( + `Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit` + ); + this.emitter = emitter; + this.type = type; + this.count = count; + this.name = "MaxListenersExceededWarning"; + } +}; +var _Emitter2 = class { + static listenerCount(emitter, eventName) { + return emitter.listenerCount(eventName); + } + constructor() { + this.events = /* @__PURE__ */ new Map(); + this.maxListeners = _Emitter2.defaultMaxListeners; + this.hasWarnedAboutPotentialMemoryLeak = false; + } + _emitInternalEvent(internalEventName, eventName, listener) { + this.emit( + internalEventName, + ...[eventName, listener] + ); + } + _getListeners(eventName) { + return Array.prototype.concat.apply([], this.events.get(eventName)) || []; + } + _removeListener(listeners, listener) { + const index = listeners.indexOf(listener); + if (index > -1) { + listeners.splice(index, 1); + } + return []; + } + _wrapOnceListener(eventName, listener) { + const onceListener = (...data) => { + this.removeListener(eventName, onceListener); + return listener.apply(this, data); + }; + Object.defineProperty(onceListener, "name", { value: listener.name }); + return onceListener; + } + setMaxListeners(maxListeners) { + this.maxListeners = maxListeners; + return this; + } + /** + * Returns the current max listener value for the `Emitter` which is + * either set by `emitter.setMaxListeners(n)` or defaults to + * `Emitter.defaultMaxListeners`. + */ + getMaxListeners() { + return this.maxListeners; + } + /** + * Returns an array listing the events for which the emitter has registered listeners. + * The values in the array will be strings or Symbols. + */ + eventNames() { + return Array.from(this.events.keys()); + } + /** + * Synchronously calls each of the listeners registered for the event named `eventName`, + * in the order they were registered, passing the supplied arguments to each. + * Returns `true` if the event has listeners, `false` otherwise. + * + * @example + * const emitter = new Emitter<{ hello: [string] }>() + * emitter.emit('hello', 'John') + */ + emit(eventName, ...data) { + const listeners = this._getListeners(eventName); + listeners.forEach((listener) => { + listener.apply(this, data); + }); + return listeners.length > 0; + } + addListener(eventName, listener) { + this._emitInternalEvent("newListener", eventName, listener); + const nextListeners = this._getListeners(eventName).concat(listener); + this.events.set(eventName, nextListeners); + if (this.maxListeners > 0 && this.listenerCount(eventName) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) { + this.hasWarnedAboutPotentialMemoryLeak = true; + const memoryLeakWarning = new MemoryLeakError2( + this, + eventName, + this.listenerCount(eventName) + ); + console.warn(memoryLeakWarning); + } + return this; + } + on(eventName, listener) { + return this.addListener(eventName, listener); + } + once(eventName, listener) { + return this.addListener( + eventName, + this._wrapOnceListener(eventName, listener) + ); + } + prependListener(eventName, listener) { + const listeners = this._getListeners(eventName); + if (listeners.length > 0) { + const nextListeners = [listener].concat(listeners); + this.events.set(eventName, nextListeners); + } else { + this.events.set(eventName, listeners.concat(listener)); + } + return this; + } + prependOnceListener(eventName, listener) { + return this.prependListener( + eventName, + this._wrapOnceListener(eventName, listener) + ); + } + removeListener(eventName, listener) { + const listeners = this._getListeners(eventName); + if (listeners.length > 0) { + this._removeListener(listeners, listener); + this.events.set(eventName, listeners); + this._emitInternalEvent("removeListener", eventName, listener); + } + return this; + } + /** + * Alias for `emitter.removeListener()`. + * + * @example + * emitter.off('hello', listener) + */ + off(eventName, listener) { + return this.removeListener(eventName, listener); + } + removeAllListeners(eventName) { + if (eventName) { + this.events.delete(eventName); + } else { + this.events.clear(); + } + return this; + } + /** + * Returns a copy of the array of listeners for the event named `eventName`. + */ + listeners(eventName) { + return Array.from(this._getListeners(eventName)); + } + /** + * Returns the number of listeners listening to the event named `eventName`. + */ + listenerCount(eventName) { + return this._getListeners(eventName).length; + } + rawListeners(eventName) { + return this.listeners(eventName); + } +}; +var Emitter2 = _Emitter2; +Emitter2.defaultMaxListeners = 10; +var __accessCheck2 = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet2 = (obj, member, getter) => { + __accessCheck2(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd2 = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id"; +function getGlobalSymbol2(symbol) { + return ( + // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587 + globalThis[symbol] || void 0 + ); +} +function setGlobalSymbol2(symbol, value) { + globalThis[symbol] = value; +} +function deleteGlobalSymbol2(symbol) { + delete globalThis[symbol]; +} +var Interceptor2 = class { + constructor(symbol) { + this.symbol = symbol; + this.readyState = "INACTIVE"; + this.emitter = new Emitter2(); + this.subscriptions = []; + this.logger = new Logger2(symbol.description); + this.emitter.setMaxListeners(0); + this.logger.info("constructing the interceptor..."); + } + /** + * Determine if this interceptor can be applied + * in the current environment. + */ + checkEnvironment() { + return true; + } + /** + * Apply this interceptor to the current process. + * Returns an already running interceptor instance if it's present. + */ + apply() { + const logger = this.logger.extend("apply"); + logger.info("applying the interceptor..."); + if (this.readyState === "APPLIED") { + logger.info("intercepted already applied!"); + return; + } + const shouldApply = this.checkEnvironment(); + if (!shouldApply) { + logger.info("the interceptor cannot be applied in this environment!"); + return; + } + this.readyState = "APPLYING"; + const runningInstance = this.getInstance(); + if (runningInstance) { + logger.info("found a running instance, reusing..."); + this.on = (event, listener) => { + logger.info('proxying the "%s" listener', event); + runningInstance.emitter.addListener(event, listener); + this.subscriptions.push(() => { + runningInstance.emitter.removeListener(event, listener); + logger.info('removed proxied "%s" listener!', event); + }); + return this; + }; + this.readyState = "APPLIED"; + return; + } + logger.info("no running instance found, setting up a new instance..."); + this.setup(); + this.setInstance(); + this.readyState = "APPLIED"; + } + /** + * Setup the module augments and stubs necessary for this interceptor. + * This method is not run if there's a running interceptor instance + * to prevent instantiating an interceptor multiple times. + */ + setup() { + } + /** + * Listen to the interceptor's public events. + */ + on(event, listener) { + const logger = this.logger.extend("on"); + if (this.readyState === "DISPOSING" || this.readyState === "DISPOSED") { + logger.info("cannot listen to events, already disposed!"); + return this; + } + logger.info('adding "%s" event listener:', event, listener); + this.emitter.on(event, listener); + return this; + } + once(event, listener) { + this.emitter.once(event, listener); + return this; + } + off(event, listener) { + this.emitter.off(event, listener); + return this; + } + removeAllListeners(event) { + this.emitter.removeAllListeners(event); + return this; + } + /** + * Disposes of any side-effects this interceptor has introduced. + */ + dispose() { + const logger = this.logger.extend("dispose"); + if (this.readyState === "DISPOSED") { + logger.info("cannot dispose, already disposed!"); + return; + } + logger.info("disposing the interceptor..."); + this.readyState = "DISPOSING"; + if (!this.getInstance()) { + logger.info("no interceptors running, skipping dispose..."); + return; + } + this.clearInstance(); + logger.info("global symbol deleted:", getGlobalSymbol2(this.symbol)); + if (this.subscriptions.length > 0) { + logger.info("disposing of %d subscriptions...", this.subscriptions.length); + for (const dispose of this.subscriptions) { + dispose(); + } + this.subscriptions = []; + logger.info("disposed of all subscriptions!", this.subscriptions.length); + } + this.emitter.removeAllListeners(); + logger.info("destroyed the listener!"); + this.readyState = "DISPOSED"; + } + getInstance() { + var _a2; + const instance = getGlobalSymbol2(this.symbol); + this.logger.info("retrieved global instance:", (_a2 = instance == null ? void 0 : instance.constructor) == null ? void 0 : _a2.name); + return instance; + } + setInstance() { + setGlobalSymbol2(this.symbol, this); + this.logger.info("set global instance!", this.symbol.description); + } + clearInstance() { + deleteGlobalSymbol2(this.symbol); + this.logger.info("cleared global instance!", this.symbol.description); + } +}; +function createRequestId2() { + return Math.random().toString(16).slice(2); +} +var IS_PATCHED_MODULE = Symbol("isPatchedModule"); +var InterceptorError = class extends Error { + constructor(message4) { + super(message4); + this.name = "InterceptorError"; + Object.setPrototypeOf(this, InterceptorError.prototype); + } +}; +var _handled; +var handled_get; +var _RequestController = class { + constructor(request, source) { + this.request = request; + this.source = source; + __privateAdd2(this, _handled); + this.readyState = _RequestController.PENDING; + this.handled = new DeferredPromise2(); + } + /** + * Perform this request as-is. + */ + async passthrough() { + invariant2.as( + InterceptorError, + this.readyState === _RequestController.PENDING, + 'Failed to passthrough the "%s %s" request: the request has already been handled', + this.request.method, + this.request.url + ); + this.readyState = _RequestController.PASSTHROUGH; + await this.source.passthrough(); + __privateGet2(this, _handled, handled_get).resolve(); + } + /** + * Respond to this request with the given `Response` instance. + * + * @example + * controller.respondWith(new Response()) + * controller.respondWith(Response.json({ id })) + * controller.respondWith(Response.error()) + */ + respondWith(response) { + invariant2.as( + InterceptorError, + this.readyState === _RequestController.PENDING, + 'Failed to respond to the "%s %s" request with "%d %s": the request has already been handled (%d)', + this.request.method, + this.request.url, + response.status, + response.statusText || "OK", + this.readyState + ); + this.readyState = _RequestController.RESPONSE; + __privateGet2(this, _handled, handled_get).resolve(); + this.source.respondWith(response); + } + /** + * Error this request with the given reason. + * + * @example + * controller.errorWith() + * controller.errorWith(new Error('Oops!')) + * controller.errorWith({ message: 'Oops!'}) + */ + errorWith(reason) { + invariant2.as( + InterceptorError, + this.readyState === _RequestController.PENDING, + 'Failed to error the "%s %s" request with "%s": the request has already been handled (%d)', + this.request.method, + this.request.url, + reason == null ? void 0 : reason.toString(), + this.readyState + ); + this.readyState = _RequestController.ERROR; + this.source.errorWith(reason); + __privateGet2(this, _handled, handled_get).resolve(); + } +}; +var RequestController = _RequestController; +_handled = /* @__PURE__ */ new WeakSet(); +handled_get = function() { + return this.handled; +}; +RequestController.PENDING = 0; +RequestController.PASSTHROUGH = 1; +RequestController.RESPONSE = 2; +RequestController.ERROR = 3; +function canParseUrl(url) { + try { + new URL(url); + return true; + } catch (_error) { + return false; + } +} +function getValueBySymbol(symbolName, source) { + const ownSymbols = Object.getOwnPropertySymbols(source); + const symbol = ownSymbols.find((symbol2) => { + return symbol2.description === symbolName; + }); + if (symbol) { + return Reflect.get(source, symbol); + } + return; +} +var _FetchResponse = class extends Response { + static isConfigurableStatusCode(status) { + return status >= 200 && status <= 599; + } + static isRedirectResponse(status) { + return _FetchResponse.STATUS_CODES_WITH_REDIRECT.includes(status); + } + /** + * Returns a boolean indicating whether the given response status + * code represents a response that can have a body. + */ + static isResponseWithBody(status) { + return !_FetchResponse.STATUS_CODES_WITHOUT_BODY.includes(status); + } + static setUrl(url, response) { + if (!url || url === "about:" || !canParseUrl(url)) { + return; + } + const state = getValueBySymbol("state", response); + if (state) { + state.urlList.push(new URL(url)); + } else { + Object.defineProperty(response, "url", { + value: url, + enumerable: true, + configurable: true, + writable: false + }); + } + } + /** + * Parses the given raw HTTP headers into a Fetch API `Headers` instance. + */ + static parseRawHeaders(rawHeaders) { + const headers = new Headers(); + for (let line = 0; line < rawHeaders.length; line += 2) { + headers.append(rawHeaders[line], rawHeaders[line + 1]); + } + return headers; + } + constructor(body, init = {}) { + var _a2; + const status = (_a2 = init.status) != null ? _a2 : 200; + const safeStatus = _FetchResponse.isConfigurableStatusCode(status) ? status : 200; + const finalBody = _FetchResponse.isResponseWithBody(status) ? body : null; + super(finalBody, { + status: safeStatus, + statusText: init.statusText, + headers: init.headers + }); + if (status !== safeStatus) { + const state = getValueBySymbol("state", this); + if (state) { + state.status = status; + } else { + Object.defineProperty(this, "status", { + value: status, + enumerable: true, + configurable: true, + writable: false + }); + } + } + _FetchResponse.setUrl(init.url, this); + } +}; +var FetchResponse = _FetchResponse; +FetchResponse.STATUS_CODES_WITHOUT_BODY = [101, 103, 204, 205, 304]; +FetchResponse.STATUS_CODES_WITH_REDIRECT = [301, 302, 303, 307, 308]; +var kRawRequest = Symbol("kRawRequest"); +function setRawRequest(request, rawRequest) { + Reflect.set(request, kRawRequest, rawRequest); +} +var BatchInterceptor = class extends Interceptor2 { + constructor(options) { + BatchInterceptor.symbol = Symbol(options.name); + super(BatchInterceptor.symbol); + this.interceptors = options.interceptors; + } + setup() { + const logger = this.logger.extend("setup"); + logger.info("applying all %d interceptors...", this.interceptors.length); + for (const interceptor of this.interceptors) { + logger.info('applying "%s" interceptor...', interceptor.constructor.name); + interceptor.apply(); + logger.info("adding interceptor dispose subscription"); + this.subscriptions.push(() => interceptor.dispose()); + } + } + on(event, listener) { + for (const interceptor of this.interceptors) { + interceptor.on(event, listener); + } + return this; + } + once(event, listener) { + for (const interceptor of this.interceptors) { + interceptor.once(event, listener); + } + return this; + } + off(event, listener) { + for (const interceptor of this.interceptors) { + interceptor.off(event, listener); + } + return this; + } + removeAllListeners(event) { + for (const interceptors of this.interceptors) { + interceptors.removeAllListeners(event); + } + return this; + } +}; +function createResponseListener(context) { + return (event) => { + const responseMessage = event.data; + const request = deserializeRequest(responseMessage.request); + if (responseMessage.response.type?.includes("opaque")) { + return; + } + const response = responseMessage.response.status === 0 ? Response.error() : new FetchResponse( + /** + * Responses may be streams here, but when we create a response object + * with null-body status codes, like 204, 205, 304 Response will + * throw when passed a non-null body, so ensure it's null here + * for those codes + */ + FetchResponse.isResponseWithBody(responseMessage.response.status) ? responseMessage.response.body : null, + { + ...responseMessage, + /** + * Set response URL if it's not set already. + * @see https://github.com/mswjs/msw/issues/2030 + * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/url + */ + url: request.url + } + ); + context.emitter.emit( + responseMessage.isMockedResponse ? "response:mocked" : "response:bypass", + { + requestId: responseMessage.request.id, + request, + response + } + ); + }; +} +function validateWorkerScope(registration, options) { + if (!options?.quiet && !location.href.startsWith(registration.scope)) { + devUtils.warn( + `Cannot intercept requests on this page because it's outside of the worker's scope ("${registration.scope}"). If you wish to mock API requests on this page, you must resolve this scope issue. + +- (Recommended) Register the worker at the root level ("/") of your application. +- Set the "Service-Worker-Allowed" response header to allow out-of-scope workers.` + ); + } +} +var createStartHandler = (context) => { + return function start(options, customOptions) { + const startWorkerInstance = async () => { + context.workerChannel.removeAllListeners(); + context.workerChannel.on( + "REQUEST", + createRequestListener(context, options) + ); + context.workerChannel.on("RESPONSE", createResponseListener(context)); + const instance = await getWorkerInstance( + options.serviceWorker.url, + options.serviceWorker.options, + options.findWorker + ); + const [worker, registration] = instance; + if (!worker) { + const missingWorkerMessage = customOptions?.findWorker ? devUtils.formatMessage( + `Failed to locate the Service Worker registration using a custom "findWorker" predicate. + +Please ensure that the custom predicate properly locates the Service Worker registration at "%s". +More details: https://mswjs.io/docs/api/setup-worker/start#findworker +`, + options.serviceWorker.url + ) : devUtils.formatMessage( + `Failed to locate the Service Worker registration. + +This most likely means that the worker script URL "%s" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname. + +Please consider using a custom "serviceWorker.url" option to point to the actual worker script location, or a custom "findWorker" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`, + options.serviceWorker.url, + location.host + ); + throw new Error(missingWorkerMessage); + } + context.workerPromise.resolve(worker); + context.registration = registration; + window.addEventListener("beforeunload", () => { + if (worker.state !== "redundant") { + context.workerChannel.postMessage("CLIENT_CLOSED"); + } + window.clearInterval(context.keepAliveInterval); + window.postMessage({ type: "msw/worker:stop" }); + }); + await checkWorkerIntegrity(context).catch((error22) => { + devUtils.error( + "Error while checking the worker script integrity. Please report this on GitHub (https://github.com/mswjs/msw/issues) and include the original error below." + ); + console.error(error22); + }); + context.keepAliveInterval = window.setInterval( + () => context.workerChannel.postMessage("KEEPALIVE_REQUEST"), + 5e3 + ); + validateWorkerScope(registration, context.startOptions); + return registration; + }; + const workerRegistration = startWorkerInstance().then( + async (registration) => { + const pendingInstance = registration.installing || registration.waiting; + if (pendingInstance) { + const activationPromise = new DeferredPromise2(); + pendingInstance.addEventListener("statechange", () => { + if (pendingInstance.state === "activated") { + activationPromise.resolve(); + } + }); + await activationPromise; + } + await enableMocking(context, options).catch((error22) => { + devUtils.error( + "Failed to enable mocking. Please report this on GitHub (https://github.com/mswjs/msw/issues) and include the original error below." + ); + throw error22; + }); + return registration; + } + ); + return workerRegistration; + }; +}; +var kDefaultPrevented2 = Symbol("kDefaultPrevented"); +var kPropagationStopped = Symbol("kPropagationStopped"); +var kImmediatePropagationStopped = Symbol("kImmediatePropagationStopped"); +var TypedEvent = class extends MessageEvent { + /** + * @note Keep a placeholder property with the return type + * because the type must be set somewhere in order to be + * correctly associated and inferred from the event. + */ + #returnType; + [kDefaultPrevented2]; + [kPropagationStopped]; + [kImmediatePropagationStopped]; + constructor(...args) { + super(args[0], args[1]); + this[kDefaultPrevented2] = false; + } + get defaultPrevented() { + return this[kDefaultPrevented2]; + } + preventDefault() { + super.preventDefault(); + this[kDefaultPrevented2] = true; + } + stopImmediatePropagation() { + super.stopImmediatePropagation(); + this[kImmediatePropagationStopped] = true; + } +}; +var kListenerOptions = Symbol("kListenerOptions"); +var Emitter22 = class { + #listeners; + constructor() { + this.#listeners = {}; + } + /** + * Adds a listener for the given event type. + * + * @returns {AbortController} An `AbortController` that can be used to remove the listener. + */ + on(type, listener, options) { + return this.#addListener(type, listener, options); + } + /** + * Adds a one-time listener for the given event type. + * + * @returns {AbortController} An `AbortController` that can be used to remove the listener. + */ + once(type, listener, options) { + return this.on(type, listener, { ...options || {}, once: true }); + } + /** + * Prepends a listener for the given event type. + * + * @returns {AbortController} An `AbortController` that can be used to remove the listener. + */ + earlyOn(type, listener, options) { + return this.#addListener(type, listener, options, "prepend"); + } + /** + * Prepends a one-time listener for the given event type. + */ + earlyOnce(type, listener, options) { + return this.earlyOn(type, listener, { ...options || {}, once: true }); + } + /** + * Emits the given typed event. + * + * @returns {boolean} Returns `true` if the event had any listeners, `false` otherwise. + */ + emit(event) { + if (this.listenerCount(event.type) === 0) { + return false; + } + const proxiedEvent = this.#proxyEvent(event); + for (const listener of this.#listeners[event.type]) { + if (proxiedEvent.event[kPropagationStopped] != null && proxiedEvent.event[kPropagationStopped] !== this) { + return false; + } + if (proxiedEvent.event[kImmediatePropagationStopped]) { + break; + } + this.#callListener(proxiedEvent.event, listener); + } + proxiedEvent.revoke(); + return true; + } + /** + * Emits the given typed event and returns a promise that resolves + * when all the listeners for that event have settled. + * + * @returns {Promise>} A promise that resolves + * with the return values of all listeners. + */ + async emitAsPromise(event) { + if (this.listenerCount(event.type) === 0) { + return []; + } + const pendingListeners = []; + const proxiedEvent = this.#proxyEvent(event); + for (const listener of this.#listeners[event.type]) { + if (proxiedEvent.event[kPropagationStopped] != null && proxiedEvent.event[kPropagationStopped] !== this) { + return []; + } + if (proxiedEvent.event[kImmediatePropagationStopped]) { + break; + } + pendingListeners.push( + // Awaiting individual listeners guarantees their call order. + await Promise.resolve(this.#callListener(proxiedEvent.event, listener)) + ); + } + proxiedEvent.revoke(); + return Promise.allSettled(pendingListeners).then((results) => { + return results.map( + (result) => result.status === "fulfilled" ? result.value : result.reason + ); + }); + } + /** + * Emits the given event and returns a generator that yields + * the result of each listener in the order of their registration. + * This way, you stop exhausting the listeners once you get the expected value. + */ + *emitAsGenerator(event) { + if (this.listenerCount(event.type) === 0) { + return; + } + const proxiedEvent = this.#proxyEvent(event); + for (const listener of this.#listeners[event.type]) { + if (proxiedEvent.event[kPropagationStopped] != null && proxiedEvent.event[kPropagationStopped] !== this) { + return; + } + if (proxiedEvent.event[kImmediatePropagationStopped]) { + break; + } + yield this.#callListener(proxiedEvent.event, listener); + } + proxiedEvent.revoke(); + } + /** + * Removes a listener for the given event type. + */ + removeListener(type, listener) { + if (this.listenerCount(type) === 0) { + return; + } + const nextListeners = []; + for (const existingListener of this.#listeners[type]) { + if (existingListener !== listener) { + nextListeners.push(existingListener); + } + } + this.#listeners[type] = nextListeners; + } + /** + * Removes all listeners for the given event type. + * If no event type is provided, removes all existing listeners. + */ + removeAllListeners(type) { + if (type == null) { + this.#listeners = {}; + return; + } + this.#listeners[type] = []; + } + /** + * Returns the list of listeners for the given event type. + * If no even type is provided, returns all listeners. + */ + listeners(type) { + if (type == null) { + return Object.values(this.#listeners).flat(); + } + return this.#listeners[type] || []; + } + /** + * Returns the number of listeners for the given event type. + * If no even type is provided, returns the total number of listeners. + */ + listenerCount(type) { + return this.listeners(type).length; + } + #addListener(type, listener, options, insertMode = "append") { + this.#listeners[type] ??= []; + if (insertMode === "prepend") { + this.#listeners[type].unshift(listener); + } else { + this.#listeners[type].push(listener); + } + if (options) { + Object.defineProperty(listener, kListenerOptions, { + value: options, + enumerable: false, + writable: false + }); + if (options.signal) { + options.signal.addEventListener( + "abort", + () => { + this.removeListener(type, listener); + }, + { once: true } + ); + } + } + return this; + } + #proxyEvent(event) { + const { stopPropagation } = event; + event.stopPropagation = new Proxy(event.stopPropagation, { + apply: (target, thisArg, argArray) => { + event[kPropagationStopped] = this; + return Reflect.apply(target, thisArg, argArray); + } + }); + return { + event, + revoke() { + event.stopPropagation = stopPropagation; + } + }; + } + #callListener(event, listener) { + const returnValue = listener.call(this, event); + if (listener[kListenerOptions]?.once) { + this.removeListener(event.type, listener); + } + return returnValue; + } +}; +var SUPPORTS_SERVICE_WORKER = supportsServiceWorker(); +var WorkerEvent = class extends TypedEvent { + #workerEvent; + constructor(workerEvent) { + const type = workerEvent.data.type; + const data = workerEvent.data.payload; + super( + // @ts-expect-error Troublesome `TypedEvent` extension. + type, + { data } + ); + this.#workerEvent = workerEvent; + } + get ports() { + return this.#workerEvent.ports; + } + /** + * Reply directly to this event using its `MessagePort`. + */ + postMessage(type, ...rest) { + this.#workerEvent.ports[0].postMessage( + { type, data: rest[0] }, + { transfer: rest[1] } + ); + } +}; +var WorkerChannel = class extends Emitter22 { + constructor(options) { + super(); + this.options = options; + if (!SUPPORTS_SERVICE_WORKER) { + return; + } + navigator.serviceWorker.addEventListener("message", async (event) => { + const worker = await this.options.worker; + if (event.source != null && event.source !== worker) { + return; + } + if (event.data && isObject(event.data) && "type" in event.data) { + this.emit(new WorkerEvent(event)); + } + }); + } + /** + * Send data to the Service Worker controlling this client. + * This triggers the `message` event listener on ServiceWorkerGlobalScope. + */ + postMessage(type) { + invariant2( + SUPPORTS_SERVICE_WORKER, + "Failed to post message on a WorkerChannel: the Service Worker API is unavailable in this context. This is likely an issue with MSW. Please report it on GitHub: https://github.com/mswjs/msw/issues" + ); + this.options.worker.then((worker) => { + worker.postMessage(type); + }); + } +}; +async function emitAsync2(emitter, eventName, ...data) { + const listeners = emitter.listeners(eventName); + if (listeners.length === 0) { + return; + } + for (const listener of listeners) { + await listener.apply(emitter, data); + } +} +function hasConfigurableGlobal2(propertyName) { + const descriptor = Object.getOwnPropertyDescriptor(globalThis, propertyName); + if (typeof descriptor === "undefined") { + return false; + } + if (typeof descriptor.get === "function" && typeof descriptor.get() === "undefined") { + return false; + } + if (typeof descriptor.get === "undefined" && descriptor.value == null) { + return false; + } + if (typeof descriptor.set === "undefined" && !descriptor.configurable) { + console.error( + `[MSW] Failed to apply interceptor: the global \`${propertyName}\` property is non-configurable. This is likely an issue with your environment. If you are using a framework, please open an issue about this in their repository.` + ); + return false; + } + return true; +} +var until22 = async (promise) => { + try { + const data = await promise().catch((error22) => { + throw error22; + }); + return { error: null, data }; + } catch (error22) { + return { error: error22, data: null }; + } +}; +function isObject22(value, loose = false) { + return loose ? Object.prototype.toString.call(value).startsWith("[object ") : Object.prototype.toString.call(value) === "[object Object]"; +} +function isPropertyAccessible(obj, key) { + try { + obj[key]; + return true; + } catch (e) { + return false; + } +} +function createServerErrorResponse(body) { + return new Response( + JSON.stringify( + body instanceof Error ? { + name: body.name, + message: body.message, + stack: body.stack + } : body + ), + { + status: 500, + statusText: "Unhandled Exception", + headers: { + "Content-Type": "application/json" + } + } + ); +} +function isResponseError(response) { + return response != null && response instanceof Response && isPropertyAccessible(response, "type") && response.type === "error"; +} +function isResponseLike(value) { + return isObject22(value, true) && isPropertyAccessible(value, "status") && isPropertyAccessible(value, "statusText") && isPropertyAccessible(value, "bodyUsed"); +} +function isNodeLikeError(error22) { + if (error22 == null) { + return false; + } + if (!(error22 instanceof Error)) { + return false; + } + return "code" in error22 && "errno" in error22; +} +async function handleRequest2(options) { + const handleResponse = async (response) => { + if (response instanceof Error) { + await options.controller.errorWith(response); + return true; + } + if (isResponseError(response)) { + await options.controller.respondWith(response); + return true; + } + if (isResponseLike(response)) { + await options.controller.respondWith(response); + return true; + } + if (isObject22(response)) { + await options.controller.errorWith(response); + return true; + } + return false; + }; + const handleResponseError = async (error22) => { + if (error22 instanceof InterceptorError) { + throw result.error; + } + if (isNodeLikeError(error22)) { + await options.controller.errorWith(error22); + return true; + } + if (error22 instanceof Response) { + return await handleResponse(error22); + } + return false; + }; + const requestAbortPromise = new DeferredPromise2(); + if (options.request.signal) { + if (options.request.signal.aborted) { + await options.controller.errorWith(options.request.signal.reason); + return; + } + options.request.signal.addEventListener( + "abort", + () => { + requestAbortPromise.reject(options.request.signal.reason); + }, + { once: true } + ); + } + const result = await until22(async () => { + const requestListenersPromise = emitAsync2(options.emitter, "request", { + requestId: options.requestId, + request: options.request, + controller: options.controller + }); + await Promise.race([ + // Short-circuit the request handling promise if the request gets aborted. + requestAbortPromise, + requestListenersPromise, + options.controller.handled + ]); + }); + if (requestAbortPromise.state === "rejected") { + await options.controller.errorWith(requestAbortPromise.rejectionReason); + return; + } + if (result.error) { + if (await handleResponseError(result.error)) { + return; + } + if (options.emitter.listenerCount("unhandledException") > 0) { + const unhandledExceptionController = new RequestController( + options.request, + { + /** + * @note Intentionally empty passthrough handle. + * This controller is created within another controller and we only need + * to know if `unhandledException` listeners handled the request. + */ + passthrough() { + }, + async respondWith(response) { + await handleResponse(response); + }, + async errorWith(reason) { + await options.controller.errorWith(reason); + } + } + ); + await emitAsync2(options.emitter, "unhandledException", { + error: result.error, + request: options.request, + requestId: options.requestId, + controller: unhandledExceptionController + }); + if (unhandledExceptionController.readyState !== RequestController.PENDING) { + return; + } + } + await options.controller.respondWith( + createServerErrorResponse(result.error) + ); + return; + } + if (options.controller.readyState === RequestController.PENDING) { + return await options.controller.passthrough(); + } + return options.controller.handled; +} +function createNetworkError(cause) { + return Object.assign(new TypeError("Failed to fetch"), { + cause + }); +} +var REQUEST_BODY_HEADERS = [ + "content-encoding", + "content-language", + "content-location", + "content-type", + "content-length" +]; +var kRedirectCount = Symbol("kRedirectCount"); +async function followFetchRedirect(request, response) { + if (response.status !== 303 && request.body != null) { + return Promise.reject(createNetworkError()); + } + const requestUrl = new URL(request.url); + let locationUrl; + try { + locationUrl = new URL(response.headers.get("location"), request.url); + } catch (error22) { + return Promise.reject(createNetworkError(error22)); + } + if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) { + return Promise.reject( + createNetworkError("URL scheme must be a HTTP(S) scheme") + ); + } + if (Reflect.get(request, kRedirectCount) > 20) { + return Promise.reject(createNetworkError("redirect count exceeded")); + } + Object.defineProperty(request, kRedirectCount, { + value: (Reflect.get(request, kRedirectCount) || 0) + 1 + }); + if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) { + return Promise.reject( + createNetworkError('cross origin not allowed for request mode "cors"') + ); + } + const requestInit = {}; + if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) { + requestInit.method = "GET"; + requestInit.body = null; + REQUEST_BODY_HEADERS.forEach((headerName) => { + request.headers.delete(headerName); + }); + } + if (!sameOrigin(requestUrl, locationUrl)) { + request.headers.delete("authorization"); + request.headers.delete("proxy-authorization"); + request.headers.delete("cookie"); + request.headers.delete("host"); + } + requestInit.headers = request.headers; + const finalResponse = await fetch(new Request(locationUrl, requestInit)); + Object.defineProperty(finalResponse, "redirected", { + value: true, + configurable: true + }); + return finalResponse; +} +function sameOrigin(left, right) { + if (left.origin === right.origin && left.origin === "null") { + return true; + } + if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) { + return true; + } + return false; +} +var BrotliDecompressionStream = class extends TransformStream { + constructor() { + console.warn( + "[Interceptors]: Brotli decompression of response streams is not supported in the browser" + ); + super({ + transform(chunk, controller) { + controller.enqueue(chunk); + } + }); + } +}; +var PipelineStream = class extends TransformStream { + constructor(transformStreams, ...strategies) { + super({}, ...strategies); + const readable = [super.readable, ...transformStreams].reduce( + (readable2, transform) => readable2.pipeThrough(transform) + ); + Object.defineProperty(this, "readable", { + get() { + return readable; + } + }); + } +}; +function parseContentEncoding(contentEncoding) { + return contentEncoding.toLowerCase().split(",").map((coding) => coding.trim()); +} +function createDecompressionStream(contentEncoding) { + if (contentEncoding === "") { + return null; + } + const codings = parseContentEncoding(contentEncoding); + if (codings.length === 0) { + return null; + } + const transformers = codings.reduceRight( + (transformers2, coding) => { + if (coding === "gzip" || coding === "x-gzip") { + return transformers2.concat(new DecompressionStream("gzip")); + } else if (coding === "deflate") { + return transformers2.concat(new DecompressionStream("deflate")); + } else if (coding === "br") { + return transformers2.concat(new BrotliDecompressionStream()); + } else { + transformers2.length = 0; + } + return transformers2; + }, + [] + ); + return new PipelineStream(transformers); +} +function decompressResponse(response) { + if (response.body === null) { + return null; + } + const decompressionStream = createDecompressionStream( + response.headers.get("content-encoding") || "" + ); + if (!decompressionStream) { + return null; + } + response.body.pipeTo(decompressionStream.writable); + return decompressionStream.readable; +} +var _FetchInterceptor = class extends Interceptor2 { + constructor() { + super(_FetchInterceptor.symbol); + } + checkEnvironment() { + return hasConfigurableGlobal2("fetch"); + } + async setup() { + const pureFetch = globalThis.fetch; + invariant2( + !pureFetch[IS_PATCHED_MODULE], + 'Failed to patch the "fetch" module: already patched.' + ); + globalThis.fetch = async (input, init) => { + const requestId = createRequestId2(); + const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.href) : input; + const request = new Request(resolvedInput, init); + if (input instanceof Request) { + setRawRequest(request, input); + } + const responsePromise = new DeferredPromise2(); + const controller = new RequestController(request, { + passthrough: async () => { + this.logger.info("request has not been handled, passthrough..."); + const requestCloneForResponseEvent = request.clone(); + const { error: responseError, data: originalResponse } = await until22( + () => pureFetch(request) + ); + if (responseError) { + return responsePromise.reject(responseError); + } + this.logger.info("original fetch performed", originalResponse); + if (this.emitter.listenerCount("response") > 0) { + this.logger.info('emitting the "response" event...'); + const responseClone = originalResponse.clone(); + await emitAsync2(this.emitter, "response", { + response: responseClone, + isMockedResponse: false, + request: requestCloneForResponseEvent, + requestId + }); + } + responsePromise.resolve(originalResponse); + }, + respondWith: async (rawResponse) => { + if (isResponseError(rawResponse)) { + this.logger.info("request has errored!", { response: rawResponse }); + responsePromise.reject(createNetworkError(rawResponse)); + return; + } + this.logger.info("received mocked response!", { + rawResponse + }); + const decompressedStream = decompressResponse(rawResponse); + const response = decompressedStream === null ? rawResponse : new FetchResponse(decompressedStream, rawResponse); + FetchResponse.setUrl(request.url, response); + if (FetchResponse.isRedirectResponse(response.status)) { + if (request.redirect === "error") { + responsePromise.reject(createNetworkError("unexpected redirect")); + return; + } + if (request.redirect === "follow") { + followFetchRedirect(request, response).then( + (response2) => { + responsePromise.resolve(response2); + }, + (reason) => { + responsePromise.reject(reason); + } + ); + return; + } + } + if (this.emitter.listenerCount("response") > 0) { + this.logger.info('emitting the "response" event...'); + await emitAsync2(this.emitter, "response", { + // Clone the mocked response for the "response" event listener. + // This way, the listener can read the response and not lock its body + // for the actual fetch consumer. + response: response.clone(), + isMockedResponse: true, + request, + requestId + }); + } + responsePromise.resolve(response); + }, + errorWith: (reason) => { + this.logger.info("request has been aborted!", { reason }); + responsePromise.reject(reason); + } + }); + this.logger.info("[%s] %s", request.method, request.url); + this.logger.info("awaiting for the mocked response..."); + this.logger.info( + 'emitting the "request" event for %s listener(s)...', + this.emitter.listenerCount("request") + ); + await handleRequest2({ + request, + requestId, + emitter: this.emitter, + controller + }); + return responsePromise; + }; + Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, { + enumerable: true, + configurable: true, + value: true + }); + this.subscriptions.push(() => { + Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, { + value: void 0 + }); + globalThis.fetch = pureFetch; + this.logger.info( + 'restored native "globalThis.fetch"!', + globalThis.fetch.name + ); + }); + } +}; +var FetchInterceptor = _FetchInterceptor; +FetchInterceptor.symbol = Symbol("fetch"); +function concatArrayBuffer(left, right) { + const result = new Uint8Array(left.byteLength + right.byteLength); + result.set(left, 0); + result.set(right, left.byteLength); + return result; +} +var EventPolyfill = class { + constructor(type, options) { + this.NONE = 0; + this.CAPTURING_PHASE = 1; + this.AT_TARGET = 2; + this.BUBBLING_PHASE = 3; + this.type = ""; + this.srcElement = null; + this.currentTarget = null; + this.eventPhase = 0; + this.isTrusted = true; + this.composed = false; + this.cancelable = true; + this.defaultPrevented = false; + this.bubbles = true; + this.lengthComputable = true; + this.loaded = 0; + this.total = 0; + this.cancelBubble = false; + this.returnValue = true; + this.type = type; + this.target = (options == null ? void 0 : options.target) || null; + this.currentTarget = (options == null ? void 0 : options.currentTarget) || null; + this.timeStamp = Date.now(); + } + composedPath() { + return []; + } + initEvent(type, bubbles, cancelable) { + this.type = type; + this.bubbles = !!bubbles; + this.cancelable = !!cancelable; + } + preventDefault() { + this.defaultPrevented = true; + } + stopPropagation() { + } + stopImmediatePropagation() { + } +}; +var ProgressEventPolyfill = class extends EventPolyfill { + constructor(type, init) { + super(type); + this.lengthComputable = (init == null ? void 0 : init.lengthComputable) || false; + this.composed = (init == null ? void 0 : init.composed) || false; + this.loaded = (init == null ? void 0 : init.loaded) || 0; + this.total = (init == null ? void 0 : init.total) || 0; + } +}; +var SUPPORTS_PROGRESS_EVENT = typeof ProgressEvent !== "undefined"; +function createEvent(target, type, init) { + const progressEvents = [ + "error", + "progress", + "loadstart", + "loadend", + "load", + "timeout", + "abort" + ]; + const ProgressEventClass = SUPPORTS_PROGRESS_EVENT ? ProgressEvent : ProgressEventPolyfill; + const event = progressEvents.includes(type) ? new ProgressEventClass(type, { + lengthComputable: true, + loaded: (init == null ? void 0 : init.loaded) || 0, + total: (init == null ? void 0 : init.total) || 0 + }) : new EventPolyfill(type, { + target, + currentTarget: target + }); + return event; +} +function findPropertySource(target, propertyName) { + if (!(propertyName in target)) { + return null; + } + const hasProperty = Object.prototype.hasOwnProperty.call(target, propertyName); + if (hasProperty) { + return target; + } + const prototype = Reflect.getPrototypeOf(target); + return prototype ? findPropertySource(prototype, propertyName) : null; +} +function createProxy(target, options) { + const proxy = new Proxy(target, optionsToProxyHandler(options)); + return proxy; +} +function optionsToProxyHandler(options) { + const { constructorCall, methodCall, getProperty, setProperty } = options; + const handler = {}; + if (typeof constructorCall !== "undefined") { + handler.construct = function(target, args, newTarget) { + const next = Reflect.construct.bind(null, target, args, newTarget); + return constructorCall.call(newTarget, args, next); + }; + } + handler.set = function(target, propertyName, nextValue) { + const next = () => { + const propertySource = findPropertySource(target, propertyName) || target; + const ownDescriptors = Reflect.getOwnPropertyDescriptor( + propertySource, + propertyName + ); + if (typeof (ownDescriptors == null ? void 0 : ownDescriptors.set) !== "undefined") { + ownDescriptors.set.apply(target, [nextValue]); + return true; + } + return Reflect.defineProperty(propertySource, propertyName, { + writable: true, + enumerable: true, + configurable: true, + value: nextValue + }); + }; + if (typeof setProperty !== "undefined") { + return setProperty.call(target, [propertyName, nextValue], next); + } + return next(); + }; + handler.get = function(target, propertyName, receiver) { + const next = () => target[propertyName]; + const value = typeof getProperty !== "undefined" ? getProperty.call(target, [propertyName, receiver], next) : next(); + if (typeof value === "function") { + return (...args) => { + const next2 = value.bind(target, ...args); + if (typeof methodCall !== "undefined") { + return methodCall.call(target, [propertyName, args], next2); + } + return next2(); + }; + } + return value; + }; + return handler; +} +function isDomParserSupportedType(type) { + const supportedTypes = [ + "application/xhtml+xml", + "application/xml", + "image/svg+xml", + "text/html", + "text/xml" + ]; + return supportedTypes.some((supportedType) => { + return type.startsWith(supportedType); + }); +} +function parseJson(data) { + try { + const json = JSON.parse(data); + return json; + } catch (_) { + return null; + } +} +function createResponse(request, body) { + const responseBodyOrNull = FetchResponse.isResponseWithBody(request.status) ? body : null; + return new FetchResponse(responseBodyOrNull, { + url: request.responseURL, + status: request.status, + statusText: request.statusText, + headers: createHeadersFromXMLHttpRequestHeaders( + request.getAllResponseHeaders() + ) + }); +} +function createHeadersFromXMLHttpRequestHeaders(headersString) { + const headers = new Headers(); + const lines = headersString.split(/[\r\n]+/); + for (const line of lines) { + if (line.trim() === "") { + continue; + } + const [name, ...parts] = line.split(": "); + const value = parts.join(": "); + headers.append(name, value); + } + return headers; +} +async function getBodyByteLength(input) { + const explicitContentLength = input.headers.get("content-length"); + if (explicitContentLength != null && explicitContentLength !== "") { + return Number(explicitContentLength); + } + const buffer = await input.arrayBuffer(); + return buffer.byteLength; +} +var kIsRequestHandled = Symbol("kIsRequestHandled"); +var IS_NODE22 = isNodeProcess2(); +var kFetchRequest = Symbol("kFetchRequest"); +var XMLHttpRequestController = class { + constructor(initialRequest, logger) { + this.initialRequest = initialRequest; + this.logger = logger; + this.method = "GET"; + this.url = null; + this[kIsRequestHandled] = false; + this.events = /* @__PURE__ */ new Map(); + this.uploadEvents = /* @__PURE__ */ new Map(); + this.requestId = createRequestId2(); + this.requestHeaders = new Headers(); + this.responseBuffer = new Uint8Array(); + this.request = createProxy(initialRequest, { + setProperty: ([propertyName, nextValue], invoke) => { + switch (propertyName) { + case "ontimeout": { + const eventName = propertyName.slice( + 2 + ); + this.request.addEventListener(eventName, nextValue); + return invoke(); + } + default: { + return invoke(); + } + } + }, + methodCall: ([methodName, args], invoke) => { + switch (methodName) { + case "open": { + const [method, url] = args; + if (typeof url === "undefined") { + this.method = "GET"; + this.url = toAbsoluteUrl(method); + } else { + this.method = method; + this.url = toAbsoluteUrl(url); + } + this.logger = this.logger.extend(`${this.method} ${this.url.href}`); + this.logger.info("open", this.method, this.url.href); + return invoke(); + } + case "addEventListener": { + const [eventName, listener] = args; + this.registerEvent(eventName, listener); + this.logger.info("addEventListener", eventName, listener); + return invoke(); + } + case "setRequestHeader": { + const [name, value] = args; + this.requestHeaders.set(name, value); + this.logger.info("setRequestHeader", name, value); + return invoke(); + } + case "send": { + const [body] = args; + this.request.addEventListener("load", () => { + if (typeof this.onResponse !== "undefined") { + const fetchResponse = createResponse( + this.request, + /** + * The `response` property is the right way to read + * the ambiguous response body, as the request's "responseType" may differ. + * @see https://xhr.spec.whatwg.org/#the-response-attribute + */ + this.request.response + ); + this.onResponse.call(this, { + response: fetchResponse, + isMockedResponse: this[kIsRequestHandled], + request: fetchRequest, + requestId: this.requestId + }); + } + }); + const requestBody = typeof body === "string" ? encodeBuffer(body) : body; + const fetchRequest = this.toFetchApiRequest(requestBody); + this[kFetchRequest] = fetchRequest.clone(); + queueMicrotask(() => { + var _a2; + const onceRequestSettled = ((_a2 = this.onRequest) == null ? void 0 : _a2.call(this, { + request: fetchRequest, + requestId: this.requestId + })) || Promise.resolve(); + onceRequestSettled.finally(() => { + if (!this[kIsRequestHandled]) { + this.logger.info( + "request callback settled but request has not been handled (readystate %d), performing as-is...", + this.request.readyState + ); + if (IS_NODE22) { + this.request.setRequestHeader( + INTERNAL_REQUEST_ID_HEADER_NAME, + this.requestId + ); + } + return invoke(); + } + }); + }); + break; + } + default: { + return invoke(); + } + } + } + }); + define( + this.request, + "upload", + createProxy(this.request.upload, { + setProperty: ([propertyName, nextValue], invoke) => { + switch (propertyName) { + case "onloadstart": + case "onprogress": + case "onaboart": + case "onerror": + case "onload": + case "ontimeout": + case "onloadend": { + const eventName = propertyName.slice( + 2 + ); + this.registerUploadEvent(eventName, nextValue); + } + } + return invoke(); + }, + methodCall: ([methodName, args], invoke) => { + switch (methodName) { + case "addEventListener": { + const [eventName, listener] = args; + this.registerUploadEvent(eventName, listener); + this.logger.info("upload.addEventListener", eventName, listener); + return invoke(); + } + } + } + }) + ); + } + registerEvent(eventName, listener) { + const prevEvents = this.events.get(eventName) || []; + const nextEvents = prevEvents.concat(listener); + this.events.set(eventName, nextEvents); + this.logger.info('registered event "%s"', eventName, listener); + } + registerUploadEvent(eventName, listener) { + const prevEvents = this.uploadEvents.get(eventName) || []; + const nextEvents = prevEvents.concat(listener); + this.uploadEvents.set(eventName, nextEvents); + this.logger.info('registered upload event "%s"', eventName, listener); + } + /** + * Responds to the current request with the given + * Fetch API `Response` instance. + */ + async respondWith(response) { + this[kIsRequestHandled] = true; + if (this[kFetchRequest]) { + const totalRequestBodyLength = await getBodyByteLength( + this[kFetchRequest] + ); + this.trigger("loadstart", this.request.upload, { + loaded: 0, + total: totalRequestBodyLength + }); + this.trigger("progress", this.request.upload, { + loaded: totalRequestBodyLength, + total: totalRequestBodyLength + }); + this.trigger("load", this.request.upload, { + loaded: totalRequestBodyLength, + total: totalRequestBodyLength + }); + this.trigger("loadend", this.request.upload, { + loaded: totalRequestBodyLength, + total: totalRequestBodyLength + }); + } + this.logger.info( + "responding with a mocked response: %d %s", + response.status, + response.statusText + ); + define(this.request, "status", response.status); + define(this.request, "statusText", response.statusText); + define(this.request, "responseURL", this.url.href); + this.request.getResponseHeader = new Proxy(this.request.getResponseHeader, { + apply: (_, __, args) => { + this.logger.info("getResponseHeader", args[0]); + if (this.request.readyState < this.request.HEADERS_RECEIVED) { + this.logger.info("headers not received yet, returning null"); + return null; + } + const headerValue = response.headers.get(args[0]); + this.logger.info( + 'resolved response header "%s" to', + args[0], + headerValue + ); + return headerValue; + } + }); + this.request.getAllResponseHeaders = new Proxy( + this.request.getAllResponseHeaders, + { + apply: () => { + this.logger.info("getAllResponseHeaders"); + if (this.request.readyState < this.request.HEADERS_RECEIVED) { + this.logger.info("headers not received yet, returning empty string"); + return ""; + } + const headersList = Array.from(response.headers.entries()); + const allHeaders = headersList.map(([headerName, headerValue]) => { + return `${headerName}: ${headerValue}`; + }).join("\r\n"); + this.logger.info("resolved all response headers to", allHeaders); + return allHeaders; + } + } + ); + Object.defineProperties(this.request, { + response: { + enumerable: true, + configurable: false, + get: () => this.response + }, + responseText: { + enumerable: true, + configurable: false, + get: () => this.responseText + }, + responseXML: { + enumerable: true, + configurable: false, + get: () => this.responseXML + } + }); + const totalResponseBodyLength = await getBodyByteLength(response.clone()); + this.logger.info("calculated response body length", totalResponseBodyLength); + this.trigger("loadstart", this.request, { + loaded: 0, + total: totalResponseBodyLength + }); + this.setReadyState(this.request.HEADERS_RECEIVED); + this.setReadyState(this.request.LOADING); + const finalizeResponse = () => { + this.logger.info("finalizing the mocked response..."); + this.setReadyState(this.request.DONE); + this.trigger("load", this.request, { + loaded: this.responseBuffer.byteLength, + total: totalResponseBodyLength + }); + this.trigger("loadend", this.request, { + loaded: this.responseBuffer.byteLength, + total: totalResponseBodyLength + }); + }; + if (response.body) { + this.logger.info("mocked response has body, streaming..."); + const reader = response.body.getReader(); + const readNextResponseBodyChunk = async () => { + const { value, done } = await reader.read(); + if (done) { + this.logger.info("response body stream done!"); + finalizeResponse(); + return; + } + if (value) { + this.logger.info("read response body chunk:", value); + this.responseBuffer = concatArrayBuffer(this.responseBuffer, value); + this.trigger("progress", this.request, { + loaded: this.responseBuffer.byteLength, + total: totalResponseBodyLength + }); + } + readNextResponseBodyChunk(); + }; + readNextResponseBodyChunk(); + } else { + finalizeResponse(); + } + } + responseBufferToText() { + return decodeBuffer(this.responseBuffer); + } + get response() { + this.logger.info( + "getResponse (responseType: %s)", + this.request.responseType + ); + if (this.request.readyState !== this.request.DONE) { + return null; + } + switch (this.request.responseType) { + case "json": { + const responseJson = parseJson(this.responseBufferToText()); + this.logger.info("resolved response JSON", responseJson); + return responseJson; + } + case "arraybuffer": { + const arrayBuffer = toArrayBuffer(this.responseBuffer); + this.logger.info("resolved response ArrayBuffer", arrayBuffer); + return arrayBuffer; + } + case "blob": { + const mimeType = this.request.getResponseHeader("Content-Type") || "text/plain"; + const responseBlob = new Blob([this.responseBufferToText()], { + type: mimeType + }); + this.logger.info( + "resolved response Blob (mime type: %s)", + responseBlob, + mimeType + ); + return responseBlob; + } + default: { + const responseText = this.responseBufferToText(); + this.logger.info( + 'resolving "%s" response type as text', + this.request.responseType, + responseText + ); + return responseText; + } + } + } + get responseText() { + invariant2( + this.request.responseType === "" || this.request.responseType === "text", + "InvalidStateError: The object is in invalid state." + ); + if (this.request.readyState !== this.request.LOADING && this.request.readyState !== this.request.DONE) { + return ""; + } + const responseText = this.responseBufferToText(); + this.logger.info('getResponseText: "%s"', responseText); + return responseText; + } + get responseXML() { + invariant2( + this.request.responseType === "" || this.request.responseType === "document", + "InvalidStateError: The object is in invalid state." + ); + if (this.request.readyState !== this.request.DONE) { + return null; + } + const contentType = this.request.getResponseHeader("Content-Type") || ""; + if (typeof DOMParser === "undefined") { + console.warn( + "Cannot retrieve XMLHttpRequest response body as XML: DOMParser is not defined. You are likely using an environment that is not browser or does not polyfill browser globals correctly." + ); + return null; + } + if (isDomParserSupportedType(contentType)) { + return new DOMParser().parseFromString( + this.responseBufferToText(), + contentType + ); + } + return null; + } + errorWith(error22) { + this[kIsRequestHandled] = true; + this.logger.info("responding with an error"); + this.setReadyState(this.request.DONE); + this.trigger("error", this.request); + this.trigger("loadend", this.request); + } + /** + * Transitions this request's `readyState` to the given one. + */ + setReadyState(nextReadyState) { + this.logger.info( + "setReadyState: %d -> %d", + this.request.readyState, + nextReadyState + ); + if (this.request.readyState === nextReadyState) { + this.logger.info("ready state identical, skipping transition..."); + return; + } + define(this.request, "readyState", nextReadyState); + this.logger.info("set readyState to: %d", nextReadyState); + if (nextReadyState !== this.request.UNSENT) { + this.logger.info('triggering "readystatechange" event...'); + this.trigger("readystatechange", this.request); + } + } + /** + * Triggers given event on the `XMLHttpRequest` instance. + */ + trigger(eventName, target, options) { + const callback = target[`on${eventName}`]; + const event = createEvent(target, eventName, options); + this.logger.info('trigger "%s"', eventName, options || ""); + if (typeof callback === "function") { + this.logger.info('found a direct "%s" callback, calling...', eventName); + callback.call(target, event); + } + const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events; + for (const [registeredEventName, listeners] of events) { + if (registeredEventName === eventName) { + this.logger.info( + 'found %d listener(s) for "%s" event, calling...', + listeners.length, + eventName + ); + listeners.forEach((listener) => listener.call(target, event)); + } + } + } + /** + * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance. + */ + toFetchApiRequest(body) { + this.logger.info("converting request to a Fetch API Request..."); + const resolvedBody = body instanceof Document ? body.documentElement.innerText : body; + const fetchRequest = new Request(this.url.href, { + method: this.method, + headers: this.requestHeaders, + /** + * @see https://xhr.spec.whatwg.org/#cross-origin-credentials + */ + credentials: this.request.withCredentials ? "include" : "same-origin", + body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody + }); + const proxyHeaders = createProxy(fetchRequest.headers, { + methodCall: ([methodName, args], invoke) => { + switch (methodName) { + case "append": + case "set": { + const [headerName, headerValue] = args; + this.request.setRequestHeader(headerName, headerValue); + break; + } + case "delete": { + const [headerName] = args; + console.warn( + `XMLHttpRequest: Cannot remove a "${headerName}" header from the Fetch API representation of the "${fetchRequest.method} ${fetchRequest.url}" request. XMLHttpRequest headers cannot be removed.` + ); + break; + } + } + return invoke(); + } + }); + define(fetchRequest, "headers", proxyHeaders); + setRawRequest(fetchRequest, this.request); + this.logger.info("converted request to a Fetch API Request!", fetchRequest); + return fetchRequest; + } +}; +function toAbsoluteUrl(url) { + if (typeof location === "undefined") { + return new URL(url); + } + return new URL(url.toString(), location.href); +} +function define(target, property, value) { + Reflect.defineProperty(target, property, { + // Ensure writable properties to allow redefining readonly properties. + writable: true, + enumerable: true, + value + }); +} +function createXMLHttpRequestProxy({ + emitter, + logger +}) { + const XMLHttpRequestProxy = new Proxy(globalThis.XMLHttpRequest, { + construct(target, args, newTarget) { + logger.info("constructed new XMLHttpRequest"); + const originalRequest = Reflect.construct( + target, + args, + newTarget + ); + const prototypeDescriptors = Object.getOwnPropertyDescriptors( + target.prototype + ); + for (const propertyName in prototypeDescriptors) { + Reflect.defineProperty( + originalRequest, + propertyName, + prototypeDescriptors[propertyName] + ); + } + const xhrRequestController = new XMLHttpRequestController( + originalRequest, + logger + ); + xhrRequestController.onRequest = async function({ request, requestId }) { + const controller = new RequestController(request, { + passthrough: () => { + this.logger.info( + "no mocked response received, performing request as-is..." + ); + }, + respondWith: async (response) => { + if (isResponseError(response)) { + this.errorWith(new TypeError("Network error")); + return; + } + await this.respondWith(response); + }, + errorWith: (reason) => { + this.logger.info("request errored!", { error: reason }); + if (reason instanceof Error) { + this.errorWith(reason); + } + } + }); + this.logger.info("awaiting mocked response..."); + this.logger.info( + 'emitting the "request" event for %s listener(s)...', + emitter.listenerCount("request") + ); + await handleRequest2({ + request, + requestId, + controller, + emitter + }); + }; + xhrRequestController.onResponse = async function({ + response, + isMockedResponse, + request, + requestId + }) { + this.logger.info( + 'emitting the "response" event for %s listener(s)...', + emitter.listenerCount("response") + ); + emitter.emit("response", { + response, + isMockedResponse, + request, + requestId + }); + }; + return xhrRequestController.request; + } + }); + return XMLHttpRequestProxy; +} +var _XMLHttpRequestInterceptor = class extends Interceptor2 { + constructor() { + super(_XMLHttpRequestInterceptor.interceptorSymbol); + } + checkEnvironment() { + return hasConfigurableGlobal2("XMLHttpRequest"); + } + setup() { + const logger = this.logger.extend("setup"); + logger.info('patching "XMLHttpRequest" module...'); + const PureXMLHttpRequest = globalThis.XMLHttpRequest; + invariant2( + !PureXMLHttpRequest[IS_PATCHED_MODULE], + 'Failed to patch the "XMLHttpRequest" module: already patched.' + ); + globalThis.XMLHttpRequest = createXMLHttpRequestProxy({ + emitter: this.emitter, + logger: this.logger + }); + logger.info( + 'native "XMLHttpRequest" module patched!', + globalThis.XMLHttpRequest.name + ); + Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, { + enumerable: true, + configurable: true, + value: true + }); + this.subscriptions.push(() => { + Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, { + value: void 0 + }); + globalThis.XMLHttpRequest = PureXMLHttpRequest; + logger.info( + 'native "XMLHttpRequest" module restored!', + globalThis.XMLHttpRequest.name + ); + }); + } +}; +var XMLHttpRequestInterceptor = _XMLHttpRequestInterceptor; +XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr"); +function createFallbackRequestListener(context, options) { + const interceptor = new BatchInterceptor({ + name: "fallback", + interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()] + }); + interceptor.on("request", async ({ request, requestId, controller }) => { + const requestCloneForLogs = request.clone(); + const response = await handleRequest( + request, + requestId, + context.getRequestHandlers().filter(isHandlerKind("RequestHandler")), + options, + context.emitter, + { + onMockedResponse(_, { handler, parsedResult }) { + if (!options.quiet) { + context.emitter.once("response:mocked", ({ response: response2 }) => { + handler.log({ + request: requestCloneForLogs, + response: response2, + parsedResult + }); + }); + } + } + } + ); + if (response) { + controller.respondWith(response); + } + }); + interceptor.on( + "response", + ({ response, isMockedResponse, request, requestId }) => { + context.emitter.emit( + isMockedResponse ? "response:mocked" : "response:bypass", + { + response, + request, + requestId + } + ); + } + ); + interceptor.apply(); + return interceptor; +} +function printStopMessage(args = {}) { + if (args.quiet) { + return; + } + console.log( + `%c${devUtils.formatMessage("Mocking disabled.")}`, + "color:orangered;font-weight:bold;" + ); +} +var SetupWorkerApi = class extends SetupApi { + context; + constructor(...handlers) { + super(...handlers); + invariant2( + !isNodeProcess2(), + devUtils.formatMessage( + "Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead." + ) + ); + this.context = this.createWorkerContext(); + } + createWorkerContext() { + const workerPromise = new DeferredPromise2(); + return { + // Mocking is not considered enabled until the worker + // signals back the successful activation event. + isMockingEnabled: false, + startOptions: null, + workerPromise, + registration: void 0, + getRequestHandlers: () => { + return this.handlersController.currentHandlers(); + }, + emitter: this.emitter, + workerChannel: new WorkerChannel({ + worker: workerPromise + }) + }; + } + async start(options = {}) { + if ("waitUntilReady" in options) { + devUtils.warn( + 'The "waitUntilReady" option has been deprecated. Please remove it from this "worker.start()" call. Follow the recommended Browser integration (https://mswjs.io/docs/integrations/browser) to eliminate any race conditions between the Service Worker registration and any requests made by your application on initial render.' + ); + } + if (this.context.isMockingEnabled) { + devUtils.warn( + `Found a redundant "worker.start()" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this "worker.start()" call.` + ); + return this.context.registration; + } + this.context.workerStoppedAt = void 0; + this.context.startOptions = mergeRight( + DEFAULT_START_OPTIONS, + options + ); + handleWebSocketEvent({ + getUnhandledRequestStrategy: () => { + return this.context.startOptions.onUnhandledRequest; + }, + getHandlers: () => { + return this.handlersController.currentHandlers(); + }, + onMockedConnection: (connection) => { + if (!this.context.startOptions.quiet) { + attachWebSocketLogger(connection); + } + }, + onPassthroughConnection() { + } + }); + webSocketInterceptor.apply(); + this.subscriptions.push(() => { + webSocketInterceptor.dispose(); + }); + if (!supportsServiceWorker()) { + const fallbackInterceptor = createFallbackRequestListener( + this.context, + this.context.startOptions + ); + this.subscriptions.push(() => { + fallbackInterceptor.dispose(); + }); + this.context.isMockingEnabled = true; + printStartMessage({ + message: "Mocking enabled (fallback mode).", + quiet: this.context.startOptions.quiet + }); + return void 0; + } + const startHandler = createStartHandler(this.context); + const registration = await startHandler(this.context.startOptions, options); + this.context.isMockingEnabled = true; + return registration; + } + stop() { + super.dispose(); + if (!this.context.isMockingEnabled) { + devUtils.warn( + 'Found a redundant "worker.stop()" call. Notice that stopping the worker after it has already been stopped has no effect. Consider removing this "worker.stop()" call.' + ); + return; + } + this.context.isMockingEnabled = false; + this.context.workerStoppedAt = Date.now(); + this.context.emitter.removeAllListeners(); + if (supportsServiceWorker()) { + this.context.workerChannel.removeAllListeners("RESPONSE"); + window.clearInterval(this.context.keepAliveInterval); + } + window.postMessage({ type: "msw/worker:stop" }); + printStopMessage({ + quiet: this.context.startOptions?.quiet + }); + } +}; +function setupWorker(...handlers) { + return new SetupWorkerApi(...handlers); +} + +// node_modules/msw/lib/core/utils/internal/checkGlobals.mjs +function checkGlobals() { + invariant( + typeof URL !== "undefined", + devUtils.formatMessage( + `Global "URL" class is not defined. This likely means that you're running MSW in an environment that doesn't support all Node.js standard API (e.g. React Native). If that's the case, please use an appropriate polyfill for the "URL" class, like "react-native-url-polyfill".` + ) + ); +} + +// node_modules/msw/lib/core/utils/internal/isStringEqual.mjs +function isStringEqual(actual, expected) { + return actual.toLowerCase() === expected.toLowerCase(); +} + +// node_modules/msw/lib/core/utils/logging/getStatusCodeColor.mjs +function getStatusCodeColor(status) { + if (status < 300) { + return "#69AB32"; + } + if (status < 400) { + return "#F0BB4B"; + } + return "#E95F5D"; +} + +// node_modules/msw/lib/core/utils/logging/serializeRequest.mjs +async function serializeRequest(request) { + const requestClone = request.clone(); + const requestText = await requestClone.text(); + return { + url: new URL(request.url), + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + body: requestText + }; +} + +// node_modules/msw/lib/core/utils/logging/serializeResponse.mjs +var { message: message3 } = statuses_default; +async function serializeResponse(response) { + const responseClone = response.clone(); + const responseText = await responseClone.text(); + const responseStatus = responseClone.status || 200; + const responseStatusText = responseClone.statusText || message3[responseStatus] || "OK"; + return { + status: responseStatus, + statusText: responseStatusText, + headers: Object.fromEntries(responseClone.headers.entries()), + body: responseText + }; +} + +// node_modules/path-to-regexp/dist.es2015/index.js +function lexer(str) { + var tokens = []; + var i = 0; + while (i < str.length) { + var char = str[i]; + if (char === "*" || char === "+" || char === "?") { + tokens.push({ type: "MODIFIER", index: i, value: str[i++] }); + continue; + } + if (char === "\\") { + tokens.push({ type: "ESCAPED_CHAR", index: i++, value: str[i++] }); + continue; + } + if (char === "{") { + tokens.push({ type: "OPEN", index: i, value: str[i++] }); + continue; + } + if (char === "}") { + tokens.push({ type: "CLOSE", index: i, value: str[i++] }); + continue; + } + if (char === ":") { + var name = ""; + var j = i + 1; + while (j < str.length) { + var code = str.charCodeAt(j); + if ( + // `0-9` + code >= 48 && code <= 57 || // `A-Z` + code >= 65 && code <= 90 || // `a-z` + code >= 97 && code <= 122 || // `_` + code === 95 + ) { + name += str[j++]; + continue; + } + break; + } + if (!name) + throw new TypeError("Missing parameter name at ".concat(i)); + tokens.push({ type: "NAME", index: i, value: name }); + i = j; + continue; + } + if (char === "(") { + var count = 1; + var pattern = ""; + var j = i + 1; + if (str[j] === "?") { + throw new TypeError('Pattern cannot start with "?" at '.concat(j)); + } + while (j < str.length) { + if (str[j] === "\\") { + pattern += str[j++] + str[j++]; + continue; + } + if (str[j] === ")") { + count--; + if (count === 0) { + j++; + break; + } + } else if (str[j] === "(") { + count++; + if (str[j + 1] !== "?") { + throw new TypeError("Capturing groups are not allowed at ".concat(j)); + } + } + pattern += str[j++]; + } + if (count) + throw new TypeError("Unbalanced pattern at ".concat(i)); + if (!pattern) + throw new TypeError("Missing pattern at ".concat(i)); + tokens.push({ type: "PATTERN", index: i, value: pattern }); + i = j; + continue; + } + tokens.push({ type: "CHAR", index: i, value: str[i++] }); + } + tokens.push({ type: "END", index: i, value: "" }); + return tokens; +} +function parse2(str, options) { + if (options === void 0) { + options = {}; + } + var tokens = lexer(str); + var _a2 = options.prefixes, prefixes = _a2 === void 0 ? "./" : _a2, _b2 = options.delimiter, delimiter = _b2 === void 0 ? "/#?" : _b2; + var result = []; + var key = 0; + var i = 0; + var path = ""; + var tryConsume = function(type) { + if (i < tokens.length && tokens[i].type === type) + return tokens[i++].value; + }; + var mustConsume = function(type) { + var value2 = tryConsume(type); + if (value2 !== void 0) + return value2; + var _a3 = tokens[i], nextType = _a3.type, index = _a3.index; + throw new TypeError("Unexpected ".concat(nextType, " at ").concat(index, ", expected ").concat(type)); + }; + var consumeText = function() { + var result2 = ""; + var value2; + while (value2 = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")) { + result2 += value2; + } + return result2; + }; + var isSafe = function(value2) { + for (var _i = 0, delimiter_1 = delimiter; _i < delimiter_1.length; _i++) { + var char2 = delimiter_1[_i]; + if (value2.indexOf(char2) > -1) + return true; + } + return false; + }; + var safePattern = function(prefix2) { + var prev = result[result.length - 1]; + var prevText = prefix2 || (prev && typeof prev === "string" ? prev : ""); + if (prev && !prevText) { + throw new TypeError('Must have text between two parameters, missing text after "'.concat(prev.name, '"')); + } + if (!prevText || isSafe(prevText)) + return "[^".concat(escapeString(delimiter), "]+?"); + return "(?:(?!".concat(escapeString(prevText), ")[^").concat(escapeString(delimiter), "])+?"); + }; + while (i < tokens.length) { + var char = tryConsume("CHAR"); + var name = tryConsume("NAME"); + var pattern = tryConsume("PATTERN"); + if (name || pattern) { + var prefix = char || ""; + if (prefixes.indexOf(prefix) === -1) { + path += prefix; + prefix = ""; + } + if (path) { + result.push(path); + path = ""; + } + result.push({ + name: name || key++, + prefix, + suffix: "", + pattern: pattern || safePattern(prefix), + modifier: tryConsume("MODIFIER") || "" + }); + continue; + } + var value = char || tryConsume("ESCAPED_CHAR"); + if (value) { + path += value; + continue; + } + if (path) { + result.push(path); + path = ""; + } + var open = tryConsume("OPEN"); + if (open) { + var prefix = consumeText(); + var name_1 = tryConsume("NAME") || ""; + var pattern_1 = tryConsume("PATTERN") || ""; + var suffix = consumeText(); + mustConsume("CLOSE"); + result.push({ + name: name_1 || (pattern_1 ? key++ : ""), + pattern: name_1 && !pattern_1 ? safePattern(prefix) : pattern_1, + prefix, + suffix, + modifier: tryConsume("MODIFIER") || "" + }); + continue; + } + mustConsume("END"); + } + return result; +} +function match(str, options) { + var keys = []; + var re = pathToRegexp(str, keys, options); + return regexpToFunction(re, keys, options); +} +function regexpToFunction(re, keys, options) { + if (options === void 0) { + options = {}; + } + var _a2 = options.decode, decode = _a2 === void 0 ? function(x) { + return x; + } : _a2; + return function(pathname) { + var m = re.exec(pathname); + if (!m) + return false; + var path = m[0], index = m.index; + var params = /* @__PURE__ */ Object.create(null); + var _loop_1 = function(i2) { + if (m[i2] === void 0) + return "continue"; + var key = keys[i2 - 1]; + if (key.modifier === "*" || key.modifier === "+") { + params[key.name] = m[i2].split(key.prefix + key.suffix).map(function(value) { + return decode(value, key); + }); + } else { + params[key.name] = decode(m[i2], key); + } + }; + for (var i = 1; i < m.length; i++) { + _loop_1(i); + } + return { path, index, params }; + }; +} +function escapeString(str) { + return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1"); +} +function flags(options) { + return options && options.sensitive ? "" : "i"; +} +function regexpToRegexp(path, keys) { + if (!keys) + return path; + var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g; + var index = 0; + var execResult = groupsRegex.exec(path.source); + while (execResult) { + keys.push({ + // Use parenthesized substring match if available, index otherwise + name: execResult[1] || index++, + prefix: "", + suffix: "", + modifier: "", + pattern: "" + }); + execResult = groupsRegex.exec(path.source); + } + return path; +} +function arrayToRegexp(paths, keys, options) { + var parts = paths.map(function(path) { + return pathToRegexp(path, keys, options).source; + }); + return new RegExp("(?:".concat(parts.join("|"), ")"), flags(options)); +} +function stringToRegexp(path, keys, options) { + return tokensToRegexp(parse2(path, options), keys, options); +} +function tokensToRegexp(tokens, keys, options) { + if (options === void 0) { + options = {}; + } + var _a2 = options.strict, strict = _a2 === void 0 ? false : _a2, _b2 = options.start, start = _b2 === void 0 ? true : _b2, _c2 = options.end, end = _c2 === void 0 ? true : _c2, _d = options.encode, encode = _d === void 0 ? function(x) { + return x; + } : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f; + var endsWithRe = "[".concat(escapeString(endsWith), "]|$"); + var delimiterRe = "[".concat(escapeString(delimiter), "]"); + var route = start ? "^" : ""; + for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) { + var token = tokens_1[_i]; + if (typeof token === "string") { + route += escapeString(encode(token)); + } else { + var prefix = escapeString(encode(token.prefix)); + var suffix = escapeString(encode(token.suffix)); + if (token.pattern) { + if (keys) + keys.push(token); + if (prefix || suffix) { + if (token.modifier === "+" || token.modifier === "*") { + var mod = token.modifier === "*" ? "?" : ""; + route += "(?:".concat(prefix, "((?:").concat(token.pattern, ")(?:").concat(suffix).concat(prefix, "(?:").concat(token.pattern, "))*)").concat(suffix, ")").concat(mod); + } else { + route += "(?:".concat(prefix, "(").concat(token.pattern, ")").concat(suffix, ")").concat(token.modifier); + } + } else { + if (token.modifier === "+" || token.modifier === "*") { + throw new TypeError('Can not repeat "'.concat(token.name, '" without a prefix and suffix')); + } + route += "(".concat(token.pattern, ")").concat(token.modifier); + } + } else { + route += "(?:".concat(prefix).concat(suffix, ")").concat(token.modifier); + } + } + } + if (end) { + if (!strict) + route += "".concat(delimiterRe, "?"); + route += !options.endsWith ? "$" : "(?=".concat(endsWithRe, ")"); + } else { + var endToken = tokens[tokens.length - 1]; + var isEndDelimited = typeof endToken === "string" ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1 : endToken === void 0; + if (!strict) { + route += "(?:".concat(delimiterRe, "(?=").concat(endsWithRe, "))?"); + } + if (!isEndDelimited) { + route += "(?=".concat(delimiterRe, "|").concat(endsWithRe, ")"); + } + } + return new RegExp(route, flags(options)); +} +function pathToRegexp(path, keys, options) { + if (path instanceof RegExp) + return regexpToRegexp(path, keys); + if (Array.isArray(path)) + return arrayToRegexp(path, keys, options); + return stringToRegexp(path, keys, options); +} + +// node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs +var encoder2 = new TextEncoder(); + +// node_modules/@mswjs/interceptors/lib/browser/chunk-LIKZF2VU.mjs +var IS_PATCHED_MODULE2 = Symbol("isPatchedModule"); +var InterceptorError2 = class extends Error { + constructor(message4) { + super(message4); + this.name = "InterceptorError"; + Object.setPrototypeOf(this, InterceptorError2.prototype); + } +}; +var _handled2; +var handled_get2; +var _RequestController2 = class { + constructor(request, source) { + this.request = request; + this.source = source; + __privateAdd(this, _handled2); + this.readyState = _RequestController2.PENDING; + this.handled = new DeferredPromise(); + } + /** + * Perform this request as-is. + */ + async passthrough() { + invariant.as( + InterceptorError2, + this.readyState === _RequestController2.PENDING, + 'Failed to passthrough the "%s %s" request: the request has already been handled', + this.request.method, + this.request.url + ); + this.readyState = _RequestController2.PASSTHROUGH; + await this.source.passthrough(); + __privateGet(this, _handled2, handled_get2).resolve(); + } + /** + * Respond to this request with the given `Response` instance. + * + * @example + * controller.respondWith(new Response()) + * controller.respondWith(Response.json({ id })) + * controller.respondWith(Response.error()) + */ + respondWith(response) { + invariant.as( + InterceptorError2, + this.readyState === _RequestController2.PENDING, + 'Failed to respond to the "%s %s" request with "%d %s": the request has already been handled (%d)', + this.request.method, + this.request.url, + response.status, + response.statusText || "OK", + this.readyState + ); + this.readyState = _RequestController2.RESPONSE; + __privateGet(this, _handled2, handled_get2).resolve(); + this.source.respondWith(response); + } + /** + * Error this request with the given reason. + * + * @example + * controller.errorWith() + * controller.errorWith(new Error('Oops!')) + * controller.errorWith({ message: 'Oops!'}) + */ + errorWith(reason) { + invariant.as( + InterceptorError2, + this.readyState === _RequestController2.PENDING, + 'Failed to error the "%s %s" request with "%s": the request has already been handled (%d)', + this.request.method, + this.request.url, + reason == null ? void 0 : reason.toString(), + this.readyState + ); + this.readyState = _RequestController2.ERROR; + this.source.errorWith(reason); + __privateGet(this, _handled2, handled_get2).resolve(); + } +}; +var RequestController2 = _RequestController2; +_handled2 = /* @__PURE__ */ new WeakSet(); +handled_get2 = function() { + return this.handled; +}; +RequestController2.PENDING = 0; +RequestController2.PASSTHROUGH = 1; +RequestController2.RESPONSE = 2; +RequestController2.ERROR = 3; +function canParseUrl2(url) { + try { + new URL(url); + return true; + } catch (_error) { + return false; + } +} +function getValueBySymbol2(symbolName, source) { + const ownSymbols = Object.getOwnPropertySymbols(source); + const symbol = ownSymbols.find((symbol2) => { + return symbol2.description === symbolName; + }); + if (symbol) { + return Reflect.get(source, symbol); + } + return; +} +var _FetchResponse2 = class extends Response { + static isConfigurableStatusCode(status) { + return status >= 200 && status <= 599; + } + static isRedirectResponse(status) { + return _FetchResponse2.STATUS_CODES_WITH_REDIRECT.includes(status); + } + /** + * Returns a boolean indicating whether the given response status + * code represents a response that can have a body. + */ + static isResponseWithBody(status) { + return !_FetchResponse2.STATUS_CODES_WITHOUT_BODY.includes(status); + } + static setUrl(url, response) { + if (!url || url === "about:" || !canParseUrl2(url)) { + return; + } + const state = getValueBySymbol2("state", response); + if (state) { + state.urlList.push(new URL(url)); + } else { + Object.defineProperty(response, "url", { + value: url, + enumerable: true, + configurable: true, + writable: false + }); + } + } + /** + * Parses the given raw HTTP headers into a Fetch API `Headers` instance. + */ + static parseRawHeaders(rawHeaders) { + const headers = new Headers(); + for (let line = 0; line < rawHeaders.length; line += 2) { + headers.append(rawHeaders[line], rawHeaders[line + 1]); + } + return headers; + } + constructor(body, init = {}) { + var _a2; + const status = (_a2 = init.status) != null ? _a2 : 200; + const safeStatus = _FetchResponse2.isConfigurableStatusCode(status) ? status : 200; + const finalBody = _FetchResponse2.isResponseWithBody(status) ? body : null; + super(finalBody, { + status: safeStatus, + statusText: init.statusText, + headers: init.headers + }); + if (status !== safeStatus) { + const state = getValueBySymbol2("state", this); + if (state) { + state.status = status; + } else { + Object.defineProperty(this, "status", { + value: status, + enumerable: true, + configurable: true, + writable: false + }); + } + } + _FetchResponse2.setUrl(init.url, this); + } +}; +var FetchResponse2 = _FetchResponse2; +FetchResponse2.STATUS_CODES_WITHOUT_BODY = [101, 103, 204, 205, 304]; +FetchResponse2.STATUS_CODES_WITH_REDIRECT = [301, 302, 303, 307, 308]; +var kRawRequest2 = Symbol("kRawRequest"); + +// node_modules/@mswjs/interceptors/lib/browser/index.mjs +function getCleanUrl(url, isAbsolute = true) { + return [isAbsolute && url.origin, url.pathname].filter(Boolean).join(""); +} + +// node_modules/msw/lib/core/utils/url/cleanUrl.mjs +var REDUNDANT_CHARACTERS_EXP = /[?|#].*$/g; +function cleanUrl(path) { + if (path.endsWith("?")) { + return path; + } + return path.replace(REDUNDANT_CHARACTERS_EXP, ""); +} + +// node_modules/msw/lib/core/utils/url/isAbsoluteUrl.mjs +function isAbsoluteUrl(url) { + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +} + +// node_modules/msw/lib/core/utils/url/getAbsoluteUrl.mjs +function getAbsoluteUrl(path, baseUrl) { + if (isAbsoluteUrl(path)) { + return path; + } + if (path.startsWith("*")) { + return path; + } + const origin = baseUrl || typeof location !== "undefined" && location.href; + return origin ? ( + // Encode and decode the path to preserve escaped characters. + decodeURI(new URL(encodeURI(path), origin).href) + ) : path; +} + +// node_modules/msw/lib/core/utils/matching/normalizePath.mjs +function normalizePath(path, baseUrl) { + if (path instanceof RegExp) { + return path; + } + const maybeAbsoluteUrl = getAbsoluteUrl(path, baseUrl); + return cleanUrl(maybeAbsoluteUrl); +} + +// node_modules/msw/lib/core/utils/matching/matchRequestUrl.mjs +function coercePath(path) { + return path.replace( + /([:a-zA-Z_-]*)(\*{1,2})+/g, + (_, parameterName, wildcard) => { + const expression = "(.*)"; + if (!parameterName) { + return expression; + } + return parameterName.startsWith(":") ? `${parameterName}${wildcard}` : `${parameterName}${expression}`; + } + ).replace(/([^/])(:)(?=\d+)/, "$1\\$2").replace(/^([^/]+)(:)(?=\/\/)/, "$1\\$2"); +} +function matchRequestUrl(url, path, baseUrl) { + const normalizedPath = normalizePath(path, baseUrl); + const cleanPath = typeof normalizedPath === "string" ? coercePath(normalizedPath) : normalizedPath; + const cleanUrl2 = getCleanUrl(url); + const result = match(cleanPath, { decode: decodeURIComponent })(cleanUrl2); + const params = result && result.params || {}; + return { + matches: result !== false, + params + }; +} + +// node_modules/msw/lib/shims/cookie.mjs +var __create3 = Object.create; +var __defProp5 = Object.defineProperty; +var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor; +var __getOwnPropNames3 = Object.getOwnPropertyNames; +var __getProtoOf3 = Object.getPrototypeOf; +var __hasOwnProp3 = Object.prototype.hasOwnProperty; +var __commonJS3 = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames3(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps3 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames3(from)) + if (!__hasOwnProp3.call(to, key) && key !== except) + __defProp5(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc3(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM3 = (mod, isNodeMode, target) => (target = mod != null ? __create3(__getProtoOf3(mod)) : {}, __copyProps3( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp5(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var require_dist = __commonJS3({ + "node_modules/.pnpm/cookie@1.0.2/node_modules/cookie/dist/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parse = parse22; + exports.serialize = serialize2; + var cookieNameRegExp = /^[\u0021-\u003A\u003C\u003E-\u007E]+$/; + var cookieValueRegExp = /^[\u0021-\u003A\u003C-\u007E]*$/; + var domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i; + var pathValueRegExp = /^[\u0020-\u003A\u003D-\u007E]*$/; + var __toString = Object.prototype.toString; + var NullObject = /* @__PURE__ */ (() => { + const C = function() { + }; + C.prototype = /* @__PURE__ */ Object.create(null); + return C; + })(); + function parse22(str, options) { + const obj = new NullObject(); + const len = str.length; + if (len < 2) + return obj; + const dec = options?.decode || decode; + let index = 0; + do { + const eqIdx = str.indexOf("=", index); + if (eqIdx === -1) + break; + const colonIdx = str.indexOf(";", index); + const endIdx = colonIdx === -1 ? len : colonIdx; + if (eqIdx > endIdx) { + index = str.lastIndexOf(";", eqIdx - 1) + 1; + continue; + } + const keyStartIdx = startIndex(str, index, eqIdx); + const keyEndIdx = endIndex(str, eqIdx, keyStartIdx); + const key = str.slice(keyStartIdx, keyEndIdx); + if (obj[key] === void 0) { + let valStartIdx = startIndex(str, eqIdx + 1, endIdx); + let valEndIdx = endIndex(str, endIdx, valStartIdx); + const value = dec(str.slice(valStartIdx, valEndIdx)); + obj[key] = value; + } + index = endIdx + 1; + } while (index < len); + return obj; + } + function startIndex(str, index, max) { + do { + const code = str.charCodeAt(index); + if (code !== 32 && code !== 9) + return index; + } while (++index < max); + return max; + } + function endIndex(str, index, min) { + while (index > min) { + const code = str.charCodeAt(--index); + if (code !== 32 && code !== 9) + return index + 1; + } + return min; + } + function serialize2(name, val, options) { + const enc = options?.encode || encodeURIComponent; + if (!cookieNameRegExp.test(name)) { + throw new TypeError(`argument name is invalid: ${name}`); + } + const value = enc(val); + if (!cookieValueRegExp.test(value)) { + throw new TypeError(`argument val is invalid: ${val}`); + } + let str = name + "=" + value; + if (!options) + return str; + if (options.maxAge !== void 0) { + if (!Number.isInteger(options.maxAge)) { + throw new TypeError(`option maxAge is invalid: ${options.maxAge}`); + } + str += "; Max-Age=" + options.maxAge; + } + if (options.domain) { + if (!domainValueRegExp.test(options.domain)) { + throw new TypeError(`option domain is invalid: ${options.domain}`); + } + str += "; Domain=" + options.domain; + } + if (options.path) { + if (!pathValueRegExp.test(options.path)) { + throw new TypeError(`option path is invalid: ${options.path}`); + } + str += "; Path=" + options.path; + } + if (options.expires) { + if (!isDate(options.expires) || !Number.isFinite(options.expires.valueOf())) { + throw new TypeError(`option expires is invalid: ${options.expires}`); + } + str += "; Expires=" + options.expires.toUTCString(); + } + if (options.httpOnly) { + str += "; HttpOnly"; + } + if (options.secure) { + str += "; Secure"; + } + if (options.partitioned) { + str += "; Partitioned"; + } + if (options.priority) { + const priority = typeof options.priority === "string" ? options.priority.toLowerCase() : void 0; + switch (priority) { + case "low": + str += "; Priority=Low"; + break; + case "medium": + str += "; Priority=Medium"; + break; + case "high": + str += "; Priority=High"; + break; + default: + throw new TypeError(`option priority is invalid: ${options.priority}`); + } + } + if (options.sameSite) { + const sameSite = typeof options.sameSite === "string" ? options.sameSite.toLowerCase() : options.sameSite; + switch (sameSite) { + case true: + case "strict": + str += "; SameSite=Strict"; + break; + case "lax": + str += "; SameSite=Lax"; + break; + case "none": + str += "; SameSite=None"; + break; + default: + throw new TypeError(`option sameSite is invalid: ${options.sameSite}`); + } + } + return str; + } + function decode(str) { + if (str.indexOf("%") === -1) + return str; + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + function isDate(val) { + return __toString.call(val) === "[object Date]"; + } + } +}); +var allCookie = __toESM3(require_dist(), 1); +var cookie = allCookie.default || allCookie; +var parse3 = cookie.parse; +var serialize = cookie.serialize; + +// node_modules/msw/lib/core/utils/request/getRequestCookies.mjs +function parseCookies(input) { + const parsedCookies = parse3(input); + const cookies = {}; + for (const cookieName in parsedCookies) { + if (typeof parsedCookies[cookieName] !== "undefined") { + cookies[cookieName] = parsedCookies[cookieName]; + } + } + return cookies; +} +function getAllDocumentCookies() { + return parseCookies(document.cookie); +} +function getDocumentCookies(request) { + if (typeof document === "undefined" || typeof location === "undefined") { + return {}; + } + switch (request.credentials) { + case "same-origin": { + const requestUrl = new URL(request.url); + return location.origin === requestUrl.origin ? getAllDocumentCookies() : {}; + } + case "include": { + return getAllDocumentCookies(); + } + default: { + return {}; + } + } +} +function getAllRequestCookies(request) { + const requestCookieHeader = request.headers.get("cookie"); + const cookiesFromHeaders = requestCookieHeader ? parseCookies(requestCookieHeader) : {}; + const cookiesFromDocument = getDocumentCookies(request); + for (const name in cookiesFromDocument) { + request.headers.append( + "cookie", + serialize(name, cookiesFromDocument[name]) + ); + } + const cookiesFromStore = cookieStore.getCookies(request.url); + const storedCookiesObject = Object.fromEntries( + cookiesFromStore.map((cookie2) => [cookie2.key, cookie2.value]) + ); + for (const cookie2 of cookiesFromStore) { + request.headers.append("cookie", cookie2.toString()); + } + return { + ...cookiesFromDocument, + ...storedCookiesObject, + ...cookiesFromHeaders + }; +} + +// node_modules/msw/lib/core/handlers/HttpHandler.mjs +var HttpMethods = /* @__PURE__ */ ((HttpMethods2) => { + HttpMethods2["HEAD"] = "HEAD"; + HttpMethods2["GET"] = "GET"; + HttpMethods2["POST"] = "POST"; + HttpMethods2["PUT"] = "PUT"; + HttpMethods2["PATCH"] = "PATCH"; + HttpMethods2["OPTIONS"] = "OPTIONS"; + HttpMethods2["DELETE"] = "DELETE"; + return HttpMethods2; +})(HttpMethods || {}); +var HttpHandler = class extends RequestHandler { + constructor(method, predicate, resolver, options) { + const displayPath = typeof predicate === "function" ? "[custom predicate]" : predicate; + super({ + info: { + header: `${method}${displayPath ? ` ${displayPath}` : ""}`, + path: predicate, + method + }, + resolver, + options + }); + this.checkRedundantQueryParameters(); + } + checkRedundantQueryParameters() { + const { method, path } = this.info; + if (!path || path instanceof RegExp || typeof path === "function") { + return; + } + const url = cleanUrl(path); + if (url === path) { + return; + } + devUtils.warn( + `Found a redundant usage of query parameters in the request handler URL for "${method} ${path}". Please match against a path instead and access query parameters using "new URL(request.url).searchParams" instead. Learn more: https://mswjs.io/docs/http/intercepting-requests#querysearch-parameters` + ); + } + async parse(args) { + const url = new URL(args.request.url); + const cookies = getAllRequestCookies(args.request); + if (typeof this.info.path === "function") { + const customPredicateResult = await this.info.path({ + request: args.request, + cookies + }); + const match22 = typeof customPredicateResult === "boolean" ? { + matches: customPredicateResult, + params: {} + } : customPredicateResult; + return { + match: match22, + cookies + }; + } + const match2 = this.info.path ? matchRequestUrl(url, this.info.path, args.resolutionContext?.baseUrl) : { matches: false, params: {} }; + return { + match: match2, + cookies + }; + } + async predicate(args) { + const hasMatchingMethod = this.matchMethod(args.request.method); + const hasMatchingUrl = args.parsedResult.match.matches; + return hasMatchingMethod && hasMatchingUrl; + } + matchMethod(actualMethod) { + return this.info.method instanceof RegExp ? this.info.method.test(actualMethod) : isStringEqual(this.info.method, actualMethod); + } + extendResolverArgs(args) { + return { + params: args.parsedResult.match?.params || {}, + cookies: args.parsedResult.cookies + }; + } + async log(args) { + const publicUrl = toPublicUrl(args.request.url); + const loggedRequest = await serializeRequest(args.request); + const loggedResponse = await serializeResponse(args.response); + const statusColor = getStatusCodeColor(loggedResponse.status); + console.groupCollapsed( + devUtils.formatMessage( + `${getTimestamp()} ${args.request.method} ${publicUrl} (%c${loggedResponse.status} ${loggedResponse.statusText}%c)` + ), + `color:${statusColor}`, + "color:inherit" + ); + console.log("Request", loggedRequest); + console.log("Handler:", this); + console.log("Response", loggedResponse); + console.groupEnd(); + } +}; + +// node_modules/msw/lib/core/http.mjs +function createHttpHandler(method) { + return (predicate, resolver, options = {}) => { + return new HttpHandler(method, predicate, resolver, options); + }; +} +var http = { + all: createHttpHandler(/.+/), + head: createHttpHandler(HttpMethods.HEAD), + get: createHttpHandler(HttpMethods.GET), + post: createHttpHandler(HttpMethods.POST), + put: createHttpHandler(HttpMethods.PUT), + delete: createHttpHandler(HttpMethods.DELETE), + patch: createHttpHandler(HttpMethods.PATCH), + options: createHttpHandler(HttpMethods.OPTIONS) +}; + +// node_modules/msw/lib/core/HttpResponse.mjs +var bodyType = Symbol("bodyType"); +var HttpResponse = class _HttpResponse extends FetchResponse2 { + [bodyType] = null; + constructor(body, init) { + const responseInit = normalizeResponseInit(init); + super(body, responseInit); + decorateResponse(this, responseInit); + } + static error() { + return super.error(); + } + /** + * Create a `Response` with a `Content-Type: "text/plain"` body. + * @example + * HttpResponse.text('hello world') + * HttpResponse.text('Error', { status: 500 }) + */ + static text(body, init) { + const responseInit = normalizeResponseInit(init); + if (!responseInit.headers.has("Content-Type")) { + responseInit.headers.set("Content-Type", "text/plain"); + } + if (!responseInit.headers.has("Content-Length")) { + responseInit.headers.set( + "Content-Length", + body ? new Blob([body]).size.toString() : "0" + ); + } + return new _HttpResponse(body, responseInit); + } + /** + * Create a `Response` with a `Content-Type: "application/json"` body. + * @example + * HttpResponse.json({ firstName: 'John' }) + * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 }) + */ + static json(body, init) { + const responseInit = normalizeResponseInit(init); + if (!responseInit.headers.has("Content-Type")) { + responseInit.headers.set("Content-Type", "application/json"); + } + const responseText = JSON.stringify(body); + if (!responseInit.headers.has("Content-Length")) { + responseInit.headers.set( + "Content-Length", + responseText ? new Blob([responseText]).size.toString() : "0" + ); + } + return new _HttpResponse(responseText, responseInit); + } + /** + * Create a `Response` with a `Content-Type: "application/xml"` body. + * @example + * HttpResponse.xml(``) + * HttpResponse.xml(`
`, { status: 201 }) + */ + static xml(body, init) { + const responseInit = normalizeResponseInit(init); + if (!responseInit.headers.has("Content-Type")) { + responseInit.headers.set("Content-Type", "text/xml"); + } + return new _HttpResponse(body, responseInit); + } + /** + * Create a `Response` with a `Content-Type: "text/html"` body. + * @example + * HttpResponse.html(`

Jane Doe

`) + * HttpResponse.html(`
Main text
`, { status: 201 }) + */ + static html(body, init) { + const responseInit = normalizeResponseInit(init); + if (!responseInit.headers.has("Content-Type")) { + responseInit.headers.set("Content-Type", "text/html"); + } + return new _HttpResponse(body, responseInit); + } + /** + * Create a `Response` with an `ArrayBuffer` body. + * @example + * const buffer = new ArrayBuffer(3) + * const view = new Uint8Array(buffer) + * view.set([1, 2, 3]) + * + * HttpResponse.arrayBuffer(buffer) + */ + static arrayBuffer(body, init) { + const responseInit = normalizeResponseInit(init); + if (!responseInit.headers.has("Content-Type")) { + responseInit.headers.set("Content-Type", "application/octet-stream"); + } + if (body && !responseInit.headers.has("Content-Length")) { + responseInit.headers.set("Content-Length", body.byteLength.toString()); + } + return new _HttpResponse(body, responseInit); + } + /** + * Create a `Response` with a `FormData` body. + * @example + * const data = new FormData() + * data.set('name', 'Alice') + * + * HttpResponse.formData(data) + */ + static formData(body, init) { + return new _HttpResponse(body, normalizeResponseInit(init)); + } +}; + +// node_modules/msw/lib/core/index.mjs +checkGlobals(); + +// static/api-key-management/api/mocking/state.ts +function mulberry32(seed) { + return function() { + let t = seed += 1831565813; + t = Math.imul(t ^ t >>> 15, t | 1); + t ^= t + Math.imul(t ^ t >>> 7, t | 61); + return ((t ^ t >>> 14) >>> 0) / 4294967296; + }; +} +var rand = mulberry32(42); +function randInt(min, max) { + return Math.floor(rand() * (max - min + 1)) + min; +} +function chance(p) { + return rand() < p; +} +function sample(arr) { + return arr[randInt(0, arr.length - 1)]; +} +var adjectives = [ + "alpha", + "bravo", + "charlie", + "delta", + "echo", + "foxtrot", + "gamma", + "omega", + "nova", + "prime", + "rapid", + "silent", + "stellar", + "terra", + "ultra", + "vector", + "zen", + "spark", + "quantum", + "lunar" +]; +var nouns = [ + "key", + "access", + "token", + "gateway", + "switch", + "bridge", + "anchor", + "beacon", + "signal", + "pilot", + "runner", + "mirror", + "rocket", + "engine", + "circuit", + "tensor", + "matrix", + "nexus", + "orbit", + "pulse" +]; +function randomName() { + const base = `${sample(adjectives)}-${sample(nouns)}`; + const suffix = chance(0.6) ? `_${randInt(1, 999)}` : chance(0.5) ? `.v${randInt(1, 9)}` : ""; + const name = base + suffix; + return name.slice(0, Math.max(3, Math.min(35, name.length))); +} +function randomRawKey() { + const bytes = new Uint8Array(24); + crypto.getRandomValues(bytes); + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} +function shortKeyFrom(raw) { + if (raw.length <= 6) return raw; + return `${raw.slice(0, 3)}...${raw.slice(-3)}`; +} +function dateDaysAgo(days) { + const d = /* @__PURE__ */ new Date(); + d.setDate(d.getDate() - days); + return d; +} +function dateBetweenDaysAgo(minDays, maxDays) { + return dateDaysAgo(randInt(minDays, maxDays)); +} +function iso(d) { + return d ? d.toISOString() : null; +} +function generateAPIKeys(count) { + const set = /* @__PURE__ */ new Set(); + const out = []; + while (out.length < count) { + let name = randomName(); + while (set.has(name)) name = `${name}-${randInt(1, 9999)}`; + set.add(name); + const createdAt = dateBetweenDaysAgo(0, 540); + const neverUsed = chance(0.2); + const recentlyUsed = !neverUsed && chance(0.3); + const maxAgeDays = Math.max(0, Math.floor((Date.now() - createdAt.getTime()) / 864e5)); + const last_used_at = neverUsed ? null : recentlyUsed ? dateBetweenDaysAgo(0, maxAgeDays) : dateBetweenDaysAgo(Math.floor(maxAgeDays / 2), maxAgeDays); + const disabled = chance(0.15); + const disabled_at = disabled ? dateBetweenDaysAgo(0, Math.max(0, Math.floor(((last_used_at ?? createdAt).getTime() - createdAt.getTime()) / 864e5))) : null; + const raw = randomRawKey(); + out.push({ + name, + short_key: shortKeyFrom(raw), + created_at: createdAt.toISOString(), + last_used_at: iso(last_used_at), + disabled_at: iso(disabled_at) + }); + } + if (out[0]) out[0] = { ...out[0], name: "a-b", last_used_at: null }; + if (out[1]) out[1] = { ...out[1], name: "prod.key_v1", disabled_at: out[1].disabled_at ?? (/* @__PURE__ */ new Date()).toISOString() }; + if (out[2]) out[2] = { ...out[2], name: "this-is-a-very-long-key-name-version-1", short_key: "aaa...bbb" }; + return out; +} +var apiKeys = { + api_keys: generateAPIKeys(150) +}; +function findIndexByName(name) { + return apiKeys.api_keys.findIndex((k) => k.name === name); +} + +// static/api-key-management/api/mocking/handlers.ts +function randomRawKey2() { + const bytes = new Uint8Array(24); + crypto.getRandomValues(bytes); + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} +function createHandlers(basePrefix) { + const base = basePrefix.replace(/\/+$/, ""); + return [ + // GET /api-keys → limit to 10 items + http.get(`${base}/api-keys`, () => { + return HttpResponse.json({ api_keys: apiKeys.api_keys.slice(0, 10) }); + }), + // Create + http.post(`${base}/api-keys`, async ({ request }) => { + const body = await request.json(); + const name = (body.name || "").trim(); + if (!/^[A-Za-z0-9._-]{3,35}$/.test(name)) { + return HttpResponse.json({ error: "invalid name" }, { status: 400 }); + } + if (findIndexByName(name) !== -1) { + return HttpResponse.json({ error: "name already exists" }, { status: 409 }); + } + const raw = randomRawKey2(); + const now = (/* @__PURE__ */ new Date()).toISOString(); + const created = { + name, + short_key: shortKeyFrom(raw), + created_at: now, + last_used_at: null, + disabled_at: null + }; + apiKeys.api_keys.unshift(created); + return HttpResponse.json({ raw_api_key: raw, api_key: created }); + }), + // Get by name + http.get(`${base}/api-keys/:name`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + return HttpResponse.json({ api_key: apiKeys.api_keys[idx] }); + }), + // Delete + http.delete(`${base}/api-keys/:name`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + apiKeys.api_keys.splice(idx, 1); + return new HttpResponse(null, { status: 204 }); + }), + // Disable + http.post(`${base}/api-keys/:name/disable`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + apiKeys.api_keys[idx].disabled_at = (/* @__PURE__ */ new Date()).toISOString(); + return HttpResponse.json({ api_key: apiKeys.api_keys[idx] }); + }), + // Enable + http.post(`${base}/api-keys/:name/enable`, ({ params }) => { + const idx = findIndexByName(String(params.name || "")); + if (idx === -1) return HttpResponse.json({ error: "not found" }, { status: 404 }); + apiKeys.api_keys[idx].disabled_at = null; + return HttpResponse.json({ api_key: apiKeys.api_keys[idx] }); + }) + ]; +} + +// static/api-key-management/api/mocking/browser.ts +async function startMocks(basePrefix) { + const worker = setupWorker(...createHandlers(basePrefix)); + await worker.start({ + onUnhandledRequest: "bypass", + serviceWorker: { url: "/mockServiceWorker.js" } + // created by `msw init ./static` + }); + return worker; +} + +// static/api-key-management/api-key-management.entry.ts +var APiBaseUrl = window.__APIKEYMANAGEMENT_CONFIG__.apiBaseUrl; +var ApiClient = createAPIClient(APiBaseUrl); +function initializeApiKeyManagement() { + const apiKeysTables = initApiKeysTable(ApiClient); + useAPIKeyCreation(ApiClient, { + onCreated: () => { + apiKeysTables?.ajax.reload(); + } + }); + document.querySelector("#simmulateReload")?.addEventListener("click", () => { + apiKeysTables?.ajax.reload(); + }); +} +(async () => { + await startMocks(APiBaseUrl); + initializeApiKeyManagement(); +})(); +/*! Bundled license information: + +tough-cookie/dist/index.js: + (*! + * Copyright (c) 2015-2020, Salesforce.com, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of Salesforce.com nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *) + +msw/lib/shims/statuses.mjs: + (*! Bundled license information: + + statuses/index.js: + (*! + * statuses + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + *) + *) +*/ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5hcGktZmV0Y2gvc3JjL2luZGV4LmpzIiwgIi4uLy4uL2FwaS1rZXktbWFuYWdlbWVudC9hcGkvaW5kZXgudHMiLCAiLi4vLi4vYXBpLWtleS1tYW5hZ2VtZW50L21vZGFsLnRzIiwgIi4uLy4uL2FwaS1rZXktbWFuYWdlbWVudC91dGlscy50cyIsICIuLi8uLi9hcGkta2V5LW1hbmFnZW1lbnQvbGlzdC1rZXlzLnRzIiwgIi4uLy4uL2FwaS1rZXktbWFuYWdlbWVudC9jcmVhdGUta2V5cy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2ludGVybmFsL2lzT2JqZWN0LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvaW50ZXJuYWwvbWVyZ2VSaWdodC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvb3V0dmFyaWFudC9zcmMvZm9ybWF0LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9vdXR2YXJpYW50L3NyYy9pbnZhcmlhbnQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9pbnRlcm5hbC9kZXZVdGlscy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2ludGVybmFsL2dldENhbGxGcmFtZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2ludGVybmFsL2lzSXRlcmFibGUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS9oYW5kbGVycy9SZXF1ZXN0SGFuZGxlci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdW50aWwtYXN5bmMvc3JjL2luZGV4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvZXhlY3V0ZUhhbmRsZXJzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvcmVxdWVzdC90b1B1YmxpY1VybC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL2lzQ29tbW9uQXNzZXRSZXF1ZXN0LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvcmVxdWVzdC9vblVuaGFuZGxlZFJlcXVlc3QudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW5vZGUtcHJvY2Vzcy9zcmMvaW5kZXgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RsZHRzLWNvcmUvc3JjL2RvbWFpbi50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGxkdHMtY29yZS9zcmMvZG9tYWluLXdpdGhvdXQtc3VmZml4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90bGR0cy1jb3JlL3NyYy9leHRyYWN0LWhvc3RuYW1lLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90bGR0cy1jb3JlL3NyYy9pcy1pcC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGxkdHMtY29yZS9zcmMvaXMtdmFsaWQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RsZHRzLWNvcmUvc3JjL29wdGlvbnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RsZHRzLWNvcmUvc3JjL3N1YmRvbWFpbi50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGxkdHMtY29yZS9zcmMvZmFjdG9yeS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGxkdHMtY29yZS9zcmMvbG9va3VwL2Zhc3QtcGF0aC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGxkdHMvc3JjL2RhdGEvdHJpZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGxkdHMvc3JjL3N1ZmZpeC10cmllLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90bGR0cy9pbmRleC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9wYXRoTWF0Y2gudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvZ2V0UHVibGljU3VmZml4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3Blcm11dGVEb21haW4udHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvc3RvcmUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvdXRpbHMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvbWVtc3RvcmUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvdmFsaWRhdG9ycy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi92ZXJzaW9uLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL2Nvb2tpZS9jb25zdGFudHMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvY29va2llL2Nhbm9uaWNhbERvbWFpbi50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9jb29raWUvZm9ybWF0RGF0ZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9jb29raWUvcGFyc2VEYXRlLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL2Nvb2tpZS9jb29raWUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvY29va2llL2Nvb2tpZUNvbXBhcmUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvY29va2llL2RlZmF1bHRQYXRoLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL2Nvb2tpZS9kb21haW5NYXRjaC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9jb29raWUvc2VjdXJlQ29udGV4dC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9jb29raWUvY29va2llSmFyLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL2Nvb2tpZS9wZXJtdXRlUGF0aC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9jb29raWUvaW5kZXgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9pbnRlcm5hbC9qc29uUGFyc2UudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9jb29raWVTdG9yZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L2xpYi9zaGltcy9zdGF0dXNlcy5tanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hlYWRlcnMtcG9seWZpbGwvbm9kZV9tb2R1bGVzL3NldC1jb29raWUtcGFyc2VyL2xpYi9zZXQtY29va2llLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9oZWFkZXJzLXBvbHlmaWxsL3NyYy9IZWFkZXJzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9oZWFkZXJzLXBvbHlmaWxsL3NyYy91dGlscy9ub3JtYWxpemVIZWFkZXJOYW1lLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9oZWFkZXJzLXBvbHlmaWxsL3NyYy91dGlscy9ub3JtYWxpemVIZWFkZXJWYWx1ZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaGVhZGVycy1wb2x5ZmlsbC9zcmMvdXRpbHMvaXNWYWxpZEhlYWRlck5hbWUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hlYWRlcnMtcG9seWZpbGwvc3JjL3V0aWxzL2lzVmFsaWRIZWFkZXJWYWx1ZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaGVhZGVycy1wb2x5ZmlsbC9zcmMvZ2V0UmF3SGVhZGVycy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaGVhZGVycy1wb2x5ZmlsbC9zcmMvdHJhbnNmb3JtZXJzL2hlYWRlcnNUb0xpc3QudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hlYWRlcnMtcG9seWZpbGwvc3JjL3RyYW5zZm9ybWVycy9oZWFkZXJzVG9TdHJpbmcudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hlYWRlcnMtcG9seWZpbGwvc3JjL3RyYW5zZm9ybWVycy9oZWFkZXJzVG9PYmplY3QudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hlYWRlcnMtcG9seWZpbGwvc3JjL3RyYW5zZm9ybWVycy9zdHJpbmdUb0hlYWRlcnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hlYWRlcnMtcG9seWZpbGwvc3JjL3RyYW5zZm9ybWVycy9saXN0VG9IZWFkZXJzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9oZWFkZXJzLXBvbHlmaWxsL3NyYy90cmFuc2Zvcm1lcnMvcmVkdWNlSGVhZGVyc09iamVjdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaGVhZGVycy1wb2x5ZmlsbC9zcmMvdHJhbnNmb3JtZXJzL29iamVjdFRvSGVhZGVycy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaGVhZGVycy1wb2x5ZmlsbC9zcmMvdHJhbnNmb3JtZXJzL2ZsYXR0ZW5IZWFkZXJzTGlzdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaGVhZGVycy1wb2x5ZmlsbC9zcmMvdHJhbnNmb3JtZXJzL2ZsYXR0ZW5IZWFkZXJzT2JqZWN0LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvSHR0cFJlc3BvbnNlL2RlY29yYXRvcnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9yZXF1ZXN0L3N0b3JlUmVzcG9uc2VDb29raWVzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvaGFuZGxlUmVxdWVzdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL3RvUmVzcG9uc2VJbml0LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvaW50ZXJuYWwvaXNIYW5kbGVyS2luZC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3RyaWN0LWV2ZW50LWVtaXR0ZXIvc3JjL01lbW9yeUxlYWtFcnJvci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3RyaWN0LWV2ZW50LWVtaXR0ZXIvc3JjL0VtaXR0ZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9pbnRlcm5hbC9waXBlRXZlbnRzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvaW50ZXJuYWwvdG9SZWFkb25seUFycmF5LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvaW50ZXJuYWwvRGlzcG9zYWJsZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL1NldHVwQXBpLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9lbWl0QXN5bmMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2hhc0NvbmZpZ3VyYWJsZUdsb2JhbC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG9wZW4tZHJhZnQvbG9nZ2VyL2xpYi9pbmRleC5tanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL0ludGVyY2VwdG9yLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9jcmVhdGVSZXF1ZXN0SWQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BvcGVuLWRyYWZ0L2RlZmVycmVkLXByb21pc2Uvc3JjL2NyZWF0ZURlZmVycmVkRXhlY3V0b3IudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BvcGVuLWRyYWZ0L2RlZmVycmVkLXByb21pc2Uvc3JjL0RlZmVycmVkUHJvbWlzZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1dlYlNvY2tldC91dGlscy9iaW5kRXZlbnQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2ludGVyY2VwdG9ycy9XZWJTb2NrZXQvdXRpbHMvZXZlbnRzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvV2ViU29ja2V0L1dlYlNvY2tldENsaWVudENvbm5lY3Rpb24udHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2ludGVyY2VwdG9ycy9XZWJTb2NrZXQvV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbi50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1dlYlNvY2tldC9XZWJTb2NrZXRPdmVycmlkZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1dlYlNvY2tldC9XZWJTb2NrZXRDbGFzc1RyYW5zcG9ydC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1dlYlNvY2tldC9pbmRleC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3dzL3dlYlNvY2tldEludGVyY2VwdG9yLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvd3MvaGFuZGxlV2ViU29ja2V0RXZlbnQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9sb2dnaW5nL2dldFRpbWVzdGFtcC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3dzL3V0aWxzL2dldE1lc3NhZ2VMZW5ndGgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS93cy91dGlscy90cnVuY2F0ZU1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS93cy91dGlscy9nZXRQdWJsaWNEYXRhLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvd3MvdXRpbHMvYXR0YWNoV2ViU29ja2V0TG9nZ2VyLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL291dHZhcmlhbnRAMS40LjMvbm9kZV9tb2R1bGVzL291dHZhcmlhbnQvc3JjL2Zvcm1hdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9vdXR2YXJpYW50QDEuNC4zL25vZGVfbW9kdWxlcy9vdXR2YXJpYW50L3NyYy9pbnZhcmlhbnQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vaXMtbm9kZS1wcm9jZXNzQDEuMi4wL25vZGVfbW9kdWxlcy9pcy1ub2RlLXByb2Nlc3Mvc3JjL2luZGV4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVuLWRyYWZ0K2RlZmVycmVkLXByb21pc2VAMi4yLjAvbm9kZV9tb2R1bGVzL0BvcGVuLWRyYWZ0L2RlZmVycmVkLXByb21pc2Uvc3JjL2NyZWF0ZURlZmVycmVkRXhlY3V0b3IudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW4tZHJhZnQrZGVmZXJyZWQtcHJvbWlzZUAyLjIuMC9ub2RlX21vZHVsZXMvQG9wZW4tZHJhZnQvZGVmZXJyZWQtcHJvbWlzZS9zcmMvRGVmZXJyZWRQcm9taXNlLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvc2V0dXBXb3JrZXIvc3RhcnQvdXRpbHMvcHJlcGFyZVN0YXJ0SGFuZGxlci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9icm93c2VyL3NldHVwV29ya2VyL3N0YXJ0L2NyZWF0ZVN0YXJ0SGFuZGxlci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS91bnRpbC1hc3luY0AzLjAuMi9ub2RlX21vZHVsZXMvdW50aWwtYXN5bmMvc3JjL2luZGV4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvc2V0dXBXb3JrZXIvc3RhcnQvdXRpbHMvZ2V0V29ya2VySW5zdGFuY2UudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvYnJvd3Nlci91dGlscy9nZXRBYnNvbHV0ZVdvcmtlclVybC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9icm93c2VyL3NldHVwV29ya2VyL3N0YXJ0L3V0aWxzL2dldFdvcmtlckJ5UmVnaXN0cmF0aW9uLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvc2V0dXBXb3JrZXIvc3RhcnQvdXRpbHMvcHJpbnRTdGFydE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvYnJvd3Nlci9zZXR1cFdvcmtlci9zdGFydC91dGlscy9lbmFibGVNb2NraW5nLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvdXRpbHMvcHJ1bmVHZXRSZXF1ZXN0Qm9keS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9icm93c2VyL3V0aWxzL2Rlc2VyaWFsaXplUmVxdWVzdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9icm93c2VyL3V0aWxzL3N1cHBvcnRzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvc2V0dXBXb3JrZXIvc3RhcnQvY3JlYXRlUmVxdWVzdExpc3RlbmVyLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvdXRpbHMvY2hlY2tXb3JrZXJJbnRlZ3JpdHkudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2J1ZmZlclV0aWxzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVuLWRyYWZ0K2xvZ2dlckAwLjMuMC9ub2RlX21vZHVsZXMvQG9wZW4tZHJhZnQvbG9nZ2VyL2xpYi9pbmRleC5tanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vc3RyaWN0LWV2ZW50LWVtaXR0ZXJAMC41LjEvbm9kZV9tb2R1bGVzL3N0cmljdC1ldmVudC1lbWl0dGVyL3NyYy9NZW1vcnlMZWFrRXJyb3IudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vc3RyaWN0LWV2ZW50LWVtaXR0ZXJAMC41LjEvbm9kZV9tb2R1bGVzL3N0cmljdC1ldmVudC1lbWl0dGVyL3NyYy9FbWl0dGVyLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9JbnRlcmNlcHRvci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvY3JlYXRlUmVxdWVzdElkLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9nbG9zc2FyeS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvUmVxdWVzdENvbnRyb2xsZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL0ludGVyY2VwdG9yRXJyb3IudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2NhblBhcnNlVXJsLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9nZXRWYWx1ZUJ5U3ltYm9sLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9mZXRjaFV0aWxzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9nZXRSYXdSZXF1ZXN0LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9CYXRjaEludGVyY2VwdG9yLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9nZXRDbGVhblVybC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9icm93c2VyL3NldHVwV29ya2VyL3N0YXJ0L2NyZWF0ZVJlc3BvbnNlTGlzdGVuZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvYnJvd3Nlci9zZXR1cFdvcmtlci9zdGFydC91dGlscy92YWxpZGF0ZVdvcmtlclNjb3BlLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2Jyb3dzZXIvc2V0dXBXb3JrZXIvc2V0dXBXb3JrZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vcmV0dGltZUAwLjcuMC9ub2RlX21vZHVsZXMvcmV0dGltZS9zcmMvaW5kZXgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvYnJvd3Nlci91dGlscy93b3JrZXJDaGFubmVsLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9lbWl0QXN5bmMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2hhc0NvbmZpZ3VyYWJsZUdsb2JhbC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9Ab3Blbi1kcmFmdCt1bnRpbEAyLjEuMC9ub2RlX21vZHVsZXMvQG9wZW4tZHJhZnQvdW50aWwvc3JjL3VudGlsLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9pc09iamVjdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvdXRpbHMvaXNQcm9wZXJ0eUFjY2Vzc2libGUudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL3Jlc3BvbnNlVXRpbHMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2hhbmRsZVJlcXVlc3QudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2lzTm9kZUxpa2VFcnJvci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL2ZldGNoL2luZGV4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvZmV0Y2gvdXRpbHMvY3JlYXRlTmV0d29ya0Vycm9yLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvZmV0Y2gvdXRpbHMvZm9sbG93UmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2ludGVyY2VwdG9ycy9mZXRjaC91dGlscy9icm90bGktZGVjb21wcmVzcy5icm93c2VyLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvZmV0Y2gvdXRpbHMvZGVjb21wcmVzc2lvbi50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1hNTEh0dHBSZXF1ZXN0L2luZGV4LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvWE1MSHR0cFJlcXVlc3QvWE1MSHR0cFJlcXVlc3RDb250cm9sbGVyLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvWE1MSHR0cFJlcXVlc3QvdXRpbHMvY29uY2F0QXJyYXlCdWZmZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2ludGVyY2VwdG9ycy9YTUxIdHRwUmVxdWVzdC9wb2x5ZmlsbHMvRXZlbnRQb2x5ZmlsbC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1hNTEh0dHBSZXF1ZXN0L3BvbHlmaWxscy9Qcm9ncmVzc0V2ZW50UG9seWZpbGwudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2ludGVyY2VwdG9ycy9YTUxIdHRwUmVxdWVzdC91dGlscy9jcmVhdGVFdmVudC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvdXRpbHMvZmluZFByb3BlcnR5U291cmNlLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy91dGlscy9jcmVhdGVQcm94eS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1hNTEh0dHBSZXF1ZXN0L3V0aWxzL2lzRG9tUGFyc2VyU3VwcG9ydGVkVHlwZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvdXRpbHMvcGFyc2VKc29uLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbm9kZV9tb2R1bGVzLy5wbnBtL0Btc3dqcytpbnRlcmNlcHRvcnNAMC40MC4wL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9pbnRlcmNlcHRvcnMvWE1MSHR0cFJlcXVlc3QvdXRpbHMvY3JlYXRlUmVzcG9uc2UudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9ub2RlX21vZHVsZXMvLnBucG0vQG1zd2pzK2ludGVyY2VwdG9yc0AwLjQwLjAvbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2ludGVyY2VwdG9ycy9YTUxIdHRwUmVxdWVzdC91dGlscy9nZXRCb2R5Qnl0ZUxlbmd0aC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L25vZGVfbW9kdWxlcy8ucG5wbS9AbXN3anMraW50ZXJjZXB0b3JzQDAuNDAuMC9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvaW50ZXJjZXB0b3JzL1hNTEh0dHBSZXF1ZXN0L1hNTEh0dHBSZXF1ZXN0UHJveHkudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvYnJvd3Nlci9zZXR1cFdvcmtlci9zdGFydC9jcmVhdGVGYWxsYmFja1JlcXVlc3RMaXN0ZW5lci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9icm93c2VyL3NldHVwV29ya2VyL3N0b3AvdXRpbHMvcHJpbnRTdG9wTWVzc2FnZS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2ludGVybmFsL2NoZWNrR2xvYmFscy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2ludGVybmFsL2lzU3RyaW5nRXF1YWwudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9sb2dnaW5nL2dldFN0YXR1c0NvZGVDb2xvci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2xvZ2dpbmcvc2VyaWFsaXplUmVxdWVzdC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbXN3L3NyYy9jb3JlL3V0aWxzL2xvZ2dpbmcvc2VyaWFsaXplUmVzcG9uc2UudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGgtdG8tcmVnZXhwL3NyYy9pbmRleC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvdXRpbHMvYnVmZmVyVXRpbHMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2dsb3NzYXJ5LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AbXN3anMvaW50ZXJjZXB0b3JzL3NyYy9SZXF1ZXN0Q29udHJvbGxlci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvSW50ZXJjZXB0b3JFcnJvci50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQG1zd2pzL2ludGVyY2VwdG9ycy9zcmMvdXRpbHMvY2FuUGFyc2VVcmwudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2dldFZhbHVlQnlTeW1ib2wudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2ZldGNoVXRpbHMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL2dldFJhd1JlcXVlc3QudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL0JhdGNoSW50ZXJjZXB0b3IudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Btc3dqcy9pbnRlcmNlcHRvcnMvc3JjL3V0aWxzL2dldENsZWFuVXJsLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvdXJsL2NsZWFuVXJsLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvdXJsL2lzQWJzb2x1dGVVcmwudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy91cmwvZ2V0QWJzb2x1dGVVcmwudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9tYXRjaGluZy9ub3JtYWxpemVQYXRoLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvdXRpbHMvbWF0Y2hpbmcvbWF0Y2hSZXF1ZXN0VXJsLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvbGliL3NoaW1zL2Nvb2tpZS5tanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS91dGlscy9yZXF1ZXN0L2dldFJlcXVlc3RDb29raWVzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvaGFuZGxlcnMvSHR0cEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21zdy9zcmMvY29yZS9odHRwLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvSHR0cFJlc3BvbnNlLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9tc3cvc3JjL2NvcmUvaW5kZXgudHMiLCAiLi4vLi4vYXBpLWtleS1tYW5hZ2VtZW50L2FwaS9tb2NraW5nL3N0YXRlLnRzIiwgIi4uLy4uL2FwaS1rZXktbWFuYWdlbWVudC9hcGkvbW9ja2luZy9oYW5kbGVycy50cyIsICIuLi8uLi9hcGkta2V5LW1hbmFnZW1lbnQvYXBpL21vY2tpbmcvYnJvd3Nlci50cyIsICIuLi8uLi9hcGkta2V5LW1hbmFnZW1lbnQvYXBpLWtleS1tYW5hZ2VtZW50LmVudHJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBzZXR0aW5ncyAmIGNvbnN0XG5jb25zdCBQQVRIX1BBUkFNX1JFID0gL1xce1tee31dK1xcfS9nO1xuXG5jb25zdCBzdXBwb3J0c1JlcXVlc3RJbml0RXh0ID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmXG4gICAgTnVtYmVyLnBhcnNlSW50KHByb2Nlc3M/LnZlcnNpb25zPy5ub2RlPy5zdWJzdHJpbmcoMCwgMikpID49IDE4ICYmXG4gICAgcHJvY2Vzcy52ZXJzaW9ucy51bmRpY2lcbiAgKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGNoZWFwLCBub24tY3J5cHRvZ3JhcGhpY2FsbHktc2VjdXJlIHJhbmRvbSBJRFxuICogQ291cnRlc3kgb2YgQGltcmFuYmFyYmh1aXlhIChodHRwczovL2dpdGh1Yi5jb20vaW1yYW5iYXJiaHVpeWEpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21JRCgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDExKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gb3BlbmFwaS1mZXRjaCBjbGllbnQuXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVDbGllbnQoY2xpZW50T3B0aW9ucykge1xuICBsZXQge1xuICAgIGJhc2VVcmwgPSBcIlwiLFxuICAgIFJlcXVlc3Q6IEN1c3RvbVJlcXVlc3QgPSBnbG9iYWxUaGlzLlJlcXVlc3QsXG4gICAgZmV0Y2g6IGJhc2VGZXRjaCA9IGdsb2JhbFRoaXMuZmV0Y2gsXG4gICAgcXVlcnlTZXJpYWxpemVyOiBnbG9iYWxRdWVyeVNlcmlhbGl6ZXIsXG4gICAgYm9keVNlcmlhbGl6ZXI6IGdsb2JhbEJvZHlTZXJpYWxpemVyLFxuICAgIGhlYWRlcnM6IGJhc2VIZWFkZXJzLFxuICAgIHJlcXVlc3RJbml0RXh0ID0gdW5kZWZpbmVkLFxuICAgIC4uLmJhc2VPcHRpb25zXG4gIH0gPSB7IC4uLmNsaWVudE9wdGlvbnMgfTtcbiAgcmVxdWVzdEluaXRFeHQgPSBzdXBwb3J0c1JlcXVlc3RJbml0RXh0KCkgPyByZXF1ZXN0SW5pdEV4dCA6IHVuZGVmaW5lZDtcbiAgYmFzZVVybCA9IHJlbW92ZVRyYWlsaW5nU2xhc2goYmFzZVVybCk7XG4gIGNvbnN0IGdsb2JhbE1pZGRsZXdhcmVzID0gW107XG5cbiAgLyoqXG4gICAqIFBlci1yZXF1ZXN0IGZldGNoIChrZWVwcyBzZXR0aW5ncyBjcmVhdGVkIGluIGNyZWF0ZUNsaWVudCgpXG4gICAqIEBwYXJhbSB7VH0gdXJsXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4LmpzJykuRmV0Y2hPcHRpb25zPFQ+fSBmZXRjaE9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGNvcmVGZXRjaChzY2hlbWFQYXRoLCBmZXRjaE9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBiYXNlVXJsOiBsb2NhbEJhc2VVcmwsXG4gICAgICBmZXRjaCA9IGJhc2VGZXRjaCxcbiAgICAgIFJlcXVlc3QgPSBDdXN0b21SZXF1ZXN0LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHBhcmFtcyA9IHt9LFxuICAgICAgcGFyc2VBcyA9IFwianNvblwiLFxuICAgICAgcXVlcnlTZXJpYWxpemVyOiByZXF1ZXN0UXVlcnlTZXJpYWxpemVyLFxuICAgICAgYm9keVNlcmlhbGl6ZXIgPSBnbG9iYWxCb2R5U2VyaWFsaXplciA/PyBkZWZhdWx0Qm9keVNlcmlhbGl6ZXIsXG4gICAgICBib2R5LFxuICAgICAgbWlkZGxld2FyZTogcmVxdWVzdE1pZGRsZXdhcmVzID0gW10sXG4gICAgICAuLi5pbml0XG4gICAgfSA9IGZldGNoT3B0aW9ucyB8fCB7fTtcbiAgICBsZXQgZmluYWxCYXNlVXJsID0gYmFzZVVybDtcbiAgICBpZiAobG9jYWxCYXNlVXJsKSB7XG4gICAgICBmaW5hbEJhc2VVcmwgPSByZW1vdmVUcmFpbGluZ1NsYXNoKGxvY2FsQmFzZVVybCkgPz8gYmFzZVVybDtcbiAgICB9XG5cbiAgICBsZXQgcXVlcnlTZXJpYWxpemVyID1cbiAgICAgIHR5cGVvZiBnbG9iYWxRdWVyeVNlcmlhbGl6ZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGdsb2JhbFF1ZXJ5U2VyaWFsaXplclxuICAgICAgICA6IGNyZWF0ZVF1ZXJ5U2VyaWFsaXplcihnbG9iYWxRdWVyeVNlcmlhbGl6ZXIpO1xuICAgIGlmIChyZXF1ZXN0UXVlcnlTZXJpYWxpemVyKSB7XG4gICAgICBxdWVyeVNlcmlhbGl6ZXIgPVxuICAgICAgICB0eXBlb2YgcmVxdWVzdFF1ZXJ5U2VyaWFsaXplciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyByZXF1ZXN0UXVlcnlTZXJpYWxpemVyXG4gICAgICAgICAgOiBjcmVhdGVRdWVyeVNlcmlhbGl6ZXIoe1xuICAgICAgICAgICAgICAuLi4odHlwZW9mIGdsb2JhbFF1ZXJ5U2VyaWFsaXplciA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbFF1ZXJ5U2VyaWFsaXplciA6IHt9KSxcbiAgICAgICAgICAgICAgLi4ucmVxdWVzdFF1ZXJ5U2VyaWFsaXplcixcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCb2R5ID1cbiAgICAgIGJvZHkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGJvZHlTZXJpYWxpemVyKFxuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIC8vIE5vdGU6IHdlIGRlY2xhcmUgbWVyZ2VIZWFkZXJzKCkgYm90aCBoZXJlIGFuZCBiZWxvdyBiZWNhdXNlIGl04oCZcyBhIGJpdCBvZiBhIGNoaWNrZW4tb3ItZWdnIHNpdHVhdGlvbjpcbiAgICAgICAgICAgIC8vIGJvZHlTZXJpYWxpemVyKCkgbmVlZHMgYWxsIGhlYWRlcnMgc28gd2UgYXJlbuKAmXQgZHJvcHBpbmcgb25lcyBzZXQgYnkgdGhlIHVzZXIsIGhvd2V2ZXIsXG4gICAgICAgICAgICAvLyB0aGUgcmVzdWx0IG9mIHRoaXMgQUxTTyBzZXRzIHRoZSBsb3dlc3QtcHJpb3JpdHkgY29udGVudC10eXBlIGhlYWRlci4gU28gd2UgcmUtbWVyZ2UgYmVsb3csXG4gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBjb250ZW50LXR5cGUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIHRvIGJlIG92ZXJ3cml0dGVuLlxuICAgICAgICAgICAgLy8gTGFzdGx5LCBiYXNlZCBvbiB0aGUgd2F5IGhlYWRlcnMgd29yaywgaXTigJlzIG5vdCBhIHNpbXBsZcKg4oCccHJlc2VudC1vci1ub3TigJ0gY2hlY2sgYmVjYXVhc2UgbnVsbCBpbnRlbnRpb25hbGx5IHVuLXNldHMgaGVhZGVycy5cbiAgICAgICAgICAgIG1lcmdlSGVhZGVycyhiYXNlSGVhZGVycywgaGVhZGVycywgcGFyYW1zLmhlYWRlciksXG4gICAgICAgICAgKTtcbiAgICBjb25zdCBmaW5hbEhlYWRlcnMgPSBtZXJnZUhlYWRlcnMoXG4gICAgICAvLyB3aXRoIG5vIGJvZHksIHdlIHNob3VsZCBub3QgdG8gc2V0IENvbnRlbnQtVHlwZVxuICAgICAgc2VyaWFsaXplZEJvZHkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAvLyBpZiBzZXJpYWxpemVkIGJvZHkgaXMgRm9ybURhdGE7IGJyb3dzZXIgd2lsbCBjb3JyZWN0bHkgc2V0IENvbnRlbnQtVHlwZSAmIGJvdW5kYXJ5IGV4cHJlc3Npb25cbiAgICAgICAgc2VyaWFsaXplZEJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YVxuICAgICAgICA/IHt9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgfSxcbiAgICAgIGJhc2VIZWFkZXJzLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHBhcmFtcy5oZWFkZXIsXG4gICAgKTtcblxuICAgIC8vIENsaWVudCBsZXZlbCBtaWRkbGV3YXJlIHRha2UgcHJpb3JpdHkgb3ZlciByZXF1ZXN0LWxldmVsIG1pZGRsZXdhcmVcbiAgICBjb25zdCBmaW5hbE1pZGRsZXdhcmVzID0gWy4uLmdsb2JhbE1pZGRsZXdhcmVzLCAuLi5yZXF1ZXN0TWlkZGxld2FyZXNdO1xuXG4gICAgY29uc3QgcmVxdWVzdEluaXQgPSB7XG4gICAgICByZWRpcmVjdDogXCJmb2xsb3dcIixcbiAgICAgIC4uLmJhc2VPcHRpb25zLFxuICAgICAgLi4uaW5pdCxcbiAgICAgIGJvZHk6IHNlcmlhbGl6ZWRCb2R5LFxuICAgICAgaGVhZGVyczogZmluYWxIZWFkZXJzLFxuICAgIH07XG5cbiAgICBsZXQgaWQ7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgIGNyZWF0ZUZpbmFsVVJMKHNjaGVtYVBhdGgsIHsgYmFzZVVybDogZmluYWxCYXNlVXJsLCBwYXJhbXMsIHF1ZXJ5U2VyaWFsaXplciB9KSxcbiAgICAgIHJlcXVlc3RJbml0LFxuICAgICk7XG4gICAgbGV0IHJlc3BvbnNlO1xuXG4gICAgLyoqIEFkZCBjdXN0b20gcGFyYW1ldGVycyB0byBSZXF1ZXN0IG9iamVjdCAqL1xuICAgIGZvciAoY29uc3Qga2V5IGluIGluaXQpIHtcbiAgICAgIGlmICghKGtleSBpbiByZXF1ZXN0KSkge1xuICAgICAgICByZXF1ZXN0W2tleV0gPSBpbml0W2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZpbmFsTWlkZGxld2FyZXMubGVuZ3RoKSB7XG4gICAgICBpZCA9IHJhbmRvbUlEKCk7XG5cbiAgICAgIC8vIG1pZGRsZXdhcmUgKHJlcXVlc3QpXG4gICAgICBvcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGJhc2VVcmw6IGZpbmFsQmFzZVVybCxcbiAgICAgICAgZmV0Y2gsXG4gICAgICAgIHBhcnNlQXMsXG4gICAgICAgIHF1ZXJ5U2VyaWFsaXplcixcbiAgICAgICAgYm9keVNlcmlhbGl6ZXIsXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgbSBvZiBmaW5hbE1pZGRsZXdhcmVzKSB7XG4gICAgICAgIGlmIChtICYmIHR5cGVvZiBtID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtLm9uUmVxdWVzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbS5vblJlcXVlc3Qoe1xuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHNjaGVtYVBhdGgsXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgcmVxdWVzdCA9IHJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib25SZXF1ZXN0OiBtdXN0IHJldHVybiBuZXcgUmVxdWVzdCgpIG9yIFJlc3BvbnNlKCkgd2hlbiBtb2RpZnlpbmcgdGhlIHJlcXVlc3RcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgLy8gZmV0Y2ghXG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QsIHJlcXVlc3RJbml0RXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxldCBlcnJvckFmdGVyTWlkZGxld2FyZSA9IGVycm9yO1xuICAgICAgICAvLyBtaWRkbGV3YXJlIChlcnJvcilcbiAgICAgICAgLy8gZXhlY3V0ZSBpbiByZXZlcnNlLWFycmF5IG9yZGVyIChmaXJzdCBwcmlvcml0eSBnZXRzIGxhc3QgdHJhbnNmb3JtKVxuICAgICAgICBpZiAoZmluYWxNaWRkbGV3YXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gZmluYWxNaWRkbGV3YXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgbSA9IGZpbmFsTWlkZGxld2FyZXNbaV07XG4gICAgICAgICAgICBpZiAobSAmJiB0eXBlb2YgbSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbS5vbkVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbS5vbkVycm9yKHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvckFmdGVyTWlkZGxld2FyZSxcbiAgICAgICAgICAgICAgICBzY2hlbWFQYXRoLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIGlzIGhhbmRsZWQgYnkgcmV0dXJuaW5nIGEgcmVzcG9uc2UsIHNraXAgcmVtYWluaW5nIG1pZGRsZXdhcmVcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yQWZ0ZXJNaWRkbGV3YXJlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yQWZ0ZXJNaWRkbGV3YXJlID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib25FcnJvcjogbXVzdCByZXR1cm4gbmV3IFJlc3BvbnNlKCkgb3IgaW5zdGFuY2Ugb2YgRXJyb3JcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXRocm93IGVycm9yIGlmIG5vdCBoYW5kbGVkIGJ5IG1pZGRsZXdhcmVcbiAgICAgICAgaWYgKGVycm9yQWZ0ZXJNaWRkbGV3YXJlKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JBZnRlck1pZGRsZXdhcmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbWlkZGxld2FyZSAocmVzcG9uc2UpXG4gICAgICAvLyBleGVjdXRlIGluIHJldmVyc2UtYXJyYXkgb3JkZXIgKGZpcnN0IHByaW9yaXR5IGdldHMgbGFzdCB0cmFuc2Zvcm0pXG4gICAgICBpZiAoZmluYWxNaWRkbGV3YXJlcy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZpbmFsTWlkZGxld2FyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBtID0gZmluYWxNaWRkbGV3YXJlc1tpXTtcbiAgICAgICAgICBpZiAobSAmJiB0eXBlb2YgbSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbS5vblJlc3BvbnNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG0ub25SZXNwb25zZSh7XG4gICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICBzY2hlbWFQYXRoLFxuICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9uUmVzcG9uc2U6IG11c3QgcmV0dXJuIG5ldyBSZXNwb25zZSgpIHdoZW4gbW9kaWZ5aW5nIHRoZSByZXNwb25zZVwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNwb25zZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgZW1wdHkgY29udGVudFxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJIRUFEXCIgfHwgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LUxlbmd0aFwiKSA9PT0gXCIwXCIpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5vayA/IHsgZGF0YTogdW5kZWZpbmVkLCByZXNwb25zZSB9IDogeyBlcnJvcjogdW5kZWZpbmVkLCByZXNwb25zZSB9O1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHJlc3BvbnNlIChmYWxsaW5nIGJhY2sgdG8gLnRleHQoKSB3aGVuIG5lY2Vzc2FyeSlcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIGlmIFwic3RyZWFtXCIsIHNraXAgcGFyc2luZyBlbnRpcmVseVxuICAgICAgaWYgKHBhcnNlQXMgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzcG9uc2UuYm9keSwgcmVzcG9uc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IGF3YWl0IHJlc3BvbnNlW3BhcnNlQXNdKCksIHJlc3BvbnNlIH07XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGVycm9yc1xuICAgIGxldCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICB0cnkge1xuICAgICAgZXJyb3IgPSBKU09OLnBhcnNlKGVycm9yKTsgLy8gYXR0ZW1wdCB0byBwYXJzZSBhcyBKU09OXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICAgIHJldHVybiB7IGVycm9yLCByZXNwb25zZSB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0KG1ldGhvZCwgdXJsLCBpbml0KSB7XG4gICAgICByZXR1cm4gY29yZUZldGNoKHVybCwgeyAuLi5pbml0LCBtZXRob2Q6IG1ldGhvZC50b1VwcGVyQ2FzZSgpIH0pO1xuICAgIH0sXG4gICAgLyoqIENhbGwgYSBHRVQgZW5kcG9pbnQgKi9cbiAgICBHRVQodXJsLCBpbml0KSB7XG4gICAgICByZXR1cm4gY29yZUZldGNoKHVybCwgeyAuLi5pbml0LCBtZXRob2Q6IFwiR0VUXCIgfSk7XG4gICAgfSxcbiAgICAvKiogQ2FsbCBhIFBVVCBlbmRwb2ludCAqL1xuICAgIFBVVCh1cmwsIGluaXQpIHtcbiAgICAgIHJldHVybiBjb3JlRmV0Y2godXJsLCB7IC4uLmluaXQsIG1ldGhvZDogXCJQVVRcIiB9KTtcbiAgICB9LFxuICAgIC8qKiBDYWxsIGEgUE9TVCBlbmRwb2ludCAqL1xuICAgIFBPU1QodXJsLCBpbml0KSB7XG4gICAgICByZXR1cm4gY29yZUZldGNoKHVybCwgeyAuLi5pbml0LCBtZXRob2Q6IFwiUE9TVFwiIH0pO1xuICAgIH0sXG4gICAgLyoqIENhbGwgYSBERUxFVEUgZW5kcG9pbnQgKi9cbiAgICBERUxFVEUodXJsLCBpbml0KSB7XG4gICAgICByZXR1cm4gY29yZUZldGNoKHVybCwgeyAuLi5pbml0LCBtZXRob2Q6IFwiREVMRVRFXCIgfSk7XG4gICAgfSxcbiAgICAvKiogQ2FsbCBhIE9QVElPTlMgZW5kcG9pbnQgKi9cbiAgICBPUFRJT05TKHVybCwgaW5pdCkge1xuICAgICAgcmV0dXJuIGNvcmVGZXRjaCh1cmwsIHsgLi4uaW5pdCwgbWV0aG9kOiBcIk9QVElPTlNcIiB9KTtcbiAgICB9LFxuICAgIC8qKiBDYWxsIGEgSEVBRCBlbmRwb2ludCAqL1xuICAgIEhFQUQodXJsLCBpbml0KSB7XG4gICAgICByZXR1cm4gY29yZUZldGNoKHVybCwgeyAuLi5pbml0LCBtZXRob2Q6IFwiSEVBRFwiIH0pO1xuICAgIH0sXG4gICAgLyoqIENhbGwgYSBQQVRDSCBlbmRwb2ludCAqL1xuICAgIFBBVENIKHVybCwgaW5pdCkge1xuICAgICAgcmV0dXJuIGNvcmVGZXRjaCh1cmwsIHsgLi4uaW5pdCwgbWV0aG9kOiBcIlBBVENIXCIgfSk7XG4gICAgfSxcbiAgICAvKiogQ2FsbCBhIFRSQUNFIGVuZHBvaW50ICovXG4gICAgVFJBQ0UodXJsLCBpbml0KSB7XG4gICAgICByZXR1cm4gY29yZUZldGNoKHVybCwgeyAuLi5pbml0LCBtZXRob2Q6IFwiVFJBQ0VcIiB9KTtcbiAgICB9LFxuICAgIC8qKiBSZWdpc3RlciBtaWRkbGV3YXJlICovXG4gICAgdXNlKC4uLm1pZGRsZXdhcmUpIHtcbiAgICAgIGZvciAoY29uc3QgbSBvZiBtaWRkbGV3YXJlKSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbSAhPT0gXCJvYmplY3RcIiB8fCAhKFwib25SZXF1ZXN0XCIgaW4gbSB8fCBcIm9uUmVzcG9uc2VcIiBpbiBtIHx8IFwib25FcnJvclwiIGluIG0pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlkZGxld2FyZSBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIG9uZSBvZiBgb25SZXF1ZXN0KClgLCBgb25SZXNwb25zZSgpIG9yIGBvbkVycm9yKClgXCIpO1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbE1pZGRsZXdhcmVzLnB1c2gobSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvKiogVW5yZWdpc3RlciBtaWRkbGV3YXJlICovXG4gICAgZWplY3QoLi4ubWlkZGxld2FyZSkge1xuICAgICAgZm9yIChjb25zdCBtIG9mIG1pZGRsZXdhcmUpIHtcbiAgICAgICAgY29uc3QgaSA9IGdsb2JhbE1pZGRsZXdhcmVzLmluZGV4T2YobSk7XG4gICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgIGdsb2JhbE1pZGRsZXdhcmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmNsYXNzIFBhdGhDYWxsRm9yd2FyZGVyIHtcbiAgY29uc3RydWN0b3IoY2xpZW50LCB1cmwpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuXG4gIEdFVCA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LkdFVCh0aGlzLnVybCwgaW5pdCk7XG4gIH07XG4gIFBVVCA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LlBVVCh0aGlzLnVybCwgaW5pdCk7XG4gIH07XG4gIFBPU1QgPSAoaW5pdCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5QT1NUKHRoaXMudXJsLCBpbml0KTtcbiAgfTtcbiAgREVMRVRFID0gKGluaXQpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuREVMRVRFKHRoaXMudXJsLCBpbml0KTtcbiAgfTtcbiAgT1BUSU9OUyA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lk9QVElPTlModGhpcy51cmwsIGluaXQpO1xuICB9O1xuICBIRUFEID0gKGluaXQpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuSEVBRCh0aGlzLnVybCwgaW5pdCk7XG4gIH07XG4gIFBBVENIID0gKGluaXQpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuUEFUQ0godGhpcy51cmwsIGluaXQpO1xuICB9O1xuICBUUkFDRSA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LlRSQUNFKHRoaXMudXJsLCBpbml0KTtcbiAgfTtcbn1cblxuY2xhc3MgUGF0aENsaWVudFByb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2xpZW50ID0gbnVsbDtcbiAgfVxuXG4gIC8vIEFzc3VtZSB0aGUgcHJvcGVydHkgaXMgYW4gVVJMLlxuICBnZXQoY29yZUNsaWVudCwgdXJsKSB7XG4gICAgY29uc3QgZm9yd2FyZGVyID0gbmV3IFBhdGhDYWxsRm9yd2FyZGVyKGNvcmVDbGllbnQsIHVybCk7XG4gICAgdGhpcy5jbGllbnRbdXJsXSA9IGZvcndhcmRlcjtcbiAgICByZXR1cm4gZm9yd2FyZGVyO1xuICB9XG59XG5cbi8qKlxuICogV3JhcCBvcGVuYXBpLWZldGNoIGNsaWVudCB0byBzdXBwb3J0IGEgcGF0aCBiYXNlZCBBUEkuXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS53cmFwQXNQYXRoQmFzZWRDbGllbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwQXNQYXRoQmFzZWRDbGllbnQoY29yZUNsaWVudCkge1xuICBjb25zdCBoYW5kbGVyID0gbmV3IFBhdGhDbGllbnRQcm94eUhhbmRsZXIoKTtcbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoY29yZUNsaWVudCwgaGFuZGxlcik7XG5cbiAgLy8gUHV0IHRoZSBwcm94eSBvbiB0aGUgcHJvdG90eXBlIGNoYWluIG9mIHRoZSBhY3R1YWwgY2xpZW50LlxuICAvLyBUaGlzIG1lYW5zIGlmIHdlIGRvIG5vdCBoYXZlIGEgbWVtb2l6ZWQgUGF0aENhbGxGb3J3YXJkZXIsXG4gIC8vIHdlIGZhbGwgYmFjayB0byB0aGUgcHJveHkgdG8gc3ludGhlc2l6ZSBpdC5cbiAgLy8gSG93ZXZlciwgdGhlIHByb3h5IGl0c2VsZiBpcyBub3Qgb24gdGhlIGhvdC1wYXRoIChpZiB3ZSBmZXRjaCB0aGUgc2FtZVxuICAvLyBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgZmlyc3QgY2FsbCB3aWxsIGhpdCB0aGUgcHJveHkpLlxuICBmdW5jdGlvbiBDbGllbnQoKSB7fVxuICBDbGllbnQucHJvdG90eXBlID0gcHJveHk7XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudCgpO1xuXG4gIC8vIEZlZWQgdGhlIGNsaWVudCBiYWNrIHRvIHRoZSBwcm94eSBoYW5kbGVyIHNvIGl0IGNhbiBzdG9yZSB0aGUgZ2VuZXJhdGVkXG4gIC8vIFBhdGhDYWxsRm9yd2FyZGVyLlxuICBoYW5kbGVyLmNsaWVudCA9IGNsaWVudDtcblxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhbiBvcGVuYXBpLWZldGNoIHBhdGggYmFzZWQgY2xpZW50LlxuICogU3RyaWN0bHkgZXF1aXZhbGVudCB0byBgd3JhcEFzUGF0aEJhc2VkQ2xpZW50KGNyZWF0ZUNsaWVudCguLi4pKWAuXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5jcmVhdGVQYXRoQmFzZWRDbGllbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoQmFzZWRDbGllbnQoY2xpZW50T3B0aW9ucykge1xuICByZXR1cm4gd3JhcEFzUGF0aEJhc2VkQ2xpZW50KGNyZWF0ZUNsaWVudChjbGllbnRPcHRpb25zKSk7XG59XG5cbi8vIHV0aWxzXG5cbi8qKlxuICogU2VyaWFsaXplIHByaW1pdGl2ZSBwYXJhbSB2YWx1ZXNcbiAqIEB0eXBlIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLnNlcmlhbGl6ZVByaW1pdGl2ZVBhcmFtfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUHJpbWl0aXZlUGFyYW0obmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJEZWVwbHktbmVzdGVkIGFycmF5cy9vYmplY3RzIGFyZW7igJl0IHN1cHBvcnRlZC4gUHJvdmlkZSB5b3VyIG93biBgcXVlcnlTZXJpYWxpemVyKClgIHRvIGhhbmRsZSB0aGVzZS5cIixcbiAgICApO1xuICB9XG4gIHJldHVybiBgJHtuYW1lfT0ke29wdGlvbnM/LmFsbG93UmVzZXJ2ZWQgPT09IHRydWUgPyB2YWx1ZSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgb2JqZWN0IHBhcmFtIChzaGFsbG93IG9ubHkpXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5zZXJpYWxpemVPYmplY3RQYXJhbX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdFBhcmFtKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgY29uc3QgdmFsdWVzID0gW107XG4gIGNvbnN0IGpvaW5lciA9XG4gICAge1xuICAgICAgc2ltcGxlOiBcIixcIixcbiAgICAgIGxhYmVsOiBcIi5cIixcbiAgICAgIG1hdHJpeDogXCI7XCIsXG4gICAgfVtvcHRpb25zLnN0eWxlXSB8fCBcIiZcIjtcblxuICAvLyBleHBsb2RlOiBmYWxzZVxuICBpZiAob3B0aW9ucy5zdHlsZSAhPT0gXCJkZWVwT2JqZWN0XCIgJiYgb3B0aW9ucy5leHBsb2RlID09PSBmYWxzZSkge1xuICAgIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgICAgdmFsdWVzLnB1c2goaywgb3B0aW9ucy5hbGxvd1Jlc2VydmVkID09PSB0cnVlID8gdmFsdWVba10gOiBlbmNvZGVVUklDb21wb25lbnQodmFsdWVba10pKTtcbiAgICB9XG4gICAgY29uc3QgZmluYWwgPSB2YWx1ZXMuam9pbihcIixcIik7IC8vIG5vdGU6IHZhbHVlcyBhcmUgYWx3YXlzIGpvaW5lZCBieSBjb21tYSBpbiBleHBsb2RlOiBmYWxzZSAoYnV0IGpvaW5lciBjYW4gcHJlZml4KVxuICAgIHN3aXRjaCAob3B0aW9ucy5zdHlsZSkge1xuICAgICAgY2FzZSBcImZvcm1cIjoge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX09JHtmaW5hbH1gO1xuICAgICAgfVxuICAgICAgY2FzZSBcImxhYmVsXCI6IHtcbiAgICAgICAgcmV0dXJuIGAuJHtmaW5hbH1gO1xuICAgICAgfVxuICAgICAgY2FzZSBcIm1hdHJpeFwiOiB7XG4gICAgICAgIHJldHVybiBgOyR7bmFtZX09JHtmaW5hbH1gO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZXhwbG9kZTogdHJ1ZVxuICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICBjb25zdCBmaW5hbE5hbWUgPSBvcHRpb25zLnN0eWxlID09PSBcImRlZXBPYmplY3RcIiA/IGAke25hbWV9WyR7a31dYCA6IGs7XG4gICAgdmFsdWVzLnB1c2goc2VyaWFsaXplUHJpbWl0aXZlUGFyYW0oZmluYWxOYW1lLCB2YWx1ZVtrXSwgb3B0aW9ucykpO1xuICB9XG4gIGNvbnN0IGZpbmFsID0gdmFsdWVzLmpvaW4oam9pbmVyKTtcbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGUgPT09IFwibGFiZWxcIiB8fCBvcHRpb25zLnN0eWxlID09PSBcIm1hdHJpeFwiID8gYCR7am9pbmVyfSR7ZmluYWx9YCA6IGZpbmFsO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhcnJheSBwYXJhbSAoc2hhbGxvdyBvbmx5KVxuICogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuc2VyaWFsaXplQXJyYXlQYXJhbX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFycmF5UGFyYW0obmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgLy8gZXhwbG9kZTogZmFsc2VcbiAgaWYgKG9wdGlvbnMuZXhwbG9kZSA9PT0gZmFsc2UpIHtcbiAgICBjb25zdCBqb2luZXIgPSB7IGZvcm06IFwiLFwiLCBzcGFjZURlbGltaXRlZDogXCIlMjBcIiwgcGlwZURlbGltaXRlZDogXCJ8XCIgfVtvcHRpb25zLnN0eWxlXSB8fCBcIixcIjsgLy8gbm90ZTogZm9yIGFycmF5cywgam9pbmVycyB2YXJ5IHdpbGRseSBiYXNlZCBvbiBzdHlsZSArIGV4cGxvZGUgYmVoYXZpb3JcbiAgICBjb25zdCBmaW5hbCA9IChvcHRpb25zLmFsbG93UmVzZXJ2ZWQgPT09IHRydWUgPyB2YWx1ZSA6IHZhbHVlLm1hcCgodikgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHYpKSkuam9pbihqb2luZXIpO1xuICAgIHN3aXRjaCAob3B0aW9ucy5zdHlsZSkge1xuICAgICAgY2FzZSBcInNpbXBsZVwiOiB7XG4gICAgICAgIHJldHVybiBmaW5hbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJsYWJlbFwiOiB7XG4gICAgICAgIHJldHVybiBgLiR7ZmluYWx9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJtYXRyaXhcIjoge1xuICAgICAgICByZXR1cm4gYDske25hbWV9PSR7ZmluYWx9YDtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2UgXCJzcGFjZURlbGltaXRlZFwiOlxuICAgICAgLy8gY2FzZSBcInBpcGVEZWxpbWl0ZWRcIjpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9PSR7ZmluYWx9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBleHBsb2RlOiB0cnVlXG4gIGNvbnN0IGpvaW5lciA9IHsgc2ltcGxlOiBcIixcIiwgbGFiZWw6IFwiLlwiLCBtYXRyaXg6IFwiO1wiIH1bb3B0aW9ucy5zdHlsZV0gfHwgXCImXCI7XG4gIGNvbnN0IHZhbHVlcyA9IFtdO1xuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICBpZiAob3B0aW9ucy5zdHlsZSA9PT0gXCJzaW1wbGVcIiB8fCBvcHRpb25zLnN0eWxlID09PSBcImxhYmVsXCIpIHtcbiAgICAgIHZhbHVlcy5wdXNoKG9wdGlvbnMuYWxsb3dSZXNlcnZlZCA9PT0gdHJ1ZSA/IHYgOiBlbmNvZGVVUklDb21wb25lbnQodikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZXMucHVzaChzZXJpYWxpemVQcmltaXRpdmVQYXJhbShuYW1lLCB2LCBvcHRpb25zKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zLnN0eWxlID09PSBcImxhYmVsXCIgfHwgb3B0aW9ucy5zdHlsZSA9PT0gXCJtYXRyaXhcIlxuICAgID8gYCR7am9pbmVyfSR7dmFsdWVzLmpvaW4oam9pbmVyKX1gXG4gICAgOiB2YWx1ZXMuam9pbihqb2luZXIpO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBxdWVyeSBwYXJhbXMgdG8gc3RyaW5nXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5jcmVhdGVRdWVyeVNlcmlhbGl6ZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWVyeVNlcmlhbGl6ZXIob3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gcXVlcnlTZXJpYWxpemVyKHF1ZXJ5UGFyYW1zKSB7XG4gICAgY29uc3Qgc2VhcmNoID0gW107XG4gICAgaWYgKHF1ZXJ5UGFyYW1zICYmIHR5cGVvZiBxdWVyeVBhcmFtcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcXVlcnlQYXJhbXNbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlYXJjaC5wdXNoKFxuICAgICAgICAgICAgc2VyaWFsaXplQXJyYXlQYXJhbShuYW1lLCB2YWx1ZSwge1xuICAgICAgICAgICAgICBzdHlsZTogXCJmb3JtXCIsXG4gICAgICAgICAgICAgIGV4cGxvZGU6IHRydWUsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnM/LmFycmF5LFxuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkOiBvcHRpb25zPy5hbGxvd1Jlc2VydmVkIHx8IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc2VhcmNoLnB1c2goXG4gICAgICAgICAgICBzZXJpYWxpemVPYmplY3RQYXJhbShuYW1lLCB2YWx1ZSwge1xuICAgICAgICAgICAgICBzdHlsZTogXCJkZWVwT2JqZWN0XCIsXG4gICAgICAgICAgICAgIGV4cGxvZGU6IHRydWUsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnM/Lm9iamVjdCxcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZDogb3B0aW9ucz8uYWxsb3dSZXNlcnZlZCB8fCBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2VhcmNoLnB1c2goc2VyaWFsaXplUHJpbWl0aXZlUGFyYW0obmFtZSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlYXJjaC5qb2luKFwiJlwiKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgZGlmZmVyZW50IE9wZW5BUEkgMy54IHNlcmlhbGl6YXRpb24gc3R5bGVzXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0UGF0aFNlcmlhbGl6ZXJ9XG4gKiBAc2VlIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vc2VyaWFsaXphdGlvbi8jcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFBhdGhTZXJpYWxpemVyKHBhdGhuYW1lLCBwYXRoUGFyYW1zKSB7XG4gIGxldCBuZXh0VVJMID0gcGF0aG5hbWU7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgcGF0aG5hbWUubWF0Y2goUEFUSF9QQVJBTV9SRSkgPz8gW10pIHtcbiAgICBsZXQgbmFtZSA9IG1hdGNoLnN1YnN0cmluZygxLCBtYXRjaC5sZW5ndGggLSAxKTtcbiAgICBsZXQgZXhwbG9kZSA9IGZhbHNlO1xuICAgIGxldCBzdHlsZSA9IFwic2ltcGxlXCI7XG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICBleHBsb2RlID0gdHJ1ZTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgc3R5bGUgPSBcImxhYmVsXCI7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCI7XCIpKSB7XG4gICAgICBzdHlsZSA9IFwibWF0cml4XCI7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIGlmICghcGF0aFBhcmFtcyB8fCBwYXRoUGFyYW1zW25hbWVdID09PSB1bmRlZmluZWQgfHwgcGF0aFBhcmFtc1tuYW1lXSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGF0aFBhcmFtc1tuYW1lXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIG5leHRVUkwgPSBuZXh0VVJMLnJlcGxhY2UobWF0Y2gsIHNlcmlhbGl6ZUFycmF5UGFyYW0obmFtZSwgdmFsdWUsIHsgc3R5bGUsIGV4cGxvZGUgfSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIG5leHRVUkwgPSBuZXh0VVJMLnJlcGxhY2UobWF0Y2gsIHNlcmlhbGl6ZU9iamVjdFBhcmFtKG5hbWUsIHZhbHVlLCB7IHN0eWxlLCBleHBsb2RlIH0pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc3R5bGUgPT09IFwibWF0cml4XCIpIHtcbiAgICAgIG5leHRVUkwgPSBuZXh0VVJMLnJlcGxhY2UobWF0Y2gsIGA7JHtzZXJpYWxpemVQcmltaXRpdmVQYXJhbShuYW1lLCB2YWx1ZSl9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbmV4dFVSTCA9IG5leHRVUkwucmVwbGFjZShtYXRjaCwgc3R5bGUgPT09IFwibGFiZWxcIiA/IGAuJHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWAgOiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gbmV4dFVSTDtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgYm9keSBvYmplY3QgdG8gc3RyaW5nXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0Qm9keVNlcmlhbGl6ZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Qm9keVNlcmlhbGl6ZXIoYm9keSwgaGVhZGVycykge1xuICBpZiAoYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgaWYgKGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9XG4gICAgICBoZWFkZXJzLmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgID8gKGhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpID8/IGhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpKVxuICAgICAgICA6IChoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID8/IGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pO1xuICAgIGlmIChjb250ZW50VHlwZSA9PT0gXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikge1xuICAgICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoYm9keSkudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJvZHkpO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBVUkwgc3RyaW5nIGZyb20gYmFzZVVybCBhbmQgaGFuZGxlIHBhdGggYW5kIHF1ZXJ5IHBhcmFtc1xuICogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuY3JlYXRlRmluYWxVUkx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaW5hbFVSTChwYXRobmFtZSwgb3B0aW9ucykge1xuICBsZXQgZmluYWxVUkwgPSBgJHtvcHRpb25zLmJhc2VVcmx9JHtwYXRobmFtZX1gO1xuICBpZiAob3B0aW9ucy5wYXJhbXM/LnBhdGgpIHtcbiAgICBmaW5hbFVSTCA9IGRlZmF1bHRQYXRoU2VyaWFsaXplcihmaW5hbFVSTCwgb3B0aW9ucy5wYXJhbXMucGF0aCk7XG4gIH1cbiAgbGV0IHNlYXJjaCA9IG9wdGlvbnMucXVlcnlTZXJpYWxpemVyKG9wdGlvbnMucGFyYW1zLnF1ZXJ5ID8/IHt9KTtcbiAgaWYgKHNlYXJjaC5zdGFydHNXaXRoKFwiP1wiKSkge1xuICAgIHNlYXJjaCA9IHNlYXJjaC5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgaWYgKHNlYXJjaCkge1xuICAgIGZpbmFsVVJMICs9IGA/JHtzZWFyY2h9YDtcbiAgfVxuICByZXR1cm4gZmluYWxVUkw7XG59XG5cbi8qKlxuICogTWVyZ2UgaGVhZGVycyBhIGFuZCBiLCB3aXRoIGIgdGFraW5nIHByaW9yaXR5XG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5tZXJnZUhlYWRlcnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUhlYWRlcnMoLi4uYWxsSGVhZGVycykge1xuICBjb25zdCBmaW5hbEhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBmb3IgKGNvbnN0IGggb2YgYWxsSGVhZGVycykge1xuICAgIGlmICghaCB8fCB0eXBlb2YgaCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGl0ZXJhdG9yID0gaCBpbnN0YW5jZW9mIEhlYWRlcnMgPyBoLmVudHJpZXMoKSA6IE9iamVjdC5lbnRyaWVzKGgpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIGl0ZXJhdG9yKSB7XG4gICAgICBpZiAodiA9PT0gbnVsbCkge1xuICAgICAgICBmaW5hbEhlYWRlcnMuZGVsZXRlKGspO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdjIgb2Ygdikge1xuICAgICAgICAgIGZpbmFsSGVhZGVycy5hcHBlbmQoaywgdjIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmaW5hbEhlYWRlcnMuc2V0KGssIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmluYWxIZWFkZXJzO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyBzbGFzaCBmcm9tIHVybFxuICogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikucmVtb3ZlVHJhaWxpbmdTbGFzaH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU2xhc2godXJsKSB7XG4gIGlmICh1cmwuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgdXJsLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG4iLCAiaW1wb3J0IGNyZWF0ZUNsaWVudCBmcm9tIFwib3BlbmFwaS1mZXRjaFwiO1xuaW1wb3J0IHR5cGUgeyBwYXRocywgY29tcG9uZW50cyB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG5leHBvcnQgdHlwZSBBUElLZXkgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIkFQSUtleVwiXTtcbmV4cG9ydCB0eXBlIENyZWF0ZUFQSUtleUJvZHkgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIkNyZWF0ZUFQSUtleUJvZHlcIl07XG5leHBvcnQgdHlwZSBDcmVhdGVBUElLZXlEYXRhID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJDcmVhdGVBUElLZXlEYXRhXCJdO1xuZXhwb3J0IHR5cGUgR2V0QVBJS2V5c0RhdGEgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIkdldEFQSUtleXNEYXRhXCJdO1xuZXhwb3J0IHR5cGUgR2V0QVBJS2V5RGF0YSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiR2V0QVBJS2V5RGF0YVwiXTtcbmV4cG9ydCB0eXBlIERpc2FibGVBUElLZXlEYXRhID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJEaXNhYmxlQVBJS2V5RGF0YVwiXTtcbmV4cG9ydCB0eXBlIEVuYWJsZUFQSUtleURhdGEgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIkVuYWJsZUFQSUtleURhdGFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBUElDbGllbnQoYmFzZVVSTDogc3RyaW5nKSB7XG4gIGNvbnN0IGJhc2VVcmwgPSAoYmFzZVVSTCB8fCBcIlwiKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVDbGllbnQ8cGF0aHM+KHsgYmFzZVVybCB9KTtcblxuICByZXR1cm4ge1xuICAgIC8vIFJhdyB0eXBlZCBjbGllbnQgKEdFVC9QT1NUL2V0YykgaWYgeW91IGV2ZXIgbmVlZCBpdFxuICAgIHJhdzogY2xpZW50LFxuXG4gICAgLy8gR0VUIC9hcGkta2V5cyBcdTIxOTIgQVBJS2V5W11cbiAgICBhc3luYyBnZXRBUElLZXlzKCk6IFByb21pc2U8R2V0QVBJS2V5c0RhdGE+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5HRVQoXCIvYXBpLWtleXNcIik7XG4gICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIC8vIFBPU1QgL2FwaS1rZXlzIHsgbmFtZSB9IFx1MjE5MiB7IHJhd19hcGlfa2V5LCBhcGlfa2V5IH1cbiAgICBhc3luYyBjcmVhdGVBUElLZXkoYm9keTogQ3JlYXRlQVBJS2V5Qm9keSk6IFByb21pc2U8Q3JlYXRlQVBJS2V5RGF0YT4ge1xuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgY2xpZW50LlBPU1QoXCIvYXBpLWtleXNcIiwgeyBib2R5IH0pO1xuICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICAvLyBHRVQgL2FwaS1rZXlzL3tuYW1lfSBcdTIxOTIgQVBJS2V5IHwgbnVsbFxuICAgIGFzeW5jIGdldEFQSUtleShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFQSUtleSB8IG51bGw+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5HRVQoXCIvYXBpLWtleXMve25hbWV9XCIsIHtcbiAgICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgbmFtZSB9IH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgICByZXR1cm4gZGF0YT8uYXBpX2tleSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICAvLyBERUxFVEUgL2FwaS1rZXlzL3tuYW1lfSBcdTIxOTIgdm9pZCAoMjA0KVxuICAgIGFzeW5jIGRlbGV0ZUFQSUtleShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5ERUxFVEUoXCIvYXBpLWtleXMve25hbWV9XCIsIHtcbiAgICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgbmFtZSB9IH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgfSxcblxuICAgIC8vIFBPU1QgL2FwaS1rZXlzL3tuYW1lfS9kaXNhYmxlIFx1MjE5MiBBUElLZXlcbiAgICBhc3luYyBkaXNhYmxlQVBJS2V5KG5hbWU6IHN0cmluZyk6IFByb21pc2U8QVBJS2V5PiB7XG4gICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBjbGllbnQuUE9TVChcIi9hcGkta2V5cy97bmFtZX0vZGlzYWJsZVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG5hbWUgfSB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAgcmV0dXJuIGRhdGEuYXBpX2tleSE7XG4gICAgfSxcblxuICAgIC8vIFBPU1QgL2FwaS1rZXlzL3tuYW1lfS9lbmFibGUgXHUyMTkyIEFQSUtleVxuICAgIGFzeW5jIGVuYWJsZUFQSUtleShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFQSUtleT4ge1xuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgY2xpZW50LlBPU1QoXCIvYXBpLWtleXMve25hbWV9L2VuYWJsZVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG5hbWUgfSB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAgcmV0dXJuIChkYXRhIGFzIEVuYWJsZUFQSUtleURhdGEpLmFwaV9rZXkhO1xuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIEFwaUtleXNDbGllbnQgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVBUElDbGllbnQ+OyIsICJpbXBvcnQgdHlwZSB7IE1vZGFsIH0gZnJvbSBcImJvb3RzdHJhcFwiO1xuXG50eXBlIEJTTW9kYWxPcHRpb25zID0gUGFydGlhbDxNb2RhbC5PcHRpb25zPiAmIHtcbiAgb25IaWRlPzogKCkgPT4gdm9pZDtcbiAgb25TaG93PzogKCkgPT4gdm9pZDtcbiAgb25TaG93bj86ICgpID0+IHZvaWQ7XG4gIG9uSGlkZGVuPzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNb2RhbChtb2RhbEVsOiBIVE1MRWxlbWVudCwgb3B0aW9uczogQlNNb2RhbE9wdGlvbnMgPSB7fSkge1xuICAvLyBBbGxvdyBFc2MgdG8gY2xvc2UgYW5kIGxldCBCb290c3RyYXAgbW92ZSBmb2N1cy5cbiAgY29uc3QgbW9kYWxPcHRpb25zOiBQYXJ0aWFsPE1vZGFsLk9wdGlvbnM+ID0geyBiYWNrZHJvcDogXCJzdGF0aWNcIiwga2V5Ym9hcmQ6IHRydWUsIGZvY3VzOiB0cnVlLCAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1vZGFsSW5zdGFuY2UgPSAkKG1vZGFsRWwpLm1vZGFsKHtcbiAgICBiYWNrZHJvcDogbW9kYWxPcHRpb25zLmJhY2tkcm9wLFxuICAgIGtleWJvYXJkOiBtb2RhbE9wdGlvbnMua2V5Ym9hcmQsXG4gICAgZm9jdXM6IG1vZGFsT3B0aW9ucy5mb2N1cyxcbiAgICAvLyBAdHMtaWdub3JlIHNpbGVuY2UgZmFsc2UgZXJyb3IgZHVlIHRvIHdyb25nIHR5cHBpbmdcbiAgICBzaG93OiBmYWxzZVxuICB9KVxuXG4gIC8vIFJlbWVtYmVyIHRoZSBlbGVtZW50IHRoYXQgaGFkIGZvY3VzIGJlZm9yZSBvcGVuaW5nLCB0byByZXN0b3JlIGl0IG9uIGNsb3NlLlxuICBsZXQgbGFzdFRyaWdnZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMub25TaG93KSB7XG4gICAgJChtb2RhbEVsKS5vbihcInNob3cuYnMubW9kYWxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgb3B0aW9ucy5vblNob3cgJiYgb3B0aW9ucy5vblNob3coKTtcbiAgICB9KTtcbiAgfVxuICAkKG1vZGFsRWwpLm9uKFwic2hvd24uYnMubW9kYWxcIiwgZnVuY3Rpb24gKCkge1xuICAgIC8vIE1vdmUgZm9jdXMgaW50byB0aGUgbW9kYWwgc28gRXNjIHdvcmtzIGFuZCBzY3JlZW4gcmVhZGVycyBlbnRlciB0aGUgZGlhbG9nXG4gICAgY29uc3QgZm9jdXNUYXJnZXQgPVxuICAgICAgbW9kYWxFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2F1dG9mb2N1c10sIFtkYXRhLWluaXRpYWwtZm9jdXNdLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3QsIHRleHRhcmVhLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknKVxuICAgICAgfHwgbW9kYWxFbDtcbiAgICBmb2N1c1RhcmdldC5mb2N1cygpO1xuICAgIG9wdGlvbnMub25TaG93biAmJiBvcHRpb25zLm9uU2hvd24oKTtcbiAgfSk7XG5cbiAgJChtb2RhbEVsKS5vbihcImhpZGUuYnMubW9kYWxcIiwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsXG4gICAgaWYgKGFjdGl2ZSAmJiBtb2RhbEVsPy5jb250YWlucyhhY3RpdmUpKSB7XG4gICAgICBhY3RpdmUuYmx1cigpIC8vIG9yIHRyaWdnZXJCdXR0b24uZm9jdXMoKVxuICAgIH1cbiAgICBvcHRpb25zLm9uSGlkZSAmJiBvcHRpb25zLm9uSGlkZSgpO1xuICB9KTtcbiAgaWYgKG9wdGlvbnMub25IaWRkZW4pIHtcbiAgICAkKG1vZGFsRWwpLm9uKFwiaGlkZGVuLmJzLm1vZGFsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9wdGlvbnMub25IaWRkZW4gJiYgb3B0aW9ucy5vbkhpZGRlbigpO1xuICAgICAgaGlkZUxvYWRpbmcoKTtcbiAgICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIG9wZW5lciBhZnRlciBmdWxseSBoaWRkZW5cbiAgICAgIGxhc3RUcmlnZ2VyPy5mb2N1cygpO1xuICAgICAgbGFzdFRyaWdnZXIgPSBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyRWwgPSBtb2RhbEVsPy5xdWVyeVNlbGVjdG9yKFwiLm1vZGFsLWhlYWRlclwiKSBhcyBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRpdGxlRWwgPSBoZWFkZXJFbD8ucXVlcnlTZWxlY3RvcihcIi5tb2RhbC10aXRsZVwiKSBhcyBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLy8gXG4gIGxldCBsb2FkaW5nT3ZlcmxheTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBmdW5jdGlvbiBzaG93TG9hZGluZygpIHtcbiAgICBsb2FkaW5nT3ZlcmxheSA9IGNyZWF0ZUxvYWRpbmdPdmVybGF5KCk7XG4gICAgbG9hZGluZ092ZXJsYXkuc3R5bGUudG9wID0gaGVhZGVyRWwgPyBgJHtoZWFkZXJFbC5vZmZzZXRIZWlnaHR9cHhgIDogJzAnO1xuICAgIG1vZGFsRWwucXVlcnlTZWxlY3RvcignLm1vZGFsLWNvbnRlbnQnKT8uYXBwZW5kQ2hpbGQobG9hZGluZ092ZXJsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUxvYWRpbmcoKSB7XG4gICAgaWYgKGxvYWRpbmdPdmVybGF5KSB7XG4gICAgICBsb2FkaW5nT3ZlcmxheS5yZW1vdmUoKTtcbiAgICAgIGxvYWRpbmdPdmVybGF5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNldE9wdGlvbnMoY29uZmlnPzogUGFydGlhbDxNb2RhbC5PcHRpb25zPikge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBtb2RhbEluc3RhbmNlPy5kYXRhKFwiYnMubW9kYWxcIik7XG4gICAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IG1vZGFsSW5zdGFuY2U/LmRhdGEoXCJicy5tb2RhbFwiKT8uX2NvbmZpZyBhcyBNb2RhbC5PcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgaW5zdGFuY2UgJiYgKGluc3RhbmNlLl9jb25maWcgPSB7IC4uLmluc3RhbmNlQ29uZmlnLCAuLi5jb25maWcgfSk7XG4gICAgfSxcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgICB0aXRsZUVsICYmICh0aXRsZUVsLnRleHRDb250ZW50ID0gdGl0bGUpO1xuICAgICAgaGVhZGVyRWw/LmNsYXNzTGlzdC5yZW1vdmUoXCJkLW5vbmVcIilcbiAgICB9LFxuICAgIGhpZGVIZWFkZXIoKSB7XG4gICAgICBoZWFkZXJFbD8uY2xhc3NMaXN0LmFkZChcImQtbm9uZVwiKTtcbiAgICB9LFxuICAgIC8vIFByZWZlciBwYXNzaW5nIHRoZSBhY3R1YWwgdHJpZ2dlciBlbGVtZW50LiBGYWxscyBiYWNrIHRvIGFjdGl2ZUVsZW1lbnQuXG4gICAgb3Blbih0cmlnZ2VyPzogSFRNTEVsZW1lbnQpIHtcbiAgICAgIGxhc3RUcmlnZ2VyID0gdHJpZ2dlciA/PyAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGwpO1xuICAgICAgbW9kYWxJbnN0YW5jZSAmJiBtb2RhbEluc3RhbmNlLm1vZGFsKFwic2hvd1wiKTtcbiAgICB9LFxuICAgIGNsb3NlKCkge1xuICAgICAgbW9kYWxJbnN0YW5jZSAmJiBtb2RhbEluc3RhbmNlLm1vZGFsKFwiaGlkZVwiKTtcbiAgICB9LFxuICAgIHNob3dMb2FkaW5nLFxuICAgIGhpZGVMb2FkaW5nXG4gIH07XG59XG5cbi8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGxvYWRpbmcgb3ZlcmxheSAqL1xuZnVuY3Rpb24gY3JlYXRlTG9hZGluZ092ZXJsYXkoKTogSFRNTEVsZW1lbnQge1xuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgei1pbmRleDogMTA1MDtcbiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMXB4KTtcbiAgYDtcblxuICBjb25zdCBzcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHNwaW5uZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1zZWNvbmRhcnlcIiByb2xlPVwic3RhdHVzXCIgc3R5bGU9XCJ3aWR0aDogM3JlbTsgaGVpZ2h0OiAzcmVtO1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMiB0ZXh0LW11dGVkIHNtYWxsXCI+UHJvY2Vzc2luZy4uLjwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG4gIG92ZXJsYXkuYXBwZW5kQ2hpbGQoc3Bpbm5lcik7XG4gIHJldHVybiBvdmVybGF5O1xufSIsICJpbXBvcnQgeyBBUElLZXkgfSBmcm9tIFwiLi9hcGlcIjtcblxuLyoqXG4gKiBGb3JtYXRzIGFuIElTTyBkYXRlLlxuICogLSB3aXRoVGltZT1mYWxzZTogXCJKdWwgMTQsIDIwMjVcIlxuICogLSB3aXRoVGltZT10cnVlOiAgXCJKdWwgMTQsIDIwMjUsIDE6NDUgUE1cIiAobG9jYWxlLWRlcGVuZGVudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoXG4gIGlzbzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyB1dGM/OiBib29sZWFuOyB3aXRoVGltZT86IGJvb2xlYW4gfSA9IHt9XG4pOiBzdHJpbmcge1xuICBpZiAoIWlzbykgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZShpc28pO1xuICBpZiAoTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIFwiXCI7XG5cbiAgY29uc3QgeyB1dGMgPSBmYWxzZSwgd2l0aFRpbWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICBjb25zdCBiYXNlOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICBtb250aDogXCJzaG9ydFwiLFxuICAgIGRheTogXCJudW1lcmljXCIsXG4gICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgdGltZVpvbmU6IHV0YyA/IFwiVVRDXCIgOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgcmV0dXJuIHdpdGhUaW1lXG4gICAgPyBkLnRvTG9jYWxlU3RyaW5nKFwiZW4tVVNcIiwgeyAuLi5iYXNlLCBob3VyOiBcIjItZGlnaXRcIiwgbWludXRlOiBcIjItZGlnaXRcIiB9KVxuICAgIDogZC50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1VU1wiLCBiYXNlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVib3VuY2VkIHZlcnNpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8RiBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4oZm46IEYsIHdhaXQgPSAzMDApIHtcbiAgbGV0IHQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczxGPikgPT4ge1xuICAgIGlmICh0KSBjbGVhclRpbWVvdXQodCk7XG4gICAgdCA9IHNldFRpbWVvdXQoKCkgPT4gZm4oLi4uYXJncyksIHdhaXQpO1xuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbiBBUEkga2V5IG5hbWUuXG4gKiAtIFNwYWNlcy93aGl0ZXNwYWNlIGFyZSBkaXNhbGxvd2VkIChva1NwYWNlcz1mYWxzZSBpZiBhbnkpXG4gKiAtIEFsbG93ZWQgY2hhcnMgKGZvciB0aGUgbm9uLXdoaXRlc3BhY2UgcGFydCk6IEEtWiBhLXogMC05IC4gXyAtXG4gKiAtIExlbmd0aCBpcyBjaGVja2VkIG9uIHRoZSB0cmltbWVkIHZhbHVlICgzXHUyMDEzMzUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFwaUtleU5hbWUocmF3OiBzdHJpbmcpIHtcbiAgY29uc3QgaXNFbXB0eSA9IHJhdy5sZW5ndGggPT09IDA7XG4gIGNvbnN0IGhhc1doaXRlc3BhY2UgPSAvXFxzLy50ZXN0KHJhdyk7XG4gIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICBjb25zdCBva0xlbiA9IHRyaW1tZWQubGVuZ3RoID49IDMgJiYgdHJpbW1lZC5sZW5ndGggPD0gMzU7XG4gIC8vIElnbm9yZSB3aGl0ZXNwYWNlIGZvciB0aGUgYWxsb3dlZC1jaGFyYWN0ZXJzIHJ1bGVcbiAgY29uc3QgY2xlYW5lZEZvckNoYXJzID0gdHJpbW1lZC5yZXBsYWNlKC9cXHMvZywgXCJcIik7XG4gIGNvbnN0IG9rQ2hhcnMgPSAvXltBLVphLXowLTkuXy1dKyQvLnRlc3QoY2xlYW5lZEZvckNoYXJzKSB8fCBjbGVhbmVkRm9yQ2hhcnMubGVuZ3RoID09PSAwO1xuICBjb25zdCBva1NwYWNlcyA9ICFoYXNXaGl0ZXNwYWNlO1xuXG4gIHJldHVybiB7IHJhdywgdHJpbW1lZCwgaXNFbXB0eSwgb2tMZW4sIG9rQ2hhcnMsIG9rU3BhY2VzIH07XG59XG5cbi8qKlxuICogU2hvd3MgYSBCb290c3RyYXAgdG9hc3Qgbm90aWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9hc3Qob3B0aW9uczoge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogQGRlZmF1bHQ6IDIwMDAgKi9cbiAgZGVsYXk/OiBudW1iZXI7XG4gIC8qKiBAZGVmYXVsdDogdHJ1ZSAqL1xuICBhdXRvaGlkZT86IGJvb2xlYW47XG4gIC8qKiBkZWZhdWx0OiBib2R5LWxldmVsIGNvbnRhaW5lciB3ZSBjcmVhdGUgaWYgbWlzc2luZyAqL1xuICBjb250YWluZXJTZWxlY3Rvcj86IHN0cmluZztcbiAgdHlwZT86ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnaW5mbyc7XG4gIC8qKiBleHRyYSBjbGFzc2VzIG9uIC50b2FzdCAoZS5nLiwgXCJiZy1zdWNjZXNzIHRleHQtd2hpdGVcIikgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3Qge1xuICAgIG1lc3NhZ2UsXG4gICAgdGl0bGUsXG4gICAgZGVsYXkgPSA0MDAwLFxuICAgIGF1dG9oaWRlID0gdHJ1ZSxcbiAgICBjb250YWluZXJTZWxlY3RvciA9IFwiI190b2FzdF9jb250YWluZXJcIixcbiAgICBjbGFzc05hbWUgPSBcIlwiLFxuICB9ID0gb3B0aW9ucztcblxuICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXJTZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmlkID0gY29udGFpbmVyU2VsZWN0b3IucmVwbGFjZSgvXiMvLCBcIlwiKTtcbiAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IFwiMXJlbVwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5yaWdodCA9IFwiMXJlbVwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBcIjEwODBcIjtcbiAgICBjb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgfVxuXG4gIGNvbnN0IHRvYXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdG9hc3QuY2xhc3NOYW1lID0gYHRvYXN0ICR7Y2xhc3NOYW1lfWAudHJpbSgpO1xuICB0b2FzdC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiYWxlcnRcIik7XG4gIHRvYXN0LnNldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiLCBcImFzc2VydGl2ZVwiKTtcbiAgdG9hc3Quc2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIiwgXCJ0cnVlXCIpO1xuICB0b2FzdC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XG4gIGNvbnN0IGljb24gPSBvcHRpb25zLnR5cGUgPT09IFwic3VjY2Vzc1wiID8geyB0eXBlOiBcImZhLWNoZWNrLWNpcmNsZVwiLCBjb2xvcjogXCJ0ZXh0LXN1Y2Nlc3NcIiB9IDpcbiAgICBvcHRpb25zLnR5cGUgPT09IFwiZXJyb3JcIiA/IHsgdHlwZTogXCJmYS10aW1lcy1jaXJjbGVcIiwgY29sb3I6IFwidGV4dC1kYW5nZXJcIiB9IDpcbiAgICAgIG9wdGlvbnMudHlwZSA9PT0gXCJpbmZvXCIgPyB7IHR5cGU6IFwiZmEtaW5mby1jaXJjbGVcIiwgY29sb3I6IFwidGV4dC1pbmZvXCIgfSA6XG4gICAgICAgIG51bGw7XG4gIHRvYXN0LmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwidG9hc3QtYm9keSBkLWZsZXhcIj5cbiAgICAgICR7aWNvbiA/IGA8aSBjbGFzcz1cImZhICR7aWNvbi50eXBlfSBmYS0yeCBtci0zICR7aWNvbi5jb2xvcn1cIj48L2k+YCA6IFwiXCJ9XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgJHt0aXRsZSA/IGBcbiAgICAgICAgICA8aDYgY2xhc3M9XCJtLTBcIj4ke3RpdGxlfTwvaDY+XG4gICAgICAgIGAgOiBcIlwifVxuICAgICAgICAke21lc3NhZ2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWwtNCBtYi0xIGNsb3NlXCIgZGF0YS1kaXNtaXNzPVwidG9hc3RcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3QpO1xuXG4gIGNvbnN0ICQgPSAod2luZG93IGFzIGFueSkuJDtcbiAgaWYgKCQ/LmZuPy50b2FzdCkge1xuICAgICQodG9hc3QpLnRvYXN0KHsgZGVsYXksIGF1dG9oaWRlIH0pLnRvYXN0KFwic2hvd1wiKTtcbiAgICAkKHRvYXN0KS5vbihcImhpZGRlbi5icy50b2FzdFwiLCAoKSA9PiB0b2FzdC5yZW1vdmUoKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgc2hvdy9oaWRlIGlmIEJvb3RzdHJhcCBKUyBub3QgcHJlc2VudFxuICAgIHRvYXN0LmNsYXNzTGlzdC5hZGQoXCJzaG93XCIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdG9hc3QucmVtb3ZlKCksIGRlbGF5KTtcbiAgfVxuICByZXR1cm4gdG9hc3Q7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBnaXZlbiB0ZXh0IHRvIGNsaXBib2FyZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVzZUNvcHlUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgKHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPz8gbG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpKSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICB0YS52YWx1ZSA9IHRleHQ7XG4gICAgICB0YS5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCBcIlwiKTtcbiAgICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgdGEuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7XG4gICAgICB0YS5zZWxlY3QoKTtcbiAgICAgIGNvbnN0IG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7XG4gICAgICBpZiAoIW9rKSB0aHJvdyBuZXcgRXJyb3IoXCJleGVjQ29tbWFuZCBjb3B5IGZhaWxlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyB0ZXh0IHRvIGNsaXBib2FyZCBhbmQgc2hvd3MgYSB0b2FzdCBub3RpZmljYXRpb24gb24gc3VjY2Vzcy9mYWlsdXJlLlxuICogSWYgeW91IGRvbnQgd2FudCBhIHRvYXN0LCB1c2UgZGlyZWN0bHkgYHVzZUNvcHlUb0NsaXBib2FyZGAuXG4gKiBAc2VlIHVzZUNvcHlUb0NsaXBib2FyZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weVRleHRXaXRoVG9hc3QodGV4dDogc3RyaW5nLCBvcHRpb25zPzoge1xuICBzdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgZmFpbHVyZU1lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBkZWxheT86IG51bWJlcjtcbiAgY29udGFpbmVyU2VsZWN0b3I/OiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IG9rID0gYXdhaXQgdXNlQ29weVRvQ2xpcGJvYXJkKHRleHQpO1xuICBpZiAob2spIHtcbiAgICB1c2VUb2FzdCh7XG4gICAgICBtZXNzYWdlOiBvcHRpb25zPy5zdWNjZXNzTWVzc2FnZSA/PyBcIkNvcGllZCB0byBjbGlwYm9hcmRcIixcbiAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyBcIlN1Y2Nlc3NcIixcbiAgICAgIGRlbGF5OiBvcHRpb25zPy5kZWxheSA/PyAyMDAwLFxuICAgICAgY29udGFpbmVyU2VsZWN0b3I6IG9wdGlvbnM/LmNvbnRhaW5lclNlbGVjdG9yLFxuICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgY2xhc3NOYW1lOiBcImJnLXdoaXRlXCIsIC8vIGtlZXAgZGVmYXVsdCBCUyBsb29rOyBhZGp1c3QgaWYgeW91IHdhbnRcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB1c2VUb2FzdCh7XG4gICAgICBtZXNzYWdlOiBvcHRpb25zPy5mYWlsdXJlTWVzc2FnZSA/PyBcIkNvcHkgZmFpbGVkXCIsXG4gICAgICB0aXRsZTogXCJFcnJvclwiLFxuICAgICAgZGVsYXk6IG9wdGlvbnM/LmRlbGF5ID8/IDI1MDAsXG4gICAgICBjb250YWluZXJTZWxlY3Rvcjogb3B0aW9ucz8uY29udGFpbmVyU2VsZWN0b3IsXG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgY2xhc3NOYW1lOiBcImJnLWRhbmdlciB0ZXh0LXdoaXRlXCIsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9rO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyB0aGUgZ2l2ZW4gZGF0YSBhcyBhIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkSlNPTihkYXRhOiB1bmtub3duLCBmaWxlbmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMildLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gIGEuaHJlZiA9IHVybDtcbiAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICBhLmNsaWNrKCk7XG4gIGEucmVtb3ZlKCk7XG4gIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzYWZlIGZpbGVuYW1lIGZvciBhbiBBUEkga2V5IGV4cG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVGaWxlbmFtZShiYXNlOiBzdHJpbmcsIGV4dCA9IFwianNvblwiKSB7XG4gIGNvbnN0IG5hbWUgPSAoYmFzZSB8fCBcImFwaS1rZXlcIikudHJpbSgpLnJlcGxhY2UoL1teXFx3Li1dKy9nLCBcIi1cIikucmVwbGFjZSgvLSsvZywgXCItXCIpO1xuICByZXR1cm4gYCR7bmFtZSB8fCBcImFwaS1rZXlcIn0uJHtleHR9YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gc2V0IHZhbGlkYXRpb24gc3RhdGUgb24gYW4gaW5wdXQgYW5kIGVycm9yIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZhbGlkYXRpb25TdGF0ZShlcnJvckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG4gIHJldHVybiAoZXJyb3JNc2c6IHN0cmluZywgaW5wdXRFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCkgPT4ge1xuICAgIGlmIChlcnJvckNvbnRhaW5lcikge1xuICAgICAgaWYgKGVycm9yTXNnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JDb250YWluZXIudGV4dENvbnRlbnQgPSBlcnJvck1zZztcbiAgICAgICAgZXJyb3JDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgaW5wdXRFbD8uZm9jdXMoKTtcbiAgICAgICAgaW5wdXRFbD8uY2xhc3NMaXN0LmFkZChcImlzLWludmFsaWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckNvbnRhaW5lci50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgIGVycm9yQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgaW5wdXRFbD8uY2xhc3NMaXN0LnJlbW92ZShcImlzLWludmFsaWRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBBUEkga2V5IGRhdGEgaW50byB0aGUgZ2l2ZW4gY29udGFpbmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyS2V5RGF0YShjb250YWluZXI6IEhUTUxFbGVtZW50LCBrZXk6IEFQSUtleSkge1xuICBjb25zdCBlbGVtZW50cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEta2V5LXByb3BdXCIpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWtleS1wcm9wXCIpIGFzIGtleW9mIEFQSUtleTtcbiAgICBpZiAocHJvcCBpbiBrZXkpIHtcbiAgICAgIGxldCB2YWx1ZSA9IChrZXkgYXMgYW55KVtwcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSBcImNyZWF0ZWRfYXRcIiB8fCBwcm9wID09PSBcImRpc2FibGVkX2F0XCIgfHwgcHJvcCA9PT0gXCJsYXN0X3VzZWRfYXRcIikge1xuICAgICAgICB2YWx1ZSA9IGZvcm1hdERhdGUodmFsdWUsIHsgd2l0aFRpbWU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBlbC50ZXh0Q29udGVudCA9IHZhbHVlID8/IFwiXHUyMDE0XCI7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBDbGVhcnMgQVBJIGtleSBkYXRhIGZyb20gdGhlIGdpdmVuIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyS2V5RGF0YShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1rZXktcHJvcF1cIik7XG4gIGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9KTtcbn0iLCAiaW1wb3J0IHR5cGUgeyBBcGlLZXlzQ2xpZW50LCBBUElLZXkgfSBmcm9tIFwiLi9hcGlcIjtcbmltcG9ydCB7IHVzZU1vZGFsIH0gZnJvbSBcIi4vbW9kYWxcIjtcbmltcG9ydCB7IGRlYm91bmNlLCBmb3JtYXREYXRlLCB1c2VWYWxpZGF0aW9uU3RhdGUsIHVzZVRvYXN0LCByZW5kZXJLZXlEYXRhLCBjbGVhcktleURhdGEgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCBERUZBVUxUT1BUSU9OUyA9IHtcbiAgbGlzdENvbnRhaW5lclNlbGVjdG9yOiBcIiNhcGlLZXlzTGlzdENvbnRhaW5lclwiLFxuICB0YWJsZVNlbGVjdG9yOiBcIiNhcGlLZXlzTGlzdFwiLFxuICBzZWFyY2hTZWxlY3RvcjogXCIjYXBpS2V5c0xpc3RTZWFyY2hmaWVsZFwiLFxuICBkZWxldGVNb2RhbFNlbGVjdG9yOiBcIiNkZWxldGVLZXlNb2RhbFwiLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEFwaUtleXNUYWJsZShhcGk6IEFwaUtleXNDbGllbnQsIG9wdGlvbnM/OiBQYXJ0aWFsPHR5cGVvZiBERUZBVUxUT1BUSU9OUz4pIHtcbiAgY29uc3QgY29uZmlnID0geyAuLi5ERUZBVUxUT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBsaXN0Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb25maWcubGlzdENvbnRhaW5lclNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGNvbnN0IGFwaUtleXNUYWJsZSA9ICQoY29uZmlnLnRhYmxlU2VsZWN0b3IpLkRhdGFUYWJsZSh7XG4gICAgc2VydmVyU2lkZTogZmFsc2UsXG4gICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICBhamF4OiAoX3JlcTogYW55LCBjYWxsYmFjazogYW55LCBzZXR0aW5nczogYW55KSA9PiB7XG4gICAgICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIHRvIHN1cHBvcnQgYWJvcnRpbmcgcHJldmlvdXMgcmVxdWVzdHMgd2hlbiB1c2luZyBjdXN0b20gZmV0Y2ggZnVuY3Rpb25cbiAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgc2V0dGluZ3MuanFYSFIgPSB7IGFib3J0KCkgeyBjYW5jZWxlZCA9IHRydWU7IH0gfTtcblxuICAgICAgLy8gQXZvaWQgdXNpbmcgYXN5bmMvYXdhaXQgaGVyZSBhcyBmb3Igc29tZSByZWFzb24gaXQgYnJlYWtzIERhdGFUYWJsZXMnIGFqYXggaGFuZGxpbmcuIEl0IHdpbGwgdHJpZ2dlciB1bmhhbmRsZWQgcmVqZWN0aW9ucyBvbiBhYm9ydHMuXG4gICAgICBhcGkuZ2V0QVBJS2V5cygpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGNhbGxiYWNrKHsgZGF0YTogcmVzcG9uc2UuYXBpX2tleXMgPz8gW10gfSk7XG4gICAgICAgICAgdXBkYXRlS2V5c0NvdW50KHJlc3BvbnNlLmFwaV9rZXlzID8/IFtdKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgZmV0Y2hpbmcgYXBpIGtleXNcIiwgZXJyKTtcbiAgICAgICAgICBjYWxsYmFjayh7IGRhdGE6IFtdIH0pO1xuICAgICAgICAgIHVwZGF0ZUtleXNDb3VudChbXSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVzcG9uc2l2ZTogZmFsc2UsXG4gICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICBwYWdpbmc6IGZhbHNlLFxuICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICBpbmZvOiBmYWxzZSxcbiAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgIHBhZ2VMZW5ndGg6IDAsXG4gICAgY29sdW1uczogW1xuICAgICAgeyBkYXRhOiBcIm5hbWVcIiB9LFxuICAgICAgeyBkYXRhOiBcInNob3J0X2tleVwiIH0sXG4gICAgICB7IGRhdGE6IFwiY3JlYXRlZF9hdFwiLCByZW5kZXI6ICh2OiBzdHJpbmcpID0+IGZvcm1hdERhdGUodikgfSxcbiAgICAgIHsgZGF0YTogXCJsYXN0X3VzZWRfYXRcIiwgcmVuZGVyOiAodjogc3RyaW5nKSA9PiBmb3JtYXREYXRlKHYpIH0sXG4gICAgICB7IGRhdGE6IFwiZGlzYWJsZWRfYXRcIiwgcmVuZGVyOiAodjogc3RyaW5nKSA9PiBmb3JtYXREYXRlKHYpIH0sXG4gICAgICB7XG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsIHNlYXJjaGFibGU6IGZhbHNlLCBkYXRhOiBudWxsLCBkZWZhdWx0Q29udGVudDogXCJcIixcbiAgICAgICAgcmVuZGVyOiAoX2RhdGE6IGFueSwgX3R5cGU6IGFueSwgcm93OiBBUElLZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0FjdGl2ZUtleSA9ICFyb3cuZGlzYWJsZWRfYXQ7XG4gICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWwtYXV0b1wiIHN0eWxlPVwiZ2FwOiAwLjVyZW07IHdpZHRoOiAxMzBweDtcIj5cbiAgICAgICAgICAgICAgJHttYWtlS2V5QWN0aW9uQnRuKHtcbiAgICAgICAgICAgIGFjdGlvbjogaXNBY3RpdmVLZXkgPyAnZGlzYWJsZScgOiAnZW5hYmxlJyxcbiAgICAgICAgICAgIGtleU5hbWU6IHJvdy5uYW1lLFxuICAgICAgICAgICAgbGFiZWw6IGlzQWN0aXZlS2V5ID8gJ0Rpc2FibGUnIDogJ0VuYWJsZScsXG4gICAgICAgICAgICBjbGFzczogJ3RleHQtd2hpdGUgZmxleC1maWxsJ1xuICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAke21ha2VLZXlBY3Rpb25CdG4oe1xuICAgICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIGtleU5hbWU6IHJvdy5uYW1lLFxuICAgICAgICAgICAgdGl0bGU6IGlzQWN0aXZlS2V5ID8gJ0Nhbm5vdCBkZWxldGUgYW4gYWN0aXZlIGtleScgOiAnRGVsZXRlIGtleScsXG4gICAgICAgICAgICBkaXNhYmxlZDogaXNBY3RpdmVLZXksXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIF0sXG4gICAgZG9tOiBcIjwncm93JzwnY29sLTEyJ3RyPj5cIixcbiAgICBsYW5ndWFnZToge1xuICAgICAgZW1wdHlUYWJsZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHktNVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEta2V5IGZhLTN4IHRleHQtbXV0ZWRcIiBzdHlsZT1cIm9wYWNpdHk6IDAuNTtcIj48L2k+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdC0zIG1iLTEgaDVcIj5ObyBBUEkgS2V5czwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cInNtYWxsXCI+Q3JlYXRlIGFuIEFQSSBrZXkgYW5kIGl0IHdpbGwgYmUgbGlzdGVkIGhlcmU8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYCxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29uZmlnLnNlYXJjaFNlbGVjdG9yKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgaWYgKGlucHV0KSB7XG4gICAgY29uc3Qgb25UeXBlID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgYXBpS2V5c1RhYmxlLnNlYXJjaChpbnB1dC52YWx1ZSkuZHJhdygpO1xuICAgIH0sIDEwMCk7XG4gICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIG9uVHlwZSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVLZXlzQ291bnQoYXBpX2tleXM6IEFQSUtleVtdKSB7XG4gICAgY29uc3QgdG90YWxLZXlzRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcm9sZT1cInRvdGFsLWtleXMtY291bnRcIl0nKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PjtcbiAgICB0b3RhbEtleXNFbHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC50ZXh0Q29udGVudCA9IFN0cmluZyhhcGlfa2V5cy5sZW5ndGgpO1xuICAgIH0pO1xuICAgIGNvbnN0IGFjdGl2ZUNvdW50RWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcm9sZT1cImFjdGl2ZS1rZXlzLWNvdW50XCJdJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IGFwaV9rZXlzLmZpbHRlcihrID0+ICFrLmRpc2FibGVkX2F0KTtcbiAgICBhY3RpdmVDb3VudEVscy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnRleHRDb250ZW50ID0gU3RyaW5nKGFjdGl2ZUtleXMubGVuZ3RoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGRpc2FibGVLZXlDb25maXJtTW9kYWwgPSB1c2VLZXlBY3Rpb25Db25maXJtTW9kYWwoJyNkaXNhYmxlS2V5TW9kYWwnLCB7XG4gICAgb25Db25maXJtOiBhc3luYyAoa2V5KSA9PiB7IGF3YWl0IGFwaS5kaXNhYmxlQVBJS2V5KGtleS5uYW1lKTsgfSxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIGFwaUtleXNUYWJsZS5hamF4LnJlbG9hZCgpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGRlbGV0ZUtleUNvbmZpcm1Nb2RhbCA9IHVzZUtleUFjdGlvbkNvbmZpcm1Nb2RhbCgnI2RlbGV0ZUtleU1vZGFsJywge1xuICAgIG9uQ29uZmlybTogYXN5bmMgKGtleSkgPT4geyBhd2FpdCBhcGkuZGVsZXRlQVBJS2V5KGtleS5uYW1lKTsgfSxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIGFwaUtleXNUYWJsZS5hamF4LnJlbG9hZCgpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGVuYWJsZUtleSA9IHVzZUVuYWJsZUtleSh7XG4gICAgb25Db25maXJtOiBhc3luYyAoa2V5KSA9PiB7IGF3YWl0IGFwaS5lbmFibGVBUElLZXkoa2V5Lm5hbWUpOyB9LFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgYXBpS2V5c1RhYmxlLmFqYXgucmVsb2FkKCk7XG4gICAgfVxuICB9KTtcblxuICBsaXN0Q29udGFpbmVyPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qga2V5QWN0aW9uQnRuID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWtleS1hY3Rpb25dJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChrZXlBY3Rpb25CdG4pIHtcbiAgICAgIGtleUFjdGlvbkJ0bi5mb2N1cygpOyAvLyBFbnN1cmUgdGhlIGJ1dHRvbiByZXRhaW5zIGZvY3VzIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICBjb25zdCBrZXlEYXRhID0gYXBpS2V5c1RhYmxlLnJvd3MoKS5kYXRhKCkudG9BcnJheSgpLmZpbmQoayA9PiBrLm5hbWUgPT09IGtleUFjdGlvbkJ0bi5nZXRBdHRyaWJ1dGUoJ2RhdGEta2V5JykpO1xuICAgICAgaWYgKCFrZXlEYXRhKSByZXR1cm47XG4gICAgICBjb25zdCBhY3Rpb25UeXBlID0ga2V5QWN0aW9uQnRuLmdldEF0dHJpYnV0ZSgnZGF0YS1rZXktYWN0aW9uJylcbiAgICAgIGlmICghaXNWYWxpZEtleUFjdGlvbihhY3Rpb25UeXBlKSkgcmV0dXJuXG4gICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gJ2Rpc2FibGUnKSBkaXNhYmxlS2V5Q29uZmlybU1vZGFsPy5vcGVuKGtleURhdGEpO1xuICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PT0gJ2VuYWJsZScpIGVuYWJsZUtleShrZXlEYXRhLCBrZXlBY3Rpb25CdG4pXG4gICAgICBlbHNlIGlmIChhY3Rpb25UeXBlID09PSAnZGVsZXRlJykgZGVsZXRlS2V5Q29uZmlybU1vZGFsPy5vcGVuKGtleURhdGEpXG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBpS2V5c1RhYmxlO1xufVxuXG5mdW5jdGlvbiB1c2VFbmFibGVLZXkob3B0aW9uczoge1xuICBvbkNvbmZpcm0/OiAoa2V5OiBBUElLZXkpID0+IFByb21pc2U8dm9pZD47XG4gIG9uU3VjY2Vzcz86IChrZXk6IEFQSUtleSkgPT4gdm9pZDtcbn0pIHtcbiAgbGV0IGlzRW5hYmxpbmcgPSBmYWxzZTtcbiAgZnVuY3Rpb24gc2V0TG9hZGluZ1N0YXRlKGJ0bjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBpY29uRWwgPSBidG4ucXVlcnlTZWxlY3RvcignaScpO1xuICAgIGlmIChpc0VuYWJsaW5nKSB7XG4gICAgICBpY29uRWw/LmNsYXNzTGlzdC5yZW1vdmUoJ2ZhLXBsYXknKTtcbiAgICAgIGljb25FbD8uY2xhc3NMaXN0LmFkZCgnZmEtc3Bpbm5lcicsICdmYS1zcGluJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25FbD8uY2xhc3NMaXN0LnJlbW92ZSgnZmEtc3Bpbm5lcicsICdmYS1zcGluJyk7XG4gICAgICBpY29uRWw/LmNsYXNzTGlzdC5hZGQoJ2ZhLXBsYXknKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFzeW5jIChrZXlEYXRhOiBBUElLZXksIHRyaWdnZXJCdG46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgaWYoaXNFbmFibGluZykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBpc0VuYWJsaW5nID0gdHJ1ZTtcbiAgICAgIHNldExvYWRpbmdTdGF0ZSh0cmlnZ2VyQnRuKTtcbiAgICAgIGF3YWl0IG9wdGlvbnMub25Db25maXJtPy4oa2V5RGF0YSk7XG4gICAgICB1c2VUb2FzdCh7IHR5cGU6IFwic3VjY2Vzc1wiLCBtZXNzYWdlOiBgQVBJIEtleSAke2tleURhdGEubmFtZX0gaGFzIGJlZW4gZW5hYmxlZC5gIH0pO1xuICAgICAgb3B0aW9ucy5vblN1Y2Nlc3M/LihrZXlEYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZW5hYmxlIEFQSSBrZXk6XCIsIGVycik7XG4gICAgICB1c2VUb2FzdCh7IHR5cGU6IFwiZXJyb3JcIiwgbWVzc2FnZTogYEZhaWxlZCB0byBlbmFibGUgQVBJIEtleSAke2tleURhdGEubmFtZX0uIFBsZWFzZSB0cnkgYWdhaW4uYCB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNFbmFibGluZyA9IGZhbHNlO1xuICAgICAgc2V0TG9hZGluZ1N0YXRlKHRyaWdnZXJCdG4pO1xuICAgIH1cbiAgfTtcbn1cblxuXG5jb25zdCBERUZBVUxUS0VZQUNUSU9OTU9EQUxPUFRJT05TID0ge1xuICBjb25maXJtS2V5Rm9ybVNlbGVjdG9yOiBcIltkYXRhLWtleS1mb3JtXVwiLFxuICBrZXlDb25maXJtTmFtZUlucHV0U2VsZWN0b3I6IFwiW2RhdGEta2V5LWNvbmZpcm0tbmFtZV1cIixcbiAga2V5Q29uZmlybUNoZWNrYm94U2VsZWN0b3I6IFwiW2RhdGEta2V5LWNvbmZpcm0tY2hlY2tib3hdXCIsXG4gIGtleVN1Ym1pdEVycm9yc1NlbGVjdG9yOiBcIltkYXRhLWtleS1zdWJtaXQtZXJyb3JzXVwiLFxuICB2YWxpZGF0aW9uTWlzc2luZ05hbWVNZXNzYWdlOiBcIlBsZWFzZSBlbnRlciB0aGUgQVBJIEtleSBuYW1lIHRvIGNvbmZpcm0uXCIsXG4gIHZhbGlkYXRpb25OYW1lTWlzbWF0Y2hNZXNzYWdlOiBcIkFQSSBLZXkgbmFtZSBkb2VzIG5vdCBtYXRjaC5cIixcbiAgdmFsaWRhdGlvbkNoZWNrYm94VW5jaGVja2VkTWVzc2FnZTogXCJZb3UgbXVzdCBjb25maXJtIHRvIGNvbnRpbnVlLlwiLFxufVxuXG5mdW5jdGlvbiB1c2VLZXlBY3Rpb25Db25maXJtTW9kYWwoXG4gIG1vZGFsU2VsZWN0b3I6IHN0cmluZyxcbiAgb3B0aW9uczogUGFydGlhbDx0eXBlb2YgREVGQVVMVEtFWUFDVElPTk1PREFMT1BUSU9OUz4gJiB7XG4gICAgb25Db25maXJtPzogKGtleTogQVBJS2V5KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG9uU3VjY2Vzcz86IChrZXk6IEFQSUtleSkgPT4gdm9pZDtcbiAgfSA9IHt9XG4pIHtcbiAgY29uc3QgY29uZmlnID0geyAuLi5ERUZBVUxUS0VZQUNUSU9OTU9EQUxPUFRJT05TLCAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1vZGFsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihtb2RhbFNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGlmICghbW9kYWxDb250YWluZXIpIHJldHVybiBudWxsO1xuXG4gIGxldCBhcGlLZXk6IEFQSUtleSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IGtleUZvcm0gPSBtb2RhbENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGNvbmZpZy5jb25maXJtS2V5Rm9ybVNlbGVjdG9yKSBhcyBIVE1MRm9ybUVsZW1lbnQgfCBudWxsO1xuICBjb25zdCBrZXlDb25maXJtTmFtZUlucHV0ID0gbW9kYWxDb250YWluZXIucXVlcnlTZWxlY3Rvcihjb25maWcua2V5Q29uZmlybU5hbWVJbnB1dFNlbGVjdG9yKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgY29uc3Qga2V5Q29uZmlybUNoZWNrYm94ID0gbW9kYWxDb250YWluZXIucXVlcnlTZWxlY3Rvcihjb25maWcua2V5Q29uZmlybUNoZWNrYm94U2VsZWN0b3IpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICBjb25zdCBrZXlTdWJtaXRFcnJvcnMgPSBtb2RhbENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGNvbmZpZy5rZXlTdWJtaXRFcnJvcnNTZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIGNvbnN0IGtleUFjdGlvbkNvbmZpcm1Nb2RhbCA9IHVzZU1vZGFsKG1vZGFsQ29udGFpbmVyLCB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgb25IaWRkZW4oKSB7XG4gICAgICAvLyBOZWVkIHRvIHJlc2V0IGRhdGEgYWZ0ZXIgdGhlIG1vZGFsIGlzIGZ1bGx5IGhpZGRlbiB0byBhdm9pZCBmbGlja2VyaW5nXG4gICAgICBhcGlLZXkgPSBudWxsO1xuICAgICAgY2xlYXJLZXlEYXRhKG1vZGFsQ29udGFpbmVyKTtcbiAgICAgIGtleUZvcm0/LnJlc2V0KCk7XG4gICAgICBjbGVhclZhbGlkYXRpb25TdGF0ZSgpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGdldEVycm9yTWVzc2FnZSA9IChrZXk6ICd2YWxpZGF0aW9uTWlzc2luZ05hbWUnIHwgJ3ZhbGlkYXRpb25OYW1lTWlzbWF0Y2gnIHwgJ3ZhbGlkYXRpb25DaGVja2JveFVuY2hlY2tlZCcgfCAnc3VjY2Vzc01lc3NhZ2UnIHwgJ2Vycm9yTWVzc2FnZScpID0+XG4gICAgbW9kYWxDb250YWluZXIuZGF0YXNldFtrZXldIHx8IGBQbGVhc2UgY2hlY2sgdGhlICR7a2V5fSBmaWVsZC5gO1xuXG4gIGxldCBpc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAga2V5Rm9ybT8uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBhc3luYyAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIWFwaUtleSB8fCBpc1N1Ym1pdHRpbmcgfHwgIW9wdGlvbnMub25Db25maXJtKSByZXR1cm47XG5cbiAgICBpZiAoIXZhbGlkYXRlRm9ybSgpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgaXNTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICAgIGtleUFjdGlvbkNvbmZpcm1Nb2RhbC5zaG93TG9hZGluZygpO1xuICAgICAgYXdhaXQgb3B0aW9ucy5vbkNvbmZpcm0oYXBpS2V5KTtcblxuICAgICAgLy8gU2hvdyBzdWNjZXNzIGFuZCBjbG9zZSBtb2RhbFxuICAgICAgY29uc3Qgc3VjY2Vzc01lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoJ3N1Y2Nlc3NNZXNzYWdlJykucmVwbGFjZSgne2tleU5hbWV9JywgYXBpS2V5Lm5hbWUpO1xuICAgICAgdXNlVG9hc3QoeyB0eXBlOiBcInN1Y2Nlc3NcIiwgbWVzc2FnZTogc3VjY2Vzc01lc3NhZ2UgfSk7XG4gICAgICBrZXlBY3Rpb25Db25maXJtTW9kYWwuY2xvc2UoKTtcbiAgICAgIG9wdGlvbnMub25TdWNjZXNzPy4oYXBpS2V5KTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkFQSSBjYWxsIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZSgnZXJyb3JNZXNzYWdlJykucmVwbGFjZSgne2tleU5hbWV9JywgYXBpS2V5Lm5hbWUpO1xuICAgICAgdXNlVG9hc3QoeyB0eXBlOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICBrZXlBY3Rpb25Db25maXJtTW9kYWwuaGlkZUxvYWRpbmcoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNldFZhbGlkYXRpb25TdGF0ZSA9IHVzZVZhbGlkYXRpb25TdGF0ZShrZXlTdWJtaXRFcnJvcnMpO1xuICBjb25zdCBjbGVhclZhbGlkYXRpb25TdGF0ZSA9ICgpID0+IHtcbiAgICBzZXRWYWxpZGF0aW9uU3RhdGUoXCJcIiwga2V5Q29uZmlybU5hbWVJbnB1dCk7XG4gICAgc2V0VmFsaWRhdGlvblN0YXRlKFwiXCIsIGtleUNvbmZpcm1DaGVja2JveCk7XG4gIH1cbiAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtKCkge1xuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcblxuICAgIGNsZWFyVmFsaWRhdGlvblN0YXRlKCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb25maXJtYXRpb24gbmFtZVxuICAgIGNvbnN0IG5hbWVWYWx1ZSA9IGtleUNvbmZpcm1OYW1lSW5wdXQ/LnZhbHVlPy50cmltKCk7XG4gICAgaWYgKCFuYW1lVmFsdWUpIHtcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIHNldFZhbGlkYXRpb25TdGF0ZShnZXRFcnJvck1lc3NhZ2UoJ3ZhbGlkYXRpb25NaXNzaW5nTmFtZScpLCBrZXlDb25maXJtTmFtZUlucHV0KTtcbiAgICB9IGVsc2UgaWYgKG5hbWVWYWx1ZSAhPT0gYXBpS2V5Py5uYW1lKSB7XG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICBzZXRWYWxpZGF0aW9uU3RhdGUoZ2V0RXJyb3JNZXNzYWdlKCd2YWxpZGF0aW9uTmFtZU1pc21hdGNoJyksIGtleUNvbmZpcm1OYW1lSW5wdXQpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoZWNrYm94XG4gICAgZWxzZSBpZiAoIWtleUNvbmZpcm1DaGVja2JveD8uY2hlY2tlZCkge1xuICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgc2V0VmFsaWRhdGlvblN0YXRlKGdldEVycm9yTWVzc2FnZSgndmFsaWRhdGlvbkNoZWNrYm94VW5jaGVja2VkJyksIGtleUNvbmZpcm1DaGVja2JveCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICBrZXlGb3JtPy5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICB2YWxpZGF0ZUZvcm0oKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gb3BlbktleUFjdGlvbkNvbmZpcm1Nb2RhbChrZXlEYXRhOiBBUElLZXksIHRyaWdnZXI/OiBIVE1MRWxlbWVudCkge1xuICAgIGFwaUtleSA9IGtleURhdGE7XG4gICAgbW9kYWxDb250YWluZXIgJiYgcmVuZGVyS2V5RGF0YShtb2RhbENvbnRhaW5lciwgYXBpS2V5ISk7XG4gICAga2V5QWN0aW9uQ29uZmlybU1vZGFsLm9wZW4odHJpZ2dlcik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9wZW46IG9wZW5LZXlBY3Rpb25Db25maXJtTW9kYWwsXG4gIH07XG5cbn1cblxuXG50eXBlIEtleUFjdGlvbiA9ICdkaXNhYmxlJyB8ICdlbmFibGUnIHwgJ2RlbGV0ZSc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRLZXlBY3Rpb24oYWN0aW9uOiBzdHJpbmcgfCBudWxsKTogYWN0aW9uIGlzIEtleUFjdGlvbiB7XG4gIHJldHVybiBhY3Rpb24gPT09ICdkaXNhYmxlJyB8fCBhY3Rpb24gPT09ICdlbmFibGUnIHx8IGFjdGlvbiA9PT0gJ2RlbGV0ZSc7XG59XG5cbmZ1bmN0aW9uIG1ha2VLZXlBY3Rpb25CdG4ob3B0aW9uczogeyBhY3Rpb246IEtleUFjdGlvbjsga2V5TmFtZTogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgdGl0bGU/OiBzdHJpbmcsIGNsYXNzPzogc3RyaW5nOyBkaXNhYmxlZD86IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gIGNvbnN0IGNsYXNzVHlwZSA9IG9wdGlvbnMuYWN0aW9uICE9PSAnZGVsZXRlJyA/ICdidG4tc2Vjb25kYXJ5JyA6ICdidG4tZGFuZ2VyJztcbiAgY29uc3QgaWNvblR5cGUgPSBvcHRpb25zLmFjdGlvbiA9PT0gJ2Rpc2FibGUnID8gJ2ZhLWJhbicgOiBvcHRpb25zLmFjdGlvbiA9PT0gJ2VuYWJsZScgPyAnZmEtcGxheScgOiAnZmEtdHJhc2gnO1xuICByZXR1cm4gYFxuICAgIDxidXR0b24gXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSAke2NsYXNzVHlwZX0gJHtvcHRpb25zLmNsYXNzID8/ICcnfSBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgXG4gICAgICBkYXRhLWtleS1hY3Rpb249XCIke29wdGlvbnMuYWN0aW9ufVwiIFxuICAgICAgZGF0YS1rZXk9XCIke29wdGlvbnMua2V5TmFtZX1cIiAke29wdGlvbnMuZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogJyd9IFxuICAgICAgdGl0bGU9XCIke29wdGlvbnMudGl0bGUgPz8gb3B0aW9ucy5sYWJlbCA/PyAnJ31cIiBcbiAgICAgICR7b3B0aW9ucy5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiAnJ31cbiAgICAgIHN0eWxlPVwiZ2FwOiAwLjVyZW07XCJcbiAgICA+XG4gICAgICA8aSBjbGFzcz1cImZhICR7aWNvblR5cGV9XCI+PC9pPiR7b3B0aW9ucy5sYWJlbCA/PyAnJ31cbiAgICA8L2J1dHRvbj5cbiAgYFxufSIsICJpbXBvcnQgdHlwZSB7IEFwaUtleXNDbGllbnQsIEFQSUtleSwgQ3JlYXRlQVBJS2V5RGF0YSB9IGZyb20gXCIuL2FwaVwiO1xuaW1wb3J0IHsgdXNlTW9kYWwgfSBmcm9tIFwiLi9tb2RhbFwiO1xuaW1wb3J0IHsgY29weVRleHRXaXRoVG9hc3QsIHZhbGlkYXRlQXBpS2V5TmFtZSwgcmVuZGVyS2V5RGF0YSwgY2xlYXJLZXlEYXRhIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgREVGQVVMVE9QVElPTlMgPSB7XG4gIC8vIEZvcm0gb3B0aW9uc1xuICBjcmVhdGVGb3JtU2VsZWN0b3I6IFwiI2NyZWF0ZUtleUZvcm1cIixcbiAga2V5TmFtZWlucHV0U2VsZWN0b3I6IFwiI25ld0FwaUtleUZpZWxkXCIsXG4gIHN1Ym1pdEJ0blNlbGVjdG9yOiBcIlt0eXBlPXN1Ym1pdF1cIixcbiAgcnVsZXNTZWxlY3RvcjogJ3VsLmxpc3QtdW5zdHlsZWQgW2RhdGEtdmFsaWRhdGUtcnVsZV0nLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUFQSUtleUNyZWF0aW9uKGFwaTogQXBpS2V5c0NsaWVudCwgb3B0aW9uczogUGFydGlhbDx0eXBlb2YgREVGQVVMVE9QVElPTlM+ICYgeyBvbkNyZWF0ZWQ/OiAoKSA9PiB2b2lkOyB9ID0ge30pIHtcbiAgY29uc3QgY29uZmlnID0geyAuLi5ERUZBVUxUT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gIGNvbnN0IGNyZWF0ZUZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbmZpZy5jcmVhdGVGb3JtU2VsZWN0b3IpIGFzIEhUTUxGb3JtRWxlbWVudCB8IG51bGw7XG4gIGNvbnN0IGtleU5hbWVpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29uZmlnLmtleU5hbWVpbnB1dFNlbGVjdG9yKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcblxuICBpZiAoIWNyZWF0ZUZvcm0gfHwgIWtleU5hbWVpbnB1dCkgcmV0dXJuO1xuXG4gIGNvbnN0IHZhbGlkYXRlTmFtZUFuZFNldFN0YXR1cyA9IHVzZU5hbWVWYWxpZGF0b3IoY3JlYXRlRm9ybSwgY29uZmlnLnJ1bGVzU2VsZWN0b3IpO1xuICBjb25zdCBjcmVhdGlvbk1vZGFsID0gdXNlQ3JlYXRpb25Nb2RhbCgpO1xuXG4gIC8vIEltbWVkaWF0ZSB2YWxpZGF0aW9uIG9mIGtleSBuYW1lIG9uIGlucHV0XG4gIGtleU5hbWVpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4ge1xuICAgIHZhbGlkYXRlTmFtZUFuZFNldFN0YXR1cyhrZXlOYW1laW5wdXQudmFsdWUpO1xuICB9KTtcblxuICAvLyBzdWJtaXQgZmxvd1xuICBjb25zdCBzdWJtaXRCdG4gPSBjcmVhdGVGb3JtLnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KGNvbmZpZy5zdWJtaXRCdG5TZWxlY3Rvcik7XG4gIGxldCBzdWJtaXR0aW5nID0gZmFsc2U7XG4gIGxldCBjcmVhdGVkS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY3JlYXRlRm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGFzeW5jIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzdWJtaXR0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCB2ID0gdmFsaWRhdGVOYW1lQW5kU2V0U3RhdHVzKGtleU5hbWVpbnB1dC52YWx1ZSk7XG4gICAgaWYgKCEodi5va0xlbiAmJiB2Lm9rQ2hhcnMgJiYgdi5va1NwYWNlcykpIHtcbiAgICAgIGtleU5hbWVpbnB1dC5mb2N1cygpO1xuICAgICAgcmV0dXJuXG4gICAgfTtcblxuICAgIGNvbnN0IG5hbWUgPSB2LnRyaW1tZWQ7XG5cbiAgICBzdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICBzdWJtaXRCdG4gJiYgKHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IHRydWUpO1xuXG4gICAgY3JlYXRpb25Nb2RhbD8uc2hvd0xvYWRpbmcoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGkuY3JlYXRlQVBJS2V5KHsgbmFtZSB9KTtcbiAgICAgIGNyZWF0aW9uTW9kYWw/LnNob3dTdWNjZXNzKHJlc3BvbnNlKTtcbiAgICAgIGtleU5hbWVpbnB1dC52YWx1ZSA9IFwiXCI7XG4gICAgICBjcmVhdGVkS2V5ID0gbmFtZTtcbiAgICAgIHZhbGlkYXRlTmFtZUFuZFNldFN0YXR1cyhcIlwiKTtcbiAgICAgIHRyeSB7IGNvbmZpZy5vbkNyZWF0ZWQ/LigpOyB9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcihcIm9uQ3JlYXRlZCBjYWxsYmFjayBmYWlsZWQ6XCIsIGVycik7IH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNyZWF0aW9uTW9kYWw/LnNob3dFcnJvcigpO1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgQVBJIGtleTpcIiwgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgc3VibWl0QnRuICYmIChzdWJtaXRCdG4uZGlzYWJsZWQgPSBmYWxzZSk7XG4gICAgfVxuICB9KTtcbn1cblxudHlwZSBSdWxlS2V5ID0gXCJsZW5ndGhcIiB8IFwiY2hhcnNcIiB8IFwic3BhY2VzXCI7XG5cbmZ1bmN0aW9uIHVzZU5hbWVWYWxpZGF0b3Iocm9vdDogUGFyZW50Tm9kZSwgcnVsZXNTZWxlY3RvciA9IERFRkFVTFRPUFRJT05TLnJ1bGVzU2VsZWN0b3IpIHtcbiAgY29uc3QgcnVsZXNNYXAgPSBidWlsZFJ1bGVzTWFwKHJvb3QsIHJ1bGVzU2VsZWN0b3IpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAocmF3OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2ID0gdmFsaWRhdGVBcGlLZXlOYW1lKHJhdyk7XG5cbiAgICBjb25zdCBpc0VtcHR5ID0gdi5yYXcubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IHN0YXRlID0gKG9rOiBib29sZWFuKSA9PiAoaXNFbXB0eSA/IFwiaWRsZVwiIDogb2sgPyBcIm9rXCIgOiBcImVyclwiKSBhcyBcImlkbGVcIiB8IFwib2tcIiB8IFwiZXJyXCI7XG5cbiAgICBpZiAocnVsZXNNYXAubGVuZ3RoKSBzZXRWYWxpZGF0aW9uU3RhdHVzKHJ1bGVzTWFwLmxlbmd0aCwgc3RhdGUodi5va0xlbikpO1xuICAgIGlmIChydWxlc01hcC5jaGFycykgc2V0VmFsaWRhdGlvblN0YXR1cyhydWxlc01hcC5jaGFycywgc3RhdGUodi5va0NoYXJzKSk7XG4gICAgaWYgKHJ1bGVzTWFwLnNwYWNlcykgc2V0VmFsaWRhdGlvblN0YXR1cyhydWxlc01hcC5zcGFjZXMsIHN0YXRlKHYub2tTcGFjZXMpKTtcblxuICAgIHJldHVybiB2O1xuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJ1bGVzTWFwKHJvb3Q6IFBhcmVudE5vZGUsIHJ1bGVzU2VsZWN0b3IgPSBERUZBVUxUT1BUSU9OUy5ydWxlc1NlbGVjdG9yKSB7XG4gIGNvbnN0IG1hcDogUGFydGlhbDxSZWNvcmQ8UnVsZUtleSwgSFRNTEVsZW1lbnQ+PiA9IHt9O1xuICBjb25zdCBlbHMgPSBBcnJheS5mcm9tKHJvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4ocnVsZXNTZWxlY3RvcikpO1xuICBmb3IgKGNvbnN0IGVsIG9mIGVscykge1xuICAgIGNvbnN0IGtleSA9IGVsLmRhdGFzZXQudmFsaWRhdGVSdWxlIGFzIFJ1bGVLZXkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGtleSkgbWFwW2tleV0gPSBlbDtcbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG5mdW5jdGlvbiBzZXRWYWxpZGF0aW9uU3RhdHVzKGVsOiBIVE1MRWxlbWVudCwgc3RhdGU6IFwiaWRsZVwiIHwgXCJva1wiIHwgXCJlcnJcIikge1xuICBlbC5jbGFzc0xpc3QucmVtb3ZlKFwidGV4dC1tdXRlZFwiLCBcInRleHQtc3VjY2Vzc1wiLCBcInRleHQtZGFuZ2VyXCIpO1xuICBlbC5jbGFzc0xpc3QuYWRkKHN0YXRlID09PSBcImlkbGVcIiA/IFwidGV4dC1tdXRlZFwiIDogc3RhdGUgPT09IFwib2tcIiA/IFwidGV4dC1zdWNjZXNzXCIgOiBcInRleHQtZGFuZ2VyXCIpO1xufVxuXG5jb25zdCBERUZBVUxUQ1JFQVRJT05NT0RBTE9QVElPTlMgPSB7XG4gIGNyZWF0aW9uTW9kYWxTZWxlY3RvcjogXCIjY3JlYXRlS2V5TW9kYWxcIixcbiAgbG9hZGluZ1NlY3Rpb25TZWxlY3RvcjogXCIjY3JlYXRlS2V5TW9kYWxMb2FkaW5nXCIsXG4gIHN1Y2Nlc3NTZWN0aW9uU2VsZWN0b3I6IFwiI2NyZWF0ZUtleU1vZGFsU3VjY2Vzc1wiLFxuICBlcnJvclNlY3Rpb25TZWxlY3RvcjogXCIjY3JlYXRlS2V5TW9kYWxFcnJvclwiLFxuICBjcmVhdGVkQXBpS2V5UmF3U2VsZWN0b3I6IFwiI2NyZWF0ZWRBcGlLZXlSYXdcIixcbn07XG5mdW5jdGlvbiB1c2VDcmVhdGlvbk1vZGFsKG9wdGlvbnM/OiBQYXJ0aWFsPHR5cGVvZiBERUZBVUxUQ1JFQVRJT05NT0RBTE9QVElPTlM+KSB7XG4gIGNvbnN0IGNvbmZpZyA9IHsgLi4uREVGQVVMVENSRUFUSU9OTU9EQUxPUFRJT05TLCAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1vZGFsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb25maWcuY3JlYXRpb25Nb2RhbFNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGlmICghbW9kYWxDb250YWluZXIpIHJldHVybiBudWxsO1xuXG4gIGxldCBjcmVhdGVkS2V5OiBDcmVhdGVBUElLZXlEYXRhIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IG1vZGFsID0gdXNlTW9kYWwobW9kYWxDb250YWluZXIsIHtcbiAgICBvbkhpZGRlbjogKCkgPT4ge1xuICAgICAgY2xlYXJBUElLZXlJblN1Y2Nlc3NTZWN0aW9uKCk7XG4gICAgICBjcmVhdGVkS2V5ID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGxvYWRpbmdDb250YWluZXIgPSBtb2RhbENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGNvbmZpZy5sb2FkaW5nU2VjdGlvblNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGNvbnN0IHN1Y2Nlc3NDb250YWluZXIgPSBtb2RhbENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGNvbmZpZy5zdWNjZXNzU2VjdGlvblNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGNvbnN0IGVycm9yQ29udGFpbmVyID0gbW9kYWxDb250YWluZXIucXVlcnlTZWxlY3Rvcihjb25maWcuZXJyb3JTZWN0aW9uU2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICBmdW5jdGlvbiBzaG93U2VjdGlvbih3aGljaDogXCJsb2FkaW5nXCIgfCBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIikge1xuICAgIGlmIChsb2FkaW5nQ29udGFpbmVyKSBzZVNlY3Rpb25WaXNpYmlsaXR5KGxvYWRpbmdDb250YWluZXIsIHdoaWNoID09PSBcImxvYWRpbmdcIik7XG4gICAgaWYgKHN1Y2Nlc3NDb250YWluZXIpIHNlU2VjdGlvblZpc2liaWxpdHkoc3VjY2Vzc0NvbnRhaW5lciwgd2hpY2ggPT09IFwic3VjY2Vzc1wiKTtcbiAgICBpZiAoZXJyb3JDb250YWluZXIpIHNlU2VjdGlvblZpc2liaWxpdHkoZXJyb3JDb250YWluZXIsIHdoaWNoID09PSBcImVycm9yXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QVBJS2V5SW5TdWNjZXNzU2VjdGlvbihrZXk6IENyZWF0ZUFQSUtleURhdGEpIHtcbiAgICBjcmVhdGVkS2V5ID0ga2V5O1xuICAgIGlmICghc3VjY2Vzc0NvbnRhaW5lcikgcmV0dXJuO1xuICAgIHJlbmRlcktleURhdGEoc3VjY2Vzc0NvbnRhaW5lciwgY3JlYXRlZEtleS5hcGlfa2V5IGFzIEFQSUtleSk7XG4gICAgY29uc3Qga2V5RmllbGQgPSBzdWNjZXNzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoY29uZmlnLmNyZWF0ZWRBcGlLZXlSYXdTZWxlY3RvcikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgaWYgKGtleUZpZWxkKSB7XG4gICAgICBrZXlGaWVsZC52YWx1ZSA9IGtleS5yYXdfYXBpX2tleSA/PyBcIlwiO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjbGVhckFQSUtleUluU3VjY2Vzc1NlY3Rpb24oKSB7XG4gICAgaWYgKCFzdWNjZXNzQ29udGFpbmVyKSByZXR1cm47XG4gICAgY2xlYXJLZXlEYXRhKHN1Y2Nlc3NDb250YWluZXIpO1xuICAgIGNvbnN0IGtleUZpZWxkID0gc3VjY2Vzc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGNvbmZpZy5jcmVhdGVkQXBpS2V5UmF3U2VsZWN0b3IpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChrZXlGaWVsZCkge1xuICAgICAga2V5RmllbGQudmFsdWUgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIG1vZGFsQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgdHJpZ2dlckNvcHkgPSB0YXJnZXQgJiYgdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1jb3B5LWFwaS1rZXldXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodHJpZ2dlckNvcHkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb3B5VGV4dFdpdGhUb2FzdChjcmVhdGVkS2V5Py5yYXdfYXBpX2tleSA/PyBcImFzZGFkYXNcIiwgeyB0aXRsZTogXCJBUEkgS2V5IENvcGllZFwiLCBzdWNjZXNzTWVzc2FnZTogXCJZb3VyIEFQSSBrZXkgaGFzIGJlZW4gY29waWVkIHRvIGNsaXBib2FyZC5cIiB9KTtcbiAgICB9XG4gICAgY29uc3QgdHJpZ2dlclRvZ2dsZSA9IHRhcmdldCAmJiB0YXJnZXQuY2xvc2VzdChcIltkYXRhLXRvZ2dsZS1hcGkta2V5XVwiKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHRyaWdnZXJUb2dnbGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBrZXlGaWVsZCA9IHN1Y2Nlc3NDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoY29uZmlnLmNyZWF0ZWRBcGlLZXlSYXdTZWxlY3RvcikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoa2V5RmllbGQpIHtcbiAgICAgICAgaWYgKGtleUZpZWxkLnR5cGUgPT09IFwicGFzc3dvcmRcIikge1xuICAgICAgICAgIGtleUZpZWxkLnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgICAodHJpZ2dlclRvZ2dsZS5xdWVyeVNlbGVjdG9yKFwiaVwiKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpPy5jbGFzc0xpc3QucmVwbGFjZShcImZhLWV5ZVwiLCBcImZhLWV5ZS1zbGFzaFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXlGaWVsZC50eXBlID0gXCJwYXNzd29yZFwiO1xuICAgICAgICAgICh0cmlnZ2VyVG9nZ2xlLnF1ZXJ5U2VsZWN0b3IoXCJpXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCk/LmNsYXNzTGlzdC5yZXBsYWNlKFwiZmEtZXllLXNsYXNoXCIsIFwiZmEtZXllXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHNob3dMb2FkaW5nKCkge1xuICAgICAgbW9kYWwuc2V0T3B0aW9ucyh7IGJhY2tkcm9wOiBcInN0YXRpY1wiLCBrZXlib2FyZDogZmFsc2UgfSk7XG4gICAgICBtb2RhbC5oaWRlSGVhZGVyKCk7XG4gICAgICBzaG93U2VjdGlvbihcImxvYWRpbmdcIik7XG4gICAgICBtb2RhbC5vcGVuKCk7XG4gICAgfSxcbiAgICBzaG93U3VjY2VzcyhrZXk6IENyZWF0ZUFQSUtleURhdGEpIHtcbiAgICAgIG1vZGFsLnNldE9wdGlvbnMoeyBiYWNrZHJvcDogXCJzdGF0aWNcIiwga2V5Ym9hcmQ6IGZhbHNlIH0pO1xuICAgICAgbW9kYWwuc2V0VGl0bGUoXCJPcGVyYXRpb24gc3VjY2Vzc2Z1bFwiKTtcbiAgICAgIHNldEFQSUtleUluU3VjY2Vzc1NlY3Rpb24oa2V5KTtcbiAgICAgIHNob3dTZWN0aW9uKFwic3VjY2Vzc1wiKTtcbiAgICAgIG1vZGFsLm9wZW4oKTtcbiAgICB9LFxuICAgIHNob3dFcnJvcigpIHtcbiAgICAgIG1vZGFsLnNldE9wdGlvbnMoeyBiYWNrZHJvcDogdHJ1ZSwga2V5Ym9hcmQ6IHRydWUgfSk7XG4gICAgICBtb2RhbC5zZXRUaXRsZShcIlNvbWV0aGluZyB3ZW50IHdyb25nLlwiKTtcbiAgICAgIHNob3dTZWN0aW9uKFwiZXJyb3JcIik7XG4gICAgICBtb2RhbC5vcGVuKCk7XG4gICAgfSxcbiAgfVxufVxuXG5mdW5jdGlvbiBzZVNlY3Rpb25WaXNpYmlsaXR5KHNlY3Rpb246IEhUTUxFbGVtZW50LCB2aXNpYmxlOiBib29sZWFuKSB7XG4gIHNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcbiAgaWYgKHZpc2libGUpIHtcbiAgICBzZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoXCJkLW5vbmVcIik7XG4gIH0gZWxzZSB7XG4gICAgc2VjdGlvbi5jbGFzc0xpc3QuYWRkKFwiZC1ub25lXCIpO1xuICB9XG59IiwgIi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxufVxuIiwgImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi9pc09iamVjdCdcblxuLyoqXG4gKiBEZWVwbHkgbWVyZ2VzIHR3byBnaXZlbiBvYmplY3RzIHdpdGggdGhlIHJpZ2h0IG9uZVxuICogaGF2aW5nIGEgcHJpb3JpdHkgZHVyaW5nIHByb3BlcnR5IGFzc2lnbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJpZ2h0KFxuICBsZWZ0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICByaWdodDogUmVjb3JkPHN0cmluZywgYW55Pixcbikge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmlnaHQpLnJlZHVjZShcbiAgICAocmVzdWx0LCBba2V5LCByaWdodFZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gcmVzdWx0W2tleV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGVmdFZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHJpZ2h0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbGVmdFZhbHVlLmNvbmNhdChyaWdodFZhbHVlKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG5cbiAgICAgIGlmIChpc09iamVjdChsZWZ0VmFsdWUpICYmIGlzT2JqZWN0KHJpZ2h0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VSaWdodChsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2tleV0gPSByaWdodFZhbHVlXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBsZWZ0KSxcbiAgKVxufVxuIiwgImNvbnN0IFBPU0lUSU9OQUxTX0VYUCA9IC8oJT8pKCUoW3NkaWpvXSkpL2dcblxuZnVuY3Rpb24gc2VyaWFsaXplUG9zaXRpb25hbChwb3NpdGlvbmFsOiBhbnksIGZsYWc6IHN0cmluZyk6IGFueSB7XG4gIHN3aXRjaCAoZmxhZykge1xuICAgIC8vIFN0cmluZ3MuXG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gcG9zaXRpb25hbFxuXG4gICAgLy8gRGlnaXRzLlxuICAgIGNhc2UgJ2QnOlxuICAgIGNhc2UgJ2knOlxuICAgICAgcmV0dXJuIE51bWJlcihwb3NpdGlvbmFsKVxuXG4gICAgLy8gSlNPTi5cbiAgICBjYXNlICdqJzpcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwb3NpdGlvbmFsKVxuXG4gICAgLy8gT2JqZWN0cy5cbiAgICBjYXNlICdvJzoge1xuICAgICAgLy8gUHJlc2VydmUgc3RpbmdzIHRvIHByZXZlbnQgZXh0cmEgcXVvdGVzIGFyb3VuZCB0aGVtLlxuICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcG9zaXRpb25hbFxuICAgICAgfVxuXG4gICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocG9zaXRpb25hbClcblxuICAgICAgLy8gSWYgdGhlIHBvc2l0aW9uYWwgaXNuJ3Qgc2VyaWFsaXphYmxlLCByZXR1cm4gaXQgYXMtaXMuXG4gICAgICBpZiAoanNvbiA9PT0gJ3t9JyB8fCBqc29uID09PSAnW10nIHx8IC9eXFxbb2JqZWN0IC4rP1xcXSQvLnRlc3QoanNvbikpIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uYWxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGpzb25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChtZXNzYWdlOiBzdHJpbmcsIC4uLnBvc2l0aW9uYWxzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGlmIChwb3NpdGlvbmFscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbWVzc2FnZVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uYWxJbmRleCA9IDBcbiAgbGV0IGZvcm1hdHRlZE1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoXG4gICAgUE9TSVRJT05BTFNfRVhQLFxuICAgIChtYXRjaCwgaXNFc2NhcGVkLCBfLCBmbGFnKSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbmFsID0gcG9zaXRpb25hbHNbcG9zaXRpb25hbEluZGV4XVxuICAgICAgY29uc3QgdmFsdWUgPSBzZXJpYWxpemVQb3NpdGlvbmFsKHBvc2l0aW9uYWwsIGZsYWcpXG5cbiAgICAgIGlmICghaXNFc2NhcGVkKSB7XG4gICAgICAgIHBvc2l0aW9uYWxJbmRleCsrXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2hcbiAgICB9XG4gIClcblxuICAvLyBBcHBlbmQgdW5yZXNvbHZlZCBwb3NpdGlvbmFscyB0byBzdHJpbmcgYXMtaXMuXG4gIGlmIChwb3NpdGlvbmFsSW5kZXggPCBwb3NpdGlvbmFscy5sZW5ndGgpIHtcbiAgICBmb3JtYXR0ZWRNZXNzYWdlICs9IGAgJHtwb3NpdGlvbmFscy5zbGljZShwb3NpdGlvbmFsSW5kZXgpLmpvaW4oJyAnKX1gXG4gIH1cblxuICBmb3JtYXR0ZWRNZXNzYWdlID0gZm9ybWF0dGVkTWVzc2FnZS5yZXBsYWNlKC8lezIsMn0vZywgJyUnKVxuXG4gIHJldHVybiBmb3JtYXR0ZWRNZXNzYWdlXG59XG4iLCAiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnLi9mb3JtYXQnXG5cbmNvbnN0IFNUQUNLX0ZSQU1FU19UT19JR05PUkUgPSAyXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBcIm91dHZhcmlhbnRcIiBwYWNrYWdlIHRyYWNlIGZyb20gdGhlIGdpdmVuIGVycm9yLlxuICogVGhpcyBzY29wZXMgZG93biB0aGUgZXJyb3Igc3RhY2sgdG8gdGhlIHJlbGV2YW50IHBhcnRzXG4gKiB3aGVuIHVzZWQgaW4gb3RoZXIgYXBwbGljYXRpb25zLlxuICovXG5mdW5jdGlvbiBjbGVhbkVycm9yU3RhY2soZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gIGlmICghZXJyb3Iuc3RhY2spIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5leHRTdGFjayA9IGVycm9yLnN0YWNrLnNwbGl0KCdcXG4nKVxuICBuZXh0U3RhY2suc3BsaWNlKDEsIFNUQUNLX0ZSQU1FU19UT19JR05PUkUpXG4gIGVycm9yLnN0YWNrID0gbmV4dFN0YWNrLmpvaW4oJ1xcbicpXG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhcmlhbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJ1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcsIC4uLnBvc2l0aW9uYWxzOiBhbnlbXSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5tZXNzYWdlID0gZm9ybWF0KG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKVxuICAgIGNsZWFuRXJyb3JTdGFjayh0aGlzKVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRXJyb3JDb25zdHJ1Y3RvciB7XG4gIG5ldyAobWVzc2FnZTogc3RyaW5nKTogRXJyb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21FcnJvckZhY3Rvcnkge1xuICAobWVzc2FnZTogc3RyaW5nKTogRXJyb3Jcbn1cblxuZXhwb3J0IHR5cGUgQ3VzdG9tRXJyb3IgPSBDdXN0b21FcnJvckNvbnN0cnVjdG9yIHwgQ3VzdG9tRXJyb3JGYWN0b3J5XG5cbnR5cGUgSW52YXJpYW50ID0ge1xuICAoXG4gICAgcHJlZGljYXRlOiB1bmtub3duLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAuLi5wb3NpdGlvbmFsczogYW55W11cbiAgKTogYXNzZXJ0cyBwcmVkaWNhdGVcblxuICBhcyhcbiAgICBFcnJvckNvbnN0cnVjdG9yOiBDdXN0b21FcnJvcixcbiAgICBwcmVkaWNhdGU6IHVua25vd24sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIC4uLnBvc2l0aW9uYWxzOiB1bmtub3duW11cbiAgKTogYXNzZXJ0cyBwcmVkaWNhdGVcbn1cblxuZXhwb3J0IGNvbnN0IGludmFyaWFudDogSW52YXJpYW50ID0gKFxuICBwcmVkaWNhdGUsXG4gIG1lc3NhZ2UsXG4gIC4uLnBvc2l0aW9uYWxzXG4pOiBhc3NlcnRzIHByZWRpY2F0ZSA9PiB7XG4gIGlmICghcHJlZGljYXRlKSB7XG4gICAgdGhyb3cgbmV3IEludmFyaWFudEVycm9yKG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKVxuICB9XG59XG5cbmludmFyaWFudC5hcyA9IChFcnJvckNvbnN0cnVjdG9yLCBwcmVkaWNhdGUsIG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSA9PiB7XG4gIGlmICghcHJlZGljYXRlKSB7XG4gICAgY29uc3QgZm9ybWF0TWVzc2FnZSA9XG4gICAgICBwb3NpdGlvbmFscy5sZW5ndGggPT09IDAgPyBtZXNzYWdlIDogZm9ybWF0KG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKVxuICAgIGxldCBlcnJvcjogRXJyb3JcblxuICAgIHRyeSB7XG4gICAgICBlcnJvciA9IFJlZmxlY3QuY29uc3RydWN0KEVycm9yQ29uc3RydWN0b3IgYXMgQ3VzdG9tRXJyb3JDb25zdHJ1Y3RvciwgW1xuICAgICAgICBmb3JtYXRNZXNzYWdlLFxuICAgICAgXSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yID0gKEVycm9yQ29uc3RydWN0b3IgYXMgQ3VzdG9tRXJyb3JGYWN0b3J5KShmb3JtYXRNZXNzYWdlKVxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdvdXR2YXJpYW50J1xuXG5jb25zdCBMSUJSQVJZX1BSRUZJWCA9ICdbTVNXXSdcblxuLyoqXG4gKiBGb3JtYXRzIGEgZ2l2ZW4gbWVzc2FnZSBieSBhcHBlbmRpbmcgdGhlIGxpYnJhcnkncyBwcmVmaXggc3RyaW5nLlxuICovXG5mdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgLi4ucG9zaXRpb25hbHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgaW50ZXJwb2xhdGVkTWVzc2FnZSA9IGZvcm1hdChtZXNzYWdlLCAuLi5wb3NpdGlvbmFscylcbiAgcmV0dXJuIGAke0xJQlJBUllfUFJFRklYfSAke2ludGVycG9sYXRlZE1lc3NhZ2V9YFxufVxuXG4vKipcbiAqIFByaW50cyBhIGxpYnJhcnktc3BlY2lmaWMgd2FybmluZy5cbiAqL1xuZnVuY3Rpb24gd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLnBvc2l0aW9uYWxzOiBhbnlbXSk6IHZvaWQge1xuICBjb25zb2xlLndhcm4oZm9ybWF0TWVzc2FnZShtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykpXG59XG5cbi8qKlxuICogUHJpbnRzIGEgbGlicmFyeS1zcGVjaWZpYyBlcnJvci5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5wb3NpdGlvbmFsczogYW55W10pOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihmb3JtYXRNZXNzYWdlKG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSlcbn1cblxuZXhwb3J0IGNvbnN0IGRldlV0aWxzID0ge1xuICBmb3JtYXRNZXNzYWdlLFxuICB3YXJuLFxuICBlcnJvcixcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlcnJvciBpbnN0YW5jZS5cbiAqIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgbGlicmFyeSBlcnJvcnMgdGhhdCBtdXN0IGJlIGZvcndhcmRlZFxuICogdG8gdGhlIHVzZXIgZnJvbSB0aGUgdW5oYW5kbGVkIGV4Y2VwdGlvbnMuIFVzZSB0aGlzIGlmIHlvdSBkb24ndFxuICogd2lzaCBmb3IgdGhlIGVycm9yIHRvIGJlIGNvZXJjZWQgdG8gYSA1MDAgZmFsbGJhY2sgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdJbnRlcm5hbEVycm9yJ1xuICB9XG59XG4iLCAiLy8gSWdub3JlIHRoZSBzb3VyY2UgZmlsZXMgdHJhY2VzIGZvciBsb2NhbCB0ZXN0aW5nLlxuY29uc3QgU09VUkNFX0ZSQU1FID0gL1svXFxcXF1tc3dbL1xcXFxdc3JjWy9cXFxcXSguKykvXG5cbmNvbnN0IEJVSUxEX0ZSQU1FID1cbiAgLyhub2RlX21vZHVsZXMpP1svXFxcXF1saWJbL1xcXFxdKGNvcmV8YnJvd3Nlcnxub2RlfG5hdGl2ZXxpaWZlKVsvXFxcXF18XlteL1xcXFxdKiQvXG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdGFjayB0cmFjZSBmcmFtZSBvZiBhIGZ1bmN0aW9uJ3MgaW52b2NhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhbGxGcmFtZShlcnJvcjogRXJyb3IpIHtcbiAgLy8gSW4gPElFMTEsIG5ldyBFcnJvciBtYXkgcmV0dXJuIGFuIHVuZGVmaW5lZCBzdGFja1xuICBjb25zdCBzdGFjayA9IGVycm9yLnN0YWNrXG5cbiAgaWYgKCFzdGFjaykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZnJhbWVzOiBzdHJpbmdbXSA9IHN0YWNrLnNwbGl0KCdcXG4nKS5zbGljZSgxKVxuXG4gIC8vIEdldCB0aGUgZmlyc3QgZnJhbWUgdGhhdCBkb2Vzbid0IHJlZmVyZW5jZSB0aGUgbGlicmFyeSdzIGludGVybmFsIHRyYWNlLlxuICAvLyBBc3N1bWUgdGhhdCBmcmFtZSBpcyB0aGUgaW52b2NhdGlvbiBmcmFtZS5cbiAgY29uc3QgZGVjbGFyYXRpb25GcmFtZSA9IGZyYW1lcy5maW5kKChmcmFtZSkgPT4ge1xuICAgIHJldHVybiAhKFNPVVJDRV9GUkFNRS50ZXN0KGZyYW1lKSB8fCBCVUlMRF9GUkFNRS50ZXN0KGZyYW1lKSlcbiAgfSlcblxuICBpZiAoIWRlY2xhcmF0aW9uRnJhbWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEV4dHJhY3QgZmlsZSByZWZlcmVuY2UgZnJvbSB0aGUgc3RhY2sgZnJhbWUuXG4gIGNvbnN0IGRlY2xhcmF0aW9uUGF0aCA9IGRlY2xhcmF0aW9uRnJhbWVcbiAgICAucmVwbGFjZSgvXFxzKmF0IFteKCldKlxcKChbXildKylcXCkvLCAnJDEnKVxuICAgIC5yZXBsYWNlKC9eQC8sICcnKVxuICByZXR1cm4gZGVjbGFyYXRpb25QYXRoXG59XG4iLCAiLyoqXG4gKiBUaGlzIGlzIHRoZSBzYW1lIGFzIFR5cGVTY3JpcHQncyBgSXRlcmFibGVgLCBidXQgd2l0aCBhbGwgdGhyZWUgdHlwZSBwYXJhbWV0ZXJzLlxuICogQHRvZG8gUmVtb3ZlIG9uY2UgVHlwZVNjcmlwdCA1LjYgaXMgdGhlIG1pbmltdW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlcmFibGU8VCwgVFJldHVybiwgVE5leHQ+IHtcbiAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2FtZSBhcyBUeXBlU2NyaXB0J3MgYEFzeW5jSXRlcmFibGVgLCBidXQgd2l0aCBhbGwgdGhyZWUgdHlwZSBwYXJhbWV0ZXJzLlxuICogQHRvZG8gUmVtb3ZlIG9uY2UgVHlwZVNjcmlwdCA1LjYgaXMgdGhlIG1pbmltdW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNJdGVyYWJsZTxULCBUUmV0dXJuLCBUTmV4dD4ge1xuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYW4gaXRlcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0l0ZXJhYmxlPEl0ZXJhdG9yVHlwZT4oXG4gIGZuOiBhbnksXG4pOiBmbiBpc1xuICB8IEl0ZXJhYmxlPEl0ZXJhdG9yVHlwZSwgSXRlcmF0b3JUeXBlLCBJdGVyYXRvclR5cGU+XG4gIHwgQXN5bmNJdGVyYWJsZTxJdGVyYXRvclR5cGUsIEl0ZXJhdG9yVHlwZSwgSXRlcmF0b3JUeXBlPiB7XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgUmVmbGVjdC5oYXMoZm4sIFN5bWJvbC5pdGVyYXRvcikgfHwgUmVmbGVjdC5oYXMoZm4sIFN5bWJvbC5hc3luY0l0ZXJhdG9yKVxuICApXG59XG4iLCAiaW1wb3J0IHsgZ2V0Q2FsbEZyYW1lIH0gZnJvbSAnLi4vdXRpbHMvaW50ZXJuYWwvZ2V0Q2FsbEZyYW1lJ1xuaW1wb3J0IHtcbiAgQXN5bmNJdGVyYWJsZSxcbiAgSXRlcmFibGUsXG4gIGlzSXRlcmFibGUsXG59IGZyb20gJy4uL3V0aWxzL2ludGVybmFsL2lzSXRlcmFibGUnXG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlUmVzb2x1dGlvbkNvbnRleHQgfSBmcm9tICcuLi91dGlscy9leGVjdXRlSGFuZGxlcnMnXG5pbXBvcnQgdHlwZSB7IE1heWJlUHJvbWlzZSB9IGZyb20gJy4uL3R5cGVVdGlscydcbmltcG9ydCB7XG4gIFN0cmljdFJlcXVlc3QsXG4gIEh0dHBSZXNwb25zZSxcbiAgRGVmYXVsdFVuc2FmZUZldGNoUmVzcG9uc2UsXG59IGZyb20gJy4uL0h0dHBSZXNwb25zZSdcbmltcG9ydCB0eXBlIHsgSGFuZGxlcktpbmQgfSBmcm9tICcuL2NvbW1vbidcbmltcG9ydCB0eXBlIHsgR3JhcGhRTFJlcXVlc3RCb2R5IH0gZnJvbSAnLi9HcmFwaFFMSGFuZGxlcidcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFJlcXVlc3RNdWx0aXBhcnRCb2R5ID0gUmVjb3JkPFxuICBzdHJpbmcsXG4gIHN0cmluZyB8IEZpbGUgfCBBcnJheTxzdHJpbmcgfCBGaWxlPlxuPlxuXG5leHBvcnQgdHlwZSBEZWZhdWx0Qm9keVR5cGUgPVxuICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgfCBEZWZhdWx0UmVxdWVzdE11bHRpcGFydEJvZHlcbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuXG5leHBvcnQgdHlwZSBKc29uQm9keVR5cGUgPVxuICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RIYW5kbGVyRGVmYXVsdEluZm8ge1xuICBoZWFkZXI6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RIYW5kbGVySW50ZXJuYWxJbmZvIHtcbiAgY2FsbEZyYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlUmVzb2x2ZXJSZXR1cm5UeXBlPFxuICBSZXNwb25zZUJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlID0gdW5kZWZpbmVkLFxuPiA9XG4gIC8vIElmIFJlc3BvbnNlQm9keVR5cGUgaXMgYSB1bmlvbiBhbmQgb25lIG9mIHRoZSB0eXBlcyBpcyBgdW5kZWZpbmVkYCxcbiAgLy8gYWxsb3cgcGxhaW4gUmVzcG9uc2UgYXMgdGhlIHR5cGUuXG4gIHwgKFtSZXNwb25zZUJvZHlUeXBlXSBleHRlbmRzIFt1bmRlZmluZWRdXG4gICAgICA/IFJlc3BvbnNlXG4gICAgICA6IC8qKlxuICAgICAgICAgKiBUcmVhdCBHcmFwaFFMIHJlc3BvbnNlIGJvZHkgdHlwZSBhcyBhIHNwZWNpYWwgY2FzZS5cbiAgICAgICAgICogRm9yIGVzb21lIHJlYXNvbiwgbWFraW5nIHRoZSBkZWZhdWx0IEh0dHBSZXNwb25zZTxUPiB8IERlZmF1bHRVbnNhZmVGZXRjaFJlc3BvbnNlXG4gICAgICAgICAqIHVuaW9uIGJyZWFrcyB0aGUgYm9keSB0eXBlIGluZmVyZW5jZSBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvbXN3L2lzc3Vlcy8yMTMwXG4gICAgICAgICAqL1xuICAgICAgICBSZXNwb25zZUJvZHlUeXBlIGV4dGVuZHMgR3JhcGhRTFJlcXVlc3RCb2R5PGFueT5cbiAgICAgICAgPyBIdHRwUmVzcG9uc2U8UmVzcG9uc2VCb2R5VHlwZT4gfCBEZWZhdWx0VW5zYWZlRmV0Y2hSZXNwb25zZVxuICAgICAgICA6IEh0dHBSZXNwb25zZTxSZXNwb25zZUJvZHlUeXBlPilcbiAgfCB1bmRlZmluZWRcbiAgfCB2b2lkXG5cbmV4cG9ydCB0eXBlIE1heWJlQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZTxcbiAgUmVzcG9uc2VCb2R5VHlwZSBleHRlbmRzIERlZmF1bHRCb2R5VHlwZSxcbj4gPSBNYXliZVByb21pc2U8UmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8UmVzcG9uc2VCb2R5VHlwZT4+XG5cbmV4cG9ydCB0eXBlIEFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8XG4gIFJlc3BvbnNlQm9keVR5cGUgZXh0ZW5kcyBEZWZhdWx0Qm9keVR5cGUsXG4+ID0gTWF5YmVQcm9taXNlPFxuICB8IFJlc3BvbnNlUmVzb2x2ZXJSZXR1cm5UeXBlPFJlc3BvbnNlQm9keVR5cGU+XG4gIHwgSXRlcmFibGU8XG4gICAgICBNYXliZUFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8UmVzcG9uc2VCb2R5VHlwZT4sXG4gICAgICBNYXliZUFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8UmVzcG9uc2VCb2R5VHlwZT4sXG4gICAgICBNYXliZUFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8UmVzcG9uc2VCb2R5VHlwZT5cbiAgICA+XG4gIHwgQXN5bmNJdGVyYWJsZTxcbiAgICAgIE1heWJlQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZTxSZXNwb25zZUJvZHlUeXBlPixcbiAgICAgIE1heWJlQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZTxSZXNwb25zZUJvZHlUeXBlPixcbiAgICAgIE1heWJlQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZTxSZXNwb25zZUJvZHlUeXBlPlxuICAgID5cbj5cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VSZXNvbHZlckluZm88XG4gIFJlc29sdmVyRXh0cmFJbmZvIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFJlcXVlc3RCb2R5VHlwZSBleHRlbmRzIERlZmF1bHRCb2R5VHlwZSA9IERlZmF1bHRCb2R5VHlwZSxcbj4gPSB7XG4gIHJlcXVlc3Q6IFN0cmljdFJlcXVlc3Q8UmVxdWVzdEJvZHlUeXBlPlxuICByZXF1ZXN0SWQ6IHN0cmluZ1xufSAmIFJlc29sdmVyRXh0cmFJbmZvXG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlUmVzb2x2ZXI8XG4gIFJlc29sdmVyRXh0cmFJbmZvIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgUmVxdWVzdEJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlID0gRGVmYXVsdEJvZHlUeXBlLFxuICBSZXNwb25zZUJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlID0gdW5kZWZpbmVkLFxuPiA9IChcbiAgaW5mbzogUmVzcG9uc2VSZXNvbHZlckluZm88UmVzb2x2ZXJFeHRyYUluZm8sIFJlcXVlc3RCb2R5VHlwZT4sXG4pID0+IEFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8UmVzcG9uc2VCb2R5VHlwZT5cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0SGFuZGxlckFyZ3M8XG4gIEhhbmRsZXJJbmZvLFxuICBIYW5kbGVyT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RIYW5kbGVyT3B0aW9ucyxcbj4ge1xuICBpbmZvOiBIYW5kbGVySW5mb1xuICByZXNvbHZlcjogUmVzcG9uc2VSZXNvbHZlcjxhbnk+XG4gIG9wdGlvbnM/OiBIYW5kbGVyT3B0aW9uc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RIYW5kbGVyT3B0aW9ucyB7XG4gIG9uY2U/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEhhbmRsZXJFeGVjdXRpb25SZXN1bHQ8XG4gIFBhcnNlZFJlc3VsdCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuPiB7XG4gIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyXG4gIHBhcnNlZFJlc3VsdD86IFBhcnNlZFJlc3VsdFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4gIHJlcXVlc3RJZDogc3RyaW5nXG4gIHJlc3BvbnNlPzogUmVzcG9uc2Vcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlcXVlc3RIYW5kbGVyPFxuICBIYW5kbGVySW5mbyBleHRlbmRzIFJlcXVlc3RIYW5kbGVyRGVmYXVsdEluZm8gPSBSZXF1ZXN0SGFuZGxlckRlZmF1bHRJbmZvLFxuICBQYXJzZWRSZXN1bHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkID0gYW55LFxuICBSZXNvbHZlckV4dHJhcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gYW55LFxuICBIYW5kbGVyT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RIYW5kbGVyT3B0aW9ucyA9IFJlcXVlc3RIYW5kbGVyT3B0aW9ucyxcbj4ge1xuICBzdGF0aWMgY2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgICBTdHJpY3RSZXF1ZXN0PERlZmF1bHRCb2R5VHlwZT4sXG4gICAgU3RyaWN0UmVxdWVzdDxEZWZhdWx0Qm9keVR5cGU+XG4gID4oKVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX19raW5kOiBIYW5kbGVyS2luZFxuXG4gIHB1YmxpYyBpbmZvOiBIYW5kbGVySW5mbyAmIFJlcXVlc3RIYW5kbGVySW50ZXJuYWxJbmZvXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHJlcXVlc3QgaGFuZGxlciBoYXMgYmVlbiB1c2VkXG4gICAqIChpdHMgcmVzb2x2ZXIgaGFzIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCkuXG4gICAqL1xuICBwdWJsaWMgaXNVc2VkOiBib29sZWFuXG5cbiAgcHJvdGVjdGVkIHJlc29sdmVyOiBSZXNwb25zZVJlc29sdmVyPFJlc29sdmVyRXh0cmFzLCBhbnksIGFueT5cbiAgcHJpdmF0ZSByZXNvbHZlckl0ZXJhdG9yPzpcbiAgICB8IEl0ZXJhdG9yPFxuICAgICAgICBNYXliZUFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8YW55PixcbiAgICAgICAgTWF5YmVBc3luY1Jlc3BvbnNlUmVzb2x2ZXJSZXR1cm5UeXBlPGFueT4sXG4gICAgICAgIE1heWJlQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZTxhbnk+XG4gICAgICA+XG4gICAgfCBBc3luY0l0ZXJhdG9yPFxuICAgICAgICBNYXliZUFzeW5jUmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8YW55PixcbiAgICAgICAgTWF5YmVBc3luY1Jlc3BvbnNlUmVzb2x2ZXJSZXR1cm5UeXBlPGFueT4sXG4gICAgICAgIE1heWJlQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZTxhbnk+XG4gICAgICA+XG4gIHByaXZhdGUgcmVzb2x2ZXJJdGVyYXRvclJlc3VsdD86IFJlc3BvbnNlIHwgSHR0cFJlc3BvbnNlPGFueT5cbiAgcHJpdmF0ZSBvcHRpb25zPzogSGFuZGxlck9wdGlvbnNcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBSZXF1ZXN0SGFuZGxlckFyZ3M8SGFuZGxlckluZm8sIEhhbmRsZXJPcHRpb25zPikge1xuICAgIHRoaXMucmVzb2x2ZXIgPSBhcmdzLnJlc29sdmVyXG4gICAgdGhpcy5vcHRpb25zID0gYXJncy5vcHRpb25zXG5cbiAgICBjb25zdCBjYWxsRnJhbWUgPSBnZXRDYWxsRnJhbWUobmV3IEVycm9yKCkpXG5cbiAgICB0aGlzLmluZm8gPSB7XG4gICAgICAuLi5hcmdzLmluZm8sXG4gICAgICBjYWxsRnJhbWUsXG4gICAgfVxuXG4gICAgdGhpcy5pc1VzZWQgPSBmYWxzZVxuICAgIHRoaXMuX19raW5kID0gJ1JlcXVlc3RIYW5kbGVyJ1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgaW50ZXJjZXB0ZWQgcmVxdWVzdCBzaG91bGQgYmUgbW9ja2VkLlxuICAgKi9cbiAgYWJzdHJhY3QgcHJlZGljYXRlKGFyZ3M6IHtcbiAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgcGFyc2VkUmVzdWx0OiBQYXJzZWRSZXN1bHRcbiAgICByZXNvbHV0aW9uQ29udGV4dD86IFJlc3BvbnNlUmVzb2x1dGlvbkNvbnRleHRcbiAgfSk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+XG5cbiAgLyoqXG4gICAqIFByaW50IG91dCB0aGUgc3VjY2Vzc2Z1bGx5IGhhbmRsZWQgcmVxdWVzdC5cbiAgICovXG4gIGFic3RyYWN0IGxvZyhhcmdzOiB7XG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICAgIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgIHBhcnNlZFJlc3VsdDogUGFyc2VkUmVzdWx0XG4gIH0pOiB2b2lkXG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBpbnRlcmNlcHRlZCByZXF1ZXN0IHRvIGV4dHJhY3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIGl0LlxuICAgKiBQYXJzZWQgcmVzdWx0IGlzIHRoZW4gZXhwb3NlZCB0byBvdGhlciBtZXRob2RzIG9mIHRoaXMgcmVxdWVzdCBoYW5kbGVyLlxuICAgKi9cbiAgYXN5bmMgcGFyc2UoX2FyZ3M6IHtcbiAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgcmVzb2x1dGlvbkNvbnRleHQ/OiBSZXNwb25zZVJlc29sdXRpb25Db250ZXh0XG4gIH0pOiBQcm9taXNlPFBhcnNlZFJlc3VsdD4ge1xuICAgIHJldHVybiB7fSBhcyBQYXJzZWRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IGlmIHRoaXMgaGFuZGxlciBtYXRjaGVzIHRoZSBnaXZlbiByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgdXNlZCBpbnRlcm5hbGx5IGJ1dCBpcyBleHBvc2VkXG4gICAqIGFzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjb25zdW1lcnMgd3JpdGluZyBjdXN0b21cbiAgICogaGFuZGxlcnMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGVzdChhcmdzOiB7XG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICAgIHJlc29sdXRpb25Db250ZXh0PzogUmVzcG9uc2VSZXNvbHV0aW9uQ29udGV4dFxuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGFyc2VkUmVzdWx0ID0gYXdhaXQgdGhpcy5wYXJzZSh7XG4gICAgICByZXF1ZXN0OiBhcmdzLnJlcXVlc3QsXG4gICAgICByZXNvbHV0aW9uQ29udGV4dDogYXJncy5yZXNvbHV0aW9uQ29udGV4dCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMucHJlZGljYXRlKHtcbiAgICAgIHJlcXVlc3Q6IGFyZ3MucmVxdWVzdCxcbiAgICAgIHBhcnNlZFJlc3VsdCxcbiAgICAgIHJlc29sdXRpb25Db250ZXh0OiBhcmdzLnJlc29sdXRpb25Db250ZXh0LFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0ZW5kUmVzb2x2ZXJBcmdzKF9hcmdzOiB7XG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICAgIHBhcnNlZFJlc3VsdDogUGFyc2VkUmVzdWx0XG4gIH0pOiBSZXNvbHZlckV4dHJhcyB7XG4gICAgcmV0dXJuIHt9IGFzIFJlc29sdmVyRXh0cmFzXG4gIH1cblxuICAvLyBDbG9uZSB0aGUgcmVxdWVzdCBpbnN0YW5jZSBiZWZvcmUgaXQncyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgcGhhc2VzXG4gIC8vIGFuZCB0aGUgcmVzcG9uc2UgcmVzb2x2ZXIgc28gd2UgY2FuIGFsd2F5cyByZWFkIGl0IGZvciBsb2dnaW5nLlxuICAvLyBXZSBvbmx5IGNsb25lIGl0IG9uY2UgcGVyIHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQuXG4gIHByaXZhdGUgY2xvbmVSZXF1ZXN0T3JHZXRGcm9tQ2FjaGUoXG4gICAgcmVxdWVzdDogU3RyaWN0UmVxdWVzdDxEZWZhdWx0Qm9keVR5cGU+LFxuICApOiBTdHJpY3RSZXF1ZXN0PERlZmF1bHRCb2R5VHlwZT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nQ2xvbmUgPSBSZXF1ZXN0SGFuZGxlci5jYWNoZS5nZXQocmVxdWVzdClcblxuICAgIGlmICh0eXBlb2YgZXhpc3RpbmdDbG9uZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0Nsb25lXG4gICAgfVxuXG4gICAgY29uc3QgY2xvbmVkUmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoKVxuICAgIFJlcXVlc3RIYW5kbGVyLmNhY2hlLnNldChyZXF1ZXN0LCBjbG9uZWRSZXF1ZXN0KVxuXG4gICAgcmV0dXJuIGNsb25lZFJlcXVlc3RcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoaXMgcmVxdWVzdCBoYW5kbGVyIGFuZCBwcm9kdWNlIGEgbW9ja2VkIHJlc3BvbnNlXG4gICAqIHVzaW5nIHRoZSBnaXZlbiByZXNvbHZlciBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW4oYXJnczoge1xuICAgIHJlcXVlc3Q6IFN0cmljdFJlcXVlc3Q8YW55PlxuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgcmVzb2x1dGlvbkNvbnRleHQ/OiBSZXNwb25zZVJlc29sdXRpb25Db250ZXh0XG4gIH0pOiBQcm9taXNlPFJlcXVlc3RIYW5kbGVyRXhlY3V0aW9uUmVzdWx0PFBhcnNlZFJlc3VsdD4gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuaXNVc2VkICYmIHRoaXMub3B0aW9ucz8ub25jZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBDbG9uZSB0aGUgcmVxdWVzdC5cbiAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIE1TVyBoYW5kbGVzIHRoaXMgcmVxdWVzdCwgYSBmcmVzaCBjbG9uZVxuICAgIC8vIHdpbGwgYmUgY3JlYXRlZCBhbmQgY2FjaGVkLiBVcG9uIGZ1cnRoZXIgaGFuZGxpbmcgb2YgdGhlIHNhbWUgcmVxdWVzdCxcbiAgICAvLyB0aGUgcmVxdWVzdCBjbG9uZSBmcm9tIHRoZSBjYWNoZSB3aWxsIGJlIHJldXNlZCB0byBwcmV2ZW50IGFidW5kYW50XG4gICAgLy8gXCJhYm9ydFwiIGxpc3RlbmVycyBhbmQgc2F2ZSB1cCByZXNvdXJjZXMgb24gY2xvbmluZy5cbiAgICBjb25zdCByZXF1ZXN0Q2xvbmUgPSB0aGlzLmNsb25lUmVxdWVzdE9yR2V0RnJvbUNhY2hlKGFyZ3MucmVxdWVzdClcblxuICAgIGNvbnN0IHBhcnNlZFJlc3VsdCA9IGF3YWl0IHRoaXMucGFyc2Uoe1xuICAgICAgcmVxdWVzdDogYXJncy5yZXF1ZXN0LFxuICAgICAgcmVzb2x1dGlvbkNvbnRleHQ6IGFyZ3MucmVzb2x1dGlvbkNvbnRleHQsXG4gICAgfSlcbiAgICBjb25zdCBzaG91bGRJbnRlcmNlcHRSZXF1ZXN0ID0gYXdhaXQgdGhpcy5wcmVkaWNhdGUoe1xuICAgICAgcmVxdWVzdDogYXJncy5yZXF1ZXN0LFxuICAgICAgcGFyc2VkUmVzdWx0LFxuICAgICAgcmVzb2x1dGlvbkNvbnRleHQ6IGFyZ3MucmVzb2x1dGlvbkNvbnRleHQsXG4gICAgfSlcblxuICAgIGlmICghc2hvdWxkSW50ZXJjZXB0UmVxdWVzdCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBSZS1jaGVjayBpc1VzZWQsIGluIGNhc2UgYW5vdGhlciByZXF1ZXN0IGhpdCB0aGlzIGhhbmRsZXIgd2hpbGUgd2Ugd2VyZVxuICAgIC8vIGFzeW5jaHJvbm91c2x5IHBhcnNpbmcgdGhlIHJlcXVlc3QuXG4gICAgaWYgKHRoaXMuaXNVc2VkICYmIHRoaXMub3B0aW9ucz8ub25jZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBQcmVlbXB0aXZlbHkgbWFyayB0aGUgaGFuZGxlciBhcyB1c2VkLlxuICAgIC8vIEdlbmVyYXRvcnMgd2lsbCB1bmRvIHRoaXMgYmVjYXVzZSBvbmx5IHdoZW4gdGhlIHJlc29sdmVyIHJlYWNoZXMgdGhlXG4gICAgLy8gXCJkb25lXCIgc3RhdGUgb2YgdGhlIGdlbmVyYXRvciB0aGF0IGl0IGNvbnNpZGVycyB0aGUgaGFuZGxlciB1c2VkLlxuICAgIHRoaXMuaXNVc2VkID0gdHJ1ZVxuXG4gICAgLy8gQ3JlYXRlIGEgcmVzcG9uc2UgZXh0cmFjdGlvbiB3cmFwcGVyIGFyb3VuZCB0aGUgcmVzb2x2ZXJcbiAgICAvLyBzaW5jZSBpdCBjYW4gYmUgYm90aCBhbiBhc3luYyBmdW5jdGlvbiBhbmQgYSBnZW5lcmF0b3IuXG4gICAgY29uc3QgZXhlY3V0ZVJlc29sdmVyID0gdGhpcy53cmFwUmVzb2x2ZXIodGhpcy5yZXNvbHZlcilcblxuICAgIGNvbnN0IHJlc29sdmVyRXh0cmFzID0gdGhpcy5leHRlbmRSZXNvbHZlckFyZ3Moe1xuICAgICAgcmVxdWVzdDogYXJncy5yZXF1ZXN0LFxuICAgICAgcGFyc2VkUmVzdWx0LFxuICAgIH0pXG5cbiAgICBjb25zdCBtb2NrZWRSZXNwb25zZVByb21pc2UgPSAoXG4gICAgICBleGVjdXRlUmVzb2x2ZXIoe1xuICAgICAgICAuLi5yZXNvbHZlckV4dHJhcyxcbiAgICAgICAgcmVxdWVzdElkOiBhcmdzLnJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdDogYXJncy5yZXF1ZXN0LFxuICAgICAgfSkgYXMgUHJvbWlzZTxSZXNwb25zZT5cbiAgICApLmNhdGNoKChlcnJvck9yUmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEFsbG93IHRocm93aW5nIGEgUmVzcG9uc2UgaW5zdGFuY2UgaW4gYSByZXNwb25zZSByZXNvbHZlci5cbiAgICAgIGlmIChlcnJvck9yUmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gZXJyb3JPclJlc3BvbnNlXG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgdGhyb3cgdGhlIGVycm9yIGFzLWlzLlxuICAgICAgdGhyb3cgZXJyb3JPclJlc3BvbnNlXG4gICAgfSlcblxuICAgIGNvbnN0IG1vY2tlZFJlc3BvbnNlID0gYXdhaXQgbW9ja2VkUmVzcG9uc2VQcm9taXNlXG5cbiAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSB0aGlzLmNyZWF0ZUV4ZWN1dGlvblJlc3VsdCh7XG4gICAgICAvLyBQYXNzIHRoZSBjbG9uZWQgcmVxdWVzdCB0byB0aGUgcmVzdWx0IHNvIHRoYXQgbG9nZ2luZ1xuICAgICAgLy8gYW5kIG90aGVyIGNvbnN1bWVycyBjb3VsZCByZWFkIGl0cyBib2R5IG9uY2UgbW9yZS5cbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RDbG9uZSxcbiAgICAgIHJlcXVlc3RJZDogYXJncy5yZXF1ZXN0SWQsXG4gICAgICByZXNwb25zZTogbW9ja2VkUmVzcG9uc2UsXG4gICAgICBwYXJzZWRSZXN1bHQsXG4gICAgfSlcblxuICAgIHJldHVybiBleGVjdXRpb25SZXN1bHRcbiAgfVxuXG4gIHByaXZhdGUgd3JhcFJlc29sdmVyKFxuICAgIHJlc29sdmVyOiBSZXNwb25zZVJlc29sdmVyPFJlc29sdmVyRXh0cmFzPixcbiAgKTogUmVzcG9uc2VSZXNvbHZlcjxSZXNvbHZlckV4dHJhcz4ge1xuICAgIHJldHVybiBhc3luYyAoaW5mbyk6IFByb21pc2U8UmVzcG9uc2VSZXNvbHZlclJldHVyblR5cGU8YW55Pj4gPT4ge1xuICAgICAgaWYgKCF0aGlzLnJlc29sdmVySXRlcmF0b3IpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZXIoaW5mbylcblxuICAgICAgICBpZiAoIWlzSXRlcmFibGUocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXJJdGVyYXRvciA9XG4gICAgICAgICAgU3ltYm9sLml0ZXJhdG9yIGluIHJlc3VsdFxuICAgICAgICAgICAgPyByZXN1bHRbU3ltYm9sLml0ZXJhdG9yXSgpXG4gICAgICAgICAgICA6IHJlc3VsdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgfVxuXG4gICAgICAvLyBPcHQtb3V0IGZyb20gbWFya2luZyB0aGlzIGhhbmRsZXIgYXMgdXNlZC5cbiAgICAgIHRoaXMuaXNVc2VkID0gZmFsc2VcblxuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgdGhpcy5yZXNvbHZlckl0ZXJhdG9yLm5leHQoKVxuICAgICAgY29uc3QgbmV4dFJlc3BvbnNlID0gYXdhaXQgdmFsdWVcblxuICAgICAgaWYgKG5leHRSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJlc29sdmVySXRlcmF0b3JSZXN1bHQgPSBuZXh0UmVzcG9uc2UuY2xvbmUoKVxuICAgICAgfVxuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICAvLyBBIG9uZS10aW1lIGdlbmVyYXRvciByZXNvbHZlciBzdG9wcyBhZmZlY3RpbmcgdGhlIG5ldHdvcmtcbiAgICAgICAgLy8gb25seSBhZnRlciBpdCdzIGJlZW4gY29tcGxldGVseSBleGhhdXN0ZWQuXG4gICAgICAgIHRoaXMuaXNVc2VkID0gdHJ1ZVxuXG4gICAgICAgIC8vIENsb25lIHRoZSBwcmV2aW91c2x5IHN0b3JlZCByZXNwb25zZSBzbyBpdCBjYW4gYmUgcmVhZFxuICAgICAgICAvLyB3aGVuIHJlY2VpdmluZyBpdCByZXBlYXRlZGx5IGZyb20gdGhlIFwiZG9uZVwiIGdlbmVyYXRvci5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXJJdGVyYXRvclJlc3VsdD8uY2xvbmUoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFJlc3BvbnNlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFeGVjdXRpb25SZXN1bHQoYXJnczoge1xuICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgICByZXF1ZXN0SWQ6IHN0cmluZ1xuICAgIHBhcnNlZFJlc3VsdDogUGFyc2VkUmVzdWx0XG4gICAgcmVzcG9uc2U/OiBSZXNwb25zZVxuICB9KTogUmVxdWVzdEhhbmRsZXJFeGVjdXRpb25SZXN1bHQ8UGFyc2VkUmVzdWx0PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhbmRsZXI6IHRoaXMsXG4gICAgICByZXF1ZXN0OiBhcmdzLnJlcXVlc3QsXG4gICAgICByZXF1ZXN0SWQ6IGFyZ3MucmVxdWVzdElkLFxuICAgICAgcmVzcG9uc2U6IGFyZ3MucmVzcG9uc2UsXG4gICAgICBwYXJzZWRSZXN1bHQ6IGFyZ3MucGFyc2VkUmVzdWx0LFxuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFVudGlsUmVzdWx0PFJlamVjdGlvblJlYXNvbiwgUmVzb2x2ZURhdGE+ID1cbiAgfCBbcmVhc29uOiBSZWplY3Rpb25SZWFzb24sIGRhdGE6IG51bGxdXG4gIHwgW3JlYXNvbjogbnVsbCwgZGF0YTogUmVzb2x2ZURhdGFdXG5cbi8qKlxuICogR3JhY2VmdWxseSBoYW5kbGVzIGEgY2FsbGJhY2sgdGhhdCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgdW50aWwoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKDEyMykpXG4gKiAvLyBbbnVsbCwgMTIzXVxuICpcbiAqIGF3YWl0IHVudGlsKCgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignT29wcyEnKSkpXG4gKiAvLyBbbmV3IEVycm9yKCdPb3BzIScpLCBudWxsXVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW50aWw8UmVqZWN0aW9uUmVhc29uID0gRXJyb3IsIFJlc29sdmVEYXRhID0gdW5rbm93bj4oXG4gIGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFJlc29sdmVEYXRhPixcbik6IFByb21pc2U8VW50aWxSZXN1bHQ8UmVqZWN0aW9uUmVhc29uLCBSZXNvbHZlRGF0YT4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgY2FsbGJhY2soKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfSlcbiAgICByZXR1cm4gW251bGwsIGRhdGFdXG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4gW2Vycm9yLCBudWxsXVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgUmVxdWVzdEhhbmRsZXIsXG4gIHR5cGUgUmVxdWVzdEhhbmRsZXJFeGVjdXRpb25SZXN1bHQsXG59IGZyb20gJy4uL2hhbmRsZXJzL1JlcXVlc3RIYW5kbGVyJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJzRXhlY3V0aW9uUmVzdWx0IHtcbiAgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXJcbiAgcGFyc2VkUmVzdWx0PzogYW55XG4gIHJlc3BvbnNlPzogUmVzcG9uc2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZVJlc29sdXRpb25Db250ZXh0IHtcbiAgYmFzZVVybD86IHN0cmluZ1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBsaXN0IG9mIHJlcXVlc3QgaGFuZGxlcnMgYWdhaW5zdCB0aGUgZ2l2ZW4gcmVxdWVzdC5cbiAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiByZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmcgYW55IG1hdGNoaW5nIHJlcXVlc3RcbiAqIGhhbmRsZXIgYW5kIGFueSBtb2NrZWQgcmVzcG9uc2UgaXQgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBleGVjdXRlSGFuZGxlcnMgPSBhc3luYyA8SGFuZGxlcnMgZXh0ZW5kcyBBcnJheTxSZXF1ZXN0SGFuZGxlcj4+KHtcbiAgcmVxdWVzdCxcbiAgcmVxdWVzdElkLFxuICBoYW5kbGVycyxcbiAgcmVzb2x1dGlvbkNvbnRleHQsXG59OiB7XG4gIHJlcXVlc3Q6IFJlcXVlc3RcbiAgcmVxdWVzdElkOiBzdHJpbmdcbiAgaGFuZGxlcnM6IEhhbmRsZXJzXG4gIHJlc29sdXRpb25Db250ZXh0PzogUmVzcG9uc2VSZXNvbHV0aW9uQ29udGV4dFxufSk6IFByb21pc2U8SGFuZGxlcnNFeGVjdXRpb25SZXN1bHQgfCBudWxsPiA9PiB7XG4gIGxldCBtYXRjaGluZ0hhbmRsZXI6IFJlcXVlc3RIYW5kbGVyIHwgbnVsbCA9IG51bGxcbiAgbGV0IHJlc3VsdDogUmVxdWVzdEhhbmRsZXJFeGVjdXRpb25SZXN1bHQ8YW55PiB8IG51bGwgPSBudWxsXG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5ydW4oeyByZXF1ZXN0LCByZXF1ZXN0SWQsIHJlc29sdXRpb25Db250ZXh0IH0pXG5cbiAgICAvLyBJZiB0aGUgaGFuZGxlciBwcm9kdWNlcyBzb21lIHJlc3VsdCBmb3IgdGhpcyByZXF1ZXN0LFxuICAgIC8vIGl0IGF1dG9tYXRpY2FsbHkgYmVjb21lcyBtYXRjaGluZy5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGluZ0hhbmRsZXIgPSBoYW5kbGVyXG4gICAgfVxuXG4gICAgLy8gU3RvcCB0aGUgbG9va3VwIGlmIHRoaXMgaGFuZGxlciByZXR1cm5zIGEgbW9ja2VkIHJlc3BvbnNlLlxuICAgIC8vIElmIGl0IGRvZXNuJ3QsIGl0IHdpbGwgc3RpbGwgYmUgY29uc2lkZXJlZCB0aGUgbGFzdCBtYXRjaGluZ1xuICAgIC8vIGhhbmRsZXIgdW50aWwgYW55IG9mIHRoZW0gcmV0dXJucyBhIHJlc3BvbnNlLiBUaGlzIHdheSB3ZSBjYW5cbiAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhbGx0aHJvdWdoIGhhbmRsZXJzIHdpdGhvdXQgcmVzcG9uc2VzXG4gICAgLy8gYW5kIHRoZSBsYWNrIG9mIGEgbWF0Y2hpbmcgaGFuZGxlci5cbiAgICBpZiAocmVzdWx0Py5yZXNwb25zZSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hpbmdIYW5kbGVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhbmRsZXI6IG1hdGNoaW5nSGFuZGxlcixcbiAgICAgIHBhcnNlZFJlc3VsdDogcmVzdWx0Py5wYXJzZWRSZXN1bHQsXG4gICAgICByZXNwb25zZTogcmVzdWx0Py5yZXNwb25zZSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuIiwgIi8qKlxuICogUmV0dXJucyBhIHJlbGF0aXZlIFVSTCBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBVUkwgaXMgcmVsYXRpdmVcbiAqIHRvIHRoZSBjdXJyZW50IG9yaWdpbi4gT3RoZXJ3aXNlIHJldHVybnMgYW4gYWJzb2x1dGUgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QdWJsaWNVcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB1cmwudG9TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgdXJsSW5zdGFuY2UgPSB1cmwgaW5zdGFuY2VvZiBVUkwgPyB1cmwgOiBuZXcgVVJMKHVybClcblxuICByZXR1cm4gdXJsSW5zdGFuY2Uub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW5cbiAgICA/IHVybEluc3RhbmNlLnBhdGhuYW1lXG4gICAgOiB1cmxJbnN0YW5jZS5vcmlnaW4gKyB1cmxJbnN0YW5jZS5wYXRobmFtZVxufVxuIiwgIi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBpcyBhIHN0YXRpYyBhc3NldCByZXF1ZXN0LlxuICogVXNlZnVsIHdoZW4gZGVjaWRpbmcgd2hpY2ggdW5oYW5kbGVkIHJlcXVlc3RzIHRvIGlnbm9yZS5cbiAqIEBub3RlIERlc3BpdGUgYmVpbmcgaWdub3JlZCwgeW91IGNhbiBzdGlsbCBpbnRlcmNlcHQgYW5kIG1vY2tcbiAqIHN0YXRpYyBhc3NldHMgYnkgY3JlYXRpbmcgcmVxdWVzdCBoYW5kbGVycyBmb3IgdGhlbS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgaXNDb21tb25Bc3NldFJlcXVlc3QgfSBmcm9tICdtc3cnXG4gKlxuICogYXdhaXQgd29ya2VyLnN0YXJ0KHtcbiAqICAgb25VbmhhbmRsZWRSZXF1ZXN0KHJlcXVlc3QsIHByaW50KSB7XG4gKiAgICAgaWYgKCFpc0NvbW1vbkFzc2V0UmVxdWVzdChyZXF1ZXN0KSkge1xuICogICAgICAgcHJpbnQud2FybmluZygpXG4gKiAgICAgfVxuICogICB9XG4gKiB9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tb25Bc3NldFJlcXVlc3QocmVxdWVzdDogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuXG4gIC8vIElnbm9yZSBjZXJ0YWluIHByb3RvY29scy5cbiAgaWYgKHVybC5wcm90b2NvbCA9PT0gJ2ZpbGU6Jykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBJZ25vcmUgc3RhdGljIGFzc2V0cyBob3N0cy5cbiAgaWYgKC8oZm9udHNcXC5nb29nbGVhcGlzXFwuY29tKS8udGVzdCh1cmwuaG9zdG5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIElnbm9yZSBub2RlIG1vZHVsZXMgc2VydmVkIG92ZXIgSFRUUC5cbiAgaWYgKC9ub2RlX21vZHVsZXMvLnRlc3QodXJsLnBhdGhuYW1lKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBJZ25vcmUgaW50ZXJuYWwgVml0ZSByZXF1ZXN0cywgbGlrZSBcIi9Adml0ZS9jbGllbnRcIi5cbiAgaWYgKHVybC5wYXRobmFtZS5pbmNsdWRlcygnQHZpdGUnKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBJZ25vcmUgY29tbW9uIHN0YXRpYyBhc3NldHMuXG4gIHJldHVybiAvXFwuKHM/Y3NzfGxlc3N8bT9qc3g/fG0/dHN4P3xodG1sfHR0ZnxvdGZ8d29mZnx3b2ZmMnxlb3R8Z2lmfGpwZT9nfHBuZ3xhdmlmfHdlYnB8c3ZnfG1wNHx3ZWJtfG9nZ3xtb3Z8bXAzfHdhdnxvZ2d8ZmxhY3xhYWN8cGRmfHR4dHxjc3Z8anNvbnx4bWx8bWR8emlwfHRhcnxnenxyYXJ8N3opJC9pLnRlc3QoXG4gICAgdXJsLnBhdGhuYW1lLFxuICApXG59XG4iLCAiaW1wb3J0IHsgdG9QdWJsaWNVcmwgfSBmcm9tICcuL3RvUHVibGljVXJsJ1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgZGV2VXRpbHMgfSBmcm9tICcuLi9pbnRlcm5hbC9kZXZVdGlscydcbmltcG9ydCB7IGlzQ29tbW9uQXNzZXRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vaXNDb21tb25Bc3NldFJlcXVlc3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5oYW5kbGVkUmVxdWVzdFByaW50IHtcbiAgd2FybmluZygpOiB2b2lkXG4gIGVycm9yKCk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgVW5oYW5kbGVkUmVxdWVzdENhbGxiYWNrID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBwcmludDogVW5oYW5kbGVkUmVxdWVzdFByaW50LFxuKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIFVuaGFuZGxlZFJlcXVlc3RTdHJhdGVneSA9XG4gIHwgJ2J5cGFzcydcbiAgfCAnd2FybidcbiAgfCAnZXJyb3InXG4gIHwgVW5oYW5kbGVkUmVxdWVzdENhbGxiYWNrXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvblVuaGFuZGxlZFJlcXVlc3QoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIHN0cmF0ZWd5OiBVbmhhbmRsZWRSZXF1ZXN0U3RyYXRlZ3kgPSAnd2FybicsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgY29uc3QgcHVibGljVXJsID0gdG9QdWJsaWNVcmwodXJsKSArIHVybC5zZWFyY2hcblxuICBjb25zdCByZXF1ZXN0Qm9keSA9XG4gICAgcmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCdcbiAgICAgID8gbnVsbFxuICAgICAgOiBhd2FpdCByZXF1ZXN0LmNsb25lKCkudGV4dCgpXG4gIGNvbnN0IG1lc3NhZ2VEZXRhaWxzID0gYFxcblxcbiAgXFx1MjAyMiAke3JlcXVlc3QubWV0aG9kfSAke3B1YmxpY1VybH1cXG5cXG4ke3JlcXVlc3RCb2R5ID8gYCAgXFx1MjAyMiBSZXF1ZXN0IGJvZHk6ICR7cmVxdWVzdEJvZHl9XFxuXFxuYCA6ICcnfWBcbiAgY29uc3QgdW5oYW5kbGVkUmVxdWVzdE1lc3NhZ2UgPSBgaW50ZXJjZXB0ZWQgYSByZXF1ZXN0IHdpdGhvdXQgYSBtYXRjaGluZyByZXF1ZXN0IGhhbmRsZXI6JHttZXNzYWdlRGV0YWlsc31JZiB5b3Ugc3RpbGwgd2lzaCB0byBpbnRlcmNlcHQgdGhpcyB1bmhhbmRsZWQgcmVxdWVzdCwgcGxlYXNlIGNyZWF0ZSBhIHJlcXVlc3QgaGFuZGxlciBmb3IgaXQuXFxuUmVhZCBtb3JlOiBodHRwczovL21zd2pzLmlvL2RvY3MvaHR0cC9pbnRlcmNlcHRpbmctcmVxdWVzdHNgXG5cbiAgZnVuY3Rpb24gYXBwbHlTdHJhdGVneShzdHJhdGVneTogVW5oYW5kbGVkUmVxdWVzdFN0cmF0ZWd5KSB7XG4gICAgc3dpdGNoIChzdHJhdGVneSkge1xuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIC8vIFByaW50IGEgZGV2ZWxvcGVyLWZyaWVuZGx5IGVycm9yLlxuICAgICAgICBkZXZVdGlscy5lcnJvcignRXJyb3I6ICVzJywgdW5oYW5kbGVkUmVxdWVzdE1lc3NhZ2UpXG5cbiAgICAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIHRvIGhhbHQgcmVxdWVzdCBwcm9jZXNzaW5nIGFuZCBub3QgcGVyZm9ybSB0aGUgb3JpZ2luYWwgcmVxdWVzdC5cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICAgICdDYW5ub3QgYnlwYXNzIGEgcmVxdWVzdCB3aGVuIHVzaW5nIHRoZSBcImVycm9yXCIgc3RyYXRlZ3kgZm9yIHRoZSBcIm9uVW5oYW5kbGVkUmVxdWVzdFwiIG9wdGlvbi4nLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY2FzZSAnd2Fybic6IHtcbiAgICAgICAgZGV2VXRpbHMud2FybignV2FybmluZzogJXMnLCB1bmhhbmRsZWRSZXF1ZXN0TWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYnlwYXNzJzpcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICAgICdGYWlsZWQgdG8gcmVhY3QgdG8gYW4gdW5oYW5kbGVkIHJlcXVlc3Q6IHVua25vd24gc3RyYXRlZ3kgXCIlc1wiLiBQbGVhc2UgcHJvdmlkZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBzdHJhdGVnaWVzIChcImJ5cGFzc1wiLCBcIndhcm5cIiwgXCJlcnJvclwiKSBvciBhIGN1c3RvbSBjYWxsYmFjayBmdW5jdGlvbiBhcyB0aGUgdmFsdWUgb2YgdGhlIFwib25VbmhhbmRsZWRSZXF1ZXN0XCIgb3B0aW9uLicsXG4gICAgICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJhdGVneSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0cmF0ZWd5KHJlcXVlc3QsIHtcbiAgICAgIHdhcm5pbmc6IGFwcGx5U3RyYXRlZ3kuYmluZChudWxsLCAnd2FybicpLFxuICAgICAgZXJyb3I6IGFwcGx5U3RyYXRlZ3kuYmluZChudWxsLCAnZXJyb3InKSxcbiAgICB9KVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSWdub3JlIGNvbW1vbiBzdGF0aWMgYXNzZXQgcmVxdWVzdHMgd2hlbiB1c2luZyBhIGJ1aWx0LWluIHN0cmF0ZWd5LlxuICAvLyBUaGVyZSdzIGEgc2xpZ2h0IG92ZXJoZWFkIGhlcmUgYmVjYXVzZSB0aGlzIHV0aWxpdHkgd2lsbCBjcmVhdGUgYSByZXF1ZXN0IFVSTFxuICAvLyBpbnN0YW5jZSBhZ2FpbiBkZXNwaXRlIHVzIGhhdmluZyBkb25lIHNvIHByZXZpb3VzbHkgaW4gdGhpcyBmdW5jdGlvbi5cbiAgaWYgKCFpc0NvbW1vbkFzc2V0UmVxdWVzdChyZXF1ZXN0KSkge1xuICAgIGFwcGx5U3RyYXRlZ3koc3RyYXRlZ3kpXG4gIH1cbn1cbiIsICIvKipcbiAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBhIE5vZGUuanMgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZVByb2Nlc3MoKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gRWxlY3Ryb24gKGh0dHBzOi8vd3d3LmVsZWN0cm9uanMub3JnL2RvY3MvbGF0ZXN0L2FwaS9wcm9jZXNzI3Byb2Nlc3N0eXBlLXJlYWRvbmx5KVxuICAgIGNvbnN0IHR5cGUgPSAocHJvY2VzcyBhcyBhbnkpLnR5cGVcbiAgICBpZiAodHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB0eXBlID09PSAnd29ya2VyJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG5cbiAgICByZXR1cm4gISEoXG4gICAgICBwcm9jZXNzLnZlcnNpb25zICYmXG4gICAgICBwcm9jZXNzLnZlcnNpb25zLm5vZGVcbiAgICApXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBJT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYHZob3N0YCBpcyBhIHZhbGlkIHN1ZmZpeCBvZiBgaG9zdG5hbWVgICh0b3AtZG9tYWluKVxuICpcbiAqIEl0IG1lYW5zIHRoYXQgYHZob3N0YCBuZWVkcyB0byBiZSBhIHN1ZmZpeCBvZiBgaG9zdG5hbWVgIGFuZCB3ZSB0aGVuIG5lZWQgdG9cbiAqIG1ha2Ugc3VyZSB0aGF0OiBlaXRoZXIgdGhleSBhcmUgZXF1YWwsIG9yIHRoZSBjaGFyYWN0ZXIgcHJlY2VkaW5nIGB2aG9zdGAgaW5cbiAqIGBob3N0bmFtZWAgaXMgYSAnLicgKGl0IHNob3VsZCBub3QgYmUgYSBwYXJ0aWFsIGxhYmVsKS5cbiAqXG4gKiAqIGhvc3RuYW1lID0gJ25vdC5ldmlsLmNvbScgYW5kIHZob3N0ID0gJ3ZpbC5jb20nICAgICAgPT4gbm90IG9rXG4gKiAqIGhvc3RuYW1lID0gJ25vdC5ldmlsLmNvbScgYW5kIHZob3N0ID0gJ2V2aWwuY29tJyAgICAgPT4gb2tcbiAqICogaG9zdG5hbWUgPSAnbm90LmV2aWwuY29tJyBhbmQgdmhvc3QgPSAnbm90LmV2aWwuY29tJyA9PiBva1xuICovXG5mdW5jdGlvbiBzaGFyZVNhbWVEb21haW5TdWZmaXgoaG9zdG5hbWU6IHN0cmluZywgdmhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoaG9zdG5hbWUuZW5kc1dpdGgodmhvc3QpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGhvc3RuYW1lLmxlbmd0aCA9PT0gdmhvc3QubGVuZ3RoIHx8XG4gICAgICBob3N0bmFtZVtob3N0bmFtZS5sZW5ndGggLSB2aG9zdC5sZW5ndGggLSAxXSA9PT0gJy4nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGhvc3RuYW1lIGFuZCBpdHMgcHVibGljIHN1ZmZpeCwgZXh0cmFjdCB0aGUgZ2VuZXJhbCBkb21haW4uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REb21haW5XaXRoU3VmZml4KFxuICBob3N0bmFtZTogc3RyaW5nLFxuICBwdWJsaWNTdWZmaXg6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIC8vIExvY2F0ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgJy4nIGluIHRoZSBwYXJ0IG9mIHRoZSBgaG9zdG5hbWVgIHByZWNlZGluZ1xuICAvLyB0aGUgcHVibGljIHN1ZmZpeC5cbiAgLy9cbiAgLy8gZXhhbXBsZXM6XG4gIC8vICAgMS4gbm90LmV2aWwuY28udWsgID0+IGV2aWwuY28udWtcbiAgLy8gICAgICAgICBeICAgIF5cbiAgLy8gICAgICAgICB8ICAgIHwgc3RhcnQgb2YgcHVibGljIHN1ZmZpeFxuICAvLyAgICAgICAgIHwgaW5kZXggb2YgdGhlIGxhc3QgZG90XG4gIC8vXG4gIC8vICAgMi4gZXhhbXBsZS5jby51ayAgID0+IGV4YW1wbGUuY28udWtcbiAgLy8gICAgIF4gICAgICAgXlxuICAvLyAgICAgfCAgICAgICB8IHN0YXJ0IG9mIHB1YmxpYyBzdWZmaXhcbiAgLy8gICAgIHxcbiAgLy8gICAgIHwgKC0xKSBubyBkb3QgZm91bmQgYmVmb3JlIHRoZSBwdWJsaWMgc3VmZml4XG4gIGNvbnN0IHB1YmxpY1N1ZmZpeEluZGV4ID0gaG9zdG5hbWUubGVuZ3RoIC0gcHVibGljU3VmZml4Lmxlbmd0aCAtIDI7XG4gIGNvbnN0IGxhc3REb3RCZWZvcmVTdWZmaXhJbmRleCA9IGhvc3RuYW1lLmxhc3RJbmRleE9mKCcuJywgcHVibGljU3VmZml4SW5kZXgpO1xuXG4gIC8vIE5vICcuJyBmb3VuZCwgdGhlbiBgaG9zdG5hbWVgIGlzIHRoZSBnZW5lcmFsIGRvbWFpbiAobm8gc3ViLWRvbWFpbilcbiAgaWYgKGxhc3REb3RCZWZvcmVTdWZmaXhJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gaG9zdG5hbWU7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwYXJ0IGJldHdlZW4gdGhlIGxhc3QgJy4nXG4gIHJldHVybiBob3N0bmFtZS5zbGljZShsYXN0RG90QmVmb3JlU3VmZml4SW5kZXggKyAxKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBkb21haW4gYmFzZWQgb24gcnVsZXMgYW5kIHVwb24gYW5kIGEgaG9zdCBzdHJpbmdcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9tYWluKFxuICBzdWZmaXg6IHN0cmluZyxcbiAgaG9zdG5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogSU9wdGlvbnMsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gQ2hlY2sgaWYgYGhvc3RuYW1lYCBlbmRzIHdpdGggYSBtZW1iZXIgb2YgYHZhbGlkSG9zdHNgLlxuICBpZiAob3B0aW9ucy52YWxpZEhvc3RzICE9PSBudWxsKSB7XG4gICAgY29uc3QgdmFsaWRIb3N0cyA9IG9wdGlvbnMudmFsaWRIb3N0cztcbiAgICBmb3IgKGNvbnN0IHZob3N0IG9mIHZhbGlkSG9zdHMpIHtcbiAgICAgIGlmICgvKkBfX0lOTElORV9fKi8gc2hhcmVTYW1lRG9tYWluU3VmZml4KGhvc3RuYW1lLCB2aG9zdCkpIHtcbiAgICAgICAgcmV0dXJuIHZob3N0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBudW1iZXJPZkxlYWRpbmdEb3RzID0gMDtcbiAgaWYgKGhvc3RuYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHdoaWxlIChcbiAgICAgIG51bWJlck9mTGVhZGluZ0RvdHMgPCBob3N0bmFtZS5sZW5ndGggJiZcbiAgICAgIGhvc3RuYW1lW251bWJlck9mTGVhZGluZ0RvdHNdID09PSAnLidcbiAgICApIHtcbiAgICAgIG51bWJlck9mTGVhZGluZ0RvdHMgKz0gMTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiBgaG9zdG5hbWVgIGlzIGEgdmFsaWQgcHVibGljIHN1ZmZpeCwgdGhlbiB0aGVyZSBpcyBubyBkb21haW4gdG8gcmV0dXJuLlxuICAvLyBTaW5jZSB3ZSBhbHJlYWR5IGtub3cgdGhhdCBgZ2V0UHVibGljU3VmZml4YCByZXR1cm5zIGEgc3VmZml4IG9mIGBob3N0bmFtZWBcbiAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBwZXJmb3JtIGEgc3RyaW5nIGNvbXBhcmlzb24gYW5kIHdlIG9ubHkgY29tcGFyZSB0aGVcbiAgLy8gc2l6ZS5cbiAgaWYgKHN1ZmZpeC5sZW5ndGggPT09IGhvc3RuYW1lLmxlbmd0aCAtIG51bWJlck9mTGVhZGluZ0RvdHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRvIGV4dHJhY3QgdGhlIGdlbmVyYWwgZG9tYWluLCB3ZSBzdGFydCBieSBpZGVudGlmeWluZyB0aGUgcHVibGljIHN1ZmZpeFxuICAvLyAoaWYgYW55KSwgdGhlbiBjb25zaWRlciB0aGUgZG9tYWluIHRvIGJlIHRoZSBwdWJsaWMgc3VmZml4IHdpdGggb25lIGFkZGVkXG4gIC8vIGxldmVsIG9mIGRlcHRoLiAoZS5nLjogaWYgaG9zdG5hbWUgaXMgYG5vdC5ldmlsLmNvLnVrYCBhbmQgcHVibGljIHN1ZmZpeDpcbiAgLy8gYGNvLnVrYCwgdGhlbiB3ZSB0YWtlIG9uZSBtb3JlIGxldmVsOiBgZXZpbGAsIGdpdmluZyB0aGUgZmluYWwgcmVzdWx0OlxuICAvLyBgZXZpbC5jby51a2ApLlxuICByZXR1cm4gLypAX19JTkxJTkVfXyovIGV4dHJhY3REb21haW5XaXRoU3VmZml4KGhvc3RuYW1lLCBzdWZmaXgpO1xufVxuIiwgIi8qKlxuICogUmV0dXJuIHRoZSBwYXJ0IG9mIGRvbWFpbiB3aXRob3V0IHN1ZmZpeC5cbiAqXG4gKiBFeGFtcGxlOiBmb3IgZG9tYWluICdmb28uY29tJywgdGhlIHJlc3VsdCB3b3VsZCBiZSAnZm9vJy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9tYWluV2l0aG91dFN1ZmZpeChcbiAgZG9tYWluOiBzdHJpbmcsXG4gIHN1ZmZpeDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgLy8gTm90ZTogaGVyZSBgZG9tYWluYCBhbmQgYHN1ZmZpeGAgY2Fubm90IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGJlY2F1c2UgaW5cbiAgLy8gdGhpcyBjYXNlIHdlIHNldCBgZG9tYWluYCB0byBgbnVsbGAgaW5zdGVhZC4gSXQgaXMgdGh1cyBzYWZlIHRvIGFzc3VtZVxuICAvLyB0aGF0IGBzdWZmaXhgIGlzIHNob3J0ZXIgdGhhbiBgZG9tYWluYC5cbiAgcmV0dXJuIGRvbWFpbi5zbGljZSgwLCAtc3VmZml4Lmxlbmd0aCAtIDEpO1xufVxuIiwgIi8qKlxuICogQHBhcmFtIHVybCAtIFVSTCB3ZSB3YW50IHRvIGV4dHJhY3QgYSBob3N0bmFtZSBmcm9tLlxuICogQHBhcmFtIHVybElzVmFsaWRIb3N0bmFtZSAtIGhpbnQgZnJvbSBjYWxsZXI7IHRydWUgaWYgYHVybGAgaXMgYWxyZWFkeSBhIHZhbGlkIGhvc3RuYW1lLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRyYWN0SG9zdG5hbWUoXG4gIHVybDogc3RyaW5nLFxuICB1cmxJc1ZhbGlkSG9zdG5hbWU6IGJvb2xlYW4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGVuZDogbnVtYmVyID0gdXJsLmxlbmd0aDtcbiAgbGV0IGhhc1VwcGVyID0gZmFsc2U7XG5cbiAgLy8gSWYgdXJsIGlzIG5vdCBhbHJlYWR5IGEgdmFsaWQgaG9zdG5hbWUsIHRoZW4gdHJ5IHRvIGV4dHJhY3QgaG9zdG5hbWUuXG4gIGlmICghdXJsSXNWYWxpZEhvc3RuYW1lKSB7XG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBvZiBkYXRhIFVSTHNcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRyaW0gbGVhZGluZyBzcGFjZXNcbiAgICB3aGlsZSAoc3RhcnQgPCB1cmwubGVuZ3RoICYmIHVybC5jaGFyQ29kZUF0KHN0YXJ0KSA8PSAzMikge1xuICAgICAgc3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICAvLyBUcmltIHRyYWlsaW5nIHNwYWNlc1xuICAgIHdoaWxlIChlbmQgPiBzdGFydCArIDEgJiYgdXJsLmNoYXJDb2RlQXQoZW5kIC0gMSkgPD0gMzIpIHtcbiAgICAgIGVuZCAtPSAxO1xuICAgIH1cblxuICAgIC8vIFNraXAgc2NoZW1lLlxuICAgIGlmIChcbiAgICAgIHVybC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gNDcgLyogJy8nICovICYmXG4gICAgICB1cmwuY2hhckNvZGVBdChzdGFydCArIDEpID09PSA0NyAvKiAnLycgKi9cbiAgICApIHtcbiAgICAgIHN0YXJ0ICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4T2ZQcm90b2NvbCA9IHVybC5pbmRleE9mKCc6LycsIHN0YXJ0KTtcbiAgICAgIGlmIChpbmRleE9mUHJvdG9jb2wgIT09IC0xKSB7XG4gICAgICAgIC8vIEltcGxlbWVudCBmYXN0LXBhdGggZm9yIGNvbW1vbiBwcm90b2NvbHMuIFdlIGV4cGVjdCBtb3N0IHByb3RvY29sc1xuICAgICAgICAvLyBzaG91bGQgYmUgb25lIG9mIHRoZXNlIDQgYW5kIHRodXMgd2Ugd2lsbCBub3QgbmVlZCB0byBwZXJmb3JtIHRoZVxuICAgICAgICAvLyBtb3JlIGV4cGFuc2l2ZSB2YWxpZGl0eSBjaGVjayBtb3N0IG9mIHRoZSB0aW1lLlxuICAgICAgICBjb25zdCBwcm90b2NvbFNpemUgPSBpbmRleE9mUHJvdG9jb2wgLSBzdGFydDtcbiAgICAgICAgY29uc3QgYzAgPSB1cmwuY2hhckNvZGVBdChzdGFydCk7XG4gICAgICAgIGNvbnN0IGMxID0gdXJsLmNoYXJDb2RlQXQoc3RhcnQgKyAxKTtcbiAgICAgICAgY29uc3QgYzIgPSB1cmwuY2hhckNvZGVBdChzdGFydCArIDIpO1xuICAgICAgICBjb25zdCBjMyA9IHVybC5jaGFyQ29kZUF0KHN0YXJ0ICsgMyk7XG4gICAgICAgIGNvbnN0IGM0ID0gdXJsLmNoYXJDb2RlQXQoc3RhcnQgKyA0KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvdG9jb2xTaXplID09PSA1ICYmXG4gICAgICAgICAgYzAgPT09IDEwNCAvKiAnaCcgKi8gJiZcbiAgICAgICAgICBjMSA9PT0gMTE2IC8qICd0JyAqLyAmJlxuICAgICAgICAgIGMyID09PSAxMTYgLyogJ3QnICovICYmXG4gICAgICAgICAgYzMgPT09IDExMiAvKiAncCcgKi8gJiZcbiAgICAgICAgICBjNCA9PT0gMTE1IC8qICdzJyAqL1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBodHRwc1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHByb3RvY29sU2l6ZSA9PT0gNCAmJlxuICAgICAgICAgIGMwID09PSAxMDQgLyogJ2gnICovICYmXG4gICAgICAgICAgYzEgPT09IDExNiAvKiAndCcgKi8gJiZcbiAgICAgICAgICBjMiA9PT0gMTE2IC8qICd0JyAqLyAmJlxuICAgICAgICAgIGMzID09PSAxMTIgLyogJ3AnICovXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGh0dHBcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBwcm90b2NvbFNpemUgPT09IDMgJiZcbiAgICAgICAgICBjMCA9PT0gMTE5IC8qICd3JyAqLyAmJlxuICAgICAgICAgIGMxID09PSAxMTUgLyogJ3MnICovICYmXG4gICAgICAgICAgYzIgPT09IDExNSAvKiAncycgKi9cbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gd3NzXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgcHJvdG9jb2xTaXplID09PSAyICYmXG4gICAgICAgICAgYzAgPT09IDExOSAvKiAndycgKi8gJiZcbiAgICAgICAgICBjMSA9PT0gMTE1IC8qICdzJyAqL1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyB3c1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2NoZW1lIGlzIHZhbGlkXG4gICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgaW5kZXhPZlByb3RvY29sOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvd2VyQ2FzZUNvZGUgPSB1cmwuY2hhckNvZGVBdChpKSB8IDMyO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgIChsb3dlckNhc2VDb2RlID49IDk3ICYmIGxvd2VyQ2FzZUNvZGUgPD0gMTIyKSB8fCAvLyBbYSwgel1cbiAgICAgICAgICAgICAgICAgIChsb3dlckNhc2VDb2RlID49IDQ4ICYmIGxvd2VyQ2FzZUNvZGUgPD0gNTcpIHx8IC8vIFswLCA5XVxuICAgICAgICAgICAgICAgICAgbG93ZXJDYXNlQ29kZSA9PT0gNDYgfHwgLy8gJy4nXG4gICAgICAgICAgICAgICAgICBsb3dlckNhc2VDb2RlID09PSA0NSB8fCAvLyAnLSdcbiAgICAgICAgICAgICAgICAgIGxvd2VyQ2FzZUNvZGUgPT09IDQzXG4gICAgICAgICAgICAgICAgKSAvLyAnKydcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgMCwgMSBvciBtb3JlICcvJyBhZnRlciAnOi8nXG4gICAgICAgIHN0YXJ0ID0gaW5kZXhPZlByb3RvY29sICsgMjtcbiAgICAgICAgd2hpbGUgKHVybC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gNDcgLyogJy8nICovKSB7XG4gICAgICAgICAgc3RhcnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVjdCBmaXJzdCBvY2N1cnJlbmNlIG9mICcvJywgJz8nIG9yICcjJy4gV2UgYWxzbyBrZWVwIHRyYWNrIG9mIHRoZVxuICAgIC8vIGxhc3Qgb2NjdXJyZW5jZSBvZiAnQCcsICddJyBvciAnOicgdG8gc3BlZWQtdXAgc3Vic2VxdWVudCBwYXJzaW5nIG9mXG4gICAgLy8gKHJlc3BlY3RpdmVseSksIGlkZW50aWZpZXIsIGlwdjYgb3IgcG9ydC5cbiAgICBsZXQgaW5kZXhPZklkZW50aWZpZXIgPSAtMTtcbiAgICBsZXQgaW5kZXhPZkNsb3NpbmdCcmFja2V0ID0gLTE7XG4gICAgbGV0IGluZGV4T2ZQb3J0ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGNvZGU6IG51bWJlciA9IHVybC5jaGFyQ29kZUF0KGkpO1xuICAgICAgaWYgKFxuICAgICAgICBjb2RlID09PSAzNSB8fCAvLyAnIydcbiAgICAgICAgY29kZSA9PT0gNDcgfHwgLy8gJy8nXG4gICAgICAgIGNvZGUgPT09IDYzIC8vICc/J1xuICAgICAgKSB7XG4gICAgICAgIGVuZCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSA2NCkge1xuICAgICAgICAvLyAnQCdcbiAgICAgICAgaW5kZXhPZklkZW50aWZpZXIgPSBpO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgICAvLyAnXSdcbiAgICAgICAgaW5kZXhPZkNsb3NpbmdCcmFja2V0ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gNTgpIHtcbiAgICAgICAgLy8gJzonXG4gICAgICAgIGluZGV4T2ZQb3J0ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSA2NSAmJiBjb2RlIDw9IDkwKSB7XG4gICAgICAgIGhhc1VwcGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgaWRlbnRpZmllcjogJ0AnXG4gICAgaWYgKFxuICAgICAgaW5kZXhPZklkZW50aWZpZXIgIT09IC0xICYmXG4gICAgICBpbmRleE9mSWRlbnRpZmllciA+IHN0YXJ0ICYmXG4gICAgICBpbmRleE9mSWRlbnRpZmllciA8IGVuZFxuICAgICkge1xuICAgICAgc3RhcnQgPSBpbmRleE9mSWRlbnRpZmllciArIDE7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlwdjYgYWRkcmVzc2VzXG4gICAgaWYgKHVybC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gOTEgLyogJ1snICovKSB7XG4gICAgICBpZiAoaW5kZXhPZkNsb3NpbmdCcmFja2V0ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gdXJsLnNsaWNlKHN0YXJ0ICsgMSwgaW5kZXhPZkNsb3NpbmdCcmFja2V0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChpbmRleE9mUG9ydCAhPT0gLTEgJiYgaW5kZXhPZlBvcnQgPiBzdGFydCAmJiBpbmRleE9mUG9ydCA8IGVuZCkge1xuICAgICAgLy8gRGV0ZWN0IHBvcnQ6ICc6J1xuICAgICAgZW5kID0gaW5kZXhPZlBvcnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVHJpbSB0cmFpbGluZyBkb3RzXG4gIHdoaWxlIChlbmQgPiBzdGFydCArIDEgJiYgdXJsLmNoYXJDb2RlQXQoZW5kIC0gMSkgPT09IDQ2IC8qICcuJyAqLykge1xuICAgIGVuZCAtPSAxO1xuICB9XG5cbiAgY29uc3QgaG9zdG5hbWU6IHN0cmluZyA9XG4gICAgc3RhcnQgIT09IDAgfHwgZW5kICE9PSB1cmwubGVuZ3RoID8gdXJsLnNsaWNlKHN0YXJ0LCBlbmQpIDogdXJsO1xuXG4gIGlmIChoYXNVcHBlcikge1xuICAgIHJldHVybiBob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RuYW1lO1xufVxuIiwgIi8qKlxuICogQ2hlY2sgaWYgYSBob3N0bmFtZSBpcyBhbiBJUC4gWW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoaXMgb25seSB3b3Jrc1xuICogYmVjYXVzZSBgaG9zdG5hbWVgIGlzIGFscmVhZHkgZ2FyYW50ZWVkIHRvIGJlIGEgdmFsaWQgaG9zdG5hbWUhXG4gKi9cbmZ1bmN0aW9uIGlzUHJvYmFibHlJcHY0KGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2Fubm90IGJlIHNob3J0ZWQgdGhhbiAxLjEuMS4xXG4gIGlmIChob3N0bmFtZS5sZW5ndGggPCA3KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2Fubm90IGJlIGxvbmdlciB0aGFuOiAyNTUuMjU1LjI1NS4yNTVcbiAgaWYgKGhvc3RuYW1lLmxlbmd0aCA+IDE1KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IG51bWJlck9mRG90cyA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBob3N0bmFtZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBob3N0bmFtZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKGNvZGUgPT09IDQ2IC8qICcuJyAqLykge1xuICAgICAgbnVtYmVyT2ZEb3RzICs9IDE7XG4gICAgfSBlbHNlIGlmIChjb2RlIDwgNDggLyogJzAnICovIHx8IGNvZGUgPiA1NyAvKiAnOScgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIG51bWJlck9mRG90cyA9PT0gMyAmJlxuICAgIGhvc3RuYW1lLmNoYXJDb2RlQXQoMCkgIT09IDQ2IC8qICcuJyAqLyAmJlxuICAgIGhvc3RuYW1lLmNoYXJDb2RlQXQoaG9zdG5hbWUubGVuZ3RoIC0gMSkgIT09IDQ2IC8qICcuJyAqL1xuICApO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gaXNQcm9iYWJseUlwdjQuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvYmFibHlJcHY2KGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGhvc3RuYW1lLmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgc3RhcnQgPSBob3N0bmFtZS5zdGFydHNXaXRoKCdbJykgPyAxIDogMDtcbiAgbGV0IGVuZCA9IGhvc3RuYW1lLmxlbmd0aDtcblxuICBpZiAoaG9zdG5hbWVbZW5kIC0gMV0gPT09ICddJykge1xuICAgIGVuZCAtPSAxO1xuICB9XG5cbiAgLy8gV2Ugb25seSBjb25zaWRlciB0aGUgbWF4aW11bSBzaXplIG9mIGEgbm9ybWFsIElQVjYuIE5vdGUgdGhhdCB0aGlzIHdpbGxcbiAgLy8gZmFpbCBvbiBzby1jYWxsZWQgXCJJUHY0IG1hcHBlZCBJUHY2IGFkZHJlc3Nlc1wiIGJ1dCB0aGlzIGlzIGEgY29ybmVyLWNhc2VcbiAgLy8gYW5kIGEgcHJvcGVyIHZhbGlkYXRpb24gbGlicmFyeSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlc2UuXG4gIGlmIChlbmQgLSBzdGFydCA+IDM5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0NvbG9uID0gZmFsc2U7XG5cbiAgZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGhvc3RuYW1lLmNoYXJDb2RlQXQoc3RhcnQpO1xuXG4gICAgaWYgKGNvZGUgPT09IDU4IC8qICc6JyAqLykge1xuICAgICAgaGFzQ29sb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhKFxuICAgICAgICAoXG4gICAgICAgICAgKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NykgfHwgLy8gMC05XG4gICAgICAgICAgKGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDIpIHx8IC8vIGEtZlxuICAgICAgICAgIChjb2RlID49IDY1ICYmIGNvZGUgPD0gOTApXG4gICAgICAgICkgLy8gQS1GXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc0NvbG9uO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBob3N0bmFtZWAgaXMgKnByb2JhYmx5KiBhIHZhbGlkIGlwIGFkZHIgKGVpdGhlciBpcHY2IG9yIGlwdjQpLlxuICogVGhpcyAqd2lsbCBub3QqIHdvcmsgb24gYW55IHN0cmluZy4gV2UgbmVlZCBgaG9zdG5hbWVgIHRvIGJlIGEgdmFsaWRcbiAqIGhvc3RuYW1lLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0lwKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvYmFibHlJcHY2KGhvc3RuYW1lKSB8fCBpc1Byb2JhYmx5SXB2NChob3N0bmFtZSk7XG59XG4iLCAiLyoqXG4gKiBJbXBsZW1lbnRzIGZhc3Qgc2hhbGxvdyB2ZXJpZmljYXRpb24gb2YgaG9zdG5hbWVzLiBUaGlzIGRvZXMgbm90IHBlcmZvcm0gYVxuICogc3RydWN0IGNoZWNrIG9uIHRoZSBjb250ZW50IG9mIGxhYmVscyAoY2xhc3NlcyBvZiBVbmljb2RlIGNoYXJhY3RlcnMsIGV0Yy4pXG4gKiBidXQgaW5zdGVhZCBjaGVjayB0aGF0IHRoZSBzdHJ1Y3R1cmUgaXMgdmFsaWQgKG51bWJlciBvZiBsYWJlbHMsIGxlbmd0aCBvZlxuICogbGFiZWxzLCBldGMuKS5cbiAqXG4gKiBJZiB5b3UgbmVlZCBzdHJpY3RlciB2YWxpZGF0aW9uLCBjb25zaWRlciB1c2luZyBhbiBleHRlcm5hbCBsaWJyYXJ5LlxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRBc2NpaShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEyMikgfHwgKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NykgfHwgY29kZSA+IDEyN1xuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgaG9zdG5hbWUgc3RyaW5nIGlzIHZhbGlkLiBJdCdzIHVzdWFsbHkgYSBwcmVsaW1pbmFyeSBjaGVjayBiZWZvcmVcbiAqIHRyeWluZyB0byB1c2UgZ2V0RG9tYWluIG9yIGFueXRoaW5nIGVsc2UuXG4gKlxuICogQmV3YXJlOiBpdCBkb2VzIG5vdCBjaGVjayBpZiB0aGUgVExEIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGhvc3RuYW1lLmxlbmd0aCA+IDI1NSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChob3N0bmFtZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgLypAX19JTkxJTkVfXyovICFpc1ZhbGlkQXNjaWkoaG9zdG5hbWUuY2hhckNvZGVBdCgwKSkgJiZcbiAgICBob3N0bmFtZS5jaGFyQ29kZUF0KDApICE9PSA0NiAmJiAvLyAnLicgKGRvdClcbiAgICBob3N0bmFtZS5jaGFyQ29kZUF0KDApICE9PSA5NSAvLyAnXycgKHVuZGVyc2NvcmUpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGhvc3RuYW1lIGFjY29yZGluZyB0byBSRkNcbiAgbGV0IGxhc3REb3RJbmRleCA9IC0xO1xuICBsZXQgbGFzdENoYXJDb2RlID0gLTE7XG4gIGNvbnN0IGxlbiA9IGhvc3RuYW1lLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGhvc3RuYW1lLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPT09IDQ2IC8qICcuJyAqLykge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBDaGVjayB0aGF0IHByZXZpb3VzIGxhYmVsIGlzIDwgNjMgYnl0ZXMgbG9uZyAoNjQgPSA2MyArICcuJylcbiAgICAgICAgaSAtIGxhc3REb3RJbmRleCA+IDY0IHx8XG4gICAgICAgIC8vIENoZWNrIHRoYXQgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyBub3QgYWxyZWFkeSBhICcuJ1xuICAgICAgICBsYXN0Q2hhckNvZGUgPT09IDQ2IHx8XG4gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIGxhYmVsIGRvZXMgbm90IGVuZCB3aXRoIGEgJy0nIChkYXNoKVxuICAgICAgICBsYXN0Q2hhckNvZGUgPT09IDQ1IHx8XG4gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIGxhYmVsIGRvZXMgbm90IGVuZCB3aXRoIGEgJ18nICh1bmRlcnNjb3JlKVxuICAgICAgICBsYXN0Q2hhckNvZGUgPT09IDk1XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsYXN0RG90SW5kZXggPSBpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhKC8qQF9fSU5MSU5FX18qLyAoaXNWYWxpZEFzY2lpKGNvZGUpIHx8IGNvZGUgPT09IDQ1IHx8IGNvZGUgPT09IDk1KSlcbiAgICApIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgZm9yYmlkZGVuIGNoYXJhY3RlciBpbiB0aGUgbGFiZWxcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsYXN0Q2hhckNvZGUgPSBjb2RlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAvLyBDaGVjayB0aGF0IGxhc3QgbGFiZWwgaXMgc2hvcnRlciB0aGFuIDYzIGNoYXJzXG4gICAgbGVuIC0gbGFzdERvdEluZGV4IC0gMSA8PSA2MyAmJlxuICAgIC8vIENoZWNrIHRoYXQgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGFuIGFsbG93ZWQgdHJhaWxpbmcgbGFiZWwgY2hhcmFjdGVyLlxuICAgIC8vIFNpbmNlIHdlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBjaGFyIGlzIGEgdmFsaWQgaG9zdG5hbWUgY2hhcmFjdGVyLFxuICAgIC8vIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGF0IGl0J3MgZGlmZmVyZW50IGZyb20gJy0nLlxuICAgIGxhc3RDaGFyQ29kZSAhPT0gNDVcbiAgKTtcbn1cbiIsICJleHBvcnQgaW50ZXJmYWNlIElPcHRpb25zIHtcbiAgYWxsb3dJY2FubkRvbWFpbnM6IGJvb2xlYW47XG4gIGFsbG93UHJpdmF0ZURvbWFpbnM6IGJvb2xlYW47XG4gIGRldGVjdElwOiBib29sZWFuO1xuICBleHRyYWN0SG9zdG5hbWU6IGJvb2xlYW47XG4gIG1peGVkSW5wdXRzOiBib29sZWFuO1xuICB2YWxpZEhvc3RzOiBzdHJpbmdbXSB8IG51bGw7XG4gIHZhbGlkYXRlSG9zdG5hbWU6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHRzSW1wbCh7XG4gIGFsbG93SWNhbm5Eb21haW5zID0gdHJ1ZSxcbiAgYWxsb3dQcml2YXRlRG9tYWlucyA9IGZhbHNlLFxuICBkZXRlY3RJcCA9IHRydWUsXG4gIGV4dHJhY3RIb3N0bmFtZSA9IHRydWUsXG4gIG1peGVkSW5wdXRzID0gdHJ1ZSxcbiAgdmFsaWRIb3N0cyA9IG51bGwsXG4gIHZhbGlkYXRlSG9zdG5hbWUgPSB0cnVlLFxufTogUGFydGlhbDxJT3B0aW9ucz4pOiBJT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dJY2FubkRvbWFpbnMsXG4gICAgYWxsb3dQcml2YXRlRG9tYWlucyxcbiAgICBkZXRlY3RJcCxcbiAgICBleHRyYWN0SG9zdG5hbWUsXG4gICAgbWl4ZWRJbnB1dHMsXG4gICAgdmFsaWRIb3N0cyxcbiAgICB2YWxpZGF0ZUhvc3RuYW1lLFxuICB9O1xufVxuXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSAvKkBfX0lOTElORV9fKi8gc2V0RGVmYXVsdHNJbXBsKHt9KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRzKG9wdGlvbnM/OiBQYXJ0aWFsPElPcHRpb25zPik6IElPcHRpb25zIHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBERUZBVUxUX09QVElPTlM7XG4gIH1cblxuICByZXR1cm4gLypAX19JTkxJTkVfXyovIHNldERlZmF1bHRzSW1wbChvcHRpb25zKTtcbn1cbiIsICIvKipcbiAqIFJldHVybnMgdGhlIHN1YmRvbWFpbiBvZiBhIGhvc3RuYW1lIHN0cmluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTdWJkb21haW4oaG9zdG5hbWU6IHN0cmluZywgZG9tYWluOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBJZiBgaG9zdG5hbWVgIGFuZCBgZG9tYWluYCBhcmUgdGhlIHNhbWUsIHRoZW4gdGhlcmUgaXMgbm8gc3ViLWRvbWFpblxuICBpZiAoZG9tYWluLmxlbmd0aCA9PT0gaG9zdG5hbWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RuYW1lLnNsaWNlKDAsIC1kb21haW4ubGVuZ3RoIC0gMSk7XG59XG4iLCAiLyoqXG4gKiBJbXBsZW1lbnQgYSBmYWN0b3J5IGFsbG93aW5nIHRvIHBsdWcgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBzdWZmaXhcbiAqIGxvb2t1cCAoZS5nLjogdXNpbmcgYSB0cmllIG9yIHRoZSBwYWNrZWQgaGFzaGVzIGRhdGFzdHJ1Y3R1cmVzKS4gVGhpcyBpcyB1c2VkXG4gKiBhbmQgZXhwb3NlZCBpbiBgdGxkdHMudHNgIGFuZCBgdGxkdHMtZXhwZXJpbWVudGFsLnRzYCBidW5kbGUgZW50cnlwb2ludHMuXG4gKi9cblxuaW1wb3J0IGdldERvbWFpbiBmcm9tICcuL2RvbWFpbic7XG5pbXBvcnQgZ2V0RG9tYWluV2l0aG91dFN1ZmZpeCBmcm9tICcuL2RvbWFpbi13aXRob3V0LXN1ZmZpeCc7XG5pbXBvcnQgZXh0cmFjdEhvc3RuYW1lIGZyb20gJy4vZXh0cmFjdC1ob3N0bmFtZSc7XG5pbXBvcnQgaXNJcCBmcm9tICcuL2lzLWlwJztcbmltcG9ydCBpc1ZhbGlkSG9zdG5hbWUgZnJvbSAnLi9pcy12YWxpZCc7XG5pbXBvcnQgeyBJUHVibGljU3VmZml4LCBJU3VmZml4TG9va3VwT3B0aW9ucyB9IGZyb20gJy4vbG9va3VwL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBJT3B0aW9ucywgc2V0RGVmYXVsdHMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IGdldFN1YmRvbWFpbiBmcm9tICcuL3N1YmRvbWFpbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3VsdCB7XG4gIC8vIGBob3N0bmFtZWAgaXMgZWl0aGVyIGEgcmVnaXN0ZXJlZCBuYW1lIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFcbiAgLy8gaG9zdG5hbWUpLCBvciBhbiBJUCBhZGRyZXNzLiBJUHY0IGFkZHJlc3NlcyBtdXN0IGJlIGluIGRvdC1kZWNpbWFsXG4gIC8vIG5vdGF0aW9uLCBhbmQgSVB2NiBhZGRyZXNzZXMgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFja2V0cyAoW10pLiBUaGlzIGlzXG4gIC8vIGRpcmVjdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBVUkwuXG4gIGhvc3RuYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8vIElzIGBob3N0bmFtZWAgYW4gSVA/IChJUHY0IG9yIElQdjYpXG4gIGlzSXA6IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8vIGBob3N0bmFtZWAgc3BsaXQgYmV0d2VlbiBzdWJkb21haW4sIGRvbWFpbiBhbmQgaXRzIHB1YmxpYyBzdWZmaXggKGlmIGFueSlcbiAgc3ViZG9tYWluOiBzdHJpbmcgfCBudWxsO1xuICBkb21haW46IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpY1N1ZmZpeDogc3RyaW5nIHwgbnVsbDtcbiAgZG9tYWluV2l0aG91dFN1ZmZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAvLyBTcGVjaWZpZXMgaWYgYHB1YmxpY1N1ZmZpeGAgY29tZXMgZnJvbSB0aGUgSUNBTk4gb3IgUFJJVkFURSBzZWN0aW9uIG9mIHRoZSBsaXN0XG4gIGlzSWNhbm46IGJvb2xlYW4gfCBudWxsO1xuICBpc1ByaXZhdGU6IGJvb2xlYW4gfCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW1wdHlSZXN1bHQoKTogSVJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZG9tYWluOiBudWxsLFxuICAgIGRvbWFpbldpdGhvdXRTdWZmaXg6IG51bGwsXG4gICAgaG9zdG5hbWU6IG51bGwsXG4gICAgaXNJY2FubjogbnVsbCxcbiAgICBpc0lwOiBudWxsLFxuICAgIGlzUHJpdmF0ZTogbnVsbCxcbiAgICBwdWJsaWNTdWZmaXg6IG51bGwsXG4gICAgc3ViZG9tYWluOiBudWxsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRSZXN1bHQocmVzdWx0OiBJUmVzdWx0KTogdm9pZCB7XG4gIHJlc3VsdC5kb21haW4gPSBudWxsO1xuICByZXN1bHQuZG9tYWluV2l0aG91dFN1ZmZpeCA9IG51bGw7XG4gIHJlc3VsdC5ob3N0bmFtZSA9IG51bGw7XG4gIHJlc3VsdC5pc0ljYW5uID0gbnVsbDtcbiAgcmVzdWx0LmlzSXAgPSBudWxsO1xuICByZXN1bHQuaXNQcml2YXRlID0gbnVsbDtcbiAgcmVzdWx0LnB1YmxpY1N1ZmZpeCA9IG51bGw7XG4gIHJlc3VsdC5zdWJkb21haW4gPSBudWxsO1xufVxuXG4vLyBGbGFncyByZXByZXNlbnRpbmcgc3RlcHMgaW4gdGhlIGBwYXJzZWAgZnVuY3Rpb24uIFRoZXkgYXJlIHVzZWQgdG8gaW1wbGVtZW50XG4vLyBhbiBlYXJseSBzdG9wIG1lY2hhbmlzbSAoc2ltdWxhdGluZyBzb21lIGZvcm0gb2YgbGF6aW5lc3MpIHRvIGF2b2lkIGRvaW5nXG4vLyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhIGdpdmVuIGFjdGlvbiAoZS5nLjogd2UgZG9uJ3QgbmVlZCB0b1xuLy8gZXh0cmFjdCB0aGUgZG9tYWluIGFuZCBzdWJkb21haW4gaWYgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwdWJsaWMgc3VmZml4KS5cbmV4cG9ydCBjb25zdCBlbnVtIEZMQUcge1xuICBIT1NUTkFNRSxcbiAgSVNfVkFMSUQsXG4gIFBVQkxJQ19TVUZGSVgsXG4gIERPTUFJTixcbiAgU1VCX0RPTUFJTixcbiAgQUxMLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbXBsKFxuICB1cmw6IHN0cmluZyxcbiAgc3RlcDogRkxBRyxcbiAgc3VmZml4TG9va3VwOiAoXG4gICAgXzE6IHN0cmluZyxcbiAgICBfMjogSVN1ZmZpeExvb2t1cE9wdGlvbnMsXG4gICAgXzM6IElQdWJsaWNTdWZmaXgsXG4gICkgPT4gdm9pZCxcbiAgcGFydGlhbE9wdGlvbnM6IFBhcnRpYWw8SU9wdGlvbnM+LFxuICByZXN1bHQ6IElSZXN1bHQsXG4pOiBJUmVzdWx0IHtcbiAgY29uc3Qgb3B0aW9uczogSU9wdGlvbnMgPSAvKkBfX0lOTElORV9fKi8gc2V0RGVmYXVsdHMocGFydGlhbE9wdGlvbnMpO1xuXG4gIC8vIFZlcnkgZmFzdCBhcHByb3hpbWF0ZSBjaGVjayB0byBtYWtlIHN1cmUgYHVybGAgaXMgYSBzdHJpbmcuIFRoaXMgaXMgbmVlZGVkXG4gIC8vIGJlY2F1c2UgdGhlIGxpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZCBpbiBhIHR5cGVkIHNldHVwIGFuZFxuICAvLyB2YWx1ZXMgb2YgYXJiaXRyYXJ5IHR5cGVzIG1pZ2h0IGJlIGdpdmVuIGFzIGFyZ3VtZW50LlxuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gRXh0cmFjdCBob3N0bmFtZSBmcm9tIGB1cmxgIG9ubHkgaWYgbmVlZGVkLiBUaGlzIGNhbiBiZSBtYWRlIG9wdGlvbmFsXG4gIC8vIHVzaW5nIGBvcHRpb25zLmV4dHJhY3RIb3N0bmFtZWAuIFRoaXMgb3B0aW9uIHdpbGwgdHlwaWNhbGx5IGJlIHVzZWRcbiAgLy8gd2hlbmV2ZXIgd2UgYXJlIHN1cmUgdGhlIGlucHV0cyB0byBgcGFyc2VgIGFyZSBhbHJlYWR5IGhvc3RuYW1lcyBhbmQgbm90XG4gIC8vIGFyYml0cmFyeSBVUkxzLlxuICAvL1xuICAvLyBgbWl4ZWRJbnB1dGAgYWxsb3dzIHRvIHNwZWNpZnkgaWYgd2UgZXhwZWN0IGEgbWl4IG9mIFVSTHMgYW5kIGhvc3RuYW1lc1xuICAvLyBhcyBpbnB1dC4gSWYgb25seSBob3N0bmFtZXMgYXJlIGV4cGVjdGVkIHRoZW4gYGV4dHJhY3RIb3N0bmFtZWAgY2FuIGJlXG4gIC8vIHNldCB0byBgZmFsc2VgIHRvIHNwZWVkLXVwIHBhcnNpbmcuIElmIG9ubHkgVVJMcyBhcmUgZXhwZWN0ZWQgdGhlblxuICAvLyBgbWl4ZWRJbnB1dHNgIGNhbiBiZSBzZXQgdG8gYGZhbHNlYC4gVGhlIGBtaXhlZElucHV0c2AgaXMgb25seSBhIGhpbnRcbiAgLy8gYW5kIHdpbGwgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGxpYnJhcnkuXG4gIGlmICghb3B0aW9ucy5leHRyYWN0SG9zdG5hbWUpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSB1cmw7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5taXhlZElucHV0cykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IGV4dHJhY3RIb3N0bmFtZSh1cmwsIGlzVmFsaWRIb3N0bmFtZSh1cmwpKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSBleHRyYWN0SG9zdG5hbWUodXJsLCBmYWxzZSk7XG4gIH1cblxuICAvLyBDaGVjayBpZiBgaG9zdG5hbWVgIGlzIGEgdmFsaWQgaXAgYWRkcmVzc1xuICBpZiAob3B0aW9ucy5kZXRlY3RJcCAmJiByZXN1bHQuaG9zdG5hbWUgIT09IG51bGwpIHtcbiAgICByZXN1bHQuaXNJcCA9IGlzSXAocmVzdWx0Lmhvc3RuYW1lKTtcbiAgICBpZiAocmVzdWx0LmlzSXApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gUGVyZm9ybSBob3N0bmFtZSB2YWxpZGF0aW9uIGlmIGVuYWJsZWQuIElmIGhvc3RuYW1lIGlzIG5vdCB2YWxpZCwgbm8gbmVlZCB0b1xuICAvLyBnbyBmdXJ0aGVyIGFzIHRoZXJlIHdpbGwgYmUgbm8gdmFsaWQgZG9tYWluIG9yIHN1Yi1kb21haW4uIFRoaXMgdmFsaWRhdGlvblxuICAvLyBpcyBhcHBsaWVkIGJlZm9yZSBhbnkgZWFybHkgcmV0dXJucyB0byBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3NcbiAgLy8gYWxsIEFQSSBtZXRob2RzIGluY2x1ZGluZyBnZXRIb3N0bmFtZSgpLlxuICBpZiAoXG4gICAgb3B0aW9ucy52YWxpZGF0ZUhvc3RuYW1lICYmXG4gICAgb3B0aW9ucy5leHRyYWN0SG9zdG5hbWUgJiZcbiAgICByZXN1bHQuaG9zdG5hbWUgIT09IG51bGwgJiZcbiAgICAhaXNWYWxpZEhvc3RuYW1lKHJlc3VsdC5ob3N0bmFtZSlcbiAgKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHN0ZXAgPT09IEZMQUcuSE9TVE5BTUUgfHwgcmVzdWx0Lmhvc3RuYW1lID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgcHVibGljIHN1ZmZpeFxuICBzdWZmaXhMb29rdXAocmVzdWx0Lmhvc3RuYW1lLCBvcHRpb25zLCByZXN1bHQpO1xuICBpZiAoc3RlcCA9PT0gRkxBRy5QVUJMSUNfU1VGRklYIHx8IHJlc3VsdC5wdWJsaWNTdWZmaXggPT09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gRXh0cmFjdCBkb21haW5cbiAgcmVzdWx0LmRvbWFpbiA9IGdldERvbWFpbihyZXN1bHQucHVibGljU3VmZml4LCByZXN1bHQuaG9zdG5hbWUsIG9wdGlvbnMpO1xuICBpZiAoc3RlcCA9PT0gRkxBRy5ET01BSU4gfHwgcmVzdWx0LmRvbWFpbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBFeHRyYWN0IHN1YmRvbWFpblxuICByZXN1bHQuc3ViZG9tYWluID0gZ2V0U3ViZG9tYWluKHJlc3VsdC5ob3N0bmFtZSwgcmVzdWx0LmRvbWFpbik7XG4gIGlmIChzdGVwID09PSBGTEFHLlNVQl9ET01BSU4pIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gRXh0cmFjdCBkb21haW4gd2l0aG91dCBzdWZmaXhcbiAgcmVzdWx0LmRvbWFpbldpdGhvdXRTdWZmaXggPSBnZXREb21haW5XaXRob3V0U3VmZml4KFxuICAgIHJlc3VsdC5kb21haW4sXG4gICAgcmVzdWx0LnB1YmxpY1N1ZmZpeCxcbiAgKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImltcG9ydCB7IElQdWJsaWNTdWZmaXgsIElTdWZmaXhMb29rdXBPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoXG4gIGhvc3RuYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IElTdWZmaXhMb29rdXBPcHRpb25zLFxuICBvdXQ6IElQdWJsaWNTdWZmaXgsXG4pOiBib29sZWFuIHtcbiAgLy8gRmFzdCBwYXRoIGZvciB2ZXJ5IHBvcHVsYXIgc3VmZml4ZXM7IHRoaXMgYWxsb3dzIHRvIGJ5LXBhc3MgbG9va3VwXG4gIC8vIGNvbXBsZXRlbHkgYXMgd2VsbCBhcyBhbnkgZXh0cmEgYWxsb2NhdGlvbiBvciBzdHJpbmcgbWFuaXB1bGF0aW9uLlxuICBpZiAoIW9wdGlvbnMuYWxsb3dQcml2YXRlRG9tYWlucyAmJiBob3N0bmFtZS5sZW5ndGggPiAzKSB7XG4gICAgY29uc3QgbGFzdDogbnVtYmVyID0gaG9zdG5hbWUubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBjMzogbnVtYmVyID0gaG9zdG5hbWUuY2hhckNvZGVBdChsYXN0KTtcbiAgICBjb25zdCBjMjogbnVtYmVyID0gaG9zdG5hbWUuY2hhckNvZGVBdChsYXN0IC0gMSk7XG4gICAgY29uc3QgYzE6IG51bWJlciA9IGhvc3RuYW1lLmNoYXJDb2RlQXQobGFzdCAtIDIpO1xuICAgIGNvbnN0IGMwOiBudW1iZXIgPSBob3N0bmFtZS5jaGFyQ29kZUF0KGxhc3QgLSAzKTtcblxuICAgIGlmIChcbiAgICAgIGMzID09PSAxMDkgLyogJ20nICovICYmXG4gICAgICBjMiA9PT0gMTExIC8qICdvJyAqLyAmJlxuICAgICAgYzEgPT09IDk5IC8qICdjJyAqLyAmJlxuICAgICAgYzAgPT09IDQ2IC8qICcuJyAqL1xuICAgICkge1xuICAgICAgb3V0LmlzSWNhbm4gPSB0cnVlO1xuICAgICAgb3V0LmlzUHJpdmF0ZSA9IGZhbHNlO1xuICAgICAgb3V0LnB1YmxpY1N1ZmZpeCA9ICdjb20nO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGMzID09PSAxMDMgLyogJ2cnICovICYmXG4gICAgICBjMiA9PT0gMTE0IC8qICdyJyAqLyAmJlxuICAgICAgYzEgPT09IDExMSAvKiAnbycgKi8gJiZcbiAgICAgIGMwID09PSA0NiAvKiAnLicgKi9cbiAgICApIHtcbiAgICAgIG91dC5pc0ljYW5uID0gdHJ1ZTtcbiAgICAgIG91dC5pc1ByaXZhdGUgPSBmYWxzZTtcbiAgICAgIG91dC5wdWJsaWNTdWZmaXggPSAnb3JnJztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjMyA9PT0gMTE3IC8qICd1JyAqLyAmJlxuICAgICAgYzIgPT09IDEwMCAvKiAnZCcgKi8gJiZcbiAgICAgIGMxID09PSAxMDEgLyogJ2UnICovICYmXG4gICAgICBjMCA9PT0gNDYgLyogJy4nICovXG4gICAgKSB7XG4gICAgICBvdXQuaXNJY2FubiA9IHRydWU7XG4gICAgICBvdXQuaXNQcml2YXRlID0gZmFsc2U7XG4gICAgICBvdXQucHVibGljU3VmZml4ID0gJ2VkdSc7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYzMgPT09IDExOCAvKiAndicgKi8gJiZcbiAgICAgIGMyID09PSAxMTEgLyogJ28nICovICYmXG4gICAgICBjMSA9PT0gMTAzIC8qICdnJyAqLyAmJlxuICAgICAgYzAgPT09IDQ2IC8qICcuJyAqL1xuICAgICkge1xuICAgICAgb3V0LmlzSWNhbm4gPSB0cnVlO1xuICAgICAgb3V0LmlzUHJpdmF0ZSA9IGZhbHNlO1xuICAgICAgb3V0LnB1YmxpY1N1ZmZpeCA9ICdnb3YnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGMzID09PSAxMTYgLyogJ3QnICovICYmXG4gICAgICBjMiA9PT0gMTAxIC8qICdlJyAqLyAmJlxuICAgICAgYzEgPT09IDExMCAvKiAnbicgKi8gJiZcbiAgICAgIGMwID09PSA0NiAvKiAnLicgKi9cbiAgICApIHtcbiAgICAgIG91dC5pc0ljYW5uID0gdHJ1ZTtcbiAgICAgIG91dC5pc1ByaXZhdGUgPSBmYWxzZTtcbiAgICAgIG91dC5wdWJsaWNTdWZmaXggPSAnbmV0JztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjMyA9PT0gMTAxIC8qICdlJyAqLyAmJlxuICAgICAgYzIgPT09IDEwMCAvKiAnZCcgKi8gJiZcbiAgICAgIGMxID09PSA0NiAvKiAnLicgKi9cbiAgICApIHtcbiAgICAgIG91dC5pc0ljYW5uID0gdHJ1ZTtcbiAgICAgIG91dC5pc1ByaXZhdGUgPSBmYWxzZTtcbiAgICAgIG91dC5wdWJsaWNTdWZmaXggPSAnZGUnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIlxuZXhwb3J0IHR5cGUgSVRyaWUgPSBbMCB8IDEgfCAyLCB7IFtsYWJlbDogc3RyaW5nXTogSVRyaWV9XTtcblxuZXhwb3J0IGNvbnN0IGV4Y2VwdGlvbnM6IElUcmllID0gKGZ1bmN0aW9uKCkge1xuICBjb25zdCBfMDogSVRyaWUgPSBbMSx7fV0sXzE6IElUcmllID0gWzAse1wiY2l0eVwiOl8wfV07XG5jb25zdCBleGNlcHRpb25zOiBJVHJpZSA9IFswLHtcImNrXCI6WzAse1wid3d3XCI6XzB9XSxcImpwXCI6WzAse1wia2F3YXNha2lcIjpfMSxcImtpdGFreXVzaHVcIjpfMSxcImtvYmVcIjpfMSxcIm5hZ295YVwiOl8xLFwic2FwcG9yb1wiOl8xLFwic2VuZGFpXCI6XzEsXCJ5b2tvaGFtYVwiOl8xfV19XTtcbiAgcmV0dXJuIGV4Y2VwdGlvbnM7XG59KSgpO1xuXG5leHBvcnQgY29uc3QgcnVsZXM6IElUcmllID0gKGZ1bmN0aW9uKCkge1xuICBjb25zdCBfMjogSVRyaWUgPSBbMSx7fV0sXzM6IElUcmllID0gWzIse31dLF80OiBJVHJpZSA9IFsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxfNTogSVRyaWUgPSBbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxfNjogSVRyaWUgPSBbMCx7XCIqXCI6XzN9XSxfNzogSVRyaWUgPSBbMix7XCJzXCI6XzZ9XSxfODogSVRyaWUgPSBbMCx7XCJyZWxheVwiOl8zfV0sXzk6IElUcmllID0gWzIse1wiaWRcIjpfM31dLF8xMDogSVRyaWUgPSBbMSx7XCJnb3ZcIjpfMn1dLF8xMTogSVRyaWUgPSBbMix7XCJ2cHNcIjpfM31dLF8xMjogSVRyaWUgPSBbMCx7XCJhaXJmbG93XCI6XzYsXCJ0cmFuc2Zlci13ZWJhcHBcIjpfM31dLF8xMzogSVRyaWUgPSBbMCx7XCJ0cmFuc2Zlci13ZWJhcHBcIjpfMyxcInRyYW5zZmVyLXdlYmFwcC1maXBzXCI6XzN9XSxfMTQ6IElUcmllID0gWzAse1wibm90ZWJvb2tcIjpfMyxcInN0dWRpb1wiOl8zfV0sXzE1OiBJVHJpZSA9IFswLHtcImxhYmVsaW5nXCI6XzMsXCJub3RlYm9va1wiOl8zLFwic3R1ZGlvXCI6XzN9XSxfMTY6IElUcmllID0gWzAse1wibm90ZWJvb2tcIjpfM31dLF8xNzogSVRyaWUgPSBbMCx7XCJsYWJlbGluZ1wiOl8zLFwibm90ZWJvb2tcIjpfMyxcIm5vdGVib29rLWZpcHNcIjpfMyxcInN0dWRpb1wiOl8zfV0sXzE4OiBJVHJpZSA9IFswLHtcIm5vdGVib29rXCI6XzMsXCJub3RlYm9vay1maXBzXCI6XzMsXCJzdHVkaW9cIjpfMyxcInN0dWRpby1maXBzXCI6XzN9XSxfMTk6IElUcmllID0gWzAse1wic2hvcFwiOl8zfV0sXzIwOiBJVHJpZSA9IFswLHtcIipcIjpfMn1dLF8yMTogSVRyaWUgPSBbMSx7XCJjb1wiOl8zfV0sXzIyOiBJVHJpZSA9IFswLHtcIm9iamVjdHNcIjpfM31dLF8yMzogSVRyaWUgPSBbMix7XCJub2Rlc1wiOl8zfV0sXzI0OiBJVHJpZSA9IFswLHtcIm15XCI6XzN9XSxfMjU6IElUcmllID0gWzAse1wiczNcIjpfMyxcInMzLWFjY2Vzc3BvaW50XCI6XzMsXCJzMy13ZWJzaXRlXCI6XzN9XSxfMjY6IElUcmllID0gWzAse1wiczNcIjpfMyxcInMzLWFjY2Vzc3BvaW50XCI6XzN9XSxfMjc6IElUcmllID0gWzAse1wiZGlyZWN0XCI6XzN9XSxfMjg6IElUcmllID0gWzAse1wid2Vidmlldy1hc3NldHNcIjpfM31dLF8yOTogSVRyaWUgPSBbMCx7XCJ2ZnNcIjpfMyxcIndlYnZpZXctYXNzZXRzXCI6XzN9XSxfMzA6IElUcmllID0gWzAse1wiZXhlY3V0ZS1hcGlcIjpfMyxcImVtcmFwcHVpLXByb2RcIjpfMyxcImVtcm5vdGVib29rcy1wcm9kXCI6XzMsXCJlbXJzdHVkaW8tcHJvZFwiOl8zLFwiZHVhbHN0YWNrXCI6XzI1LFwiczNcIjpfMyxcInMzLWFjY2Vzc3BvaW50XCI6XzMsXCJzMy1vYmplY3QtbGFtYmRhXCI6XzMsXCJzMy13ZWJzaXRlXCI6XzMsXCJhd3MtY2xvdWQ5XCI6XzI4LFwiY2xvdWQ5XCI6XzI5fV0sXzMxOiBJVHJpZSA9IFswLHtcImV4ZWN1dGUtYXBpXCI6XzMsXCJlbXJhcHB1aS1wcm9kXCI6XzMsXCJlbXJub3RlYm9va3MtcHJvZFwiOl8zLFwiZW1yc3R1ZGlvLXByb2RcIjpfMyxcImR1YWxzdGFja1wiOl8yNixcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtb2JqZWN0LWxhbWJkYVwiOl8zLFwiczMtd2Vic2l0ZVwiOl8zLFwiYXdzLWNsb3VkOVwiOl8yOCxcImNsb3VkOVwiOl8yOX1dLF8zMjogSVRyaWUgPSBbMCx7XCJleGVjdXRlLWFwaVwiOl8zLFwiZW1yYXBwdWktcHJvZFwiOl8zLFwiZW1ybm90ZWJvb2tzLXByb2RcIjpfMyxcImVtcnN0dWRpby1wcm9kXCI6XzMsXCJkdWFsc3RhY2tcIjpfMjUsXCJzM1wiOl8zLFwiczMtYWNjZXNzcG9pbnRcIjpfMyxcInMzLW9iamVjdC1sYW1iZGFcIjpfMyxcInMzLXdlYnNpdGVcIjpfMyxcImFuYWx5dGljcy1nYXRld2F5XCI6XzMsXCJhd3MtY2xvdWQ5XCI6XzI4LFwiY2xvdWQ5XCI6XzI5fV0sXzMzOiBJVHJpZSA9IFswLHtcImV4ZWN1dGUtYXBpXCI6XzMsXCJlbXJhcHB1aS1wcm9kXCI6XzMsXCJlbXJub3RlYm9va3MtcHJvZFwiOl8zLFwiZW1yc3R1ZGlvLXByb2RcIjpfMyxcImR1YWxzdGFja1wiOl8yNSxcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtb2JqZWN0LWxhbWJkYVwiOl8zLFwiczMtd2Vic2l0ZVwiOl8zfV0sXzM0OiBJVHJpZSA9IFswLHtcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtYWNjZXNzcG9pbnQtZmlwc1wiOl8zLFwiczMtZmlwc1wiOl8zLFwiczMtd2Vic2l0ZVwiOl8zfV0sXzM1OiBJVHJpZSA9IFswLHtcImV4ZWN1dGUtYXBpXCI6XzMsXCJlbXJhcHB1aS1wcm9kXCI6XzMsXCJlbXJub3RlYm9va3MtcHJvZFwiOl8zLFwiZW1yc3R1ZGlvLXByb2RcIjpfMyxcImR1YWxzdGFja1wiOl8zNCxcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtYWNjZXNzcG9pbnQtZmlwc1wiOl8zLFwiczMtZmlwc1wiOl8zLFwiczMtb2JqZWN0LWxhbWJkYVwiOl8zLFwiczMtd2Vic2l0ZVwiOl8zLFwiYXdzLWNsb3VkOVwiOl8yOCxcImNsb3VkOVwiOl8yOX1dLF8zNjogSVRyaWUgPSBbMCx7XCJleGVjdXRlLWFwaVwiOl8zLFwiZW1yYXBwdWktcHJvZFwiOl8zLFwiZW1ybm90ZWJvb2tzLXByb2RcIjpfMyxcImVtcnN0dWRpby1wcm9kXCI6XzMsXCJkdWFsc3RhY2tcIjpfMzQsXCJzM1wiOl8zLFwiczMtYWNjZXNzcG9pbnRcIjpfMyxcInMzLWFjY2Vzc3BvaW50LWZpcHNcIjpfMyxcInMzLWRlcHJlY2F0ZWRcIjpfMyxcInMzLWZpcHNcIjpfMyxcInMzLW9iamVjdC1sYW1iZGFcIjpfMyxcInMzLXdlYnNpdGVcIjpfMyxcImFuYWx5dGljcy1nYXRld2F5XCI6XzMsXCJhd3MtY2xvdWQ5XCI6XzI4LFwiY2xvdWQ5XCI6XzI5fV0sXzM3OiBJVHJpZSA9IFswLHtcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtYWNjZXNzcG9pbnQtZmlwc1wiOl8zLFwiczMtZmlwc1wiOl8zfV0sXzM4OiBJVHJpZSA9IFswLHtcImV4ZWN1dGUtYXBpXCI6XzMsXCJlbXJhcHB1aS1wcm9kXCI6XzMsXCJlbXJub3RlYm9va3MtcHJvZFwiOl8zLFwiZW1yc3R1ZGlvLXByb2RcIjpfMyxcImR1YWxzdGFja1wiOl8zNyxcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtYWNjZXNzcG9pbnQtZmlwc1wiOl8zLFwiczMtZmlwc1wiOl8zLFwiczMtb2JqZWN0LWxhbWJkYVwiOl8zLFwiczMtd2Vic2l0ZVwiOl8zfV0sXzM5OiBJVHJpZSA9IFswLHtcImF1dGhcIjpfM31dLF80MDogSVRyaWUgPSBbMCx7XCJhdXRoXCI6XzMsXCJhdXRoLWZpcHNcIjpfM31dLF80MTogSVRyaWUgPSBbMCx7XCJhdXRoLWZpcHNcIjpfM31dLF80MjogSVRyaWUgPSBbMCx7XCJhcHBzXCI6XzN9XSxfNDM6IElUcmllID0gWzAse1wicGFhc1wiOl8zfV0sXzQ0OiBJVHJpZSA9IFsyLHtcImV1XCI6XzN9XSxfNDU6IElUcmllID0gWzAse1wiYXBwXCI6XzN9XSxfNDY6IElUcmllID0gWzAse1wic2l0ZVwiOl8zfV0sXzQ3OiBJVHJpZSA9IFsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXzQ4OiBJVHJpZSA9IFswLHtcImpcIjpfM31dLF80OTogSVRyaWUgPSBbMCx7XCJkeW5cIjpfM31dLF81MDogSVRyaWUgPSBbMix7XCJ3ZWJcIjpfM31dLF81MTogSVRyaWUgPSBbMSx7XCJjb1wiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLF81MjogSVRyaWUgPSBbMCx7XCJwXCI6XzN9XSxfNTM6IElUcmllID0gWzAse1widXNlclwiOl8zfV0sXzU0OiBJVHJpZSA9IFswLHtcImNkblwiOl8zfV0sXzU1OiBJVHJpZSA9IFsyLHtcInJhd1wiOl82fV0sXzU2OiBJVHJpZSA9IFswLHtcImN1c3RcIjpfMyxcInJlc2VydmRcIjpfM31dLF81NzogSVRyaWUgPSBbMCx7XCJjdXN0XCI6XzN9XSxfNTg6IElUcmllID0gWzAse1wiczNcIjpfM31dLF81OTogSVRyaWUgPSBbMSx7XCJiaXpcIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxfNjA6IElUcmllID0gWzAse1wiaXBmc1wiOl8zfV0sXzYxOiBJVHJpZSA9IFsxLHtcImZyYW1lclwiOl8zfV0sXzYyOiBJVHJpZSA9IFswLHtcImZvcmdvdFwiOl8zfV0sXzYzOiBJVHJpZSA9IFsxLHtcImdzXCI6XzJ9XSxfNjQ6IElUcmllID0gWzAse1wibmVzXCI6XzJ9XSxfNjU6IElUcmllID0gWzEse1wiazEyXCI6XzIsXCJjY1wiOl8yLFwibGliXCI6XzJ9XSxfNjY6IElUcmllID0gWzEse1wiY2NcIjpfMn1dLF82NzogSVRyaWUgPSBbMSx7XCJjY1wiOl8yLFwibGliXCI6XzJ9XTtcbmNvbnN0IHJ1bGVzOiBJVHJpZSA9IFswLHtcImFjXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwiZHJyXCI6XzMsXCJmZWVkYmFja1wiOl8zLFwiZm9ybXNcIjpfM31dLFwiYWRcIjpfMixcImFlXCI6WzEse1wiYWNcIjpfMixcImNvXCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNjaFwiOl8yfV0sXCJhZXJvXCI6WzEse1wiYWlybGluZVwiOl8yLFwiYWlycG9ydFwiOl8yLFwiYWNjaWRlbnQtaW52ZXN0aWdhdGlvblwiOl8yLFwiYWNjaWRlbnQtcHJldmVudGlvblwiOl8yLFwiYWVyb2JhdGljXCI6XzIsXCJhZXJvY2x1YlwiOl8yLFwiYWVyb2Ryb21lXCI6XzIsXCJhZ2VudHNcIjpfMixcImFpci1zdXJ2ZWlsbGFuY2VcIjpfMixcImFpci10cmFmZmljLWNvbnRyb2xcIjpfMixcImFpcmNyYWZ0XCI6XzIsXCJhaXJ0cmFmZmljXCI6XzIsXCJhbWJ1bGFuY2VcIjpfMixcImFzc29jaWF0aW9uXCI6XzIsXCJhdXRob3JcIjpfMixcImJhbGxvb25pbmdcIjpfMixcImJyb2tlclwiOl8yLFwiY2FhXCI6XzIsXCJjYXJnb1wiOl8yLFwiY2F0ZXJpbmdcIjpfMixcImNlcnRpZmljYXRpb25cIjpfMixcImNoYW1waW9uc2hpcFwiOl8yLFwiY2hhcnRlclwiOl8yLFwiY2l2aWxhdmlhdGlvblwiOl8yLFwiY2x1YlwiOl8yLFwiY29uZmVyZW5jZVwiOl8yLFwiY29uc3VsdGFudFwiOl8yLFwiY29uc3VsdGluZ1wiOl8yLFwiY29udHJvbFwiOl8yLFwiY291bmNpbFwiOl8yLFwiY3Jld1wiOl8yLFwiZGVzaWduXCI6XzIsXCJkZ2NhXCI6XzIsXCJlZHVjYXRvclwiOl8yLFwiZW1lcmdlbmN5XCI6XzIsXCJlbmdpbmVcIjpfMixcImVuZ2luZWVyXCI6XzIsXCJlbnRlcnRhaW5tZW50XCI6XzIsXCJlcXVpcG1lbnRcIjpfMixcImV4Y2hhbmdlXCI6XzIsXCJleHByZXNzXCI6XzIsXCJmZWRlcmF0aW9uXCI6XzIsXCJmbGlnaHRcIjpfMixcImZyZWlnaHRcIjpfMixcImZ1ZWxcIjpfMixcImdsaWRpbmdcIjpfMixcImdvdmVybm1lbnRcIjpfMixcImdyb3VuZGhhbmRsaW5nXCI6XzIsXCJncm91cFwiOl8yLFwiaGFuZ2dsaWRpbmdcIjpfMixcImhvbWVidWlsdFwiOl8yLFwiaW5zdXJhbmNlXCI6XzIsXCJqb3VybmFsXCI6XzIsXCJqb3VybmFsaXN0XCI6XzIsXCJsZWFzaW5nXCI6XzIsXCJsb2dpc3RpY3NcIjpfMixcIm1hZ2F6aW5lXCI6XzIsXCJtYWludGVuYW5jZVwiOl8yLFwibWFya2V0cGxhY2VcIjpfMixcIm1lZGlhXCI6XzIsXCJtaWNyb2xpZ2h0XCI6XzIsXCJtb2RlbGxpbmdcIjpfMixcIm5hdmlnYXRpb25cIjpfMixcInBhcmFjaHV0aW5nXCI6XzIsXCJwYXJhZ2xpZGluZ1wiOl8yLFwicGFzc2VuZ2VyLWFzc29jaWF0aW9uXCI6XzIsXCJwaWxvdFwiOl8yLFwicHJlc3NcIjpfMixcInByb2R1Y3Rpb25cIjpfMixcInJlY3JlYXRpb25cIjpfMixcInJlcGJvZHlcIjpfMixcInJlc1wiOl8yLFwicmVzZWFyY2hcIjpfMixcInJvdG9yY3JhZnRcIjpfMixcInNhZmV0eVwiOl8yLFwic2NpZW50aXN0XCI6XzIsXCJzZXJ2aWNlc1wiOl8yLFwic2hvd1wiOl8yLFwic2t5ZGl2aW5nXCI6XzIsXCJzb2Z0d2FyZVwiOl8yLFwic3R1ZGVudFwiOl8yLFwidGF4aVwiOl8yLFwidHJhZGVyXCI6XzIsXCJ0cmFkaW5nXCI6XzIsXCJ0cmFpbmVyXCI6XzIsXCJ1bmlvblwiOl8yLFwid29ya2luZ2dyb3VwXCI6XzIsXCJ3b3Jrc1wiOl8yfV0sXCJhZlwiOl80LFwiYWdcIjpbMSx7XCJjb1wiOl8yLFwiY29tXCI6XzIsXCJuZXRcIjpfMixcIm5vbVwiOl8yLFwib3JnXCI6XzIsXCJvYmpcIjpfM31dLFwiYWlcIjpbMSx7XCJjb21cIjpfMixcIm5ldFwiOl8yLFwib2ZmXCI6XzIsXCJvcmdcIjpfMixcInV3dVwiOl8zLFwiZnJhbWVyXCI6XzN9XSxcImFsXCI6XzUsXCJhbVwiOlsxLHtcImNvXCI6XzIsXCJjb21cIjpfMixcImNvbW11bmVcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJyYWRpb1wiOl8zfV0sXCJhb1wiOlsxLHtcImNvXCI6XzIsXCJlZFwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImd2XCI6XzIsXCJpdFwiOl8yLFwib2dcIjpfMixcIm9yZ1wiOl8yLFwicGJcIjpfMn1dLFwiYXFcIjpfMixcImFyXCI6WzEse1wiYmV0XCI6XzIsXCJjb21cIjpfMixcImNvb3BcIjpfMixcImVkdVwiOl8yLFwiZ29iXCI6XzIsXCJnb3ZcIjpfMixcImludFwiOl8yLFwibWlsXCI6XzIsXCJtdXNpY2FcIjpfMixcIm11dHVhbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNlZ1wiOl8yLFwic2VuYXNhXCI6XzIsXCJ0dXJcIjpfMn1dLFwiYXJwYVwiOlsxLHtcImUxNjRcIjpfMixcImhvbWVcIjpfMixcImluLWFkZHJcIjpfMixcImlwNlwiOl8yLFwiaXJpc1wiOl8yLFwidXJpXCI6XzIsXCJ1cm5cIjpfMn1dLFwiYXNcIjpfMTAsXCJhc2lhXCI6WzEse1wiY2xvdWRuc1wiOl8zLFwiZGFlbW9uXCI6XzMsXCJkaXhcIjpfM31dLFwiYXRcIjpbMSx7XCI0XCI6XzMsXCJhY1wiOlsxLHtcInN0aFwiOl8yfV0sXCJjb1wiOl8yLFwiZ3ZcIjpfMixcIm9yXCI6XzIsXCJmdW5rZmV1ZXJcIjpbMCx7XCJ3aWVuXCI6XzN9XSxcImZ1dHVyZWNtc1wiOlswLHtcIipcIjpfMyxcImV4XCI6XzYsXCJpblwiOl82fV0sXCJmdXR1cmVob3N0aW5nXCI6XzMsXCJmdXR1cmVtYWlsaW5nXCI6XzMsXCJvcnRzaW5mb1wiOlswLHtcImV4XCI6XzYsXCJrdW5kZW5cIjpfNn1dLFwiYml6XCI6XzMsXCJpbmZvXCI6XzMsXCIxMjN3ZWJzZWl0ZVwiOl8zLFwicHJpdlwiOl8zLFwibXlcIjpfMyxcIm15c3ByZWFkc2hvcFwiOl8zLFwiMTJocFwiOl8zLFwiMml4XCI6XzMsXCI0bGltYVwiOl8zLFwibGltYS1jaXR5XCI6XzN9XSxcImF1XCI6WzEse1wiYXNuXCI6XzIsXCJjb21cIjpbMSx7XCJjbG91ZGxldHNcIjpbMCx7XCJtZWxcIjpfM31dLFwibXlzcHJlYWRzaG9wXCI6XzN9XSxcImVkdVwiOlsxLHtcImFjdFwiOl8yLFwiY2F0aG9saWNcIjpfMixcIm5zd1wiOl8yLFwibnRcIjpfMixcInFsZFwiOl8yLFwic2FcIjpfMixcInRhc1wiOl8yLFwidmljXCI6XzIsXCJ3YVwiOl8yfV0sXCJnb3ZcIjpbMSx7XCJxbGRcIjpfMixcInNhXCI6XzIsXCJ0YXNcIjpfMixcInZpY1wiOl8yLFwid2FcIjpfMn1dLFwiaWRcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJjb25mXCI6XzIsXCJvelwiOl8yLFwiYWN0XCI6XzIsXCJuc3dcIjpfMixcIm50XCI6XzIsXCJxbGRcIjpfMixcInNhXCI6XzIsXCJ0YXNcIjpfMixcInZpY1wiOl8yLFwid2FcIjpfMixcImhyc25cIjpfMTF9XSxcImF3XCI6WzEse1wiY29tXCI6XzJ9XSxcImF4XCI6XzIsXCJhelwiOlsxLHtcImJpelwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcImludFwiOl8yLFwibWlsXCI6XzIsXCJuYW1lXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicHBcIjpfMixcInByb1wiOl8yfV0sXCJiYVwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcImJyZW5kbHlcIjpfMTksXCJyc1wiOl8zfV0sXCJiYlwiOlsxLHtcImJpelwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJzdG9yZVwiOl8yLFwidHZcIjpfMn1dLFwiYmRcIjpfMjAsXCJiZVwiOlsxLHtcImFjXCI6XzIsXCJjbG91ZG5zXCI6XzMsXCJ3ZWJob3N0aW5nXCI6XzMsXCJpbnRlcmhvc3Rzb2x1dGlvbnNcIjpbMCx7XCJjbG91ZFwiOl8zfV0sXCJrdWxldXZlblwiOlswLHtcImV6cHJveHlcIjpfM31dLFwiMTIzd2Vic2l0ZVwiOl8zLFwibXlzcHJlYWRzaG9wXCI6XzMsXCJ0cmFuc3VybFwiOl82fV0sXCJiZlwiOl8xMCxcImJnXCI6WzEse1wiMFwiOl8yLFwiMVwiOl8yLFwiMlwiOl8yLFwiM1wiOl8yLFwiNFwiOl8yLFwiNVwiOl8yLFwiNlwiOl8yLFwiN1wiOl8yLFwiOFwiOl8yLFwiOVwiOl8yLFwiYVwiOl8yLFwiYlwiOl8yLFwiY1wiOl8yLFwiZFwiOl8yLFwiZVwiOl8yLFwiZlwiOl8yLFwiZ1wiOl8yLFwiaFwiOl8yLFwiaVwiOl8yLFwialwiOl8yLFwia1wiOl8yLFwibFwiOl8yLFwibVwiOl8yLFwiblwiOl8yLFwib1wiOl8yLFwicFwiOl8yLFwicVwiOl8yLFwiclwiOl8yLFwic1wiOl8yLFwidFwiOl8yLFwidVwiOl8yLFwidlwiOl8yLFwid1wiOl8yLFwieFwiOl8yLFwieVwiOl8yLFwielwiOl8yLFwiYmFyc3lcIjpfM31dLFwiYmhcIjpfNCxcImJpXCI6WzEse1wiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJvclwiOl8yLFwib3JnXCI6XzJ9XSxcImJpelwiOlsxLHtcImFjdGl2ZXRyYWlsXCI6XzMsXCJjbG91ZC1pcFwiOl8zLFwiY2xvdWRuc1wiOl8zLFwiam96aVwiOl8zLFwiZHluZG5zXCI6XzMsXCJmb3ItYmV0dGVyXCI6XzMsXCJmb3ItbW9yZVwiOl8zLFwiZm9yLXNvbWVcIjpfMyxcImZvci10aGVcIjpfMyxcInNlbGZpcFwiOl8zLFwid2ViaG9wXCI6XzMsXCJvcnhcIjpfMyxcIm1tYWZhblwiOl8zLFwibXlmdHBcIjpfMyxcIm5vLWlwXCI6XzMsXCJkc2Nsb3VkXCI6XzN9XSxcImJqXCI6WzEse1wiYWZyaWNhXCI6XzIsXCJhZ3JvXCI6XzIsXCJhcmNoaXRlY3Rlc1wiOl8yLFwiYXNzdXJcIjpfMixcImF2b2NhdHNcIjpfMixcImNvXCI6XzIsXCJjb21cIjpfMixcImVjb1wiOl8yLFwiZWNvbm9cIjpfMixcImVkdVwiOl8yLFwiaW5mb1wiOl8yLFwibG9pc2lyc1wiOl8yLFwibW9uZXlcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJvdGVcIjpfMixcInJlc3RhdXJhbnRcIjpfMixcInJlc3RvXCI6XzIsXCJ0b3VyaXNtXCI6XzIsXCJ1bml2XCI6XzJ9XSxcImJtXCI6XzQsXCJiblwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJjb1wiOl8zfV0sXCJib1wiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb2JcIjpfMixcImludFwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwidHZcIjpfMixcIndlYlwiOl8yLFwiYWNhZGVtaWFcIjpfMixcImFncm9cIjpfMixcImFydGVcIjpfMixcImJsb2dcIjpfMixcImJvbGl2aWFcIjpfMixcImNpZW5jaWFcIjpfMixcImNvb3BlcmF0aXZhXCI6XzIsXCJkZW1vY3JhY2lhXCI6XzIsXCJkZXBvcnRlXCI6XzIsXCJlY29sb2dpYVwiOl8yLFwiZWNvbm9taWFcIjpfMixcImVtcHJlc2FcIjpfMixcImluZGlnZW5hXCI6XzIsXCJpbmR1c3RyaWFcIjpfMixcImluZm9cIjpfMixcIm1lZGljaW5hXCI6XzIsXCJtb3ZpbWllbnRvXCI6XzIsXCJtdXNpY2FcIjpfMixcIm5hdHVyYWxcIjpfMixcIm5vbWJyZVwiOl8yLFwibm90aWNpYXNcIjpfMixcInBhdHJpYVwiOl8yLFwicGx1cmluYWNpb25hbFwiOl8yLFwicG9saXRpY2FcIjpfMixcInByb2Zlc2lvbmFsXCI6XzIsXCJwdWVibG9cIjpfMixcInJldmlzdGFcIjpfMixcInNhbHVkXCI6XzIsXCJ0ZWNub2xvZ2lhXCI6XzIsXCJ0a3NhdFwiOl8yLFwidHJhbnNwb3J0ZVwiOl8yLFwid2lraVwiOl8yfV0sXCJiclwiOlsxLHtcIjlndWFjdVwiOl8yLFwiYWJjXCI6XzIsXCJhZG1cIjpfMixcImFkdlwiOl8yLFwiYWdyXCI6XzIsXCJhanVcIjpfMixcImFtXCI6XzIsXCJhbmFuaVwiOl8yLFwiYXBhcmVjaWRhXCI6XzIsXCJhcGlcIjpfMixcImFwcFwiOl8yLFwiYXJxXCI6XzIsXCJhcnRcIjpfMixcImF0b1wiOl8yLFwiYlwiOl8yLFwiYmFydWVyaVwiOl8yLFwiYmVsZW1cIjpfMixcImJldFwiOl8yLFwiYmh6XCI6XzIsXCJiaWJcIjpfMixcImJpb1wiOl8yLFwiYmxvZ1wiOl8yLFwiYm1kXCI6XzIsXCJib2F2aXN0YVwiOl8yLFwiYnNiXCI6XzIsXCJjYW1waW5hZ3JhbmRlXCI6XzIsXCJjYW1waW5hc1wiOl8yLFwiY2F4aWFzXCI6XzIsXCJjaW1cIjpfMixcImNuZ1wiOl8yLFwiY250XCI6XzIsXCJjb21cIjpbMSx7XCJzaW1wbGVzaXRlXCI6XzN9XSxcImNvbnRhZ2VtXCI6XzIsXCJjb29wXCI6XzIsXCJjb3pcIjpfMixcImNyaVwiOl8yLFwiY3VpYWJhXCI6XzIsXCJjdXJpdGliYVwiOl8yLFwiZGVmXCI6XzIsXCJkZXNcIjpfMixcImRldFwiOl8yLFwiZGV2XCI6XzIsXCJlY25cIjpfMixcImVjb1wiOl8yLFwiZWR1XCI6XzIsXCJlbXBcIjpfMixcImVuZlwiOl8yLFwiZW5nXCI6XzIsXCJlc3BcIjpfMixcImV0Y1wiOl8yLFwiZXRpXCI6XzIsXCJmYXJcIjpfMixcImZlaXJhXCI6XzIsXCJmbG9nXCI6XzIsXCJmbG9yaXBhXCI6XzIsXCJmbVwiOl8yLFwiZm5kXCI6XzIsXCJmb3J0YWxcIjpfMixcImZvdFwiOl8yLFwiZm96XCI6XzIsXCJmc3RcIjpfMixcImcxMlwiOl8yLFwiZ2VvXCI6XzIsXCJnZ2ZcIjpfMixcImdvaWFuaWFcIjpfMixcImdvdlwiOlsxLHtcImFjXCI6XzIsXCJhbFwiOl8yLFwiYW1cIjpfMixcImFwXCI6XzIsXCJiYVwiOl8yLFwiY2VcIjpfMixcImRmXCI6XzIsXCJlc1wiOl8yLFwiZ29cIjpfMixcIm1hXCI6XzIsXCJtZ1wiOl8yLFwibXNcIjpfMixcIm10XCI6XzIsXCJwYVwiOl8yLFwicGJcIjpfMixcInBlXCI6XzIsXCJwaVwiOl8yLFwicHJcIjpfMixcInJqXCI6XzIsXCJyblwiOl8yLFwicm9cIjpfMixcInJyXCI6XzIsXCJyc1wiOl8yLFwic2NcIjpfMixcInNlXCI6XzIsXCJzcFwiOl8yLFwidG9cIjpfMn1dLFwiZ3J1XCI6XzIsXCJpYVwiOl8yLFwiaW1iXCI6XzIsXCJpbmRcIjpfMixcImluZlwiOl8yLFwiamFiXCI6XzIsXCJqYW1wYVwiOl8yLFwiamRmXCI6XzIsXCJqb2ludmlsbGVcIjpfMixcImpvclwiOl8yLFwianVzXCI6XzIsXCJsZWdcIjpbMSx7XCJhY1wiOl8zLFwiYWxcIjpfMyxcImFtXCI6XzMsXCJhcFwiOl8zLFwiYmFcIjpfMyxcImNlXCI6XzMsXCJkZlwiOl8zLFwiZXNcIjpfMyxcImdvXCI6XzMsXCJtYVwiOl8zLFwibWdcIjpfMyxcIm1zXCI6XzMsXCJtdFwiOl8zLFwicGFcIjpfMyxcInBiXCI6XzMsXCJwZVwiOl8zLFwicGlcIjpfMyxcInByXCI6XzMsXCJyalwiOl8zLFwicm5cIjpfMyxcInJvXCI6XzMsXCJyclwiOl8zLFwicnNcIjpfMyxcInNjXCI6XzMsXCJzZVwiOl8zLFwic3BcIjpfMyxcInRvXCI6XzN9XSxcImxlaWxhb1wiOl8yLFwibGVsXCI6XzIsXCJsb2dcIjpfMixcImxvbmRyaW5hXCI6XzIsXCJtYWNhcGFcIjpfMixcIm1hY2Vpb1wiOl8yLFwibWFuYXVzXCI6XzIsXCJtYXJpbmdhXCI6XzIsXCJtYXRcIjpfMixcIm1lZFwiOl8yLFwibWlsXCI6XzIsXCJtb3JlbmFcIjpfMixcIm1wXCI6XzIsXCJtdXNcIjpfMixcIm5hdGFsXCI6XzIsXCJuZXRcIjpfMixcIm5pdGVyb2lcIjpfMixcIm5vbVwiOl8yMCxcIm5vdFwiOl8yLFwibnRyXCI6XzIsXCJvZG9cIjpfMixcIm9uZ1wiOl8yLFwib3JnXCI6XzIsXCJvc2FzY29cIjpfMixcInBhbG1hc1wiOl8yLFwicG9hXCI6XzIsXCJwcGdcIjpfMixcInByb1wiOl8yLFwicHNjXCI6XzIsXCJwc2lcIjpfMixcInB2aFwiOl8yLFwicXNsXCI6XzIsXCJyYWRpb1wiOl8yLFwicmVjXCI6XzIsXCJyZWNpZmVcIjpfMixcInJlcFwiOl8yLFwicmliZWlyYW9cIjpfMixcInJpb1wiOl8yLFwicmlvYnJhbmNvXCI6XzIsXCJyaW9wcmV0b1wiOl8yLFwic2FsdmFkb3JcIjpfMixcInNhbXBhXCI6XzIsXCJzYW50YW1hcmlhXCI6XzIsXCJzYW50b2FuZHJlXCI6XzIsXCJzYW9iZXJuYXJkb1wiOl8yLFwic2FvZ29uY2FcIjpfMixcInNlZ1wiOl8yLFwic2pjXCI6XzIsXCJzbGdcIjpfMixcInNselwiOl8yLFwic29jaWFsXCI6XzIsXCJzb3JvY2FiYVwiOl8yLFwic3J2XCI6XzIsXCJ0YXhpXCI6XzIsXCJ0Y1wiOl8yLFwidGVjXCI6XzIsXCJ0ZW9cIjpfMixcInRoZVwiOl8yLFwidG1wXCI6XzIsXCJ0cmRcIjpfMixcInR1clwiOl8yLFwidHZcIjpfMixcInVkaVwiOl8yLFwidmV0XCI6XzIsXCJ2aXhcIjpfMixcInZsb2dcIjpfMixcIndpa2lcIjpfMixcInh5elwiOl8yLFwiemxnXCI6XzIsXCJ0Y2hlXCI6XzN9XSxcImJzXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcIndlXCI6XzN9XSxcImJ0XCI6XzQsXCJidlwiOl8yLFwiYndcIjpbMSx7XCJhY1wiOl8yLFwiY29cIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwiYnlcIjpbMSx7XCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwiY29tXCI6XzIsXCJvZlwiOl8yLFwibWVkaWF0ZWNoXCI6XzN9XSxcImJ6XCI6WzEse1wiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJ6YVwiOl8zLFwibXlkbnNcIjpfMyxcImdzalwiOl8zfV0sXCJjYVwiOlsxLHtcImFiXCI6XzIsXCJiY1wiOl8yLFwibWJcIjpfMixcIm5iXCI6XzIsXCJuZlwiOl8yLFwibmxcIjpfMixcIm5zXCI6XzIsXCJudFwiOl8yLFwibnVcIjpfMixcIm9uXCI6XzIsXCJwZVwiOl8yLFwicWNcIjpfMixcInNrXCI6XzIsXCJ5a1wiOl8yLFwiZ2NcIjpfMixcImJhcnN5XCI6XzMsXCJhd2RldlwiOl82LFwiY29cIjpfMyxcIm5vLWlwXCI6XzMsXCJvbmlkXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcImJveFwiOl8zfV0sXCJjYXRcIjpfMixcImNjXCI6WzEse1wiY2xldmVyYXBwc1wiOl8zLFwiY2xvdWQtaXBcIjpfMyxcImNsb3VkbnNcIjpfMyxcImZ0cGFjY2Vzc1wiOl8zLFwiZ2FtZS1zZXJ2ZXJcIjpfMyxcIm15cGhvdG9zXCI6XzMsXCJzY3JhcHBpbmdcIjpfMyxcInR3bWFpbFwiOl8zLFwiY3N4XCI6XzMsXCJmYW50YXN5bGVhZ3VlXCI6XzMsXCJzcGF3blwiOlswLHtcImluc3RhbmNlc1wiOl8zfV19XSxcImNkXCI6XzEwLFwiY2ZcIjpfMixcImNnXCI6XzIsXCJjaFwiOlsxLHtcInNxdWFyZTdcIjpfMyxcImNsb3VkbnNcIjpfMyxcImNsb3Vkc2NhbGVcIjpbMCx7XCJjdXN0XCI6XzMsXCJscGdcIjpfMjIsXCJybWFcIjpfMjJ9XSxcIm9iamVjdHN0b3JhZ2VcIjpbMCx7XCJscGdcIjpfMyxcInJtYVwiOl8zfV0sXCJmbG93XCI6WzAse1wiYWVcIjpbMCx7XCJhbHAxXCI6XzN9XSxcImFwcGVuZ2luZVwiOl8zfV0sXCJsaW5reWFyZC1jbG91ZFwiOl8zLFwiZ290ZG5zXCI6XzMsXCJkbnNraW5nXCI6XzMsXCIxMjN3ZWJzaXRlXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcImZpcmVuZXRcIjpbMCx7XCIqXCI6XzMsXCJzdmNcIjpfNn1dLFwiMTJocFwiOl8zLFwiMml4XCI6XzMsXCI0bGltYVwiOl8zLFwibGltYS1jaXR5XCI6XzN9XSxcImNpXCI6WzEse1wiYWNcIjpfMixcInhuLS1hcm9wb3J0LWJ5YVwiOl8yLFwiYVx1MDBFOXJvcG9ydFwiOl8yLFwiYXNzb1wiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZWRcIjpfMixcImVkdVwiOl8yLFwiZ29cIjpfMixcImdvdXZcIjpfMixcImludFwiOl8yLFwibmV0XCI6XzIsXCJvclwiOl8yLFwib3JnXCI6XzJ9XSxcImNrXCI6XzIwLFwiY2xcIjpbMSx7XCJjb1wiOl8yLFwiZ29iXCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwiY2xvdWRuc1wiOl8zfV0sXCJjbVwiOlsxLHtcImNvXCI6XzIsXCJjb21cIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzJ9XSxcImNuXCI6WzEse1wiYWNcIjpfMixcImNvbVwiOlsxLHtcImFtYXpvbmF3c1wiOlswLHtcImNuLW5vcnRoLTFcIjpbMCx7XCJleGVjdXRlLWFwaVwiOl8zLFwiZW1yYXBwdWktcHJvZFwiOl8zLFwiZW1ybm90ZWJvb2tzLXByb2RcIjpfMyxcImVtcnN0dWRpby1wcm9kXCI6XzMsXCJkdWFsc3RhY2tcIjpfMjUsXCJzM1wiOl8zLFwiczMtYWNjZXNzcG9pbnRcIjpfMyxcInMzLWRlcHJlY2F0ZWRcIjpfMyxcInMzLW9iamVjdC1sYW1iZGFcIjpfMyxcInMzLXdlYnNpdGVcIjpfM31dLFwiY24tbm9ydGh3ZXN0LTFcIjpbMCx7XCJleGVjdXRlLWFwaVwiOl8zLFwiZW1yYXBwdWktcHJvZFwiOl8zLFwiZW1ybm90ZWJvb2tzLXByb2RcIjpfMyxcImVtcnN0dWRpby1wcm9kXCI6XzMsXCJkdWFsc3RhY2tcIjpfMjYsXCJzM1wiOl8zLFwiczMtYWNjZXNzcG9pbnRcIjpfMyxcInMzLW9iamVjdC1sYW1iZGFcIjpfMyxcInMzLXdlYnNpdGVcIjpfM31dLFwiY29tcHV0ZVwiOl82LFwiYWlyZmxvd1wiOlswLHtcImNuLW5vcnRoLTFcIjpfNixcImNuLW5vcnRod2VzdC0xXCI6XzZ9XSxcImViXCI6WzAse1wiY24tbm9ydGgtMVwiOl8zLFwiY24tbm9ydGh3ZXN0LTFcIjpfM31dLFwiZWxiXCI6XzZ9XSxcImFtYXpvbndlYnNlcnZpY2VzXCI6WzAse1wib25cIjpbMCx7XCJjbi1ub3J0aC0xXCI6XzEyLFwiY24tbm9ydGh3ZXN0LTFcIjpfMTJ9XX1dLFwic2FnZW1ha2VyXCI6WzAse1wiY24tbm9ydGgtMVwiOl8xNCxcImNuLW5vcnRod2VzdC0xXCI6XzE0fV19XSxcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJ4bi0tNTVxeDVkXCI6XzIsXCJcdTUxNkNcdTUzRjhcIjpfMixcInhuLS1vZDBhbGdcIjpfMixcIlx1N0RCMlx1N0Q2MVwiOl8yLFwieG4tLWlvMGE3aVwiOl8yLFwiXHU3RjUxXHU3RURDXCI6XzIsXCJhaFwiOl8yLFwiYmpcIjpfMixcImNxXCI6XzIsXCJmalwiOl8yLFwiZ2RcIjpfMixcImdzXCI6XzIsXCJneFwiOl8yLFwiZ3pcIjpfMixcImhhXCI6XzIsXCJoYlwiOl8yLFwiaGVcIjpfMixcImhpXCI6XzIsXCJoa1wiOl8yLFwiaGxcIjpfMixcImhuXCI6XzIsXCJqbFwiOl8yLFwianNcIjpfMixcImp4XCI6XzIsXCJsblwiOl8yLFwibW9cIjpfMixcIm5tXCI6XzIsXCJueFwiOl8yLFwicWhcIjpfMixcInNjXCI6XzIsXCJzZFwiOl8yLFwic2hcIjpbMSx7XCJhc1wiOl8zfV0sXCJzblwiOl8yLFwic3hcIjpfMixcInRqXCI6XzIsXCJ0d1wiOl8yLFwieGpcIjpfMixcInh6XCI6XzIsXCJ5blwiOl8yLFwiempcIjpfMixcImNhbnZhLWFwcHNcIjpfMyxcImNhbnZhc2l0ZVwiOl8yNCxcIm15cW5hcGNsb3VkXCI6XzMsXCJxdWlja2Nvbm5lY3RcIjpfMjd9XSxcImNvXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm5vbVwiOl8yLFwib3JnXCI6XzIsXCJjYXJyZFwiOl8zLFwiY3JkXCI6XzMsXCJvdGFwXCI6XzYsXCJoaWRuc1wiOl8zLFwibGVhZHBhZ2VzXCI6XzMsXCJscGFnZXNcIjpfMyxcIm15cGlcIjpfMyxcInhtaXRcIjpfNixcImZpcmV3YWxsZWRyZXBsaXRcIjpfOSxcInJlcGxcIjpfOSxcInN1cGFiYXNlXCI6WzIse1wicmVhbHRpbWVcIjpfMyxcInN0b3JhZ2VcIjpfM31dfV0sXCJjb21cIjpbMSx7XCJhMmhvc3RlZFwiOl8zLFwiY3BzZXJ2ZXJcIjpfMyxcImFkb2JlYWVtY2xvdWRcIjpbMix7XCJkZXZcIjpfNn1dLFwiYWZyaWNhXCI6XzMsXCJhaXZlbmNsb3VkXCI6XzMsXCJhbGliYWJhY2xvdWRjc1wiOl8zLFwia2Fzc2VydmVyXCI6XzMsXCJhbWF6b25hd3NcIjpbMCx7XCJhZi1zb3V0aC0xXCI6XzMwLFwiYXAtZWFzdC0xXCI6XzMxLFwiYXAtbm9ydGhlYXN0LTFcIjpfMzIsXCJhcC1ub3J0aGVhc3QtMlwiOl8zMixcImFwLW5vcnRoZWFzdC0zXCI6XzMwLFwiYXAtc291dGgtMVwiOl8zMixcImFwLXNvdXRoLTJcIjpfMzMsXCJhcC1zb3V0aGVhc3QtMVwiOl8zMixcImFwLXNvdXRoZWFzdC0yXCI6XzMyLFwiYXAtc291dGhlYXN0LTNcIjpfMzMsXCJhcC1zb3V0aGVhc3QtNFwiOl8zMyxcImFwLXNvdXRoZWFzdC01XCI6WzAse1wiZXhlY3V0ZS1hcGlcIjpfMyxcImR1YWxzdGFja1wiOl8yNSxcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtZGVwcmVjYXRlZFwiOl8zLFwiczMtb2JqZWN0LWxhbWJkYVwiOl8zLFwiczMtd2Vic2l0ZVwiOl8zfV0sXCJjYS1jZW50cmFsLTFcIjpfMzUsXCJjYS13ZXN0LTFcIjpbMCx7XCJleGVjdXRlLWFwaVwiOl8zLFwiZW1yYXBwdWktcHJvZFwiOl8zLFwiZW1ybm90ZWJvb2tzLXByb2RcIjpfMyxcImVtcnN0dWRpby1wcm9kXCI6XzMsXCJkdWFsc3RhY2tcIjpfMzQsXCJzM1wiOl8zLFwiczMtYWNjZXNzcG9pbnRcIjpfMyxcInMzLWFjY2Vzc3BvaW50LWZpcHNcIjpfMyxcInMzLWZpcHNcIjpfMyxcInMzLW9iamVjdC1sYW1iZGFcIjpfMyxcInMzLXdlYnNpdGVcIjpfM31dLFwiZXUtY2VudHJhbC0xXCI6XzMyLFwiZXUtY2VudHJhbC0yXCI6XzMzLFwiZXUtbm9ydGgtMVwiOl8zMSxcImV1LXNvdXRoLTFcIjpfMzAsXCJldS1zb3V0aC0yXCI6XzMzLFwiZXUtd2VzdC0xXCI6WzAse1wiZXhlY3V0ZS1hcGlcIjpfMyxcImVtcmFwcHVpLXByb2RcIjpfMyxcImVtcm5vdGVib29rcy1wcm9kXCI6XzMsXCJlbXJzdHVkaW8tcHJvZFwiOl8zLFwiZHVhbHN0YWNrXCI6XzI1LFwiczNcIjpfMyxcInMzLWFjY2Vzc3BvaW50XCI6XzMsXCJzMy1kZXByZWNhdGVkXCI6XzMsXCJzMy1vYmplY3QtbGFtYmRhXCI6XzMsXCJzMy13ZWJzaXRlXCI6XzMsXCJhbmFseXRpY3MtZ2F0ZXdheVwiOl8zLFwiYXdzLWNsb3VkOVwiOl8yOCxcImNsb3VkOVwiOl8yOX1dLFwiZXUtd2VzdC0yXCI6XzMxLFwiZXUtd2VzdC0zXCI6XzMwLFwiaWwtY2VudHJhbC0xXCI6WzAse1wiZXhlY3V0ZS1hcGlcIjpfMyxcImVtcmFwcHVpLXByb2RcIjpfMyxcImVtcm5vdGVib29rcy1wcm9kXCI6XzMsXCJlbXJzdHVkaW8tcHJvZFwiOl8zLFwiZHVhbHN0YWNrXCI6XzI1LFwiczNcIjpfMyxcInMzLWFjY2Vzc3BvaW50XCI6XzMsXCJzMy1vYmplY3QtbGFtYmRhXCI6XzMsXCJzMy13ZWJzaXRlXCI6XzMsXCJhd3MtY2xvdWQ5XCI6XzI4LFwiY2xvdWQ5XCI6WzAse1widmZzXCI6XzN9XX1dLFwibWUtY2VudHJhbC0xXCI6XzMzLFwibWUtc291dGgtMVwiOl8zMSxcInNhLWVhc3QtMVwiOl8zMCxcInVzLWVhc3QtMVwiOlsyLHtcImV4ZWN1dGUtYXBpXCI6XzMsXCJlbXJhcHB1aS1wcm9kXCI6XzMsXCJlbXJub3RlYm9va3MtcHJvZFwiOl8zLFwiZW1yc3R1ZGlvLXByb2RcIjpfMyxcImR1YWxzdGFja1wiOl8zNCxcInMzXCI6XzMsXCJzMy1hY2Nlc3Nwb2ludFwiOl8zLFwiczMtYWNjZXNzcG9pbnQtZmlwc1wiOl8zLFwiczMtZGVwcmVjYXRlZFwiOl8zLFwiczMtZmlwc1wiOl8zLFwiczMtb2JqZWN0LWxhbWJkYVwiOl8zLFwiczMtd2Vic2l0ZVwiOl8zLFwiYW5hbHl0aWNzLWdhdGV3YXlcIjpfMyxcImF3cy1jbG91ZDlcIjpfMjgsXCJjbG91ZDlcIjpfMjl9XSxcInVzLWVhc3QtMlwiOl8zNixcInVzLWdvdi1lYXN0LTFcIjpfMzgsXCJ1cy1nb3Ytd2VzdC0xXCI6XzM4LFwidXMtd2VzdC0xXCI6XzM1LFwidXMtd2VzdC0yXCI6XzM2LFwiY29tcHV0ZVwiOl82LFwiY29tcHV0ZS0xXCI6XzYsXCJhaXJmbG93XCI6WzAse1wiYWYtc291dGgtMVwiOl82LFwiYXAtZWFzdC0xXCI6XzYsXCJhcC1ub3J0aGVhc3QtMVwiOl82LFwiYXAtbm9ydGhlYXN0LTJcIjpfNixcImFwLW5vcnRoZWFzdC0zXCI6XzYsXCJhcC1zb3V0aC0xXCI6XzYsXCJhcC1zb3V0aC0yXCI6XzYsXCJhcC1zb3V0aGVhc3QtMVwiOl82LFwiYXAtc291dGhlYXN0LTJcIjpfNixcImFwLXNvdXRoZWFzdC0zXCI6XzYsXCJhcC1zb3V0aGVhc3QtNFwiOl82LFwiYXAtc291dGhlYXN0LTVcIjpfNixcImNhLWNlbnRyYWwtMVwiOl82LFwiY2Etd2VzdC0xXCI6XzYsXCJldS1jZW50cmFsLTFcIjpfNixcImV1LWNlbnRyYWwtMlwiOl82LFwiZXUtbm9ydGgtMVwiOl82LFwiZXUtc291dGgtMVwiOl82LFwiZXUtc291dGgtMlwiOl82LFwiZXUtd2VzdC0xXCI6XzYsXCJldS13ZXN0LTJcIjpfNixcImV1LXdlc3QtM1wiOl82LFwiaWwtY2VudHJhbC0xXCI6XzYsXCJtZS1jZW50cmFsLTFcIjpfNixcIm1lLXNvdXRoLTFcIjpfNixcInNhLWVhc3QtMVwiOl82LFwidXMtZWFzdC0xXCI6XzYsXCJ1cy1lYXN0LTJcIjpfNixcInVzLXdlc3QtMVwiOl82LFwidXMtd2VzdC0yXCI6XzZ9XSxcInMzXCI6XzMsXCJzMy0xXCI6XzMsXCJzMy1hcC1lYXN0LTFcIjpfMyxcInMzLWFwLW5vcnRoZWFzdC0xXCI6XzMsXCJzMy1hcC1ub3J0aGVhc3QtMlwiOl8zLFwiczMtYXAtbm9ydGhlYXN0LTNcIjpfMyxcInMzLWFwLXNvdXRoLTFcIjpfMyxcInMzLWFwLXNvdXRoZWFzdC0xXCI6XzMsXCJzMy1hcC1zb3V0aGVhc3QtMlwiOl8zLFwiczMtY2EtY2VudHJhbC0xXCI6XzMsXCJzMy1ldS1jZW50cmFsLTFcIjpfMyxcInMzLWV1LW5vcnRoLTFcIjpfMyxcInMzLWV1LXdlc3QtMVwiOl8zLFwiczMtZXUtd2VzdC0yXCI6XzMsXCJzMy1ldS13ZXN0LTNcIjpfMyxcInMzLWV4dGVybmFsLTFcIjpfMyxcInMzLWZpcHMtdXMtZ292LWVhc3QtMVwiOl8zLFwiczMtZmlwcy11cy1nb3Ytd2VzdC0xXCI6XzMsXCJzMy1nbG9iYWxcIjpbMCx7XCJhY2Nlc3Nwb2ludFwiOlswLHtcIm1yYXBcIjpfM31dfV0sXCJzMy1tZS1zb3V0aC0xXCI6XzMsXCJzMy1zYS1lYXN0LTFcIjpfMyxcInMzLXVzLWVhc3QtMlwiOl8zLFwiczMtdXMtZ292LWVhc3QtMVwiOl8zLFwiczMtdXMtZ292LXdlc3QtMVwiOl8zLFwiczMtdXMtd2VzdC0xXCI6XzMsXCJzMy11cy13ZXN0LTJcIjpfMyxcInMzLXdlYnNpdGUtYXAtbm9ydGhlYXN0LTFcIjpfMyxcInMzLXdlYnNpdGUtYXAtc291dGhlYXN0LTFcIjpfMyxcInMzLXdlYnNpdGUtYXAtc291dGhlYXN0LTJcIjpfMyxcInMzLXdlYnNpdGUtZXUtd2VzdC0xXCI6XzMsXCJzMy13ZWJzaXRlLXNhLWVhc3QtMVwiOl8zLFwiczMtd2Vic2l0ZS11cy1lYXN0LTFcIjpfMyxcInMzLXdlYnNpdGUtdXMtZ292LXdlc3QtMVwiOl8zLFwiczMtd2Vic2l0ZS11cy13ZXN0LTFcIjpfMyxcInMzLXdlYnNpdGUtdXMtd2VzdC0yXCI6XzMsXCJlbGJcIjpfNn1dLFwiYW1hem9uY29nbml0b1wiOlswLHtcImFmLXNvdXRoLTFcIjpfMzksXCJhcC1lYXN0LTFcIjpfMzksXCJhcC1ub3J0aGVhc3QtMVwiOl8zOSxcImFwLW5vcnRoZWFzdC0yXCI6XzM5LFwiYXAtbm9ydGhlYXN0LTNcIjpfMzksXCJhcC1zb3V0aC0xXCI6XzM5LFwiYXAtc291dGgtMlwiOl8zOSxcImFwLXNvdXRoZWFzdC0xXCI6XzM5LFwiYXAtc291dGhlYXN0LTJcIjpfMzksXCJhcC1zb3V0aGVhc3QtM1wiOl8zOSxcImFwLXNvdXRoZWFzdC00XCI6XzM5LFwiYXAtc291dGhlYXN0LTVcIjpfMzksXCJhcC1zb3V0aGVhc3QtN1wiOl8zOSxcImNhLWNlbnRyYWwtMVwiOl8zOSxcImNhLXdlc3QtMVwiOl8zOSxcImV1LWNlbnRyYWwtMVwiOl8zOSxcImV1LWNlbnRyYWwtMlwiOl8zOSxcImV1LW5vcnRoLTFcIjpfMzksXCJldS1zb3V0aC0xXCI6XzM5LFwiZXUtc291dGgtMlwiOl8zOSxcImV1LXdlc3QtMVwiOl8zOSxcImV1LXdlc3QtMlwiOl8zOSxcImV1LXdlc3QtM1wiOl8zOSxcImlsLWNlbnRyYWwtMVwiOl8zOSxcIm1lLWNlbnRyYWwtMVwiOl8zOSxcIm1lLXNvdXRoLTFcIjpfMzksXCJteC1jZW50cmFsLTFcIjpfMzksXCJzYS1lYXN0LTFcIjpfMzksXCJ1cy1lYXN0LTFcIjpfNDAsXCJ1cy1lYXN0LTJcIjpfNDAsXCJ1cy1nb3YtZWFzdC0xXCI6XzQxLFwidXMtZ292LXdlc3QtMVwiOl80MSxcInVzLXdlc3QtMVwiOl80MCxcInVzLXdlc3QtMlwiOl80MH1dLFwiYW1wbGlmeWFwcFwiOl8zLFwiYXdzYXBwcnVubmVyXCI6XzYsXCJhd3NhcHBzXCI6XzMsXCJlbGFzdGljYmVhbnN0YWxrXCI6WzIse1wiYWYtc291dGgtMVwiOl8zLFwiYXAtZWFzdC0xXCI6XzMsXCJhcC1ub3J0aGVhc3QtMVwiOl8zLFwiYXAtbm9ydGhlYXN0LTJcIjpfMyxcImFwLW5vcnRoZWFzdC0zXCI6XzMsXCJhcC1zb3V0aC0xXCI6XzMsXCJhcC1zb3V0aGVhc3QtMVwiOl8zLFwiYXAtc291dGhlYXN0LTJcIjpfMyxcImFwLXNvdXRoZWFzdC0zXCI6XzMsXCJjYS1jZW50cmFsLTFcIjpfMyxcImV1LWNlbnRyYWwtMVwiOl8zLFwiZXUtbm9ydGgtMVwiOl8zLFwiZXUtc291dGgtMVwiOl8zLFwiZXUtd2VzdC0xXCI6XzMsXCJldS13ZXN0LTJcIjpfMyxcImV1LXdlc3QtM1wiOl8zLFwiaWwtY2VudHJhbC0xXCI6XzMsXCJtZS1zb3V0aC0xXCI6XzMsXCJzYS1lYXN0LTFcIjpfMyxcInVzLWVhc3QtMVwiOl8zLFwidXMtZWFzdC0yXCI6XzMsXCJ1cy1nb3YtZWFzdC0xXCI6XzMsXCJ1cy1nb3Ytd2VzdC0xXCI6XzMsXCJ1cy13ZXN0LTFcIjpfMyxcInVzLXdlc3QtMlwiOl8zfV0sXCJhd3NnbG9iYWxhY2NlbGVyYXRvclwiOl8zLFwic2lpaXRlc1wiOl8zLFwiYXBwc3BhY2Vob3N0ZWRcIjpfMyxcImFwcHNwYWNldXNlcmNvbnRlbnRcIjpfMyxcIm9uLWFwdGlibGVcIjpfMyxcIm15YXN1c3RvclwiOl8zLFwiYmFsZW5hLWRldmljZXNcIjpfMyxcImJvdXRpclwiOl8zLFwiYnBsYWNlZFwiOl8zLFwiY2FmanNcIjpfMyxcImNhbnZhLWFwcHNcIjpfMyxcInJpY2UtbGFic1wiOl8zLFwiY2RuNzctc3RvcmFnZVwiOl8zLFwiYnJcIjpfMyxcImNuXCI6XzMsXCJkZVwiOl8zLFwiZXVcIjpfMyxcImpwblwiOl8zLFwibWV4XCI6XzMsXCJydVwiOl8zLFwic2FcIjpfMyxcInVrXCI6XzMsXCJ1c1wiOl8zLFwiemFcIjpfMyxcImNsZXZlci1jbG91ZFwiOlswLHtcInNlcnZpY2VzXCI6XzZ9XSxcImFicmRuc1wiOl8zLFwiZG5zYWJyXCI6XzMsXCJpcC1kZG5zXCI6XzMsXCJqZGV2Y2xvdWRcIjpfMyxcIndwZGV2Y2xvdWRcIjpfMyxcImNmLWlwZnNcIjpfMyxcImNsb3VkZmxhcmUtaXBmc1wiOl8zLFwidHJ5Y2xvdWRmbGFyZVwiOl8zLFwiY29cIjpfMyxcImRldmluYXBwc1wiOl82LFwiYnVpbHR3aXRoZGFya1wiOl8zLFwiZGF0YWRldGVjdFwiOlswLHtcImRlbW9cIjpfMyxcImluc3RhbmNlXCI6XzN9XSxcImRhdHRvbG9jYWxcIjpfMyxcImRhdHRvcmVsYXlcIjpfMyxcImRhdHRvd2ViXCI6XzMsXCJteWRhdHRvXCI6XzMsXCJkaWdpdGFsb2NlYW5zcGFjZXNcIjpfNixcImRpc2NvcmRzYXlzXCI6XzMsXCJkaXNjb3Jkc2V6XCI6XzMsXCJkcmF5ZGRuc1wiOl8zLFwiZHJlYW1ob3N0ZXJzXCI6XzMsXCJkdXJ1bWlzXCI6XzMsXCJibG9nZG5zXCI6XzMsXCJjZWNoaXJlXCI6XzMsXCJkbnNhbGlhc1wiOl8zLFwiZG5zZG9qb1wiOl8zLFwiZG9lc250ZXhpc3RcIjpfMyxcImRvbnRleGlzdFwiOl8zLFwiZG9vbWRuc1wiOl8zLFwiZHluLW8tc2F1clwiOl8zLFwiZHluYWxpYXNcIjpfMyxcImR5bmRucy1hdC1ob21lXCI6XzMsXCJkeW5kbnMtYXQtd29ya1wiOl8zLFwiZHluZG5zLWJsb2dcIjpfMyxcImR5bmRucy1mcmVlXCI6XzMsXCJkeW5kbnMtaG9tZVwiOl8zLFwiZHluZG5zLWlwXCI6XzMsXCJkeW5kbnMtbWFpbFwiOl8zLFwiZHluZG5zLW9mZmljZVwiOl8zLFwiZHluZG5zLXBpY3NcIjpfMyxcImR5bmRucy1yZW1vdGVcIjpfMyxcImR5bmRucy1zZXJ2ZXJcIjpfMyxcImR5bmRucy13ZWJcIjpfMyxcImR5bmRucy13aWtpXCI6XzMsXCJkeW5kbnMtd29ya1wiOl8zLFwiZXN0LWEtbGEtbWFpc29uXCI6XzMsXCJlc3QtYS1sYS1tYXNpb25cIjpfMyxcImVzdC1sZS1wYXRyb25cIjpfMyxcImVzdC1tb24tYmxvZ3VldXJcIjpfMyxcImZyb20tYWtcIjpfMyxcImZyb20tYWxcIjpfMyxcImZyb20tYXJcIjpfMyxcImZyb20tY2FcIjpfMyxcImZyb20tY3RcIjpfMyxcImZyb20tZGNcIjpfMyxcImZyb20tZGVcIjpfMyxcImZyb20tZmxcIjpfMyxcImZyb20tZ2FcIjpfMyxcImZyb20taGlcIjpfMyxcImZyb20taWFcIjpfMyxcImZyb20taWRcIjpfMyxcImZyb20taWxcIjpfMyxcImZyb20taW5cIjpfMyxcImZyb20ta3NcIjpfMyxcImZyb20ta3lcIjpfMyxcImZyb20tbWFcIjpfMyxcImZyb20tbWRcIjpfMyxcImZyb20tbWlcIjpfMyxcImZyb20tbW5cIjpfMyxcImZyb20tbW9cIjpfMyxcImZyb20tbXNcIjpfMyxcImZyb20tbXRcIjpfMyxcImZyb20tbmNcIjpfMyxcImZyb20tbmRcIjpfMyxcImZyb20tbmVcIjpfMyxcImZyb20tbmhcIjpfMyxcImZyb20tbmpcIjpfMyxcImZyb20tbm1cIjpfMyxcImZyb20tbnZcIjpfMyxcImZyb20tb2hcIjpfMyxcImZyb20tb2tcIjpfMyxcImZyb20tb3JcIjpfMyxcImZyb20tcGFcIjpfMyxcImZyb20tcHJcIjpfMyxcImZyb20tcmlcIjpfMyxcImZyb20tc2NcIjpfMyxcImZyb20tc2RcIjpfMyxcImZyb20tdG5cIjpfMyxcImZyb20tdHhcIjpfMyxcImZyb20tdXRcIjpfMyxcImZyb20tdmFcIjpfMyxcImZyb20tdnRcIjpfMyxcImZyb20td2FcIjpfMyxcImZyb20td2lcIjpfMyxcImZyb20td3ZcIjpfMyxcImZyb20td3lcIjpfMyxcImdldG15aXBcIjpfMyxcImdvdGRuc1wiOl8zLFwiaG9iYnktc2l0ZVwiOl8zLFwiaG9tZWxpbnV4XCI6XzMsXCJob21ldW5peFwiOl8zLFwiaWFtYWxsYW1hXCI6XzMsXCJpcy1hLWFuYXJjaGlzdFwiOl8zLFwiaXMtYS1ibG9nZ2VyXCI6XzMsXCJpcy1hLWJvb2trZWVwZXJcIjpfMyxcImlzLWEtYnVsbHMtZmFuXCI6XzMsXCJpcy1hLWNhdGVyZXJcIjpfMyxcImlzLWEtY2hlZlwiOl8zLFwiaXMtYS1jb25zZXJ2YXRpdmVcIjpfMyxcImlzLWEtY3BhXCI6XzMsXCJpcy1hLWN1YmljbGUtc2xhdmVcIjpfMyxcImlzLWEtZGVtb2NyYXRcIjpfMyxcImlzLWEtZGVzaWduZXJcIjpfMyxcImlzLWEtZG9jdG9yXCI6XzMsXCJpcy1hLWZpbmFuY2lhbGFkdmlzb3JcIjpfMyxcImlzLWEtZ2Vla1wiOl8zLFwiaXMtYS1ncmVlblwiOl8zLFwiaXMtYS1ndXJ1XCI6XzMsXCJpcy1hLWhhcmQtd29ya2VyXCI6XzMsXCJpcy1hLWh1bnRlclwiOl8zLFwiaXMtYS1sYW5kc2NhcGVyXCI6XzMsXCJpcy1hLWxhd3llclwiOl8zLFwiaXMtYS1saWJlcmFsXCI6XzMsXCJpcy1hLWxpYmVydGFyaWFuXCI6XzMsXCJpcy1hLWxsYW1hXCI6XzMsXCJpcy1hLW11c2ljaWFuXCI6XzMsXCJpcy1hLW5hc2NhcmZhblwiOl8zLFwiaXMtYS1udXJzZVwiOl8zLFwiaXMtYS1wYWludGVyXCI6XzMsXCJpcy1hLXBlcnNvbmFsdHJhaW5lclwiOl8zLFwiaXMtYS1waG90b2dyYXBoZXJcIjpfMyxcImlzLWEtcGxheWVyXCI6XzMsXCJpcy1hLXJlcHVibGljYW5cIjpfMyxcImlzLWEtcm9ja3N0YXJcIjpfMyxcImlzLWEtc29jaWFsaXN0XCI6XzMsXCJpcy1hLXN0dWRlbnRcIjpfMyxcImlzLWEtdGVhY2hlclwiOl8zLFwiaXMtYS10ZWNoaWVcIjpfMyxcImlzLWEtdGhlcmFwaXN0XCI6XzMsXCJpcy1hbi1hY2NvdW50YW50XCI6XzMsXCJpcy1hbi1hY3RvclwiOl8zLFwiaXMtYW4tYWN0cmVzc1wiOl8zLFwiaXMtYW4tYW5hcmNoaXN0XCI6XzMsXCJpcy1hbi1hcnRpc3RcIjpfMyxcImlzLWFuLWVuZ2luZWVyXCI6XzMsXCJpcy1hbi1lbnRlcnRhaW5lclwiOl8zLFwiaXMtY2VydGlmaWVkXCI6XzMsXCJpcy1nb25lXCI6XzMsXCJpcy1pbnRvLWFuaW1lXCI6XzMsXCJpcy1pbnRvLWNhcnNcIjpfMyxcImlzLWludG8tY2FydG9vbnNcIjpfMyxcImlzLWludG8tZ2FtZXNcIjpfMyxcImlzLWxlZXRcIjpfMyxcImlzLW5vdC1jZXJ0aWZpZWRcIjpfMyxcImlzLXNsaWNrXCI6XzMsXCJpcy11YmVybGVldFwiOl8zLFwiaXMtd2l0aC10aGViYW5kXCI6XzMsXCJpc2EtZ2Vla1wiOl8zLFwiaXNhLWhvY2tleW51dFwiOl8zLFwiaXNzbWFydGVydGhhbnlvdVwiOl8zLFwibGlrZXMtcGllXCI6XzMsXCJsaWtlc2NhbmR5XCI6XzMsXCJuZWF0LXVybFwiOl8zLFwic2F2ZXMtdGhlLXdoYWxlc1wiOl8zLFwic2VsZmlwXCI6XzMsXCJzZWxscy1mb3ItbGVzc1wiOl8zLFwic2VsbHMtZm9yLXVcIjpfMyxcInNlcnZlYmJzXCI6XzMsXCJzaW1wbGUtdXJsXCI6XzMsXCJzcGFjZS10by1yZW50XCI6XzMsXCJ0ZWFjaGVzLXlvZ2FcIjpfMyxcIndyaXRlc3RoaXNibG9nXCI6XzMsXCJkZG5zZnJlZVwiOl8zLFwiZGRuc2dlZWtcIjpfMyxcImdpaXplXCI6XzMsXCJnbGVlemVcIjpfMyxcImtvem93XCI6XzMsXCJsb3NleW91cmlwXCI6XzMsXCJvb2d1eVwiOl8zLFwidGhld29ya3BjXCI6XzMsXCJteXR1bGVhcFwiOl8zLFwidHVsZWFwLXBhcnRuZXJzXCI6XzMsXCJlbmNvcmVhcGlcIjpfMyxcImV2ZW5ub2RlXCI6WzAse1wiZXUtMVwiOl8zLFwiZXUtMlwiOl8zLFwiZXUtM1wiOl8zLFwiZXUtNFwiOl8zLFwidXMtMVwiOl8zLFwidXMtMlwiOl8zLFwidXMtM1wiOl8zLFwidXMtNFwiOl8zfV0sXCJvbmZhYnJpY2FcIjpfMyxcImZhc3RseS1lZGdlXCI6XzMsXCJmYXN0bHktdGVycmFyaXVtXCI6XzMsXCJmYXN0dnBzLXNlcnZlclwiOl8zLFwibXlkb2Jpc3NcIjpfMyxcImZpcmViYXNlYXBwXCI6XzMsXCJmbGRydlwiOl8zLFwiZm9yZ2VibG9ja3NcIjpfMyxcImZyYW1lcmNhbnZhc1wiOl8zLFwiZnJlZWJveC1vc1wiOl8zLFwiZnJlZWJveG9zXCI6XzMsXCJmcmVlbXlpcFwiOl8zLFwiYWxpYXNlczEyMVwiOl8zLFwiZ2VudGFwcHNcIjpfMyxcImdlbnRsZW50YXBpc1wiOl8zLFwiZ2l0aHVidXNlcmNvbnRlbnRcIjpfMyxcIjBlbW1cIjpfNixcImFwcHNwb3RcIjpbMix7XCJyXCI6XzZ9XSxcImJsb2dzcG90XCI6XzMsXCJjb2Rlc3BvdFwiOl8zLFwiZ29vZ2xlYXBpc1wiOl8zLFwiZ29vZ2xlY29kZVwiOl8zLFwicGFnZXNwZWVkbW9iaWxpemVyXCI6XzMsXCJ3aXRoZ29vZ2xlXCI6XzMsXCJ3aXRoeW91dHViZVwiOl8zLFwiZ3JheWpheWxlYWd1ZXNcIjpfMyxcImhhdGVuYWJsb2dcIjpfMyxcImhhdGVuYWRpYXJ5XCI6XzMsXCJoZXJva3VhcHBcIjpfMyxcImdyXCI6XzMsXCJzbXVzaGNkblwiOl8zLFwid3Bob3N0ZWRtYWlsXCI6XzMsXCJ3cG11Y2RuXCI6XzMsXCJwaXhvbGlub1wiOl8zLFwiYXBwcy0xYW5kMVwiOl8zLFwibGl2ZS13ZWJzaXRlXCI6XzMsXCJ3ZWJzcGFjZS1ob3N0XCI6XzMsXCJkb3BhYXNcIjpfMyxcImhvc3RlZC1ieS1wcmV2aWRlclwiOl80MyxcImhvc3RldXJcIjpbMCx7XCJyYWctY2xvdWRcIjpfMyxcInJhZy1jbG91ZC1jaFwiOl8zfV0sXCJpay1zZXJ2ZXJcIjpbMCx7XCJqY2xvdWRcIjpfMyxcImpjbG91ZC12ZXItanBjXCI6XzN9XSxcImplbGFzdGljXCI6WzAse1wiZGVtb1wiOl8zfV0sXCJtYXNzaXZlZ3JpZFwiOl80MyxcIndhZmFpY2xvdWRcIjpbMCx7XCJqZWRcIjpfMyxcInJ5ZFwiOl8zfV0sXCJqb3RlLWRyLWx0MVwiOl8zLFwiam90ZS1yZC1sdDFcIjpfMyxcIndlYmFkb3JzaXRlXCI6XzMsXCJqb3llbnRcIjpbMCx7XCJjbnNcIjpfNn1dLFwib24tZm9yZ2VcIjpfMyxcIm9uLXZhcG9yXCI6XzMsXCJscHVzZXJjb250ZW50XCI6XzMsXCJsaW5vZGVcIjpbMCx7XCJtZW1iZXJzXCI6XzMsXCJub2RlYmFsYW5jZXJcIjpfNn1dLFwibGlub2Rlb2JqZWN0c1wiOl82LFwibGlub2RldXNlcmNvbnRlbnRcIjpbMCx7XCJpcFwiOl8zfV0sXCJsb2NhbHRvbmV0XCI6XzMsXCJsb3ZhYmxlcHJvamVjdFwiOl8zLFwiYmFyc3ljZW50ZXJcIjpfMyxcImJhcnN5b25saW5lXCI6XzMsXCJsdXRyYXVzZXJjb250ZW50XCI6XzYsXCJtb2RlbHNjYXBlXCI6XzMsXCJtd2Nsb3Vkbm9ucHJvZFwiOl8zLFwicG9seXNwYWNlXCI6XzMsXCJtYXplcGxheVwiOl8zLFwibWluaXNlcnZlclwiOl8zLFwiYXRtZXRhXCI6XzMsXCJmYnNieFwiOl80MixcIm1ldGVvcmFwcFwiOl80NCxcInJvdXRpbmd0aGVjbG91ZFwiOl8zLFwic2FtZS1hcHBcIjpfMyxcInNhbWUtcHJldmlld1wiOl8zLFwibXlkYnNlcnZlclwiOl8zLFwiaG9zdGVkcGlcIjpfMyxcIm15dGhpYy1iZWFzdHNcIjpbMCx7XCJjYXJhY2FsXCI6XzMsXCJjdXN0b21lclwiOl8zLFwiZmVudGlnZXJcIjpfMyxcImx5bnhcIjpfMyxcIm9jZWxvdFwiOl8zLFwib25jaWxsYVwiOl8zLFwib256YVwiOl8zLFwic3BoaW54XCI6XzMsXCJ2c1wiOl8zLFwieFwiOl8zLFwieWFsaVwiOl8zfV0sXCJub3NwYW1wcm94eVwiOlswLHtcImNsb3VkXCI6WzIse1wibzM2NVwiOl8zfV19XSxcIjR1XCI6XzMsXCJuZnNob3N0XCI6XzMsXCIzdXRpbGl0aWVzXCI6XzMsXCJibG9nc3l0ZVwiOl8zLFwiY2lzY29mcmVha1wiOl8zLFwiZGFtbnNlcnZlclwiOl8zLFwiZGRuc2tpbmdcIjpfMyxcImRpdGNoeW91cmlwXCI6XzMsXCJkbnNpc2tpbmt5XCI6XzMsXCJkeW5uc1wiOl8zLFwiZ2Vla2dhbGF4eVwiOl8zLFwiaGVhbHRoLWNhcmVyZWZvcm1cIjpfMyxcImhvbWVzZWN1cml0eW1hY1wiOl8zLFwiaG9tZXNlY3VyaXR5cGNcIjpfMyxcIm15YWN0aXZlZGlyZWN0b3J5XCI6XzMsXCJteXNlY3VyaXR5Y2FtZXJhXCI6XzMsXCJteXZuY1wiOl8zLFwibmV0LWZyZWFrc1wiOl8zLFwib250aGV3aWZpXCI6XzMsXCJwb2ludDJ0aGlzXCI6XzMsXCJxdWlja3N5dGVzXCI6XzMsXCJzZWN1cml0eXRhY3RpY3NcIjpfMyxcInNlcnZlYmVlclwiOl8zLFwic2VydmVjb3VudGVyc3RyaWtlXCI6XzMsXCJzZXJ2ZWV4Y2hhbmdlXCI6XzMsXCJzZXJ2ZWZ0cFwiOl8zLFwic2VydmVnYW1lXCI6XzMsXCJzZXJ2ZWhhbGZsaWZlXCI6XzMsXCJzZXJ2ZWh0dHBcIjpfMyxcInNlcnZlaHVtb3VyXCI6XzMsXCJzZXJ2ZWlyY1wiOl8zLFwic2VydmVtcDNcIjpfMyxcInNlcnZlcDJwXCI6XzMsXCJzZXJ2ZXBpY3NcIjpfMyxcInNlcnZlcXVha2VcIjpfMyxcInNlcnZlc2FyY2FzbVwiOl8zLFwic3R1ZmZ0b3JlYWRcIjpfMyxcInVudXN1YWxwZXJzb25cIjpfMyxcIndvcmtpc2JvcmluZ1wiOl8zLFwibXlpcGhvc3RcIjpfMyxcIm9ic2VydmFibGV1c2VyY29udGVudFwiOlswLHtcInN0YXRpY1wiOl8zfV0sXCJzaW1wbGVzaXRlXCI6XzMsXCJvYWl1c2VyY29udGVudFwiOl82LFwib3JzaXRlc1wiOl8zLFwib3BlcmF1bml0ZVwiOl8zLFwiY3VzdG9tZXItb2NpXCI6WzAse1wiKlwiOl8zLFwib2NpXCI6XzYsXCJvY3BcIjpfNixcIm9jc1wiOl82fV0sXCJvcmFjbGVjbG91ZGFwcHNcIjpfNixcIm9yYWNsZWdvdmNsb3VkYXBwc1wiOl82LFwiYXV0aGdlYXItc3RhZ2luZ1wiOl8zLFwiYXV0aGdlYXJhcHBzXCI6XzMsXCJza3lnZWFyYXBwXCI6XzMsXCJvdXRzeXN0ZW1zY2xvdWRcIjpfMyxcIm93bnByb3ZpZGVyXCI6XzMsXCJwZ2ZvZ1wiOl8zLFwicGFnZXhsXCI6XzMsXCJnb3RwYW50aGVvblwiOl8zLFwicGF5d2hpcmxcIjpfNixcInVwc3VuYXBwXCI6XzMsXCJwb3N0bWFuLWVjaG9cIjpfMyxcInByZ21yXCI6WzAse1wieGVuXCI6XzN9XSxcInByb2plY3Qtc3R1ZHlcIjpbMCx7XCJkZXZcIjpfM31dLFwicHl0aG9uYW55d2hlcmVcIjpfNDQsXCJxYTJcIjpfMyxcImFscGhhLW15cW5hcGNsb3VkXCI6XzMsXCJkZXYtbXlxbmFwY2xvdWRcIjpfMyxcIm15Y2xvdWRuYXNcIjpfMyxcIm15bmFzY2xvdWRcIjpfMyxcIm15cW5hcGNsb3VkXCI6XzMsXCJxdWFsaWZpb2FwcFwiOl8zLFwibGFkZXNrXCI6XzMsXCJxdWFseWhxcGFydG5lclwiOl82LFwicXVhbHlocXBvcnRhbFwiOl82LFwicWJ1c2VyXCI6XzMsXCJxdWlwZWxlbWVudHNcIjpfNixcInJhY2ttYXplXCI6XzMsXCJyZWFkdGhlZG9jcy1ob3N0ZWRcIjpfMyxcInJoY2xvdWRcIjpfMyxcIm9ucmVuZGVyXCI6XzMsXCJyZW5kZXJcIjpfNDUsXCJzdWJzYy1wYXlcIjpfMyxcIjE4MHJcIjpfMyxcImRvamluXCI6XzMsXCJzYWt1cmF0YW5cIjpfMyxcInNha3VyYXdlYlwiOl8zLFwieDBcIjpfMyxcImNvZGVcIjpbMCx7XCJidWlsZGVyXCI6XzYsXCJkZXYtYnVpbGRlclwiOl82LFwic3RnLWJ1aWxkZXJcIjpfNn1dLFwic2FsZXNmb3JjZVwiOlswLHtcInBsYXRmb3JtXCI6WzAse1wiY29kZS1idWlsZGVyLXN0Z1wiOlswLHtcInRlc3RcIjpbMCx7XCIwMDFcIjpfNn1dfV19XX1dLFwibG9nb2lwXCI6XzMsXCJzY3J5c2VjXCI6XzMsXCJmaXJld2FsbC1nYXRld2F5XCI6XzMsXCJteXNob3BibG9ja3NcIjpfMyxcIm15c2hvcGlmeVwiOl8zLFwic2hvcGl0c2l0ZVwiOl8zLFwiMWthcHBcIjpfMyxcImFwcGNoaXppXCI6XzMsXCJhcHBsaW56aVwiOl8zLFwic2luYWFwcFwiOl8zLFwidmlwc2luYWFwcFwiOl8zLFwic3RyZWFtbGl0YXBwXCI6XzMsXCJ0cnktc25vd3Bsb3dcIjpfMyxcInBsYXlzdGF0aW9uLWNsb3VkXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcInctY29ycC1zdGF0aWNibGl0elwiOl8zLFwidy1jcmVkZW50aWFsbGVzcy1zdGF0aWNibGl0elwiOl8zLFwidy1zdGF0aWNibGl0elwiOl8zLFwic3RhY2toZXJvLW5ldHdvcmtcIjpfMyxcInN0ZGxpYlwiOlswLHtcImFwaVwiOl8zfV0sXCJzdHJhcGlhcHBcIjpbMix7XCJtZWRpYVwiOl8zfV0sXCJzdHJlYWstbGlua1wiOl8zLFwic3RyZWFrbGlua3NcIjpfMyxcInN0cmVha3VzZXJjb250ZW50XCI6XzMsXCJ0ZW1wLWRuc1wiOl8zLFwiZHNteW5hc1wiOl8zLFwiZmFtaWx5ZHNcIjpfMyxcIm15dGFiaXRcIjpfMyxcInRhdmV1c2VyY29udGVudFwiOl8zLFwidGItaG9zdGluZ1wiOl80NixcInJlc2VydmRcIjpfMyxcInRoaW5nZHVzdGRhdGFcIjpfMyxcInRvd25uZXdzLXN0YWdpbmdcIjpfMyxcInR5cGVmb3JtXCI6WzAse1wicHJvXCI6XzN9XSxcImhrXCI6XzMsXCJpdFwiOl8zLFwiZGV1cy1jYW52YXNcIjpfMyxcInZ1bHRyb2JqZWN0c1wiOl82LFwid2FmZmxlY2VsbFwiOl8zLFwiaG90ZWx3aXRoZmxpZ2h0XCI6XzMsXCJyZXNlcnZlLW9ubGluZVwiOl8zLFwiY3ByYXBpZFwiOl8zLFwicGxlc2tuc1wiOl8zLFwicmVtb3Rld2RcIjpfMyxcIndpYXJkd2ViXCI6WzAse1wicGFnZXNcIjpfM31dLFwid2l4c2l0ZVwiOl8zLFwid2l4c3R1ZGlvXCI6XzMsXCJtZXNzd2l0aGRuc1wiOl8zLFwid29sdGxhYi1kZW1vXCI6XzMsXCJ3cGVuZ2luZXBvd2VyZWRcIjpbMix7XCJqc1wiOl8zfV0sXCJ4bmJheVwiOlsyLHtcInUyXCI6XzMsXCJ1Mi1sb2NhbFwiOl8zfV0sXCJ5b2xhc2l0ZVwiOl8zfV0sXCJjb29wXCI6XzIsXCJjclwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZWRcIjpfMixcImZpXCI6XzIsXCJnb1wiOl8yLFwib3JcIjpfMixcInNhXCI6XzJ9XSxcImN1XCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvYlwiOl8yLFwiaW5mXCI6XzIsXCJuYXRcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcImN2XCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImlkXCI6XzIsXCJpbnRcIjpfMixcIm5ldFwiOl8yLFwibm9tZVwiOl8yLFwib3JnXCI6XzIsXCJwdWJsXCI6XzJ9XSxcImN3XCI6XzQ3LFwiY3hcIjpbMSx7XCJnb3ZcIjpfMixcImNsb3VkbnNcIjpfMyxcImF0aFwiOl8zLFwiaW5mb1wiOl8zLFwiYXNzZXNzbWVudHNcIjpfMyxcImNhbGN1bGF0b3JzXCI6XzMsXCJmdW5uZWxzXCI6XzMsXCJwYXlub3dcIjpfMyxcInF1aXp6ZXNcIjpfMyxcInJlc2VhcmNoZWRcIjpfMyxcInRlc3RzXCI6XzN9XSxcImN5XCI6WzEse1wiYWNcIjpfMixcImJpelwiOl8yLFwiY29tXCI6WzEse1wic2NhbGVmb3JjZVwiOl80OH1dLFwiZWtsb2dlc1wiOl8yLFwiZ292XCI6XzIsXCJsdGRcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByZXNzXCI6XzIsXCJwcm9cIjpfMixcInRtXCI6XzJ9XSxcImN6XCI6WzEse1wiZ292XCI6XzIsXCJjb250ZW50cHJveHk5XCI6WzAse1wicnNjXCI6XzN9XSxcInJlYWxtXCI6XzMsXCJlNFwiOl8zLFwiY29cIjpfMyxcIm1ldGFjZW50cnVtXCI6WzAse1wiY2xvdWRcIjpfNixcImN1c3RvbVwiOl8zfV0sXCJtdW5pXCI6WzAse1wiY2xvdWRcIjpbMCx7XCJmbHRcIjpfMyxcInVzclwiOl8zfV19XX1dLFwiZGVcIjpbMSx7XCJicGxhY2VkXCI6XzMsXCJzcXVhcmU3XCI6XzMsXCJjb21cIjpfMyxcImNvc2lkbnNcIjpfNDksXCJkbnN1cGRhdGVyXCI6XzMsXCJkeW5hbWlzY2hlcy1kbnNcIjpfMyxcImludGVybmV0LWRuc1wiOl8zLFwibC1vLWctaS1uXCI6XzMsXCJkZG5zc1wiOlsyLHtcImR5blwiOl8zLFwiZHluZG5zXCI6XzN9XSxcImR5bi1pcDI0XCI6XzMsXCJkeW5kbnMxXCI6XzMsXCJob21lLXdlYnNlcnZlclwiOlsyLHtcImR5blwiOl8zfV0sXCJteWhvbWUtc2VydmVyXCI6XzMsXCJkbnNob21lXCI6XzMsXCJmdWV0dGVydGRhc25ldHpcIjpfMyxcImlzdGVpbmdlZWtcIjpfMyxcImlzdG1laW5cIjpfMyxcImxlYnRpbW5ldHpcIjpfMyxcImxlaXR1bmdzZW5cIjpfMyxcInRyYWV1bXRnZXJhZGVcIjpfMyxcImZydXNreVwiOl82LFwiZ29pcFwiOl8zLFwieG4tLWduc3RpZ2Jlc3RlbGxlbi16dmJcIjpfMyxcImdcdTAwRkNuc3RpZ2Jlc3RlbGxlblwiOl8zLFwieG4tLWduc3RpZ2xpZWZlcm4td29iXCI6XzMsXCJnXHUwMEZDbnN0aWdsaWVmZXJuXCI6XzMsXCJocy1oZWlsYnJvbm5cIjpbMCx7XCJpdFwiOlswLHtcInBhZ2VzXCI6XzMsXCJwYWdlcy1yZXNlYXJjaFwiOl8zfV19XSxcImR5bi1iZXJsaW5cIjpfMyxcImluLWJlcmxpblwiOl8zLFwiaW4tYnJiXCI6XzMsXCJpbi1idXR0ZXJcIjpfMyxcImluLWRzbFwiOl8zLFwiaW4tdnBuXCI6XzMsXCJpc2VydnNjaHVsZVwiOl8zLFwibWVpbi1pc2VydlwiOl8zLFwic2NodWxkb2NrXCI6XzMsXCJzY2h1bHBsYXR0Zm9ybVwiOl8zLFwic2NodWxzZXJ2ZXJcIjpfMyxcInRlc3QtaXNlcnZcIjpfMyxcImtleW1hY2hpbmVcIjpfMyxcImNvXCI6XzMsXCJnaXQtcmVwb3NcIjpfMyxcImxjdWJlLXNlcnZlclwiOl8zLFwic3ZuLXJlcG9zXCI6XzMsXCJiYXJzeVwiOl8zLFwid2Vic3BhY2Vjb25maWdcIjpfMyxcIjEyM3dlYnNlaXRlXCI6XzMsXCJydWJcIjpfMyxcInJ1aHItdW5pLWJvY2h1bVwiOlsyLHtcIm5vY1wiOlswLHtcImlvXCI6XzN9XX1dLFwibG9nb2lwXCI6XzMsXCJmaXJld2FsbC1nYXRld2F5XCI6XzMsXCJteS1nYXRld2F5XCI6XzMsXCJteS1yb3V0ZXJcIjpfMyxcInNwZG5zXCI6XzMsXCJteVwiOl8zLFwic3BlZWRwYXJ0bmVyXCI6WzAse1wiY3VzdG9tZXJcIjpfM31dLFwibXlzcHJlYWRzaG9wXCI6XzMsXCJ0YWlmdW4tZG5zXCI6XzMsXCIxMmhwXCI6XzMsXCIyaXhcIjpfMyxcIjRsaW1hXCI6XzMsXCJsaW1hLWNpdHlcIjpfMyxcImRkLWRuc1wiOl8zLFwiZHJheS1kbnNcIjpfMyxcImRyYXlkbnNcIjpfMyxcImR5bi12cG5cIjpfMyxcImR5bnZwblwiOl8zLFwibWVpbi12aWdvclwiOl8zLFwibXktdmlnb3JcIjpfMyxcIm15LXdhblwiOl8zLFwic3luby1kc1wiOl8zLFwic3lub2xvZ3ktZGlza3N0YXRpb25cIjpfMyxcInN5bm9sb2d5LWRzXCI6XzMsXCJ2aXJ0dWFsLXVzZXJcIjpfMyxcInZpcnR1YWx1c2VyXCI6XzMsXCJjb21tdW5pdHktcHJvXCI6XzMsXCJkaXNrdXNzaW9uc2JlcmVpY2hcIjpfMyxcInhlbm9uY29ubmVjdFwiOl82fV0sXCJkalwiOl8yLFwiZGtcIjpbMSx7XCJiaXpcIjpfMyxcImNvXCI6XzMsXCJmaXJtXCI6XzMsXCJyZWdcIjpfMyxcInN0b3JlXCI6XzMsXCIxMjNoamVtbWVzaWRlXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfM31dLFwiZG1cIjpfNTEsXCJkb1wiOlsxLHtcImFydFwiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvYlwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJzbGRcIjpfMixcIndlYlwiOl8yfV0sXCJkelwiOlsxLHtcImFydFwiOl8yLFwiYXNzb1wiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInBvbFwiOl8yLFwic29jXCI6XzIsXCJ0bVwiOl8yfV0sXCJlY1wiOlsxLHtcImFiZ1wiOl8yLFwiYWRtXCI6XzIsXCJhZ3JvblwiOl8yLFwiYXJxdFwiOl8yLFwiYXJ0XCI6XzIsXCJiYXJcIjpfMixcImNoZWZcIjpfMixcImNvbVwiOl8yLFwiY29udFwiOl8yLFwiY3BhXCI6XzIsXCJjdWVcIjpfMixcImRlbnRcIjpfMixcImRnblwiOl8yLFwiZGlzY29cIjpfMixcImRvY1wiOl8yLFwiZWR1XCI6XzIsXCJlbmdcIjpfMixcImVzbVwiOl8yLFwiZmluXCI6XzIsXCJmb3RcIjpfMixcImdhbFwiOl8yLFwiZ29iXCI6XzIsXCJnb3ZcIjpfMixcImd5ZVwiOl8yLFwiaWJyXCI6XzIsXCJpbmZvXCI6XzIsXCJrMTJcIjpfMixcImxhdFwiOl8yLFwibG9qXCI6XzIsXCJtZWRcIjpfMixcIm1pbFwiOl8yLFwibWt0Z1wiOl8yLFwibW9uXCI6XzIsXCJuZXRcIjpfMixcIm50clwiOl8yLFwib2RvbnRcIjpfMixcIm9yZ1wiOl8yLFwicHJvXCI6XzIsXCJwcm9mXCI6XzIsXCJwc2ljXCI6XzIsXCJwc2lxXCI6XzIsXCJwdWJcIjpfMixcInJpb1wiOl8yLFwicnJwcFwiOl8yLFwic2FsXCI6XzIsXCJ0ZWNoXCI6XzIsXCJ0dWxcIjpfMixcInR1clwiOl8yLFwidWlvXCI6XzIsXCJ2ZXRcIjpfMixcInh4eFwiOl8yLFwiYmFzZVwiOl8zLFwib2ZmaWNpYWxcIjpfM31dLFwiZWR1XCI6WzEse1wicml0XCI6WzAse1wiZ2l0LXBhZ2VzXCI6XzN9XX1dLFwiZWVcIjpbMSx7XCJhaXBcIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJmaWVcIjpfMixcImdvdlwiOl8yLFwibGliXCI6XzIsXCJtZWRcIjpfMixcIm9yZ1wiOl8yLFwicHJpXCI6XzIsXCJyaWlrXCI6XzJ9XSxcImVnXCI6WzEse1wiYWNcIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJldW5cIjpfMixcImdvdlwiOl8yLFwiaW5mb1wiOl8yLFwibWVcIjpfMixcIm1pbFwiOl8yLFwibmFtZVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNjaVwiOl8yLFwic3BvcnRcIjpfMixcInR2XCI6XzJ9XSxcImVyXCI6XzIwLFwiZXNcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ29iXCI6XzIsXCJub21cIjpfMixcIm9yZ1wiOl8yLFwiMTIzbWl3ZWJcIjpfMyxcIm15c3ByZWFkc2hvcFwiOl8zfV0sXCJldFwiOlsxLHtcImJpelwiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaW5mb1wiOl8yLFwibmFtZVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwiZXVcIjpbMSx7XCJjbG91ZG5zXCI6XzMsXCJkb2dhZG9cIjpbMCx7XCJqZWxhc3RpY1wiOl8zfV0sXCJiYXJzeVwiOl8zLFwic3BkbnNcIjpfMyxcIm54YVwiOl82LFwidHJhbnN1cmxcIjpfNixcImRpc2tzdGF0aW9uXCI6XzN9XSxcImZpXCI6WzEse1wiYWxhbmRcIjpfMixcImR5XCI6XzMsXCJ4bi0taGtraW5lbi01d2FcIjpfMyxcImhcdTAwRTRra2luZW5cIjpfMyxcImlraVwiOl8zLFwiY2xvdWRwbGF0Zm9ybVwiOlswLHtcImZpXCI6XzN9XSxcImRhdGFjZW50ZXJcIjpbMCx7XCJkZW1vXCI6XzMsXCJwYWFzXCI6XzN9XSxcImthcHNpXCI6XzMsXCIxMjNrb3Rpc2l2dVwiOl8zLFwibXlzcHJlYWRzaG9wXCI6XzN9XSxcImZqXCI6WzEse1wiYWNcIjpfMixcImJpelwiOl8yLFwiY29tXCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcIm1pbFwiOl8yLFwibmFtZVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByb1wiOl8yfV0sXCJma1wiOl8yMCxcImZtXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJyYWRpb1wiOl8zLFwidXNlclwiOl82fV0sXCJmb1wiOl8yLFwiZnJcIjpbMSx7XCJhc3NvXCI6XzIsXCJjb21cIjpfMixcImdvdXZcIjpfMixcIm5vbVwiOl8yLFwicHJkXCI6XzIsXCJ0bVwiOl8yLFwiYXZvdWVzXCI6XzIsXCJjY2lcIjpfMixcImdyZXRhXCI6XzIsXCJodWlzc2llci1qdXN0aWNlXCI6XzIsXCJlbi1yb290XCI6XzMsXCJmYngtb3NcIjpfMyxcImZieG9zXCI6XzMsXCJmcmVlYm94LW9zXCI6XzMsXCJmcmVlYm94b3NcIjpfMyxcImdvdXBpbGVcIjpfMyxcIjEyM3NpdGV3ZWJcIjpfMyxcIm9uLXdlYlwiOl8zLFwiY2hpcnVyZ2llbnMtZGVudGlzdGVzLWVuLWZyYW5jZVwiOl8zLFwiZGVkaWJveFwiOl8zLFwiYWVyb3BvcnRcIjpfMyxcImF2b2NhdFwiOl8zLFwiY2hhbWJhZ3JpXCI6XzMsXCJjaGlydXJnaWVucy1kZW50aXN0ZXNcIjpfMyxcImV4cGVydHMtY29tcHRhYmxlc1wiOl8zLFwibWVkZWNpblwiOl8zLFwibm90YWlyZXNcIjpfMyxcInBoYXJtYWNpZW5cIjpfMyxcInBvcnRcIjpfMyxcInZldGVyaW5haXJlXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcInluaFwiOl8zfV0sXCJnYVwiOl8yLFwiZ2JcIjpfMixcImdkXCI6WzEse1wiZWR1XCI6XzIsXCJnb3ZcIjpfMn1dLFwiZ2VcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicHZ0XCI6XzIsXCJzY2hvb2xcIjpfMn1dLFwiZ2ZcIjpfMixcImdnXCI6WzEse1wiY29cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJib3RkYXNoXCI6XzMsXCJrYWFzXCI6XzMsXCJzdGFja2l0XCI6XzMsXCJwYW5lbFwiOlsyLHtcImRhZW1vblwiOl8zfV19XSxcImdoXCI6WzEse1wiYml6XCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcImdpXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibHRkXCI6XzIsXCJtb2RcIjpfMixcIm9yZ1wiOl8yfV0sXCJnbFwiOlsxLHtcImNvXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwiZ21cIjpfMixcImduXCI6WzEse1wiYWNcIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcImdvdlwiOl8yLFwiZ3BcIjpbMSx7XCJhc3NvXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwibW9iaVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwiZ3FcIjpfMixcImdyXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcImJhcnN5XCI6XzMsXCJzaW1wbGVzaXRlXCI6XzN9XSxcImdzXCI6XzIsXCJndFwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb2JcIjpfMixcImluZFwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJndVwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImd1YW1cIjpfMixcImluZm9cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJ3ZWJcIjpfMn1dLFwiZ3dcIjpbMSx7XCJueFwiOl8zfV0sXCJneVwiOl81MSxcImhrXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaWR2XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwieG4tLWNpcXBuXCI6XzIsXCJcdTRFMkFcdTRFQkFcIjpfMixcInhuLS1nbXF3NWFcIjpfMixcIlx1NTAwQlx1NEVCQVwiOl8yLFwieG4tLTU1cXg1ZFwiOl8yLFwiXHU1MTZDXHU1M0Y4XCI6XzIsXCJ4bi0tbXh0cTFtXCI6XzIsXCJcdTY1M0ZcdTVFOUNcIjpfMixcInhuLS1sY3ZyMzJkXCI6XzIsXCJcdTY1NEVcdTgwQjJcIjpfMixcInhuLS13Y3ZzMjJkXCI6XzIsXCJcdTY1NTlcdTgwQjJcIjpfMixcInhuLS1nbXEwNTBpXCI6XzIsXCJcdTdCODdcdTRFQkFcIjpfMixcInhuLS11YzBhdHZcIjpfMixcIlx1N0Q0NFx1N0U1NFwiOl8yLFwieG4tLXVjMGF5NGFcIjpfMixcIlx1N0Q0NFx1N0VDN1wiOl8yLFwieG4tLW9kMGFsZ1wiOl8yLFwiXHU3REIyXHU3RDYxXCI6XzIsXCJ4bi0temYwYXZ4XCI6XzIsXCJcdTdEQjJcdTdFRENcIjpfMixcInhuLS1tazBheGlcIjpfMixcIlx1N0VDNFx1N0U1NFwiOl8yLFwieG4tLXRuMGFnXCI6XzIsXCJcdTdFQzRcdTdFQzdcIjpfMixcInhuLS1vZDBhcTNiXCI6XzIsXCJcdTdGNTFcdTdENjFcIjpfMixcInhuLS1pbzBhN2lcIjpfMixcIlx1N0Y1MVx1N0VEQ1wiOl8yLFwiaW5jXCI6XzMsXCJsdGRcIjpfM31dLFwiaG1cIjpfMixcImhuXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvYlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJoclwiOlsxLHtcImNvbVwiOl8yLFwiZnJvbVwiOl8yLFwiaXpcIjpfMixcIm5hbWVcIjpfMixcImJyZW5kbHlcIjpfMTl9XSxcImh0XCI6WzEse1wiYWR1bHRcIjpfMixcImFydFwiOl8yLFwiYXNzb1wiOl8yLFwiY29tXCI6XzIsXCJjb29wXCI6XzIsXCJlZHVcIjpfMixcImZpcm1cIjpfMixcImdvdXZcIjpfMixcImluZm9cIjpfMixcIm1lZFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInBlcnNvXCI6XzIsXCJwb2xcIjpfMixcInByb1wiOl8yLFwicmVsXCI6XzIsXCJzaG9wXCI6XzIsXCJydFwiOl8zfV0sXCJodVwiOlsxLHtcIjIwMDBcIjpfMixcImFncmFyXCI6XzIsXCJib2x0XCI6XzIsXCJjYXNpbm9cIjpfMixcImNpdHlcIjpfMixcImNvXCI6XzIsXCJlcm90aWNhXCI6XzIsXCJlcm90aWthXCI6XzIsXCJmaWxtXCI6XzIsXCJmb3J1bVwiOl8yLFwiZ2FtZXNcIjpfMixcImhvdGVsXCI6XzIsXCJpbmZvXCI6XzIsXCJpbmdhdGxhblwiOl8yLFwiam9nYXN6XCI6XzIsXCJrb255dmVsb1wiOl8yLFwibGFrYXNcIjpfMixcIm1lZGlhXCI6XzIsXCJuZXdzXCI6XzIsXCJvcmdcIjpfMixcInByaXZcIjpfMixcInJla2xhbVwiOl8yLFwic2V4XCI6XzIsXCJzaG9wXCI6XzIsXCJzcG9ydFwiOl8yLFwic3VsaVwiOl8yLFwic3pleFwiOl8yLFwidG1cIjpfMixcInRvenNkZVwiOl8yLFwidXRhemFzXCI6XzIsXCJ2aWRlb1wiOl8yfV0sXCJpZFwiOlsxLHtcImFjXCI6XzIsXCJiaXpcIjpfMixcImNvXCI6XzIsXCJkZXNhXCI6XzIsXCJnb1wiOl8yLFwia29wXCI6XzIsXCJtaWxcIjpfMixcIm15XCI6XzIsXCJuZXRcIjpfMixcIm9yXCI6XzIsXCJwb25wZXNcIjpfMixcInNjaFwiOl8yLFwid2ViXCI6XzIsXCJlXCI6XzMsXCJ6b25lXCI6XzN9XSxcImllXCI6WzEse1wiZ292XCI6XzIsXCJteXNwcmVhZHNob3BcIjpfM31dLFwiaWxcIjpbMSx7XCJhY1wiOl8yLFwiY29cIjpbMSx7XCJyYXZwYWdlXCI6XzMsXCJteXRhYml0XCI6XzMsXCJ0YWJpdG9yZGVyXCI6XzN9XSxcImdvdlwiOl8yLFwiaWRmXCI6XzIsXCJrMTJcIjpfMixcIm11bmlcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcInhuLS00ZGJyazBjZVwiOlsxLHtcInhuLS00ZGJnZHR5NmNcIjpfMixcInhuLS01ZGJobDhkXCI6XzIsXCJ4bi0tOGRicTJhXCI6XzIsXCJ4bi0taGViZGE4YlwiOl8yfV0sXCJcdTA1RDlcdTA1RTlcdTA1RThcdTA1RDBcdTA1RENcIjpbMSx7XCJcdTA1RDBcdTA1RTdcdTA1RDNcdTA1REVcdTA1RDlcdTA1RDRcIjpfMixcIlx1MDVEOVx1MDVFOVx1MDVENVx1MDVEMVwiOl8yLFwiXHUwNUU2XHUwNUQ0XHUwNURDXCI6XzIsXCJcdTA1REVcdTA1REVcdTA1RTlcdTA1RENcIjpfMn1dLFwiaW1cIjpbMSx7XCJhY1wiOl8yLFwiY29cIjpbMSx7XCJsdGRcIjpfMixcInBsY1wiOl8yfV0sXCJjb21cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJ0dFwiOl8yLFwidHZcIjpfMn1dLFwiaW5cIjpbMSx7XCI1Z1wiOl8yLFwiNmdcIjpfMixcImFjXCI6XzIsXCJhaVwiOl8yLFwiYW1cIjpfMixcImJpaGFyXCI6XzIsXCJiaXpcIjpfMixcImJ1c2luZXNzXCI6XzIsXCJjYVwiOl8yLFwiY25cIjpfMixcImNvXCI6XzIsXCJjb21cIjpfMixcImNvb3BcIjpfMixcImNzXCI6XzIsXCJkZWxoaVwiOl8yLFwiZHJcIjpfMixcImVkdVwiOl8yLFwiZXJcIjpfMixcImZpcm1cIjpfMixcImdlblwiOl8yLFwiZ292XCI6XzIsXCJndWphcmF0XCI6XzIsXCJpbmRcIjpfMixcImluZm9cIjpfMixcImludFwiOl8yLFwiaW50ZXJuZXRcIjpfMixcImlvXCI6XzIsXCJtZVwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm5pY1wiOl8yLFwib3JnXCI6XzIsXCJwZ1wiOl8yLFwicG9zdFwiOl8yLFwicHJvXCI6XzIsXCJyZXNcIjpfMixcInRyYXZlbFwiOl8yLFwidHZcIjpfMixcInVrXCI6XzIsXCJ1cFwiOl8yLFwidXNcIjpfMixcImNsb3VkbnNcIjpfMyxcImJhcnN5XCI6XzMsXCJ3ZWJcIjpfMyxcInN1cGFiYXNlXCI6XzN9XSxcImluZm9cIjpbMSx7XCJjbG91ZG5zXCI6XzMsXCJkeW5hbWljLWRuc1wiOl8zLFwiYmFycmVsLW9mLWtub3dsZWRnZVwiOl8zLFwiYmFycmVsbC1vZi1rbm93bGVkZ2VcIjpfMyxcImR5bmRuc1wiOl8zLFwiZm9yLW91clwiOl8zLFwiZ3Jva3MtdGhlXCI6XzMsXCJncm9rcy10aGlzXCI6XzMsXCJoZXJlLWZvci1tb3JlXCI6XzMsXCJrbm93c2l0YWxsXCI6XzMsXCJzZWxmaXBcIjpfMyxcIndlYmhvcFwiOl8zLFwiYmFyc3lcIjpfMyxcIm1heWZpcnN0XCI6XzMsXCJtaXR0d2FsZFwiOl8zLFwibWl0dHdhbGRzZXJ2ZXJcIjpfMyxcInR5cG8zc2VydmVyXCI6XzMsXCJkdnJjYW1cIjpfMyxcImlsb3ZlY29sbGVnZVwiOl8zLFwibm8taXBcIjpfMyxcImZvcnVtelwiOl8zLFwibnN1cGRhdGVcIjpfMyxcImRuc3VwZGF0ZVwiOl8zLFwidi1pbmZvXCI6XzN9XSxcImludFwiOlsxLHtcImV1XCI6XzJ9XSxcImlvXCI6WzEse1wiMjAzOFwiOl8zLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJub21cIjpfMixcIm9yZ1wiOl8yLFwib24tYWNvcm5cIjpfNixcIm15YWRkclwiOl8zLFwiYXBpZ2VlXCI6XzMsXCJiLWRhdGFcIjpfMyxcImJlYWdsZWJvYXJkXCI6XzMsXCJiaXRidWNrZXRcIjpfMyxcImJsdWViaXRlXCI6XzMsXCJib3hmdXNlXCI6XzMsXCJicmF2ZVwiOl83LFwiYnJvd3NlcnNhZmV0eW1hcmtcIjpfMyxcImJ1YmJsZVwiOl81NCxcImJ1YmJsZWFwcHNcIjpfMyxcImJpZ3ZcIjpbMCx7XCJ1azBcIjpfM31dLFwiY2xldmVyYXBwc1wiOl8zLFwiY2xvdWRiZWVzdXNlcmNvbnRlbnRcIjpfMyxcImRhcHBub2RlXCI6WzAse1wiZHluZG5zXCI6XzN9XSxcImRhcmtsYW5nXCI6XzMsXCJkZWZpbmltYVwiOl8zLFwiZGVkeW5cIjpfMyxcImljcDBcIjpfNTUsXCJpY3AxXCI6XzU1LFwicXp6XCI6XzMsXCJmaC1tdWVuc3RlclwiOl8zLFwic2h3XCI6XzMsXCJmb3JnZXJvY2tcIjpbMCx7XCJpZFwiOl8zfV0sXCJnaXRodWJcIjpfMyxcImdpdGxhYlwiOl8zLFwibG9saXBvcFwiOl8zLFwiaGFzdXJhLWFwcFwiOl8zLFwiaG9zdHlob3N0aW5nXCI6XzMsXCJoeXBlcm5vZGVcIjpfMyxcIm1vb25zY2FsZVwiOl82LFwiYmVlYnl0ZVwiOl80MyxcImJlZWJ5dGVhcHBcIjpbMCx7XCJzZWtkMVwiOl8zfV0sXCJqZWxlXCI6XzMsXCJ3ZWJ0aGluZ3NcIjpfMyxcImxvZ2lubGluZVwiOl8zLFwiYmFyc3lcIjpfMyxcImF6dXJlY29udGFpbmVyXCI6XzYsXCJuZ3Jva1wiOlsyLHtcImFwXCI6XzMsXCJhdVwiOl8zLFwiZXVcIjpfMyxcImluXCI6XzMsXCJqcFwiOl8zLFwic2FcIjpfMyxcInVzXCI6XzN9XSxcIm5vZGVhcnRcIjpbMCx7XCJzdGFnZVwiOl8zfV0sXCJwYW50aGVvbnNpdGVcIjpfMyxcInBzdG1uXCI6WzIse1wibW9ja1wiOl8zfV0sXCJwcm90b25ldFwiOl8zLFwicWN4XCI6WzIse1wic3lzXCI6XzZ9XSxcInFvdG9cIjpfMyxcInZhcG9yY2xvdWRcIjpfMyxcIm15cmRieFwiOl8zLFwicmItaG9zdGluZ1wiOl80NixcIm9uLWszc1wiOl82LFwib24tcmlvXCI6XzYsXCJyZWFkdGhlZG9jc1wiOl8zLFwicmVzaW5kZXZpY2VcIjpfMyxcInJlc2luc3RhZ2luZ1wiOlswLHtcImRldmljZXNcIjpfM31dLFwiaHpjXCI6XzMsXCJzYW5kY2F0c1wiOl8zLFwic2NyeXB0ZWRcIjpbMCx7XCJjbGllbnRcIjpfM31dLFwibW8tc2llbWVuc1wiOl8zLFwibGFpclwiOl80MixcInN0b2xvc1wiOl82LFwibXVzaWNpYW5cIjpfMyxcInV0d2VudGVcIjpfMyxcImVkdWdpdFwiOl8zLFwidGVsZWJpdFwiOl8zLFwidGhpbmdkdXN0XCI6WzAse1wiZGV2XCI6XzU2LFwiZGlzcmVjXCI6XzU2LFwicHJvZFwiOl81NyxcInRlc3RpbmdcIjpfNTZ9XSxcInRpY2tldHNcIjpfMyxcIndlYmZsb3dcIjpfMyxcIndlYmZsb3d0ZXN0XCI6XzMsXCJlZGl0b3J4XCI6XzMsXCJ3aXhzdHVkaW9cIjpfMyxcImJhc2ljc2VydmVyXCI6XzMsXCJ2aXJ0dWFsc2VydmVyXCI6XzN9XSxcImlxXCI6XzUsXCJpclwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZ292XCI6XzIsXCJpZFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNjaFwiOl8yLFwieG4tLW1nYmEzYTRmMTZhXCI6XzIsXCJcdTA2MjdcdTA2Q0NcdTA2MzFcdTA2MjdcdTA2NDZcIjpfMixcInhuLS1tZ2JhM2E0ZnJhXCI6XzIsXCJcdTA2MjdcdTA2NEFcdTA2MzFcdTA2MjdcdTA2NDZcIjpfMixcImFydmFuZWRnZVwiOl8zLFwidmlzdGFibG9nXCI6XzN9XSxcImlzXCI6XzIsXCJpdFwiOlsxLHtcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJhYnJcIjpfMixcImFicnV6em9cIjpfMixcImFvc3RhLXZhbGxleVwiOl8yLFwiYW9zdGF2YWxsZXlcIjpfMixcImJhc1wiOl8yLFwiYmFzaWxpY2F0YVwiOl8yLFwiY2FsXCI6XzIsXCJjYWxhYnJpYVwiOl8yLFwiY2FtXCI6XzIsXCJjYW1wYW5pYVwiOl8yLFwiZW1pbGlhLXJvbWFnbmFcIjpfMixcImVtaWxpYXJvbWFnbmFcIjpfMixcImVtclwiOl8yLFwiZnJpdWxpLXYtZ2l1bGlhXCI6XzIsXCJmcml1bGktdmUtZ2l1bGlhXCI6XzIsXCJmcml1bGktdmVnaXVsaWFcIjpfMixcImZyaXVsaS12ZW5lemlhLWdpdWxpYVwiOl8yLFwiZnJpdWxpLXZlbmV6aWFnaXVsaWFcIjpfMixcImZyaXVsaS12Z2l1bGlhXCI6XzIsXCJmcml1bGl2LWdpdWxpYVwiOl8yLFwiZnJpdWxpdmUtZ2l1bGlhXCI6XzIsXCJmcml1bGl2ZWdpdWxpYVwiOl8yLFwiZnJpdWxpdmVuZXppYS1naXVsaWFcIjpfMixcImZyaXVsaXZlbmV6aWFnaXVsaWFcIjpfMixcImZyaXVsaXZnaXVsaWFcIjpfMixcImZ2Z1wiOl8yLFwibGF6XCI6XzIsXCJsYXppb1wiOl8yLFwibGlnXCI6XzIsXCJsaWd1cmlhXCI6XzIsXCJsb21cIjpfMixcImxvbWJhcmRpYVwiOl8yLFwibG9tYmFyZHlcIjpfMixcImx1Y2FuaWFcIjpfMixcIm1hclwiOl8yLFwibWFyY2hlXCI6XzIsXCJtb2xcIjpfMixcIm1vbGlzZVwiOl8yLFwicGllZG1vbnRcIjpfMixcInBpZW1vbnRlXCI6XzIsXCJwbW5cIjpfMixcInB1Z1wiOl8yLFwicHVnbGlhXCI6XzIsXCJzYXJcIjpfMixcInNhcmRlZ25hXCI6XzIsXCJzYXJkaW5pYVwiOl8yLFwic2ljXCI6XzIsXCJzaWNpbGlhXCI6XzIsXCJzaWNpbHlcIjpfMixcInRhYVwiOl8yLFwidG9zXCI6XzIsXCJ0b3NjYW5hXCI6XzIsXCJ0cmVudGluLXN1ZC10aXJvbFwiOl8yLFwieG4tLXRyZW50aW4tc2QtdGlyb2wtcnpiXCI6XzIsXCJ0cmVudGluLXNcdTAwRkNkLXRpcm9sXCI6XzIsXCJ0cmVudGluLXN1ZHRpcm9sXCI6XzIsXCJ4bi0tdHJlbnRpbi1zZHRpcm9sLTd2YlwiOl8yLFwidHJlbnRpbi1zXHUwMEZDZHRpcm9sXCI6XzIsXCJ0cmVudGluLXN1ZWQtdGlyb2xcIjpfMixcInRyZW50aW4tc3VlZHRpcm9sXCI6XzIsXCJ0cmVudGlub1wiOl8yLFwidHJlbnRpbm8tYS1hZGlnZVwiOl8yLFwidHJlbnRpbm8tYWFkaWdlXCI6XzIsXCJ0cmVudGluby1hbHRvLWFkaWdlXCI6XzIsXCJ0cmVudGluby1hbHRvYWRpZ2VcIjpfMixcInRyZW50aW5vLXMtdGlyb2xcIjpfMixcInRyZW50aW5vLXN0aXJvbFwiOl8yLFwidHJlbnRpbm8tc3VkLXRpcm9sXCI6XzIsXCJ4bi0tdHJlbnRpbm8tc2QtdGlyb2wtYzNiXCI6XzIsXCJ0cmVudGluby1zXHUwMEZDZC10aXJvbFwiOl8yLFwidHJlbnRpbm8tc3VkdGlyb2xcIjpfMixcInhuLS10cmVudGluby1zZHRpcm9sLXN6YlwiOl8yLFwidHJlbnRpbm8tc1x1MDBGQ2R0aXJvbFwiOl8yLFwidHJlbnRpbm8tc3VlZC10aXJvbFwiOl8yLFwidHJlbnRpbm8tc3VlZHRpcm9sXCI6XzIsXCJ0cmVudGlub2EtYWRpZ2VcIjpfMixcInRyZW50aW5vYWFkaWdlXCI6XzIsXCJ0cmVudGlub2FsdG8tYWRpZ2VcIjpfMixcInRyZW50aW5vYWx0b2FkaWdlXCI6XzIsXCJ0cmVudGlub3MtdGlyb2xcIjpfMixcInRyZW50aW5vc3Rpcm9sXCI6XzIsXCJ0cmVudGlub3N1ZC10aXJvbFwiOl8yLFwieG4tLXRyZW50aW5vc2QtdGlyb2wtcnpiXCI6XzIsXCJ0cmVudGlub3NcdTAwRkNkLXRpcm9sXCI6XzIsXCJ0cmVudGlub3N1ZHRpcm9sXCI6XzIsXCJ4bi0tdHJlbnRpbm9zZHRpcm9sLTd2YlwiOl8yLFwidHJlbnRpbm9zXHUwMEZDZHRpcm9sXCI6XzIsXCJ0cmVudGlub3N1ZWQtdGlyb2xcIjpfMixcInRyZW50aW5vc3VlZHRpcm9sXCI6XzIsXCJ0cmVudGluc3VkLXRpcm9sXCI6XzIsXCJ4bi0tdHJlbnRpbnNkLXRpcm9sLTZ2YlwiOl8yLFwidHJlbnRpbnNcdTAwRkNkLXRpcm9sXCI6XzIsXCJ0cmVudGluc3VkdGlyb2xcIjpfMixcInhuLS10cmVudGluc2R0aXJvbC1uc2JcIjpfMixcInRyZW50aW5zXHUwMEZDZHRpcm9sXCI6XzIsXCJ0cmVudGluc3VlZC10aXJvbFwiOl8yLFwidHJlbnRpbnN1ZWR0aXJvbFwiOl8yLFwidHVzY2FueVwiOl8yLFwidW1iXCI6XzIsXCJ1bWJyaWFcIjpfMixcInZhbC1kLWFvc3RhXCI6XzIsXCJ2YWwtZGFvc3RhXCI6XzIsXCJ2YWxkLWFvc3RhXCI6XzIsXCJ2YWxkYW9zdGFcIjpfMixcInZhbGxlLWFvc3RhXCI6XzIsXCJ2YWxsZS1kLWFvc3RhXCI6XzIsXCJ2YWxsZS1kYW9zdGFcIjpfMixcInZhbGxlYW9zdGFcIjpfMixcInZhbGxlZC1hb3N0YVwiOl8yLFwidmFsbGVkYW9zdGFcIjpfMixcInZhbGxlZS1hb3N0ZVwiOl8yLFwieG4tLXZhbGxlLWFvc3RlLWViYlwiOl8yLFwidmFsbFx1MDBFOWUtYW9zdGVcIjpfMixcInZhbGxlZS1kLWFvc3RlXCI6XzIsXCJ4bi0tdmFsbGUtZC1hb3N0ZS1laGJcIjpfMixcInZhbGxcdTAwRTllLWQtYW9zdGVcIjpfMixcInZhbGxlZWFvc3RlXCI6XzIsXCJ4bi0tdmFsbGVhb3N0ZS1lN2FcIjpfMixcInZhbGxcdTAwRTllYW9zdGVcIjpfMixcInZhbGxlZWRhb3N0ZVwiOl8yLFwieG4tLXZhbGxlZGFvc3RlLWViYlwiOl8yLFwidmFsbFx1MDBFOWVkYW9zdGVcIjpfMixcInZhb1wiOl8yLFwidmRhXCI6XzIsXCJ2ZW5cIjpfMixcInZlbmV0b1wiOl8yLFwiYWdcIjpfMixcImFncmlnZW50b1wiOl8yLFwiYWxcIjpfMixcImFsZXNzYW5kcmlhXCI6XzIsXCJhbHRvLWFkaWdlXCI6XzIsXCJhbHRvYWRpZ2VcIjpfMixcImFuXCI6XzIsXCJhbmNvbmFcIjpfMixcImFuZHJpYS1iYXJsZXR0YS10cmFuaVwiOl8yLFwiYW5kcmlhLXRyYW5pLWJhcmxldHRhXCI6XzIsXCJhbmRyaWFiYXJsZXR0YXRyYW5pXCI6XzIsXCJhbmRyaWF0cmFuaWJhcmxldHRhXCI6XzIsXCJhb1wiOl8yLFwiYW9zdGFcIjpfMixcImFvc3RlXCI6XzIsXCJhcFwiOl8yLFwiYXFcIjpfMixcImFxdWlsYVwiOl8yLFwiYXJcIjpfMixcImFyZXp6b1wiOl8yLFwiYXNjb2xpLXBpY2Vub1wiOl8yLFwiYXNjb2xpcGljZW5vXCI6XzIsXCJhc3RpXCI6XzIsXCJhdFwiOl8yLFwiYXZcIjpfMixcImF2ZWxsaW5vXCI6XzIsXCJiYVwiOl8yLFwiYmFsc2FuXCI6XzIsXCJiYWxzYW4tc3VkdGlyb2xcIjpfMixcInhuLS1iYWxzYW4tc2R0aXJvbC1uc2JcIjpfMixcImJhbHNhbi1zXHUwMEZDZHRpcm9sXCI6XzIsXCJiYWxzYW4tc3VlZHRpcm9sXCI6XzIsXCJiYXJpXCI6XzIsXCJiYXJsZXR0YS10cmFuaS1hbmRyaWFcIjpfMixcImJhcmxldHRhdHJhbmlhbmRyaWFcIjpfMixcImJlbGx1bm9cIjpfMixcImJlbmV2ZW50b1wiOl8yLFwiYmVyZ2Ftb1wiOl8yLFwiYmdcIjpfMixcImJpXCI6XzIsXCJiaWVsbGFcIjpfMixcImJsXCI6XzIsXCJiblwiOl8yLFwiYm9cIjpfMixcImJvbG9nbmFcIjpfMixcImJvbHphbm9cIjpfMixcImJvbHphbm8tYWx0b2FkaWdlXCI6XzIsXCJib3plblwiOl8yLFwiYm96ZW4tc3VkdGlyb2xcIjpfMixcInhuLS1ib3plbi1zZHRpcm9sLTJvYlwiOl8yLFwiYm96ZW4tc1x1MDBGQ2R0aXJvbFwiOl8yLFwiYm96ZW4tc3VlZHRpcm9sXCI6XzIsXCJiclwiOl8yLFwiYnJlc2NpYVwiOl8yLFwiYnJpbmRpc2lcIjpfMixcImJzXCI6XzIsXCJidFwiOl8yLFwiYnVsc2FuXCI6XzIsXCJidWxzYW4tc3VkdGlyb2xcIjpfMixcInhuLS1idWxzYW4tc2R0aXJvbC1uc2JcIjpfMixcImJ1bHNhbi1zXHUwMEZDZHRpcm9sXCI6XzIsXCJidWxzYW4tc3VlZHRpcm9sXCI6XzIsXCJielwiOl8yLFwiY2FcIjpfMixcImNhZ2xpYXJpXCI6XzIsXCJjYWx0YW5pc3NldHRhXCI6XzIsXCJjYW1waWRhbm8tbWVkaW9cIjpfMixcImNhbXBpZGFub21lZGlvXCI6XzIsXCJjYW1wb2Jhc3NvXCI6XzIsXCJjYXJib25pYS1pZ2xlc2lhc1wiOl8yLFwiY2FyYm9uaWFpZ2xlc2lhc1wiOl8yLFwiY2FycmFyYS1tYXNzYVwiOl8yLFwiY2FycmFyYW1hc3NhXCI6XzIsXCJjYXNlcnRhXCI6XzIsXCJjYXRhbmlhXCI6XzIsXCJjYXRhbnphcm9cIjpfMixcImNiXCI6XzIsXCJjZVwiOl8yLFwiY2VzZW5hLWZvcmxpXCI6XzIsXCJ4bi0tY2VzZW5hLWZvcmwtbWNiXCI6XzIsXCJjZXNlbmEtZm9ybFx1MDBFQ1wiOl8yLFwiY2VzZW5hZm9ybGlcIjpfMixcInhuLS1jZXNlbmFmb3JsLWk4YVwiOl8yLFwiY2VzZW5hZm9ybFx1MDBFQ1wiOl8yLFwiY2hcIjpfMixcImNoaWV0aVwiOl8yLFwiY2lcIjpfMixcImNsXCI6XzIsXCJjblwiOl8yLFwiY29cIjpfMixcImNvbW9cIjpfMixcImNvc2VuemFcIjpfMixcImNyXCI6XzIsXCJjcmVtb25hXCI6XzIsXCJjcm90b25lXCI6XzIsXCJjc1wiOl8yLFwiY3RcIjpfMixcImN1bmVvXCI6XzIsXCJjelwiOl8yLFwiZGVsbC1vZ2xpYXN0cmFcIjpfMixcImRlbGxvZ2xpYXN0cmFcIjpfMixcImVuXCI6XzIsXCJlbm5hXCI6XzIsXCJmY1wiOl8yLFwiZmVcIjpfMixcImZlcm1vXCI6XzIsXCJmZXJyYXJhXCI6XzIsXCJmZ1wiOl8yLFwiZmlcIjpfMixcImZpcmVuemVcIjpfMixcImZsb3JlbmNlXCI6XzIsXCJmbVwiOl8yLFwiZm9nZ2lhXCI6XzIsXCJmb3JsaS1jZXNlbmFcIjpfMixcInhuLS1mb3JsLWNlc2VuYS1mY2JcIjpfMixcImZvcmxcdTAwRUMtY2VzZW5hXCI6XzIsXCJmb3JsaWNlc2VuYVwiOl8yLFwieG4tLWZvcmxjZXNlbmEtYzhhXCI6XzIsXCJmb3JsXHUwMEVDY2VzZW5hXCI6XzIsXCJmclwiOl8yLFwiZnJvc2lub25lXCI6XzIsXCJnZVwiOl8yLFwiZ2Vub2FcIjpfMixcImdlbm92YVwiOl8yLFwiZ29cIjpfMixcImdvcml6aWFcIjpfMixcImdyXCI6XzIsXCJncm9zc2V0b1wiOl8yLFwiaWdsZXNpYXMtY2FyYm9uaWFcIjpfMixcImlnbGVzaWFzY2FyYm9uaWFcIjpfMixcImltXCI6XzIsXCJpbXBlcmlhXCI6XzIsXCJpc1wiOl8yLFwiaXNlcm5pYVwiOl8yLFwia3JcIjpfMixcImxhLXNwZXppYVwiOl8yLFwibGFxdWlsYVwiOl8yLFwibGFzcGV6aWFcIjpfMixcImxhdGluYVwiOl8yLFwibGNcIjpfMixcImxlXCI6XzIsXCJsZWNjZVwiOl8yLFwibGVjY29cIjpfMixcImxpXCI6XzIsXCJsaXZvcm5vXCI6XzIsXCJsb1wiOl8yLFwibG9kaVwiOl8yLFwibHRcIjpfMixcImx1XCI6XzIsXCJsdWNjYVwiOl8yLFwibWFjZXJhdGFcIjpfMixcIm1hbnRvdmFcIjpfMixcIm1hc3NhLWNhcnJhcmFcIjpfMixcIm1hc3NhY2FycmFyYVwiOl8yLFwibWF0ZXJhXCI6XzIsXCJtYlwiOl8yLFwibWNcIjpfMixcIm1lXCI6XzIsXCJtZWRpby1jYW1waWRhbm9cIjpfMixcIm1lZGlvY2FtcGlkYW5vXCI6XzIsXCJtZXNzaW5hXCI6XzIsXCJtaVwiOl8yLFwibWlsYW5cIjpfMixcIm1pbGFub1wiOl8yLFwibW5cIjpfMixcIm1vXCI6XzIsXCJtb2RlbmFcIjpfMixcIm1vbnphXCI6XzIsXCJtb256YS1icmlhbnphXCI6XzIsXCJtb256YS1lLWRlbGxhLWJyaWFuemFcIjpfMixcIm1vbnphYnJpYW56YVwiOl8yLFwibW9uemFlYnJpYW56YVwiOl8yLFwibW9uemFlZGVsbGFicmlhbnphXCI6XzIsXCJtc1wiOl8yLFwibXRcIjpfMixcIm5hXCI6XzIsXCJuYXBsZXNcIjpfMixcIm5hcG9saVwiOl8yLFwibm9cIjpfMixcIm5vdmFyYVwiOl8yLFwibnVcIjpfMixcIm51b3JvXCI6XzIsXCJvZ1wiOl8yLFwib2dsaWFzdHJhXCI6XzIsXCJvbGJpYS10ZW1waW9cIjpfMixcIm9sYmlhdGVtcGlvXCI6XzIsXCJvclwiOl8yLFwib3Jpc3Rhbm9cIjpfMixcIm90XCI6XzIsXCJwYVwiOl8yLFwicGFkb3ZhXCI6XzIsXCJwYWR1YVwiOl8yLFwicGFsZXJtb1wiOl8yLFwicGFybWFcIjpfMixcInBhdmlhXCI6XzIsXCJwY1wiOl8yLFwicGRcIjpfMixcInBlXCI6XzIsXCJwZXJ1Z2lhXCI6XzIsXCJwZXNhcm8tdXJiaW5vXCI6XzIsXCJwZXNhcm91cmJpbm9cIjpfMixcInBlc2NhcmFcIjpfMixcInBnXCI6XzIsXCJwaVwiOl8yLFwicGlhY2VuemFcIjpfMixcInBpc2FcIjpfMixcInBpc3RvaWFcIjpfMixcInBuXCI6XzIsXCJwb1wiOl8yLFwicG9yZGVub25lXCI6XzIsXCJwb3RlbnphXCI6XzIsXCJwclwiOl8yLFwicHJhdG9cIjpfMixcInB0XCI6XzIsXCJwdVwiOl8yLFwicHZcIjpfMixcInB6XCI6XzIsXCJyYVwiOl8yLFwicmFndXNhXCI6XzIsXCJyYXZlbm5hXCI6XzIsXCJyY1wiOl8yLFwicmVcIjpfMixcInJlZ2dpby1jYWxhYnJpYVwiOl8yLFwicmVnZ2lvLWVtaWxpYVwiOl8yLFwicmVnZ2lvY2FsYWJyaWFcIjpfMixcInJlZ2dpb2VtaWxpYVwiOl8yLFwicmdcIjpfMixcInJpXCI6XzIsXCJyaWV0aVwiOl8yLFwicmltaW5pXCI6XzIsXCJybVwiOl8yLFwicm5cIjpfMixcInJvXCI6XzIsXCJyb21hXCI6XzIsXCJyb21lXCI6XzIsXCJyb3ZpZ29cIjpfMixcInNhXCI6XzIsXCJzYWxlcm5vXCI6XzIsXCJzYXNzYXJpXCI6XzIsXCJzYXZvbmFcIjpfMixcInNpXCI6XzIsXCJzaWVuYVwiOl8yLFwic2lyYWN1c2FcIjpfMixcInNvXCI6XzIsXCJzb25kcmlvXCI6XzIsXCJzcFwiOl8yLFwic3JcIjpfMixcInNzXCI6XzIsXCJ4bi0tc2R0aXJvbC1uMmFcIjpfMixcInNcdTAwRkNkdGlyb2xcIjpfMixcInN1ZWR0aXJvbFwiOl8yLFwic3ZcIjpfMixcInRhXCI6XzIsXCJ0YXJhbnRvXCI6XzIsXCJ0ZVwiOl8yLFwidGVtcGlvLW9sYmlhXCI6XzIsXCJ0ZW1waW9vbGJpYVwiOl8yLFwidGVyYW1vXCI6XzIsXCJ0ZXJuaVwiOl8yLFwidG5cIjpfMixcInRvXCI6XzIsXCJ0b3Jpbm9cIjpfMixcInRwXCI6XzIsXCJ0clwiOl8yLFwidHJhbmktYW5kcmlhLWJhcmxldHRhXCI6XzIsXCJ0cmFuaS1iYXJsZXR0YS1hbmRyaWFcIjpfMixcInRyYW5pYW5kcmlhYmFybGV0dGFcIjpfMixcInRyYW5pYmFybGV0dGFhbmRyaWFcIjpfMixcInRyYXBhbmlcIjpfMixcInRyZW50b1wiOl8yLFwidHJldmlzb1wiOl8yLFwidHJpZXN0ZVwiOl8yLFwidHNcIjpfMixcInR1cmluXCI6XzIsXCJ0dlwiOl8yLFwidWRcIjpfMixcInVkaW5lXCI6XzIsXCJ1cmJpbm8tcGVzYXJvXCI6XzIsXCJ1cmJpbm9wZXNhcm9cIjpfMixcInZhXCI6XzIsXCJ2YXJlc2VcIjpfMixcInZiXCI6XzIsXCJ2Y1wiOl8yLFwidmVcIjpfMixcInZlbmV6aWFcIjpfMixcInZlbmljZVwiOl8yLFwidmVyYmFuaWFcIjpfMixcInZlcmNlbGxpXCI6XzIsXCJ2ZXJvbmFcIjpfMixcInZpXCI6XzIsXCJ2aWJvLXZhbGVudGlhXCI6XzIsXCJ2aWJvdmFsZW50aWFcIjpfMixcInZpY2VuemFcIjpfMixcInZpdGVyYm9cIjpfMixcInZyXCI6XzIsXCJ2c1wiOl8yLFwidnRcIjpfMixcInZ2XCI6XzIsXCIxMmNoYXJzXCI6XzMsXCJpYnhvc1wiOl8zLFwiaWxpYWRib3hvc1wiOl8zLFwibmVlblwiOlswLHtcImpjXCI6XzN9XSxcIjEyM2hvbWVwYWdlXCI6XzMsXCIxNi1iXCI6XzMsXCIzMi1iXCI6XzMsXCI2NC1iXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcInN5bmNsb3VkXCI6XzN9XSxcImplXCI6WzEse1wiY29cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJvZlwiOl8zfV0sXCJqbVwiOl8yMCxcImpvXCI6WzEse1wiYWdyaVwiOl8yLFwiYWlcIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJlbmdcIjpfMixcImZtXCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInBlclwiOl8yLFwicGhkXCI6XzIsXCJzY2hcIjpfMixcInR2XCI6XzJ9XSxcImpvYnNcIjpfMixcImpwXCI6WzEse1wiYWNcIjpfMixcImFkXCI6XzIsXCJjb1wiOl8yLFwiZWRcIjpfMixcImdvXCI6XzIsXCJnclwiOl8yLFwibGdcIjpfMixcIm5lXCI6WzEse1wiYXNlaW5ldFwiOl81MyxcImdlaGlyblwiOl8zLFwiaXZvcnlcIjpfMyxcIm1haWwtYm94XCI6XzMsXCJtaW50c1wiOl8zLFwibW9rdXJlblwiOl8zLFwib3BhbFwiOl8zLFwic2FrdXJhXCI6XzMsXCJzdW1vbW9cIjpfMyxcInRvcGF6XCI6XzN9XSxcIm9yXCI6XzIsXCJhaWNoaVwiOlsxLHtcImFpc2FpXCI6XzIsXCJhbWFcIjpfMixcImFuam9cIjpfMixcImFzdWtlXCI6XzIsXCJjaGlyeXVcIjpfMixcImNoaXRhXCI6XzIsXCJmdXNvXCI6XzIsXCJnYW1hZ29yaVwiOl8yLFwiaGFuZGFcIjpfMixcImhhenVcIjpfMixcImhla2luYW5cIjpfMixcImhpZ2FzaGl1cmFcIjpfMixcImljaGlub21peWFcIjpfMixcImluYXphd2FcIjpfMixcImludXlhbWFcIjpfMixcImlzc2hpa2lcIjpfMixcIml3YWt1cmFcIjpfMixcImthbmllXCI6XzIsXCJrYXJpeWFcIjpfMixcImthc3VnYWlcIjpfMixcImtpcmFcIjpfMixcImtpeW9zdVwiOl8yLFwia29tYWtpXCI6XzIsXCJrb25hblwiOl8yLFwia290YVwiOl8yLFwibWloYW1hXCI6XzIsXCJtaXlvc2hpXCI6XzIsXCJuaXNoaW9cIjpfMixcIm5pc3NoaW5cIjpfMixcIm9idVwiOl8yLFwib2d1Y2hpXCI6XzIsXCJvaGFydVwiOl8yLFwib2themFraVwiOl8yLFwib3dhcmlhc2FoaVwiOl8yLFwic2V0b1wiOl8yLFwic2hpa2F0c3VcIjpfMixcInNoaW5zaGlyb1wiOl8yLFwic2hpdGFyYVwiOl8yLFwidGFoYXJhXCI6XzIsXCJ0YWthaGFtYVwiOl8yLFwidG9iaXNoaW1hXCI6XzIsXCJ0b2VpXCI6XzIsXCJ0b2dvXCI6XzIsXCJ0b2thaVwiOl8yLFwidG9rb25hbWVcIjpfMixcInRveW9ha2VcIjpfMixcInRveW9oYXNoaVwiOl8yLFwidG95b2thd2FcIjpfMixcInRveW9uZVwiOl8yLFwidG95b3RhXCI6XzIsXCJ0c3VzaGltYVwiOl8yLFwieWF0b21pXCI6XzJ9XSxcImFraXRhXCI6WzEse1wiYWtpdGFcIjpfMixcImRhaXNlblwiOl8yLFwiZnVqaXNhdG9cIjpfMixcImdvam9tZVwiOl8yLFwiaGFjaGlyb2dhdGFcIjpfMixcImhhcHBvdVwiOl8yLFwiaGlnYXNoaW5hcnVzZVwiOl8yLFwiaG9uam9cIjpfMixcImhvbmp5b1wiOl8yLFwiaWthd2FcIjpfMixcImthbWlrb2FuaVwiOl8yLFwia2FtaW9rYVwiOl8yLFwia2F0YWdhbWlcIjpfMixcImthenVub1wiOl8yLFwia2l0YWFraXRhXCI6XzIsXCJrb3Nha2FcIjpfMixcImt5b3dhXCI6XzIsXCJtaXNhdG9cIjpfMixcIm1pdGFuZVwiOl8yLFwibW9yaXlvc2hpXCI6XzIsXCJuaWthaG9cIjpfMixcIm5vc2hpcm9cIjpfMixcIm9kYXRlXCI6XzIsXCJvZ2FcIjpfMixcIm9nYXRhXCI6XzIsXCJzZW1ib2t1XCI6XzIsXCJ5b2tvdGVcIjpfMixcInl1cmlob25qb1wiOl8yfV0sXCJhb21vcmlcIjpbMSx7XCJhb21vcmlcIjpfMixcImdvbm9oZVwiOl8yLFwiaGFjaGlub2hlXCI6XzIsXCJoYXNoaWthbWlcIjpfMixcImhpcmFuYWlcIjpfMixcImhpcm9zYWtpXCI6XzIsXCJpdGF5YW5hZ2lcIjpfMixcImt1cm9pc2hpXCI6XzIsXCJtaXNhd2FcIjpfMixcIm11dHN1XCI6XzIsXCJuYWthZG9tYXJpXCI6XzIsXCJub2hlamlcIjpfMixcIm9pcmFzZVwiOl8yLFwib3dhbmlcIjpfMixcInJva3Vub2hlXCI6XzIsXCJzYW5ub2hlXCI6XzIsXCJzaGljaGlub2hlXCI6XzIsXCJzaGluZ29cIjpfMixcInRha2tvXCI6XzIsXCJ0b3dhZGFcIjpfMixcInRzdWdhcnVcIjpfMixcInRzdXJ1dGFcIjpfMn1dLFwiY2hpYmFcIjpbMSx7XCJhYmlrb1wiOl8yLFwiYXNhaGlcIjpfMixcImNob25hblwiOl8yLFwiY2hvc2VpXCI6XzIsXCJjaG9zaGlcIjpfMixcImNodW9cIjpfMixcImZ1bmFiYXNoaVwiOl8yLFwiZnV0dHN1XCI6XzIsXCJoYW5hbWlnYXdhXCI6XzIsXCJpY2hpaGFyYVwiOl8yLFwiaWNoaWthd2FcIjpfMixcImljaGlub21peWFcIjpfMixcImluemFpXCI6XzIsXCJpc3VtaVwiOl8yLFwia2FtYWdheWFcIjpfMixcImthbW9nYXdhXCI6XzIsXCJrYXNoaXdhXCI6XzIsXCJrYXRvcmlcIjpfMixcImthdHN1dXJhXCI6XzIsXCJraW1pdHN1XCI6XzIsXCJraXNhcmF6dVwiOl8yLFwia296YWtpXCI6XzIsXCJrdWp1a3VyaVwiOl8yLFwia3lvbmFuXCI6XzIsXCJtYXRzdWRvXCI6XzIsXCJtaWRvcmlcIjpfMixcIm1paGFtYVwiOl8yLFwibWluYW1pYm9zb1wiOl8yLFwibW9iYXJhXCI6XzIsXCJtdXRzdXphd2FcIjpfMixcIm5hZ2FyYVwiOl8yLFwibmFnYXJleWFtYVwiOl8yLFwibmFyYXNoaW5vXCI6XzIsXCJuYXJpdGFcIjpfMixcIm5vZGFcIjpfMixcIm9hbWlzaGlyYXNhdG9cIjpfMixcIm9taWdhd2FcIjpfMixcIm9uanVrdVwiOl8yLFwib3Rha2lcIjpfMixcInNha2FlXCI6XzIsXCJzYWt1cmFcIjpfMixcInNoaW1vZnVzYVwiOl8yLFwic2hpcmFrb1wiOl8yLFwic2hpcm9pXCI6XzIsXCJzaGlzdWlcIjpfMixcInNvZGVnYXVyYVwiOl8yLFwic29zYVwiOl8yLFwidGFrb1wiOl8yLFwidGF0ZXlhbWFcIjpfMixcInRvZ2FuZVwiOl8yLFwidG9obm9zaG9cIjpfMixcInRvbWlzYXRvXCI6XzIsXCJ1cmF5YXN1XCI6XzIsXCJ5YWNoaW1hdGFcIjpfMixcInlhY2hpeW9cIjpfMixcInlva2FpY2hpYmFcIjpfMixcInlva29zaGliYWhpa2FyaVwiOl8yLFwieW90c3VrYWlkb1wiOl8yfV0sXCJlaGltZVwiOlsxLHtcImFpbmFuXCI6XzIsXCJob25haVwiOl8yLFwiaWthdGFcIjpfMixcImltYWJhcmlcIjpfMixcIml5b1wiOl8yLFwia2FtaWppbWFcIjpfMixcImtpaG9rdVwiOl8yLFwia3VtYWtvZ2VuXCI6XzIsXCJtYXNha2lcIjpfMixcIm1hdHN1bm9cIjpfMixcIm1hdHN1eWFtYVwiOl8yLFwibmFtaWthdGFcIjpfMixcIm5paWhhbWFcIjpfMixcIm96dVwiOl8yLFwic2Fpam9cIjpfMixcInNlaXlvXCI6XzIsXCJzaGlrb2t1Y2h1b1wiOl8yLFwidG9iZVwiOl8yLFwidG9vblwiOl8yLFwidWNoaWtvXCI6XzIsXCJ1d2FqaW1hXCI6XzIsXCJ5YXdhdGFoYW1hXCI6XzJ9XSxcImZ1a3VpXCI6WzEse1wiZWNoaXplblwiOl8yLFwiZWloZWlqaVwiOl8yLFwiZnVrdWlcIjpfMixcImlrZWRhXCI6XzIsXCJrYXRzdXlhbWFcIjpfMixcIm1paGFtYVwiOl8yLFwibWluYW1pZWNoaXplblwiOl8yLFwib2JhbWFcIjpfMixcIm9oaVwiOl8yLFwib25vXCI6XzIsXCJzYWJhZVwiOl8yLFwic2FrYWlcIjpfMixcInRha2FoYW1hXCI6XzIsXCJ0c3VydWdhXCI6XzIsXCJ3YWthc2FcIjpfMn1dLFwiZnVrdW9rYVwiOlsxLHtcImFzaGl5YVwiOl8yLFwiYnV6ZW5cIjpfMixcImNoaWt1Z29cIjpfMixcImNoaWt1aG9cIjpfMixcImNoaWt1am9cIjpfMixcImNoaWt1c2hpbm9cIjpfMixcImNoaWt1emVuXCI6XzIsXCJjaHVvXCI6XzIsXCJkYXphaWZ1XCI6XzIsXCJmdWt1Y2hpXCI6XzIsXCJoYWthdGFcIjpfMixcImhpZ2FzaGlcIjpfMixcImhpcm9rYXdhXCI6XzIsXCJoaXNheWFtYVwiOl8yLFwiaWl6dWthXCI6XzIsXCJpbmF0c3VraVwiOl8yLFwia2Fob1wiOl8yLFwia2FzdWdhXCI6XzIsXCJrYXN1eWFcIjpfMixcImthd2FyYVwiOl8yLFwia2Vpc2VuXCI6XzIsXCJrb2dhXCI6XzIsXCJrdXJhdGVcIjpfMixcImt1cm9naVwiOl8yLFwia3VydW1lXCI6XzIsXCJtaW5hbWlcIjpfMixcIm1peWFrb1wiOl8yLFwibWl5YW1hXCI6XzIsXCJtaXlhd2FrYVwiOl8yLFwibWl6dW1ha2lcIjpfMixcIm11bmFrYXRhXCI6XzIsXCJuYWthZ2F3YVwiOl8yLFwibmFrYW1hXCI6XzIsXCJuaXNoaVwiOl8yLFwibm9nYXRhXCI6XzIsXCJvZ29yaVwiOl8yLFwib2thZ2FraVwiOl8yLFwib2thd2FcIjpfMixcIm9raVwiOl8yLFwib211dGFcIjpfMixcIm9uZ2FcIjpfMixcIm9ub2pvXCI6XzIsXCJvdG9cIjpfMixcInNhaWdhd2FcIjpfMixcInNhc2FndXJpXCI6XzIsXCJzaGluZ3VcIjpfMixcInNoaW55b3NoaXRvbWlcIjpfMixcInNob25haVwiOl8yLFwic29lZGFcIjpfMixcInN1ZVwiOl8yLFwidGFjaGlhcmFpXCI6XzIsXCJ0YWdhd2FcIjpfMixcInRha2F0YVwiOl8yLFwidG9ob1wiOl8yLFwidG95b3RzdVwiOl8yLFwidHN1aWtpXCI6XzIsXCJ1a2loYVwiOl8yLFwidW1pXCI6XzIsXCJ1c3VpXCI6XzIsXCJ5YW1hZGFcIjpfMixcInlhbWVcIjpfMixcInlhbmFnYXdhXCI6XzIsXCJ5dWt1aGFzaGlcIjpfMn1dLFwiZnVrdXNoaW1hXCI6WzEse1wiYWl6dWJhbmdlXCI6XzIsXCJhaXp1bWlzYXRvXCI6XzIsXCJhaXp1d2FrYW1hdHN1XCI6XzIsXCJhc2FrYXdhXCI6XzIsXCJiYW5kYWlcIjpfMixcImRhdGVcIjpfMixcImZ1a3VzaGltYVwiOl8yLFwiZnVydWRvbm9cIjpfMixcImZ1dGFiYVwiOl8yLFwiaGFuYXdhXCI6XzIsXCJoaWdhc2hpXCI6XzIsXCJoaXJhdGFcIjpfMixcImhpcm9ub1wiOl8yLFwiaWl0YXRlXCI6XzIsXCJpbmF3YXNoaXJvXCI6XzIsXCJpc2hpa2F3YVwiOl8yLFwiaXdha2lcIjpfMixcIml6dW1pemFraVwiOl8yLFwia2FnYW1paXNoaVwiOl8yLFwia2FuZXlhbWFcIjpfMixcImthd2FtYXRhXCI6XzIsXCJraXRha2F0YVwiOl8yLFwia2l0YXNoaW9iYXJhXCI6XzIsXCJrb29yaVwiOl8yLFwia29yaXlhbWFcIjpfMixcImt1bmltaVwiOl8yLFwibWloYXJ1XCI6XzIsXCJtaXNoaW1hXCI6XzIsXCJuYW1pZVwiOl8yLFwibmFuZ29cIjpfMixcIm5pc2hpYWl6dVwiOl8yLFwibmlzaGlnb1wiOl8yLFwib2t1bWFcIjpfMixcIm9tb3RlZ29cIjpfMixcIm9ub1wiOl8yLFwib3RhbWFcIjpfMixcInNhbWVnYXdhXCI6XzIsXCJzaGltb2dvXCI6XzIsXCJzaGlyYWthd2FcIjpfMixcInNob3dhXCI6XzIsXCJzb21hXCI6XzIsXCJzdWthZ2F3YVwiOl8yLFwidGFpc2hpblwiOl8yLFwidGFtYWthd2FcIjpfMixcInRhbmFndXJhXCI6XzIsXCJ0ZW5laVwiOl8yLFwieWFidWtpXCI6XzIsXCJ5YW1hdG9cIjpfMixcInlhbWF0c3VyaVwiOl8yLFwieWFuYWl6dVwiOl8yLFwieXVnYXdhXCI6XzJ9XSxcImdpZnVcIjpbMSx7XCJhbnBhY2hpXCI6XzIsXCJlbmFcIjpfMixcImdpZnVcIjpfMixcImdpbmFuXCI6XzIsXCJnb2RvXCI6XzIsXCJndWpvXCI6XzIsXCJoYXNoaW1hXCI6XzIsXCJoaWNoaXNvXCI6XzIsXCJoaWRhXCI6XzIsXCJoaWdhc2hpc2hpcmFrYXdhXCI6XzIsXCJpYmlnYXdhXCI6XzIsXCJpa2VkYVwiOl8yLFwia2FrYW1pZ2FoYXJhXCI6XzIsXCJrYW5pXCI6XzIsXCJrYXNhaGFyYVwiOl8yLFwia2FzYW1hdHN1XCI6XzIsXCJrYXdhdWVcIjpfMixcImtpdGFnYXRhXCI6XzIsXCJtaW5vXCI6XzIsXCJtaW5va2Ftb1wiOl8yLFwibWl0YWtlXCI6XzIsXCJtaXp1bmFtaVwiOl8yLFwibW90b3N1XCI6XzIsXCJuYWthdHN1Z2F3YVwiOl8yLFwib2dha2lcIjpfMixcInNha2Fob2dpXCI6XzIsXCJzZWtpXCI6XzIsXCJzZWtpZ2FoYXJhXCI6XzIsXCJzaGlyYWthd2FcIjpfMixcInRhamltaVwiOl8yLFwidGFrYXlhbWFcIjpfMixcInRhcnVpXCI6XzIsXCJ0b2tpXCI6XzIsXCJ0b21pa2FcIjpfMixcIndhbm91Y2hpXCI6XzIsXCJ5YW1hZ2F0YVwiOl8yLFwieWFvdHN1XCI6XzIsXCJ5b3JvXCI6XzJ9XSxcImd1bm1hXCI6WzEse1wiYW5uYWthXCI6XzIsXCJjaGl5b2RhXCI6XzIsXCJmdWppb2thXCI6XzIsXCJoaWdhc2hpYWdhdHN1bWFcIjpfMixcImlzZXNha2lcIjpfMixcIml0YWt1cmFcIjpfMixcImthbm5hXCI6XzIsXCJrYW5yYVwiOl8yLFwia2F0YXNoaW5hXCI6XzIsXCJrYXdhYmFcIjpfMixcImtpcnl1XCI6XzIsXCJrdXNhdHN1XCI6XzIsXCJtYWViYXNoaVwiOl8yLFwibWVpd2FcIjpfMixcIm1pZG9yaVwiOl8yLFwibWluYWthbWlcIjpfMixcIm5hZ2Fub2hhcmFcIjpfMixcIm5ha2Fub2pvXCI6XzIsXCJuYW5tb2t1XCI6XzIsXCJudW1hdGFcIjpfMixcIm9penVtaVwiOl8yLFwib3JhXCI6XzIsXCJvdGFcIjpfMixcInNoaWJ1a2F3YVwiOl8yLFwic2hpbW9uaXRhXCI6XzIsXCJzaGludG9cIjpfMixcInNob3dhXCI6XzIsXCJ0YWthc2FraVwiOl8yLFwidGFrYXlhbWFcIjpfMixcInRhbWFtdXJhXCI6XzIsXCJ0YXRlYmF5YXNoaVwiOl8yLFwidG9taW9rYVwiOl8yLFwidHN1a2l5b25vXCI6XzIsXCJ0c3VtYWdvaVwiOl8yLFwidWVub1wiOl8yLFwieW9zaGlva2FcIjpfMn1dLFwiaGlyb3NoaW1hXCI6WzEse1wiYXNhbWluYW1pXCI6XzIsXCJkYWl3YVwiOl8yLFwiZXRhamltYVwiOl8yLFwiZnVjaHVcIjpfMixcImZ1a3V5YW1hXCI6XzIsXCJoYXRzdWthaWNoaVwiOl8yLFwiaGlnYXNoaWhpcm9zaGltYVwiOl8yLFwiaG9uZ29cIjpfMixcImppbnNla2lrb2dlblwiOl8yLFwia2FpdGFcIjpfMixcImt1aVwiOl8yLFwia3VtYW5vXCI6XzIsXCJrdXJlXCI6XzIsXCJtaWhhcmFcIjpfMixcIm1peW9zaGlcIjpfMixcIm5ha2FcIjpfMixcIm9ub21pY2hpXCI6XzIsXCJvc2FraWthbWlqaW1hXCI6XzIsXCJvdGFrZVwiOl8yLFwic2FrYVwiOl8yLFwic2VyYVwiOl8yLFwic2VyYW5pc2hpXCI6XzIsXCJzaGluaWNoaVwiOl8yLFwic2hvYmFyYVwiOl8yLFwidGFrZWhhcmFcIjpfMn1dLFwiaG9ra2FpZG9cIjpbMSx7XCJhYmFzaGlyaVwiOl8yLFwiYWJpcmFcIjpfMixcImFpYmV0c3VcIjpfMixcImFrYWJpcmFcIjpfMixcImFra2VzaGlcIjpfMixcImFzYWhpa2F3YVwiOl8yLFwiYXNoaWJldHN1XCI6XzIsXCJhc2hvcm9cIjpfMixcImFzc2FidVwiOl8yLFwiYXRzdW1hXCI6XzIsXCJiaWJhaVwiOl8yLFwiYmllaVwiOl8yLFwiYmlmdWthXCI6XzIsXCJiaWhvcm9cIjpfMixcImJpcmF0b3JpXCI6XzIsXCJjaGlwcHViZXRzdVwiOl8yLFwiY2hpdG9zZVwiOl8yLFwiZGF0ZVwiOl8yLFwiZWJldHN1XCI6XzIsXCJlbWJldHN1XCI6XzIsXCJlbml3YVwiOl8yLFwiZXJpbW9cIjpfMixcImVzYW5cIjpfMixcImVzYXNoaVwiOl8yLFwiZnVrYWdhd2FcIjpfMixcImZ1a3VzaGltYVwiOl8yLFwiZnVyYW5vXCI6XzIsXCJmdXJ1YmlyYVwiOl8yLFwiaGFib3JvXCI6XzIsXCJoYWtvZGF0ZVwiOl8yLFwiaGFtYXRvbmJldHN1XCI6XzIsXCJoaWRha2FcIjpfMixcImhpZ2FzaGlrYWd1cmFcIjpfMixcImhpZ2FzaGlrYXdhXCI6XzIsXCJoaXJvb1wiOl8yLFwiaG9rdXJ5dVwiOl8yLFwiaG9rdXRvXCI6XzIsXCJob25iZXRzdVwiOl8yLFwiaG9yb2thbmFpXCI6XzIsXCJob3Jvbm9iZVwiOl8yLFwiaWtlZGFcIjpfMixcImltYWthbmVcIjpfMixcImlzaGlrYXJpXCI6XzIsXCJpd2FtaXphd2FcIjpfMixcIml3YW5haVwiOl8yLFwia2FtaWZ1cmFub1wiOl8yLFwia2FtaWthd2FcIjpfMixcImthbWlzaGlob3JvXCI6XzIsXCJrYW1pc3VuYWdhd2FcIjpfMixcImthbW9lbmFpXCI6XzIsXCJrYXlhYmVcIjpfMixcImtlbWJ1Y2hpXCI6XzIsXCJraWtvbmFpXCI6XzIsXCJraW1vYmV0c3VcIjpfMixcImtpdGFoaXJvc2hpbWFcIjpfMixcImtpdGFtaVwiOl8yLFwia2l5b3NhdG9cIjpfMixcImtvc2hpbWl6dVwiOl8yLFwia3VubmVwcHVcIjpfMixcImt1cml5YW1hXCI6XzIsXCJrdXJvbWF0c3VuYWlcIjpfMixcImt1c2hpcm9cIjpfMixcImt1dGNoYW5cIjpfMixcImt5b3dhXCI6XzIsXCJtYXNoaWtlXCI6XzIsXCJtYXRzdW1hZVwiOl8yLFwibWlrYXNhXCI6XzIsXCJtaW5hbWlmdXJhbm9cIjpfMixcIm1vbWJldHN1XCI6XzIsXCJtb3NldXNoaVwiOl8yLFwibXVrYXdhXCI6XzIsXCJtdXJvcmFuXCI6XzIsXCJuYWllXCI6XzIsXCJuYWthZ2F3YVwiOl8yLFwibmFrYXNhdHN1bmFpXCI6XzIsXCJuYWthdG9tYmV0c3VcIjpfMixcIm5hbmFlXCI6XzIsXCJuYW5wb3JvXCI6XzIsXCJuYXlvcm9cIjpfMixcIm5lbXVyb1wiOl8yLFwibmlpa2FwcHVcIjpfMixcIm5pa2lcIjpfMixcIm5pc2hpb2tvcHBlXCI6XzIsXCJub2JvcmliZXRzdVwiOl8yLFwibnVtYXRhXCI6XzIsXCJvYmloaXJvXCI6XzIsXCJvYmlyYVwiOl8yLFwib2tldG9cIjpfMixcIm9rb3BwZVwiOl8yLFwib3RhcnVcIjpfMixcIm90b2JlXCI6XzIsXCJvdG9mdWtlXCI6XzIsXCJvdG9pbmVwcHVcIjpfMixcIm91bXVcIjpfMixcIm96b3JhXCI6XzIsXCJwaXBwdVwiOl8yLFwicmFua29zaGlcIjpfMixcInJlYnVuXCI6XzIsXCJyaWt1YmV0c3VcIjpfMixcInJpc2hpcmlcIjpfMixcInJpc2hpcmlmdWppXCI6XzIsXCJzYXJvbWFcIjpfMixcInNhcnVmdXRzdVwiOl8yLFwic2hha290YW5cIjpfMixcInNoYXJpXCI6XzIsXCJzaGliZWNoYVwiOl8yLFwic2hpYmV0c3VcIjpfMixcInNoaWthYmVcIjpfMixcInNoaWthb2lcIjpfMixcInNoaW1hbWFraVwiOl8yLFwic2hpbWl6dVwiOl8yLFwic2hpbW9rYXdhXCI6XzIsXCJzaGluc2hpbm90c3VcIjpfMixcInNoaW50b2t1XCI6XzIsXCJzaGlyYW51a2FcIjpfMixcInNoaXJhb2lcIjpfMixcInNoaXJpdWNoaVwiOl8yLFwic29iZXRzdVwiOl8yLFwic3VuYWdhd2FcIjpfMixcInRhaWtpXCI6XzIsXCJ0YWthc3VcIjpfMixcInRha2lrYXdhXCI6XzIsXCJ0YWtpbm91ZVwiOl8yLFwidGVzaGlrYWdhXCI6XzIsXCJ0b2JldHN1XCI6XzIsXCJ0b2htYVwiOl8yLFwidG9tYWtvbWFpXCI6XzIsXCJ0b21hcmlcIjpfMixcInRveWFcIjpfMixcInRveWFrb1wiOl8yLFwidG95b3RvbWlcIjpfMixcInRveW91cmFcIjpfMixcInRzdWJldHN1XCI6XzIsXCJ0c3VraWdhdGFcIjpfMixcInVyYWthd2FcIjpfMixcInVyYXVzdVwiOl8yLFwidXJ5dVwiOl8yLFwidXRhc2hpbmFpXCI6XzIsXCJ3YWtrYW5haVwiOl8yLFwid2Fzc2FtdVwiOl8yLFwieWFrdW1vXCI6XzIsXCJ5b2ljaGlcIjpfMn1dLFwiaHlvZ29cIjpbMSx7XCJhaW9pXCI6XzIsXCJha2FzaGlcIjpfMixcImFrb1wiOl8yLFwiYW1hZ2FzYWtpXCI6XzIsXCJhb2dha2lcIjpfMixcImFzYWdvXCI6XzIsXCJhc2hpeWFcIjpfMixcImF3YWppXCI6XzIsXCJmdWt1c2FraVwiOl8yLFwiZ29zaGlraVwiOl8yLFwiaGFyaW1hXCI6XzIsXCJoaW1lamlcIjpfMixcImljaGlrYXdhXCI6XzIsXCJpbmFnYXdhXCI6XzIsXCJpdGFtaVwiOl8yLFwia2Frb2dhd2FcIjpfMixcImthbWlnb3JpXCI6XzIsXCJrYW1pa2F3YVwiOl8yLFwia2FzYWlcIjpfMixcImthc3VnYVwiOl8yLFwia2F3YW5pc2hpXCI6XzIsXCJtaWtpXCI6XzIsXCJtaW5hbWlhd2FqaVwiOl8yLFwibmlzaGlub21peWFcIjpfMixcIm5pc2hpd2FraVwiOl8yLFwib25vXCI6XzIsXCJzYW5kYVwiOl8yLFwic2FubmFuXCI6XzIsXCJzYXNheWFtYVwiOl8yLFwic2F5b1wiOl8yLFwic2hpbmd1XCI6XzIsXCJzaGlub25zZW5cIjpfMixcInNoaXNvXCI6XzIsXCJzdW1vdG9cIjpfMixcInRhaXNoaVwiOl8yLFwidGFrYVwiOl8yLFwidGFrYXJhenVrYVwiOl8yLFwidGFrYXNhZ29cIjpfMixcInRha2lub1wiOl8yLFwidGFtYmFcIjpfMixcInRhdHN1bm9cIjpfMixcInRveW9va2FcIjpfMixcInlhYnVcIjpfMixcInlhc2hpcm9cIjpfMixcInlva2FcIjpfMixcInlva2F3YVwiOl8yfV0sXCJpYmFyYWtpXCI6WzEse1wiYW1pXCI6XzIsXCJhc2FoaVwiOl8yLFwiYmFuZG9cIjpfMixcImNoaWt1c2VpXCI6XzIsXCJkYWlnb1wiOl8yLFwiZnVqaXNoaXJvXCI6XzIsXCJoaXRhY2hpXCI6XzIsXCJoaXRhY2hpbmFrYVwiOl8yLFwiaGl0YWNoaW9taXlhXCI6XzIsXCJoaXRhY2hpb3RhXCI6XzIsXCJpYmFyYWtpXCI6XzIsXCJpbmFcIjpfMixcImluYXNoaWtpXCI6XzIsXCJpdGFrb1wiOl8yLFwiaXdhbWFcIjpfMixcImpvc29cIjpfMixcImthbWlzdVwiOl8yLFwia2FzYW1hXCI6XzIsXCJrYXNoaW1hXCI6XzIsXCJrYXN1bWlnYXVyYVwiOl8yLFwia29nYVwiOl8yLFwibWlob1wiOl8yLFwibWl0b1wiOl8yLFwibW9yaXlhXCI6XzIsXCJuYWthXCI6XzIsXCJuYW1lZ2F0YVwiOl8yLFwib2FyYWlcIjpfMixcIm9nYXdhXCI6XzIsXCJvbWl0YW1hXCI6XzIsXCJyeXVnYXNha2lcIjpfMixcInNha2FpXCI6XzIsXCJzYWt1cmFnYXdhXCI6XzIsXCJzaGltb2RhdGVcIjpfMixcInNoaW1vdHN1bWFcIjpfMixcInNoaXJvc2F0b1wiOl8yLFwic293YVwiOl8yLFwic3VpZnVcIjpfMixcInRha2FoYWdpXCI6XzIsXCJ0YW1hdHN1a3VyaVwiOl8yLFwidG9rYWlcIjpfMixcInRvbW9iZVwiOl8yLFwidG9uZVwiOl8yLFwidG9yaWRlXCI6XzIsXCJ0c3VjaGl1cmFcIjpfMixcInRzdWt1YmFcIjpfMixcInVjaGloYXJhXCI6XzIsXCJ1c2hpa3VcIjpfMixcInlhY2hpeW9cIjpfMixcInlhbWFnYXRhXCI6XzIsXCJ5YXdhcmFcIjpfMixcInl1a2lcIjpfMn1dLFwiaXNoaWthd2FcIjpbMSx7XCJhbmFtaXp1XCI6XzIsXCJoYWt1aVwiOl8yLFwiaGFrdXNhblwiOl8yLFwia2FnYVwiOl8yLFwia2Fob2t1XCI6XzIsXCJrYW5hemF3YVwiOl8yLFwia2F3YWtpdGFcIjpfMixcImtvbWF0c3VcIjpfMixcIm5ha2Fub3RvXCI6XzIsXCJuYW5hb1wiOl8yLFwibm9taVwiOl8yLFwibm9ub2ljaGlcIjpfMixcIm5vdG9cIjpfMixcInNoaWthXCI6XzIsXCJzdXp1XCI6XzIsXCJ0c3ViYXRhXCI6XzIsXCJ0c3VydWdpXCI6XzIsXCJ1Y2hpbmFkYVwiOl8yLFwid2FqaW1hXCI6XzJ9XSxcIml3YXRlXCI6WzEse1wiZnVkYWlcIjpfMixcImZ1amlzYXdhXCI6XzIsXCJoYW5hbWFraVwiOl8yLFwiaGlyYWl6dW1pXCI6XzIsXCJoaXJvbm9cIjpfMixcImljaGlub2hlXCI6XzIsXCJpY2hpbm9zZWtpXCI6XzIsXCJpd2FpenVtaVwiOl8yLFwiaXdhdGVcIjpfMixcImpvYm9qaVwiOl8yLFwia2FtYWlzaGlcIjpfMixcImthbmVnYXNha2lcIjpfMixcImthcnVtYWlcIjpfMixcImthd2FpXCI6XzIsXCJraXRha2FtaVwiOl8yLFwia3VqaVwiOl8yLFwia3Vub2hlXCI6XzIsXCJrdXp1bWFraVwiOl8yLFwibWl5YWtvXCI6XzIsXCJtaXp1c2F3YVwiOl8yLFwibW9yaW9rYVwiOl8yLFwibmlub2hlXCI6XzIsXCJub2RhXCI6XzIsXCJvZnVuYXRvXCI6XzIsXCJvc2h1XCI6XzIsXCJvdHN1Y2hpXCI6XzIsXCJyaWt1emVudGFrYXRhXCI6XzIsXCJzaGl3YVwiOl8yLFwic2hpenVrdWlzaGlcIjpfMixcInN1bWl0YVwiOl8yLFwidGFub2hhdGFcIjpfMixcInRvbm9cIjpfMixcInlhaGFiYVwiOl8yLFwieWFtYWRhXCI6XzJ9XSxcImthZ2F3YVwiOlsxLHtcImF5YWdhd2FcIjpfMixcImhpZ2FzaGlrYWdhd2FcIjpfMixcImthbm9uamlcIjpfMixcImtvdG9oaXJhXCI6XzIsXCJtYW5ub1wiOl8yLFwibWFydWdhbWVcIjpfMixcIm1pdG95b1wiOl8yLFwibmFvc2hpbWFcIjpfMixcInNhbnVraVwiOl8yLFwidGFkb3RzdVwiOl8yLFwidGFrYW1hdHN1XCI6XzIsXCJ0b25vc2hvXCI6XzIsXCJ1Y2hpbm9taVwiOl8yLFwidXRhenVcIjpfMixcInplbnRzdWppXCI6XzJ9XSxcImthZ29zaGltYVwiOlsxLHtcImFrdW5lXCI6XzIsXCJhbWFtaVwiOl8yLFwiaGlva2lcIjpfMixcImlzYVwiOl8yLFwiaXNlblwiOl8yLFwiaXp1bWlcIjpfMixcImthZ29zaGltYVwiOl8yLFwia2Fub3lhXCI6XzIsXCJrYXdhbmFiZVwiOl8yLFwia2lua29cIjpfMixcImtvdXlhbWFcIjpfMixcIm1ha3VyYXpha2lcIjpfMixcIm1hdHN1bW90b1wiOl8yLFwibWluYW1pdGFuZVwiOl8yLFwibmFrYXRhbmVcIjpfMixcIm5pc2hpbm9vbW90ZVwiOl8yLFwic2F0c3VtYXNlbmRhaVwiOl8yLFwic29vXCI6XzIsXCJ0YXJ1bWl6dVwiOl8yLFwieXVzdWlcIjpfMn1dLFwia2FuYWdhd2FcIjpbMSx7XCJhaWthd2FcIjpfMixcImF0c3VnaVwiOl8yLFwiYXlhc2VcIjpfMixcImNoaWdhc2FraVwiOl8yLFwiZWJpbmFcIjpfMixcImZ1amlzYXdhXCI6XzIsXCJoYWRhbm9cIjpfMixcImhha29uZVwiOl8yLFwiaGlyYXRzdWthXCI6XzIsXCJpc2VoYXJhXCI6XzIsXCJrYWlzZWlcIjpfMixcImthbWFrdXJhXCI6XzIsXCJraXlva2F3YVwiOl8yLFwibWF0c3VkYVwiOl8yLFwibWluYW1pYXNoaWdhcmFcIjpfMixcIm1pdXJhXCI6XzIsXCJuYWthaVwiOl8yLFwibmlub21peWFcIjpfMixcIm9kYXdhcmFcIjpfMixcIm9pXCI6XzIsXCJvaXNvXCI6XzIsXCJzYWdhbWloYXJhXCI6XzIsXCJzYW11a2F3YVwiOl8yLFwidHN1a3VpXCI6XzIsXCJ5YW1ha2l0YVwiOl8yLFwieWFtYXRvXCI6XzIsXCJ5b2tvc3VrYVwiOl8yLFwieXVnYXdhcmFcIjpfMixcInphbWFcIjpfMixcInp1c2hpXCI6XzJ9XSxcImtvY2hpXCI6WzEse1wiYWtpXCI6XzIsXCJnZWlzZWlcIjpfMixcImhpZGFrYVwiOl8yLFwiaGlnYXNoaXRzdW5vXCI6XzIsXCJpbm9cIjpfMixcImthZ2FtaVwiOl8yLFwia2FtaVwiOl8yLFwia2l0YWdhd2FcIjpfMixcImtvY2hpXCI6XzIsXCJtaWhhcmFcIjpfMixcIm1vdG95YW1hXCI6XzIsXCJtdXJvdG9cIjpfMixcIm5haGFyaVwiOl8yLFwibmFrYW11cmFcIjpfMixcIm5hbmtva3VcIjpfMixcIm5pc2hpdG9zYVwiOl8yLFwibml5b2RvZ2F3YVwiOl8yLFwib2NoaVwiOl8yLFwib2thd2FcIjpfMixcIm90b3lvXCI6XzIsXCJvdHN1a2lcIjpfMixcInNha2F3YVwiOl8yLFwic3VrdW1vXCI6XzIsXCJzdXNha2lcIjpfMixcInRvc2FcIjpfMixcInRvc2FzaGltaXp1XCI6XzIsXCJ0b3lvXCI6XzIsXCJ0c3Vub1wiOl8yLFwidW1hamlcIjpfMixcInlhc3VkYVwiOl8yLFwieXVzdWhhcmFcIjpfMn1dLFwia3VtYW1vdG9cIjpbMSx7XCJhbWFrdXNhXCI6XzIsXCJhcmFvXCI6XzIsXCJhc29cIjpfMixcImNob3lvXCI6XzIsXCJneW9rdXRvXCI6XzIsXCJrYW1pYW1ha3VzYVwiOl8yLFwia2lrdWNoaVwiOl8yLFwia3VtYW1vdG9cIjpfMixcIm1hc2hpa2lcIjpfMixcIm1pZnVuZVwiOl8yLFwibWluYW1hdGFcIjpfMixcIm1pbmFtaW9ndW5pXCI6XzIsXCJuYWdhc3VcIjpfMixcIm5pc2hpaGFyYVwiOl8yLFwib2d1bmlcIjpfMixcIm96dVwiOl8yLFwic3Vtb3RvXCI6XzIsXCJ0YWthbW9yaVwiOl8yLFwidWtpXCI6XzIsXCJ1dG9cIjpfMixcInlhbWFnYVwiOl8yLFwieWFtYXRvXCI6XzIsXCJ5YXRzdXNoaXJvXCI6XzJ9XSxcImt5b3RvXCI6WzEse1wiYXlhYmVcIjpfMixcImZ1a3VjaGl5YW1hXCI6XzIsXCJoaWdhc2hpeWFtYVwiOl8yLFwiaWRlXCI6XzIsXCJpbmVcIjpfMixcImpveW9cIjpfMixcImthbWVva2FcIjpfMixcImthbW9cIjpfMixcImtpdGFcIjpfMixcImtpenVcIjpfMixcImt1bWl5YW1hXCI6XzIsXCJreW90YW1iYVwiOl8yLFwia3lvdGFuYWJlXCI6XzIsXCJreW90YW5nb1wiOl8yLFwibWFpenVydVwiOl8yLFwibWluYW1pXCI6XzIsXCJtaW5hbWl5YW1hc2hpcm9cIjpfMixcIm1peWF6dVwiOl8yLFwibXVrb1wiOl8yLFwibmFnYW9rYWt5b1wiOl8yLFwibmFrYWd5b1wiOl8yLFwibmFudGFuXCI6XzIsXCJveWFtYXpha2lcIjpfMixcInNha3lvXCI6XzIsXCJzZWlrYVwiOl8yLFwidGFuYWJlXCI6XzIsXCJ1amlcIjpfMixcInVqaXRhd2FyYVwiOl8yLFwid2F6dWthXCI6XzIsXCJ5YW1hc2hpbmFcIjpfMixcInlhd2F0YVwiOl8yfV0sXCJtaWVcIjpbMSx7XCJhc2FoaVwiOl8yLFwiaW5hYmVcIjpfMixcImlzZVwiOl8yLFwia2FtZXlhbWFcIjpfMixcImthd2Fnb2VcIjpfMixcImtpaG9cIjpfMixcImtpc29zYWtpXCI6XzIsXCJraXdhXCI6XzIsXCJrb21vbm9cIjpfMixcImt1bWFub1wiOl8yLFwia3V3YW5hXCI6XzIsXCJtYXRzdXNha2FcIjpfMixcIm1laXdhXCI6XzIsXCJtaWhhbWFcIjpfMixcIm1pbmFtaWlzZVwiOl8yLFwibWlzdWdpXCI6XzIsXCJtaXlhbWFcIjpfMixcIm5hYmFyaVwiOl8yLFwic2hpbWFcIjpfMixcInN1enVrYVwiOl8yLFwidGFkb1wiOl8yLFwidGFpa2lcIjpfMixcInRha2lcIjpfMixcInRhbWFraVwiOl8yLFwidG9iYVwiOl8yLFwidHN1XCI6XzIsXCJ1ZG9ub1wiOl8yLFwidXJlc2hpbm9cIjpfMixcIndhdGFyYWlcIjpfMixcInlva2thaWNoaVwiOl8yfV0sXCJtaXlhZ2lcIjpbMSx7XCJmdXJ1a2F3YVwiOl8yLFwiaGlnYXNoaW1hdHN1c2hpbWFcIjpfMixcImlzaGlub21ha2lcIjpfMixcIml3YW51bWFcIjpfMixcImtha3VkYVwiOl8yLFwia2FtaVwiOl8yLFwia2F3YXNha2lcIjpfMixcIm1hcnVtb3JpXCI6XzIsXCJtYXRzdXNoaW1hXCI6XzIsXCJtaW5hbWlzYW5yaWt1XCI6XzIsXCJtaXNhdG9cIjpfMixcIm11cmF0YVwiOl8yLFwibmF0b3JpXCI6XzIsXCJvZ2F3YXJhXCI6XzIsXCJvaGlyYVwiOl8yLFwib25hZ2F3YVwiOl8yLFwib3Nha2lcIjpfMixcInJpZnVcIjpfMixcInNlbWluZVwiOl8yLFwic2hpYmF0YVwiOl8yLFwic2hpY2hpa2FzaHVrdVwiOl8yLFwic2hpa2FtYVwiOl8yLFwic2hpb2dhbWFcIjpfMixcInNoaXJvaXNoaVwiOl8yLFwidGFnYWpvXCI6XzIsXCJ0YWl3YVwiOl8yLFwidG9tZVwiOl8yLFwidG9taXlhXCI6XzIsXCJ3YWt1eWFcIjpfMixcIndhdGFyaVwiOl8yLFwieWFtYW1vdG9cIjpfMixcInphb1wiOl8yfV0sXCJtaXlhemFraVwiOlsxLHtcImF5YVwiOl8yLFwiZWJpbm9cIjpfMixcImdva2FzZVwiOl8yLFwiaHl1Z2FcIjpfMixcImthZG9nYXdhXCI6XzIsXCJrYXdhbWluYW1pXCI6XzIsXCJraWpvXCI6XzIsXCJraXRhZ2F3YVwiOl8yLFwia2l0YWthdGFcIjpfMixcImtpdGF1cmFcIjpfMixcImtvYmF5YXNoaVwiOl8yLFwia3VuaXRvbWlcIjpfMixcImt1c2hpbWFcIjpfMixcIm1pbWF0YVwiOl8yLFwibWl5YWtvbm9qb1wiOl8yLFwibWl5YXpha2lcIjpfMixcIm1vcm90c3VrYVwiOl8yLFwibmljaGluYW5cIjpfMixcIm5pc2hpbWVyYVwiOl8yLFwibm9iZW9rYVwiOl8yLFwic2FpdG9cIjpfMixcInNoaWliYVwiOl8yLFwic2hpbnRvbWlcIjpfMixcInRha2FoYXJ1XCI6XzIsXCJ0YWthbmFiZVwiOl8yLFwidGFrYXpha2lcIjpfMixcInRzdW5vXCI6XzJ9XSxcIm5hZ2Fub1wiOlsxLHtcImFjaGlcIjpfMixcImFnZW1hdHN1XCI6XzIsXCJhbmFuXCI6XzIsXCJhb2tpXCI6XzIsXCJhc2FoaVwiOl8yLFwiYXp1bWlub1wiOl8yLFwiY2hpa3Vob2t1XCI6XzIsXCJjaGlrdW1hXCI6XzIsXCJjaGlub1wiOl8yLFwiZnVqaW1pXCI6XzIsXCJoYWt1YmFcIjpfMixcImhhcmFcIjpfMixcImhpcmF5YVwiOl8yLFwiaWlkYVwiOl8yLFwiaWlqaW1hXCI6XzIsXCJpaXlhbWFcIjpfMixcImlpenVuYVwiOl8yLFwiaWtlZGFcIjpfMixcImlrdXNha2FcIjpfMixcImluYVwiOl8yLFwia2FydWl6YXdhXCI6XzIsXCJrYXdha2FtaVwiOl8yLFwia2lzb1wiOl8yLFwia2lzb2Z1a3VzaGltYVwiOl8yLFwia2l0YWFpa2lcIjpfMixcImtvbWFnYW5lXCI6XzIsXCJrb21vcm9cIjpfMixcIm1hdHN1a2F3YVwiOl8yLFwibWF0c3Vtb3RvXCI6XzIsXCJtaWFzYVwiOl8yLFwibWluYW1pYWlraVwiOl8yLFwibWluYW1pbWFraVwiOl8yLFwibWluYW1pbWlub3dhXCI6XzIsXCJtaW5vd2FcIjpfMixcIm1peWFkYVwiOl8yLFwibWl5b3RhXCI6XzIsXCJtb2NoaXp1a2lcIjpfMixcIm5hZ2Fub1wiOl8yLFwibmFnYXdhXCI6XzIsXCJuYWdpc29cIjpfMixcIm5ha2FnYXdhXCI6XzIsXCJuYWthbm9cIjpfMixcIm5vemF3YW9uc2VuXCI6XzIsXCJvYnVzZVwiOl8yLFwib2dhd2FcIjpfMixcIm9rYXlhXCI6XzIsXCJvbWFjaGlcIjpfMixcIm9taVwiOl8yLFwib29rdXdhXCI6XzIsXCJvb3NoaWthXCI6XzIsXCJvdGFraVwiOl8yLFwib3RhcmlcIjpfMixcInNha2FlXCI6XzIsXCJzYWtha2lcIjpfMixcInNha3VcIjpfMixcInNha3Vob1wiOl8yLFwic2hpbW9zdXdhXCI6XzIsXCJzaGluYW5vbWFjaGlcIjpfMixcInNoaW9qaXJpXCI6XzIsXCJzdXdhXCI6XzIsXCJzdXpha2FcIjpfMixcInRha2FnaVwiOl8yLFwidGFrYW1vcmlcIjpfMixcInRha2F5YW1hXCI6XzIsXCJ0YXRlc2hpbmFcIjpfMixcInRhdHN1bm9cIjpfMixcInRvZ2FrdXNoaVwiOl8yLFwidG9ndXJhXCI6XzIsXCJ0b21pXCI6XzIsXCJ1ZWRhXCI6XzIsXCJ3YWRhXCI6XzIsXCJ5YW1hZ2F0YVwiOl8yLFwieWFtYW5vdWNoaVwiOl8yLFwieWFzYWthXCI6XzIsXCJ5YXN1b2thXCI6XzJ9XSxcIm5hZ2FzYWtpXCI6WzEse1wiY2hpaml3YVwiOl8yLFwiZnV0c3VcIjpfMixcImdvdG9cIjpfMixcImhhc2FtaVwiOl8yLFwiaGlyYWRvXCI6XzIsXCJpa2lcIjpfMixcImlzYWhheWFcIjpfMixcImthd2F0YW5hXCI6XzIsXCJrdWNoaW5vdHN1XCI6XzIsXCJtYXRzdXVyYVwiOl8yLFwibmFnYXNha2lcIjpfMixcIm9iYW1hXCI6XzIsXCJvbXVyYVwiOl8yLFwib3NldG9cIjpfMixcInNhaWthaVwiOl8yLFwic2FzZWJvXCI6XzIsXCJzZWloaVwiOl8yLFwic2hpbWFiYXJhXCI6XzIsXCJzaGlua2FtaWdvdG9cIjpfMixcInRvZ2l0c3VcIjpfMixcInRzdXNoaW1hXCI6XzIsXCJ1bnplblwiOl8yfV0sXCJuYXJhXCI6WzEse1wiYW5kb1wiOl8yLFwiZ29zZVwiOl8yLFwiaGVndXJpXCI6XzIsXCJoaWdhc2hpeW9zaGlub1wiOl8yLFwiaWthcnVnYVwiOl8yLFwiaWtvbWFcIjpfMixcImthbWlraXRheWFtYVwiOl8yLFwia2FubWFraVwiOl8yLFwia2FzaGliYVwiOl8yLFwia2FzaGloYXJhXCI6XzIsXCJrYXRzdXJhZ2lcIjpfMixcImthd2FpXCI6XzIsXCJrYXdha2FtaVwiOl8yLFwia2F3YW5pc2hpXCI6XzIsXCJrb3J5b1wiOl8yLFwia3Vyb3Rha2lcIjpfMixcIm1pdHN1ZVwiOl8yLFwibWl5YWtlXCI6XzIsXCJuYXJhXCI6XzIsXCJub3NlZ2F3YVwiOl8yLFwib2ppXCI6XzIsXCJvdWRhXCI6XzIsXCJveW9kb1wiOl8yLFwic2FrdXJhaVwiOl8yLFwic2FuZ29cIjpfMixcInNoaW1vaWNoaVwiOl8yLFwic2hpbW9raXRheWFtYVwiOl8yLFwic2hpbmpvXCI6XzIsXCJzb25pXCI6XzIsXCJ0YWthdG9yaVwiOl8yLFwidGF3YXJhbW90b1wiOl8yLFwidGVua2F3YVwiOl8yLFwidGVucmlcIjpfMixcInVkYVwiOl8yLFwieWFtYXRva29yaXlhbWFcIjpfMixcInlhbWF0b3Rha2FkYVwiOl8yLFwieWFtYXpvZVwiOl8yLFwieW9zaGlub1wiOl8yfV0sXCJuaWlnYXRhXCI6WzEse1wiYWdhXCI6XzIsXCJhZ2Fub1wiOl8yLFwiZ29zZW5cIjpfMixcIml0b2lnYXdhXCI6XzIsXCJpenVtb3pha2lcIjpfMixcImpvZXRzdVwiOl8yLFwia2Ftb1wiOl8yLFwia2FyaXdhXCI6XzIsXCJrYXNoaXdhemFraVwiOl8yLFwibWluYW1pdW9udW1hXCI6XzIsXCJtaXRzdWtlXCI6XzIsXCJtdWlrYVwiOl8yLFwibXVyYWthbWlcIjpfMixcIm15b2tvXCI6XzIsXCJuYWdhb2thXCI6XzIsXCJuaWlnYXRhXCI6XzIsXCJvaml5YVwiOl8yLFwib21pXCI6XzIsXCJzYWRvXCI6XzIsXCJzYW5qb1wiOl8yLFwic2Vpcm9cIjpfMixcInNlaXJvdVwiOl8yLFwic2VraWthd2FcIjpfMixcInNoaWJhdGFcIjpfMixcInRhZ2FtaVwiOl8yLFwidGFpbmFpXCI6XzIsXCJ0b2NoaW9cIjpfMixcInRva2FtYWNoaVwiOl8yLFwidHN1YmFtZVwiOl8yLFwidHN1bmFuXCI6XzIsXCJ1b251bWFcIjpfMixcInlhaGlrb1wiOl8yLFwieW9pdGFcIjpfMixcInl1emF3YVwiOl8yfV0sXCJvaXRhXCI6WzEse1wiYmVwcHVcIjpfMixcImJ1bmdvb25vXCI6XzIsXCJidW5nb3Rha2FkYVwiOl8yLFwiaGFzYW1hXCI6XzIsXCJoaWppXCI6XzIsXCJoaW1lc2hpbWFcIjpfMixcImhpdGFcIjpfMixcImthbWl0c3VlXCI6XzIsXCJrb2tvbm9lXCI6XzIsXCJrdWp1XCI6XzIsXCJrdW5pc2FraVwiOl8yLFwia3VzdVwiOl8yLFwib2l0YVwiOl8yLFwic2Fpa2lcIjpfMixcInRha2V0YVwiOl8yLFwidHN1a3VtaVwiOl8yLFwidXNhXCI6XzIsXCJ1c3VraVwiOl8yLFwieXVmdVwiOl8yfV0sXCJva2F5YW1hXCI6WzEse1wiYWthaXdhXCI6XzIsXCJhc2FrdWNoaVwiOl8yLFwiYml6ZW5cIjpfMixcImhheWFzaGltYVwiOl8yLFwiaWJhcmFcIjpfMixcImthZ2FtaW5vXCI6XzIsXCJrYXNhb2thXCI6XzIsXCJraWJpY2h1b1wiOl8yLFwia3VtZW5hblwiOl8yLFwia3VyYXNoaWtpXCI6XzIsXCJtYW5pd2FcIjpfMixcIm1pc2FraVwiOl8yLFwibmFnaVwiOl8yLFwibmlpbWlcIjpfMixcIm5pc2hpYXdha3VyYVwiOl8yLFwib2theWFtYVwiOl8yLFwic2F0b3Nob1wiOl8yLFwic2V0b3VjaGlcIjpfMixcInNoaW5qb1wiOl8yLFwic2hvb1wiOl8yLFwic29qYVwiOl8yLFwidGFrYWhhc2hpXCI6XzIsXCJ0YW1hbm9cIjpfMixcInRzdXlhbWFcIjpfMixcIndha2VcIjpfMixcInlha2FnZVwiOl8yfV0sXCJva2luYXdhXCI6WzEse1wiYWd1bmlcIjpfMixcImdpbm93YW5cIjpfMixcImdpbm96YVwiOl8yLFwiZ3VzaGlrYW1pXCI6XzIsXCJoYWViYXJ1XCI6XzIsXCJoaWdhc2hpXCI6XzIsXCJoaXJhcmFcIjpfMixcImloZXlhXCI6XzIsXCJpc2hpZ2FraVwiOl8yLFwiaXNoaWthd2FcIjpfMixcIml0b21hblwiOl8yLFwiaXplbmFcIjpfMixcImthZGVuYVwiOl8yLFwia2luXCI6XzIsXCJraXRhZGFpdG9cIjpfMixcImtpdGFuYWthZ3VzdWt1XCI6XzIsXCJrdW1lamltYVwiOl8yLFwia3VuaWdhbWlcIjpfMixcIm1pbmFtaWRhaXRvXCI6XzIsXCJtb3RvYnVcIjpfMixcIm5hZ29cIjpfMixcIm5haGFcIjpfMixcIm5ha2FndXN1a3VcIjpfMixcIm5ha2lqaW5cIjpfMixcIm5hbmpvXCI6XzIsXCJuaXNoaWhhcmFcIjpfMixcIm9naW1pXCI6XzIsXCJva2luYXdhXCI6XzIsXCJvbm5hXCI6XzIsXCJzaGltb2ppXCI6XzIsXCJ0YWtldG9taVwiOl8yLFwidGFyYW1hXCI6XzIsXCJ0b2thc2hpa2lcIjpfMixcInRvbWlndXN1a3VcIjpfMixcInRvbmFraVwiOl8yLFwidXJhc29lXCI6XzIsXCJ1cnVtYVwiOl8yLFwieWFlc2VcIjpfMixcInlvbWl0YW5cIjpfMixcInlvbmFiYXJ1XCI6XzIsXCJ5b25hZ3VuaVwiOl8yLFwiemFtYW1pXCI6XzJ9XSxcIm9zYWthXCI6WzEse1wiYWJlbm9cIjpfMixcImNoaWhheWFha2FzYWthXCI6XzIsXCJjaHVvXCI6XzIsXCJkYWl0b1wiOl8yLFwiZnVqaWlkZXJhXCI6XzIsXCJoYWJpa2lub1wiOl8yLFwiaGFubmFuXCI6XzIsXCJoaWdhc2hpb3Nha2FcIjpfMixcImhpZ2FzaGlzdW1peW9zaGlcIjpfMixcImhpZ2FzaGl5b2RvZ2F3YVwiOl8yLFwiaGlyYWthdGFcIjpfMixcImliYXJha2lcIjpfMixcImlrZWRhXCI6XzIsXCJpenVtaVwiOl8yLFwiaXp1bWlvdHN1XCI6XzIsXCJpenVtaXNhbm9cIjpfMixcImthZG9tYVwiOl8yLFwia2FpenVrYVwiOl8yLFwia2FuYW5cIjpfMixcImthc2hpd2FyYVwiOl8yLFwia2F0YW5vXCI6XzIsXCJrYXdhY2hpbmFnYW5vXCI6XzIsXCJraXNoaXdhZGFcIjpfMixcImtpdGFcIjpfMixcImt1bWF0b3JpXCI6XzIsXCJtYXRzdWJhcmFcIjpfMixcIm1pbmF0b1wiOl8yLFwibWlub2hcIjpfMixcIm1pc2FraVwiOl8yLFwibW9yaWd1Y2hpXCI6XzIsXCJuZXlhZ2F3YVwiOl8yLFwibmlzaGlcIjpfMixcIm5vc2VcIjpfMixcIm9zYWthc2F5YW1hXCI6XzIsXCJzYWthaVwiOl8yLFwic2F5YW1hXCI6XzIsXCJzZW5uYW5cIjpfMixcInNldHRzdVwiOl8yLFwic2hpam9uYXdhdGVcIjpfMixcInNoaW1hbW90b1wiOl8yLFwic3VpdGFcIjpfMixcInRhZGFva2FcIjpfMixcInRhaXNoaVwiOl8yLFwidGFqaXJpXCI6XzIsXCJ0YWthaXNoaVwiOl8yLFwidGFrYXRzdWtpXCI6XzIsXCJ0b25kYWJheWFzaGlcIjpfMixcInRveW9uYWthXCI6XzIsXCJ0b3lvbm9cIjpfMixcInlhb1wiOl8yfV0sXCJzYWdhXCI6WzEse1wiYXJpYWtlXCI6XzIsXCJhcml0YVwiOl8yLFwiZnVrdWRvbWlcIjpfMixcImdlbmthaVwiOl8yLFwiaGFtYXRhbWFcIjpfMixcImhpemVuXCI6XzIsXCJpbWFyaVwiOl8yLFwia2FtaW1pbmVcIjpfMixcImthbnpha2lcIjpfMixcImthcmF0c3VcIjpfMixcImthc2hpbWFcIjpfMixcImtpdGFnYXRhXCI6XzIsXCJraXRhaGF0YVwiOl8yLFwia2l5YW1hXCI6XzIsXCJrb3Vob2t1XCI6XzIsXCJreXVyYWdpXCI6XzIsXCJuaXNoaWFyaXRhXCI6XzIsXCJvZ2lcIjpfMixcIm9tYWNoaVwiOl8yLFwib3VjaGlcIjpfMixcInNhZ2FcIjpfMixcInNoaXJvaXNoaVwiOl8yLFwidGFrdVwiOl8yLFwidGFyYVwiOl8yLFwidG9zdVwiOl8yLFwieW9zaGlub2dhcmlcIjpfMn1dLFwic2FpdGFtYVwiOlsxLHtcImFyYWthd2FcIjpfMixcImFzYWthXCI6XzIsXCJjaGljaGlidVwiOl8yLFwiZnVqaW1pXCI6XzIsXCJmdWppbWlub1wiOl8yLFwiZnVrYXlhXCI6XzIsXCJoYW5ub1wiOl8yLFwiaGFueXVcIjpfMixcImhhc3VkYVwiOl8yLFwiaGF0b2dheWFcIjpfMixcImhhdG95YW1hXCI6XzIsXCJoaWRha2FcIjpfMixcImhpZ2FzaGljaGljaGlidVwiOl8yLFwiaGlnYXNoaW1hdHN1eWFtYVwiOl8yLFwiaG9uam9cIjpfMixcImluYVwiOl8yLFwiaXJ1bWFcIjpfMixcIml3YXRzdWtpXCI6XzIsXCJrYW1paXp1bWlcIjpfMixcImthbWlrYXdhXCI6XzIsXCJrYW1pc2F0b1wiOl8yLFwia2FzdWthYmVcIjpfMixcImthd2Fnb2VcIjpfMixcImthd2FndWNoaVwiOl8yLFwia2F3YWppbWFcIjpfMixcImthem9cIjpfMixcImtpdGFtb3RvXCI6XzIsXCJrb3NoaWdheWFcIjpfMixcImtvdW5vc3VcIjpfMixcImt1a2lcIjpfMixcImt1bWFnYXlhXCI6XzIsXCJtYXRzdWJ1c2hpXCI6XzIsXCJtaW5hbm9cIjpfMixcIm1pc2F0b1wiOl8yLFwibWl5YXNoaXJvXCI6XzIsXCJtaXlvc2hpXCI6XzIsXCJtb3JveWFtYVwiOl8yLFwibmFnYXRvcm9cIjpfMixcIm5hbWVnYXdhXCI6XzIsXCJuaWl6YVwiOl8yLFwib2dhbm9cIjpfMixcIm9nYXdhXCI6XzIsXCJvZ29zZVwiOl8yLFwib2tlZ2F3YVwiOl8yLFwib21peWFcIjpfMixcIm90YWtpXCI6XzIsXCJyYW56YW5cIjpfMixcInJ5b2thbWlcIjpfMixcInNhaXRhbWFcIjpfMixcInNha2Fkb1wiOl8yLFwic2F0dGVcIjpfMixcInNheWFtYVwiOl8yLFwic2hpa2lcIjpfMixcInNoaXJhb2thXCI6XzIsXCJzb2thXCI6XzIsXCJzdWdpdG9cIjpfMixcInRvZGFcIjpfMixcInRva2lnYXdhXCI6XzIsXCJ0b2tvcm96YXdhXCI6XzIsXCJ0c3VydWdhc2hpbWFcIjpfMixcInVyYXdhXCI6XzIsXCJ3YXJhYmlcIjpfMixcInlhc2hpb1wiOl8yLFwieW9rb3plXCI6XzIsXCJ5b25vXCI6XzIsXCJ5b3JpaVwiOl8yLFwieW9zaGlkYVwiOl8yLFwieW9zaGlrYXdhXCI6XzIsXCJ5b3NoaW1pXCI6XzJ9XSxcInNoaWdhXCI6WzEse1wiYWlzaG9cIjpfMixcImdhbW9cIjpfMixcImhpZ2FzaGlvbWlcIjpfMixcImhpa29uZVwiOl8yLFwia29rYVwiOl8yLFwia29uYW5cIjpfMixcImtvc2VpXCI6XzIsXCJrb3RvXCI6XzIsXCJrdXNhdHN1XCI6XzIsXCJtYWliYXJhXCI6XzIsXCJtb3JpeWFtYVwiOl8yLFwibmFnYWhhbWFcIjpfMixcIm5pc2hpYXphaVwiOl8yLFwibm90b2dhd2FcIjpfMixcIm9taWhhY2hpbWFuXCI6XzIsXCJvdHN1XCI6XzIsXCJyaXR0b1wiOl8yLFwicnl1b2hcIjpfMixcInRha2FzaGltYVwiOl8yLFwidGFrYXRzdWtpXCI6XzIsXCJ0b3JhaGltZVwiOl8yLFwidG95b3NhdG9cIjpfMixcInlhc3VcIjpfMn1dLFwic2hpbWFuZVwiOlsxLHtcImFrYWdpXCI6XzIsXCJhbWFcIjpfMixcImdvdHN1XCI6XzIsXCJoYW1hZGFcIjpfMixcImhpZ2FzaGlpenVtb1wiOl8yLFwiaGlrYXdhXCI6XzIsXCJoaWtpbWlcIjpfMixcIml6dW1vXCI6XzIsXCJrYWtpbm9raVwiOl8yLFwibWFzdWRhXCI6XzIsXCJtYXRzdWVcIjpfMixcIm1pc2F0b1wiOl8yLFwibmlzaGlub3NoaW1hXCI6XzIsXCJvaGRhXCI6XzIsXCJva2lub3NoaW1hXCI6XzIsXCJva3VpenVtb1wiOl8yLFwic2hpbWFuZVwiOl8yLFwidGFtYXl1XCI6XzIsXCJ0c3V3YW5vXCI6XzIsXCJ1bm5hblwiOl8yLFwieWFrdW1vXCI6XzIsXCJ5YXN1Z2lcIjpfMixcInlhdHN1a2FcIjpfMn1dLFwic2hpenVva2FcIjpbMSx7XCJhcmFpXCI6XzIsXCJhdGFtaVwiOl8yLFwiZnVqaVwiOl8yLFwiZnVqaWVkYVwiOl8yLFwiZnVqaWthd2FcIjpfMixcImZ1amlub21peWFcIjpfMixcImZ1a3Vyb2lcIjpfMixcImdvdGVtYmFcIjpfMixcImhhaWJhcmFcIjpfMixcImhhbWFtYXRzdVwiOl8yLFwiaGlnYXNoaWl6dVwiOl8yLFwiaXRvXCI6XzIsXCJpd2F0YVwiOl8yLFwiaXp1XCI6XzIsXCJpenVub2t1bmlcIjpfMixcImtha2VnYXdhXCI6XzIsXCJrYW5uYW1pXCI6XzIsXCJrYXdhbmVob25cIjpfMixcImthd2F6dVwiOl8yLFwia2lrdWdhd2FcIjpfMixcImtvc2FpXCI6XzIsXCJtYWtpbm9oYXJhXCI6XzIsXCJtYXRzdXpha2lcIjpfMixcIm1pbmFtaWl6dVwiOl8yLFwibWlzaGltYVwiOl8yLFwibW9yaW1hY2hpXCI6XzIsXCJuaXNoaWl6dVwiOl8yLFwibnVtYXp1XCI6XzIsXCJvbWFlemFraVwiOl8yLFwic2hpbWFkYVwiOl8yLFwic2hpbWl6dVwiOl8yLFwic2hpbW9kYVwiOl8yLFwic2hpenVva2FcIjpfMixcInN1c29ub1wiOl8yLFwieWFpenVcIjpfMixcInlvc2hpZGFcIjpfMn1dLFwidG9jaGlnaVwiOlsxLHtcImFzaGlrYWdhXCI6XzIsXCJiYXRvXCI6XzIsXCJoYWdhXCI6XzIsXCJpY2hpa2FpXCI6XzIsXCJpd2FmdW5lXCI6XzIsXCJrYW1pbm9rYXdhXCI6XzIsXCJrYW51bWFcIjpfMixcImthcmFzdXlhbWFcIjpfMixcImt1cm9pc29cIjpfMixcIm1hc2hpa29cIjpfMixcIm1pYnVcIjpfMixcIm1va2FcIjpfMixcIm1vdGVnaVwiOl8yLFwibmFzdVwiOl8yLFwibmFzdXNoaW9iYXJhXCI6XzIsXCJuaWtrb1wiOl8yLFwibmlzaGlrYXRhXCI6XzIsXCJub2dpXCI6XzIsXCJvaGlyYVwiOl8yLFwib2h0YXdhcmFcIjpfMixcIm95YW1hXCI6XzIsXCJzYWt1cmFcIjpfMixcInNhbm9cIjpfMixcInNoaW1vdHN1a2VcIjpfMixcInNoaW95YVwiOl8yLFwidGFrYW5lemF3YVwiOl8yLFwidG9jaGlnaVwiOl8yLFwidHN1Z2FcIjpfMixcInVqaWllXCI6XzIsXCJ1dHN1bm9taXlhXCI6XzIsXCJ5YWl0YVwiOl8yfV0sXCJ0b2t1c2hpbWFcIjpbMSx7XCJhaXp1bWlcIjpfMixcImFuYW5cIjpfMixcImljaGliYVwiOl8yLFwiaXRhbm9cIjpfMixcImthaW5hblwiOl8yLFwia29tYXRzdXNoaW1hXCI6XzIsXCJtYXRzdXNoaWdlXCI6XzIsXCJtaW1hXCI6XzIsXCJtaW5hbWlcIjpfMixcIm1peW9zaGlcIjpfMixcIm11Z2lcIjpfMixcIm5ha2FnYXdhXCI6XzIsXCJuYXJ1dG9cIjpfMixcInNhbmFnb2NoaVwiOl8yLFwic2hpc2hpa3VpXCI6XzIsXCJ0b2t1c2hpbWFcIjpfMixcIndhamlraVwiOl8yfV0sXCJ0b2t5b1wiOlsxLHtcImFkYWNoaVwiOl8yLFwiYWtpcnVub1wiOl8yLFwiYWtpc2hpbWFcIjpfMixcImFvZ2FzaGltYVwiOl8yLFwiYXJha2F3YVwiOl8yLFwiYnVua3lvXCI6XzIsXCJjaGl5b2RhXCI6XzIsXCJjaG9mdVwiOl8yLFwiY2h1b1wiOl8yLFwiZWRvZ2F3YVwiOl8yLFwiZnVjaHVcIjpfMixcImZ1c3NhXCI6XzIsXCJoYWNoaWpvXCI6XzIsXCJoYWNoaW9qaVwiOl8yLFwiaGFtdXJhXCI6XzIsXCJoaWdhc2hpa3VydW1lXCI6XzIsXCJoaWdhc2hpbXVyYXlhbWFcIjpfMixcImhpZ2FzaGl5YW1hdG9cIjpfMixcImhpbm9cIjpfMixcImhpbm9kZVwiOl8yLFwiaGlub2hhcmFcIjpfMixcImluYWdpXCI6XzIsXCJpdGFiYXNoaVwiOl8yLFwia2F0c3VzaGlrYVwiOl8yLFwia2l0YVwiOl8yLFwia2l5b3NlXCI6XzIsXCJrb2RhaXJhXCI6XzIsXCJrb2dhbmVpXCI6XzIsXCJrb2t1YnVuamlcIjpfMixcImtvbWFlXCI6XzIsXCJrb3RvXCI6XzIsXCJrb3V6dXNoaW1hXCI6XzIsXCJrdW5pdGFjaGlcIjpfMixcIm1hY2hpZGFcIjpfMixcIm1lZ3Vyb1wiOl8yLFwibWluYXRvXCI6XzIsXCJtaXRha2FcIjpfMixcIm1penVob1wiOl8yLFwibXVzYXNoaW11cmF5YW1hXCI6XzIsXCJtdXNhc2hpbm9cIjpfMixcIm5ha2Fub1wiOl8yLFwibmVyaW1hXCI6XzIsXCJvZ2FzYXdhcmFcIjpfMixcIm9rdXRhbWFcIjpfMixcIm9tZVwiOl8yLFwib3NoaW1hXCI6XzIsXCJvdGFcIjpfMixcInNldGFnYXlhXCI6XzIsXCJzaGlidXlhXCI6XzIsXCJzaGluYWdhd2FcIjpfMixcInNoaW5qdWt1XCI6XzIsXCJzdWdpbmFtaVwiOl8yLFwic3VtaWRhXCI6XzIsXCJ0YWNoaWthd2FcIjpfMixcInRhaXRvXCI6XzIsXCJ0YW1hXCI6XzIsXCJ0b3NoaW1hXCI6XzJ9XSxcInRvdHRvcmlcIjpbMSx7XCJjaGl6dVwiOl8yLFwiaGlub1wiOl8yLFwia2F3YWhhcmFcIjpfMixcImtvZ2VcIjpfMixcImtvdG91cmFcIjpfMixcIm1pc2FzYVwiOl8yLFwibmFuYnVcIjpfMixcIm5pY2hpbmFuXCI6XzIsXCJzYWthaW1pbmF0b1wiOl8yLFwidG90dG9yaVwiOl8yLFwid2FrYXNhXCI6XzIsXCJ5YXp1XCI6XzIsXCJ5b25hZ29cIjpfMn1dLFwidG95YW1hXCI6WzEse1wiYXNhaGlcIjpfMixcImZ1Y2h1XCI6XzIsXCJmdWt1bWl0c3VcIjpfMixcImZ1bmFoYXNoaVwiOl8yLFwiaGltaVwiOl8yLFwiaW1penVcIjpfMixcImluYW1pXCI6XzIsXCJqb2hhbmFcIjpfMixcImthbWlpY2hpXCI6XzIsXCJrdXJvYmVcIjpfMixcIm5ha2FuaWlrYXdhXCI6XzIsXCJuYW1lcmlrYXdhXCI6XzIsXCJuYW50b1wiOl8yLFwibnl1emVuXCI6XzIsXCJveWFiZVwiOl8yLFwidGFpcmFcIjpfMixcInRha2Fva2FcIjpfMixcInRhdGV5YW1hXCI6XzIsXCJ0b2dhXCI6XzIsXCJ0b25hbWlcIjpfMixcInRveWFtYVwiOl8yLFwidW5henVraVwiOl8yLFwidW96dVwiOl8yLFwieWFtYWRhXCI6XzJ9XSxcIndha2F5YW1hXCI6WzEse1wiYXJpZGFcIjpfMixcImFyaWRhZ2F3YVwiOl8yLFwiZ29ib1wiOl8yLFwiaGFzaGltb3RvXCI6XzIsXCJoaWRha2FcIjpfMixcImhpcm9nYXdhXCI6XzIsXCJpbmFtaVwiOl8yLFwiaXdhZGVcIjpfMixcImthaW5hblwiOl8yLFwia2FtaXRvbmRhXCI6XzIsXCJrYXRzdXJhZ2lcIjpfMixcImtpbWlub1wiOl8yLFwia2lub2thd2FcIjpfMixcImtpdGF5YW1hXCI6XzIsXCJrb3lhXCI6XzIsXCJrb3phXCI6XzIsXCJrb3phZ2F3YVwiOl8yLFwia3Vkb3lhbWFcIjpfMixcImt1c2hpbW90b1wiOl8yLFwibWloYW1hXCI6XzIsXCJtaXNhdG9cIjpfMixcIm5hY2hpa2F0c3V1cmFcIjpfMixcInNoaW5ndVwiOl8yLFwic2hpcmFoYW1hXCI6XzIsXCJ0YWlqaVwiOl8yLFwidGFuYWJlXCI6XzIsXCJ3YWtheWFtYVwiOl8yLFwieXVhc2FcIjpfMixcInl1cmFcIjpfMn1dLFwieWFtYWdhdGFcIjpbMSx7XCJhc2FoaVwiOl8yLFwiZnVuYWdhdGFcIjpfMixcImhpZ2FzaGluZVwiOl8yLFwiaWlkZVwiOl8yLFwia2Fob2t1XCI6XzIsXCJrYW1pbm95YW1hXCI6XzIsXCJrYW5leWFtYVwiOl8yLFwia2F3YW5pc2hpXCI6XzIsXCJtYW11cm9nYXdhXCI6XzIsXCJtaWthd2FcIjpfMixcIm11cmF5YW1hXCI6XzIsXCJuYWdhaVwiOl8yLFwibmFrYXlhbWFcIjpfMixcIm5hbnlvXCI6XzIsXCJuaXNoaWthd2FcIjpfMixcIm9iYW5hemF3YVwiOl8yLFwib2VcIjpfMixcIm9ndW5pXCI6XzIsXCJvaGt1cmFcIjpfMixcIm9pc2hpZGFcIjpfMixcInNhZ2FlXCI6XzIsXCJzYWthdGFcIjpfMixcInNha2VnYXdhXCI6XzIsXCJzaGluam9cIjpfMixcInNoaXJhdGFrYVwiOl8yLFwic2hvbmFpXCI6XzIsXCJ0YWthaGF0YVwiOl8yLFwidGVuZG9cIjpfMixcInRvemF3YVwiOl8yLFwidHN1cnVva2FcIjpfMixcInlhbWFnYXRhXCI6XzIsXCJ5YW1hbm9iZVwiOl8yLFwieW9uZXphd2FcIjpfMixcInl1emFcIjpfMn1dLFwieWFtYWd1Y2hpXCI6WzEse1wiYWJ1XCI6XzIsXCJoYWdpXCI6XzIsXCJoaWthcmlcIjpfMixcImhvZnVcIjpfMixcIml3YWt1bmlcIjpfMixcImt1ZGFtYXRzdVwiOl8yLFwibWl0b3VcIjpfMixcIm5hZ2F0b1wiOl8yLFwib3NoaW1hXCI6XzIsXCJzaGltb25vc2VraVwiOl8yLFwic2h1bmFuXCI6XzIsXCJ0YWJ1c2VcIjpfMixcInRva3V5YW1hXCI6XzIsXCJ0b3lvdGFcIjpfMixcInViZVwiOl8yLFwieXV1XCI6XzJ9XSxcInlhbWFuYXNoaVwiOlsxLHtcImNodW9cIjpfMixcImRvc2hpXCI6XzIsXCJmdWVmdWtpXCI6XzIsXCJmdWppa2F3YVwiOl8yLFwiZnVqaWthd2FndWNoaWtvXCI6XzIsXCJmdWppeW9zaGlkYVwiOl8yLFwiaGF5YWthd2FcIjpfMixcImhva3V0b1wiOl8yLFwiaWNoaWthd2FtaXNhdG9cIjpfMixcImthaVwiOl8yLFwia29mdVwiOl8yLFwia29zaHVcIjpfMixcImtvc3VnZVwiOl8yLFwibWluYW1pLWFscHNcIjpfMixcIm1pbm9idVwiOl8yLFwibmFrYW1pY2hpXCI6XzIsXCJuYW5idVwiOl8yLFwibmFydXNhd2FcIjpfMixcIm5pcmFzYWtpXCI6XzIsXCJuaXNoaWthdHN1cmFcIjpfMixcIm9zaGlub1wiOl8yLFwib3RzdWtpXCI6XzIsXCJzaG93YVwiOl8yLFwidGFiYXlhbWFcIjpfMixcInRzdXJ1XCI6XzIsXCJ1ZW5vaGFyYVwiOl8yLFwieWFtYW5ha2Frb1wiOl8yLFwieWFtYW5hc2hpXCI6XzJ9XSxcInhuLS1laHF6NTZuXCI6XzIsXCJcdTRFMDlcdTkxQ0RcIjpfMixcInhuLS0xbHFzMDNuXCI6XzIsXCJcdTRFQUNcdTkwRkRcIjpfMixcInhuLS1xcXF0MTFtXCI6XzIsXCJcdTRGNTBcdThDQzBcIjpfMixcInhuLS1mNnF4NTNhXCI6XzIsXCJcdTUxNzVcdTVFQUJcIjpfMixcInhuLS1kanJzNzJkNnV5XCI6XzIsXCJcdTUzMTdcdTZENzdcdTkwNTNcIjpfMixcInhuLS1ta3J1NDVpXCI6XzIsXCJcdTUzNDNcdTg0NDlcIjpfMixcInhuLS0wdHJxN3A3bm5cIjpfMixcIlx1NTQ4Q1x1NkI0Q1x1NUM3MVwiOl8yLFwieG4tLTVqczA0NWRcIjpfMixcIlx1NTdGQ1x1NzM4OVwiOl8yLFwieG4tLWticnE3b1wiOl8yLFwiXHU1OTI3XHU1MjA2XCI6XzIsXCJ4bi0tcHNzdTMzbFwiOl8yLFwiXHU1OTI3XHU5NjJBXCI6XzIsXCJ4bi0tbnRzcTE3Z1wiOl8yLFwiXHU1OTQ4XHU4MjZGXCI6XzIsXCJ4bi0tdWlzejNnXCI6XzIsXCJcdTVCQUVcdTU3Q0VcIjpfMixcInhuLS02YnR3NWFcIjpfMixcIlx1NUJBRVx1NUQwRVwiOl8yLFwieG4tLTFjdHdvXCI6XzIsXCJcdTVCQ0NcdTVDNzFcIjpfMixcInhuLS02b3J4MnJcIjpfMixcIlx1NUM3MVx1NTNFM1wiOl8yLFwieG4tLXJodDYxZVwiOl8yLFwiXHU1QzcxXHU1RjYyXCI6XzIsXCJ4bi0tcmh0Mjd6XCI6XzIsXCJcdTVDNzFcdTY4QThcIjpfMixcInhuLS1uaXQyMjVrXCI6XzIsXCJcdTVDOTBcdTk2MUNcIjpfMixcInhuLS1yaHQzZFwiOl8yLFwiXHU1Q0ExXHU1QzcxXCI6XzIsXCJ4bi0tZGp0eTRrXCI6XzIsXCJcdTVDQTlcdTYyNEJcIjpfMixcInhuLS1rbHR5NXhcIjpfMixcIlx1NUNGNlx1NjgzOVwiOl8yLFwieG4tLWtsdHg5YVwiOl8yLFwiXHU1RTgzXHU1Q0Y2XCI6XzIsXCJ4bi0ta2x0cDdkXCI6XzIsXCJcdTVGQjNcdTVDRjZcIjpfMixcInhuLS1jM3MxNG1cIjpfMixcIlx1NjExQlx1NUE5QlwiOl8yLFwieG4tLXZndTQwMmNcIjpfMixcIlx1NjExQlx1NzdFNVwiOl8yLFwieG4tLWVmdm45c1wiOl8yLFwiXHU2NUIwXHU2RjVGXCI6XzIsXCJ4bi0tMWxxczcxZFwiOl8yLFwiXHU2NzcxXHU0RUFDXCI6XzIsXCJ4bi0tNHB2eHNcIjpfMixcIlx1NjgwM1x1NjcyOFwiOl8yLFwieG4tLXV1d3U1OGFcIjpfMixcIlx1NkM5Nlx1N0UwNFwiOl8yLFwieG4tLXpieDAyNWRcIjpfMixcIlx1NkVDQlx1OENDMFwiOl8yLFwieG4tLThwdnI0dVwiOl8yLFwiXHU3MThBXHU2NzJDXCI6XzIsXCJ4bi0tNXJ0cDQ5Y1wiOl8yLFwiXHU3N0YzXHU1REREXCI6XzIsXCJ4bi0tbnRzbzBpcXgzYVwiOl8yLFwiXHU3OTVFXHU1OTQ4XHU1REREXCI6XzIsXCJ4bi0tZWxxcTE2aFwiOl8yLFwiXHU3OThGXHU0RTk1XCI6XzIsXCJ4bi0tNGl0MTY4ZFwiOl8yLFwiXHU3OThGXHU1Q0ExXCI6XzIsXCJ4bi0ta2x0Nzg3ZFwiOl8yLFwiXHU3OThGXHU1Q0Y2XCI6XzIsXCJ4bi0tcm55MzFoXCI6XzIsXCJcdTc5Q0JcdTc1MzBcIjpfMixcInhuLS03dDBhMjY0Y1wiOl8yLFwiXHU3RkE0XHU5OUFDXCI6XzIsXCJ4bi0tdWlzdDIyaFwiOl8yLFwiXHU4MzI4XHU1N0NFXCI6XzIsXCJ4bi0tOGx0cjYya1wiOl8yLFwiXHU5NTc3XHU1RDBFXCI6XzIsXCJ4bi0tMm00YTE1ZVwiOl8yLFwiXHU5NTc3XHU5MUNFXCI6XzIsXCJ4bi0tMzJ2cDMwaFwiOl8yLFwiXHU5NzUyXHU2OEVFXCI6XzIsXCJ4bi0tNGl0Nzk3a1wiOl8yLFwiXHU5NzU5XHU1Q0ExXCI6XzIsXCJ4bi0tNXJ0cTM0a1wiOl8yLFwiXHU5OTk5XHU1REREXCI6XzIsXCJ4bi0tazd5bjk1ZVwiOl8yLFwiXHU5QUQ4XHU3N0U1XCI6XzIsXCJ4bi0tdG9yMTMxb1wiOl8yLFwiXHU5Q0U1XHU1M0Q2XCI6XzIsXCJ4bi0tZDVxdjd6ODc2Y1wiOl8yLFwiXHU5RTdGXHU1MTUwXHU1Q0Y2XCI6XzIsXCJrYXdhc2FraVwiOl8yMCxcImtpdGFreXVzaHVcIjpfMjAsXCJrb2JlXCI6XzIwLFwibmFnb3lhXCI6XzIwLFwic2FwcG9yb1wiOl8yMCxcInNlbmRhaVwiOl8yMCxcInlva29oYW1hXCI6XzIwLFwiYnV5c2hvcFwiOl8zLFwiZmFzaGlvbnN0b3JlXCI6XzMsXCJoYW5kY3JhZnRlZFwiOl8zLFwia2F3YWlpc2hvcFwiOl8zLFwic3VwZXJzYWxlXCI6XzMsXCJ0aGVzaG9wXCI6XzMsXCIwYW1cIjpfMyxcIjBnMFwiOl8zLFwiMGowXCI6XzMsXCIwdDBcIjpfMyxcIm15ZG5zXCI6XzMsXCJwZ3dcIjpfMyxcIndqZ1wiOl8zLFwidXNlcmNvbnRlbnRcIjpfMyxcImFuZ3J5XCI6XzMsXCJiYWJ5Ymx1ZVwiOl8zLFwiYmFieW1pbGtcIjpfMyxcImJhY2tkcm9wXCI6XzMsXCJiYW1iaW5hXCI6XzMsXCJiaXR0ZXJcIjpfMyxcImJsdXNoXCI6XzMsXCJib29cIjpfMyxcImJveVwiOl8zLFwiYm95ZnJpZW5kXCI6XzMsXCJidXRcIjpfMyxcImNhbmR5cG9wXCI6XzMsXCJjYXBvb1wiOl8zLFwiY2F0Zm9vZFwiOl8zLFwiY2hlYXBcIjpfMyxcImNoaWNhcHBhXCI6XzMsXCJjaGlsbG91dFwiOl8zLFwiY2hpcHNcIjpfMyxcImNob3dkZXJcIjpfMyxcImNodVwiOl8zLFwiY2lhb1wiOl8zLFwiY29jb3R0ZVwiOl8zLFwiY29vbGJsb2dcIjpfMyxcImNyYW5reVwiOl8zLFwiY3V0ZWdpcmxcIjpfMyxcImRhYVwiOl8zLFwiZGVjYVwiOl8zLFwiZGVjaVwiOl8zLFwiZGlnaWNrXCI6XzMsXCJlZ29pc21cIjpfMyxcImZha2VmdXJcIjpfMyxcImZlbVwiOl8zLFwiZmxpZXJcIjpfMyxcImZsb3BweVwiOl8zLFwiZm9vbFwiOl8zLFwiZnJlbmNoa2lzc1wiOl8zLFwiZ2lybGZyaWVuZFwiOl8zLFwiZ2lybHlcIjpfMyxcImdsb29teVwiOl8zLFwiZ29ubmFcIjpfMyxcImdyZWF0ZXJcIjpfMyxcImhhY2NhXCI6XzMsXCJoZWF2eVwiOl8zLFwiaGVyXCI6XzMsXCJoaWhvXCI6XzMsXCJoaXBweVwiOl8zLFwiaG9seVwiOl8zLFwiaHVuZ3J5XCI6XzMsXCJpY3VydXNcIjpfMyxcIml0aWdvXCI6XzMsXCJqZWxseWJlYW5cIjpfMyxcImtpa2lyYXJhXCI6XzMsXCJraWxsXCI6XzMsXCJraWxvXCI6XzMsXCJrdXJvblwiOl8zLFwibGl0dGxlc3RhclwiOl8zLFwibG9saXBvcG1jXCI6XzMsXCJsb2xpdGFwdW5rXCI6XzMsXCJsb21vXCI6XzMsXCJsb3ZlcG9wXCI6XzMsXCJsb3Zlc2lja1wiOl8zLFwibWFpblwiOl8zLFwibW9kc1wiOl8zLFwibW9uZFwiOl8zLFwibW9uZ29saWFuXCI6XzMsXCJtb29cIjpfMyxcIm5hbWFzdGVcIjpfMyxcIm5pa2l0YVwiOl8zLFwibm9idXNoaVwiOl8zLFwibm9vclwiOl8zLFwib29wc1wiOl8zLFwicGFyYWxsZWxcIjpfMyxcInBhcmFzaXRlXCI6XzMsXCJwZWNvcmlcIjpfMyxcInBlZXdlZVwiOl8zLFwicGVubmVcIjpfMyxcInBlcHBlclwiOl8zLFwicGVybWFcIjpfMyxcInBpZ2JvYXRcIjpfMyxcInBpbm9rb1wiOl8zLFwicHVueXVcIjpfMyxcInB1cHVcIjpfMyxcInB1c3N5Y2F0XCI6XzMsXCJweWFcIjpfMyxcInJhaW5kcm9wXCI6XzMsXCJyZWFkeW1hZGVcIjpfMyxcInNhZGlzdFwiOl8zLFwic2Nob29sYnVzXCI6XzMsXCJzZWNyZXRcIjpfMyxcInN0YWJhXCI6XzMsXCJzdHJpcHBlclwiOl8zLFwic3ViXCI6XzMsXCJzdW5ueWRheVwiOl8zLFwidGhpY2tcIjpfMyxcInRvbmtvdHN1XCI6XzMsXCJ1bmRlclwiOl8zLFwidXBwZXJcIjpfMyxcInZlbHZldFwiOl8zLFwidmVyc2VcIjpfMyxcInZlcnN1c1wiOl8zLFwidml2aWFuXCI6XzMsXCJ3YXRzb25cIjpfMyxcIndlYmxpa2VcIjpfMyxcIndoaXRlc25vd1wiOl8zLFwiem9tYmllXCI6XzMsXCJoYXRlYmxvXCI6XzMsXCJoYXRlbmFibG9nXCI6XzMsXCJoYXRlbmFkaWFyeVwiOl8zLFwiMi1kXCI6XzMsXCJib25hXCI6XzMsXCJjcmFwXCI6XzMsXCJkYXluaWdodFwiOl8zLFwiZWVrXCI6XzMsXCJmbG9wXCI6XzMsXCJoYWxmbW9vblwiOl8zLFwiamVlelwiOl8zLFwibWF0cml4XCI6XzMsXCJtaW1vemFcIjpfMyxcIm5ldGdhbWVyc1wiOl8zLFwibnlhbnRhXCI6XzMsXCJvMG8wXCI6XzMsXCJyZHlcIjpfMyxcInJnclwiOl8zLFwicnVsZXpcIjpfMyxcInNha3VyYXN0b3JhZ2VcIjpbMCx7XCJpc2swMVwiOl81OCxcImlzazAyXCI6XzU4fV0sXCJzYWxvb25cIjpfMyxcInNibG9cIjpfMyxcInNrclwiOl8zLFwidGFua1wiOl8zLFwidWgtb2hcIjpfMyxcInVuZG9cIjpfMyxcIndlYmFjY2VsXCI6WzAse1wicnNcIjpfMyxcInVzZXJcIjpfM31dLFwid2Vic296YWlcIjpfMyxcInhpaVwiOl8zfV0sXCJrZVwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZ29cIjpfMixcImluZm9cIjpfMixcIm1lXCI6XzIsXCJtb2JpXCI6XzIsXCJuZVwiOl8yLFwib3JcIjpfMixcInNjXCI6XzJ9XSxcImtnXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwidXNcIjpfMyxcInh4XCI6XzN9XSxcImtoXCI6XzIwLFwia2lcIjpfNTksXCJrbVwiOlsxLHtcImFzc1wiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJub21cIjpfMixcIm9yZ1wiOl8yLFwicHJkXCI6XzIsXCJ0bVwiOl8yLFwiYXNzb1wiOl8yLFwiY29vcFwiOl8yLFwiZ291dlwiOl8yLFwibWVkZWNpblwiOl8yLFwibm90YWlyZXNcIjpfMixcInBoYXJtYWNpZW5zXCI6XzIsXCJwcmVzc2VcIjpfMixcInZldGVyaW5haXJlXCI6XzJ9XSxcImtuXCI6WzEse1wiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcImtwXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwib3JnXCI6XzIsXCJyZXBcIjpfMixcInRyYVwiOl8yfV0sXCJrclwiOlsxLHtcImFjXCI6XzIsXCJhaVwiOl8yLFwiY29cIjpfMixcImVzXCI6XzIsXCJnb1wiOl8yLFwiaHNcIjpfMixcImlvXCI6XzIsXCJpdFwiOl8yLFwia2dcIjpfMixcIm1lXCI6XzIsXCJtaWxcIjpfMixcIm1zXCI6XzIsXCJuZVwiOl8yLFwib3JcIjpfMixcInBlXCI6XzIsXCJyZVwiOl8yLFwic2NcIjpfMixcImJ1c2FuXCI6XzIsXCJjaHVuZ2J1a1wiOl8yLFwiY2h1bmduYW1cIjpfMixcImRhZWd1XCI6XzIsXCJkYWVqZW9uXCI6XzIsXCJnYW5nd29uXCI6XzIsXCJnd2FuZ2p1XCI6XzIsXCJneWVvbmdidWtcIjpfMixcImd5ZW9uZ2dpXCI6XzIsXCJneWVvbmduYW1cIjpfMixcImluY2hlb25cIjpfMixcImplanVcIjpfMixcImplb25idWtcIjpfMixcImplb25uYW1cIjpfMixcInNlb3VsXCI6XzIsXCJ1bHNhblwiOl8yLFwiYzAxXCI6XzMsXCJlbGl2LWNkblwiOl8zLFwiZWxpdi1kbnNcIjpfMyxcIm1tdlwiOl8zLFwidmtpXCI6XzN9XSxcImt3XCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImVtYlwiOl8yLFwiZ292XCI6XzIsXCJpbmRcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcImt5XCI6XzQ3LFwia3pcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJqY2xvdWRcIjpfM31dLFwibGFcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJpbmZvXCI6XzIsXCJpbnRcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJwZXJcIjpfMixcImJuclwiOl8zfV0sXCJsYlwiOl80LFwibGNcIjpbMSx7XCJjb1wiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcIm95XCI6XzN9XSxcImxpXCI6XzIsXCJsa1wiOlsxLHtcImFjXCI6XzIsXCJhc3NuXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJncnBcIjpfMixcImhvdGVsXCI6XzIsXCJpbnRcIjpfMixcImx0ZFwiOl8yLFwibmV0XCI6XzIsXCJuZ29cIjpfMixcIm9yZ1wiOl8yLFwic2NoXCI6XzIsXCJzb2NcIjpfMixcIndlYlwiOl8yfV0sXCJsclwiOl80LFwibHNcIjpbMSx7XCJhY1wiOl8yLFwiYml6XCI6XzIsXCJjb1wiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJzY1wiOl8yfV0sXCJsdFwiOl8xMCxcImx1XCI6WzEse1wiMTIzd2Vic2l0ZVwiOl8zfV0sXCJsdlwiOlsxLHtcImFzblwiOl8yLFwiY29tXCI6XzIsXCJjb25mXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaWRcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwibHlcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJpZFwiOl8yLFwibWVkXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicGxjXCI6XzIsXCJzY2hcIjpfMn1dLFwibWFcIjpbMSx7XCJhY1wiOl8yLFwiY29cIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByZXNzXCI6XzJ9XSxcIm1jXCI6WzEse1wiYXNzb1wiOl8yLFwidG1cIjpfMn1dLFwibWRcIjpbMSx7XCJpclwiOl8zfV0sXCJtZVwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIml0c1wiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByaXZcIjpfMixcImM2NlwiOl8zLFwiY3JhZnRcIjpfMyxcImVkZ2VzdGFja1wiOl8zLFwiZmlsZWdlYXJcIjpfMyxcImZpbGVnZWFyLXNnXCI6XzMsXCJsb2htdXNcIjpfMyxcImJhcnN5XCI6XzMsXCJtY2RpclwiOl8zLFwiYnJhc2lsaWFcIjpfMyxcImRkbnNcIjpfMyxcImRuc2ZvclwiOl8zLFwiaG9wdG9cIjpfMyxcImxvZ2ludG9cIjpfMyxcIm5vaXBcIjpfMyxcIndlYmhvcFwiOl8zLFwic291bmRjYXN0XCI6XzMsXCJ0Y3A0XCI6XzMsXCJ2cDRcIjpfMyxcImRpc2tzdGF0aW9uXCI6XzMsXCJkc2Nsb3VkXCI6XzMsXCJpMjM0XCI6XzMsXCJteWRzXCI6XzMsXCJzeW5vbG9neVwiOl8zLFwidHJhbnNpcFwiOl80NixcIm5vaG9zdFwiOl8zfV0sXCJtZ1wiOlsxLHtcImNvXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5vbVwiOl8yLFwib3JnXCI6XzIsXCJwcmRcIjpfMn1dLFwibWhcIjpfMixcIm1pbFwiOl8yLFwibWtcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJpbmZcIjpfMixcIm5hbWVcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcIm1sXCI6WzEse1wiYWNcIjpfMixcImFydFwiOl8yLFwiYXNzb1wiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdXZcIjpfMixcImdvdlwiOl8yLFwiaW5mb1wiOl8yLFwiaW5zdFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByXCI6XzIsXCJwcmVzc2VcIjpfMn1dLFwibW1cIjpfMjAsXCJtblwiOlsxLHtcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJvcmdcIjpfMixcIm55Y1wiOl8zfV0sXCJtb1wiOl80LFwibW9iaVwiOlsxLHtcImJhcnN5XCI6XzMsXCJkc2Nsb3VkXCI6XzN9XSxcIm1wXCI6WzEse1wianVcIjpfM31dLFwibXFcIjpfMixcIm1yXCI6XzEwLFwibXNcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwibWluaXNpdGVcIjpfM31dLFwibXRcIjpfNDcsXCJtdVwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiY29tXCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JcIjpfMixcIm9yZ1wiOl8yfV0sXCJtdXNldW1cIjpfMixcIm12XCI6WzEse1wiYWVyb1wiOl8yLFwiYml6XCI6XzIsXCJjb21cIjpfMixcImNvb3BcIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJpbmZvXCI6XzIsXCJpbnRcIjpfMixcIm1pbFwiOl8yLFwibXVzZXVtXCI6XzIsXCJuYW1lXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicHJvXCI6XzJ9XSxcIm13XCI6WzEse1wiYWNcIjpfMixcImJpelwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiY29vcFwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImludFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwibXhcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ29iXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJteVwiOlsxLHtcImJpelwiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuYW1lXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJtelwiOlsxLHtcImFjXCI6XzIsXCJhZHZcIjpfMixcImNvXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJuYVwiOlsxLHtcImFsdFwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZ292XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJuYW1lXCI6WzEse1wiaGVyXCI6XzYyLFwiaGlzXCI6XzYyfV0sXCJuY1wiOlsxLHtcImFzc29cIjpfMixcIm5vbVwiOl8yfV0sXCJuZVwiOl8yLFwibmV0XCI6WzEse1wiYWRvYmVhZW1jbG91ZFwiOl8zLFwiYWRvYmVpby1zdGF0aWNcIjpfMyxcImFkb2JlaW9ydW50aW1lXCI6XzMsXCJha2FkbnNcIjpfMyxcImFrYW1haVwiOl8zLFwiYWthbWFpLXN0YWdpbmdcIjpfMyxcImFrYW1haWVkZ2VcIjpfMyxcImFrYW1haWVkZ2Utc3RhZ2luZ1wiOl8zLFwiYWthbWFpaGRcIjpfMyxcImFrYW1haWhkLXN0YWdpbmdcIjpfMyxcImFrYW1haW9yaWdpblwiOl8zLFwiYWthbWFpb3JpZ2luLXN0YWdpbmdcIjpfMyxcImFrYW1haXplZFwiOl8zLFwiYWthbWFpemVkLXN0YWdpbmdcIjpfMyxcImVkZ2VrZXlcIjpfMyxcImVkZ2VrZXktc3RhZ2luZ1wiOl8zLFwiZWRnZXN1aXRlXCI6XzMsXCJlZGdlc3VpdGUtc3RhZ2luZ1wiOl8zLFwiYWx3YXlzZGF0YVwiOl8zLFwibXlhbWF6ZVwiOl8zLFwiY2xvdWRmcm9udFwiOl8zLFwiYXBwdWRvXCI6XzMsXCJhdGxhc3NpYW4tZGV2XCI6WzAse1wicHJvZFwiOl81NH1dLFwibXlmcml0elwiOl8zLFwib25hdnN0YWNrXCI6XzMsXCJzaG9wc2VsZWN0XCI6XzMsXCJibGFja2JhdWRjZG5cIjpfMyxcImJvb21sYVwiOl8zLFwiYnBsYWNlZFwiOl8zLFwic3F1YXJlN1wiOl8zLFwiY2RuNzdcIjpbMCx7XCJyXCI6XzN9XSxcImNkbjc3LXNzbFwiOl8zLFwiZ2JcIjpfMyxcImh1XCI6XzMsXCJqcFwiOl8zLFwic2VcIjpfMyxcInVrXCI6XzMsXCJjbGlja3Jpc2luZ1wiOl8zLFwiZGRucy1pcFwiOl8zLFwiZG5zLWNsb3VkXCI6XzMsXCJkbnMtZHluYW1pY1wiOl8zLFwiY2xvdWRhY2Nlc3NcIjpfMyxcImNsb3VkZmxhcmVcIjpbMix7XCJjZG5cIjpfM31dLFwiY2xvdWRmbGFyZWFueWNhc3RcIjpfNTQsXCJjbG91ZGZsYXJlY25cIjpfNTQsXCJjbG91ZGZsYXJlZ2xvYmFsXCI6XzU0LFwiY3RmY2xvdWRcIjpfMyxcImZlc3RlLWlwXCI6XzMsXCJrbngtc2VydmVyXCI6XzMsXCJzdGF0aWMtYWNjZXNzXCI6XzMsXCJjcnlwdG9ub21pY1wiOl82LFwiZGF0dG9sb2NhbFwiOl8zLFwibXlkYXR0b1wiOl8zLFwiZGViaWFuXCI6XzMsXCJkZWZpbmltYVwiOl8zLFwiZGVub1wiOl8zLFwiaWNwXCI6XzYsXCJhdC1iYW5kLWNhbXBcIjpfMyxcImJsb2dkbnNcIjpfMyxcImJyb2tlLWl0XCI6XzMsXCJidXlzaG91c2VzXCI6XzMsXCJkbnNhbGlhc1wiOl8zLFwiZG5zZG9qb1wiOl8zLFwiZG9lcy1pdFwiOl8zLFwiZG9udGV4aXN0XCI6XzMsXCJkeW5hbGlhc1wiOl8zLFwiZHluYXRob21lXCI6XzMsXCJlbmRvZmludGVybmV0XCI6XzMsXCJmcm9tLWF6XCI6XzMsXCJmcm9tLWNvXCI6XzMsXCJmcm9tLWxhXCI6XzMsXCJmcm9tLW55XCI6XzMsXCJnZXRzLWl0XCI6XzMsXCJoYW0tcmFkaW8tb3BcIjpfMyxcImhvbWVmdHBcIjpfMyxcImhvbWVpcFwiOl8zLFwiaG9tZWxpbnV4XCI6XzMsXCJob21ldW5peFwiOl8zLFwiaW4tdGhlLWJhbmRcIjpfMyxcImlzLWEtY2hlZlwiOl8zLFwiaXMtYS1nZWVrXCI6XzMsXCJpc2EtZ2Vla1wiOl8zLFwia2lja3MtYXNzXCI6XzMsXCJvZmZpY2Utb24tdGhlXCI6XzMsXCJwb2R6b25lXCI6XzMsXCJzY3JhcHBlci1zaXRlXCI6XzMsXCJzZWxmaXBcIjpfMyxcInNlbGxzLWl0XCI6XzMsXCJzZXJ2ZWJic1wiOl8zLFwic2VydmVmdHBcIjpfMyxcInRocnVoZXJlXCI6XzMsXCJ3ZWJob3BcIjpfMyxcImNhc2FjYW1cIjpfMyxcImR5bnVcIjpfMyxcImR5bnY2XCI6XzMsXCJ0d21haWxcIjpfMyxcInJ1XCI6XzMsXCJjaGFubmVsc2R2clwiOlsyLHtcInVcIjpfM31dLFwiZmFzdGx5XCI6WzAse1wiZnJlZXRsc1wiOl8zLFwibWFwXCI6XzMsXCJwcm9kXCI6WzAse1wiYVwiOl8zLFwiZ2xvYmFsXCI6XzN9XSxcInNzbFwiOlswLHtcImFcIjpfMyxcImJcIjpfMyxcImdsb2JhbFwiOl8zfV19XSxcImZhc3RseWxiXCI6WzIse1wibWFwXCI6XzN9XSxcImVkZ2VhcHBcIjpfMyxcImtleXdvcmQtb25cIjpfMyxcImxpdmUtb25cIjpfMyxcInNlcnZlci1vblwiOl8zLFwiY2RuLWVkZ2VzXCI6XzMsXCJoZXRlbWxcIjpfMyxcImNsb3VkZnVuY3Rpb25zXCI6XzMsXCJncmFmYW5hLWRldlwiOl8zLFwiaW9iYlwiOl8zLFwibW9vbnNjYWxlXCI6XzMsXCJpbi1kc2xcIjpfMyxcImluLXZwblwiOl8zLFwib25pbmZlcm5vXCI6XzMsXCJib3RkYXNoXCI6XzMsXCJhcHBzLTFhbmQxXCI6XzMsXCJpcGlmb255XCI6XzMsXCJjbG91ZGppZmZ5XCI6WzIse1wiZnJhMS1kZVwiOl8zLFwid2VzdDEtdXNcIjpfM31dLFwiZWxhc3R4XCI6WzAse1wiamxzLXN0bzFcIjpfMyxcImpscy1zdG8yXCI6XzMsXCJqbHMtc3RvM1wiOl8zfV0sXCJtYXNzaXZlZ3JpZFwiOlswLHtcInBhYXNcIjpbMCx7XCJmci0xXCI6XzMsXCJsb24tMVwiOl8zLFwibG9uLTJcIjpfMyxcIm55LTFcIjpfMyxcIm55LTJcIjpfMyxcInNnLTFcIjpfM31dfV0sXCJzYXZlaW5jbG91ZFwiOlswLHtcImplbGFzdGljXCI6XzMsXCJub3JkZXN0ZS1pZGNcIjpfM31dLFwic2NhbGVmb3JjZVwiOl80OCxcImtpbmdob3N0XCI6XzMsXCJ1bmk1XCI6XzMsXCJrcmVsbGlhblwiOl8zLFwiZ2dmZlwiOl8zLFwibG9jYWx0b1wiOl82LFwiYmFyc3lcIjpfMyxcImx1eWFuaVwiOl8zLFwibWVtc2V0XCI6XzMsXCJhenVyZS1hcGlcIjpfMyxcImF6dXJlLW1vYmlsZVwiOl8zLFwiYXp1cmVlZGdlXCI6XzMsXCJhenVyZWZkXCI6XzMsXCJhenVyZXN0YXRpY2FwcHNcIjpbMix7XCIxXCI6XzMsXCIyXCI6XzMsXCIzXCI6XzMsXCI0XCI6XzMsXCI1XCI6XzMsXCI2XCI6XzMsXCI3XCI6XzMsXCJjZW50cmFsdXNcIjpfMyxcImVhc3Rhc2lhXCI6XzMsXCJlYXN0dXMyXCI6XzMsXCJ3ZXN0ZXVyb3BlXCI6XzMsXCJ3ZXN0dXMyXCI6XzN9XSxcImF6dXJld2Vic2l0ZXNcIjpfMyxcImNsb3VkYXBwXCI6XzMsXCJ0cmFmZmljbWFuYWdlclwiOl8zLFwid2luZG93c1wiOlswLHtcImNvcmVcIjpbMCx7XCJibG9iXCI6XzN9XSxcInNlcnZpY2VidXNcIjpfM31dLFwibXluZXRuYW1lXCI6WzAse1wic25cIjpfM31dLFwicm91dGluZ3RoZWNsb3VkXCI6XzMsXCJib3VuY2VtZVwiOl8zLFwiZGRuc1wiOl8zLFwiZWF0aW5nLW9yZ2FuaWNcIjpfMyxcIm15ZGlzc2VudFwiOl8zLFwibXllZmZlY3RcIjpfMyxcIm15bWVkaWFwY1wiOl8zLFwibXlwc3hcIjpfMyxcIm15c2VjdXJpdHljYW1lcmFcIjpfMyxcIm5obGZhblwiOl8zLFwibm8taXBcIjpfMyxcInBnYWZhblwiOl8zLFwicHJpdmF0aXplaGVhbHRoaW5zdXJhbmNlXCI6XzMsXCJyZWRpcmVjdG1lXCI6XzMsXCJzZXJ2ZWJsb2dcIjpfMyxcInNlcnZlbWluZWNyYWZ0XCI6XzMsXCJzeXRlc1wiOl8zLFwiZG5zdXBcIjpfMyxcImhpY2FtXCI6XzMsXCJub3ctZG5zXCI6XzMsXCJvd25pcFwiOl8zLFwidnBuZG5zXCI6XzMsXCJjbG91ZHljbHVzdGVyXCI6XzMsXCJvdmhcIjpbMCx7XCJob3N0aW5nXCI6XzYsXCJ3ZWJwYWFzXCI6XzZ9XSxcInJhY2ttYXplXCI6XzMsXCJteXJhZHdlYlwiOl8zLFwiaW5cIjpfMyxcInN1YnNjLXBheVwiOl8zLFwic3F1YXJlc1wiOl8zLFwic2Nob2tva2Vrc1wiOl8zLFwiZmlyZXdhbGwtZ2F0ZXdheVwiOl8zLFwic2VpZGF0XCI6XzMsXCJzZW5zZWVyaW5nXCI6XzMsXCJzaXRlbGVhZlwiOl8zLFwibWFmZWxvXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcInZwcy1ob3N0XCI6WzIse1wiamVsYXN0aWNcIjpbMCx7XCJhdGxcIjpfMyxcIm5qc1wiOl8zLFwicmljXCI6XzN9XX1dLFwic3JjZlwiOlswLHtcInNvY1wiOl8zLFwidXNlclwiOl8zfV0sXCJzdXBhYmFzZVwiOl8zLFwiZHNteW5hc1wiOl8zLFwiZmFtaWx5ZHNcIjpfMyxcInRzXCI6WzIse1wiY1wiOl82fV0sXCJ0b3Jwcm9qZWN0XCI6WzIse1wicGFnZXNcIjpfM31dLFwidnVzZXJjb250ZW50XCI6XzMsXCJyZXNlcnZlLW9ubGluZVwiOl8zLFwibG9jYWxjZXJ0XCI6XzMsXCJjb21tdW5pdHktcHJvXCI6XzMsXCJtZWluZm9ydW1cIjpfMyxcInlhbmRleGNsb3VkXCI6WzIse1wic3RvcmFnZVwiOl8zLFwid2Vic2l0ZVwiOl8zfV0sXCJ6YVwiOl8zLFwiemFiY1wiOl8zfV0sXCJuZlwiOlsxLHtcImFydHNcIjpfMixcImNvbVwiOl8yLFwiZmlybVwiOl8yLFwiaW5mb1wiOl8yLFwibmV0XCI6XzIsXCJvdGhlclwiOl8yLFwicGVyXCI6XzIsXCJyZWNcIjpfMixcInN0b3JlXCI6XzIsXCJ3ZWJcIjpfMn1dLFwibmdcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJpXCI6XzIsXCJtaWxcIjpfMixcIm1vYmlcIjpfMixcIm5hbWVcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJzY2hcIjpfMixcImJpelwiOlsyLHtcImNvXCI6XzMsXCJkbFwiOl8zLFwiZ29cIjpfMyxcImxnXCI6XzMsXCJvblwiOl8zfV0sXCJjb2xcIjpfMyxcImZpcm1cIjpfMyxcImdlblwiOl8zLFwibHRkXCI6XzMsXCJuZ29cIjpfMyxcInBsY1wiOl8zfV0sXCJuaVwiOlsxLHtcImFjXCI6XzIsXCJiaXpcIjpfMixcImNvXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ29iXCI6XzIsXCJpblwiOl8yLFwiaW5mb1wiOl8yLFwiaW50XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwibm9tXCI6XzIsXCJvcmdcIjpfMixcIndlYlwiOl8yfV0sXCJubFwiOlsxLHtcImNvXCI6XzMsXCJob3N0aW5nLWNsdXN0ZXJcIjpfMyxcImdvdlwiOl8zLFwia2hwbGF5XCI6XzMsXCIxMjN3ZWJzaXRlXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfMyxcInRyYW5zdXJsXCI6XzYsXCJjaXN0cm9uXCI6XzMsXCJkZW1vblwiOl8zfV0sXCJub1wiOlsxLHtcImZoc1wiOl8yLFwiZm9sa2ViaWJsXCI6XzIsXCJmeWxrZXNiaWJsXCI6XzIsXCJpZHJldHRcIjpfMixcIm11c2V1bVwiOl8yLFwicHJpdlwiOl8yLFwidmdzXCI6XzIsXCJkZXBcIjpfMixcImhlcmFkXCI6XzIsXCJrb21tdW5lXCI6XzIsXCJtaWxcIjpfMixcInN0YXRcIjpfMixcImFhXCI6XzYzLFwiYWhcIjpfNjMsXCJidVwiOl82MyxcImZtXCI6XzYzLFwiaGxcIjpfNjMsXCJobVwiOl82MyxcImphbi1tYXllblwiOl82MyxcIm1yXCI6XzYzLFwibmxcIjpfNjMsXCJudFwiOl82MyxcIm9mXCI6XzYzLFwib2xcIjpfNjMsXCJvc2xvXCI6XzYzLFwicmxcIjpfNjMsXCJzZlwiOl82MyxcInN0XCI6XzYzLFwic3ZhbGJhcmRcIjpfNjMsXCJ0bVwiOl82MyxcInRyXCI6XzYzLFwidmFcIjpfNjMsXCJ2ZlwiOl82MyxcImFrcmVoYW1uXCI6XzIsXCJ4bi0ta3JlaGFtbi1keGFcIjpfMixcIlx1MDBFNWtyZWhhbW5cIjpfMixcImFsZ2FyZFwiOl8yLFwieG4tLWxncmQtcG9hY1wiOl8yLFwiXHUwMEU1bGdcdTAwRTVyZFwiOl8yLFwiYXJuYVwiOl8yLFwiYnJvbm5veXN1bmRcIjpfMixcInhuLS1icm5ueXN1bmQtbThhY1wiOl8yLFwiYnJcdTAwRjhublx1MDBGOHlzdW5kXCI6XzIsXCJicnVtdW5kZGFsXCI6XzIsXCJicnluZVwiOl8yLFwiZHJvYmFrXCI6XzIsXCJ4bi0tZHJiYWstd3VhXCI6XzIsXCJkclx1MDBGOGJha1wiOl8yLFwiZWdlcnN1bmRcIjpfMixcImZldHN1bmRcIjpfMixcImZsb3JvXCI6XzIsXCJ4bi0tZmxvci1qcmFcIjpfMixcImZsb3JcdTAwRjhcIjpfMixcImZyZWRyaWtzdGFkXCI6XzIsXCJob2trc3VuZFwiOl8yLFwiaG9uZWZvc3NcIjpfMixcInhuLS1obmVmb3NzLXExYVwiOl8yLFwiaFx1MDBGOG5lZm9zc1wiOl8yLFwiamVzc2hlaW1cIjpfMixcImpvcnBlbGFuZFwiOl8yLFwieG4tLWpycGVsYW5kLTU0YVwiOl8yLFwialx1MDBGOHJwZWxhbmRcIjpfMixcImtpcmtlbmVzXCI6XzIsXCJrb3BlcnZpa1wiOl8yLFwia3Jva3N0YWRlbHZhXCI6XzIsXCJsYW5nZXZhZ1wiOl8yLFwieG4tLWxhbmdldmctanhhXCI6XzIsXCJsYW5nZXZcdTAwRTVnXCI6XzIsXCJsZWlydmlrXCI6XzIsXCJtam9uZGFsZW5cIjpfMixcInhuLS1tam5kYWxlbi02NGFcIjpfMixcIm1qXHUwMEY4bmRhbGVuXCI6XzIsXCJtby1pLXJhbmFcIjpfMixcIm1vc2pvZW5cIjpfMixcInhuLS1tb3NqZW4tZXlhXCI6XzIsXCJtb3NqXHUwMEY4ZW5cIjpfMixcIm5lc29kZHRhbmdlblwiOl8yLFwib3JrYW5nZXJcIjpfMixcIm9zb3lyb1wiOl8yLFwieG4tLW9zeXJvLXd1YVwiOl8yLFwib3NcdTAwRjh5cm9cIjpfMixcInJhaG9sdFwiOl8yLFwieG4tLXJob2x0LW1yYVwiOl8yLFwiclx1MDBFNWhvbHRcIjpfMixcInNhbmRuZXNzam9lblwiOl8yLFwieG4tLXNhbmRuZXNzamVuLW9nYlwiOl8yLFwic2FuZG5lc3NqXHUwMEY4ZW5cIjpfMixcInNrZWRzbW9rb3JzZXRcIjpfMixcInNsYXR0dW1cIjpfMixcInNwamVsa2F2aWtcIjpfMixcInN0YXRoZWxsZVwiOl8yLFwic3RhdmVyblwiOl8yLFwic3Rqb3JkYWxzaGFsc2VuXCI6XzIsXCJ4bi0tc3RqcmRhbHNoYWxzZW4tc3FiXCI6XzIsXCJzdGpcdTAwRjhyZGFsc2hhbHNlblwiOl8yLFwidGFuYW5nZXJcIjpfMixcInRyYW5ieVwiOl8yLFwidm9zc2V2YW5nZW5cIjpfMixcImFhcmJvcnRlXCI6XzIsXCJhZWpyaWVcIjpfMixcImFmam9yZFwiOl8yLFwieG4tLWZqb3JkLWxyYVwiOl8yLFwiXHUwMEU1ZmpvcmRcIjpfMixcImFnZGVuZXNcIjpfMixcImFrZXJzaHVzXCI6XzY0LFwiYWtub2x1b2t0YVwiOl8yLFwieG4tLWtvbHVva3RhLTd5YTU3aFwiOl8yLFwiXHUwMEUxa1x1MDE0Qm9sdW9rdGFcIjpfMixcImFsXCI6XzIsXCJ4bi0tbC0xZmFcIjpfMixcIlx1MDBFNWxcIjpfMixcImFsYWhlYWRqdVwiOl8yLFwieG4tLWxhaGVhZGp1LTd5YVwiOl8yLFwiXHUwMEUxbGFoZWFkanVcIjpfMixcImFsZXN1bmRcIjpfMixcInhuLS1sZXN1bmQtaHVhXCI6XzIsXCJcdTAwRTVsZXN1bmRcIjpfMixcImFsc3RhaGF1Z1wiOl8yLFwiYWx0YVwiOl8yLFwieG4tLWx0LWxpYWNcIjpfMixcIlx1MDBFMWx0XHUwMEUxXCI6XzIsXCJhbHZkYWxcIjpfMixcImFtbGlcIjpfMixcInhuLS1tbGktdGxhXCI6XzIsXCJcdTAwRTVtbGlcIjpfMixcImFtb3RcIjpfMixcInhuLS1tb3QtdGxhXCI6XzIsXCJcdTAwRTVtb3RcIjpfMixcImFuZGFzdW9sb1wiOl8yLFwiYW5kZWJ1XCI6XzIsXCJhbmRveVwiOl8yLFwieG4tLWFuZHktaXJhXCI6XzIsXCJhbmRcdTAwRjh5XCI6XzIsXCJhcmRhbFwiOl8yLFwieG4tLXJkYWwtcG9hXCI6XzIsXCJcdTAwRTVyZGFsXCI6XzIsXCJhcmVtYXJrXCI6XzIsXCJhcmVuZGFsXCI6XzIsXCJ4bi0tcy0xZmFcIjpfMixcIlx1MDBFNXNcIjpfMixcImFzZXJhbFwiOl8yLFwieG4tLXNlcmFsLWxyYVwiOl8yLFwiXHUwMEU1c2VyYWxcIjpfMixcImFza2VyXCI6XzIsXCJhc2tpbVwiOl8yLFwiYXNrb3lcIjpfMixcInhuLS1hc2t5LWlyYVwiOl8yLFwiYXNrXHUwMEY4eVwiOl8yLFwiYXNrdm9sbFwiOl8yLFwiYXNuZXNcIjpfMixcInhuLS1zbmVzLXBvYVwiOl8yLFwiXHUwMEU1c25lc1wiOl8yLFwiYXVkbmVkYWxuXCI6XzIsXCJhdWtyYVwiOl8yLFwiYXVyZVwiOl8yLFwiYXVybGFuZFwiOl8yLFwiYXVyc2tvZy1ob2xhbmRcIjpfMixcInhuLS1hdXJza29nLWhsYW5kLWpuYlwiOl8yLFwiYXVyc2tvZy1oXHUwMEY4bGFuZFwiOl8yLFwiYXVzdGV2b2xsXCI6XzIsXCJhdXN0cmhlaW1cIjpfMixcImF2ZXJveVwiOl8yLFwieG4tLWF2ZXJ5LXl1YVwiOl8yLFwiYXZlclx1MDBGOHlcIjpfMixcImJhZGFkZGphXCI6XzIsXCJ4bi0tYmRkZGotbXJhYmRcIjpfMixcImJcdTAwRTVkXHUwMEU1ZGRqXHUwMEU1XCI6XzIsXCJ4bi0tYnJ1bS12b2FcIjpfMixcImJcdTAwRTZydW1cIjpfMixcImJhaGNhdnVvdG5hXCI6XzIsXCJ4bi0tYmhjYXZ1b3RuYS1zNGFcIjpfMixcImJcdTAwRTFoY2F2dW90bmFcIjpfMixcImJhaGNjYXZ1b3RuYVwiOl8yLFwieG4tLWJoY2NhdnVvdG5hLWs3YVwiOl8yLFwiYlx1MDBFMWhjY2F2dW90bmFcIjpfMixcImJhaWRhclwiOl8yLFwieG4tLWJpZHItNW5hY1wiOl8yLFwiYlx1MDBFMWlkXHUwMEUxclwiOl8yLFwiYmFqZGRhclwiOl8yLFwieG4tLWJqZGRhci1wdGFcIjpfMixcImJcdTAwRTFqZGRhclwiOl8yLFwiYmFsYXRcIjpfMixcInhuLS1ibHQtZWxhYlwiOl8yLFwiYlx1MDBFMWxcdTAwRTF0XCI6XzIsXCJiYWxlc3RyYW5kXCI6XzIsXCJiYWxsYW5nZW5cIjpfMixcImJhbHNmam9yZFwiOl8yLFwiYmFtYmxlXCI6XzIsXCJiYXJkdVwiOl8yLFwiYmFydW1cIjpfMixcImJhdHNmam9yZFwiOl8yLFwieG4tLWJ0c2Zqb3JkLTl6YVwiOl8yLFwiYlx1MDBFNXRzZmpvcmRcIjpfMixcImJlYXJhbHZhaGtpXCI6XzIsXCJ4bi0tYmVhcmFsdmhraS15NGFcIjpfMixcImJlYXJhbHZcdTAwRTFoa2lcIjpfMixcImJlYXJkdVwiOl8yLFwiYmVpYXJuXCI6XzIsXCJiZXJnXCI6XzIsXCJiZXJnZW5cIjpfMixcImJlcmxldmFnXCI6XzIsXCJ4bi0tYmVybGV2Zy1qeGFcIjpfMixcImJlcmxldlx1MDBFNWdcIjpfMixcImJpZXZhdFwiOl8yLFwieG4tLWJpZXZ0LTBxYVwiOl8yLFwiYmlldlx1MDBFMXRcIjpfMixcImJpbmRhbFwiOl8yLFwiYmlya2VuZXNcIjpfMixcImJqYXJrb3lcIjpfMixcInhuLS1iamFya3ktZnlhXCI6XzIsXCJiamFya1x1MDBGOHlcIjpfMixcImJqZXJrcmVpbVwiOl8yLFwiYmp1Z25cIjpfMixcImJvZG9cIjpfMixcInhuLS1ib2QtMm5hXCI6XzIsXCJib2RcdTAwRjhcIjpfMixcImJva25cIjpfMixcImJvbWxvXCI6XzIsXCJ4bi0tYm1sby1ncmFcIjpfMixcImJcdTAwRjhtbG9cIjpfMixcImJyZW1hbmdlclwiOl8yLFwiYnJvbm5veVwiOl8yLFwieG4tLWJybm55LXd1YWNcIjpfMixcImJyXHUwMEY4bm5cdTAwRjh5XCI6XzIsXCJidWRlamp1XCI6XzIsXCJidXNrZXJ1ZFwiOl82NCxcImJ5Z2xhbmRcIjpfMixcImJ5a2xlXCI6XzIsXCJjYWhjZXN1b2xvXCI6XzIsXCJ4bi0taGNlc3VvbG8tN3lhMzViXCI6XzIsXCJcdTAxMERcdTAwRTFoY2VzdW9sb1wiOl8yLFwiZGF2dmVuamFyZ2FcIjpfMixcInhuLS1kYXZ2ZW5qcmdhLXk0YVwiOl8yLFwiZGF2dmVualx1MDBFMXJnYVwiOl8yLFwiZGF2dmVzaWlkYVwiOl8yLFwiZGVhdG51XCI6XzIsXCJkaWVsZGRhbnVvcnJpXCI6XzIsXCJkaXZ0YXN2dW9kbmFcIjpfMixcImRpdnR0YXN2dW90bmFcIjpfMixcImRvbm5hXCI6XzIsXCJ4bi0tZG5uYS1ncmFcIjpfMixcImRcdTAwRjhubmFcIjpfMixcImRvdnJlXCI6XzIsXCJkcmFtbWVuXCI6XzIsXCJkcmFuZ2VkYWxcIjpfMixcImR5cm95XCI6XzIsXCJ4bi0tZHlyeS1pcmFcIjpfMixcImR5clx1MDBGOHlcIjpfMixcImVpZFwiOl8yLFwiZWlkZmpvcmRcIjpfMixcImVpZHNiZXJnXCI6XzIsXCJlaWRza29nXCI6XzIsXCJlaWRzdm9sbFwiOl8yLFwiZWlnZXJzdW5kXCI6XzIsXCJlbHZlcnVtXCI6XzIsXCJlbmViYWtrXCI6XzIsXCJlbmdlcmRhbFwiOl8yLFwiZXRuZVwiOl8yLFwiZXRuZWRhbFwiOl8yLFwiZXZlbmFzc2lcIjpfMixcInhuLS1ldmVuaS0wcWEwMWdhXCI6XzIsXCJldmVuXHUwMEUxXHUwMTYxXHUwMTYxaVwiOl8yLFwiZXZlbmVzXCI6XzIsXCJldmplLW9nLWhvcm5uZXNcIjpfMixcImZhcnN1bmRcIjpfMixcImZhdXNrZVwiOl8yLFwiZmVkamVcIjpfMixcImZldFwiOl8yLFwiZmlubm95XCI6XzIsXCJ4bi0tZmlubnkteXVhXCI6XzIsXCJmaW5uXHUwMEY4eVwiOl8yLFwiZml0amFyXCI6XzIsXCJmamFsZXJcIjpfMixcImZqZWxsXCI6XzIsXCJmbGFcIjpfMixcInhuLS1mbC16aWFcIjpfMixcImZsXHUwMEU1XCI6XzIsXCJmbGFrc3RhZFwiOl8yLFwiZmxhdGFuZ2VyXCI6XzIsXCJmbGVra2Vmam9yZFwiOl8yLFwiZmxlc2JlcmdcIjpfMixcImZsb3JhXCI6XzIsXCJmb2xsZGFsXCI6XzIsXCJmb3JkZVwiOl8yLFwieG4tLWZyZGUtZ3JhXCI6XzIsXCJmXHUwMEY4cmRlXCI6XzIsXCJmb3JzYW5kXCI6XzIsXCJmb3NuZXNcIjpfMixcInhuLS1mcm5hLXdvYVwiOl8yLFwiZnJcdTAwRTZuYVwiOl8yLFwiZnJhbmFcIjpfMixcImZyZWlcIjpfMixcImZyb2duXCI6XzIsXCJmcm9sYW5kXCI6XzIsXCJmcm9zdGFcIjpfMixcImZyb3lhXCI6XzIsXCJ4bi0tZnJ5YS1ocmFcIjpfMixcImZyXHUwMEY4eWFcIjpfMixcImZ1b2lza3VcIjpfMixcImZ1b3Nza29cIjpfMixcImZ1c2FcIjpfMixcImZ5cmVzZGFsXCI6XzIsXCJnYWl2dW90bmFcIjpfMixcInhuLS1naXZ1b3RuYS04eWFcIjpfMixcImdcdTAwRTFpdnVvdG5hXCI6XzIsXCJnYWxzYVwiOl8yLFwieG4tLWdscy1lbGFjXCI6XzIsXCJnXHUwMEUxbHNcdTAwRTFcIjpfMixcImdhbXZpa1wiOl8yLFwiZ2FuZ2F2aWlrYVwiOl8yLFwieG4tLWdnYXZpaWthLTh5YTQ3aFwiOl8yLFwiZ1x1MDBFMVx1MDE0Qmdhdmlpa2FcIjpfMixcImdhdWxhclwiOl8yLFwiZ2F1c2RhbFwiOl8yLFwiZ2llaHRhdnVvYXRuYVwiOl8yLFwiZ2lsZGVza2FsXCI6XzIsXCJ4bi0tZ2lsZGVza2wtZzBhXCI6XzIsXCJnaWxkZXNrXHUwMEU1bFwiOl8yLFwiZ2lza2VcIjpfMixcImdqZW1uZXNcIjpfMixcImdqZXJkcnVtXCI6XzIsXCJnamVyc3RhZFwiOl8yLFwiZ2plc2RhbFwiOl8yLFwiZ2pvdmlrXCI6XzIsXCJ4bi0tZ2p2aWstd3VhXCI6XzIsXCJnalx1MDBGOHZpa1wiOl8yLFwiZ2xvcHBlblwiOl8yLFwiZ29sXCI6XzIsXCJncmFuXCI6XzIsXCJncmFuZVwiOl8yLFwiZ3JhbnZpblwiOl8yLFwiZ3JhdGFuZ2VuXCI6XzIsXCJncmltc3RhZFwiOl8yLFwiZ3JvbmdcIjpfMixcImdydWVcIjpfMixcImd1bGVuXCI6XzIsXCJndW92ZGFnZWFpZG51XCI6XzIsXCJoYVwiOl8yLFwieG4tLWgtMmZhXCI6XzIsXCJoXHUwMEU1XCI6XzIsXCJoYWJtZXJcIjpfMixcInhuLS1oYm1lci14cWFcIjpfMixcImhcdTAwRTFibWVyXCI6XzIsXCJoYWRzZWxcIjpfMixcInhuLS1oZ2Vib3N0YWQtZzNhXCI6XzIsXCJoXHUwMEU2Z2Vib3N0YWRcIjpfMixcImhhZ2Vib3N0YWRcIjpfMixcImhhbGRlblwiOl8yLFwiaGFsc2FcIjpfMixcImhhbWFyXCI6XzIsXCJoYW1hcm95XCI6XzIsXCJoYW1tYXJmZWFzdGFcIjpfMixcInhuLS1obW1yZmVhc3RhLXM0YWNcIjpfMixcImhcdTAwRTFtbVx1MDBFMXJmZWFzdGFcIjpfMixcImhhbW1lcmZlc3RcIjpfMixcImhhcG1pclwiOl8yLFwieG4tLWhwbWlyLXhxYVwiOl8yLFwiaFx1MDBFMXBtaXJcIjpfMixcImhhcmFtXCI6XzIsXCJoYXJlaWRcIjpfMixcImhhcnN0YWRcIjpfMixcImhhc3Zpa1wiOl8yLFwiaGF0dGZqZWxsZGFsXCI6XzIsXCJoYXVnZXN1bmRcIjpfMixcImhlZG1hcmtcIjpbMCx7XCJvc1wiOl8yLFwidmFsZXJcIjpfMixcInhuLS12bGVyLXFvYVwiOl8yLFwidlx1MDBFNWxlclwiOl8yfV0sXCJoZW1uZVwiOl8yLFwiaGVtbmVzXCI6XzIsXCJoZW1zZWRhbFwiOl8yLFwiaGl0cmFcIjpfMixcImhqYXJ0ZGFsXCI6XzIsXCJoamVsbWVsYW5kXCI6XzIsXCJob2JvbFwiOl8yLFwieG4tLWhvYmwtaXJhXCI6XzIsXCJob2JcdTAwRjhsXCI6XzIsXCJob2ZcIjpfMixcImhvbFwiOl8yLFwiaG9sZVwiOl8yLFwiaG9sbWVzdHJhbmRcIjpfMixcImhvbHRhbGVuXCI6XzIsXCJ4bi0taG9sdGxlbi1oeGFcIjpfMixcImhvbHRcdTAwRTVsZW5cIjpfMixcImhvcmRhbGFuZFwiOlswLHtcIm9zXCI6XzJ9XSxcImhvcm5pbmRhbFwiOl8yLFwiaG9ydGVuXCI6XzIsXCJob3lhbmdlclwiOl8yLFwieG4tLWh5YW5nZXItcTFhXCI6XzIsXCJoXHUwMEY4eWFuZ2VyXCI6XzIsXCJob3lsYW5kZXRcIjpfMixcInhuLS1oeWxhbmRldC01NGFcIjpfMixcImhcdTAwRjh5bGFuZGV0XCI6XzIsXCJodXJkYWxcIjpfMixcImh1cnVtXCI6XzIsXCJodmFsZXJcIjpfMixcImh5bGxlc3RhZFwiOl8yLFwiaWJlc3RhZFwiOl8yLFwiaW5kZXJveVwiOl8yLFwieG4tLWluZGVyeS1meWFcIjpfMixcImluZGVyXHUwMEY4eVwiOl8yLFwiaXZlbGFuZFwiOl8yLFwiaXZndVwiOl8yLFwiamV2bmFrZXJcIjpfMixcImpvbHN0ZXJcIjpfMixcInhuLS1qbHN0ZXItYnlhXCI6XzIsXCJqXHUwMEY4bHN0ZXJcIjpfMixcImpvbmRhbFwiOl8yLFwia2Fmam9yZFwiOl8yLFwieG4tLWtmam9yZC1pdWFcIjpfMixcImtcdTAwRTVmam9yZFwiOl8yLFwia2FyYXNqb2hrYVwiOl8yLFwieG4tLWtyam9oa2EtaHdhYjQ5alwiOl8yLFwia1x1MDBFMXJcdTAwRTFcdTAxNjFqb2hrYVwiOl8yLFwia2FyYXNqb2tcIjpfMixcImthcmxzb3lcIjpfMixcImthcm1veVwiOl8yLFwieG4tLWthcm15LXl1YVwiOl8yLFwia2FybVx1MDBGOHlcIjpfMixcImthdXRva2Vpbm9cIjpfMixcImtsYWJ1XCI6XzIsXCJ4bi0ta2xidS13b2FcIjpfMixcImtsXHUwMEU2YnVcIjpfMixcImtsZXBwXCI6XzIsXCJrb25nc2JlcmdcIjpfMixcImtvbmdzdmluZ2VyXCI6XzIsXCJrcmFhbmdoa2VcIjpfMixcInhuLS1rcmFuZ2hrZS1iMGFcIjpfMixcImtyXHUwMEU1YW5naGtlXCI6XzIsXCJrcmFnZXJvXCI6XzIsXCJ4bi0ta3JhZ2VyLWd5YVwiOl8yLFwia3JhZ2VyXHUwMEY4XCI6XzIsXCJrcmlzdGlhbnNhbmRcIjpfMixcImtyaXN0aWFuc3VuZFwiOl8yLFwia3JvZHNoZXJhZFwiOl8yLFwieG4tLWtyZHNoZXJhZC1tOGFcIjpfMixcImtyXHUwMEY4ZHNoZXJhZFwiOl8yLFwieG4tLWt2ZmpvcmQtbnhhXCI6XzIsXCJrdlx1MDBFNmZqb3JkXCI6XzIsXCJ4bi0ta3ZuYW5nZW4tazBhXCI6XzIsXCJrdlx1MDBFNm5hbmdlblwiOl8yLFwia3ZhZmpvcmRcIjpfMixcImt2YWxzdW5kXCI6XzIsXCJrdmFtXCI6XzIsXCJrdmFuYW5nZW5cIjpfMixcImt2aW5lc2RhbFwiOl8yLFwia3Zpbm5oZXJhZFwiOl8yLFwia3ZpdGVzZWlkXCI6XzIsXCJrdml0c295XCI6XzIsXCJ4bi0ta3ZpdHN5LWZ5YVwiOl8yLFwia3ZpdHNcdTAwRjh5XCI6XzIsXCJsYWFrZXN2dWVtaWVcIjpfMixcInhuLS1scmRhbC1zcmFcIjpfMixcImxcdTAwRTZyZGFsXCI6XzIsXCJsYWhwcGlcIjpfMixcInhuLS1saHBwaS14cWFcIjpfMixcImxcdTAwRTFocHBpXCI6XzIsXCJsYXJkYWxcIjpfMixcImxhcnZpa1wiOl8yLFwibGF2YWdpc1wiOl8yLFwibGF2YW5nZW5cIjpfMixcImxlYW5nYXZpaWthXCI6XzIsXCJ4bi0tbGVhZ2F2aWlrYS01MmJcIjpfMixcImxlYVx1MDE0Qmdhdmlpa2FcIjpfMixcImxlYmVzYnlcIjpfMixcImxlaWthbmdlclwiOl8yLFwibGVpcmZqb3JkXCI6XzIsXCJsZWthXCI6XzIsXCJsZWtzdmlrXCI6XzIsXCJsZW52aWtcIjpfMixcImxlcmRhbFwiOl8yLFwibGVzamFcIjpfMixcImxldmFuZ2VyXCI6XzIsXCJsaWVyXCI6XzIsXCJsaWVybmVcIjpfMixcImxpbGxlaGFtbWVyXCI6XzIsXCJsaWxsZXNhbmRcIjpfMixcImxpbmRhc1wiOl8yLFwieG4tLWxpbmRzLXByYVwiOl8yLFwibGluZFx1MDBFNXNcIjpfMixcImxpbmRlc25lc1wiOl8yLFwibG9hYmF0XCI6XzIsXCJ4bi0tbG9hYnQtMHFhXCI6XzIsXCJsb2FiXHUwMEUxdFwiOl8yLFwibG9kaW5nZW5cIjpfMixcInhuLS1sZGluZ2VuLXExYVwiOl8yLFwibFx1MDBGOGRpbmdlblwiOl8yLFwibG9tXCI6XzIsXCJsb3BwYVwiOl8yLFwibG9yZW5za29nXCI6XzIsXCJ4bi0tbHJlbnNrb2ctNTRhXCI6XzIsXCJsXHUwMEY4cmVuc2tvZ1wiOl8yLFwibG90ZW5cIjpfMixcInhuLS1sdGVuLWdyYVwiOl8yLFwibFx1MDBGOHRlblwiOl8yLFwibHVuZFwiOl8yLFwibHVubmVyXCI6XzIsXCJsdXJveVwiOl8yLFwieG4tLWx1cnktaXJhXCI6XzIsXCJsdXJcdTAwRjh5XCI6XzIsXCJsdXN0ZXJcIjpfMixcImx5bmdkYWxcIjpfMixcImx5bmdlblwiOl8yLFwibWFsYXR2dW9wbWlcIjpfMixcInhuLS1tbGF0dnVvcG1pLXM0YVwiOl8yLFwibVx1MDBFMWxhdHZ1b3BtaVwiOl8yLFwibWFsc2VsdlwiOl8yLFwieG4tLW1sc2Vsdi1pdWFcIjpfMixcIm1cdTAwRTVsc2VsdlwiOl8yLFwibWFsdmlrXCI6XzIsXCJtYW5kYWxcIjpfMixcIm1hcmtlclwiOl8yLFwibWFybmFyZGFsXCI6XzIsXCJtYXNmam9yZGVuXCI6XzIsXCJtYXNveVwiOl8yLFwieG4tLW1zeS11bGEwaFwiOl8yLFwibVx1MDBFNXNcdTAwRjh5XCI6XzIsXCJtYXR0YS12YXJqamF0XCI6XzIsXCJ4bi0tbXR0YS12cmpqYXQtazdhZlwiOl8yLFwibVx1MDBFMXR0YS12XHUwMEUxcmpqYXRcIjpfMixcIm1lbGFuZFwiOl8yLFwibWVsZGFsXCI6XzIsXCJtZWxodXNcIjpfMixcIm1lbG95XCI6XzIsXCJ4bi0tbWVseS1pcmFcIjpfMixcIm1lbFx1MDBGOHlcIjpfMixcIm1lcmFrZXJcIjpfMixcInhuLS1tZXJrZXIta3VhXCI6XzIsXCJtZXJcdTAwRTVrZXJcIjpfMixcIm1pZHN1bmRcIjpfMixcIm1pZHRyZS1nYXVsZGFsXCI6XzIsXCJtb2FyZWtlXCI6XzIsXCJ4bi0tbW9yZWtlLWp1YVwiOl8yLFwibW9cdTAwRTVyZWtlXCI6XzIsXCJtb2RhbGVuXCI6XzIsXCJtb2R1bVwiOl8yLFwibW9sZGVcIjpfMixcIm1vcmUtb2ctcm9tc2RhbFwiOlswLHtcImhlcm95XCI6XzIsXCJzYW5kZVwiOl8yfV0sXCJ4bi0tbXJlLW9nLXJvbXNkYWwtcXFiXCI6WzAse1wieG4tLWhlcnktaXJhXCI6XzIsXCJzYW5kZVwiOl8yfV0sXCJtXHUwMEY4cmUtb2ctcm9tc2RhbFwiOlswLHtcImhlclx1MDBGOHlcIjpfMixcInNhbmRlXCI6XzJ9XSxcIm1vc2tlbmVzXCI6XzIsXCJtb3NzXCI6XzIsXCJtb3N2aWtcIjpfMixcIm11b3NhdFwiOl8yLFwieG4tLW11b3N0LTBxYVwiOl8yLFwibXVvc1x1MDBFMXRcIjpfMixcIm5hYW1lc2pldnVlbWllXCI6XzIsXCJ4bi0tbm1lc2pldnVlbWllLXRjYmFcIjpfMixcIm5cdTAwRTVcdTAwRTVtZXNqZXZ1ZW1pZVwiOl8yLFwieG4tLW5yeS15bGE1Z1wiOl8yLFwiblx1MDBFNnJcdTAwRjh5XCI6XzIsXCJuYW1kYWxzZWlkXCI6XzIsXCJuYW1zb3NcIjpfMixcIm5hbXNza29nYW5cIjpfMixcIm5hbm5lc3RhZFwiOl8yLFwibmFyb3lcIjpfMixcIm5hcnZpaWthXCI6XzIsXCJuYXJ2aWtcIjpfMixcIm5hdXN0ZGFsXCI6XzIsXCJuYXZ1b3RuYVwiOl8yLFwieG4tLW52dW90bmEtaHdhXCI6XzIsXCJuXHUwMEUxdnVvdG5hXCI6XzIsXCJuZWRyZS1laWtlclwiOl8yLFwibmVzbmFcIjpfMixcIm5lc29kZGVuXCI6XzIsXCJuZXNzZWJ5XCI6XzIsXCJuZXNzZXRcIjpfMixcIm5pc3NlZGFsXCI6XzIsXCJuaXR0ZWRhbFwiOl8yLFwibm9yZC1hdXJkYWxcIjpfMixcIm5vcmQtZnJvblwiOl8yLFwibm9yZC1vZGFsXCI6XzIsXCJub3JkZGFsXCI6XzIsXCJub3Jka2FwcFwiOl8yLFwibm9yZGxhbmRcIjpbMCx7XCJib1wiOl8yLFwieG4tLWItNWdhXCI6XzIsXCJiXHUwMEY4XCI6XzIsXCJoZXJveVwiOl8yLFwieG4tLWhlcnktaXJhXCI6XzIsXCJoZXJcdTAwRjh5XCI6XzJ9XSxcIm5vcmRyZS1sYW5kXCI6XzIsXCJub3JkcmVpc2FcIjpfMixcIm5vcmUtb2ctdXZkYWxcIjpfMixcIm5vdG9kZGVuXCI6XzIsXCJub3R0ZXJveVwiOl8yLFwieG4tLW50dGVyeS1ieWFlXCI6XzIsXCJuXHUwMEY4dHRlclx1MDBGOHlcIjpfMixcIm9kZGFcIjpfMixcIm9rc25lc1wiOl8yLFwieG4tLWtzbmVzLXV1YVwiOl8yLFwiXHUwMEY4a3NuZXNcIjpfMixcIm9tYXN2dW90bmFcIjpfMixcIm9wcGRhbFwiOl8yLFwib3BwZWdhcmRcIjpfMixcInhuLS1vcHBlZ3JkLWl4YVwiOl8yLFwib3BwZWdcdTAwRTVyZFwiOl8yLFwib3JrZGFsXCI6XzIsXCJvcmxhbmRcIjpfMixcInhuLS1ybGFuZC11dWFcIjpfMixcIlx1MDBGOHJsYW5kXCI6XzIsXCJvcnNrb2dcIjpfMixcInhuLS1yc2tvZy11dWFcIjpfMixcIlx1MDBGOHJza29nXCI6XzIsXCJvcnN0YVwiOl8yLFwieG4tLXJzdGEtZnJhXCI6XzIsXCJcdTAwRjhyc3RhXCI6XzIsXCJvc2VuXCI6XzIsXCJvc3Rlcm95XCI6XzIsXCJ4bi0tb3N0ZXJ5LWZ5YVwiOl8yLFwib3N0ZXJcdTAwRjh5XCI6XzIsXCJvc3Rmb2xkXCI6WzAse1widmFsZXJcIjpfMn1dLFwieG4tLXN0Zm9sZC05eGFcIjpbMCx7XCJ4bi0tdmxlci1xb2FcIjpfMn1dLFwiXHUwMEY4c3Rmb2xkXCI6WzAse1widlx1MDBFNWxlclwiOl8yfV0sXCJvc3RyZS10b3RlblwiOl8yLFwieG4tLXN0cmUtdG90ZW4temNiXCI6XzIsXCJcdTAwRjhzdHJlLXRvdGVuXCI6XzIsXCJvdmVyaGFsbGFcIjpfMixcIm92cmUtZWlrZXJcIjpfMixcInhuLS12cmUtZWlrZXItazhhXCI6XzIsXCJcdTAwRjh2cmUtZWlrZXJcIjpfMixcIm95ZXJcIjpfMixcInhuLS15ZXItem5hXCI6XzIsXCJcdTAwRjh5ZXJcIjpfMixcIm95Z2FyZGVuXCI6XzIsXCJ4bi0teWdhcmRlbi1wMWFcIjpfMixcIlx1MDBGOHlnYXJkZW5cIjpfMixcIm95c3RyZS1zbGlkcmVcIjpfMixcInhuLS15c3RyZS1zbGlkcmUtdWpiXCI6XzIsXCJcdTAwRjh5c3RyZS1zbGlkcmVcIjpfMixcInBvcnNhbmdlclwiOl8yLFwicG9yc2FuZ3VcIjpfMixcInhuLS1wb3JzZ3Utc3RhMjZmXCI6XzIsXCJwb3JzXHUwMEUxXHUwMTRCZ3VcIjpfMixcInBvcnNncnVublwiOl8yLFwicmFkZVwiOl8yLFwieG4tLXJkZS11bGFcIjpfMixcInJcdTAwRTVkZVwiOl8yLFwicmFkb3lcIjpfMixcInhuLS1yYWR5LWlyYVwiOl8yLFwicmFkXHUwMEY4eVwiOl8yLFwieG4tLXJsaW5nZW4tbXhhXCI6XzIsXCJyXHUwMEU2bGluZ2VuXCI6XzIsXCJyYWhra2VyYXZqdVwiOl8yLFwieG4tLXJoa2tlcnZqdS0wMWFmXCI6XzIsXCJyXHUwMEUxaGtrZXJcdTAwRTF2anVcIjpfMixcInJhaXNhXCI6XzIsXCJ4bi0tcmlzYS01bmFcIjpfMixcInJcdTAwRTFpc2FcIjpfMixcInJha2tlc3RhZFwiOl8yLFwicmFsaW5nZW5cIjpfMixcInJhbmFcIjpfMixcInJhbmRhYmVyZ1wiOl8yLFwicmF1bWFcIjpfMixcInJlbmRhbGVuXCI6XzIsXCJyZW5uZWJ1XCI6XzIsXCJyZW5uZXNveVwiOl8yLFwieG4tLXJlbm5lc3ktdjFhXCI6XzIsXCJyZW5uZXNcdTAwRjh5XCI6XzIsXCJyaW5kYWxcIjpfMixcInJpbmdlYnVcIjpfMixcInJpbmdlcmlrZVwiOl8yLFwicmluZ3Nha2VyXCI6XzIsXCJyaXNvclwiOl8yLFwieG4tLXJpc3ItaXJhXCI6XzIsXCJyaXNcdTAwRjhyXCI6XzIsXCJyaXNzYVwiOl8yLFwicm9hblwiOl8yLFwicm9kb3lcIjpfMixcInhuLS1yZHktMG5hYlwiOl8yLFwiclx1MDBGOGRcdTAwRjh5XCI6XzIsXCJyb2xsYWdcIjpfMixcInJvbXNhXCI6XzIsXCJyb21za29nXCI6XzIsXCJ4bi0tcm1za29nLWJ5YVwiOl8yLFwiclx1MDBGOG1za29nXCI6XzIsXCJyb3Jvc1wiOl8yLFwieG4tLXJyb3MtZ3JhXCI6XzIsXCJyXHUwMEY4cm9zXCI6XzIsXCJyb3N0XCI6XzIsXCJ4bi0tcnN0LTBuYVwiOl8yLFwiclx1MDBGOHN0XCI6XzIsXCJyb3lrZW5cIjpfMixcInhuLS1yeWtlbi12dWFcIjpfMixcInJcdTAwRjh5a2VuXCI6XzIsXCJyb3lydmlrXCI6XzIsXCJ4bi0tcnlydmlrLWJ5YVwiOl8yLFwiclx1MDBGOHlydmlrXCI6XzIsXCJydW92YXRcIjpfMixcInJ5Z2dlXCI6XzIsXCJzYWxhbmdlblwiOl8yLFwic2FsYXRcIjpfMixcInhuLS1zbGF0LTVuYVwiOl8yLFwic1x1MDBFMWxhdFwiOl8yLFwieG4tLXNsdC1lbGFiXCI6XzIsXCJzXHUwMEUxbFx1MDBFMXRcIjpfMixcInNhbHRkYWxcIjpfMixcInNhbW5hbmdlclwiOl8yLFwic2FuZGVmam9yZFwiOl8yLFwic2FuZG5lc1wiOl8yLFwic2FuZG95XCI6XzIsXCJ4bi0tc2FuZHkteXVhXCI6XzIsXCJzYW5kXHUwMEY4eVwiOl8yLFwic2FycHNib3JnXCI6XzIsXCJzYXVkYVwiOl8yLFwic2F1aGVyYWRcIjpfMixcInNlbFwiOl8yLFwic2VsYnVcIjpfMixcInNlbGplXCI6XzIsXCJzZWxqb3JkXCI6XzIsXCJzaWVsbGFrXCI6XzIsXCJzaWdkYWxcIjpfMixcInNpbGphblwiOl8yLFwic2lyZGFsXCI6XzIsXCJza2FuaXRcIjpfMixcInhuLS1za25pdC15cWFcIjpfMixcInNrXHUwMEUxbml0XCI6XzIsXCJza2FubGFuZFwiOl8yLFwieG4tLXNrbmxhbmQtZnhhXCI6XzIsXCJza1x1MDBFNW5sYW5kXCI6XzIsXCJza2F1blwiOl8yLFwic2tlZHNtb1wiOl8yLFwic2tpXCI6XzIsXCJza2llblwiOl8yLFwic2tpZXJ2YVwiOl8yLFwieG4tLXNraWVydi11dGFcIjpfMixcInNraWVydlx1MDBFMVwiOl8yLFwic2tpcHR2ZXRcIjpfMixcInNramFrXCI6XzIsXCJ4bi0tc2tqay1zb2FcIjpfMixcInNralx1MDBFNWtcIjpfMixcInNramVydm95XCI6XzIsXCJ4bi0tc2tqZXJ2eS12MWFcIjpfMixcInNramVydlx1MDBGOHlcIjpfMixcInNrb2RqZVwiOl8yLFwic21vbGFcIjpfMixcInhuLS1zbWxhLWhyYVwiOl8yLFwic21cdTAwRjhsYVwiOl8yLFwic25hYXNlXCI6XzIsXCJ4bi0tc25hc2UtbnJhXCI6XzIsXCJzblx1MDBFNWFzZVwiOl8yLFwic25hc2FcIjpfMixcInhuLS1zbnNhLXJvYVwiOl8yLFwic25cdTAwRTVzYVwiOl8yLFwic25pbGxmam9yZFwiOl8yLFwic25vYXNhXCI6XzIsXCJzb2duZGFsXCI6XzIsXCJzb2duZVwiOl8yLFwieG4tLXNnbmUtZ3JhXCI6XzIsXCJzXHUwMEY4Z25lXCI6XzIsXCJzb2tuZGFsXCI6XzIsXCJzb2xhXCI6XzIsXCJzb2x1bmRcIjpfMixcInNvbW5hXCI6XzIsXCJ4bi0tc21uYS1ncmFcIjpfMixcInNcdTAwRjhtbmFcIjpfMixcInNvbmRyZS1sYW5kXCI6XzIsXCJ4bi0tc25kcmUtbGFuZC0wY2JcIjpfMixcInNcdTAwRjhuZHJlLWxhbmRcIjpfMixcInNvbmdkYWxlblwiOl8yLFwic29yLWF1cmRhbFwiOl8yLFwieG4tLXNyLWF1cmRhbC1sOGFcIjpfMixcInNcdTAwRjhyLWF1cmRhbFwiOl8yLFwic29yLWZyb25cIjpfMixcInhuLS1zci1mcm9uLXExYVwiOl8yLFwic1x1MDBGOHItZnJvblwiOl8yLFwic29yLW9kYWxcIjpfMixcInhuLS1zci1vZGFsLXExYVwiOl8yLFwic1x1MDBGOHItb2RhbFwiOl8yLFwic29yLXZhcmFuZ2VyXCI6XzIsXCJ4bi0tc3ItdmFyYW5nZXItZ2diXCI6XzIsXCJzXHUwMEY4ci12YXJhbmdlclwiOl8yLFwic29yZm9sZFwiOl8yLFwieG4tLXNyZm9sZC1ieWFcIjpfMixcInNcdTAwRjhyZm9sZFwiOl8yLFwic29ycmVpc2FcIjpfMixcInhuLS1zcnJlaXNhLXExYVwiOl8yLFwic1x1MDBGOHJyZWlzYVwiOl8yLFwic29ydGxhbmRcIjpfMixcInNvcnVtXCI6XzIsXCJ4bi0tc3J1bS1ncmFcIjpfMixcInNcdTAwRjhydW1cIjpfMixcInNweWRlYmVyZ1wiOl8yLFwic3RhbmdlXCI6XzIsXCJzdGF2YW5nZXJcIjpfMixcInN0ZWlnZW5cIjpfMixcInN0ZWlua2plclwiOl8yLFwic3Rqb3JkYWxcIjpfMixcInhuLS1zdGpyZGFsLXMxYVwiOl8yLFwic3RqXHUwMEY4cmRhbFwiOl8yLFwic3Rva2tlXCI6XzIsXCJzdG9yLWVsdmRhbFwiOl8yLFwic3RvcmRcIjpfMixcInN0b3JkYWxcIjpfMixcInN0b3Jmam9yZFwiOl8yLFwic3RyYW5kXCI6XzIsXCJzdHJhbmRhXCI6XzIsXCJzdHJ5blwiOl8yLFwic3VsYVwiOl8yLFwic3VsZGFsXCI6XzIsXCJzdW5kXCI6XzIsXCJzdW5uZGFsXCI6XzIsXCJzdXJuYWRhbFwiOl8yLFwic3ZlaW9cIjpfMixcInN2ZWx2aWtcIjpfMixcInN5a2t5bHZlblwiOl8yLFwidGFuYVwiOl8yLFwidGVsZW1hcmtcIjpbMCx7XCJib1wiOl8yLFwieG4tLWItNWdhXCI6XzIsXCJiXHUwMEY4XCI6XzJ9XSxcInRpbWVcIjpfMixcInRpbmd2b2xsXCI6XzIsXCJ0aW5uXCI6XzIsXCJ0amVsZHN1bmRcIjpfMixcInRqb21lXCI6XzIsXCJ4bi0tdGptZS1ocmFcIjpfMixcInRqXHUwMEY4bWVcIjpfMixcInRva2tlXCI6XzIsXCJ0b2xnYVwiOl8yLFwidG9uc2JlcmdcIjpfMixcInhuLS10bnNiZXJnLXExYVwiOl8yLFwidFx1MDBGOG5zYmVyZ1wiOl8yLFwidG9yc2tlblwiOl8yLFwieG4tLXRybmEtd29hXCI6XzIsXCJ0clx1MDBFNm5hXCI6XzIsXCJ0cmFuYVwiOl8yLFwidHJhbm95XCI6XzIsXCJ4bi0tdHJhbnkteXVhXCI6XzIsXCJ0cmFuXHUwMEY4eVwiOl8yLFwidHJvYW5kaW5cIjpfMixcInRyb2dzdGFkXCI6XzIsXCJ4bi0tdHJnc3RhZC1yMWFcIjpfMixcInRyXHUwMEY4Z3N0YWRcIjpfMixcInRyb21zYVwiOl8yLFwidHJvbXNvXCI6XzIsXCJ4bi0tdHJvbXMtenVhXCI6XzIsXCJ0cm9tc1x1MDBGOFwiOl8yLFwidHJvbmRoZWltXCI6XzIsXCJ0cnlzaWxcIjpfMixcInR2ZWRlc3RyYW5kXCI6XzIsXCJ0eWRhbFwiOl8yLFwidHluc2V0XCI6XzIsXCJ0eXNmam9yZFwiOl8yLFwidHlzbmVzXCI6XzIsXCJ4bi0tdHlzdnItdnJhXCI6XzIsXCJ0eXN2XHUwMEU2clwiOl8yLFwidHlzdmFyXCI6XzIsXCJ1bGxlbnNha2VyXCI6XzIsXCJ1bGxlbnN2YW5nXCI6XzIsXCJ1bHZpa1wiOl8yLFwidW5qYXJnYVwiOl8yLFwieG4tLXVuanJnYS1ydGFcIjpfMixcInVualx1MDBFMXJnYVwiOl8yLFwidXRzaXJhXCI6XzIsXCJ2YWFwc3RlXCI6XzIsXCJ2YWRzb1wiOl8yLFwieG4tLXZhZHMtanJhXCI6XzIsXCJ2YWRzXHUwMEY4XCI6XzIsXCJ4bi0tdnJ5LXlsYTVnXCI6XzIsXCJ2XHUwMEU2clx1MDBGOHlcIjpfMixcInZhZ2FcIjpfMixcInhuLS12Zy15aWFiXCI6XzIsXCJ2XHUwMEU1Z1x1MDBFNVwiOl8yLFwidmFnYW5cIjpfMixcInhuLS12Z2FuLXFvYVwiOl8yLFwidlx1MDBFNWdhblwiOl8yLFwidmFnc295XCI6XzIsXCJ4bi0tdmdzeS1xb2EwalwiOl8yLFwidlx1MDBFNWdzXHUwMEY4eVwiOl8yLFwidmFrc2RhbFwiOl8yLFwidmFsbGVcIjpfMixcInZhbmdcIjpfMixcInZhbnlsdmVuXCI6XzIsXCJ2YXJkb1wiOl8yLFwieG4tLXZhcmQtanJhXCI6XzIsXCJ2YXJkXHUwMEY4XCI6XzIsXCJ2YXJnZ2F0XCI6XzIsXCJ4bi0tdnJnZ3QteHFhZFwiOl8yLFwidlx1MDBFMXJnZ1x1MDBFMXRcIjpfMixcInZhcm95XCI6XzIsXCJ2ZWZzblwiOl8yLFwidmVnYVwiOl8yLFwidmVnYXJzaGVpXCI6XzIsXCJ4bi0tdmVncnNoZWktYzBhXCI6XzIsXCJ2ZWdcdTAwRTVyc2hlaVwiOl8yLFwidmVubmVzbGFcIjpfMixcInZlcmRhbFwiOl8yLFwidmVycmFuXCI6XzIsXCJ2ZXN0YnlcIjpfMixcInZlc3Rmb2xkXCI6WzAse1wic2FuZGVcIjpfMn1dLFwidmVzdG5lc1wiOl8yLFwidmVzdHJlLXNsaWRyZVwiOl8yLFwidmVzdHJlLXRvdGVuXCI6XzIsXCJ2ZXN0dmFnb3lcIjpfMixcInhuLS12ZXN0dmd5LWl4YTZvXCI6XzIsXCJ2ZXN0dlx1MDBFNWdcdTAwRjh5XCI6XzIsXCJ2ZXZlbHN0YWRcIjpfMixcInZpa1wiOl8yLFwidmlrbmFcIjpfMixcInZpbmRhZmpvcmRcIjpfMixcInZvYWdhdFwiOl8yLFwidm9sZGFcIjpfMixcInZvc3NcIjpfMixcImNvXCI6XzMsXCIxMjNoamVtbWVzaWRlXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfM31dLFwibnBcIjpfMjAsXCJuclwiOl81OSxcIm51XCI6WzEse1wibWVyc2VpbmVcIjpfMyxcIm1pbmVcIjpfMyxcInNoYWNrbmV0XCI6XzMsXCJlbnRlcnByaXNlY2xvdWRcIjpfM31dLFwibnpcIjpbMSx7XCJhY1wiOl8yLFwiY29cIjpfMixcImNyaVwiOl8yLFwiZ2Vla1wiOl8yLFwiZ2VuXCI6XzIsXCJnb3Z0XCI6XzIsXCJoZWFsdGhcIjpfMixcIml3aVwiOl8yLFwia2l3aVwiOl8yLFwibWFvcmlcIjpfMixcInhuLS1tb3JpLXFzYVwiOl8yLFwibVx1MDEwMW9yaVwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicGFybGlhbWVudFwiOl8yLFwic2Nob29sXCI6XzIsXCJjbG91ZG5zXCI6XzN9XSxcIm9tXCI6WzEse1wiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm1lZFwiOl8yLFwibXVzZXVtXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicHJvXCI6XzJ9XSxcIm9uaW9uXCI6XzIsXCJvcmdcIjpbMSx7XCJhbHRlcnZpc3RhXCI6XzMsXCJwaW1pZW50YVwiOl8zLFwicG9pdnJvblwiOl8zLFwicG90YWdlclwiOl8zLFwic3dlZXRwZXBwZXJcIjpfMyxcImNkbjc3XCI6WzAse1wiY1wiOl8zLFwicnNjXCI6XzN9XSxcImNkbjc3LXNlY3VyZVwiOlswLHtcIm9yaWdpblwiOlswLHtcInNzbFwiOl8zfV19XSxcImFlXCI6XzMsXCJjbG91ZG5zXCI6XzMsXCJpcC1keW5hbWljXCI6XzMsXCJkZG5zc1wiOl8zLFwiZHBkbnNcIjpfMyxcImR1Y2tkbnNcIjpfMyxcInR1bmtcIjpfMyxcImJsb2dkbnNcIjpfMyxcImJsb2dzaXRlXCI6XzMsXCJib2xkbHlnb2luZ25vd2hlcmVcIjpfMyxcImRuc2FsaWFzXCI6XzMsXCJkbnNkb2pvXCI6XzMsXCJkb2VzbnRleGlzdFwiOl8zLFwiZG9udGV4aXN0XCI6XzMsXCJkb29tZG5zXCI6XzMsXCJkdnJkbnNcIjpfMyxcImR5bmFsaWFzXCI6XzMsXCJkeW5kbnNcIjpbMix7XCJnb1wiOl8zLFwiaG9tZVwiOl8zfV0sXCJlbmRvZmludGVybmV0XCI6XzMsXCJlbmRvZnRoZWludGVybmV0XCI6XzMsXCJmcm9tLW1lXCI6XzMsXCJnYW1lLWhvc3RcIjpfMyxcImdvdGRuc1wiOl8zLFwiaG9iYnktc2l0ZVwiOl8zLFwiaG9tZWRuc1wiOl8zLFwiaG9tZWZ0cFwiOl8zLFwiaG9tZWxpbnV4XCI6XzMsXCJob21ldW5peFwiOl8zLFwiaXMtYS1icnVpbnNmYW5cIjpfMyxcImlzLWEtY2FuZGlkYXRlXCI6XzMsXCJpcy1hLWNlbHRpY3NmYW5cIjpfMyxcImlzLWEtY2hlZlwiOl8zLFwiaXMtYS1nZWVrXCI6XzMsXCJpcy1hLWtuaWdodFwiOl8zLFwiaXMtYS1saW51eC11c2VyXCI6XzMsXCJpcy1hLXBhdHNmYW5cIjpfMyxcImlzLWEtc294ZmFuXCI6XzMsXCJpcy1mb3VuZFwiOl8zLFwiaXMtbG9zdFwiOl8zLFwiaXMtc2F2ZWRcIjpfMyxcImlzLXZlcnktYmFkXCI6XzMsXCJpcy12ZXJ5LWV2aWxcIjpfMyxcImlzLXZlcnktZ29vZFwiOl8zLFwiaXMtdmVyeS1uaWNlXCI6XzMsXCJpcy12ZXJ5LXN3ZWV0XCI6XzMsXCJpc2EtZ2Vla1wiOl8zLFwia2lja3MtYXNzXCI6XzMsXCJtaXNjb25mdXNlZFwiOl8zLFwicG9kem9uZVwiOl8zLFwicmVhZG15YmxvZ1wiOl8zLFwic2VsZmlwXCI6XzMsXCJzZWxsc3lvdXJob21lXCI6XzMsXCJzZXJ2ZWJic1wiOl8zLFwic2VydmVmdHBcIjpfMyxcInNlcnZlZ2FtZVwiOl8zLFwic3R1ZmYtNC1zYWxlXCI6XzMsXCJ3ZWJob3BcIjpfMyxcImFjY2Vzc2NhbVwiOl8zLFwiY2FtZHZyXCI6XzMsXCJmcmVlZGRuc1wiOl8zLFwibXl3aXJlXCI6XzMsXCJ3ZWJyZWRpcmVjdFwiOl8zLFwidHdtYWlsXCI6XzMsXCJldVwiOlsyLHtcImFsXCI6XzMsXCJhc3NvXCI6XzMsXCJhdFwiOl8zLFwiYXVcIjpfMyxcImJlXCI6XzMsXCJiZ1wiOl8zLFwiY2FcIjpfMyxcImNkXCI6XzMsXCJjaFwiOl8zLFwiY25cIjpfMyxcImN5XCI6XzMsXCJjelwiOl8zLFwiZGVcIjpfMyxcImRrXCI6XzMsXCJlZHVcIjpfMyxcImVlXCI6XzMsXCJlc1wiOl8zLFwiZmlcIjpfMyxcImZyXCI6XzMsXCJnclwiOl8zLFwiaHJcIjpfMyxcImh1XCI6XzMsXCJpZVwiOl8zLFwiaWxcIjpfMyxcImluXCI6XzMsXCJpbnRcIjpfMyxcImlzXCI6XzMsXCJpdFwiOl8zLFwianBcIjpfMyxcImtyXCI6XzMsXCJsdFwiOl8zLFwibHVcIjpfMyxcImx2XCI6XzMsXCJtZVwiOl8zLFwibWtcIjpfMyxcIm10XCI6XzMsXCJteVwiOl8zLFwibmV0XCI6XzMsXCJuZ1wiOl8zLFwibmxcIjpfMyxcIm5vXCI6XzMsXCJuelwiOl8zLFwicGxcIjpfMyxcInB0XCI6XzMsXCJyb1wiOl8zLFwicnVcIjpfMyxcInNlXCI6XzMsXCJzaVwiOl8zLFwic2tcIjpfMyxcInRyXCI6XzMsXCJ1a1wiOl8zLFwidXNcIjpfM31dLFwiZmVkb3JhaW5mcmFjbG91ZFwiOl8zLFwiZmVkb3JhcGVvcGxlXCI6XzMsXCJmZWRvcmFwcm9qZWN0XCI6WzAse1wiY2xvdWRcIjpfMyxcIm9zXCI6XzQ1LFwic3RnXCI6WzAse1wib3NcIjpfNDV9XX1dLFwiZnJlZWRlc2t0b3BcIjpfMyxcImhhdGVuYWRpYXJ5XCI6XzMsXCJoZXBmb3JnZVwiOl8zLFwiaW4tZHNsXCI6XzMsXCJpbi12cG5cIjpfMyxcImpzXCI6XzMsXCJiYXJzeVwiOl8zLFwibWF5Zmlyc3RcIjpfMyxcInJvdXRpbmd0aGVjbG91ZFwiOl8zLFwiYm1vYXR0YWNobWVudHNcIjpfMyxcImNhYmxlLW1vZGVtXCI6XzMsXCJjb2xsZWdlZmFuXCI6XzMsXCJjb3VjaHBvdGF0b2ZyaWVzXCI6XzMsXCJob3B0b1wiOl8zLFwibWxiZmFuXCI6XzMsXCJteWZ0cFwiOl8zLFwibXlzZWN1cml0eWNhbWVyYVwiOl8zLFwibmZsZmFuXCI6XzMsXCJuby1pcFwiOl8zLFwicmVhZC1ib29rc1wiOl8zLFwidWZjZmFuXCI6XzMsXCJ6YXB0b1wiOl8zLFwiZHluc2VydlwiOl8zLFwibm93LWRuc1wiOl8zLFwiaXMtbG9jYWxcIjpfMyxcImh0dHBiaW5cIjpfMyxcInB1YnRsc1wiOl8zLFwianBuXCI6XzMsXCJteS1maXJld2FsbFwiOl8zLFwibXlmaXJld2FsbFwiOl8zLFwic3BkbnNcIjpfMyxcInNtYWxsLXdlYlwiOl8zLFwiZHNteW5hc1wiOl8zLFwiZmFtaWx5ZHNcIjpfMyxcInRlY2tpZHNcIjpfNTgsXCJ0dXhmYW1pbHlcIjpfMyxcImRpc2tzdGF0aW9uXCI6XzMsXCJoa1wiOl8zLFwidXNcIjpfMyxcInRvb2xmb3JnZVwiOl8zLFwid21jbG91ZFwiOlsyLHtcImJldGFcIjpfM31dLFwid21mbGFic1wiOl8zLFwiemFcIjpfM31dLFwicGFcIjpbMSx7XCJhYm9cIjpfMixcImFjXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ29iXCI6XzIsXCJpbmdcIjpfMixcIm1lZFwiOl8yLFwibmV0XCI6XzIsXCJub21cIjpfMixcIm9yZ1wiOl8yLFwic2xkXCI6XzJ9XSxcInBlXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvYlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm5vbVwiOl8yLFwib3JnXCI6XzJ9XSxcInBmXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcIm9yZ1wiOl8yfV0sXCJwZ1wiOl8yMCxcInBoXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaVwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm5nb1wiOl8yLFwib3JnXCI6XzIsXCJjbG91ZG5zXCI6XzN9XSxcInBrXCI6WzEse1wiYWNcIjpfMixcImJpelwiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImZhbVwiOl8yLFwiZ2twXCI6XzIsXCJnb2JcIjpfMixcImdvZ1wiOl8yLFwiZ29rXCI6XzIsXCJnb3BcIjpfMixcImdvc1wiOl8yLFwiZ292XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwid2ViXCI6XzJ9XSxcInBsXCI6WzEse1wiY29tXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwiYWdyb1wiOl8yLFwiYWlkXCI6XzIsXCJhdG1cIjpfMixcImF1dG9cIjpfMixcImJpelwiOl8yLFwiZWR1XCI6XzIsXCJnbWluYVwiOl8yLFwiZ3NtXCI6XzIsXCJpbmZvXCI6XzIsXCJtYWlsXCI6XzIsXCJtZWRpYVwiOl8yLFwibWlhc3RhXCI6XzIsXCJtaWxcIjpfMixcIm5pZXJ1Y2hvbW9zY2lcIjpfMixcIm5vbVwiOl8yLFwicGNcIjpfMixcInBvd2lhdFwiOl8yLFwicHJpdlwiOl8yLFwicmVhbGVzdGF0ZVwiOl8yLFwicmVsXCI6XzIsXCJzZXhcIjpfMixcInNob3BcIjpfMixcInNrbGVwXCI6XzIsXCJzb3NcIjpfMixcInN6a29sYVwiOl8yLFwidGFyZ2lcIjpfMixcInRtXCI6XzIsXCJ0b3VyaXNtXCI6XzIsXCJ0cmF2ZWxcIjpfMixcInR1cnlzdHlrYVwiOl8yLFwiZ292XCI6WzEse1wiYXBcIjpfMixcImdyaXdcIjpfMixcImljXCI6XzIsXCJpc1wiOl8yLFwia21wc3BcIjpfMixcImtvbnN1bGF0XCI6XzIsXCJrcHBzcFwiOl8yLFwia3dwXCI6XzIsXCJrd3BzcFwiOl8yLFwibXVwXCI6XzIsXCJtd1wiOl8yLFwib2lhXCI6XzIsXCJvaXJtXCI6XzIsXCJva2VcIjpfMixcIm9vd1wiOl8yLFwib3NjaHJcIjpfMixcIm91bVwiOl8yLFwicGFcIjpfMixcInBpbmJcIjpfMixcInBpd1wiOl8yLFwicG9cIjpfMixcInByXCI6XzIsXCJwc3BcIjpfMixcInBzc2VcIjpfMixcInB1cFwiOl8yLFwicnpnd1wiOl8yLFwic2FcIjpfMixcInNkblwiOl8yLFwic2tvXCI6XzIsXCJzb1wiOl8yLFwic3JcIjpfMixcInN0YXJvc3R3b1wiOl8yLFwidWdcIjpfMixcInVnaW1cIjpfMixcInVtXCI6XzIsXCJ1bWlnXCI6XzIsXCJ1cG93XCI6XzIsXCJ1cHBvXCI6XzIsXCJ1c1wiOl8yLFwidXdcIjpfMixcInV6c1wiOl8yLFwid2lmXCI6XzIsXCJ3aWloXCI6XzIsXCJ3aW5iXCI6XzIsXCJ3aW9zXCI6XzIsXCJ3aXRkXCI6XzIsXCJ3aXdcIjpfMixcIndrelwiOl8yLFwid3NhXCI6XzIsXCJ3c2tyXCI6XzIsXCJ3c3NlXCI6XzIsXCJ3dW96XCI6XzIsXCJ3em1pdXdcIjpfMixcInpwXCI6XzIsXCJ6cGlzZG5cIjpfMn1dLFwiYXVndXN0b3dcIjpfMixcImJhYmlhLWdvcmFcIjpfMixcImJlZHppblwiOl8yLFwiYmVza2lkeVwiOl8yLFwiYmlhbG93aWV6YVwiOl8yLFwiYmlhbHlzdG9rXCI6XzIsXCJiaWVsYXdhXCI6XzIsXCJiaWVzemN6YWR5XCI6XzIsXCJib2xlc2xhd2llY1wiOl8yLFwiYnlkZ29zemN6XCI6XzIsXCJieXRvbVwiOl8yLFwiY2llc3p5blwiOl8yLFwiY3plbGFkelwiOl8yLFwiY3plc3RcIjpfMixcImRsdWdvbGVrYVwiOl8yLFwiZWxibGFnXCI6XzIsXCJlbGtcIjpfMixcImdsb2dvd1wiOl8yLFwiZ25pZXpub1wiOl8yLFwiZ29ybGljZVwiOl8yLFwiZ3JhamV3b1wiOl8yLFwiaWxhd2FcIjpfMixcImphd29yem5vXCI6XzIsXCJqZWxlbmlhLWdvcmFcIjpfMixcImpnb3JhXCI6XzIsXCJrYWxpc3pcIjpfMixcImthcnBhY3pcIjpfMixcImthcnR1enlcIjpfMixcImthc3p1YnlcIjpfMixcImthdG93aWNlXCI6XzIsXCJrYXppbWllcnotZG9sbnlcIjpfMixcImtlcG5vXCI6XzIsXCJrZXRyenluXCI6XzIsXCJrbG9kemtvXCI6XzIsXCJrb2JpZXJ6eWNlXCI6XzIsXCJrb2xvYnJ6ZWdcIjpfMixcImtvbmluXCI6XzIsXCJrb25za293b2xhXCI6XzIsXCJrdXRub1wiOl8yLFwibGFweVwiOl8yLFwibGVib3JrXCI6XzIsXCJsZWduaWNhXCI6XzIsXCJsZXphanNrXCI6XzIsXCJsaW1hbm93YVwiOl8yLFwibG9temFcIjpfMixcImxvd2ljelwiOl8yLFwibHViaW5cIjpfMixcImx1a293XCI6XzIsXCJtYWxib3JrXCI6XzIsXCJtYWxvcG9sc2thXCI6XzIsXCJtYXpvd3N6ZVwiOl8yLFwibWF6dXJ5XCI6XzIsXCJtaWVsZWNcIjpfMixcIm1pZWxub1wiOl8yLFwibXJhZ293b1wiOl8yLFwibmFrbG9cIjpfMixcIm5vd2FydWRhXCI6XzIsXCJueXNhXCI6XzIsXCJvbGF3YVwiOl8yLFwib2xlY2tvXCI6XzIsXCJvbGt1c3pcIjpfMixcIm9sc3p0eW5cIjpfMixcIm9wb2N6bm9cIjpfMixcIm9wb2xlXCI6XzIsXCJvc3Ryb2RhXCI6XzIsXCJvc3Ryb2xla2FcIjpfMixcIm9zdHJvd2llY1wiOl8yLFwib3N0cm93d2xrcFwiOl8yLFwicGlsYVwiOl8yLFwicGlzelwiOl8yLFwicG9kaGFsZVwiOl8yLFwicG9kbGFzaWVcIjpfMixcInBvbGtvd2ljZVwiOl8yLFwicG9tb3Jza2llXCI6XzIsXCJwb21vcnplXCI6XzIsXCJwcm9jaG93aWNlXCI6XzIsXCJwcnVzemtvd1wiOl8yLFwicHJ6ZXdvcnNrXCI6XzIsXCJwdWxhd3lcIjpfMixcInJhZG9tXCI6XzIsXCJyYXdhLW1helwiOl8yLFwicnlibmlrXCI6XzIsXCJyemVzem93XCI6XzIsXCJzYW5va1wiOl8yLFwic2VqbnlcIjpfMixcInNrb2N6b3dcIjpfMixcInNsYXNrXCI6XzIsXCJzbHVwc2tcIjpfMixcInNvc25vd2llY1wiOl8yLFwic3RhbG93YS13b2xhXCI6XzIsXCJzdGFyYWNob3dpY2VcIjpfMixcInN0YXJnYXJkXCI6XzIsXCJzdXdhbGtpXCI6XzIsXCJzd2lkbmljYVwiOl8yLFwic3dpZWJvZHppblwiOl8yLFwic3dpbm91anNjaWVcIjpfMixcInN6Y3plY2luXCI6XzIsXCJzemN6eXRub1wiOl8yLFwidGFybm9icnplZ1wiOl8yLFwidGdvcnlcIjpfMixcInR1cmVrXCI6XzIsXCJ0eWNoeVwiOl8yLFwidXN0a2FcIjpfMixcIndhbGJyenljaFwiOl8yLFwid2FybWlhXCI6XzIsXCJ3YXJzemF3YVwiOl8yLFwid2F3XCI6XzIsXCJ3ZWdyb3dcIjpfMixcIndpZWx1blwiOl8yLFwid2xvY2xcIjpfMixcIndsb2NsYXdla1wiOl8yLFwid29kemlzbGF3XCI6XzIsXCJ3b2xvbWluXCI6XzIsXCJ3cm9jbGF3XCI6XzIsXCJ6YWNocG9tb3JcIjpfMixcInphZ2FuXCI6XzIsXCJ6YXJvd1wiOl8yLFwiemdvcmFcIjpfMixcInpnb3J6ZWxlY1wiOl8yLFwiYXJ0XCI6XzMsXCJnbGl3aWNlXCI6XzMsXCJrcmFrb3dcIjpfMyxcInBvem5hblwiOl8zLFwid3JvY1wiOl8zLFwiemFrb3BhbmVcIjpfMyxcImJlZXBcIjpfMyxcImVjb21tZXJjZS1zaG9wXCI6XzMsXCJjZm9sa3NcIjpfMyxcImRmaXJtYVwiOl8zLFwiZGtvbnRvXCI6XzMsXCJ5b3UyXCI6XzMsXCJzaG9wYXJlbmFcIjpfMyxcImhvbWVza2xlcFwiOl8zLFwic2RzY2xvdWRcIjpfMyxcInVuaWNsb3VkXCI6XzMsXCJsb2R6XCI6XzMsXCJwYWJpYW5pY2VcIjpfMyxcInBsb2NrXCI6XzMsXCJzaWVyYWR6XCI6XzMsXCJza2llcm5pZXdpY2VcIjpfMyxcInpnaWVyelwiOl8zLFwia3Jhc25pa1wiOl8zLFwibGVjem5hXCI6XzMsXCJsdWJhcnRvd1wiOl8zLFwibHVibGluXCI6XzMsXCJwb25pYXRvd2FcIjpfMyxcInN3aWRuaWtcIjpfMyxcImNvXCI6XzMsXCJ0b3J1blwiOl8zLFwic2ltcGxlc2l0ZVwiOl8zLFwibXlzcHJlYWRzaG9wXCI6XzMsXCJnZGFcIjpfMyxcImdkYW5za1wiOl8zLFwiZ2R5bmlhXCI6XzMsXCJtZWRcIjpfMyxcInNvcG90XCI6XzMsXCJiaWVsc2tvXCI6XzN9XSxcInBtXCI6WzEse1wib3duXCI6XzMsXCJuYW1lXCI6XzN9XSxcInBuXCI6WzEse1wiY29cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJwb3N0XCI6XzIsXCJwclwiOlsxLHtcImJpelwiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaW5mb1wiOl8yLFwiaXNsYVwiOl8yLFwibmFtZVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByb1wiOl8yLFwiYWNcIjpfMixcImVzdFwiOl8yLFwicHJvZlwiOl8yfV0sXCJwcm9cIjpbMSx7XCJhYWFcIjpfMixcImFjYVwiOl8yLFwiYWNjdFwiOl8yLFwiYXZvY2F0XCI6XzIsXCJiYXJcIjpfMixcImNwYVwiOl8yLFwiZW5nXCI6XzIsXCJqdXJcIjpfMixcImxhd1wiOl8yLFwibWVkXCI6XzIsXCJyZWNodFwiOl8yLFwiMTJjaGFyc1wiOl8zLFwiY2xvdWRuc1wiOl8zLFwiYmFyc3lcIjpfMyxcIm5ncm9rXCI6XzN9XSxcInBzXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInBsb1wiOl8yLFwic2VjXCI6XzJ9XSxcInB0XCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaW50XCI6XzIsXCJuZXRcIjpfMixcIm5vbWVcIjpfMixcIm9yZ1wiOl8yLFwicHVibFwiOl8yLFwiMTIzcGFnaW5hd2ViXCI6XzN9XSxcInB3XCI6WzEse1wiZ292XCI6XzIsXCJjbG91ZG5zXCI6XzMsXCJ4NDQzXCI6XzN9XSxcInB5XCI6WzEse1wiY29tXCI6XzIsXCJjb29wXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yfV0sXCJxYVwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwibmFtZVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNjaFwiOl8yfV0sXCJyZVwiOlsxLHtcImFzc29cIjpfMixcImNvbVwiOl8yLFwibmV0bGliXCI6XzMsXCJjYW5cIjpfM31dLFwicm9cIjpbMSx7XCJhcnRzXCI6XzIsXCJjb21cIjpfMixcImZpcm1cIjpfMixcImluZm9cIjpfMixcIm5vbVwiOl8yLFwibnRcIjpfMixcIm9yZ1wiOl8yLFwicmVjXCI6XzIsXCJzdG9yZVwiOl8yLFwidG1cIjpfMixcInd3d1wiOl8yLFwiY29cIjpfMyxcInNob3BcIjpfMyxcImJhcnN5XCI6XzN9XSxcInJzXCI6WzEse1wiYWNcIjpfMixcImNvXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaW5cIjpfMixcIm9yZ1wiOl8yLFwiYnJlbmRseVwiOl8xOSxcImJhcnN5XCI6XzMsXCJveFwiOl8zfV0sXCJydVwiOlsxLHtcImFjXCI6XzMsXCJlZHVcIjpfMyxcImdvdlwiOl8zLFwiaW50XCI6XzMsXCJtaWxcIjpfMyxcImV1cm9kaXJcIjpfMyxcImFkeWdleWFcIjpfMyxcImJhc2hraXJpYVwiOl8zLFwiYmlyXCI6XzMsXCJjYmdcIjpfMyxcImNvbVwiOl8zLFwiZGFnZXN0YW5cIjpfMyxcImdyb3pueVwiOl8zLFwia2FsbXlraWFcIjpfMyxcImt1c3RhbmFpXCI6XzMsXCJtYXJpbmVcIjpfMyxcIm1vcmRvdmlhXCI6XzMsXCJtc2tcIjpfMyxcIm15dGlzXCI6XzMsXCJuYWxjaGlrXCI6XzMsXCJub3ZcIjpfMyxcInB5YXRpZ29yc2tcIjpfMyxcInNwYlwiOl8zLFwidmxhZGlrYXZrYXpcIjpfMyxcInZsYWRpbWlyXCI6XzMsXCJuYTR1XCI6XzMsXCJtaXJjbG91ZFwiOl8zLFwibXlqaW5vXCI6WzIse1wiaG9zdGluZ1wiOl82LFwibGFuZGluZ1wiOl82LFwic3BlY3RydW1cIjpfNixcInZwc1wiOl82fV0sXCJjbGRtYWlsXCI6WzAse1wiaGJcIjpfM31dLFwibWNkaXJcIjpfMTEsXCJtY3ByZVwiOl8zLFwibmV0XCI6XzMsXCJvcmdcIjpfMyxcInBwXCI6XzMsXCJsazNcIjpfMyxcInJhc1wiOl8zfV0sXCJyd1wiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiY29vcFwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcInNhXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWVkXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicHViXCI6XzIsXCJzY2hcIjpfMn1dLFwic2JcIjpfNCxcInNjXCI6XzQsXCJzZFwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcIm1lZFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInR2XCI6XzJ9XSxcInNlXCI6WzEse1wiYVwiOl8yLFwiYWNcIjpfMixcImJcIjpfMixcImJkXCI6XzIsXCJicmFuZFwiOl8yLFwiY1wiOl8yLFwiZFwiOl8yLFwiZVwiOl8yLFwiZlwiOl8yLFwiZmhcIjpfMixcImZoc2tcIjpfMixcImZodlwiOl8yLFwiZ1wiOl8yLFwiaFwiOl8yLFwiaVwiOl8yLFwia1wiOl8yLFwia29tZm9yYlwiOl8yLFwia29tbXVuYWxmb3JidW5kXCI6XzIsXCJrb212dXhcIjpfMixcImxcIjpfMixcImxhbmJpYlwiOl8yLFwibVwiOl8yLFwiblwiOl8yLFwibmF0dXJicnVrc2d5bW5cIjpfMixcIm9cIjpfMixcIm9yZ1wiOl8yLFwicFwiOl8yLFwicGFydGlcIjpfMixcInBwXCI6XzIsXCJwcmVzc1wiOl8yLFwiclwiOl8yLFwic1wiOl8yLFwidFwiOl8yLFwidG1cIjpfMixcInVcIjpfMixcIndcIjpfMixcInhcIjpfMixcInlcIjpfMixcInpcIjpfMixcImNvbVwiOl8zLFwiaW9wc3lzXCI6XzMsXCIxMjNtaW5zaWRhXCI6XzMsXCJpdGNvdWxkYmV3b3JcIjpfMyxcIm15c3ByZWFkc2hvcFwiOl8zfV0sXCJzZ1wiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJlbnNjYWxlZFwiOl8zfV0sXCJzaFwiOlsxLHtcImNvbVwiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJoYXNoYmFuZ1wiOl8zLFwiYm90ZGFcIjpfMyxcImxvdmFibGVcIjpfMyxcInBsYXRmb3JtXCI6WzAse1wiZW50XCI6XzMsXCJldVwiOl8zLFwidXNcIjpfM31dLFwidGVsZXBvcnRcIjpfMyxcIm5vd1wiOl8zfV0sXCJzaVwiOlsxLHtcImY1XCI6XzMsXCJnaXRhcHBcIjpfMyxcImdpdHBhZ2VcIjpfM31dLFwic2pcIjpfMixcInNrXCI6XzIsXCJzbFwiOl80LFwic21cIjpfMixcInNuXCI6WzEse1wiYXJ0XCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ291dlwiOl8yLFwib3JnXCI6XzIsXCJwZXJzb1wiOl8yLFwidW5pdlwiOl8yfV0sXCJzb1wiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm1lXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwic3VydmV5c1wiOl8zfV0sXCJzclwiOl8yLFwic3NcIjpbMSx7XCJiaXpcIjpfMixcImNvXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJtZVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNjaFwiOl8yfV0sXCJzdFwiOlsxLHtcImNvXCI6XzIsXCJjb21cIjpfMixcImNvbnN1bGFkb1wiOl8yLFwiZWR1XCI6XzIsXCJlbWJhaXhhZGFcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInByaW5jaXBlXCI6XzIsXCJzYW90b21lXCI6XzIsXCJzdG9yZVwiOl8yLFwiaGVsaW9ob1wiOl8zLFwia2lyYXJhXCI6XzMsXCJub2hvXCI6XzN9XSxcInN1XCI6WzEse1wiYWJraGF6aWFcIjpfMyxcImFkeWdleWFcIjpfMyxcImFrdHl1Ymluc2tcIjpfMyxcImFya2hhbmdlbHNrXCI6XzMsXCJhcm1lbmlhXCI6XzMsXCJhc2hnYWJhZFwiOl8zLFwiYXplcmJhaWphblwiOl8zLFwiYmFsYXNob3ZcIjpfMyxcImJhc2hraXJpYVwiOl8zLFwiYnJ5YW5za1wiOl8zLFwiYnVraGFyYVwiOl8zLFwiY2hpbWtlbnRcIjpfMyxcImRhZ2VzdGFuXCI6XzMsXCJlYXN0LWthemFraHN0YW5cIjpfMyxcImV4bmV0XCI6XzMsXCJnZW9yZ2lhXCI6XzMsXCJncm96bnlcIjpfMyxcIml2YW5vdm9cIjpfMyxcImphbWJ5bFwiOl8zLFwia2FsbXlraWFcIjpfMyxcImthbHVnYVwiOl8zLFwia2FyYWNvbFwiOl8zLFwia2FyYWdhbmRhXCI6XzMsXCJrYXJlbGlhXCI6XzMsXCJraGFrYXNzaWFcIjpfMyxcImtyYXNub2RhclwiOl8zLFwia3VyZ2FuXCI6XzMsXCJrdXN0YW5haVwiOl8zLFwibGVudWdcIjpfMyxcIm1hbmd5c2hsYWtcIjpfMyxcIm1vcmRvdmlhXCI6XzMsXCJtc2tcIjpfMyxcIm11cm1hbnNrXCI6XzMsXCJuYWxjaGlrXCI6XzMsXCJuYXZvaVwiOl8zLFwibm9ydGgta2F6YWtoc3RhblwiOl8zLFwibm92XCI6XzMsXCJvYm5pbnNrXCI6XzMsXCJwZW56YVwiOl8zLFwicG9rcm92c2tcIjpfMyxcInNvY2hpXCI6XzMsXCJzcGJcIjpfMyxcInRhc2hrZW50XCI6XzMsXCJ0ZXJtZXpcIjpfMyxcInRvZ2xpYXR0aVwiOl8zLFwidHJvaXRza1wiOl8zLFwidHNlbGlub2dyYWRcIjpfMyxcInR1bGFcIjpfMyxcInR1dmFcIjpfMyxcInZsYWRpa2F2a2F6XCI6XzMsXCJ2bGFkaW1pclwiOl8zLFwidm9sb2dkYVwiOl8zfV0sXCJzdlwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb2JcIjpfMixcIm9yZ1wiOl8yLFwicmVkXCI6XzJ9XSxcInN4XCI6XzEwLFwic3lcIjpfNSxcInN6XCI6WzEse1wiYWNcIjpfMixcImNvXCI6XzIsXCJvcmdcIjpfMn1dLFwidGNcIjpfMixcInRkXCI6XzIsXCJ0ZWxcIjpfMixcInRmXCI6WzEse1wic2NoXCI6XzN9XSxcInRnXCI6XzIsXCJ0aFwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZ29cIjpfMixcImluXCI6XzIsXCJtaVwiOl8yLFwibmV0XCI6XzIsXCJvclwiOl8yLFwib25saW5lXCI6XzMsXCJzaG9wXCI6XzN9XSxcInRqXCI6WzEse1wiYWNcIjpfMixcImJpelwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb1wiOl8yLFwiZ292XCI6XzIsXCJpbnRcIjpfMixcIm1pbFwiOl8yLFwibmFtZVwiOl8yLFwibmV0XCI6XzIsXCJuaWNcIjpfMixcIm9yZ1wiOl8yLFwidGVzdFwiOl8yLFwid2ViXCI6XzJ9XSxcInRrXCI6XzIsXCJ0bFwiOl8xMCxcInRtXCI6WzEse1wiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJub21cIjpfMixcIm9yZ1wiOl8yfV0sXCJ0blwiOlsxLHtcImNvbVwiOl8yLFwiZW5zXCI6XzIsXCJmaW5cIjpfMixcImdvdlwiOl8yLFwiaW5kXCI6XzIsXCJpbmZvXCI6XzIsXCJpbnRsXCI6XzIsXCJtaW5jb21cIjpfMixcIm5hdFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInBlcnNvXCI6XzIsXCJ0b3VyaXNtXCI6XzIsXCJvcmFuZ2VjbG91ZFwiOl8zfV0sXCJ0b1wiOlsxLHtcIjYxMVwiOl8zLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwib3lhXCI6XzMsXCJ4MFwiOl8zLFwicXVpY2tjb25uZWN0XCI6XzI3LFwidnBucGx1c1wiOl8zfV0sXCJ0clwiOlsxLHtcImF2XCI6XzIsXCJiYnNcIjpfMixcImJlbFwiOl8yLFwiYml6XCI6XzIsXCJjb21cIjpfMixcImRyXCI6XzIsXCJlZHVcIjpfMixcImdlblwiOl8yLFwiZ292XCI6XzIsXCJpbmZvXCI6XzIsXCJrMTJcIjpfMixcImtlcFwiOl8yLFwibWlsXCI6XzIsXCJuYW1lXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicG9sXCI6XzIsXCJ0ZWxcIjpfMixcInRza1wiOl8yLFwidHZcIjpfMixcIndlYlwiOl8yLFwibmNcIjpfMTB9XSxcInR0XCI6WzEse1wiYml6XCI6XzIsXCJjb1wiOl8yLFwiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwiaW5mb1wiOl8yLFwibWlsXCI6XzIsXCJuYW1lXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwicHJvXCI6XzJ9XSxcInR2XCI6WzEse1wiYmV0dGVyLXRoYW5cIjpfMyxcImR5bmRuc1wiOl8zLFwib24tdGhlLXdlYlwiOl8zLFwid29yc2UtdGhhblwiOl8zLFwiZnJvbVwiOl8zLFwic2FrdXJhXCI6XzN9XSxcInR3XCI6WzEse1wiY2x1YlwiOl8yLFwiY29tXCI6WzEse1wibXltYWlsZXJcIjpfM31dLFwiZWJpelwiOl8yLFwiZWR1XCI6XzIsXCJnYW1lXCI6XzIsXCJnb3ZcIjpfMixcImlkdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwidXJsXCI6XzMsXCJteWRuc1wiOl8zfV0sXCJ0elwiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZ29cIjpfMixcImhvdGVsXCI6XzIsXCJpbmZvXCI6XzIsXCJtZVwiOl8yLFwibWlsXCI6XzIsXCJtb2JpXCI6XzIsXCJuZVwiOl8yLFwib3JcIjpfMixcInNjXCI6XzIsXCJ0dlwiOl8yfV0sXCJ1YVwiOlsxLHtcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwiY2hlcmthc3N5XCI6XzIsXCJjaGVya2FzeVwiOl8yLFwiY2hlcm5pZ292XCI6XzIsXCJjaGVybmloaXZcIjpfMixcImNoZXJuaXZ0c2lcIjpfMixcImNoZXJub3Z0c3lcIjpfMixcImNrXCI6XzIsXCJjblwiOl8yLFwiY3JcIjpfMixcImNyaW1lYVwiOl8yLFwiY3ZcIjpfMixcImRuXCI6XzIsXCJkbmVwcm9wZXRyb3Zza1wiOl8yLFwiZG5pcHJvcGV0cm92c2tcIjpfMixcImRvbmV0c2tcIjpfMixcImRwXCI6XzIsXCJpZlwiOl8yLFwiaXZhbm8tZnJhbmtpdnNrXCI6XzIsXCJraFwiOl8yLFwia2hhcmtpdlwiOl8yLFwia2hhcmtvdlwiOl8yLFwia2hlcnNvblwiOl8yLFwia2htZWxuaXRza2l5XCI6XzIsXCJraG1lbG55dHNreWlcIjpfMixcImtpZXZcIjpfMixcImtpcm92b2dyYWRcIjpfMixcImttXCI6XzIsXCJrclwiOl8yLFwia3JvcHl2bnl0c2t5aVwiOl8yLFwia3J5bVwiOl8yLFwia3NcIjpfMixcImt2XCI6XzIsXCJreWl2XCI6XzIsXCJsZ1wiOl8yLFwibHRcIjpfMixcImx1Z2Fuc2tcIjpfMixcImx1aGFuc2tcIjpfMixcImx1dHNrXCI6XzIsXCJsdlwiOl8yLFwibHZpdlwiOl8yLFwibWtcIjpfMixcIm15a29sYWl2XCI6XzIsXCJuaWtvbGFldlwiOl8yLFwib2RcIjpfMixcIm9kZXNhXCI6XzIsXCJvZGVzc2FcIjpfMixcInBsXCI6XzIsXCJwb2x0YXZhXCI6XzIsXCJyaXZuZVwiOl8yLFwicm92bm9cIjpfMixcInJ2XCI6XzIsXCJzYlwiOl8yLFwic2ViYXN0b3BvbFwiOl8yLFwic2V2YXN0b3BvbFwiOl8yLFwic21cIjpfMixcInN1bXlcIjpfMixcInRlXCI6XzIsXCJ0ZXJub3BpbFwiOl8yLFwidXpcIjpfMixcInV6aGdvcm9kXCI6XzIsXCJ1emhob3JvZFwiOl8yLFwidmlubmljYVwiOl8yLFwidmlubnl0c2lhXCI6XzIsXCJ2blwiOl8yLFwidm9seW5cIjpfMixcInlhbHRhXCI6XzIsXCJ6YWthcnBhdHRpYVwiOl8yLFwiemFwb3Jpemh6aGVcIjpfMixcInphcG9yaXpoemhpYVwiOl8yLFwiemhpdG9taXJcIjpfMixcInpoeXRvbXlyXCI6XzIsXCJ6cFwiOl8yLFwienRcIjpfMixcImNjXCI6XzMsXCJpbmZcIjpfMyxcImx0ZFwiOl8zLFwiY3hcIjpfMyxcImJpelwiOl8zLFwiY29cIjpfMyxcInBwXCI6XzMsXCJ2XCI6XzN9XSxcInVnXCI6WzEse1wiYWNcIjpfMixcImNvXCI6XzIsXCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ29cIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZVwiOl8yLFwib3JcIjpfMixcIm9yZ1wiOl8yLFwic2NcIjpfMixcInVzXCI6XzJ9XSxcInVrXCI6WzEse1wiYWNcIjpfMixcImNvXCI6WzEse1wiYnl0ZW1hcmtcIjpbMCx7XCJkaFwiOl8zLFwidm1cIjpfM31dLFwibGF5ZXJzaGlmdFwiOl80OCxcImJhcnN5XCI6XzMsXCJiYXJzeW9ubGluZVwiOl8zLFwicmV0cm9zbnViXCI6XzU3LFwibmgtc2VydlwiOl8zLFwibm8taXBcIjpfMyxcImFkaW1vXCI6XzMsXCJteXNwcmVhZHNob3BcIjpfM31dLFwiZ292XCI6WzEse1wiYXBpXCI6XzMsXCJjYW1wYWlnblwiOl8zLFwic2VydmljZVwiOl8zfV0sXCJsdGRcIjpfMixcIm1lXCI6XzIsXCJuZXRcIjpfMixcIm5oc1wiOl8yLFwib3JnXCI6WzEse1wiZ2x1Z1wiOl8zLFwibHVnXCI6XzMsXCJsdWdzXCI6XzMsXCJhZmZpbml0eWxvdHRlcnlcIjpfMyxcInJhZmZsZWVudHJ5XCI6XzMsXCJ3ZWVrbHlsb3R0ZXJ5XCI6XzN9XSxcInBsY1wiOl8yLFwicG9saWNlXCI6XzIsXCJzY2hcIjpfMjAsXCJjb25uXCI6XzMsXCJjb3Byb1wiOl8zLFwiaG9zcFwiOl8zLFwiaW5kZXBlbmRlbnQtY29tbWlzc2lvblwiOl8zLFwiaW5kZXBlbmRlbnQtaW5xdWVzdFwiOl8zLFwiaW5kZXBlbmRlbnQtaW5xdWlyeVwiOl8zLFwiaW5kZXBlbmRlbnQtcGFuZWxcIjpfMyxcImluZGVwZW5kZW50LXJldmlld1wiOl8zLFwicHVibGljLWlucXVpcnlcIjpfMyxcInJveWFsLWNvbW1pc3Npb25cIjpfMyxcInB5bW50XCI6XzMsXCJiYXJzeVwiOl8zLFwibmltc2l0ZVwiOl8zLFwib3JhY2xlZ292Y2xvdWRhcHBzXCI6XzZ9XSxcInVzXCI6WzEse1wiZG5pXCI6XzIsXCJpc2FcIjpfMixcIm5zblwiOl8yLFwiYWtcIjpfNjUsXCJhbFwiOl82NSxcImFyXCI6XzY1LFwiYXNcIjpfNjUsXCJhelwiOl82NSxcImNhXCI6XzY1LFwiY29cIjpfNjUsXCJjdFwiOl82NSxcImRjXCI6XzY1LFwiZGVcIjpfNjYsXCJmbFwiOl82NSxcImdhXCI6XzY1LFwiZ3VcIjpfNjUsXCJoaVwiOl82NyxcImlhXCI6XzY1LFwiaWRcIjpfNjUsXCJpbFwiOl82NSxcImluXCI6XzY1LFwia3NcIjpfNjUsXCJreVwiOl82NSxcImxhXCI6XzY1LFwibWFcIjpbMSx7XCJrMTJcIjpbMSx7XCJjaHRyXCI6XzIsXCJwYXJvY2hcIjpfMixcInB2dFwiOl8yfV0sXCJjY1wiOl8yLFwibGliXCI6XzJ9XSxcIm1kXCI6XzY1LFwibWVcIjpfNjUsXCJtaVwiOlsxLHtcImsxMlwiOl8yLFwiY2NcIjpfMixcImxpYlwiOl8yLFwiYW5uLWFyYm9yXCI6XzIsXCJjb2dcIjpfMixcImRzdFwiOl8yLFwiZWF0b25cIjpfMixcImdlblwiOl8yLFwibXVzXCI6XzIsXCJ0ZWNcIjpfMixcIndhc2h0ZW5hd1wiOl8yfV0sXCJtblwiOl82NSxcIm1vXCI6XzY1LFwibXNcIjpbMSx7XCJrMTJcIjpfMixcImNjXCI6XzJ9XSxcIm10XCI6XzY1LFwibmNcIjpfNjUsXCJuZFwiOl82NyxcIm5lXCI6XzY1LFwibmhcIjpfNjUsXCJualwiOl82NSxcIm5tXCI6XzY1LFwibnZcIjpfNjUsXCJueVwiOl82NSxcIm9oXCI6XzY1LFwib2tcIjpfNjUsXCJvclwiOl82NSxcInBhXCI6XzY1LFwicHJcIjpfNjUsXCJyaVwiOl82NyxcInNjXCI6XzY1LFwic2RcIjpfNjcsXCJ0blwiOl82NSxcInR4XCI6XzY1LFwidXRcIjpfNjUsXCJ2YVwiOl82NSxcInZpXCI6XzY1LFwidnRcIjpfNjUsXCJ3YVwiOl82NSxcIndpXCI6XzY1LFwid3ZcIjpfNjYsXCJ3eVwiOl82NSxcImNsb3VkbnNcIjpfMyxcImlzLWJ5XCI6XzMsXCJsYW5kLTQtc2FsZVwiOl8zLFwic3R1ZmYtNC1zYWxlXCI6XzMsXCJoZWxpb2hvc3RcIjpfMyxcImVuc2NhbGVkXCI6WzAse1wicGh4XCI6XzN9XSxcIm1pcmNsb3VkXCI6XzMsXCJuZ29cIjpfMyxcImdvbGZmYW5cIjpfMyxcIm5vaXBcIjpfMyxcInBvaW50dG9cIjpfMyxcImZyZWVkZG5zXCI6XzMsXCJzcnZcIjpbMix7XCJnaFwiOl8zLFwiZ2xcIjpfM31dLFwicGxhdHRlcnBcIjpfMyxcInNlcnZlcm5hbWVcIjpfM31dLFwidXlcIjpbMSx7XCJjb21cIjpfMixcImVkdVwiOl8yLFwiZ3ViXCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcInV6XCI6WzEse1wiY29cIjpfMixcImNvbVwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMn1dLFwidmFcIjpfMixcInZjXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibWlsXCI6XzIsXCJuZXRcIjpfMixcIm9yZ1wiOl8yLFwiZ3ZcIjpbMix7XCJkXCI6XzN9XSxcIjBlXCI6XzYsXCJteWRuc1wiOl8zfV0sXCJ2ZVwiOlsxLHtcImFydHNcIjpfMixcImJpYlwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZTEyXCI6XzIsXCJlZHVcIjpfMixcImVtcHJlbmRlXCI6XzIsXCJmaXJtXCI6XzIsXCJnb2JcIjpfMixcImdvdlwiOl8yLFwiaW5mb1wiOl8yLFwiaW50XCI6XzIsXCJtaWxcIjpfMixcIm5ldFwiOl8yLFwibm9tXCI6XzIsXCJvcmdcIjpfMixcInJhclwiOl8yLFwicmVjXCI6XzIsXCJzdG9yZVwiOl8yLFwidGVjXCI6XzIsXCJ3ZWJcIjpfMn1dLFwidmdcIjpbMSx7XCJlZHVcIjpfMn1dLFwidmlcIjpbMSx7XCJjb1wiOl8yLFwiY29tXCI6XzIsXCJrMTJcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzJ9XSxcInZuXCI6WzEse1wiYWNcIjpfMixcImFpXCI6XzIsXCJiaXpcIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImhlYWx0aFwiOl8yLFwiaWRcIjpfMixcImluZm9cIjpfMixcImludFwiOl8yLFwiaW9cIjpfMixcIm5hbWVcIjpfMixcIm5ldFwiOl8yLFwib3JnXCI6XzIsXCJwcm9cIjpfMixcImFuZ2lhbmdcIjpfMixcImJhY2dpYW5nXCI6XzIsXCJiYWNrYW5cIjpfMixcImJhY2xpZXVcIjpfMixcImJhY25pbmhcIjpfMixcImJhcmlhLXZ1bmd0YXVcIjpfMixcImJlbnRyZVwiOl8yLFwiYmluaGRpbmhcIjpfMixcImJpbmhkdW9uZ1wiOl8yLFwiYmluaHBodW9jXCI6XzIsXCJiaW5odGh1YW5cIjpfMixcImNhbWF1XCI6XzIsXCJjYW50aG9cIjpfMixcImNhb2JhbmdcIjpfMixcImRha2xha1wiOl8yLFwiZGFrbm9uZ1wiOl8yLFwiZGFuYW5nXCI6XzIsXCJkaWVuYmllblwiOl8yLFwiZG9uZ25haVwiOl8yLFwiZG9uZ3RoYXBcIjpfMixcImdpYWxhaVwiOl8yLFwiaGFnaWFuZ1wiOl8yLFwiaGFpZHVvbmdcIjpfMixcImhhaXBob25nXCI6XzIsXCJoYW5hbVwiOl8yLFwiaGFub2lcIjpfMixcImhhdGluaFwiOl8yLFwiaGF1Z2lhbmdcIjpfMixcImhvYWJpbmhcIjpfMixcImh1bmd5ZW5cIjpfMixcImtoYW5oaG9hXCI6XzIsXCJraWVuZ2lhbmdcIjpfMixcImtvbnR1bVwiOl8yLFwibGFpY2hhdVwiOl8yLFwibGFtZG9uZ1wiOl8yLFwibGFuZ3NvblwiOl8yLFwibGFvY2FpXCI6XzIsXCJsb25nYW5cIjpfMixcIm5hbWRpbmhcIjpfMixcIm5naGVhblwiOl8yLFwibmluaGJpbmhcIjpfMixcIm5pbmh0aHVhblwiOl8yLFwicGh1dGhvXCI6XzIsXCJwaHV5ZW5cIjpfMixcInF1YW5nYmluaFwiOl8yLFwicXVhbmduYW1cIjpfMixcInF1YW5nbmdhaVwiOl8yLFwicXVhbmduaW5oXCI6XzIsXCJxdWFuZ3RyaVwiOl8yLFwic29jdHJhbmdcIjpfMixcInNvbmxhXCI6XzIsXCJ0YXluaW5oXCI6XzIsXCJ0aGFpYmluaFwiOl8yLFwidGhhaW5ndXllblwiOl8yLFwidGhhbmhob2FcIjpfMixcInRoYW5ocGhvaG9jaGltaW5oXCI6XzIsXCJ0aHVhdGhpZW5odWVcIjpfMixcInRpZW5naWFuZ1wiOl8yLFwidHJhdmluaFwiOl8yLFwidHV5ZW5xdWFuZ1wiOl8yLFwidmluaGxvbmdcIjpfMixcInZpbmhwaHVjXCI6XzIsXCJ5ZW5iYWlcIjpfMn1dLFwidnVcIjpfNDcsXCJ3ZlwiOlsxLHtcImJpelwiOl8zLFwic2NoXCI6XzN9XSxcIndzXCI6WzEse1wiY29tXCI6XzIsXCJlZHVcIjpfMixcImdvdlwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcImFkdmlzb3JcIjpfNixcImNsb3VkNjZcIjpfMyxcImR5bmRuc1wiOl8zLFwibXlwZXRzXCI6XzN9XSxcInl0XCI6WzEse1wib3JnXCI6XzN9XSxcInhuLS1tZ2JhYW03YThoXCI6XzIsXCJcdTA2MjdcdTA2NDVcdTA2MjdcdTA2MzFcdTA2MjdcdTA2MkFcIjpfMixcInhuLS15OWEzYXFcIjpfMixcIlx1MDU3MFx1MDU2MVx1MDU3NVwiOl8yLFwieG4tLTU0YjdmdGEwY2NcIjpfMixcIlx1MDlBQ1x1MDlCRVx1MDk4Mlx1MDlCMlx1MDlCRVwiOl8yLFwieG4tLTkwYWVcIjpfMixcIlx1MDQzMVx1MDQzM1wiOl8yLFwieG4tLW1nYmNwcTZncGExYVwiOl8yLFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjJEXHUwNjMxXHUwNjRBXHUwNjQ2XCI6XzIsXCJ4bi0tOTBhaXNcIjpfMixcIlx1MDQzMVx1MDQzNVx1MDQzQlwiOl8yLFwieG4tLWZpcXM4c1wiOl8yLFwiXHU0RTJEXHU1NkZEXCI6XzIsXCJ4bi0tZmlxejlzXCI6XzIsXCJcdTRFMkRcdTU3MEJcIjpfMixcInhuLS1sZ2JiYXQxYWQ4alwiOl8yLFwiXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjMyXHUwNjI3XHUwNjI2XHUwNjMxXCI6XzIsXCJ4bi0td2diaDFjXCI6XzIsXCJcdTA2NDVcdTA2MzVcdTA2MzFcIjpfMixcInhuLS1lMWE0Y1wiOl8yLFwiXHUwNDM1XHUwNDRFXCI6XzIsXCJ4bi0tcXhhNmFcIjpfMixcIlx1MDNCNVx1MDNDNVwiOl8yLFwieG4tLW1nYmFoMWEzaGprcmRcIjpfMixcIlx1MDY0NVx1MDY0OFx1MDYzMVx1MDY0QVx1MDYyQVx1MDYyN1x1MDY0Nlx1MDY0QVx1MDYyN1wiOl8yLFwieG4tLW5vZGVcIjpfMixcIlx1MTBEMlx1MTBENFwiOl8yLFwieG4tLXF4YW1cIjpfMixcIlx1MDNCNVx1MDNCQlwiOl8yLFwieG4tLWo2dzE5M2dcIjpbMSx7XCJ4bi0tZ21xdzVhXCI6XzIsXCJ4bi0tNTVxeDVkXCI6XzIsXCJ4bi0tbXh0cTFtXCI6XzIsXCJ4bi0td2N2czIyZFwiOl8yLFwieG4tLXVjMGF0dlwiOl8yLFwieG4tLW9kMGFsZ1wiOl8yfV0sXCJcdTk5OTlcdTZFMkZcIjpbMSx7XCJcdTUwMEJcdTRFQkFcIjpfMixcIlx1NTE2Q1x1NTNGOFwiOl8yLFwiXHU2NTNGXHU1RTlDXCI6XzIsXCJcdTY1NTlcdTgwQjJcIjpfMixcIlx1N0Q0NFx1N0U1NFwiOl8yLFwiXHU3REIyXHU3RDYxXCI6XzJ9XSxcInhuLS0yc2NyajljXCI6XzIsXCJcdTBDQURcdTBDQkVcdTBDQjBcdTBDQTRcIjpfMixcInhuLS0zaGNyajljXCI6XzIsXCJcdTBCMkRcdTBCM0VcdTBCMzBcdTBCMjRcIjpfMixcInhuLS00NWJyNWN5bFwiOl8yLFwiXHUwOUFEXHUwOUJFXHUwOUYwXHUwOUE0XCI6XzIsXCJ4bi0taDJicmVnM2V2ZVwiOl8yLFwiXHUwOTJEXHUwOTNFXHUwOTMwXHUwOTI0XHUwOTJFXHUwOTREXCI6XzIsXCJ4bi0taDJicmo5YzhjXCI6XzIsXCJcdTA5MkRcdTA5M0VcdTA5MzBcdTA5NEJcdTA5MjRcIjpfMixcInhuLS1tZ2JndTgyYVwiOl8yLFwiXHUwNjgwXHUwNjI3XHUwNjMxXHUwNjJBXCI6XzIsXCJ4bi0tcnZjMWUwYW0zZVwiOl8yLFwiXHUwRDJEXHUwRDNFXHUwRDMwXHUwRDI0XHUwRDAyXCI6XzIsXCJ4bi0taDJicmo5Y1wiOl8yLFwiXHUwOTJEXHUwOTNFXHUwOTMwXHUwOTI0XCI6XzIsXCJ4bi0tbWdiYmgxYVwiOl8yLFwiXHUwNjI4XHUwNjI3XHUwNjMxXHUwNjJBXCI6XzIsXCJ4bi0tbWdiYmgxYTcxZVwiOl8yLFwiXHUwNjI4XHUwNkJFXHUwNjI3XHUwNjMxXHUwNjJBXCI6XzIsXCJ4bi0tZnBjcmo5YzNkXCI6XzIsXCJcdTBDMkRcdTBDM0VcdTBDMzBcdTBDMjRcdTBDNERcIjpfMixcInhuLS1nZWNyajljXCI6XzIsXCJcdTBBQURcdTBBQkVcdTBBQjBcdTBBQTRcIjpfMixcInhuLS1zOWJyajljXCI6XzIsXCJcdTBBMkRcdTBBM0VcdTBBMzBcdTBBMjRcIjpfMixcInhuLS00NWJyajljXCI6XzIsXCJcdTA5QURcdTA5QkVcdTA5QjBcdTA5QTRcIjpfMixcInhuLS14a2MyZGwzYTVlZTBoXCI6XzIsXCJcdTBCODdcdTBCQThcdTBCQ0RcdTBCQTRcdTBCQkZcdTBCQUZcdTBCQkVcIjpfMixcInhuLS1tZ2JhM2E0ZjE2YVwiOl8yLFwiXHUwNjI3XHUwNkNDXHUwNjMxXHUwNjI3XHUwNjQ2XCI6XzIsXCJ4bi0tbWdiYTNhNGZyYVwiOl8yLFwiXHUwNjI3XHUwNjRBXHUwNjMxXHUwNjI3XHUwNjQ2XCI6XzIsXCJ4bi0tbWdidHgyYlwiOl8yLFwiXHUwNjM5XHUwNjMxXHUwNjI3XHUwNjQyXCI6XzIsXCJ4bi0tbWdiYXloN2dwYVwiOl8yLFwiXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjMxXHUwNjJGXHUwNjQ2XCI6XzIsXCJ4bi0tM2UwYjcwN2VcIjpfMixcIlx1RDU1Q1x1QUQ2RFwiOl8yLFwieG4tLTgwYW8yMWFcIjpfMixcIlx1MDQ5Qlx1MDQzMFx1MDQzN1wiOl8yLFwieG4tLXE3Y2U2YVwiOl8yLFwiXHUwRUE1XHUwRUIyXHUwRUE3XCI6XzIsXCJ4bi0tZnpjMmM5ZTJjXCI6XzIsXCJcdTBEQkRcdTBEODJcdTBEOUFcdTBEQ0ZcIjpfMixcInhuLS14a2MyYWwzaHllMmFcIjpfMixcIlx1MEI4N1x1MEJCMlx1MEI5OVx1MEJDRFx1MEI5NVx1MEJDOFwiOl8yLFwieG4tLW1nYmMwYTlhemNnXCI6XzIsXCJcdTA2MjdcdTA2NDRcdTA2NDVcdTA2M0FcdTA2MzFcdTA2MjhcIjpfMixcInhuLS1kMWFsZlwiOl8yLFwiXHUwNDNDXHUwNDNBXHUwNDM0XCI6XzIsXCJ4bi0tbDFhY2NcIjpfMixcIlx1MDQzQ1x1MDQzRVx1MDQzRFwiOl8yLFwieG4tLW1peDg5MWZcIjpfMixcIlx1NkZCM1x1OTU4MFwiOl8yLFwieG4tLW1peDA4MmZcIjpfMixcIlx1NkZCM1x1OTVFOFwiOl8yLFwieG4tLW1nYng0Y2QwYWJcIjpfMixcIlx1MDY0NVx1MDY0NFx1MDY0QVx1MDYzM1x1MDY0QVx1MDYyN1wiOl8yLFwieG4tLW1nYjlhd2JmXCI6XzIsXCJcdTA2MzlcdTA2NDVcdTA2MjdcdTA2NDZcIjpfMixcInhuLS1tZ2JhaTlhemdxcDZqXCI6XzIsXCJcdTA2N0VcdTA2MjdcdTA2QTlcdTA2MzNcdTA2MkFcdTA2MjdcdTA2NDZcIjpfMixcInhuLS1tZ2JhaTlhNWV2YTAwYlwiOl8yLFwiXHUwNjdFXHUwNjI3XHUwNjQzXHUwNjMzXHUwNjJBXHUwNjI3XHUwNjQ2XCI6XzIsXCJ4bi0teWdiaTJhbW14XCI6XzIsXCJcdTA2NDFcdTA2NDRcdTA2MzNcdTA2MzdcdTA2NEFcdTA2NDZcIjpfMixcInhuLS05MGEzYWNcIjpbMSx7XCJ4bi0tODBhdVwiOl8yLFwieG4tLTkwYXpoXCI6XzIsXCJ4bi0tZDFhdFwiOl8yLFwieG4tLWMxYXZnXCI6XzIsXCJ4bi0tbzFhY1wiOl8yLFwieG4tLW8xYWNoXCI6XzJ9XSxcIlx1MDQ0MVx1MDQ0MFx1MDQzMVwiOlsxLHtcIlx1MDQzMFx1MDQzQVwiOl8yLFwiXHUwNDNFXHUwNDMxXHUwNDQwXCI6XzIsXCJcdTA0M0VcdTA0MzRcIjpfMixcIlx1MDQzRVx1MDQ0MFx1MDQzM1wiOl8yLFwiXHUwNDNGXHUwNDQwXCI6XzIsXCJcdTA0NDNcdTA0M0ZcdTA0NDBcIjpfMn1dLFwieG4tLXAxYWlcIjpfMixcIlx1MDQ0MFx1MDQ0NFwiOl8yLFwieG4tLXdnYmw2YVwiOl8yLFwiXHUwNjQyXHUwNjM3XHUwNjMxXCI6XzIsXCJ4bi0tbWdiZXJwNGE1ZDRhclwiOl8yLFwiXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjM5XHUwNjQ4XHUwNjJGXHUwNjRBXHUwNjI5XCI6XzIsXCJ4bi0tbWdiZXJwNGE1ZDRhODdnXCI6XzIsXCJcdTA2MjdcdTA2NDRcdTA2MzNcdTA2MzlcdTA2NDhcdTA2MkZcdTA2Q0NcdTA2MjlcIjpfMixcInhuLS1tZ2JxbHk3YzBhNjdmYmNcIjpfMixcIlx1MDYyN1x1MDY0NFx1MDYzM1x1MDYzOVx1MDY0OFx1MDYyRlx1MDZDQ1x1MDZDM1wiOl8yLFwieG4tLW1nYnFseTdjdmFmclwiOl8yLFwiXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjM5XHUwNjQ4XHUwNjJGXHUwNjRBXHUwNjQ3XCI6XzIsXCJ4bi0tbWdicGwyZmhcIjpfMixcIlx1MDYzM1x1MDY0OFx1MDYyRlx1MDYyN1x1MDY0NlwiOl8yLFwieG4tLXlmcm80aTY3b1wiOl8yLFwiXHU2NUIwXHU1MkEwXHU1NzYxXCI6XzIsXCJ4bi0tY2xjaGMwZWEwYjJnMmE5Z2NkXCI6XzIsXCJcdTBCOUFcdTBCQkZcdTBCOTlcdTBCQ0RcdTBCOTVcdTBCQUFcdTBCQ0RcdTBCQUFcdTBCQzJcdTBCQjBcdTBCQ0RcIjpfMixcInhuLS1vZ2JwZjhmbFwiOl8yLFwiXHUwNjMzXHUwNjQ4XHUwNjMxXHUwNjRBXHUwNjI5XCI6XzIsXCJ4bi0tbWdidGY4ZmxcIjpfMixcIlx1MDYzM1x1MDY0OFx1MDYzMVx1MDY0QVx1MDYyN1wiOl8yLFwieG4tLW8zY3c0aFwiOlsxLHtcInhuLS1vM2N5eDJhXCI6XzIsXCJ4bi0tMTJjbzBjM2I0ZXZhXCI6XzIsXCJ4bi0tbTNjaDBqM2FcIjpfMixcInhuLS1oM2N1emsxZGlcIjpfMixcInhuLS0xMmMxZmUwYnJcIjpfMixcInhuLS0xMmNmaThpeGI4bFwiOl8yfV0sXCJcdTBFNDRcdTBFMTdcdTBFMjJcIjpbMSx7XCJcdTBFMTdcdTBFMkJcdTBFMzJcdTBFMjNcIjpfMixcIlx1MEUxOFx1MEUzOFx1MEUyM1x1MEUwMVx1MEUzNFx1MEUwOFwiOl8yLFwiXHUwRTQwXHUwRTE5XHUwRTQ3XHUwRTE1XCI6XzIsXCJcdTBFMjNcdTBFMzFcdTBFMTBcdTBFMUFcdTBFMzJcdTBFMjVcIjpfMixcIlx1MEUyOFx1MEUzNlx1MEUwMVx1MEUyOVx1MEUzMlwiOl8yLFwiXHUwRTJEXHUwRTA3XHUwRTA0XHUwRTRDXHUwRTAxXHUwRTIzXCI6XzJ9XSxcInhuLS1wZ2JzMGRoXCI6XzIsXCJcdTA2MkFcdTA2NDhcdTA2NDZcdTA2MzNcIjpfMixcInhuLS1rcHJ5NTdkXCI6XzIsXCJcdTUzRjBcdTcwNjNcIjpfMixcInhuLS1rcHJ3MTNkXCI6XzIsXCJcdTUzRjBcdTZFN0VcIjpfMixcInhuLS1ubngzODhhXCI6XzIsXCJcdTgxRkFcdTcwNjNcIjpfMixcInhuLS1qMWFtaFwiOl8yLFwiXHUwNDQzXHUwNDNBXHUwNDQwXCI6XzIsXCJ4bi0tbWdiMmRkZXNcIjpfMixcIlx1MDYyN1x1MDY0NFx1MDY0QVx1MDY0NVx1MDY0NlwiOl8yLFwieHh4XCI6XzIsXCJ5ZVwiOl81LFwiemFcIjpbMCx7XCJhY1wiOl8yLFwiYWdyaWNcIjpfMixcImFsdFwiOl8yLFwiY29cIjpfMixcImVkdVwiOl8yLFwiZ292XCI6XzIsXCJncm9uZGFyXCI6XzIsXCJsYXdcIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJuZ29cIjpfMixcIm5pY1wiOl8yLFwibmlzXCI6XzIsXCJub21cIjpfMixcIm9yZ1wiOl8yLFwic2Nob29sXCI6XzIsXCJ0bVwiOl8yLFwid2ViXCI6XzJ9XSxcInptXCI6WzEse1wiYWNcIjpfMixcImJpelwiOl8yLFwiY29cIjpfMixcImNvbVwiOl8yLFwiZWR1XCI6XzIsXCJnb3ZcIjpfMixcImluZm9cIjpfMixcIm1pbFwiOl8yLFwibmV0XCI6XzIsXCJvcmdcIjpfMixcInNjaFwiOl8yfV0sXCJ6d1wiOlsxLHtcImFjXCI6XzIsXCJjb1wiOl8yLFwiZ292XCI6XzIsXCJtaWxcIjpfMixcIm9yZ1wiOl8yfV0sXCJhYWFcIjpfMixcImFhcnBcIjpfMixcImFiYlwiOl8yLFwiYWJib3R0XCI6XzIsXCJhYmJ2aWVcIjpfMixcImFiY1wiOl8yLFwiYWJsZVwiOl8yLFwiYWJvZ2Fkb1wiOl8yLFwiYWJ1ZGhhYmlcIjpfMixcImFjYWRlbXlcIjpbMSx7XCJvZmZpY2lhbFwiOl8zfV0sXCJhY2NlbnR1cmVcIjpfMixcImFjY291bnRhbnRcIjpfMixcImFjY291bnRhbnRzXCI6XzIsXCJhY29cIjpfMixcImFjdG9yXCI6XzIsXCJhZHNcIjpfMixcImFkdWx0XCI6XzIsXCJhZWdcIjpfMixcImFldG5hXCI6XzIsXCJhZmxcIjpfMixcImFmcmljYVwiOl8yLFwiYWdha2hhblwiOl8yLFwiYWdlbmN5XCI6XzIsXCJhaWdcIjpfMixcImFpcmJ1c1wiOl8yLFwiYWlyZm9yY2VcIjpfMixcImFpcnRlbFwiOl8yLFwiYWtkblwiOl8yLFwiYWxpYmFiYVwiOl8yLFwiYWxpcGF5XCI6XzIsXCJhbGxmaW5hbnpcIjpfMixcImFsbHN0YXRlXCI6XzIsXCJhbGx5XCI6XzIsXCJhbHNhY2VcIjpfMixcImFsc3RvbVwiOl8yLFwiYW1hem9uXCI6XzIsXCJhbWVyaWNhbmV4cHJlc3NcIjpfMixcImFtZXJpY2FuZmFtaWx5XCI6XzIsXCJhbWV4XCI6XzIsXCJhbWZhbVwiOl8yLFwiYW1pY2FcIjpfMixcImFtc3RlcmRhbVwiOl8yLFwiYW5hbHl0aWNzXCI6XzIsXCJhbmRyb2lkXCI6XzIsXCJhbnF1YW5cIjpfMixcImFuelwiOl8yLFwiYW9sXCI6XzIsXCJhcGFydG1lbnRzXCI6XzIsXCJhcHBcIjpbMSx7XCJhZGFwdGFibGVcIjpfMyxcImFpdmVuXCI6XzMsXCJiZWdldFwiOl82LFwiYnJhdmVcIjpfNyxcImNsZXJrXCI6XzMsXCJjbGVya3N0YWdlXCI6XzMsXCJ3bmV4dFwiOl8zLFwiY3NiXCI6WzIse1wicHJldmlld1wiOl8zfV0sXCJjb252ZXhcIjpfMyxcImRldGFcIjpfMyxcIm9uZGlnaXRhbG9jZWFuXCI6XzMsXCJlYXN5cGFuZWxcIjpfMyxcImVuY3JcIjpbMix7XCJmcm9udGVuZFwiOl8zfV0sXCJldmVydmF1bHRcIjpfOCxcImV4cG9cIjpbMix7XCJzdGFnaW5nXCI6XzN9XSxcImVkZ2Vjb21wdXRlXCI6XzMsXCJvbi1mbGVla1wiOl8zLFwiZmx1dHRlcmZsb3dcIjpfMyxcImUyYlwiOl8zLFwiZnJhbWVyXCI6XzMsXCJnaXRodWJcIjpfMyxcImhvc3RlZFwiOl82LFwicnVuXCI6WzAse1wiKlwiOl8zLFwibXRsc1wiOl82fV0sXCJ3ZWJcIjpfMyxcImhhY2tjbHViXCI6XzMsXCJoYXN1cmFcIjpfMyxcImJvdGRhc2hcIjpfMyxcImxlYXBjZWxsXCI6XzMsXCJsb2dpbmxpbmVcIjpfMyxcImxvdmFibGVcIjpfMyxcImx1eWFuaVwiOl8zLFwibWVkdXNhanNcIjpfMyxcIm1lc3NlcmxpXCI6XzMsXCJuZXRmeVwiOl8zLFwibmV0bGlmeVwiOl8zLFwibmdyb2tcIjpfMyxcIm5ncm9rLWZyZWVcIjpfMyxcImRldmVsb3BlclwiOl82LFwibm9vcFwiOl8zLFwibm9ydGhmbGFua1wiOl82LFwidXBzdW5cIjpfNixcInJhaWx3YXlcIjpbMCx7XCJ1cFwiOl8zfV0sXCJyZXBsaXRcIjpfOSxcIm55YXRcIjpfMyxcInNub3dmbGFrZVwiOlswLHtcIipcIjpfMyxcInByaXZhdGVsaW5rXCI6XzZ9XSxcInN0cmVhbWxpdFwiOl8zLFwic3RvcmlwcmVzc1wiOl8zLFwidGVsZWJpdFwiOl8zLFwidHlwZWRyZWFtXCI6XzMsXCJ2ZXJjZWxcIjpfMyxcIndhbFwiOl8zLFwiYm9va29ubGluZVwiOl8zLFwid2RoXCI6XzMsXCJ3aW5kc3VyZlwiOl8zLFwiemVhYnVyXCI6XzMsXCJ6ZXJvcHNcIjpfNn1dLFwiYXBwbGVcIjpfMixcImFxdWFyZWxsZVwiOl8yLFwiYXJhYlwiOl8yLFwiYXJhbWNvXCI6XzIsXCJhcmNoaVwiOl8yLFwiYXJteVwiOl8yLFwiYXJ0XCI6XzIsXCJhcnRlXCI6XzIsXCJhc2RhXCI6XzIsXCJhc3NvY2lhdGVzXCI6XzIsXCJhdGhsZXRhXCI6XzIsXCJhdHRvcm5leVwiOl8yLFwiYXVjdGlvblwiOl8yLFwiYXVkaVwiOl8yLFwiYXVkaWJsZVwiOl8yLFwiYXVkaW9cIjpfMixcImF1c3Bvc3RcIjpfMixcImF1dGhvclwiOl8yLFwiYXV0b1wiOl8yLFwiYXV0b3NcIjpfMixcImF3c1wiOlsxLHtcIm9uXCI6WzAse1wiYWYtc291dGgtMVwiOl8xMixcImFwLWVhc3QtMVwiOl8xMixcImFwLW5vcnRoZWFzdC0xXCI6XzEyLFwiYXAtbm9ydGhlYXN0LTJcIjpfMTIsXCJhcC1ub3J0aGVhc3QtM1wiOl8xMixcImFwLXNvdXRoLTFcIjpfMTIsXCJhcC1zb3V0aC0yXCI6XzEyLFwiYXAtc291dGhlYXN0LTFcIjpfMTIsXCJhcC1zb3V0aGVhc3QtMlwiOl8xMixcImFwLXNvdXRoZWFzdC0zXCI6XzEyLFwiYXAtc291dGhlYXN0LTRcIjpfMTIsXCJhcC1zb3V0aGVhc3QtNVwiOl8xMixcImNhLWNlbnRyYWwtMVwiOl8xMixcImNhLXdlc3QtMVwiOl8xMixcImV1LWNlbnRyYWwtMVwiOl8xMixcImV1LWNlbnRyYWwtMlwiOl8xMixcImV1LW5vcnRoLTFcIjpfMTIsXCJldS1zb3V0aC0xXCI6XzEyLFwiZXUtc291dGgtMlwiOl8xMixcImV1LXdlc3QtMVwiOl8xMixcImV1LXdlc3QtMlwiOl8xMixcImV1LXdlc3QtM1wiOl8xMixcImlsLWNlbnRyYWwtMVwiOl8xMixcIm1lLWNlbnRyYWwtMVwiOl8xMixcIm1lLXNvdXRoLTFcIjpfMTIsXCJzYS1lYXN0LTFcIjpfMTIsXCJ1cy1lYXN0LTFcIjpfMTIsXCJ1cy1lYXN0LTJcIjpfMTIsXCJ1cy13ZXN0LTFcIjpfMTIsXCJ1cy13ZXN0LTJcIjpfMTIsXCJ1cy1nb3YtZWFzdC0xXCI6XzEzLFwidXMtZ292LXdlc3QtMVwiOl8xM31dLFwic2FnZW1ha2VyXCI6WzAse1wiYXAtbm9ydGhlYXN0LTFcIjpfMTUsXCJhcC1ub3J0aGVhc3QtMlwiOl8xNSxcImFwLXNvdXRoLTFcIjpfMTUsXCJhcC1zb3V0aGVhc3QtMVwiOl8xNSxcImFwLXNvdXRoZWFzdC0yXCI6XzE1LFwiY2EtY2VudHJhbC0xXCI6XzE3LFwiZXUtY2VudHJhbC0xXCI6XzE1LFwiZXUtd2VzdC0xXCI6XzE1LFwiZXUtd2VzdC0yXCI6XzE1LFwidXMtZWFzdC0xXCI6XzE3LFwidXMtZWFzdC0yXCI6XzE3LFwidXMtd2VzdC0yXCI6XzE3LFwiYWYtc291dGgtMVwiOl8xNCxcImFwLWVhc3QtMVwiOl8xNCxcImFwLW5vcnRoZWFzdC0zXCI6XzE0LFwiYXAtc291dGgtMlwiOl8xNixcImFwLXNvdXRoZWFzdC0zXCI6XzE0LFwiYXAtc291dGhlYXN0LTRcIjpfMTYsXCJjYS13ZXN0LTFcIjpbMCx7XCJub3RlYm9va1wiOl8zLFwibm90ZWJvb2stZmlwc1wiOl8zfV0sXCJldS1jZW50cmFsLTJcIjpfMTQsXCJldS1ub3J0aC0xXCI6XzE0LFwiZXUtc291dGgtMVwiOl8xNCxcImV1LXNvdXRoLTJcIjpfMTQsXCJldS13ZXN0LTNcIjpfMTQsXCJpbC1jZW50cmFsLTFcIjpfMTQsXCJtZS1jZW50cmFsLTFcIjpfMTQsXCJtZS1zb3V0aC0xXCI6XzE0LFwic2EtZWFzdC0xXCI6XzE0LFwidXMtZ292LWVhc3QtMVwiOl8xOCxcInVzLWdvdi13ZXN0LTFcIjpfMTgsXCJ1cy13ZXN0LTFcIjpbMCx7XCJub3RlYm9va1wiOl8zLFwibm90ZWJvb2stZmlwc1wiOl8zLFwic3R1ZGlvXCI6XzN9XSxcImV4cGVyaW1lbnRzXCI6XzZ9XSxcInJlcG9zdFwiOlswLHtcInByaXZhdGVcIjpfNn1dfV0sXCJheGFcIjpfMixcImF6dXJlXCI6XzIsXCJiYWJ5XCI6XzIsXCJiYWlkdVwiOl8yLFwiYmFuYW1leFwiOl8yLFwiYmFuZFwiOl8yLFwiYmFua1wiOl8yLFwiYmFyXCI6XzIsXCJiYXJjZWxvbmFcIjpfMixcImJhcmNsYXljYXJkXCI6XzIsXCJiYXJjbGF5c1wiOl8yLFwiYmFyZWZvb3RcIjpfMixcImJhcmdhaW5zXCI6XzIsXCJiYXNlYmFsbFwiOl8yLFwiYmFza2V0YmFsbFwiOlsxLHtcImF1c1wiOl8zLFwibnpcIjpfM31dLFwiYmF1aGF1c1wiOl8yLFwiYmF5ZXJuXCI6XzIsXCJiYmNcIjpfMixcImJidFwiOl8yLFwiYmJ2YVwiOl8yLFwiYmNnXCI6XzIsXCJiY25cIjpfMixcImJlYXRzXCI6XzIsXCJiZWF1dHlcIjpfMixcImJlZXJcIjpfMixcImJlcmxpblwiOl8yLFwiYmVzdFwiOl8yLFwiYmVzdGJ1eVwiOl8yLFwiYmV0XCI6XzIsXCJiaGFydGlcIjpfMixcImJpYmxlXCI6XzIsXCJiaWRcIjpfMixcImJpa2VcIjpfMixcImJpbmdcIjpfMixcImJpbmdvXCI6XzIsXCJiaW9cIjpfMixcImJsYWNrXCI6XzIsXCJibGFja2ZyaWRheVwiOl8yLFwiYmxvY2tidXN0ZXJcIjpfMixcImJsb2dcIjpfMixcImJsb29tYmVyZ1wiOl8yLFwiYmx1ZVwiOl8yLFwiYm1zXCI6XzIsXCJibXdcIjpfMixcImJucHBhcmliYXNcIjpfMixcImJvYXRzXCI6XzIsXCJib2VocmluZ2VyXCI6XzIsXCJib2ZhXCI6XzIsXCJib21cIjpfMixcImJvbmRcIjpfMixcImJvb1wiOl8yLFwiYm9va1wiOl8yLFwiYm9va2luZ1wiOl8yLFwiYm9zY2hcIjpfMixcImJvc3Rpa1wiOl8yLFwiYm9zdG9uXCI6XzIsXCJib3RcIjpfMixcImJvdXRpcXVlXCI6XzIsXCJib3hcIjpfMixcImJyYWRlc2NvXCI6XzIsXCJicmlkZ2VzdG9uZVwiOl8yLFwiYnJvYWR3YXlcIjpfMixcImJyb2tlclwiOl8yLFwiYnJvdGhlclwiOl8yLFwiYnJ1c3NlbHNcIjpfMixcImJ1aWxkXCI6WzEse1widjBcIjpfMyxcIndpbmRzdXJmXCI6XzN9XSxcImJ1aWxkZXJzXCI6WzEse1wiY2xvdWRzaXRlXCI6XzN9XSxcImJ1c2luZXNzXCI6XzIxLFwiYnV5XCI6XzIsXCJidXp6XCI6XzIsXCJiemhcIjpfMixcImNhYlwiOl8yLFwiY2FmZVwiOl8yLFwiY2FsXCI6XzIsXCJjYWxsXCI6XzIsXCJjYWx2aW5rbGVpblwiOl8yLFwiY2FtXCI6XzIsXCJjYW1lcmFcIjpfMixcImNhbXBcIjpbMSx7XCJlbWZcIjpbMCx7XCJhdFwiOl8zfV19XSxcImNhbm9uXCI6XzIsXCJjYXBldG93blwiOl8yLFwiY2FwaXRhbFwiOl8yLFwiY2FwaXRhbG9uZVwiOl8yLFwiY2FyXCI6XzIsXCJjYXJhdmFuXCI6XzIsXCJjYXJkc1wiOl8yLFwiY2FyZVwiOl8yLFwiY2FyZWVyXCI6XzIsXCJjYXJlZXJzXCI6XzIsXCJjYXJzXCI6XzIsXCJjYXNhXCI6WzEse1wibmFidVwiOlswLHtcInVpXCI6XzN9XX1dLFwiY2FzZVwiOl8yLFwiY2FzaFwiOl8yLFwiY2FzaW5vXCI6XzIsXCJjYXRlcmluZ1wiOl8yLFwiY2F0aG9saWNcIjpfMixcImNiYVwiOl8yLFwiY2JuXCI6XzIsXCJjYnJlXCI6XzIsXCJjZW50ZXJcIjpfMixcImNlb1wiOl8yLFwiY2VyblwiOl8yLFwiY2ZhXCI6XzIsXCJjZmRcIjpfMixcImNoYW5lbFwiOl8yLFwiY2hhbm5lbFwiOl8yLFwiY2hhcml0eVwiOl8yLFwiY2hhc2VcIjpfMixcImNoYXRcIjpfMixcImNoZWFwXCI6XzIsXCJjaGludGFpXCI6XzIsXCJjaHJpc3RtYXNcIjpfMixcImNocm9tZVwiOl8yLFwiY2h1cmNoXCI6XzIsXCJjaXByaWFuaVwiOl8yLFwiY2lyY2xlXCI6XzIsXCJjaXNjb1wiOl8yLFwiY2l0YWRlbFwiOl8yLFwiY2l0aVwiOl8yLFwiY2l0aWNcIjpfMixcImNpdHlcIjpfMixcImNsYWltc1wiOl8yLFwiY2xlYW5pbmdcIjpfMixcImNsaWNrXCI6XzIsXCJjbGluaWNcIjpfMixcImNsaW5pcXVlXCI6XzIsXCJjbG90aGluZ1wiOl8yLFwiY2xvdWRcIjpbMSx7XCJjb252ZXhcIjpfMyxcImVsZW1lbnRvclwiOl8zLFwiZW5jb3dheVwiOlswLHtcImV1XCI6XzN9XSxcInN0YXRpY3NcIjpfNixcInJhdmVuZGJcIjpfMyxcImF4YXJuZXRcIjpbMCx7XCJlcy0xXCI6XzN9XSxcImRpYWRlbVwiOl8zLFwiamVsYXN0aWNcIjpbMCx7XCJ2aXBcIjpfM31dLFwiamVsZVwiOl8zLFwiamVudi1hcnViYVwiOlswLHtcImFydWJhXCI6WzAse1wiZXVyXCI6WzAse1wiaXQxXCI6XzN9XX1dLFwiaXQxXCI6XzN9XSxcImtlbGl3ZWJcIjpbMix7XCJjc1wiOl8zfV0sXCJveGFcIjpbMix7XCJ0blwiOl8zLFwidWtcIjpfM31dLFwicHJpbWV0ZWxcIjpbMix7XCJ1a1wiOl8zfV0sXCJyZWNsYWltXCI6WzAse1wiY2FcIjpfMyxcInVrXCI6XzMsXCJ1c1wiOl8zfV0sXCJ0cmVuZGhvc3RpbmdcIjpbMCx7XCJjaFwiOl8zLFwiZGVcIjpfM31dLFwiam90ZVwiOl8zLFwiam90ZWx1bHVcIjpfMyxcImt1bGV1dmVuXCI6XzMsXCJsYXJhdmVsXCI6XzMsXCJsaW5reWFyZFwiOl8zLFwibWFnZW50b3NpdGVcIjpfNixcIm1hdGxhYlwiOl8zLFwib2JzZXJ2YWJsZWhxXCI6XzMsXCJwZXJzcGVjdGFcIjpfMyxcInZhcG9yXCI6XzMsXCJvbi1yYW5jaGVyXCI6XzYsXCJzY3dcIjpbMCx7XCJiYXJlbWV0YWxcIjpbMCx7XCJmci1wYXItMVwiOl8zLFwiZnItcGFyLTJcIjpfMyxcIm5sLWFtcy0xXCI6XzN9XSxcImZyLXBhclwiOlswLHtcImNvY2twaXRcIjpfMyxcImRkbFwiOl8zLFwiZHR3aFwiOl8zLFwiZm5jXCI6WzIse1wiZnVuY3Rpb25zXCI6XzN9XSxcImlmclwiOl8zLFwiazhzXCI6XzIzLFwia2Fma1wiOl8zLFwibWdkYlwiOl8zLFwicmRiXCI6XzMsXCJzM1wiOl8zLFwiczMtd2Vic2l0ZVwiOl8zLFwic2NibFwiOl8zLFwid2htXCI6XzN9XSxcImluc3RhbmNlc1wiOlswLHtcInByaXZcIjpfMyxcInB1YlwiOl8zfV0sXCJrOHNcIjpfMyxcIm5sLWFtc1wiOlswLHtcImNvY2twaXRcIjpfMyxcImRkbFwiOl8zLFwiZHR3aFwiOl8zLFwiaWZyXCI6XzMsXCJrOHNcIjpfMjMsXCJrYWZrXCI6XzMsXCJtZ2RiXCI6XzMsXCJyZGJcIjpfMyxcInMzXCI6XzMsXCJzMy13ZWJzaXRlXCI6XzMsXCJzY2JsXCI6XzMsXCJ3aG1cIjpfM31dLFwicGwtd2F3XCI6WzAse1wiY29ja3BpdFwiOl8zLFwiZGRsXCI6XzMsXCJkdHdoXCI6XzMsXCJpZnJcIjpfMyxcIms4c1wiOl8yMyxcImthZmtcIjpfMyxcIm1nZGJcIjpfMyxcInJkYlwiOl8zLFwiczNcIjpfMyxcInMzLXdlYnNpdGVcIjpfMyxcInNjYmxcIjpfM31dLFwic2NhbGVib29rXCI6XzMsXCJzbWFydGxhYmVsaW5nXCI6XzN9XSxcInNlcnZlYm9sdFwiOl8zLFwib25zdGFja2l0XCI6WzAse1wicnVuc1wiOl8zfV0sXCJ0cmFmZmljcGxleFwiOl8zLFwidW5pc29uLXNlcnZpY2VzXCI6XzMsXCJ1cm93blwiOl8zLFwidm9vcmxvcGVyXCI6XzMsXCJ6YXBcIjpfM31dLFwiY2x1YlwiOlsxLHtcImNsb3VkbnNcIjpfMyxcImplbGVcIjpfMyxcImJhcnN5XCI6XzN9XSxcImNsdWJtZWRcIjpfMixcImNvYWNoXCI6XzIsXCJjb2Rlc1wiOlsxLHtcIm93b1wiOl82fV0sXCJjb2ZmZWVcIjpfMixcImNvbGxlZ2VcIjpfMixcImNvbG9nbmVcIjpfMixcImNvbW1iYW5rXCI6XzIsXCJjb21tdW5pdHlcIjpbMSx7XCJub2dcIjpfMyxcInJhdmVuZGJcIjpfMyxcIm15Zm9ydW1cIjpfM31dLFwiY29tcGFueVwiOl8yLFwiY29tcGFyZVwiOl8yLFwiY29tcHV0ZXJcIjpfMixcImNvbXNlY1wiOl8yLFwiY29uZG9zXCI6XzIsXCJjb25zdHJ1Y3Rpb25cIjpfMixcImNvbnN1bHRpbmdcIjpfMixcImNvbnRhY3RcIjpfMixcImNvbnRyYWN0b3JzXCI6XzIsXCJjb29raW5nXCI6XzIsXCJjb29sXCI6WzEse1wiZWxlbWVudG9yXCI6XzMsXCJkZVwiOl8zfV0sXCJjb3JzaWNhXCI6XzIsXCJjb3VudHJ5XCI6XzIsXCJjb3Vwb25cIjpfMixcImNvdXBvbnNcIjpfMixcImNvdXJzZXNcIjpfMixcImNwYVwiOl8yLFwiY3JlZGl0XCI6XzIsXCJjcmVkaXRjYXJkXCI6XzIsXCJjcmVkaXR1bmlvblwiOl8yLFwiY3JpY2tldFwiOl8yLFwiY3Jvd25cIjpfMixcImNyc1wiOl8yLFwiY3J1aXNlXCI6XzIsXCJjcnVpc2VzXCI6XzIsXCJjdWlzaW5lbGxhXCI6XzIsXCJjeW1ydVwiOl8yLFwiY3lvdVwiOl8yLFwiZGFkXCI6XzIsXCJkYW5jZVwiOl8yLFwiZGF0YVwiOl8yLFwiZGF0ZVwiOl8yLFwiZGF0aW5nXCI6XzIsXCJkYXRzdW5cIjpfMixcImRheVwiOl8yLFwiZGNsa1wiOl8yLFwiZGRzXCI6XzIsXCJkZWFsXCI6XzIsXCJkZWFsZXJcIjpfMixcImRlYWxzXCI6XzIsXCJkZWdyZWVcIjpfMixcImRlbGl2ZXJ5XCI6XzIsXCJkZWxsXCI6XzIsXCJkZWxvaXR0ZVwiOl8yLFwiZGVsdGFcIjpfMixcImRlbW9jcmF0XCI6XzIsXCJkZW50YWxcIjpfMixcImRlbnRpc3RcIjpfMixcImRlc2lcIjpfMixcImRlc2lnblwiOlsxLHtcImdyYXBoaWNcIjpfMyxcImJzc1wiOl8zfV0sXCJkZXZcIjpbMSx7XCIxMmNoYXJzXCI6XzMsXCJteWFkZHJcIjpfMyxcInBhbmVsXCI6XzMsXCJsY2xcIjpfNixcImxjbHN0YWdlXCI6XzYsXCJzdGdcIjpfNixcInN0Z3N0YWdlXCI6XzYsXCJwYWdlc1wiOl8zLFwicjJcIjpfMyxcIndvcmtlcnNcIjpfMyxcImRlbm9cIjpfMyxcImRlbm8tc3RhZ2luZ1wiOl8zLFwiZGV0YVwiOl8zLFwibHBcIjpbMix7XCJhcGlcIjpfMyxcIm9iamVjdHNcIjpfM31dLFwiZXZlcnZhdWx0XCI6XzgsXCJmbHlcIjpfMyxcImdpdGh1YnByZXZpZXdcIjpfMyxcImdhdGV3YXlcIjpfNixcImJvdGRhc2hcIjpfMyxcImluYnJvd3NlclwiOl82LFwiaXMtYS1nb29kXCI6XzMsXCJpc2VydlwiOl8zLFwibGVhcGNlbGxcIjpfMyxcInJ1bmNvbnRhaW5lcnNcIjpfMyxcImxvY2FsY2VydFwiOlswLHtcInVzZXJcIjpfNn1dLFwibG9naW5saW5lXCI6XzMsXCJiYXJzeVwiOl8zLFwibWVkaWF0ZWNoXCI6XzMsXCJtb2R4XCI6XzMsXCJuZ3Jva1wiOl8zLFwibmdyb2stZnJlZVwiOl8zLFwiaXMtYS1mdWxsc3RhY2tcIjpfMyxcImlzLWNvb2xcIjpfMyxcImlzLW5vdC1hXCI6XzMsXCJsb2NhbHBsYXllclwiOl8zLFwieG1pdFwiOl8zLFwicGxhdHRlci1hcHBcIjpfMyxcInJlcGxpdFwiOlsyLHtcImFyY2hlclwiOl8zLFwiYm9uZXNcIjpfMyxcImNhbmFyeVwiOl8zLFwiZ2xvYmFsXCI6XzMsXCJoYWNrZXJcIjpfMyxcImlkXCI6XzMsXCJqYW5ld2F5XCI6XzMsXCJraW1cIjpfMyxcImtpcmFcIjpfMyxcImtpcmtcIjpfMyxcIm9kb1wiOl8zLFwicGFyaXNcIjpfMyxcInBpY2FyZFwiOl8zLFwicGlrZVwiOl8zLFwicHJlcmVsZWFzZVwiOl8zLFwicmVlZFwiOl8zLFwicmlrZXJcIjpfMyxcInNpc2tvXCI6XzMsXCJzcG9ja1wiOl8zLFwic3RhZ2luZ1wiOl8zLFwic3VsdVwiOl8zLFwidGFycGl0XCI6XzMsXCJ0ZWFtc1wiOl8zLFwidHVja2VyXCI6XzMsXCJ3ZXNsZXlcIjpfMyxcIndvcmZcIjpfM31dLFwiY3JtXCI6WzAse1wiZFwiOl82LFwid1wiOl82LFwid2FcIjpfNixcIndiXCI6XzYsXCJ3Y1wiOl82LFwid2RcIjpfNixcIndlXCI6XzYsXCJ3ZlwiOl82fV0sXCJlcnBcIjpfNTAsXCJ2ZXJjZWxcIjpfMyxcIndlYmhhcmVcIjpfNixcImhyc25cIjpfMyxcImlzLWFcIjpfM31dLFwiZGhsXCI6XzIsXCJkaWFtb25kc1wiOl8yLFwiZGlldFwiOl8yLFwiZGlnaXRhbFwiOlsxLHtcImNsb3VkYXBwc1wiOlsyLHtcImxvbmRvblwiOl8zfV19XSxcImRpcmVjdFwiOlsxLHtcImxpYnAycFwiOl8zfV0sXCJkaXJlY3RvcnlcIjpfMixcImRpc2NvdW50XCI6XzIsXCJkaXNjb3ZlclwiOl8yLFwiZGlzaFwiOl8yLFwiZGl5XCI6XzIsXCJkbnBcIjpfMixcImRvY3NcIjpfMixcImRvY3RvclwiOl8yLFwiZG9nXCI6XzIsXCJkb21haW5zXCI6XzIsXCJkb3RcIjpfMixcImRvd25sb2FkXCI6XzIsXCJkcml2ZVwiOl8yLFwiZHR2XCI6XzIsXCJkdWJhaVwiOl8yLFwiZHVubG9wXCI6XzIsXCJkdXBvbnRcIjpfMixcImR1cmJhblwiOl8yLFwiZHZhZ1wiOl8yLFwiZHZyXCI6XzIsXCJlYXJ0aFwiOl8yLFwiZWF0XCI6XzIsXCJlY29cIjpfMixcImVkZWthXCI6XzIsXCJlZHVjYXRpb25cIjpfMjEsXCJlbWFpbFwiOlsxLHtcImNyaXNwXCI6WzAse1wib25cIjpfM31dLFwidGF3a1wiOl81MixcInRhd2t0b1wiOl81Mn1dLFwiZW1lcmNrXCI6XzIsXCJlbmVyZ3lcIjpfMixcImVuZ2luZWVyXCI6XzIsXCJlbmdpbmVlcmluZ1wiOl8yLFwiZW50ZXJwcmlzZXNcIjpfMixcImVwc29uXCI6XzIsXCJlcXVpcG1lbnRcIjpfMixcImVyaWNzc29uXCI6XzIsXCJlcm5pXCI6XzIsXCJlc3FcIjpfMixcImVzdGF0ZVwiOlsxLHtcImNvbXB1dGVcIjpfNn1dLFwiZXVyb3Zpc2lvblwiOl8yLFwiZXVzXCI6WzEse1wicGFydHlcIjpfNTN9XSxcImV2ZW50c1wiOlsxLHtcImtvb2JpblwiOl8zLFwiY29cIjpfM31dLFwiZXhjaGFuZ2VcIjpfMixcImV4cGVydFwiOl8yLFwiZXhwb3NlZFwiOl8yLFwiZXhwcmVzc1wiOl8yLFwiZXh0cmFzcGFjZVwiOl8yLFwiZmFnZVwiOl8yLFwiZmFpbFwiOl8yLFwiZmFpcndpbmRzXCI6XzIsXCJmYWl0aFwiOl8yLFwiZmFtaWx5XCI6XzIsXCJmYW5cIjpfMixcImZhbnNcIjpfMixcImZhcm1cIjpbMSx7XCJzdG9yalwiOl8zfV0sXCJmYXJtZXJzXCI6XzIsXCJmYXNoaW9uXCI6XzIsXCJmYXN0XCI6XzIsXCJmZWRleFwiOl8yLFwiZmVlZGJhY2tcIjpfMixcImZlcnJhcmlcIjpfMixcImZlcnJlcm9cIjpfMixcImZpZGVsaXR5XCI6XzIsXCJmaWRvXCI6XzIsXCJmaWxtXCI6XzIsXCJmaW5hbFwiOl8yLFwiZmluYW5jZVwiOl8yLFwiZmluYW5jaWFsXCI6XzIxLFwiZmlyZVwiOl8yLFwiZmlyZXN0b25lXCI6XzIsXCJmaXJtZGFsZVwiOl8yLFwiZmlzaFwiOl8yLFwiZmlzaGluZ1wiOl8yLFwiZml0XCI6XzIsXCJmaXRuZXNzXCI6XzIsXCJmbGlja3JcIjpfMixcImZsaWdodHNcIjpfMixcImZsaXJcIjpfMixcImZsb3Jpc3RcIjpfMixcImZsb3dlcnNcIjpfMixcImZseVwiOl8yLFwiZm9vXCI6XzIsXCJmb29kXCI6XzIsXCJmb290YmFsbFwiOl8yLFwiZm9yZFwiOl8yLFwiZm9yZXhcIjpfMixcImZvcnNhbGVcIjpfMixcImZvcnVtXCI6XzIsXCJmb3VuZGF0aW9uXCI6XzIsXCJmb3hcIjpfMixcImZyZWVcIjpfMixcImZyZXNlbml1c1wiOl8yLFwiZnJsXCI6XzIsXCJmcm9nYW5zXCI6XzIsXCJmcm9udGllclwiOl8yLFwiZnRyXCI6XzIsXCJmdWppdHN1XCI6XzIsXCJmdW5cIjpfMixcImZ1bmRcIjpfMixcImZ1cm5pdHVyZVwiOl8yLFwiZnV0Ym9sXCI6XzIsXCJmeWlcIjpfMixcImdhbFwiOl8yLFwiZ2FsbGVyeVwiOl8yLFwiZ2FsbG9cIjpfMixcImdhbGx1cFwiOl8yLFwiZ2FtZVwiOl8yLFwiZ2FtZXNcIjpbMSx7XCJwbGV5XCI6XzMsXCJzaGVlenlcIjpfM31dLFwiZ2FwXCI6XzIsXCJnYXJkZW5cIjpfMixcImdheVwiOlsxLHtcInBhZ2VzXCI6XzN9XSxcImdiaXpcIjpfMixcImdkblwiOlsxLHtcImNucHlcIjpfM31dLFwiZ2VhXCI6XzIsXCJnZW50XCI6XzIsXCJnZW50aW5nXCI6XzIsXCJnZW9yZ2VcIjpfMixcImdnZWVcIjpfMixcImdpZnRcIjpfMixcImdpZnRzXCI6XzIsXCJnaXZlc1wiOl8yLFwiZ2l2aW5nXCI6XzIsXCJnbGFzc1wiOl8yLFwiZ2xlXCI6XzIsXCJnbG9iYWxcIjpbMSx7XCJhcHB3cml0ZVwiOl8zfV0sXCJnbG9ib1wiOl8yLFwiZ21haWxcIjpfMixcImdtYmhcIjpfMixcImdtb1wiOl8yLFwiZ214XCI6XzIsXCJnb2RhZGR5XCI6XzIsXCJnb2xkXCI6XzIsXCJnb2xkcG9pbnRcIjpfMixcImdvbGZcIjpfMixcImdvb1wiOl8yLFwiZ29vZHllYXJcIjpfMixcImdvb2dcIjpbMSx7XCJjbG91ZFwiOl8zLFwidHJhbnNsYXRlXCI6XzMsXCJ1c2VyY29udGVudFwiOl82fV0sXCJnb29nbGVcIjpfMixcImdvcFwiOl8yLFwiZ290XCI6XzIsXCJncmFpbmdlclwiOl8yLFwiZ3JhcGhpY3NcIjpfMixcImdyYXRpc1wiOl8yLFwiZ3JlZW5cIjpfMixcImdyaXBlXCI6XzIsXCJncm9jZXJ5XCI6XzIsXCJncm91cFwiOlsxLHtcImRpc2NvdXJzZVwiOl8zfV0sXCJndWNjaVwiOl8yLFwiZ3VnZVwiOl8yLFwiZ3VpZGVcIjpfMixcImd1aXRhcnNcIjpfMixcImd1cnVcIjpfMixcImhhaXJcIjpfMixcImhhbWJ1cmdcIjpfMixcImhhbmdvdXRcIjpfMixcImhhdXNcIjpfMixcImhib1wiOl8yLFwiaGRmY1wiOl8yLFwiaGRmY2JhbmtcIjpfMixcImhlYWx0aFwiOlsxLHtcImhyYVwiOl8zfV0sXCJoZWFsdGhjYXJlXCI6XzIsXCJoZWxwXCI6XzIsXCJoZWxzaW5raVwiOl8yLFwiaGVyZVwiOl8yLFwiaGVybWVzXCI6XzIsXCJoaXBob3BcIjpfMixcImhpc2FtaXRzdVwiOl8yLFwiaGl0YWNoaVwiOl8yLFwiaGl2XCI6XzIsXCJoa3RcIjpfMixcImhvY2tleVwiOl8yLFwiaG9sZGluZ3NcIjpfMixcImhvbGlkYXlcIjpfMixcImhvbWVkZXBvdFwiOl8yLFwiaG9tZWdvb2RzXCI6XzIsXCJob21lc1wiOl8yLFwiaG9tZXNlbnNlXCI6XzIsXCJob25kYVwiOl8yLFwiaG9yc2VcIjpfMixcImhvc3BpdGFsXCI6XzIsXCJob3N0XCI6WzEse1wiY2xvdWRhY2Nlc3NcIjpfMyxcImZyZWVzaXRlXCI6XzMsXCJlYXN5cGFuZWxcIjpfMyxcImZhc3R2cHNcIjpfMyxcIm15ZmFzdFwiOl8zLFwidGVtcHVybFwiOl8zLFwid3BtdWRldlwiOl8zLFwiaXNlcnZcIjpfMyxcImplbGVcIjpfMyxcIm1pcmNsb3VkXCI6XzMsXCJib2x0XCI6XzMsXCJ3cDJcIjpfMyxcImhhbGZcIjpfM31dLFwiaG9zdGluZ1wiOlsxLHtcIm9wZW5jcmFmdFwiOl8zfV0sXCJob3RcIjpfMixcImhvdGVsXCI6XzIsXCJob3RlbHNcIjpfMixcImhvdG1haWxcIjpfMixcImhvdXNlXCI6XzIsXCJob3dcIjpfMixcImhzYmNcIjpfMixcImh1Z2hlc1wiOl8yLFwiaHlhdHRcIjpfMixcImh5dW5kYWlcIjpfMixcImlibVwiOl8yLFwiaWNiY1wiOl8yLFwiaWNlXCI6XzIsXCJpY3VcIjpfMixcImllZWVcIjpfMixcImlmbVwiOl8yLFwiaWthbm9cIjpfMixcImltYW1hdFwiOl8yLFwiaW1kYlwiOl8yLFwiaW1tb1wiOl8yLFwiaW1tb2JpbGllblwiOl8yLFwiaW5jXCI6XzIsXCJpbmR1c3RyaWVzXCI6XzIsXCJpbmZpbml0aVwiOl8yLFwiaW5nXCI6XzIsXCJpbmtcIjpfMixcImluc3RpdHV0ZVwiOl8yLFwiaW5zdXJhbmNlXCI6XzIsXCJpbnN1cmVcIjpfMixcImludGVybmF0aW9uYWxcIjpfMixcImludHVpdFwiOl8yLFwiaW52ZXN0bWVudHNcIjpfMixcImlwaXJhbmdhXCI6XzIsXCJpcmlzaFwiOl8yLFwiaXNtYWlsaVwiOl8yLFwiaXN0XCI6XzIsXCJpc3RhbmJ1bFwiOl8yLFwiaXRhdVwiOl8yLFwiaXR2XCI6XzIsXCJqYWd1YXJcIjpfMixcImphdmFcIjpfMixcImpjYlwiOl8yLFwiamVlcFwiOl8yLFwiamV0enRcIjpfMixcImpld2VscnlcIjpfMixcImppb1wiOl8yLFwiamxsXCI6XzIsXCJqbXBcIjpfMixcImpualwiOl8yLFwiam9idXJnXCI6XzIsXCJqb3RcIjpfMixcImpveVwiOl8yLFwianBtb3JnYW5cIjpfMixcImpwcnNcIjpfMixcImp1ZWdvc1wiOl8yLFwianVuaXBlclwiOl8yLFwia2F1ZmVuXCI6XzIsXCJrZGRpXCI6XzIsXCJrZXJyeWhvdGVsc1wiOl8yLFwia2Vycnlwcm9wZXJ0aWVzXCI6XzIsXCJrZmhcIjpfMixcImtpYVwiOl8yLFwia2lkc1wiOl8yLFwia2ltXCI6XzIsXCJraW5kbGVcIjpfMixcImtpdGNoZW5cIjpfMixcImtpd2lcIjpfMixcImtvZWxuXCI6XzIsXCJrb21hdHN1XCI6XzIsXCJrb3NoZXJcIjpfMixcImtwbWdcIjpfMixcImtwblwiOl8yLFwia3JkXCI6WzEse1wiY29cIjpfMyxcImVkdVwiOl8zfV0sXCJrcmVkXCI6XzIsXCJrdW9rZ3JvdXBcIjpfMixcImt5b3RvXCI6XzIsXCJsYWNhaXhhXCI6XzIsXCJsYW1ib3JnaGluaVwiOl8yLFwibGFtZXJcIjpfMixcImxhbmRcIjpfMixcImxhbmRyb3ZlclwiOl8yLFwibGFueGVzc1wiOl8yLFwibGFzYWxsZVwiOl8yLFwibGF0XCI6XzIsXCJsYXRpbm9cIjpfMixcImxhdHJvYmVcIjpfMixcImxhd1wiOl8yLFwibGF3eWVyXCI6XzIsXCJsZHNcIjpfMixcImxlYXNlXCI6XzIsXCJsZWNsZXJjXCI6XzIsXCJsZWZyYWtcIjpfMixcImxlZ2FsXCI6XzIsXCJsZWdvXCI6XzIsXCJsZXh1c1wiOl8yLFwibGdidFwiOl8yLFwibGlkbFwiOl8yLFwibGlmZVwiOl8yLFwibGlmZWluc3VyYW5jZVwiOl8yLFwibGlmZXN0eWxlXCI6XzIsXCJsaWdodGluZ1wiOl8yLFwibGlrZVwiOl8yLFwibGlsbHlcIjpfMixcImxpbWl0ZWRcIjpfMixcImxpbW9cIjpfMixcImxpbmNvbG5cIjpfMixcImxpbmtcIjpbMSx7XCJteWZyaXR6XCI6XzMsXCJjeW9uXCI6XzMsXCJkd2ViXCI6XzYsXCJpbmJyb3dzZXJcIjpfNixcIm5mdHN0b3JhZ2VcIjpfNjAsXCJteXBlcFwiOl8zLFwic3RvcmFjaGFcIjpfNjAsXCJ3M3NcIjpfNjB9XSxcImxpdmVcIjpbMSx7XCJhZW1cIjpfMyxcImhseFwiOl8zLFwiZXdwXCI6XzZ9XSxcImxpdmluZ1wiOl8yLFwibGxjXCI6XzIsXCJsbHBcIjpfMixcImxvYW5cIjpfMixcImxvYW5zXCI6XzIsXCJsb2NrZXJcIjpfMixcImxvY3VzXCI6XzIsXCJsb2xcIjpbMSx7XCJvbWdcIjpfM31dLFwibG9uZG9uXCI6XzIsXCJsb3R0ZVwiOl8yLFwibG90dG9cIjpfMixcImxvdmVcIjpfMixcImxwbFwiOl8yLFwibHBsZmluYW5jaWFsXCI6XzIsXCJsdGRcIjpfMixcImx0ZGFcIjpfMixcImx1bmRiZWNrXCI6XzIsXCJsdXhlXCI6XzIsXCJsdXh1cnlcIjpfMixcIm1hZHJpZFwiOl8yLFwibWFpZlwiOl8yLFwibWFpc29uXCI6XzIsXCJtYWtldXBcIjpfMixcIm1hblwiOl8yLFwibWFuYWdlbWVudFwiOl8yLFwibWFuZ29cIjpfMixcIm1hcFwiOl8yLFwibWFya2V0XCI6XzIsXCJtYXJrZXRpbmdcIjpfMixcIm1hcmtldHNcIjpfMixcIm1hcnJpb3R0XCI6XzIsXCJtYXJzaGFsbHNcIjpfMixcIm1hdHRlbFwiOl8yLFwibWJhXCI6XzIsXCJtY2tpbnNleVwiOl8yLFwibWVkXCI6XzIsXCJtZWRpYVwiOl82MSxcIm1lZXRcIjpfMixcIm1lbGJvdXJuZVwiOl8yLFwibWVtZVwiOl8yLFwibWVtb3JpYWxcIjpfMixcIm1lblwiOl8yLFwibWVudVwiOlsxLHtcImJhcnN5XCI6XzMsXCJiYXJzeW9ubGluZVwiOl8zfV0sXCJtZXJja1wiOl8yLFwibWVyY2ttc2RcIjpfMixcIm1pYW1pXCI6XzIsXCJtaWNyb3NvZnRcIjpfMixcIm1pbmlcIjpfMixcIm1pbnRcIjpfMixcIm1pdFwiOl8yLFwibWl0c3ViaXNoaVwiOl8yLFwibWxiXCI6XzIsXCJtbHNcIjpfMixcIm1tYVwiOl8yLFwibW9iaWxlXCI6XzIsXCJtb2RhXCI6XzIsXCJtb2VcIjpfMixcIm1vaVwiOl8yLFwibW9tXCI6XzIsXCJtb25hc2hcIjpfMixcIm1vbmV5XCI6XzIsXCJtb25zdGVyXCI6XzIsXCJtb3Jtb25cIjpfMixcIm1vcnRnYWdlXCI6XzIsXCJtb3Njb3dcIjpfMixcIm1vdG9cIjpfMixcIm1vdG9yY3ljbGVzXCI6XzIsXCJtb3ZcIjpfMixcIm1vdmllXCI6XzIsXCJtc2RcIjpfMixcIm10blwiOl8yLFwibXRyXCI6XzIsXCJtdXNpY1wiOl8yLFwibmFiXCI6XzIsXCJuYWdveWFcIjpfMixcIm5hdnlcIjpfMixcIm5iYVwiOl8yLFwibmVjXCI6XzIsXCJuZXRiYW5rXCI6XzIsXCJuZXRmbGl4XCI6XzIsXCJuZXR3b3JrXCI6WzEse1wiYWVtXCI6XzMsXCJhbGNlc1wiOl82LFwiY29cIjpfMyxcImFydm9cIjpfMyxcImF6aW11dGhcIjpfMyxcInRsb25cIjpfM31dLFwibmV1c3RhclwiOl8yLFwibmV3XCI6XzIsXCJuZXdzXCI6WzEse1wibm90aWNlYWJsZVwiOl8zfV0sXCJuZXh0XCI6XzIsXCJuZXh0ZGlyZWN0XCI6XzIsXCJuZXh1c1wiOl8yLFwibmZsXCI6XzIsXCJuZ29cIjpfMixcIm5oa1wiOl8yLFwibmljb1wiOl8yLFwibmlrZVwiOl8yLFwibmlrb25cIjpfMixcIm5pbmphXCI6XzIsXCJuaXNzYW5cIjpfMixcIm5pc3NheVwiOl8yLFwibm9raWFcIjpfMixcIm5vcnRvblwiOl8yLFwibm93XCI6XzIsXCJub3dydXpcIjpfMixcIm5vd3R2XCI6XzIsXCJucmFcIjpfMixcIm5yd1wiOl8yLFwibnR0XCI6XzIsXCJueWNcIjpfMixcIm9iaVwiOl8yLFwib2JzZXJ2ZXJcIjpfMixcIm9mZmljZVwiOl8yLFwib2tpbmF3YVwiOl8yLFwib2xheWFuXCI6XzIsXCJvbGF5YW5ncm91cFwiOl8yLFwib2xsb1wiOl8yLFwib21lZ2FcIjpfMixcIm9uZVwiOlsxLHtcImtpblwiOl82LFwic2VydmljZVwiOl8zfV0sXCJvbmdcIjpbMSx7XCJvYmxcIjpfM31dLFwib25sXCI6XzIsXCJvbmxpbmVcIjpbMSx7XCJlZXJvXCI6XzMsXCJlZXJvLXN0YWdlXCI6XzMsXCJ3ZWJzaXRlYnVpbGRlclwiOl8zLFwibGVhcGNlbGxcIjpfMyxcImJhcnN5XCI6XzN9XSxcIm9vb1wiOl8yLFwib3BlblwiOl8yLFwib3JhY2xlXCI6XzIsXCJvcmFuZ2VcIjpbMSx7XCJ0ZWNoXCI6XzN9XSxcIm9yZ2FuaWNcIjpfMixcIm9yaWdpbnNcIjpfMixcIm9zYWthXCI6XzIsXCJvdHN1a2FcIjpfMixcIm90dFwiOl8yLFwib3ZoXCI6WzEse1wibmVyZHBvbFwiOl8zfV0sXCJwYWdlXCI6WzEse1wiYWVtXCI6XzMsXCJobHhcIjpfMyxcInRyYW5zbGF0ZWRcIjpfMyxcImNvZGViZXJnXCI6XzMsXCJoZXlmbG93XCI6XzMsXCJwcnZjeVwiOl8zLFwicm9ja3lcIjpfMyxcInBkbnNcIjpfMyxcInBsZXNrXCI6XzN9XSxcInBhbmFzb25pY1wiOl8yLFwicGFyaXNcIjpfMixcInBhcnNcIjpfMixcInBhcnRuZXJzXCI6XzIsXCJwYXJ0c1wiOl8yLFwicGFydHlcIjpfMixcInBheVwiOl8yLFwicGNjd1wiOl8yLFwicGV0XCI6XzIsXCJwZml6ZXJcIjpfMixcInBoYXJtYWN5XCI6XzIsXCJwaGRcIjpfMixcInBoaWxpcHNcIjpfMixcInBob25lXCI6XzIsXCJwaG90b1wiOl8yLFwicGhvdG9ncmFwaHlcIjpfMixcInBob3Rvc1wiOl82MSxcInBoeXNpb1wiOl8yLFwicGljc1wiOl8yLFwicGljdGV0XCI6XzIsXCJwaWN0dXJlc1wiOlsxLHtcIjEzMzdcIjpfM31dLFwicGlkXCI6XzIsXCJwaW5cIjpfMixcInBpbmdcIjpfMixcInBpbmtcIjpfMixcInBpb25lZXJcIjpfMixcInBpenphXCI6WzEse1wibmdyb2tcIjpfM31dLFwicGxhY2VcIjpfMjEsXCJwbGF5XCI6XzIsXCJwbGF5c3RhdGlvblwiOl8yLFwicGx1bWJpbmdcIjpfMixcInBsdXNcIjpfMixcInBuY1wiOl8yLFwicG9obFwiOl8yLFwicG9rZXJcIjpfMixcInBvbGl0aWVcIjpfMixcInBvcm5cIjpfMixcInByYXhpXCI6XzIsXCJwcmVzc1wiOl8yLFwicHJpbWVcIjpfMixcInByb2RcIjpfMixcInByb2R1Y3Rpb25zXCI6XzIsXCJwcm9mXCI6XzIsXCJwcm9ncmVzc2l2ZVwiOl8yLFwicHJvbW9cIjpfMixcInByb3BlcnRpZXNcIjpfMixcInByb3BlcnR5XCI6XzIsXCJwcm90ZWN0aW9uXCI6XzIsXCJwcnVcIjpfMixcInBydWRlbnRpYWxcIjpfMixcInB1YlwiOlsxLHtcImlkXCI6XzYsXCJraW5cIjpfNixcImJhcnN5XCI6XzN9XSxcInB3Y1wiOl8yLFwicXBvblwiOl8yLFwicXVlYmVjXCI6XzIsXCJxdWVzdFwiOl8yLFwicmFjaW5nXCI6XzIsXCJyYWRpb1wiOl8yLFwicmVhZFwiOl8yLFwicmVhbGVzdGF0ZVwiOl8yLFwicmVhbHRvclwiOl8yLFwicmVhbHR5XCI6XzIsXCJyZWNpcGVzXCI6XzIsXCJyZWRcIjpfMixcInJlZHVtYnJlbGxhXCI6XzIsXCJyZWhhYlwiOl8yLFwicmVpc2VcIjpfMixcInJlaXNlblwiOl8yLFwicmVpdFwiOl8yLFwicmVsaWFuY2VcIjpfMixcInJlblwiOl8yLFwicmVudFwiOl8yLFwicmVudGFsc1wiOl8yLFwicmVwYWlyXCI6XzIsXCJyZXBvcnRcIjpfMixcInJlcHVibGljYW5cIjpfMixcInJlc3RcIjpfMixcInJlc3RhdXJhbnRcIjpfMixcInJldmlld1wiOl8yLFwicmV2aWV3c1wiOlsxLHtcImFlbVwiOl8zfV0sXCJyZXhyb3RoXCI6XzIsXCJyaWNoXCI6XzIsXCJyaWNoYXJkbGlcIjpfMixcInJpY29oXCI6XzIsXCJyaWxcIjpfMixcInJpb1wiOl8yLFwicmlwXCI6WzEse1wiY2xhblwiOl8zfV0sXCJyb2Nrc1wiOlsxLHtcIm15ZGRuc1wiOl8zLFwic3RhY2tpdFwiOl8zLFwibGltYS1jaXR5XCI6XzMsXCJ3ZWJzcGFjZVwiOl8zfV0sXCJyb2Rlb1wiOl8yLFwicm9nZXJzXCI6XzIsXCJyb29tXCI6XzIsXCJyc3ZwXCI6XzIsXCJydWdieVwiOl8yLFwicnVoclwiOl8yLFwicnVuXCI6WzEse1wiYXBwd3JpdGVcIjpfNixcImNhbnZhXCI6XzMsXCJkZXZlbG9wbWVudFwiOl8zLFwicmF2ZW5kYlwiOl8zLFwibGlhcmFcIjpbMix7XCJpcmFuXCI6XzN9XSxcImxvdmFibGVcIjpfMyxcImJ1aWxkXCI6XzYsXCJjb2RlXCI6XzYsXCJkYXRhYmFzZVwiOl82LFwibWlncmF0aW9uXCI6XzYsXCJvbnBvcnRlclwiOl8zLFwicmVwbFwiOl8zLFwic3RhY2tpdFwiOl8zLFwidmFsXCI6XzUwLFwidmVyY2VsXCI6XzMsXCJ3aXhcIjpfM31dLFwicndlXCI6XzIsXCJyeXVreXVcIjpfMixcInNhYXJsYW5kXCI6XzIsXCJzYWZlXCI6XzIsXCJzYWZldHlcIjpfMixcInNha3VyYVwiOl8yLFwic2FsZVwiOl8yLFwic2Fsb25cIjpfMixcInNhbXNjbHViXCI6XzIsXCJzYW1zdW5nXCI6XzIsXCJzYW5kdmlrXCI6XzIsXCJzYW5kdmlrY29yb21hbnRcIjpfMixcInNhbm9maVwiOl8yLFwic2FwXCI6XzIsXCJzYXJsXCI6XzIsXCJzYXNcIjpfMixcInNhdmVcIjpfMixcInNheG9cIjpfMixcInNiaVwiOl8yLFwic2JzXCI6XzIsXCJzY2JcIjpfMixcInNjaGFlZmZsZXJcIjpfMixcInNjaG1pZHRcIjpfMixcInNjaG9sYXJzaGlwc1wiOl8yLFwic2Nob29sXCI6XzIsXCJzY2h1bGVcIjpfMixcInNjaHdhcnpcIjpfMixcInNjaWVuY2VcIjpfMixcInNjb3RcIjpbMSx7XCJnb3ZcIjpbMix7XCJzZXJ2aWNlXCI6XzN9XX1dLFwic2VhcmNoXCI6XzIsXCJzZWF0XCI6XzIsXCJzZWN1cmVcIjpfMixcInNlY3VyaXR5XCI6XzIsXCJzZWVrXCI6XzIsXCJzZWxlY3RcIjpfMixcInNlbmVyXCI6XzIsXCJzZXJ2aWNlc1wiOlsxLHtcImxvZ2lubGluZVwiOl8zfV0sXCJzZXZlblwiOl8yLFwic2V3XCI6XzIsXCJzZXhcIjpfMixcInNleHlcIjpfMixcInNmclwiOl8yLFwic2hhbmdyaWxhXCI6XzIsXCJzaGFycFwiOl8yLFwic2hlbGxcIjpfMixcInNoaWFcIjpfMixcInNoaWtzaGFcIjpfMixcInNob2VzXCI6XzIsXCJzaG9wXCI6WzEse1wiYmFzZVwiOl8zLFwiaG9wbGl4XCI6XzMsXCJiYXJzeVwiOl8zLFwiYmFyc3lvbmxpbmVcIjpfMyxcInNob3B3YXJlXCI6XzN9XSxcInNob3BwaW5nXCI6XzIsXCJzaG91amlcIjpfMixcInNob3dcIjpfMixcInNpbGtcIjpfMixcInNpbmFcIjpfMixcInNpbmdsZXNcIjpfMixcInNpdGVcIjpbMSx7XCJzcXVhcmVcIjpfMyxcImNhbnZhXCI6XzI0LFwiY2xvdWRlcmFcIjpfNixcImNvbnZleFwiOl8zLFwiY3lvblwiOl8zLFwiY2FmZmVpbmVcIjpfMyxcImZhc3R2cHNcIjpfMyxcImZpZ21hXCI6XzMsXCJwcmV2aWV3XCI6XzMsXCJoZXlmbG93XCI6XzMsXCJqZWxlXCI6XzMsXCJqb3V3d2ViXCI6XzMsXCJsb2dpbmxpbmVcIjpfMyxcImJhcnN5XCI6XzMsXCJub3Rpb25cIjpfMyxcIm9tbml3ZVwiOl8zLFwib3BlbnNvY2lhbFwiOl8zLFwibWFkZXRoaXNcIjpfMyxcInN1cHBvcnRcIjpfMyxcInBsYXRmb3Jtc2hcIjpfNixcInRzdFwiOl82LFwiYnllblwiOl8zLFwic3JodFwiOl8zLFwibm92ZWNvcmVcIjpfMyxcImNwYW5lbFwiOl8zLFwid3BzcXVhcmVkXCI6XzMsXCJzb3VyY2VjcmFmdFwiOl8zfV0sXCJza2lcIjpfMixcInNraW5cIjpfMixcInNreVwiOl8yLFwic2t5cGVcIjpfMixcInNsaW5nXCI6XzIsXCJzbWFydFwiOl8yLFwic21pbGVcIjpfMixcInNuY2ZcIjpfMixcInNvY2NlclwiOl8yLFwic29jaWFsXCI6XzIsXCJzb2Z0YmFua1wiOl8yLFwic29mdHdhcmVcIjpfMixcInNvaHVcIjpfMixcInNvbGFyXCI6XzIsXCJzb2x1dGlvbnNcIjpfMixcInNvbmdcIjpfMixcInNvbnlcIjpfMixcInNveVwiOl8yLFwic3BhXCI6XzIsXCJzcGFjZVwiOlsxLHtcIm15ZmFzdFwiOl8zLFwiaGVpeXVcIjpfMyxcImhmXCI6WzIse1wic3RhdGljXCI6XzN9XSxcImFwcC1pb25vc1wiOl8zLFwicHJvamVjdFwiOl8zLFwidWJlclwiOl8zLFwieHM0YWxsXCI6XzN9XSxcInNwb3J0XCI6XzIsXCJzcG90XCI6XzIsXCJzcmxcIjpfMixcInN0YWRhXCI6XzIsXCJzdGFwbGVzXCI6XzIsXCJzdGFyXCI6XzIsXCJzdGF0ZWJhbmtcIjpfMixcInN0YXRlZmFybVwiOl8yLFwic3RjXCI6XzIsXCJzdGNncm91cFwiOl8yLFwic3RvY2tob2xtXCI6XzIsXCJzdG9yYWdlXCI6XzIsXCJzdG9yZVwiOlsxLHtcImJhcnN5XCI6XzMsXCJzZWxsZnlcIjpfMyxcInNob3B3YXJlXCI6XzMsXCJzdG9yZWJhc2VcIjpfM31dLFwic3RyZWFtXCI6XzIsXCJzdHVkaW9cIjpfMixcInN0dWR5XCI6XzIsXCJzdHlsZVwiOl8yLFwic3Vja3NcIjpfMixcInN1cHBsaWVzXCI6XzIsXCJzdXBwbHlcIjpfMixcInN1cHBvcnRcIjpbMSx7XCJiYXJzeVwiOl8zfV0sXCJzdXJmXCI6XzIsXCJzdXJnZXJ5XCI6XzIsXCJzdXp1a2lcIjpfMixcInN3YXRjaFwiOl8yLFwic3dpc3NcIjpfMixcInN5ZG5leVwiOl8yLFwic3lzdGVtc1wiOlsxLHtcImtuaWdodHBvaW50XCI6XzN9XSxcInRhYlwiOl8yLFwidGFpcGVpXCI6XzIsXCJ0YWxrXCI6XzIsXCJ0YW9iYW9cIjpfMixcInRhcmdldFwiOl8yLFwidGF0YW1vdG9yc1wiOl8yLFwidGF0YXJcIjpfMixcInRhdHRvb1wiOl8yLFwidGF4XCI6XzIsXCJ0YXhpXCI6XzIsXCJ0Y2lcIjpfMixcInRka1wiOl8yLFwidGVhbVwiOlsxLHtcImRpc2NvdXJzZVwiOl8zLFwiamVsYXN0aWNcIjpfM31dLFwidGVjaFwiOlsxLHtcImNsZXZlcmFwcHNcIjpfM31dLFwidGVjaG5vbG9neVwiOl8yMSxcInRlbWFzZWtcIjpfMixcInRlbm5pc1wiOl8yLFwidGV2YVwiOl8yLFwidGhkXCI6XzIsXCJ0aGVhdGVyXCI6XzIsXCJ0aGVhdHJlXCI6XzIsXCJ0aWFhXCI6XzIsXCJ0aWNrZXRzXCI6XzIsXCJ0aWVuZGFcIjpfMixcInRpcHNcIjpfMixcInRpcmVzXCI6XzIsXCJ0aXJvbFwiOl8yLFwidGptYXh4XCI6XzIsXCJ0anhcIjpfMixcInRrbWF4eFwiOl8yLFwidG1hbGxcIjpfMixcInRvZGF5XCI6WzEse1wicHJlcXVhbGlmeW1lXCI6XzN9XSxcInRva3lvXCI6XzIsXCJ0b29sc1wiOlsxLHtcImFkZHJcIjpfNDksXCJteWFkZHJcIjpfM31dLFwidG9wXCI6WzEse1wibnRkbGxcIjpfMyxcIndhZGxcIjpfNn1dLFwidG9yYXlcIjpfMixcInRvc2hpYmFcIjpfMixcInRvdGFsXCI6XzIsXCJ0b3Vyc1wiOl8yLFwidG93blwiOl8yLFwidG95b3RhXCI6XzIsXCJ0b3lzXCI6XzIsXCJ0cmFkZVwiOl8yLFwidHJhZGluZ1wiOl8yLFwidHJhaW5pbmdcIjpfMixcInRyYXZlbFwiOl8yLFwidHJhdmVsZXJzXCI6XzIsXCJ0cmF2ZWxlcnNpbnN1cmFuY2VcIjpfMixcInRydXN0XCI6XzIsXCJ0cnZcIjpfMixcInR1YmVcIjpfMixcInR1aVwiOl8yLFwidHVuZXNcIjpfMixcInR1c2h1XCI6XzIsXCJ0dnNcIjpfMixcInViYW5rXCI6XzIsXCJ1YnNcIjpfMixcInVuaWNvbVwiOl8yLFwidW5pdmVyc2l0eVwiOl8yLFwidW5vXCI6XzIsXCJ1b2xcIjpfMixcInVwc1wiOl8yLFwidmFjYXRpb25zXCI6XzIsXCJ2YW5hXCI6XzIsXCJ2YW5ndWFyZFwiOl8yLFwidmVnYXNcIjpfMixcInZlbnR1cmVzXCI6XzIsXCJ2ZXJpc2lnblwiOl8yLFwidmVyc2ljaGVydW5nXCI6XzIsXCJ2ZXRcIjpfMixcInZpYWplc1wiOl8yLFwidmlkZW9cIjpfMixcInZpZ1wiOl8yLFwidmlraW5nXCI6XzIsXCJ2aWxsYXNcIjpfMixcInZpblwiOl8yLFwidmlwXCI6WzEse1wiaGlkbnNcIjpfM31dLFwidmlyZ2luXCI6XzIsXCJ2aXNhXCI6XzIsXCJ2aXNpb25cIjpfMixcInZpdmFcIjpfMixcInZpdm9cIjpfMixcInZsYWFuZGVyZW5cIjpfMixcInZvZGthXCI6XzIsXCJ2b2x2b1wiOl8yLFwidm90ZVwiOl8yLFwidm90aW5nXCI6XzIsXCJ2b3RvXCI6XzIsXCJ2b3lhZ2VcIjpfMixcIndhbGVzXCI6XzIsXCJ3YWxtYXJ0XCI6XzIsXCJ3YWx0ZXJcIjpfMixcIndhbmdcIjpfMixcIndhbmdnb3VcIjpfMixcIndhdGNoXCI6XzIsXCJ3YXRjaGVzXCI6XzIsXCJ3ZWF0aGVyXCI6XzIsXCJ3ZWF0aGVyY2hhbm5lbFwiOl8yLFwid2ViY2FtXCI6XzIsXCJ3ZWJlclwiOl8yLFwid2Vic2l0ZVwiOl82MSxcIndlZFwiOl8yLFwid2VkZGluZ1wiOl8yLFwid2VpYm9cIjpfMixcIndlaXJcIjpfMixcIndob3N3aG9cIjpfMixcIndpZW5cIjpfMixcIndpa2lcIjpfNjEsXCJ3aWxsaWFtaGlsbFwiOl8yLFwid2luXCI6XzIsXCJ3aW5kb3dzXCI6XzIsXCJ3aW5lXCI6XzIsXCJ3aW5uZXJzXCI6XzIsXCJ3bWVcIjpfMixcIndvbHRlcnNrbHV3ZXJcIjpfMixcIndvb2RzaWRlXCI6XzIsXCJ3b3JrXCI6XzIsXCJ3b3Jrc1wiOl8yLFwid29ybGRcIjpfMixcIndvd1wiOl8yLFwid3RjXCI6XzIsXCJ3dGZcIjpfMixcInhib3hcIjpfMixcInhlcm94XCI6XzIsXCJ4aWh1YW5cIjpfMixcInhpblwiOl8yLFwieG4tLTExYjRjM2RcIjpfMixcIlx1MDkxNVx1MDk0OVx1MDkyRVwiOl8yLFwieG4tLTFjazJlMWJcIjpfMixcIlx1MzBCQlx1MzBGQ1x1MzBFQlwiOl8yLFwieG4tLTFxcXcyM2FcIjpfMixcIlx1NEY1Qlx1NUM3MVwiOl8yLFwieG4tLTMwcnI3eVwiOl8yLFwiXHU2MTQ4XHU1NTg0XCI6XzIsXCJ4bi0tM2JzdDAwbVwiOl8yLFwiXHU5NkM2XHU1NkUyXCI6XzIsXCJ4bi0tM2RzNDQzZ1wiOl8yLFwiXHU1NzI4XHU3RUJGXCI6XzIsXCJ4bi0tM3B4dThrXCI6XzIsXCJcdTcwQjlcdTc3MEJcIjpfMixcInhuLS00MmMyZDlhXCI6XzIsXCJcdTBFMDRcdTBFMkRcdTBFMjFcIjpfMixcInhuLS00NXExMWNcIjpfMixcIlx1NTE2Qlx1NTM2NlwiOl8yLFwieG4tLTRnYnJpbVwiOl8yLFwiXHUwNjQ1XHUwNjQ4XHUwNjQyXHUwNjM5XCI6XzIsXCJ4bi0tNTVxdzQyZ1wiOl8yLFwiXHU1MTZDXHU3NkNBXCI6XzIsXCJ4bi0tNTVxeDVkXCI6XzIsXCJcdTUxNkNcdTUzRjhcIjpfMixcInhuLS01c3UzNGo5MzZiZ3NnXCI6XzIsXCJcdTk5OTlcdTY4M0NcdTkxQ0NcdTYyQzlcIjpfMixcInhuLS01dHptNWdcIjpfMixcIlx1N0Y1MVx1N0FEOVwiOl8yLFwieG4tLTZmcno4MmdcIjpfMixcIlx1NzlGQlx1NTJBOFwiOl8yLFwieG4tLTZxcTk4NmIzeGxcIjpfMixcIlx1NjIxMVx1NzIzMVx1NEY2MFwiOl8yLFwieG4tLTgwYWR4aGtzXCI6XzIsXCJcdTA0M0NcdTA0M0VcdTA0NDFcdTA0M0FcdTA0MzJcdTA0MzBcIjpfMixcInhuLS04MGFxZWNkcjFhXCI6XzIsXCJcdTA0M0FcdTA0MzBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0MzhcdTA0M0FcIjpfMixcInhuLS04MGFzZWhkYlwiOl8yLFwiXHUwNDNFXHUwNDNEXHUwNDNCXHUwNDMwXHUwNDM5XHUwNDNEXCI6XzIsXCJ4bi0tODBhc3dnXCI6XzIsXCJcdTA0NDFcdTA0MzBcdTA0MzlcdTA0NDJcIjpfMixcInhuLS04eTBhMDYzYVwiOl8yLFwiXHU4MDU0XHU5MDFBXCI6XzIsXCJ4bi0tOWRicTJhXCI6XzIsXCJcdTA1RTdcdTA1RDVcdTA1RERcIjpfMixcInhuLS05ZXQ1MnVcIjpfMixcIlx1NjVGNlx1NUMxQVwiOl8yLFwieG4tLTlrcnQwMGFcIjpfMixcIlx1NUZBRVx1NTM1QVwiOl8yLFwieG4tLWI0dzYwNWZlcmRcIjpfMixcIlx1NkRFMVx1OUE2Q1x1OTUyMVwiOl8yLFwieG4tLWJjazFiOWE1ZHJlNGNcIjpfMixcIlx1MzBENVx1MzBBMVx1MzBDM1x1MzBCN1x1MzBFN1x1MzBGM1wiOl8yLFwieG4tLWMxYXZnXCI6XzIsXCJcdTA0M0VcdTA0NDBcdTA0MzNcIjpfMixcInhuLS1jMmJyN2dcIjpfMixcIlx1MDkyOFx1MDk0N1x1MDkxRlwiOl8yLFwieG4tLWNjazJiM2JcIjpfMixcIlx1MzBCOVx1MzBDOFx1MzBBMlwiOl8yLFwieG4tLWNja3djeGV0ZFwiOl8yLFwiXHUzMEEyXHUzMERFXHUzMEJFXHUzMEYzXCI6XzIsXCJ4bi0tY2c0YmtpXCI6XzIsXCJcdUMwQkNcdUMxMzFcIjpfMixcInhuLS1jenI2OTRiXCI6XzIsXCJcdTU1NDZcdTY4MDdcIjpfMixcInhuLS1jenJzMHRcIjpfMixcIlx1NTU0Nlx1NUU5N1wiOl8yLFwieG4tLWN6cnUyZFwiOl8yLFwiXHU1NTQ2XHU1N0NFXCI6XzIsXCJ4bi0tZDFhY2ozYlwiOl8yLFwiXHUwNDM0XHUwNDM1XHUwNDQyXHUwNDM4XCI6XzIsXCJ4bi0tZWNrdmR0YzlkXCI6XzIsXCJcdTMwRERcdTMwQTRcdTMwRjNcdTMwQzhcIjpfMixcInhuLS1lZnZ5ODhoXCI6XzIsXCJcdTY1QjBcdTk1RkJcIjpfMixcInhuLS1mY3Q0MjlrXCI6XzIsXCJcdTVCQjZcdTk2RkJcIjpfMixcInhuLS1maGJlaVwiOl8yLFwiXHUwNjQzXHUwNjQ4XHUwNjQ1XCI6XzIsXCJ4bi0tZmlxMjI4YzVoc1wiOl8yLFwiXHU0RTJEXHU2NTg3XHU3RjUxXCI6XzIsXCJ4bi0tZmlxNjRiXCI6XzIsXCJcdTRFMkRcdTRGRTFcIjpfMixcInhuLS1manE3MjBhXCI6XzIsXCJcdTVBMzFcdTRFNTBcIjpfMixcInhuLS1mbHczNTFlXCI6XzIsXCJcdThDMzdcdTZCNENcIjpfMixcInhuLS1menlzOGQ2OXV2Z21cIjpfMixcIlx1OTZGQlx1OEEwQVx1NzZDOFx1NzlEMVwiOl8yLFwieG4tLWcyeHg0OGNcIjpfMixcIlx1OEQyRFx1NzI2OVwiOl8yLFwieG4tLWdja3IzZjBmXCI6XzIsXCJcdTMwQUZcdTMwRTlcdTMwQTZcdTMwQzlcIjpfMixcInhuLS1nazNhdDFlXCI6XzIsXCJcdTkwMUFcdThDQTlcIjpfMixcInhuLS1oeHQ4MTRlXCI6XzIsXCJcdTdGNTFcdTVFOTdcIjpfMixcInhuLS1pMWI2YjFhNmEyZVwiOl8yLFwiXHUwOTM4XHUwOTAyXHUwOTE3XHUwOTIwXHUwOTI4XCI6XzIsXCJ4bi0taW1yNTEzblwiOl8yLFwiXHU5OTEwXHU1Mzg1XCI6XzIsXCJ4bi0taW8wYTdpXCI6XzIsXCJcdTdGNTFcdTdFRENcIjpfMixcInhuLS1qMWFlZlwiOl8yLFwiXHUwNDNBXHUwNDNFXHUwNDNDXCI6XzIsXCJ4bi0tamxxNDgwbjJyZ1wiOl8yLFwiXHU0RTlBXHU5QTZDXHU5MDBBXCI6XzIsXCJ4bi0tanZyMTg5bVwiOl8yLFwiXHU5OERGXHU1NEMxXCI6XzIsXCJ4bi0ta2NyeDc3ZDF4NGFcIjpfMixcIlx1OThERVx1NTIyOVx1NkQ2NlwiOl8yLFwieG4tLWtwdXQzaVwiOl8yLFwiXHU2MjRCXHU2NzNBXCI6XzIsXCJ4bi0tbWdiYTNhM2VqdFwiOl8yLFwiXHUwNjI3XHUwNjMxXHUwNjI3XHUwNjQ1XHUwNjQzXHUwNjQ4XCI6XzIsXCJ4bi0tbWdiYTdjMGJibjBhXCI6XzIsXCJcdTA2MjdcdTA2NDRcdTA2MzlcdTA2NDRcdTA2NEFcdTA2MjdcdTA2NDZcIjpfMixcInhuLS1tZ2JhYjJiZFwiOl8yLFwiXHUwNjI4XHUwNjI3XHUwNjMyXHUwNjI3XHUwNjMxXCI6XzIsXCJ4bi0tbWdiY2E3ZHpkb1wiOl8yLFwiXHUwNjI3XHUwNjI4XHUwNjQ4XHUwNjM4XHUwNjI4XHUwNjRBXCI6XzIsXCJ4bi0tbWdiaTRlY2V4cFwiOl8yLFwiXHUwNjQzXHUwNjI3XHUwNjJCXHUwNjQ4XHUwNjQ0XHUwNjRBXHUwNjQzXCI6XzIsXCJ4bi0tbWdidDNkaGRcIjpfMixcIlx1MDY0N1x1MDY0NVx1MDYzMVx1MDYyN1x1MDY0N1wiOl8yLFwieG4tLW1rMWJ1NDRjXCI6XzIsXCJcdUIyRjdcdUNFRjRcIjpfMixcInhuLS1teHRxMW1cIjpfMixcIlx1NjUzRlx1NUU5Q1wiOl8yLFwieG4tLW5nYmM1YXpkXCI6XzIsXCJcdTA2MzRcdTA2MjhcdTA2NDNcdTA2MjlcIjpfMixcInhuLS1uZ2JlOWUwYVwiOl8yLFwiXHUwNjI4XHUwNjRBXHUwNjJBXHUwNjQzXCI6XzIsXCJ4bi0tbmdicnhcIjpfMixcIlx1MDYzOVx1MDYzMVx1MDYyOFwiOl8yLFwieG4tLW5xdjdmXCI6XzIsXCJcdTY3M0FcdTY3ODRcIjpfMixcInhuLS1ucXY3ZnMwMGVtYVwiOl8yLFwiXHU3RUM0XHU3RUM3XHU2NzNBXHU2Nzg0XCI6XzIsXCJ4bi0tbnlxeTI2YVwiOl8yLFwiXHU1MDY1XHU1RUI3XCI6XzIsXCJ4bi0tb3R1Nzk2ZFwiOl8yLFwiXHU2MkRCXHU4MDU4XCI6XzIsXCJ4bi0tcDFhY2ZcIjpbMSx7XCJ4bi0tOTBhbWNcIjpfMyxcInhuLS1qMWFlZlwiOl8zLFwieG4tLWoxYWVsOGJcIjpfMyxcInhuLS1oMWFoblwiOl8zLFwieG4tLWoxYWRwXCI6XzMsXCJ4bi0tYzFhdmdcIjpfMyxcInhuLS04MGFhYTBjdmFjXCI6XzMsXCJ4bi0taDFhbGl6XCI6XzMsXCJ4bi0tOTBhMWFmXCI6XzMsXCJ4bi0tNDFhXCI6XzN9XSxcIlx1MDQ0MFx1MDQ0M1x1MDQ0MVwiOlsxLHtcIlx1MDQzMVx1MDQzOFx1MDQzN1wiOl8zLFwiXHUwNDNBXHUwNDNFXHUwNDNDXCI6XzMsXCJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0M0NcIjpfMyxcIlx1MDQzQ1x1MDQzOFx1MDQ0MFwiOl8zLFwiXHUwNDNDXHUwNDQxXHUwNDNBXCI6XzMsXCJcdTA0M0VcdTA0NDBcdTA0MzNcIjpfMyxcIlx1MDQ0MVx1MDQzMFx1MDQzQ1x1MDQzMFx1MDQ0MFx1MDQzMFwiOl8zLFwiXHUwNDQxXHUwNDNFXHUwNDQ3XHUwNDM4XCI6XzMsXCJcdTA0NDFcdTA0M0ZcdTA0MzFcIjpfMyxcIlx1MDQ0RlwiOl8zfV0sXCJ4bi0tcHNzeTJ1XCI6XzIsXCJcdTU5MjdcdTYyRkZcIjpfMixcInhuLS1xOWp5YjRjXCI6XzIsXCJcdTMwN0ZcdTMwOTNcdTMwNkFcIjpfMixcInhuLS1xY2thMXBtY1wiOl8yLFwiXHUzMEIwXHUzMEZDXHUzMEIwXHUzMEVCXCI6XzIsXCJ4bi0tcmhxdjk2Z1wiOl8yLFwiXHU0RTE2XHU3NTRDXCI6XzIsXCJ4bi0tcm92dTg4YlwiOl8yLFwiXHU2NkY4XHU3QzREXCI6XzIsXCJ4bi0tc2VzNTU0Z1wiOl8yLFwiXHU3RjUxXHU1NzQwXCI6XzIsXCJ4bi0tdDYwYjU2YVwiOl8yLFwiXHVCMkY3XHVCMTM3XCI6XzIsXCJ4bi0tdGNrd2VcIjpfMixcIlx1MzBCM1x1MzBFMFwiOl8yLFwieG4tLXRpcTQ5eHF5alwiOl8yLFwiXHU1OTI5XHU0RTNCXHU2NTU5XCI6XzIsXCJ4bi0tdW51cDR5XCI6XzIsXCJcdTZFMzhcdTYyMEZcIjpfMixcInhuLS12ZXJtZ2Vuc2JlcmF0ZXItY3RiXCI6XzIsXCJ2ZXJtXHUwMEY2Z2Vuc2JlcmF0ZXJcIjpfMixcInhuLS12ZXJtZ2Vuc2JlcmF0dW5nLXB3YlwiOl8yLFwidmVybVx1MDBGNmdlbnNiZXJhdHVuZ1wiOl8yLFwieG4tLXZocXV2XCI6XzIsXCJcdTRGMDFcdTRFMUFcIjpfMixcInhuLS12dXE4NjFiXCI6XzIsXCJcdTRGRTFcdTYwNkZcIjpfMixcInhuLS13NHI4NWVsOGZodTVkbnJhXCI6XzIsXCJcdTU2MDlcdTkxQ0NcdTU5MjdcdTkxNTJcdTVFOTdcIjpfMixcInhuLS13NHJzNDBsXCI6XzIsXCJcdTU2MDlcdTkxQ0NcIjpfMixcInhuLS14aHE1MjFiXCI6XzIsXCJcdTVFN0ZcdTRFMUNcIjpfMixcInhuLS16ZnIxNjRiXCI6XzIsXCJcdTY1M0ZcdTUyQTFcIjpfMixcInh5elwiOlsxLHtcImJvdGRhc2hcIjpfMyxcInRlbGViaXRcIjpfNn1dLFwieWFjaHRzXCI6XzIsXCJ5YWhvb1wiOl8yLFwieWFtYXh1blwiOl8yLFwieWFuZGV4XCI6XzIsXCJ5b2RvYmFzaGlcIjpfMixcInlvZ2FcIjpfMixcInlva29oYW1hXCI6XzIsXCJ5b3VcIjpfMixcInlvdXR1YmVcIjpfMixcInl1blwiOl8yLFwiemFwcG9zXCI6XzIsXCJ6YXJhXCI6XzIsXCJ6ZXJvXCI6XzIsXCJ6aXBcIjpfMixcInpvbmVcIjpbMSx7XCJ0cml0b25cIjpfNixcInN0YWNraXRcIjpfMyxcImxpbWFcIjpfM31dLFwienVlcmljaFwiOl8yfV07XG4gIHJldHVybiBydWxlcztcbn0pKCk7XG4iLCAiaW1wb3J0IHtcbiAgZmFzdFBhdGhMb29rdXAsXG4gIElQdWJsaWNTdWZmaXgsXG4gIElTdWZmaXhMb29rdXBPcHRpb25zLFxufSBmcm9tICd0bGR0cy1jb3JlJztcbmltcG9ydCB7IGV4Y2VwdGlvbnMsIElUcmllLCBydWxlcyB9IGZyb20gJy4vZGF0YS90cmllJztcblxuLy8gRmxhZ3MgdXNlZCB0byBrbm93IGlmIGEgcnVsZSBpcyBJQ0FOTiBvciBQcml2YXRlXG5jb25zdCBlbnVtIFJVTEVfVFlQRSB7XG4gIElDQU5OID0gMSxcbiAgUFJJVkFURSA9IDIsXG59XG5cbmludGVyZmFjZSBJTWF0Y2gge1xuICBpbmRleDogbnVtYmVyO1xuICBpc0ljYW5uOiBib29sZWFuO1xuICBpc1ByaXZhdGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTG9va3VwIHBhcnRzIG9mIGRvbWFpbiBpbiBUcmllXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cEluVHJpZShcbiAgcGFydHM6IHN0cmluZ1tdLFxuICB0cmllOiBJVHJpZSxcbiAgaW5kZXg6IG51bWJlcixcbiAgYWxsb3dlZE1hc2s6IG51bWJlcixcbik6IElNYXRjaCB8IG51bGwge1xuICBsZXQgcmVzdWx0OiBJTWF0Y2ggfCBudWxsID0gbnVsbDtcbiAgbGV0IG5vZGU6IElUcmllIHwgdW5kZWZpbmVkID0gdHJpZTtcbiAgd2hpbGUgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFdlIGhhdmUgYSBtYXRjaCFcbiAgICBpZiAoKG5vZGVbMF0gJiBhbGxvd2VkTWFzaykgIT09IDApIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgaXNJY2Fubjogbm9kZVswXSA9PT0gUlVMRV9UWVBFLklDQU5OLFxuICAgICAgICBpc1ByaXZhdGU6IG5vZGVbMF0gPT09IFJVTEVfVFlQRS5QUklWQVRFLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBObyBtb3JlIGBwYXJ0c2AgdG8gbG9vayBmb3JcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBzdWNjOiB7IFtsYWJlbDogc3RyaW5nXTogSVRyaWUgfSA9IG5vZGVbMV07XG4gICAgbm9kZSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdWNjLCBwYXJ0c1tpbmRleF0hKVxuICAgICAgPyBzdWNjW3BhcnRzW2luZGV4XSFdXG4gICAgICA6IHN1Y2NbJyonXTtcbiAgICBpbmRleCAtPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgaG9zdG5hbWVgIGhhcyBhIHZhbGlkIHB1YmxpYyBzdWZmaXggaW4gYHRyaWVgLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWZmaXhMb29rdXAoXG4gIGhvc3RuYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IElTdWZmaXhMb29rdXBPcHRpb25zLFxuICBvdXQ6IElQdWJsaWNTdWZmaXgsXG4pOiB2b2lkIHtcbiAgaWYgKGZhc3RQYXRoTG9va3VwKGhvc3RuYW1lLCBvcHRpb25zLCBvdXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaG9zdG5hbWVQYXJ0cyA9IGhvc3RuYW1lLnNwbGl0KCcuJyk7XG5cbiAgY29uc3QgYWxsb3dlZE1hc2sgPVxuICAgIChvcHRpb25zLmFsbG93UHJpdmF0ZURvbWFpbnMgPyBSVUxFX1RZUEUuUFJJVkFURSA6IDApIHxcbiAgICAob3B0aW9ucy5hbGxvd0ljYW5uRG9tYWlucyA/IFJVTEVfVFlQRS5JQ0FOTiA6IDApO1xuXG4gIC8vIExvb2sgZm9yIGV4Y2VwdGlvbnNcbiAgY29uc3QgZXhjZXB0aW9uTWF0Y2ggPSBsb29rdXBJblRyaWUoXG4gICAgaG9zdG5hbWVQYXJ0cyxcbiAgICBleGNlcHRpb25zLFxuICAgIGhvc3RuYW1lUGFydHMubGVuZ3RoIC0gMSxcbiAgICBhbGxvd2VkTWFzayxcbiAgKTtcblxuICBpZiAoZXhjZXB0aW9uTWF0Y2ggIT09IG51bGwpIHtcbiAgICBvdXQuaXNJY2FubiA9IGV4Y2VwdGlvbk1hdGNoLmlzSWNhbm47XG4gICAgb3V0LmlzUHJpdmF0ZSA9IGV4Y2VwdGlvbk1hdGNoLmlzUHJpdmF0ZTtcbiAgICBvdXQucHVibGljU3VmZml4ID0gaG9zdG5hbWVQYXJ0cy5zbGljZShleGNlcHRpb25NYXRjaC5pbmRleCArIDEpLmpvaW4oJy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBMb29rIGZvciBhIG1hdGNoIGluIHJ1bGVzXG4gIGNvbnN0IHJ1bGVzTWF0Y2ggPSBsb29rdXBJblRyaWUoXG4gICAgaG9zdG5hbWVQYXJ0cyxcbiAgICBydWxlcyxcbiAgICBob3N0bmFtZVBhcnRzLmxlbmd0aCAtIDEsXG4gICAgYWxsb3dlZE1hc2ssXG4gICk7XG5cbiAgaWYgKHJ1bGVzTWF0Y2ggIT09IG51bGwpIHtcbiAgICBvdXQuaXNJY2FubiA9IHJ1bGVzTWF0Y2guaXNJY2FubjtcbiAgICBvdXQuaXNQcml2YXRlID0gcnVsZXNNYXRjaC5pc1ByaXZhdGU7XG4gICAgb3V0LnB1YmxpY1N1ZmZpeCA9IGhvc3RuYW1lUGFydHMuc2xpY2UocnVsZXNNYXRjaC5pbmRleCkuam9pbignLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIE5vIG1hdGNoIGZvdW5kLi4uXG4gIC8vIFByZXZhaWxpbmcgcnVsZSBpcyAnKicgc28gd2UgY29uc2lkZXIgdGhlIHRvcC1sZXZlbCBkb21haW4gdG8gYmUgdGhlXG4gIC8vIHB1YmxpYyBzdWZmaXggb2YgYGhvc3RuYW1lYCAoZS5nLjogJ2V4YW1wbGUub3JnJyA9PiAnb3JnJykuXG4gIG91dC5pc0ljYW5uID0gZmFsc2U7XG4gIG91dC5pc1ByaXZhdGUgPSBmYWxzZTtcbiAgb3V0LnB1YmxpY1N1ZmZpeCA9IGhvc3RuYW1lUGFydHNbaG9zdG5hbWVQYXJ0cy5sZW5ndGggLSAxXSA/PyBudWxsO1xufVxuIiwgImltcG9ydCB7XG4gIEZMQUcsXG4gIGdldEVtcHR5UmVzdWx0LFxuICBJT3B0aW9ucyxcbiAgSVJlc3VsdCxcbiAgcGFyc2VJbXBsLFxuICByZXNldFJlc3VsdCxcbn0gZnJvbSAndGxkdHMtY29yZSc7XG5cbmltcG9ydCBzdWZmaXhMb29rdXAgZnJvbSAnLi9zcmMvc3VmZml4LXRyaWUnO1xuXG4vLyBGb3IgYWxsIG1ldGhvZHMgYnV0ICdwYXJzZScsIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gYWxsb2NhdGUgYW4gb2JqZWN0XG4vLyBldmVyeSBzaW5nbGUgdGltZSB0byBvbmx5IHJldHVybiB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBhdHRyaWJ1dGUuIFRvIGF2b2lkXG4vLyB0aGlzIHVuLW5lY2Vzc2FyeSBhbGxvY2F0aW9uLCB3ZSB1c2UgYSBnbG9iYWwgb2JqZWN0IHdoaWNoIGlzIHJlLXVzZWQuXG5jb25zdCBSRVNVTFQ6IElSZXN1bHQgPSBnZXRFbXB0eVJlc3VsdCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UodXJsOiBzdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8SU9wdGlvbnM+ID0ge30pOiBJUmVzdWx0IHtcbiAgcmV0dXJuIHBhcnNlSW1wbCh1cmwsIEZMQUcuQUxMLCBzdWZmaXhMb29rdXAsIG9wdGlvbnMsIGdldEVtcHR5UmVzdWx0KCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9zdG5hbWUoXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBQYXJ0aWFsPElPcHRpb25zPiA9IHt9LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8qQF9fSU5MSU5FX18qLyByZXNldFJlc3VsdChSRVNVTFQpO1xuICByZXR1cm4gcGFyc2VJbXBsKHVybCwgRkxBRy5IT1NUTkFNRSwgc3VmZml4TG9va3VwLCBvcHRpb25zLCBSRVNVTFQpLmhvc3RuYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHVibGljU3VmZml4KFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUGFydGlhbDxJT3B0aW9ucz4gPSB7fSxcbik6IHN0cmluZyB8IG51bGwge1xuICAvKkBfX0lOTElORV9fKi8gcmVzZXRSZXN1bHQoUkVTVUxUKTtcbiAgcmV0dXJuIHBhcnNlSW1wbCh1cmwsIEZMQUcuUFVCTElDX1NVRkZJWCwgc3VmZml4TG9va3VwLCBvcHRpb25zLCBSRVNVTFQpXG4gICAgLnB1YmxpY1N1ZmZpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERvbWFpbihcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFBhcnRpYWw8SU9wdGlvbnM+ID0ge30sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgLypAX19JTkxJTkVfXyovIHJlc2V0UmVzdWx0KFJFU1VMVCk7XG4gIHJldHVybiBwYXJzZUltcGwodXJsLCBGTEFHLkRPTUFJTiwgc3VmZml4TG9va3VwLCBvcHRpb25zLCBSRVNVTFQpLmRvbWFpbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN1YmRvbWFpbihcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFBhcnRpYWw8SU9wdGlvbnM+ID0ge30sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgLypAX19JTkxJTkVfXyovIHJlc2V0UmVzdWx0KFJFU1VMVCk7XG4gIHJldHVybiBwYXJzZUltcGwodXJsLCBGTEFHLlNVQl9ET01BSU4sIHN1ZmZpeExvb2t1cCwgb3B0aW9ucywgUkVTVUxUKVxuICAgIC5zdWJkb21haW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5XaXRob3V0U3VmZml4KFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUGFydGlhbDxJT3B0aW9ucz4gPSB7fSxcbik6IHN0cmluZyB8IG51bGwge1xuICAvKkBfX0lOTElORV9fKi8gcmVzZXRSZXN1bHQoUkVTVUxUKTtcbiAgcmV0dXJuIHBhcnNlSW1wbCh1cmwsIEZMQUcuQUxMLCBzdWZmaXhMb29rdXAsIG9wdGlvbnMsIFJFU1VMVClcbiAgICAuZG9tYWluV2l0aG91dFN1ZmZpeDtcbn1cbiIsICIvKipcbiAqIEFuc3dlcnMgXCJkb2VzIHRoZSByZXF1ZXN0LXBhdGggcGF0aC1tYXRjaCBhIGdpdmVuIGNvb2tpZS1wYXRoP1wiIGFzIHBlciB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMS40IHwgUkZDNjI2NSBTZWN0aW9uIDUuMS40fS5cbiAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBwcmVmaXgtbWF0Y2ggd2hlcmUgY29va2llUGF0aCBpcyBhIHByZWZpeCBvZiByZXFQYXRoLlxuICpcbiAqIEByZW1hcmtzXG4gKiBBIHJlcXVlc3QtcGF0aCBwYXRoLW1hdGNoZXMgYSBnaXZlbiBjb29raWUtcGF0aCBpZiBhdCBsZWFzdCBvbmUgb2ZcbiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkczpcbiAqXG4gKiAtIFRoZSBjb29raWUtcGF0aCBhbmQgdGhlIHJlcXVlc3QtcGF0aCBhcmUgaWRlbnRpY2FsLlxuICogLSBUaGUgY29va2llLXBhdGggaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QtcGF0aCwgYW5kIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgY29va2llLXBhdGggaXMgJXgyRiAoXCIvXCIpLlxuICogLSBUaGUgY29va2llLXBhdGggaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QtcGF0aCwgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHJlcXVlc3QtcGF0aCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY29va2llLXBhdGggaXMgYSAleDJGIChcIi9cIikgY2hhcmFjdGVyLlxuICpcbiAqIEBwYXJhbSByZXFQYXRoIC0gdGhlIHBhdGggb2YgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSBjb29raWVQYXRoIC0gdGhlIHBhdGggb2YgdGhlIGNvb2tpZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aE1hdGNoKHJlcVBhdGg6IHN0cmluZywgY29va2llUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFwibyAgVGhlIGNvb2tpZS1wYXRoIGFuZCB0aGUgcmVxdWVzdC1wYXRoIGFyZSBpZGVudGljYWwuXCJcbiAgaWYgKGNvb2tpZVBhdGggPT09IHJlcVBhdGgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgaWR4ID0gcmVxUGF0aC5pbmRleE9mKGNvb2tpZVBhdGgpXG4gIGlmIChpZHggPT09IDApIHtcbiAgICAvLyBcIm8gIFRoZSBjb29raWUtcGF0aCBpcyBhIHByZWZpeCBvZiB0aGUgcmVxdWVzdC1wYXRoLCBhbmQgdGhlIGxhc3RcbiAgICAvLyBjaGFyYWN0ZXIgb2YgdGhlIGNvb2tpZS1wYXRoIGlzICV4MkYgKFwiL1wiKS5cIlxuICAgIGlmIChjb29raWVQYXRoW2Nvb2tpZVBhdGgubGVuZ3RoIC0gMV0gPT09ICcvJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBcIiBvICBUaGUgY29va2llLXBhdGggaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QtcGF0aCwgYW5kIHRoZSBmaXJzdFxuICAgIC8vIGNoYXJhY3RlciBvZiB0aGUgcmVxdWVzdC1wYXRoIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjb29raWUtIHBhdGhcbiAgICAvLyBpcyBhICV4MkYgKFwiL1wiKSBjaGFyYWN0ZXIuXCJcbiAgICBpZiAocmVxUGF0aC5zdGFydHNXaXRoKGNvb2tpZVBhdGgpICYmIHJlcVBhdGhbY29va2llUGF0aC5sZW5ndGhdID09PSAnLycpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiaW1wb3J0IHsgZ2V0RG9tYWluIH0gZnJvbSAndGxkdHMnXG5cbi8vIFJGQyA2NzYxXG5jb25zdCBTUEVDSUFMX1VTRV9ET01BSU5TID0gWydsb2NhbCcsICdleGFtcGxlJywgJ2ludmFsaWQnLCAnbG9jYWxob3N0JywgJ3Rlc3QnXVxuXG5jb25zdCBTUEVDSUFMX1RSRUFUTUVOVF9ET01BSU5TID0gWydsb2NhbGhvc3QnLCAnaW52YWxpZCddXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgaG93IHtAbGluayBnZXRQdWJsaWNTdWZmaXh9IGJlaGF2ZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UHVibGljU3VmZml4T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gYHRydWVgIHRoZW4gdGhlIGZvbGxvd2luZyB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY3NjEuaHRtbCB8IFNwZWNpYWwgVXNlIERvbWFpbnN9IHdpbGxcbiAgICogYmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgdmFsaWQgcHVibGljIHN1ZmZpeGVzICgnbG9jYWwnLCAnZXhhbXBsZScsICdpbnZhbGlkJywgJ2xvY2FsaG9zdCcsICd0ZXN0JykuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEluIHRlc3Rpbmcgc2NlbmFyaW9zIGl0J3MgY29tbW9uIHRvIGNvbmZpZ3VyZSB0aGUgY29va2llIHN0b3JlIHdpdGggc28gdGhhdCBgaHR0cDovL2xvY2FsaG9zdGAgY2FuIGJlIHVzZWQgYXMgYSBkb21haW46XG4gICAqIGBgYGpzb25cbiAgICoge1xuICAgKiAgIGFsbG93U3BlY2lhbFVzZURvbWFpbjogdHJ1ZSxcbiAgICogICByZWplY3RQdWJsaWNTdWZmaXhlczogZmFsc2VcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgYWxsb3dTcGVjaWFsVXNlRG9tYWluPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCB0aGVuIGFueSBlcnJvcnMgdGhhdCBvY2N1ciB3aGlsZSBleGVjdXRpbmcge0BsaW5rIGdldFB1YmxpY1N1ZmZpeH0gd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGZhbHNlXG4gICAqL1xuICBpZ25vcmVFcnJvcj86IGJvb2xlYW4gfCB1bmRlZmluZWRcbn1cblxuY29uc3QgZGVmYXVsdEdldFB1YmxpY1N1ZmZpeE9wdGlvbnM6IEdldFB1YmxpY1N1ZmZpeE9wdGlvbnMgPSB7XG4gIGFsbG93U3BlY2lhbFVzZURvbWFpbjogZmFsc2UsXG4gIGlnbm9yZUVycm9yOiBmYWxzZSxcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwdWJsaWMgc3VmZml4IG9mIHRoaXMgaG9zdG5hbWUuIFRoZSBwdWJsaWMgc3VmZml4IGlzIHRoZSBzaG9ydGVzdCBkb21haW5cbiAqIG5hbWUgdXBvbiB3aGljaCBhIGNvb2tpZSBjYW4gYmUgc2V0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBBIFwicHVibGljIHN1ZmZpeFwiIGlzIGEgZG9tYWluIHRoYXQgaXMgY29udHJvbGxlZCBieSBhXG4gKiBwdWJsaWMgcmVnaXN0cnksIHN1Y2ggYXMgXCJjb21cIiwgXCJjby51a1wiLCBhbmQgXCJwdnQuazEyLnd5LnVzXCIuXG4gKiBUaGlzIHN0ZXAgaXMgZXNzZW50aWFsIGZvciBwcmV2ZW50aW5nIGF0dGFja2VyLmNvbSBmcm9tXG4gKiBkaXNydXB0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgZXhhbXBsZS5jb20gYnkgc2V0dGluZyBhIGNvb2tpZVxuICogd2l0aCBhIERvbWFpbiBhdHRyaWJ1dGUgb2YgXCJjb21cIi4gIFVuZm9ydHVuYXRlbHksIHRoZSBzZXQgb2ZcbiAqIHB1YmxpYyBzdWZmaXhlcyAoYWxzbyBrbm93biBhcyBcInJlZ2lzdHJ5IGNvbnRyb2xsZWQgZG9tYWluc1wiKVxuICogY2hhbmdlcyBvdmVyIHRpbWUuICBJZiBmZWFzaWJsZSwgdXNlciBhZ2VudHMgU0hPVUxEIHVzZSBhblxuICogdXAtdG8tZGF0ZSBwdWJsaWMgc3VmZml4IGxpc3QsIHN1Y2ggYXMgdGhlIG9uZSBtYWludGFpbmVkIGJ5XG4gKiB0aGUgTW96aWxsYSBwcm9qZWN0IGF0IGh0dHA6Ly9wdWJsaWNzdWZmaXgub3JnLy5cbiAqIChTZWUge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwjc2VjdGlvbi01LjMgfCBSRkM2MjY1IC0gU2VjdGlvbiA1LjN9KVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGdldFB1YmxpY1N1ZmZpeCgnd3d3LmV4YW1wbGUuY29tJykgPT09ICdleGFtcGxlLmNvbSdcbiAqIGdldFB1YmxpY1N1ZmZpeCgnd3d3LnN1YmRvbWFpbi5leGFtcGxlLmNvbScpID09PSAnZXhhbXBsZS5jb20nXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZG9tYWluIC0gdGhlIGRvbWFpbiBhdHRyaWJ1dGUgb2YgYSBjb29raWVcbiAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgY29udHJvbGxpbmcgaG93IHRoZSBwdWJsaWMgc3VmZml4IGlzIGRldGVybWluZWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFB1YmxpY1N1ZmZpeChcbiAgZG9tYWluOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdldFB1YmxpY1N1ZmZpeE9wdGlvbnMgPSB7fSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRHZXRQdWJsaWNTdWZmaXhPcHRpb25zLCAuLi5vcHRpb25zIH1cbiAgY29uc3QgZG9tYWluUGFydHMgPSBkb21haW4uc3BsaXQoJy4nKVxuICBjb25zdCB0b3BMZXZlbERvbWFpbiA9IGRvbWFpblBhcnRzW2RvbWFpblBhcnRzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IGFsbG93U3BlY2lhbFVzZURvbWFpbiA9ICEhb3B0aW9ucy5hbGxvd1NwZWNpYWxVc2VEb21haW5cbiAgY29uc3QgaWdub3JlRXJyb3IgPSAhIW9wdGlvbnMuaWdub3JlRXJyb3JcblxuICBpZiAoXG4gICAgYWxsb3dTcGVjaWFsVXNlRG9tYWluICYmXG4gICAgdG9wTGV2ZWxEb21haW4gIT09IHVuZGVmaW5lZCAmJlxuICAgIFNQRUNJQUxfVVNFX0RPTUFJTlMuaW5jbHVkZXModG9wTGV2ZWxEb21haW4pXG4gICkge1xuICAgIGlmIChkb21haW5QYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgY29uc3Qgc2Vjb25kTGV2ZWxEb21haW4gPSBkb21haW5QYXJ0c1tkb21haW5QYXJ0cy5sZW5ndGggLSAyXSFcbiAgICAgIC8vIEluIGFmb3JlbWVudGlvbmVkIGV4YW1wbGUsIHRoZSBlVExEL3B1YlN1ZiB3aWxsIGJlIGFwcGxlLmxvY2FsaG9zdFxuICAgICAgcmV0dXJuIGAke3NlY29uZExldmVsRG9tYWlufS4ke3RvcExldmVsRG9tYWlufWBcbiAgICB9IGVsc2UgaWYgKFNQRUNJQUxfVFJFQVRNRU5UX0RPTUFJTlMuaW5jbHVkZXModG9wTGV2ZWxEb21haW4pKSB7XG4gICAgICAvLyBGb3IgYSBzaW5nbGUgd29yZCBzcGVjaWFsIHVzZSBkb21haW4sIGUuZy4gJ2xvY2FsaG9zdCcgb3IgJ2ludmFsaWQnLCBwZXIgUkZDIDY3NjEsXG4gICAgICAvLyBcIkFwcGxpY2F0aW9uIHNvZnR3YXJlIE1BWSByZWNvZ25pemUge2xvY2FsaG9zdC9pbnZhbGlkfSBuYW1lcyBhcyBzcGVjaWFsLCBvclxuICAgICAgLy8gTUFZIHBhc3MgdGhlbSB0byBuYW1lIHJlc29sdXRpb24gQVBJcyBhcyB0aGV5IHdvdWxkIGZvciBvdGhlciBkb21haW4gbmFtZXMuXCJcbiAgICAgIHJldHVybiB0b3BMZXZlbERvbWFpblxuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICAhaWdub3JlRXJyb3IgJiZcbiAgICB0b3BMZXZlbERvbWFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgU1BFQ0lBTF9VU0VfRE9NQUlOUy5pbmNsdWRlcyh0b3BMZXZlbERvbWFpbilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvb2tpZSBoYXMgZG9tYWluIHNldCB0byB0aGUgcHVibGljIHN1ZmZpeCBcIiR7dG9wTGV2ZWxEb21haW59XCIgd2hpY2ggaXMgYSBzcGVjaWFsIHVzZSBkb21haW4uIFRvIGFsbG93IHRoaXMsIGNvbmZpZ3VyZSB5b3VyIENvb2tpZUphciB3aXRoIHthbGxvd1NwZWNpYWxVc2VEb21haW46IHRydWUsIHJlamVjdFB1YmxpY1N1ZmZpeGVzOiBmYWxzZX0uYCxcbiAgICApXG4gIH1cblxuICBjb25zdCBwdWJsaWNTdWZmaXggPSBnZXREb21haW4oZG9tYWluLCB7XG4gICAgYWxsb3dJY2FubkRvbWFpbnM6IHRydWUsXG4gICAgYWxsb3dQcml2YXRlRG9tYWluczogdHJ1ZSxcbiAgfSlcbiAgaWYgKHB1YmxpY1N1ZmZpeCkgcmV0dXJuIHB1YmxpY1N1ZmZpeFxufVxuIiwgImltcG9ydCB7IGdldFB1YmxpY1N1ZmZpeCB9IGZyb20gJy4vZ2V0UHVibGljU3VmZml4LmpzJ1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgcGVybXV0YXRpb24gb2YgYWxsIHBvc3NpYmxlIHZhbHVlcyB0aGF0IHtAbGluayBkb21haW5NYXRjaH0gdGhlIGdpdmVuIGBkb21haW5gIHBhcmFtZXRlci4gVGhlXG4gKiBhcnJheSBpcyBpbiBzaG9ydGVzdC10by1sb25nZXN0IG9yZGVyLiBVc2VmdWwgd2hlbiBidWlsZGluZyBjdXN0b20ge0BsaW5rIFN0b3JlfSBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogcGVybXV0ZURvbWFpbignZm9vLmJhci5leGFtcGxlLmNvbScpXG4gKiAvLyBbJ2V4YW1wbGUuY29tJywgJ2Jhci5leGFtcGxlLmNvbScsICdmb28uYmFyLmV4YW1wbGUuY29tJ11cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBkb21haW4gLSB0aGUgZG9tYWluIHRvIGdlbmVyYXRlIHBlcm11dGF0aW9ucyBmb3JcbiAqIEBwYXJhbSBhbGxvd1NwZWNpYWxVc2VEb21haW4gLSBmbGFnIHRvIGNvbnRyb2wgaWYge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NzYxLmh0bWwgfCBTcGVjaWFsIFVzZSBEb21haW5zfSBzdWNoIGFzIGBsb2NhbGhvc3RgIHNob3VsZCBiZSBhbGxvd2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtdXRlRG9tYWluKFxuICBkb21haW46IHN0cmluZyxcbiAgYWxsb3dTcGVjaWFsVXNlRG9tYWluPzogYm9vbGVhbixcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHViU3VmID0gZ2V0UHVibGljU3VmZml4KGRvbWFpbiwge1xuICAgIGFsbG93U3BlY2lhbFVzZURvbWFpbjogYWxsb3dTcGVjaWFsVXNlRG9tYWluLFxuICB9KVxuXG4gIGlmICghcHViU3VmKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIGlmIChwdWJTdWYgPT0gZG9tYWluKSB7XG4gICAgcmV0dXJuIFtkb21haW5dXG4gIH1cblxuICAvLyBOdWtlIHRyYWlsaW5nIGRvdFxuICBpZiAoZG9tYWluLnNsaWNlKC0xKSA9PSAnLicpIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoMCwgLTEpXG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBkb21haW4uc2xpY2UoMCwgLShwdWJTdWYubGVuZ3RoICsgMSkpIC8vIFwiLmV4YW1wbGUuY29tXCJcbiAgY29uc3QgcGFydHMgPSBwcmVmaXguc3BsaXQoJy4nKS5yZXZlcnNlKClcbiAgbGV0IGN1ciA9IHB1YlN1ZlxuICBjb25zdCBwZXJtdXRhdGlvbnMgPSBbY3VyXVxuICB3aGlsZSAocGFydHMubGVuZ3RoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICBjb25zdCBwYXJ0ID0gcGFydHMuc2hpZnQoKSFcbiAgICBjdXIgPSBgJHtwYXJ0fS4ke2N1cn1gXG4gICAgcGVybXV0YXRpb25zLnB1c2goY3VyKVxuICB9XG4gIHJldHVybiBwZXJtdXRhdGlvbnNcbn1cbiIsICIvLyBkaXNhYmxpbmcgdGhpcyBsaW50IG9uIHRoaXMgd2hvbGUgZmlsZSBiZWNhdXNlIFN0b3JlIHNob3VsZCBiZSBhYnN0cmFjdFxuLy8gYnV0IHdlIGhhdmUgaW1wbGVtZW50YXRpb25zIGluIHRoZSB3aWxkIHRoYXQgbWF5IG5vdCBpbXBsZW1lbnQgYWxsIGZlYXR1cmVzXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cblxuaW1wb3J0IHR5cGUgeyBDb29raWUgfSBmcm9tICcuL2Nvb2tpZS9pbmRleC5qcydcbmltcG9ydCB0eXBlIHsgQ2FsbGJhY2ssIEVycm9yQ2FsbGJhY2ssIE51bGxhYmxlIH0gZnJvbSAnLi91dGlscy5qcydcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciB7QGxpbmsgQ29va2llSmFyfSBzdG9yZXMuXG4gKlxuICogVGhlIHN0b3JhZ2UgbW9kZWwgZm9yIGVhY2gge0BsaW5rIENvb2tpZUphcn0gaW5zdGFuY2UgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzXG4gKiB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9LlxuICpcbiAqIEByZW1hcmtzXG4gKiAtIFN0b3JlcyBzaG91bGQgaW5oZXJpdCBmcm9tIHRoZSBiYXNlIFN0b3JlIGNsYXNzLCB3aGljaCBpcyBhdmFpbGFibGUgYXMgYSB0b3AtbGV2ZWwgZXhwb3J0LlxuICpcbiAqIC0gU3RvcmVzIGFyZSBhc3luY2hyb25vdXMgYnkgZGVmYXVsdCwgYnV0IGlmIHtAbGluayBTdG9yZS5zeW5jaHJvbm91c30gaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhlIGAqU3luY2AgbWV0aG9kc1xuICogICAgIG9mIHRoZSBjb250YWluaW5nIHtAbGluayBDb29raWVKYXJ9IGNhbiBiZSB1c2VkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0b3JlIHtcbiAgLyoqXG4gICAqIFN0b3JlIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgc3luY2hyb25vdXMgbWV0aG9kcyBtdXN0IHJldHVybiBgdHJ1ZWAuXG4gICAqL1xuICBzeW5jaHJvbm91czogYm9vbGVhblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3luY2hyb25vdXMgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEge0BsaW5rIENvb2tpZX0gd2l0aCB0aGUgZ2l2ZW4gYGRvbWFpbmAsIGBwYXRoYCwgYW5kIGBrZXlgIChgbmFtZWApLiBUaGUgUkZDIG1haW50YWlucyB0aGF0IGV4YWN0bHlcbiAgICogb25lIG9mIHRoZXNlIGNvb2tpZXMgc2hvdWxkIGV4aXN0IGluIGEgc3RvcmUuIElmIHRoZSBzdG9yZSBpcyB1c2luZyB2ZXJzaW9uaW5nLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGxhdGVzdCBvclxuICAgKiBuZXdlc3Qgc3VjaCBjb29raWUgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKlxuICAgKiBDYWxsYmFjayB0YWtlcyBhbiBlcnJvciBhbmQgdGhlIHJlc3VsdGluZyBDb29raWUgb2JqZWN0LiBJZiBubyBjb29raWUgaXMgZm91bmQgdGhlbiBudWxsIE1VU1QgYmUgcGFzc2VkIGluc3RlYWQgKHRoYXQgaXMsIG5vdCBhbiBlcnJvcikuXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGNvb2tpZSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqL1xuICBmaW5kQ29va2llKFxuICAgIGRvbWFpbjogTnVsbGFibGU8c3RyaW5nPixcbiAgICBwYXRoOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIGtleTogTnVsbGFibGU8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxDb29raWUgfCB1bmRlZmluZWQ+XG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIHtAbGluayBDb29raWV9IHdpdGggdGhlIGdpdmVuIGBkb21haW5gLCBgcGF0aGAsIGFuZCBga2V5YCAoYG5hbWVgKS4gVGhlIFJGQyBtYWludGFpbnMgdGhhdCBleGFjdGx5XG4gICAqIG9uZSBvZiB0aGVzZSBjb29raWVzIHNob3VsZCBleGlzdCBpbiBhIHN0b3JlLiBJZiB0aGUgc3RvcmUgaXMgdXNpbmcgdmVyc2lvbmluZywgdGhpcyBtZWFucyB0aGF0IHRoZSBsYXRlc3Qgb3JcbiAgICogbmV3ZXN0IHN1Y2ggY29va2llIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICpcbiAgICogQ2FsbGJhY2sgdGFrZXMgYW4gZXJyb3IgYW5kIHRoZSByZXN1bHRpbmcgQ29va2llIG9iamVjdC4gSWYgbm8gY29va2llIGlzIGZvdW5kIHRoZW4gbnVsbCBNVVNUIGJlIHBhc3NlZCBpbnN0ZWFkICh0aGF0IGlzLCBub3QgYW4gZXJyb3IpLlxuICAgKiBAcGFyYW0gZG9tYWluIC0gVGhlIGNvb2tpZSBkb21haW4gdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgY29va2llIHBhdGggdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBjb29raWUgbmFtZSB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCBlaXRoZXIgdGhlIGZvdW5kIGNvb2tpZSBvciBhbiBlcnJvci5cbiAgICovXG4gIGZpbmRDb29raWUoXG4gICAgZG9tYWluOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIHBhdGg6IE51bGxhYmxlPHN0cmluZz4sXG4gICAga2V5OiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIGNhbGxiYWNrOiBDYWxsYmFjazxDb29raWUgfCB1bmRlZmluZWQ+LFxuICApOiB2b2lkXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyBhbiBvdmVybG9hZCB0aGF0IHN1cHBvcnRzIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgZmluZENvb2tpZShcbiAgICBfZG9tYWluOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIF9wYXRoOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIF9rZXk6IE51bGxhYmxlPHN0cmluZz4sXG4gICAgX2NhbGxiYWNrPzogQ2FsbGJhY2s8Q29va2llIHwgdW5kZWZpbmVkPixcbiAgKTogdW5rbm93biB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmaW5kQ29va2llIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICAvKipcbiAgICogTG9jYXRlcyBhbGwge0BsaW5rIENvb2tpZX0gdmFsdWVzIG1hdGNoaW5nIHRoZSBnaXZlbiBgZG9tYWluYCBhbmQgYHBhdGhgLlxuICAgKlxuICAgKiBUaGUgcmVzdWx0aW5nIGxpc3QgaXMgY2hlY2tlZCBmb3IgYXBwbGljYWJpbGl0eSB0byB0aGUgY3VycmVudCByZXF1ZXN0IGFjY29yZGluZyB0byB0aGUgUkZDIChgZG9tYWluLW1hdGNoYCwgYHBhdGgtbWF0Y2hgLFxuICAgKiBgaHR0cC1vbmx5LWZsYWdgLCBgc2VjdXJlLWZsYWdgLCBgZXhwaXJ5YCwgYW5kIHNvIG9uKSwgc28gaXQncyBPSyB0byB1c2UgYW4gb3B0aW1pc3RpYyBzZWFyY2ggYWxnb3JpdGhtIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIHRoaXMgbWV0aG9kLiBIb3dldmVyLCB0aGUgc2VhcmNoIGFsZ29yaXRobSB1c2VkIFNIT1VMRCB0cnkgdG8gZmluZCBjb29raWVzIHRoYXQge0BsaW5rIGRvbWFpbk1hdGNofSB0aGUgYGRvbWFpbmAgYW5kXG4gICAqIHtAbGluayBwYXRoTWF0Y2h9IHRoZSBgcGF0aGAgaW4gb3JkZXIgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBjaGVja2luZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gQXMgb2YgdmVyc2lvbiBgMC45LjEyYCwgdGhlIGBhbGxQYXRoc2Agb3B0aW9uIHRvIGNvb2tpZWphci5nZXRDb29raWVzKCkgYWJvdmUgY2F1c2VzIHRoZSBwYXRoIGhlcmUgdG8gYmUgYG51bGxgLlxuICAgKlxuICAgKiAtIElmIHRoZSBgcGF0aGAgaXMgYG51bGxgLCBgcGF0aC1tYXRjaGluZ2AgTVVTVCBOT1QgYmUgcGVyZm9ybWVkICh0aGF0IGlzLCBgZG9tYWluLW1hdGNoaW5nYCBvbmx5KS5cbiAgICpcbiAgICogQHBhcmFtIGRvbWFpbiAtIFRoZSBjb29raWUgZG9tYWluIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGNvb2tpZSBwYXRoIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBhbGxvd1NwZWNpYWxVc2VEb21haW4gLSBJZiBgdHJ1ZWAgdGhlbiBzcGVjaWFsLXVzZSBkb21haW4gc3VmZml4ZXMsIHdpbGwgYmUgYWxsb3dlZCBpbiBtYXRjaGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgZmluZENvb2tpZXMoXG4gICAgZG9tYWluOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIHBhdGg6IE51bGxhYmxlPHN0cmluZz4sXG4gICAgYWxsb3dTcGVjaWFsVXNlRG9tYWluPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb29raWVbXT5cbiAgLyoqXG4gICAqIExvY2F0ZXMgYWxsIHtAbGluayBDb29raWV9IHZhbHVlcyBtYXRjaGluZyB0aGUgZ2l2ZW4gYGRvbWFpbmAgYW5kIGBwYXRoYC5cbiAgICpcbiAgICogVGhlIHJlc3VsdGluZyBsaXN0IGlzIGNoZWNrZWQgZm9yIGFwcGxpY2FiaWxpdHkgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCBhY2NvcmRpbmcgdG8gdGhlIFJGQyAoYGRvbWFpbi1tYXRjaGAsIGBwYXRoLW1hdGNoYCxcbiAgICogYGh0dHAtb25seS1mbGFnYCwgYHNlY3VyZS1mbGFnYCwgYGV4cGlyeWAsIGFuZCBzbyBvbiksIHNvIGl0J3MgT0sgdG8gdXNlIGFuIG9wdGltaXN0aWMgc2VhcmNoIGFsZ29yaXRobSB3aGVuIGltcGxlbWVudGluZ1xuICAgKiB0aGlzIG1ldGhvZC4gSG93ZXZlciwgdGhlIHNlYXJjaCBhbGdvcml0aG0gdXNlZCBTSE9VTEQgdHJ5IHRvIGZpbmQgY29va2llcyB0aGF0IHtAbGluayBkb21haW5NYXRjaH0gdGhlIGBkb21haW5gIGFuZFxuICAgKiB7QGxpbmsgcGF0aE1hdGNofSB0aGUgYHBhdGhgIGluIG9yZGVyIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgY2hlY2tpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIEFzIG9mIHZlcnNpb24gYDAuOS4xMmAsIHRoZSBgYWxsUGF0aHNgIG9wdGlvbiB0byBjb29raWVqYXIuZ2V0Q29va2llcygpIGFib3ZlIGNhdXNlcyB0aGUgcGF0aCBoZXJlIHRvIGJlIGBudWxsYC5cbiAgICpcbiAgICogLSBJZiB0aGUgYHBhdGhgIGlzIGBudWxsYCwgYHBhdGgtbWF0Y2hpbmdgIE1VU1QgTk9UIGJlIHBlcmZvcm1lZCAodGhhdCBpcywgYGRvbWFpbi1tYXRjaGluZ2Agb25seSkuXG4gICAqXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gYWxsb3dTcGVjaWFsVXNlRG9tYWluIC0gSWYgYHRydWVgIHRoZW4gc3BlY2lhbC11c2UgZG9tYWluIHN1ZmZpeGVzLCB3aWxsIGJlIGFsbG93ZWQgaW4gbWF0Y2hlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggZWl0aGVyIHRoZSBmb3VuZCBjb29raWVzIG9yIGFuIGVycm9yLlxuICAgKi9cbiAgZmluZENvb2tpZXMoXG4gICAgZG9tYWluOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIHBhdGg6IE51bGxhYmxlPHN0cmluZz4sXG4gICAgYWxsb3dTcGVjaWFsVXNlRG9tYWluPzogYm9vbGVhbixcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZVtdPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIGZpbmRDb29raWVzKFxuICAgIF9kb21haW46IE51bGxhYmxlPHN0cmluZz4sXG4gICAgX3BhdGg6IE51bGxhYmxlPHN0cmluZz4sXG4gICAgX2FsbG93U3BlY2lhbFVzZURvbWFpbjogYm9vbGVhbiB8IENhbGxiYWNrPENvb2tpZVtdPiA9IGZhbHNlLFxuICAgIF9jYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZVtdPixcbiAgKTogdW5rbm93biB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmaW5kQ29va2llcyBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcge0BsaW5rIENvb2tpZX0gdG8gdGhlIHN0b3JlLiBUaGUgaW1wbGVtZW50YXRpb24gU0hPVUxEIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvb2tpZSB3aXRoIHRoZSBzYW1lIGBkb21haW5gLFxuICAgKiBgcGF0aGAsIGFuZCBga2V5YCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIERlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IGJldHdlZW4gdGhlIGNhbGwgdG8gYGZldGNoQ29va2llYCBhbmQgYHB1dENvb2tpZWBcbiAgICogdGhhdCBhIGR1cGxpY2F0ZSBgcHV0Q29va2llYCBjYW4gb2NjdXIuXG4gICAqXG4gICAqIC0gVGhlIHtAbGluayBDb29raWV9IG9iamVjdCBNVVNUIE5PVCBiZSBtb2RpZmllZDsgYXMgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSB1cGRhdGVkIHRoZSBgY3JlYXRpb25gIGFuZCBgbGFzdEFjY2Vzc2VkYCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29va2llIC0gVGhlIGNvb2tpZSB0byBzdG9yZS5cbiAgICovXG4gIHB1dENvb2tpZShjb29raWU6IENvb2tpZSk6IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcge0BsaW5rIENvb2tpZX0gdG8gdGhlIHN0b3JlLiBUaGUgaW1wbGVtZW50YXRpb24gU0hPVUxEIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvb2tpZSB3aXRoIHRoZSBzYW1lIGBkb21haW5gLFxuICAgKiBgcGF0aGAsIGFuZCBga2V5YCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIERlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IGJldHdlZW4gdGhlIGNhbGwgdG8gYGZldGNoQ29va2llYCBhbmQgYHB1dENvb2tpZWBcbiAgICogdGhhdCBhIGR1cGxpY2F0ZSBgcHV0Q29va2llYCBjYW4gb2NjdXIuXG4gICAqXG4gICAqIC0gVGhlIHtAbGluayBDb29raWV9IG9iamVjdCBNVVNUIE5PVCBiZSBtb2RpZmllZDsgYXMgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSB1cGRhdGVkIHRoZSBgY3JlYXRpb25gIGFuZCBgbGFzdEFjY2Vzc2VkYCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29va2llIC0gVGhlIGNvb2tpZSB0byBzdG9yZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGNvb2tpZSBoYXMgYmVlbiBzdG9yZWQgb3IgYW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgKi9cbiAgcHV0Q29va2llKGNvb2tpZTogQ29va2llLCBjYWxsYmFjazogRXJyb3JDYWxsYmFjayk6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBwdXRDb29raWUoX2Nvb2tpZTogQ29va2llLCBfY2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrKTogdW5rbm93biB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwdXRDb29raWUgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZXhpc3Rpbmcge0BsaW5rIENvb2tpZX0uIFRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHVwZGF0ZSB0aGUgYHZhbHVlYCBmb3IgYSBjb29raWUgd2l0aCB0aGUgc2FtZSBgZG9tYWluYCxcbiAgICogYHBhdGhgLCBhbmQgYGtleWAuIFRoZSBpbXBsZW1lbnRhdGlvbiBTSE9VTEQgY2hlY2sgdGhhdCB0aGUgb2xkIHZhbHVlIGluIHRoZSBzdG9yZSBpcyBlcXVpdmFsZW50IHRvIG9sZENvb2tpZSAtXG4gICAqIGhvdyB0aGUgY29uZmxpY3QgaXMgcmVzb2x2ZWQgaXMgdXAgdG8gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoZSBgbGFzdEFjY2Vzc2VkYCBwcm9wZXJ0eSBpcyBhbHdheXMgZGlmZmVyZW50IGJldHdlZW4gdGhlIHR3byBvYmplY3RzICh0byB0aGUgcHJlY2lzaW9uIHBvc3NpYmxlIHZpYSBKYXZhU2NyaXB0J3MgY2xvY2spLlxuICAgKlxuICAgKiAtIEJvdGggYGNyZWF0aW9uYCBhbmQgYGNyZWF0aW9uSW5kZXhgIGFyZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lLlxuICAgKlxuICAgKiAtIFN0b3JlcyBNQVkgaWdub3JlIG9yIGRlZmVyIHRoZSBgbGFzdEFjY2Vzc2VkYCBjaGFuZ2UgYXQgdGhlIGNvc3Qgb2YgYWZmZWN0aW5nIGhvdyBjb29raWVzIGFyZSBzZWxlY3RlZCBmb3IgYXV0b21hdGljIGRlbGV0aW9uLlxuICAgKlxuICAgKiAtIFN0b3JlcyBtYXkgd2lzaCB0byBvcHRpbWl6ZSBjaGFuZ2luZyB0aGUgYHZhbHVlYCBvZiB0aGUgY29va2llIGluIHRoZSBzdG9yZSB2ZXJzdXMgc3RvcmluZyBhIG5ldyBjb29raWUuXG4gICAqXG4gICAqIC0gVGhlIGBuZXdDb29raWVgIGFuZCBgb2xkQ29va2llYCBvYmplY3RzIE1VU1QgTk9UIGJlIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkQ29va2llIC0gdGhlIGNvb2tpZSB0aGF0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBuZXdDb29raWUgLSB0aGUgY29va2llIHRvIHJlcGxhY2UgdGhlIG9uZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHN0b3JlLlxuICAgKi9cbiAgdXBkYXRlQ29va2llKG9sZENvb2tpZTogQ29va2llLCBuZXdDb29raWU6IENvb2tpZSk6IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyB7QGxpbmsgQ29va2llfS4gVGhlIGltcGxlbWVudGF0aW9uIE1VU1QgdXBkYXRlIHRoZSBgdmFsdWVgIGZvciBhIGNvb2tpZSB3aXRoIHRoZSBzYW1lIGBkb21haW5gLFxuICAgKiBgcGF0aGAsIGFuZCBga2V5YC4gVGhlIGltcGxlbWVudGF0aW9uIFNIT1VMRCBjaGVjayB0aGF0IHRoZSBvbGQgdmFsdWUgaW4gdGhlIHN0b3JlIGlzIGVxdWl2YWxlbnQgdG8gb2xkQ29va2llIC1cbiAgICogaG93IHRoZSBjb25mbGljdCBpcyByZXNvbHZlZCBpcyB1cCB0byB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gVGhlIGBsYXN0QWNjZXNzZWRgIHByb3BlcnR5IGlzIGFsd2F5cyBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMgKHRvIHRoZSBwcmVjaXNpb24gcG9zc2libGUgdmlhIEphdmFTY3JpcHQncyBjbG9jaykuXG4gICAqXG4gICAqIC0gQm90aCBgY3JlYXRpb25gIGFuZCBgY3JlYXRpb25JbmRleGAgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUuXG4gICAqXG4gICAqIC0gU3RvcmVzIE1BWSBpZ25vcmUgb3IgZGVmZXIgdGhlIGBsYXN0QWNjZXNzZWRgIGNoYW5nZSBhdCB0aGUgY29zdCBvZiBhZmZlY3RpbmcgaG93IGNvb2tpZXMgYXJlIHNlbGVjdGVkIGZvciBhdXRvbWF0aWMgZGVsZXRpb24uXG4gICAqXG4gICAqIC0gU3RvcmVzIG1heSB3aXNoIHRvIG9wdGltaXplIGNoYW5naW5nIHRoZSBgdmFsdWVgIG9mIHRoZSBjb29raWUgaW4gdGhlIHN0b3JlIHZlcnN1cyBzdG9yaW5nIGEgbmV3IGNvb2tpZS5cbiAgICpcbiAgICogLSBUaGUgYG5ld0Nvb2tpZWAgYW5kIGBvbGRDb29raWVgIG9iamVjdHMgTVVTVCBOT1QgYmUgbW9kaWZpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRDb29raWUgLSB0aGUgY29va2llIHRoYXQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIG5ld0Nvb2tpZSAtIHRoZSBjb29raWUgdG8gcmVwbGFjZSB0aGUgb25lIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBjb29raWUgaGFzIGJlZW4gdXBkYXRlZCBvciBhbiBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAqL1xuICB1cGRhdGVDb29raWUoXG4gICAgb2xkQ29va2llOiBDb29raWUsXG4gICAgbmV3Q29va2llOiBDb29raWUsXG4gICAgY2FsbGJhY2s6IEVycm9yQ2FsbGJhY2ssXG4gICk6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICB1cGRhdGVDb29raWUoXG4gICAgX29sZENvb2tpZTogQ29va2llLFxuICAgIF9uZXdDb29raWU6IENvb2tpZSxcbiAgICBfY2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrLFxuICApOiB1bmtub3duIHtcbiAgICAvLyByZWNvbW1lbmRlZCBkZWZhdWx0IGltcGxlbWVudGF0aW9uOlxuICAgIC8vIHJldHVybiB0aGlzLnB1dENvb2tpZShuZXdDb29raWUsIGNiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZUNvb2tpZSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNvb2tpZSBmcm9tIHRoZSBzdG9yZSAoc2VlIG5vdGVzIG9uIGBmaW5kQ29va2llYCBhYm91dCB0aGUgdW5pcXVlbmVzcyBjb25zdHJhaW50KS5cbiAgICpcbiAgICogQHBhcmFtIGRvbWFpbiAtIFRoZSBjb29raWUgZG9tYWluIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGNvb2tpZSBwYXRoIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgY29va2llIG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICovXG4gIHJlbW92ZUNvb2tpZShcbiAgICBkb21haW46IE51bGxhYmxlPHN0cmluZz4sXG4gICAgcGF0aDogTnVsbGFibGU8c3RyaW5nPixcbiAgICBrZXk6IE51bGxhYmxlPHN0cmluZz4sXG4gICk6IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNvb2tpZSBmcm9tIHRoZSBzdG9yZSAoc2VlIG5vdGVzIG9uIGBmaW5kQ29va2llYCBhYm91dCB0aGUgdW5pcXVlbmVzcyBjb25zdHJhaW50KS5cbiAgICpcbiAgICogQHBhcmFtIGRvbWFpbiAtIFRoZSBjb29raWUgZG9tYWluIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGNvb2tpZSBwYXRoIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgY29va2llIG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGNvb2tpZSBoYXMgYmVlbiByZW1vdmVkIG9yIGFuIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIHJlbW92ZUNvb2tpZShcbiAgICBkb21haW46IE51bGxhYmxlPHN0cmluZz4sXG4gICAgcGF0aDogTnVsbGFibGU8c3RyaW5nPixcbiAgICBrZXk6IE51bGxhYmxlPHN0cmluZz4sXG4gICAgY2FsbGJhY2s6IEVycm9yQ2FsbGJhY2ssXG4gICk6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICByZW1vdmVDb29raWUoXG4gICAgX2RvbWFpbjogTnVsbGFibGU8c3RyaW5nPixcbiAgICBfcGF0aDogTnVsbGFibGU8c3RyaW5nPixcbiAgICBfa2V5OiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIF9jYWxsYmFjaz86IEVycm9yQ2FsbGJhY2ssXG4gICk6IHVua25vd24ge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVtb3ZlQ29va2llIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBtYXRjaGluZyBjb29raWVzIGZyb20gdGhlIHN0b3JlLiBUaGUgYHBhdGhgIHBhcmFtZXRlciBpcyBvcHRpb25hbCBhbmQgaWYgbWlzc2luZyxcbiAgICogbWVhbnMgYWxsIHBhdGhzIGluIGEgZG9tYWluIHNob3VsZCBiZSByZW1vdmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZG9tYWluIC0gVGhlIGNvb2tpZSBkb21haW4gdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgY29va2llIHBhdGggdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICovXG4gIHJlbW92ZUNvb2tpZXMoZG9tYWluOiBzdHJpbmcsIHBhdGg6IE51bGxhYmxlPHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBSZW1vdmVzIG1hdGNoaW5nIGNvb2tpZXMgZnJvbSB0aGUgc3RvcmUuIFRoZSBgcGF0aGAgcGFyYW1ldGVyIGlzIG9wdGlvbmFsIGFuZCBpZiBtaXNzaW5nLFxuICAgKiBtZWFucyBhbGwgcGF0aHMgaW4gYSBkb21haW4gc2hvdWxkIGJlIHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgY29va2llcyBoYXZlIGJlZW4gcmVtb3ZlZCBvciBhbiBlcnJvciBvY2N1cnMuXG4gICAqL1xuICByZW1vdmVDb29raWVzKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHBhdGg6IE51bGxhYmxlPHN0cmluZz4sXG4gICAgY2FsbGJhY2s6IEVycm9yQ2FsbGJhY2ssXG4gICk6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICByZW1vdmVDb29raWVzKFxuICAgIF9kb21haW46IHN0cmluZyxcbiAgICBfcGF0aDogTnVsbGFibGU8c3RyaW5nPixcbiAgICBfY2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrLFxuICApOiB1bmtub3duIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZUNvb2tpZXMgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBjb29raWVzIGZyb20gdGhlIHN0b3JlLlxuICAgKi9cbiAgcmVtb3ZlQWxsQ29va2llcygpOiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBjb29raWVzIGZyb20gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgdGhlIGNvb2tpZXMgaGF2ZSBiZWVuIHJlbW92ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgcmVtb3ZlQWxsQ29va2llcyhjYWxsYmFjazogRXJyb3JDYWxsYmFjayk6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICByZW1vdmVBbGxDb29raWVzKF9jYWxsYmFjaz86IEVycm9yQ2FsbGJhY2spOiB1bmtub3duIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZUFsbENvb2tpZXMgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgY29va2llcyBpbiB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gQ29va2llcyBTSE9VTEQgYmUgcmV0dXJuZWQgaW4gY3JlYXRpb24gb3JkZXIgdG8gcHJlc2VydmUgc29ydGluZyB2aWEge0BsaW5rIGNvb2tpZUNvbXBhcmV9LlxuICAgKi9cbiAgZ2V0QWxsQ29va2llcygpOiBQcm9taXNlPENvb2tpZVtdPlxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIGNvb2tpZXMgaW4gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIENvb2tpZXMgU0hPVUxEIGJlIHJldHVybmVkIGluIGNyZWF0aW9uIG9yZGVyIHRvIHByZXNlcnZlIHNvcnRpbmcgdmlhIHtAbGluayBjb29raWVDb21wYXJlfS5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYWxsIHRoZSBjb29raWVzIGhhdmUgYmVlbiByZXRyaWV2ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgZ2V0QWxsQ29va2llcyhjYWxsYmFjazogQ2FsbGJhY2s8Q29va2llW10+KTogdm9pZFxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIGdldEFsbENvb2tpZXMoX2NhbGxiYWNrPzogQ2FsbGJhY2s8Q29va2llW10+KTogdW5rbm93biB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2dldEFsbENvb2tpZXMgaXMgbm90IGltcGxlbWVudGVkICh0aGVyZWZvcmUgamFyIGNhbm5vdCBiZSBzZXJpYWxpemVkKScsXG4gICAgKVxuICB9XG59XG4iLCAiLyoqXG4gKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBlcnJvciBvciBhIHJlc3VsdC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFjazxUPiB7XG4gIChlcnJvcjogRXJyb3IsIHJlc3VsdD86IG5ldmVyKTogdm9pZFxuICAoZXJyb3I6IG51bGwsIHJlc3VsdDogVCk6IHZvaWRcbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgb25seSBhY2NlcHRzIGFuIGVycm9yLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ2FsbGJhY2sge1xuICAoZXJyb3I6IEVycm9yIHwgbnVsbCk6IHZvaWRcbn1cblxuLyoqXG4gKiBUaGUgaW52ZXJzZSBvZiBOb25OdWxsYWJsZTxUPi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgTnVsbGFibGU8VD4gPSBUIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG4vKiogV3JhcHBlZCBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsIHNvIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gcmVtZW1iZXIgdG8gdXNlIGAuY2FsbCgpYC4gKi9cbmV4cG9ydCBjb25zdCBvYmplY3RUb1N0cmluZyA9IChvYmo6IHVua25vd24pOiBzdHJpbmcgPT5cbiAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iailcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSB0byBzdHJpbmcsIHNhZmVseSBoYW5kbGluZyBzeW1ib2xzLCBudWxsIHByb3RvdHlwZSBvYmplY3RzLCBhbmQgcmVjdXJzaXZlIGFycmF5cy5cbiAqL1xuY29uc3Qgc2FmZUFycmF5VG9TdHJpbmcgPSAoXG4gIGFycjogdW5rbm93bltdLFxuICBzZWVuQXJyYXlzOiBXZWFrU2V0PG9iamVjdD4sXG4pOiBzdHJpbmcgPT4ge1xuICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvdG9TdHJpbmcjZGVzY3JpcHRpb25cbiAgaWYgKHR5cGVvZiBhcnIuam9pbiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFycilcbiAgc2VlbkFycmF5cy5hZGQoYXJyKVxuICBjb25zdCBtYXBwZWQgPSBhcnIubWFwKCh2YWwpID0+XG4gICAgdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHNlZW5BcnJheXMuaGFzKHZhbClcbiAgICAgID8gJydcbiAgICAgIDogc2FmZVRvU3RyaW5nSW1wbCh2YWwsIHNlZW5BcnJheXMpLFxuICApXG4gIHJldHVybiBtYXBwZWQuam9pbigpXG59XG5cbmNvbnN0IHNhZmVUb1N0cmluZ0ltcGwgPSAodmFsOiB1bmtub3duLCBzZWVuQXJyYXlzID0gbmV3IFdlYWtTZXQoKSk6IHN0cmluZyA9PiB7XG4gIC8vIFVzaW5nIC50b1N0cmluZygpIGZhaWxzIGZvciBudWxsL3VuZGVmaW5lZCBhbmQgaW1wbGljaXQgY29udmVyc2lvbiAodmFsICsgXCJcIikgZmFpbHMgZm9yIHN5bWJvbHNcbiAgLy8gYW5kIG9iamVjdHMgd2l0aCBudWxsIHByb3RvdHlwZVxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgfHwgdmFsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbC50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgID8gLy8gQXJyYXlzIGhhdmUgYSB3ZWlyZCBjdXN0b20gdG9TdHJpbmcgdGhhdCB3ZSBuZWVkIHRvIHJlcGxpY2F0ZVxuICAgICAgICBzYWZlQXJyYXlUb1N0cmluZyh2YWwsIHNlZW5BcnJheXMpXG4gICAgICA6IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICAgICAgU3RyaW5nKHZhbClcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGNhc2Ugc2hvdWxkIGp1c3QgYmUgb2JqZWN0cyB3aXRoIG51bGwgcHJvdG90eXBlLCBzbyB3ZSBjYW4ganVzdCB1c2UgT2JqZWN0I3RvU3RyaW5nXG4gICAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHZhbClcbiAgfVxufVxuXG4vKiogU2FmZWx5IGNvbnZlcnRzIGFueSB2YWx1ZSB0byBzdHJpbmcsIHVzaW5nIHRoZSB2YWx1ZSdzIG93biBgdG9TdHJpbmdgIHdoZW4gYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGNvbnN0IHNhZmVUb1N0cmluZyA9ICh2YWw6IHVua25vd24pOiBzdHJpbmcgPT4gc2FmZVRvU3RyaW5nSW1wbCh2YWwpXG5cbi8qKiBVdGlsaXR5IG9iamVjdCBmb3IgcHJvbWlzZS9jYWxsYmFjayBpbnRlcm9wLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9taXNlQ2FsbGJhY2s8VD4ge1xuICBwcm9taXNlOiBQcm9taXNlPFQ+XG4gIGNhbGxiYWNrOiBDYWxsYmFjazxUPlxuICByZXNvbHZlOiAodmFsdWU6IFQpID0+IFByb21pc2U8VD5cbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiBQcm9taXNlPFQ+XG59XG5cbi8qKiBDb252ZXJ0cyBhIGNhbGxiYWNrIGludG8gYSB1dGlsaXR5IG9iamVjdCB3aGVyZSBlaXRoZXIgYSBjYWxsYmFjayBvciBhIHByb21pc2UgY2FuIGJlIHVzZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUNhbGxiYWNrPFQ+KGNiPzogQ2FsbGJhY2s8VD4pOiBQcm9taXNlQ2FsbGJhY2s8VD4ge1xuICBsZXQgY2FsbGJhY2s6IENhbGxiYWNrPFQ+XG4gIGxldCByZXNvbHZlOiAocmVzdWx0OiBUKSA9PiB2b2lkXG4gIGxldCByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWRcblxuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgcmVqZWN0ID0gX3JlamVjdFxuICB9KVxuXG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IChlcnIsIHJlc3VsdCk6IHZvaWQgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVycikgY2IoZXJyKVxuICAgICAgICAvLyBJZiBgZXJyYCBpcyBudWxsLCB3ZSBrbm93IGByZXN1bHRgIG11c3QgYmUgYFRgXG4gICAgICAgIC8vIFRoZSBhc3NlcnRpb24gaXNuJ3QgKnN0cmljdGx5KiBjb3JyZWN0LCBhcyBgVGAgY291bGQgYmUgbnVsbGlzaCwgYnV0LCBlaGgsIGdvb2QgZW5vdWdoLi4uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIGVsc2UgY2IobnVsbCwgcmVzdWx0ISlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoKSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2sgPSAoZXJyLCByZXN1bHQpOiB2b2lkID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIElmIGBlcnJgIGlzIG51bGwsIHdlIGtub3cgYHJlc3VsdGAgbXVzdCBiZSBgVGBcbiAgICAgICAgLy8gVGhlIGFzc2VydGlvbiBpc24ndCAqc3RyaWN0bHkqIGNvcnJlY3QsIGFzIGBUYCBjb3VsZCBiZSBudWxsaXNoLCBidXQsIGVoaCwgZ29vZCBlbm91Z2guLi5cbiAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycilcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgZWxzZSByZXNvbHZlKHJlc3VsdCEpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9taXNlLFxuICAgIGNhbGxiYWNrLFxuICAgIHJlc29sdmU6ICh2YWx1ZTogVCk6IFByb21pc2U8VD4gPT4ge1xuICAgICAgY2FsbGJhY2sobnVsbCwgdmFsdWUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH0sXG4gICAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvcilcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5PcGVyYXRvcjxLIGV4dGVuZHMgc3RyaW5nLCBUIGV4dGVuZHMgb2JqZWN0PihcbiAgazogSyxcbiAgbzogVCxcbik6IG8gaXMgVCAmIFJlY29yZDxLLCB1bmtub3duPiB7XG4gIHJldHVybiBrIGluIG9cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvb2tpZSB9IGZyb20gJy4vY29va2llL2Nvb2tpZS5qcydcbmltcG9ydCB7IHBhdGhNYXRjaCB9IGZyb20gJy4vcGF0aE1hdGNoLmpzJ1xuaW1wb3J0IHsgcGVybXV0ZURvbWFpbiB9IGZyb20gJy4vcGVybXV0ZURvbWFpbi5qcydcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnLi9zdG9yZS5qcydcbmltcG9ydCB7XG4gIENhbGxiYWNrLFxuICBjcmVhdGVQcm9taXNlQ2FsbGJhY2ssXG4gIEVycm9yQ2FsbGJhY2ssXG4gIE51bGxhYmxlLFxufSBmcm9tICcuL3V0aWxzLmpzJ1xuXG4vKipcbiAqIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgdXNlZCBpbiB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIE1lbW9yeUNvb2tpZVN0b3JlSW5kZXggPSB7XG4gIFtkb21haW46IHN0cmluZ106IHtcbiAgICBbcGF0aDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogQ29va2llXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQW4gaW4tbWVtb3J5IHtAbGluayBTdG9yZX0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBDb29raWVKYXJ9LiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZWQgYnlcbiAqIHtAbGluayBDb29raWVKYXJ9IGFuZCBzdXBwb3J0cyBib3RoIGFzeW5jIGFuZCBzeW5jIG9wZXJhdGlvbnMuIEFsc28gc3VwcG9ydHMgc2VyaWFsaXphdGlvbiwgZ2V0QWxsQ29va2llcywgYW5kIHJlbW92ZUFsbENvb2tpZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlDb29raWVTdG9yZSBleHRlbmRzIFN0b3JlIHtcbiAgLyoqXG4gICAqIFRoaXMgdmFsdWUgaXMgYHRydWVgIHNpbmNlIHtAbGluayBNZW1vcnlDb29raWVTdG9yZX0gaW1wbGVtZW50cyBzeW5jaHJvbm91cyBmdW5jdGlvbmFsaXR5LlxuICAgKi9cbiAgb3ZlcnJpZGUgc3luY2hyb25vdXM6IGJvb2xlYW5cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBpZHg6IE1lbW9yeUNvb2tpZVN0b3JlSW5kZXhcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBNZW1vcnlDb29raWVTdG9yZX0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5zeW5jaHJvbm91cyA9IHRydWVcbiAgICB0aGlzLmlkeCA9IE9iamVjdC5jcmVhdGUobnVsbCkgYXMgTWVtb3J5Q29va2llU3RvcmVJbmRleFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEge0BsaW5rIENvb2tpZX0gd2l0aCB0aGUgZ2l2ZW4gYGRvbWFpbmAsIGBwYXRoYCwgYW5kIGBrZXlgIChgbmFtZWApLiBUaGUgUkZDIG1haW50YWlucyB0aGF0IGV4YWN0bHlcbiAgICogb25lIG9mIHRoZXNlIGNvb2tpZXMgc2hvdWxkIGV4aXN0IGluIGEgc3RvcmUuIElmIHRoZSBzdG9yZSBpcyB1c2luZyB2ZXJzaW9uaW5nLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGxhdGVzdCBvclxuICAgKiBuZXdlc3Qgc3VjaCBjb29raWUgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZG9tYWluIC0gVGhlIGNvb2tpZSBkb21haW4gdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgY29va2llIHBhdGggdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBjb29raWUgbmFtZSB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKi9cbiAgb3ZlcnJpZGUgZmluZENvb2tpZShcbiAgICBkb21haW46IE51bGxhYmxlPHN0cmluZz4sXG4gICAgcGF0aDogTnVsbGFibGU8c3RyaW5nPixcbiAgICBrZXk6IE51bGxhYmxlPHN0cmluZz4sXG4gICk6IFByb21pc2U8Q29va2llIHwgdW5kZWZpbmVkPlxuICAvKipcbiAgICogUmV0cmlldmUgYSB7QGxpbmsgQ29va2llfSB3aXRoIHRoZSBnaXZlbiBgZG9tYWluYCwgYHBhdGhgLCBhbmQgYGtleWAgKGBuYW1lYCkuIFRoZSBSRkMgbWFpbnRhaW5zIHRoYXQgZXhhY3RseVxuICAgKiBvbmUgb2YgdGhlc2UgY29va2llcyBzaG91bGQgZXhpc3QgaW4gYSBzdG9yZS4gSWYgdGhlIHN0b3JlIGlzIHVzaW5nIHZlcnNpb25pbmcsIHRoaXMgbWVhbnMgdGhhdCB0aGUgbGF0ZXN0IG9yXG4gICAqIG5ld2VzdCBzdWNoIGNvb2tpZSBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAqXG4gICAqIENhbGxiYWNrIHRha2VzIGFuIGVycm9yIGFuZCB0aGUgcmVzdWx0aW5nIENvb2tpZSBvYmplY3QuIElmIG5vIGNvb2tpZSBpcyBmb3VuZCB0aGVuIG51bGwgTVVTVCBiZSBwYXNzZWQgaW5zdGVhZCAodGhhdCBpcywgbm90IGFuIGVycm9yKS5cbiAgICogQHBhcmFtIGRvbWFpbiAtIFRoZSBjb29raWUgZG9tYWluIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGNvb2tpZSBwYXRoIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgY29va2llIG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdpdGggZWl0aGVyIHRoZSBmb3VuZCBjb29raWUgb3IgYW4gZXJyb3IuXG4gICAqL1xuICBvdmVycmlkZSBmaW5kQ29va2llKFxuICAgIGRvbWFpbjogTnVsbGFibGU8c3RyaW5nPixcbiAgICBwYXRoOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIGtleTogTnVsbGFibGU8c3RyaW5nPixcbiAgICBjYWxsYmFjazogQ2FsbGJhY2s8Q29va2llIHwgdW5kZWZpbmVkPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIG92ZXJyaWRlIGZpbmRDb29raWUoXG4gICAgZG9tYWluOiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIHBhdGg6IE51bGxhYmxlPHN0cmluZz4sXG4gICAga2V5OiBOdWxsYWJsZTxzdHJpbmc+LFxuICAgIGNhbGxiYWNrPzogQ2FsbGJhY2s8Q29va2llIHwgdW5kZWZpbmVkPixcbiAgKTogdW5rbm93biB7XG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrKGNhbGxiYWNrKVxuICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBwYXRoID09IG51bGwgfHwga2V5ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaWR4W2RvbWFpbl0/LltwYXRoXT8uW2tleV1cbiAgICByZXR1cm4gcHJvbWlzZUNhbGxiYWNrLnJlc29sdmUocmVzdWx0KVxuICB9XG5cbiAgLyoqXG4gICAqIExvY2F0ZXMgYWxsIHtAbGluayBDb29raWV9IHZhbHVlcyBtYXRjaGluZyB0aGUgZ2l2ZW4gYGRvbWFpbmAgYW5kIGBwYXRoYC5cbiAgICpcbiAgICogVGhlIHJlc3VsdGluZyBsaXN0IGlzIGNoZWNrZWQgZm9yIGFwcGxpY2FiaWxpdHkgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCBhY2NvcmRpbmcgdG8gdGhlIFJGQyAoYGRvbWFpbi1tYXRjaGAsIGBwYXRoLW1hdGNoYCxcbiAgICogYGh0dHAtb25seS1mbGFnYCwgYHNlY3VyZS1mbGFnYCwgYGV4cGlyeWAsIGFuZCBzbyBvbiksIHNvIGl0J3MgT0sgdG8gdXNlIGFuIG9wdGltaXN0aWMgc2VhcmNoIGFsZ29yaXRobSB3aGVuIGltcGxlbWVudGluZ1xuICAgKiB0aGlzIG1ldGhvZC4gSG93ZXZlciwgdGhlIHNlYXJjaCBhbGdvcml0aG0gdXNlZCBTSE9VTEQgdHJ5IHRvIGZpbmQgY29va2llcyB0aGF0IHtAbGluayBkb21haW5NYXRjaH0gdGhlIGBkb21haW5gIGFuZFxuICAgKiB7QGxpbmsgcGF0aE1hdGNofSB0aGUgYHBhdGhgIGluIG9yZGVyIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgY2hlY2tpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIEFzIG9mIHZlcnNpb24gYDAuOS4xMmAsIHRoZSBgYWxsUGF0aHNgIG9wdGlvbiB0byBjb29raWVqYXIuZ2V0Q29va2llcygpIGFib3ZlIGNhdXNlcyB0aGUgcGF0aCBoZXJlIHRvIGJlIGBudWxsYC5cbiAgICpcbiAgICogLSBJZiB0aGUgYHBhdGhgIGlzIGBudWxsYCwgYHBhdGgtbWF0Y2hpbmdgIE1VU1QgTk9UIGJlIHBlcmZvcm1lZCAodGhhdCBpcywgYGRvbWFpbi1tYXRjaGluZ2Agb25seSkuXG4gICAqXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gYWxsb3dTcGVjaWFsVXNlRG9tYWluIC0gSWYgYHRydWVgIHRoZW4gc3BlY2lhbC11c2UgZG9tYWluIHN1ZmZpeGVzLCB3aWxsIGJlIGFsbG93ZWQgaW4gbWF0Y2hlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIG92ZXJyaWRlIGZpbmRDb29raWVzKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBhbGxvd1NwZWNpYWxVc2VEb21haW4/OiBib29sZWFuLFxuICApOiBQcm9taXNlPENvb2tpZVtdPlxuICAvKipcbiAgICogTG9jYXRlcyBhbGwge0BsaW5rIENvb2tpZX0gdmFsdWVzIG1hdGNoaW5nIHRoZSBnaXZlbiBgZG9tYWluYCBhbmQgYHBhdGhgLlxuICAgKlxuICAgKiBUaGUgcmVzdWx0aW5nIGxpc3QgaXMgY2hlY2tlZCBmb3IgYXBwbGljYWJpbGl0eSB0byB0aGUgY3VycmVudCByZXF1ZXN0IGFjY29yZGluZyB0byB0aGUgUkZDIChgZG9tYWluLW1hdGNoYCwgYHBhdGgtbWF0Y2hgLFxuICAgKiBgaHR0cC1vbmx5LWZsYWdgLCBgc2VjdXJlLWZsYWdgLCBgZXhwaXJ5YCwgYW5kIHNvIG9uKSwgc28gaXQncyBPSyB0byB1c2UgYW4gb3B0aW1pc3RpYyBzZWFyY2ggYWxnb3JpdGhtIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIHRoaXMgbWV0aG9kLiBIb3dldmVyLCB0aGUgc2VhcmNoIGFsZ29yaXRobSB1c2VkIFNIT1VMRCB0cnkgdG8gZmluZCBjb29raWVzIHRoYXQge0BsaW5rIGRvbWFpbk1hdGNofSB0aGUgYGRvbWFpbmAgYW5kXG4gICAqIHtAbGluayBwYXRoTWF0Y2h9IHRoZSBgcGF0aGAgaW4gb3JkZXIgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBjaGVja2luZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gQXMgb2YgdmVyc2lvbiBgMC45LjEyYCwgdGhlIGBhbGxQYXRoc2Agb3B0aW9uIHRvIGNvb2tpZWphci5nZXRDb29raWVzKCkgYWJvdmUgY2F1c2VzIHRoZSBwYXRoIGhlcmUgdG8gYmUgYG51bGxgLlxuICAgKlxuICAgKiAtIElmIHRoZSBgcGF0aGAgaXMgYG51bGxgLCBgcGF0aC1tYXRjaGluZ2AgTVVTVCBOT1QgYmUgcGVyZm9ybWVkICh0aGF0IGlzLCBgZG9tYWluLW1hdGNoaW5nYCBvbmx5KS5cbiAgICpcbiAgICogQHBhcmFtIGRvbWFpbiAtIFRoZSBjb29raWUgZG9tYWluIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGNvb2tpZSBwYXRoIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBhbGxvd1NwZWNpYWxVc2VEb21haW4gLSBJZiBgdHJ1ZWAgdGhlbiBzcGVjaWFsLXVzZSBkb21haW4gc3VmZml4ZXMsIHdpbGwgYmUgYWxsb3dlZCBpbiBtYXRjaGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2l0aCBlaXRoZXIgdGhlIGZvdW5kIGNvb2tpZXMgb3IgYW4gZXJyb3IuXG4gICAqL1xuICBvdmVycmlkZSBmaW5kQ29va2llcyhcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYWxsb3dTcGVjaWFsVXNlRG9tYWluPzogYm9vbGVhbixcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZVtdPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIG92ZXJyaWRlIGZpbmRDb29raWVzKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBhbGxvd1NwZWNpYWxVc2VEb21haW46IGJvb2xlYW4gfCBDYWxsYmFjazxDb29raWVbXT4gPSBmYWxzZSxcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZVtdPixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHR5cGVvZiBhbGxvd1NwZWNpYWxVc2VEb21haW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gYWxsb3dTcGVjaWFsVXNlRG9tYWluXG4gICAgICAvLyBUT0RPOiBJdCdzIHdlaXJkIHRoYXQgYGFsbG93U3BlY2lhbFVzZURvbWFpbmAgZGVmYXVsdHMgdG8gZmFsc2Ugd2l0aCBubyBjYWxsYmFjayxcbiAgICAgIC8vIGJ1dCB0cnVlIHdpdGggYSBjYWxsYmFjay4gVGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IgZnJvbSB2NC5cbiAgICAgIGFsbG93U3BlY2lhbFVzZURvbWFpbiA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzOiBDb29raWVbXSA9IFtdXG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrPENvb2tpZVtdPihjYWxsYmFjaylcblxuICAgIGlmICghZG9tYWluKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZUNhbGxiYWNrLnJlc29sdmUoW10pXG4gICAgfVxuXG4gICAgbGV0IHBhdGhNYXRjaGVyOiAoXG4gICAgICBkb21haW5JbmRleDogTWVtb3J5Q29va2llU3RvcmVJbmRleFtzdHJpbmddIHwgdW5kZWZpbmVkLFxuICAgICkgPT4gdm9pZFxuICAgIGlmICghcGF0aCkge1xuICAgICAgLy8gbnVsbCBtZWFucyBcImFsbCBwYXRoc1wiXG4gICAgICBwYXRoTWF0Y2hlciA9IGZ1bmN0aW9uIG1hdGNoQWxsKGRvbWFpbkluZGV4KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgY3VyUGF0aCBpbiBkb21haW5JbmRleCkge1xuICAgICAgICAgIGNvbnN0IHBhdGhJbmRleCA9IGRvbWFpbkluZGV4W2N1clBhdGhdXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcGF0aEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhdGhJbmRleFtrZXldXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoTWF0Y2hlciA9IGZ1bmN0aW9uIG1hdGNoUkZDKGRvbWFpbkluZGV4KTogdm9pZCB7XG4gICAgICAgIC8vTk9URTogd2Ugc2hvdWxkIHVzZSBwYXRoLW1hdGNoIGFsZ29yaXRobSBmcm9tIFM1LjEuNCBoZXJlXG4gICAgICAgIC8vKHNlZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9DaHJvbWl1bVdlYkFwcHMvY2hyb21pdW0vYmxvYi9iM2QzYjRkYThiYjk0YzFiMmUwNjE2MDBkZjEwNmQ1OTBmZGEzNjIwL25ldC9jb29raWVzL2Nhbm9uaWNhbF9jb29raWUuY2MjTDI5OSlcbiAgICAgICAgZm9yIChjb25zdCBjb29raWVQYXRoIGluIGRvbWFpbkluZGV4KSB7XG4gICAgICAgICAgaWYgKHBhdGhNYXRjaChwYXRoLCBjb29raWVQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aEluZGV4ID0gZG9tYWluSW5kZXhbY29va2llUGF0aF1cbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHBhdGhJbmRleCkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhdGhJbmRleFtrZXldXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRvbWFpbnMgPSBwZXJtdXRlRG9tYWluKGRvbWFpbiwgYWxsb3dTcGVjaWFsVXNlRG9tYWluKSB8fCBbZG9tYWluXVxuICAgIGNvbnN0IGlkeCA9IHRoaXMuaWR4XG4gICAgZG9tYWlucy5mb3JFYWNoKChjdXJEb21haW4pID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbkluZGV4ID0gaWR4W2N1ckRvbWFpbl1cbiAgICAgIGlmICghZG9tYWluSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBwYXRoTWF0Y2hlcihkb21haW5JbmRleClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHJlc3VsdHMpXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyB7QGxpbmsgQ29va2llfSB0byB0aGUgc3RvcmUuIFRoZSBpbXBsZW1lbnRhdGlvbiBTSE9VTEQgcmVwbGFjZSBhbnkgZXhpc3RpbmcgY29va2llIHdpdGggdGhlIHNhbWUgYGRvbWFpbmAsXG4gICAqIGBwYXRoYCwgYW5kIGBrZXlgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gRGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgdGhlIGltcGxlbWVudGF0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgYmV0d2VlbiB0aGUgY2FsbCB0byBgZmV0Y2hDb29raWVgIGFuZCBgcHV0Q29va2llYFxuICAgKiB0aGF0IGEgZHVwbGljYXRlIGBwdXRDb29raWVgIGNhbiBvY2N1ci5cbiAgICpcbiAgICogLSBUaGUge0BsaW5rIENvb2tpZX0gb2JqZWN0IE1VU1QgTk9UIGJlIG1vZGlmaWVkOyBhcyB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHVwZGF0ZWQgdGhlIGBjcmVhdGlvbmAgYW5kIGBsYXN0QWNjZXNzZWRgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb29raWUgLSBUaGUgY29va2llIHRvIHN0b3JlLlxuICAgKi9cbiAgb3ZlcnJpZGUgcHV0Q29va2llKGNvb2tpZTogQ29va2llKTogUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogQWRkcyBhIG5ldyB7QGxpbmsgQ29va2llfSB0byB0aGUgc3RvcmUuIFRoZSBpbXBsZW1lbnRhdGlvbiBTSE9VTEQgcmVwbGFjZSBhbnkgZXhpc3RpbmcgY29va2llIHdpdGggdGhlIHNhbWUgYGRvbWFpbmAsXG4gICAqIGBwYXRoYCwgYW5kIGBrZXlgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gRGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgdGhlIGltcGxlbWVudGF0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgYmV0d2VlbiB0aGUgY2FsbCB0byBgZmV0Y2hDb29raWVgIGFuZCBgcHV0Q29va2llYFxuICAgKiB0aGF0IGEgZHVwbGljYXRlIGBwdXRDb29raWVgIGNhbiBvY2N1ci5cbiAgICpcbiAgICogLSBUaGUge0BsaW5rIENvb2tpZX0gb2JqZWN0IE1VU1QgTk9UIGJlIG1vZGlmaWVkOyBhcyB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHVwZGF0ZWQgdGhlIGBjcmVhdGlvbmAgYW5kIGBsYXN0QWNjZXNzZWRgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb29raWUgLSBUaGUgY29va2llIHRvIHN0b3JlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgY29va2llIGhhcyBiZWVuIHN0b3JlZCBvciBhbiBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAqL1xuICBvdmVycmlkZSBwdXRDb29raWUoY29va2llOiBDb29raWUsIGNhbGxiYWNrOiBFcnJvckNhbGxiYWNrKTogdm9pZFxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIG92ZXJyaWRlIHB1dENvb2tpZShjb29raWU6IENvb2tpZSwgY2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrKTogdW5rbm93biB7XG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrPHVuZGVmaW5lZD4oY2FsbGJhY2spXG5cbiAgICBjb25zdCB7IGRvbWFpbiwgcGF0aCwga2V5IH0gPSBjb29raWVcblxuICAgIC8vIEd1YXJkaW5nIGFnYWluc3QgaW52YWxpZCBpbnB1dFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IHBhdGggPT0gbnVsbCB8fCBrZXkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICBjb25zdCBkb21haW5FbnRyeSA9XG4gICAgICB0aGlzLmlkeFtkb21haW5dID8/XG4gICAgICAoT2JqZWN0LmNyZWF0ZShudWxsKSBhcyBNZW1vcnlDb29raWVTdG9yZUluZGV4W3N0cmluZ10pXG5cbiAgICB0aGlzLmlkeFtkb21haW5dID0gZG9tYWluRW50cnlcblxuICAgIGNvbnN0IHBhdGhFbnRyeSA9XG4gICAgICBkb21haW5FbnRyeVtwYXRoXSA/P1xuICAgICAgKE9iamVjdC5jcmVhdGUobnVsbCkgYXMgTWVtb3J5Q29va2llU3RvcmVJbmRleFtzdHJpbmddW3N0cmluZ10pXG5cbiAgICBkb21haW5FbnRyeVtwYXRoXSA9IHBhdGhFbnRyeVxuXG4gICAgcGF0aEVudHJ5W2tleV0gPSBjb29raWVcblxuICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVzb2x2ZSh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIGV4aXN0aW5nIHtAbGluayBDb29raWV9LiBUaGUgaW1wbGVtZW50YXRpb24gTVVTVCB1cGRhdGUgdGhlIGB2YWx1ZWAgZm9yIGEgY29va2llIHdpdGggdGhlIHNhbWUgYGRvbWFpbmAsXG4gICAqIGBwYXRoYCwgYW5kIGBrZXlgLiBUaGUgaW1wbGVtZW50YXRpb24gU0hPVUxEIGNoZWNrIHRoYXQgdGhlIG9sZCB2YWx1ZSBpbiB0aGUgc3RvcmUgaXMgZXF1aXZhbGVudCB0byBvbGRDb29raWUgLVxuICAgKiBob3cgdGhlIGNvbmZsaWN0IGlzIHJlc29sdmVkIGlzIHVwIHRvIHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBUaGUgYGxhc3RBY2Nlc3NlZGAgcHJvcGVydHkgaXMgYWx3YXlzIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cyAodG8gdGhlIHByZWNpc2lvbiBwb3NzaWJsZSB2aWEgSmF2YVNjcmlwdCdzIGNsb2NrKS5cbiAgICpcbiAgICogLSBCb3RoIGBjcmVhdGlvbmAgYW5kIGBjcmVhdGlvbkluZGV4YCBhcmUgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZS5cbiAgICpcbiAgICogLSBTdG9yZXMgTUFZIGlnbm9yZSBvciBkZWZlciB0aGUgYGxhc3RBY2Nlc3NlZGAgY2hhbmdlIGF0IHRoZSBjb3N0IG9mIGFmZmVjdGluZyBob3cgY29va2llcyBhcmUgc2VsZWN0ZWQgZm9yIGF1dG9tYXRpYyBkZWxldGlvbi5cbiAgICpcbiAgICogLSBTdG9yZXMgbWF5IHdpc2ggdG8gb3B0aW1pemUgY2hhbmdpbmcgdGhlIGB2YWx1ZWAgb2YgdGhlIGNvb2tpZSBpbiB0aGUgc3RvcmUgdmVyc3VzIHN0b3JpbmcgYSBuZXcgY29va2llLlxuICAgKlxuICAgKiAtIFRoZSBgbmV3Q29va2llYCBhbmQgYG9sZENvb2tpZWAgb2JqZWN0cyBNVVNUIE5PVCBiZSBtb2RpZmllZC5cbiAgICpcbiAgICogQHBhcmFtIG9sZENvb2tpZSAtIHRoZSBjb29raWUgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gbmV3Q29va2llIC0gdGhlIGNvb2tpZSB0byByZXBsYWNlIHRoZSBvbmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzdG9yZS5cbiAgICovXG4gIG92ZXJyaWRlIHVwZGF0ZUNvb2tpZShvbGRDb29raWU6IENvb2tpZSwgbmV3Q29va2llOiBDb29raWUpOiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZXhpc3Rpbmcge0BsaW5rIENvb2tpZX0uIFRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHVwZGF0ZSB0aGUgYHZhbHVlYCBmb3IgYSBjb29raWUgd2l0aCB0aGUgc2FtZSBgZG9tYWluYCxcbiAgICogYHBhdGhgLCBhbmQgYGtleWAuIFRoZSBpbXBsZW1lbnRhdGlvbiBTSE9VTEQgY2hlY2sgdGhhdCB0aGUgb2xkIHZhbHVlIGluIHRoZSBzdG9yZSBpcyBlcXVpdmFsZW50IHRvIG9sZENvb2tpZSAtXG4gICAqIGhvdyB0aGUgY29uZmxpY3QgaXMgcmVzb2x2ZWQgaXMgdXAgdG8gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoZSBgbGFzdEFjY2Vzc2VkYCBwcm9wZXJ0eSBpcyBhbHdheXMgZGlmZmVyZW50IGJldHdlZW4gdGhlIHR3byBvYmplY3RzICh0byB0aGUgcHJlY2lzaW9uIHBvc3NpYmxlIHZpYSBKYXZhU2NyaXB0J3MgY2xvY2spLlxuICAgKlxuICAgKiAtIEJvdGggYGNyZWF0aW9uYCBhbmQgYGNyZWF0aW9uSW5kZXhgIGFyZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lLlxuICAgKlxuICAgKiAtIFN0b3JlcyBNQVkgaWdub3JlIG9yIGRlZmVyIHRoZSBgbGFzdEFjY2Vzc2VkYCBjaGFuZ2UgYXQgdGhlIGNvc3Qgb2YgYWZmZWN0aW5nIGhvdyBjb29raWVzIGFyZSBzZWxlY3RlZCBmb3IgYXV0b21hdGljIGRlbGV0aW9uLlxuICAgKlxuICAgKiAtIFN0b3JlcyBtYXkgd2lzaCB0byBvcHRpbWl6ZSBjaGFuZ2luZyB0aGUgYHZhbHVlYCBvZiB0aGUgY29va2llIGluIHRoZSBzdG9yZSB2ZXJzdXMgc3RvcmluZyBhIG5ldyBjb29raWUuXG4gICAqXG4gICAqIC0gVGhlIGBuZXdDb29raWVgIGFuZCBgb2xkQ29va2llYCBvYmplY3RzIE1VU1QgTk9UIGJlIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkQ29va2llIC0gdGhlIGNvb2tpZSB0aGF0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBuZXdDb29raWUgLSB0aGUgY29va2llIHRvIHJlcGxhY2UgdGhlIG9uZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgY29va2llIGhhcyBiZWVuIHVwZGF0ZWQgb3IgYW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgKi9cbiAgb3ZlcnJpZGUgdXBkYXRlQ29va2llKFxuICAgIG9sZENvb2tpZTogQ29va2llLFxuICAgIG5ld0Nvb2tpZTogQ29va2llLFxuICAgIGNhbGxiYWNrOiBFcnJvckNhbGxiYWNrLFxuICApOiB2b2lkXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyBhbiBvdmVybG9hZCB0aGF0IHN1cHBvcnRzIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgdXBkYXRlQ29va2llKFxuICAgIF9vbGRDb29raWU6IENvb2tpZSxcbiAgICBuZXdDb29raWU6IENvb2tpZSxcbiAgICBjYWxsYmFjaz86IEVycm9yQ2FsbGJhY2ssXG4gICk6IHVua25vd24ge1xuICAgIC8vIHVwZGF0ZUNvb2tpZSgpIG1heSBhdm9pZCB1cGRhdGluZyBjb29raWVzIHRoYXQgYXJlIGlkZW50aWNhbC4gIEZvciBleGFtcGxlLFxuICAgIC8vIGxhc3RBY2Nlc3NlZCBtYXkgbm90IGJlIGltcG9ydGFudCB0byBzb21lIHN0b3JlcyBhbmQgYW4gZXF1YWxpdHlcbiAgICAvLyBjb21wYXJpc29uIGNvdWxkIGV4Y2x1ZGUgdGhhdCBmaWVsZC5cbiAgICAvLyBEb24ndCByZXR1cm4gYSB2YWx1ZSB3aGVuIHVzaW5nIGEgY2FsbGJhY2ssIHNvIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIHRydWx5IFwidm9pZFwiXG4gICAgaWYgKGNhbGxiYWNrKSB0aGlzLnB1dENvb2tpZShuZXdDb29raWUsIGNhbGxiYWNrKVxuICAgIGVsc2UgcmV0dXJuIHRoaXMucHV0Q29va2llKG5ld0Nvb2tpZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjb29raWUgZnJvbSB0aGUgc3RvcmUgKHNlZSBub3RlcyBvbiBgZmluZENvb2tpZWAgYWJvdXQgdGhlIHVuaXF1ZW5lc3MgY29uc3RyYWludCkuXG4gICAqXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGNvb2tpZSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqL1xuICBvdmVycmlkZSByZW1vdmVDb29raWUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjb29raWUgZnJvbSB0aGUgc3RvcmUgKHNlZSBub3RlcyBvbiBgZmluZENvb2tpZWAgYWJvdXQgdGhlIHVuaXF1ZW5lc3MgY29uc3RyYWludCkuXG4gICAqXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGNvb2tpZSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBjb29raWUgaGFzIGJlZW4gcmVtb3ZlZCBvciBhbiBlcnJvciBvY2N1cnMuXG4gICAqL1xuICBvdmVycmlkZSByZW1vdmVDb29raWUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiBFcnJvckNhbGxiYWNrLFxuICApOiB2b2lkXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyBhbiBvdmVybG9hZCB0aGF0IHN1cHBvcnRzIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgcmVtb3ZlQ29va2llKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBjYWxsYmFjaz86IEVycm9yQ2FsbGJhY2ssXG4gICk6IHVua25vd24ge1xuICAgIGNvbnN0IHByb21pc2VDYWxsYmFjayA9IGNyZWF0ZVByb21pc2VDYWxsYmFjazx1bmRlZmluZWQ+KGNhbGxiYWNrKVxuICAgIGRlbGV0ZSB0aGlzLmlkeFtkb21haW5dPy5bcGF0aF0/LltrZXldXG4gICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIG1hdGNoaW5nIGNvb2tpZXMgZnJvbSB0aGUgc3RvcmUuIFRoZSBgcGF0aGAgcGFyYW1ldGVyIGlzIG9wdGlvbmFsIGFuZCBpZiBtaXNzaW5nLFxuICAgKiBtZWFucyBhbGwgcGF0aHMgaW4gYSBkb21haW4gc2hvdWxkIGJlIHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBkb21haW4gLSBUaGUgY29va2llIGRvbWFpbiB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBjb29raWUgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKi9cbiAgb3ZlcnJpZGUgcmVtb3ZlQ29va2llcyhkb21haW46IHN0cmluZywgcGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogUmVtb3ZlcyBtYXRjaGluZyBjb29raWVzIGZyb20gdGhlIHN0b3JlLiBUaGUgYHBhdGhgIHBhcmFtZXRlciBpcyBvcHRpb25hbCBhbmQgaWYgbWlzc2luZyxcbiAgICogbWVhbnMgYWxsIHBhdGhzIGluIGEgZG9tYWluIHNob3VsZCBiZSByZW1vdmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZG9tYWluIC0gVGhlIGNvb2tpZSBkb21haW4gdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgY29va2llIHBhdGggdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGNvb2tpZXMgaGF2ZSBiZWVuIHJlbW92ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgb3ZlcnJpZGUgcmVtb3ZlQ29va2llcyhcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IEVycm9yQ2FsbGJhY2ssXG4gICk6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBvdmVycmlkZSByZW1vdmVDb29raWVzKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBjYWxsYmFjaz86IEVycm9yQ2FsbGJhY2ssXG4gICk6IHVua25vd24ge1xuICAgIGNvbnN0IHByb21pc2VDYWxsYmFjayA9IGNyZWF0ZVByb21pc2VDYWxsYmFjazx1bmRlZmluZWQ+KGNhbGxiYWNrKVxuXG4gICAgY29uc3QgZG9tYWluRW50cnkgPSB0aGlzLmlkeFtkb21haW5dXG4gICAgaWYgKGRvbWFpbkVudHJ5KSB7XG4gICAgICBpZiAocGF0aCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICAgIGRlbGV0ZSBkb21haW5FbnRyeVtwYXRoXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgICBkZWxldGUgdGhpcy5pZHhbZG9tYWluXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVzb2x2ZSh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY29va2llcyBmcm9tIHRoZSBzdG9yZS5cbiAgICovXG4gIG92ZXJyaWRlIHJlbW92ZUFsbENvb2tpZXMoKTogUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY29va2llcyBmcm9tIHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYWxsIHRoZSBjb29raWVzIGhhdmUgYmVlbiByZW1vdmVkIG9yIGFuIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIG92ZXJyaWRlIHJlbW92ZUFsbENvb2tpZXMoY2FsbGJhY2s6IEVycm9yQ2FsbGJhY2spOiB2b2lkXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyBhbiBvdmVybG9hZCB0aGF0IHN1cHBvcnRzIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgcmVtb3ZlQWxsQ29va2llcyhjYWxsYmFjaz86IEVycm9yQ2FsbGJhY2spOiB1bmtub3duIHtcbiAgICBjb25zdCBwcm9taXNlQ2FsbGJhY2sgPSBjcmVhdGVQcm9taXNlQ2FsbGJhY2s8dW5kZWZpbmVkPihjYWxsYmFjaylcbiAgICB0aGlzLmlkeCA9IE9iamVjdC5jcmVhdGUobnVsbCkgYXMgTWVtb3J5Q29va2llU3RvcmVJbmRleFxuICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVzb2x2ZSh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIGNvb2tpZXMgaW4gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIENvb2tpZXMgU0hPVUxEIGJlIHJldHVybmVkIGluIGNyZWF0aW9uIG9yZGVyIHRvIHByZXNlcnZlIHNvcnRpbmcgdmlhIHtAbGluayBjb29raWVDb21wYXJlfS5cbiAgICovXG4gIG92ZXJyaWRlIGdldEFsbENvb2tpZXMoKTogUHJvbWlzZTxDb29raWVbXT5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBjb29raWVzIGluIHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBDb29raWVzIFNIT1VMRCBiZSByZXR1cm5lZCBpbiBjcmVhdGlvbiBvcmRlciB0byBwcmVzZXJ2ZSBzb3J0aW5nIHZpYSB7QGxpbmsgY29va2llQ29tcGFyZX0uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCB0aGUgY29va2llcyBoYXZlIGJlZW4gcmV0cmlldmVkIG9yIGFuIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIG92ZXJyaWRlIGdldEFsbENvb2tpZXMoY2FsbGJhY2s6IENhbGxiYWNrPENvb2tpZVtdPik6IHZvaWRcbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBvdmVycmlkZSBnZXRBbGxDb29raWVzKGNhbGxiYWNrPzogQ2FsbGJhY2s8Q29va2llW10+KTogdW5rbm93biB7XG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrPENvb2tpZVtdPihjYWxsYmFjaylcblxuICAgIGNvbnN0IGNvb2tpZXM6IENvb2tpZVtdID0gW11cbiAgICBjb25zdCBpZHggPSB0aGlzLmlkeFxuXG4gICAgY29uc3QgZG9tYWlucyA9IE9iamVjdC5rZXlzKGlkeClcbiAgICBkb21haW5zLmZvckVhY2goKGRvbWFpbikgPT4ge1xuICAgICAgY29uc3QgZG9tYWluRW50cnkgPSBpZHhbZG9tYWluXSA/PyB7fVxuICAgICAgY29uc3QgcGF0aHMgPSBPYmplY3Qua2V5cyhkb21haW5FbnRyeSlcbiAgICAgIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aEVudHJ5ID0gZG9tYWluRW50cnlbcGF0aF0gPz8ge31cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBhdGhFbnRyeSlcbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXlFbnRyeSA9IHBhdGhFbnRyeVtrZXldXG4gICAgICAgICAgaWYgKGtleUVudHJ5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvb2tpZXMucHVzaChrZXlFbnRyeSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBTb3J0IGJ5IGNyZWF0aW9uSW5kZXggc28gZGVzZXJpYWxpemluZyByZXRhaW5zIHRoZSBjcmVhdGlvbiBvcmRlci5cbiAgICAvLyBXaGVuIGltcGxlbWVudGluZyB5b3VyIG93biBzdG9yZSwgdGhpcyBTSE9VTEQgcmV0YWluIHRoZSBvcmRlciB0b29cbiAgICBjb29raWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiAoYS5jcmVhdGlvbkluZGV4IHx8IDApIC0gKGIuY3JlYXRpb25JbmRleCB8fCAwKVxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZUNhbGxiYWNrLnJlc29sdmUoY29va2llcylcbiAgfVxufVxuIiwgIi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuRXh0cmFjdGVkIGZyb20gY2hlY2stdHlwZXMuanNcbmh0dHBzOi8vZ2l0bGFiLmNvbS9waGlsYm9vdGgvY2hlY2stdHlwZXMuanNcblxuTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5IFBoaWwgQm9vdGhcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcblNPRlRXQVJFLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuaW1wb3J0IHsgQ2FsbGJhY2ssIG9iamVjdFRvU3RyaW5nLCBzYWZlVG9TdHJpbmcgfSBmcm9tICcuL3V0aWxzLmpzJ1xuXG4vKiBWYWxpZGF0aW9uIGZ1bmN0aW9ucyBjb3BpZWQgZnJvbSBjaGVjay10eXBlcyBwYWNrYWdlIC0gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY2hlY2stdHlwZXMgKi9cblxuLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBub24tZW1wdHkgc3RyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlTdHJpbmcoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNTdHJpbmcoZGF0YSkgJiYgZGF0YSAhPT0gJydcbn1cblxuLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSAqdmFsaWQqIERhdGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKGRhdGE6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiBEYXRlICYmIGlzSW50ZWdlcihkYXRhLmdldFRpbWUoKSlcbn1cblxuLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgdGhlIGVtcHR5IHN0cmluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5U3RyaW5nKGRhdGE6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGEgPT09ICcnIHx8IChkYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGRhdGEudG9TdHJpbmcoKSA9PT0gJycpXG59XG5cbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKGRhdGE6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyB8fCBkYXRhIGluc3RhbmNlb2YgU3RyaW5nXG59XG5cbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQgaXMgXCJbb2JqZWN0IE9iamVjdF1cIi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkYXRhKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cblxuLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYW4gaW50ZWdlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdudW1iZXInICYmIGRhdGEgJSAxID09PSAwXG59XG5cbi8qIC0tIEVuZCB2YWxpZGF0aW9uIGZ1bmN0aW9ucyAtLSAqL1xuXG4vKipcbiAqIFdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGZhbHNlLCBhbiBlcnJvciBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuIElmIGEgY2FsbGJhY2sgaXNcbiAqIHByb3ZpZGVkLCB0aGUgZXJyb3IgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaywgb3RoZXJ3aXNlIHRoZSBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZShcbiAgYm9vbDogYm9vbGVhbixcbiAgY2JPck1lc3NhZ2U/OiBDYWxsYmFjazxuZXZlcj4gfCBzdHJpbmcsXG4gIG1lc3NhZ2U/OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgaWYgKGJvb2wpIHJldHVybiAvLyBWYWxpZGF0aW9uIHBhc3Nlc1xuICBjb25zdCBjYiA9IHR5cGVvZiBjYk9yTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IGNiT3JNZXNzYWdlIDogdW5kZWZpbmVkXG4gIGxldCBvcHRpb25zID0gdHlwZW9mIGNiT3JNZXNzYWdlID09PSAnZnVuY3Rpb24nID8gbWVzc2FnZSA6IGNiT3JNZXNzYWdlXG4gIC8vIFRoZSBkZWZhdWx0IG1lc3NhZ2UgcHJpb3IgdG8gdjUgd2FzICdbb2JqZWN0IE9iamVjdF0nIGR1ZSB0byBhIGJ1ZywgYW5kIHRoZSBtZXNzYWdlIGlzIGtlcHRcbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSBvcHRpb25zID0gJ1tvYmplY3QgT2JqZWN0XSdcblxuICBjb25zdCBlcnIgPSBuZXcgUGFyYW1ldGVyRXJyb3Ioc2FmZVRvU3RyaW5nKG9wdGlvbnMpKVxuICBpZiAoY2IpIGNiKGVycilcbiAgZWxzZSB0aHJvdyBlcnJcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdmFsaWRhdGlvbiBlcnJvci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckVycm9yIGV4dGVuZHMgRXJyb3Ige31cbiIsICIvKipcbiAqIFRoZSB2ZXJzaW9uIG9mIGB0b3VnaC1jb29raWVgXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzYuMC4wJ1xuIiwgIi8qKlxuICogQ29va2llIHByZWZpeGVzIGFyZSBhIHdheSB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gY29va2llIHdhcyBzZXQgd2l0aCBhIHNldCBvZiBhdHRyaWJ1dGVzIHNpbXBseSBieSBpbnNwZWN0aW5nIHRoZVxuICogZmlyc3QgZmV3IGNoYXJhY3RlcnMgb2YgdGhlIGNvb2tpZSdzIG5hbWUuIFRoZXNlIGFyZSBkZWZpbmVkIGluIHtAbGluayBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzLTEzI3NlY3Rpb24tNC4xLjMgfCBSRkM2MjY1YmlzIC0gU2VjdGlvbiA0LjEuM30uXG4gKlxuICogVGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGhvdyBhIHtAbGluayBDb29raWVKYXJ9IGVuZm9yY2VzIGF0dHJpYnV0ZSByZXN0cmljdGlvbnMgZm9yIENvb2tpZSBwcmVmaXhlczpcbiAqXG4gKiAtIGBzaWxlbnRgIC0gRW5hYmxlIGNvb2tpZSBwcmVmaXggY2hlY2tpbmcgYnV0IHNpbGVudGx5IGlnbm9yZXMgdGhlIGNvb2tpZSBpZiBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGEge0BsaW5rIENvb2tpZUphcn0uXG4gKlxuICogLSBgc3RyaWN0YCAtIEVuYWJsZXMgY29va2llIHByZWZpeCBjaGVja2luZyBhbmQgd2lsbCByYWlzZSBhbiBlcnJvciBpZiBjb25kaXRpb25zIGFyZSBub3QgbWV0LlxuICpcbiAqIC0gYHVuc2FmZS1kaXNhYmxlZGAgLSBEaXNhYmxlcyBjb29raWUgcHJlZml4IGNoZWNraW5nLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUHJlZml4U2VjdXJpdHlFbnVtID0ge1xuICBTSUxFTlQ6ICdzaWxlbnQnLFxuICBTVFJJQ1Q6ICdzdHJpY3QnLFxuICBESVNBQkxFRDogJ3Vuc2FmZS1kaXNhYmxlZCcsXG59IGFzIGNvbnN0XG5PYmplY3QuZnJlZXplKFByZWZpeFNlY3VyaXR5RW51bSlcblxuY29uc3QgSVBfVjZfUkVHRVggPSBgXG5cXFxcWz8oPzpcbig/OlthLWZBLUZcXFxcZF17MSw0fTopezd9KD86W2EtZkEtRlxcXFxkXXsxLDR9fDopfFxuKD86W2EtZkEtRlxcXFxkXXsxLDR9Oil7Nn0oPzooPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfXw6W2EtZkEtRlxcXFxkXXsxLDR9fDopfFxuKD86W2EtZkEtRlxcXFxkXXsxLDR9Oil7NX0oPzo6KD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M318KD86OlthLWZBLUZcXFxcZF17MSw0fSl7MSwyfXw6KXxcbig/OlthLWZBLUZcXFxcZF17MSw0fTopezR9KD86KD86OlthLWZBLUZcXFxcZF17MSw0fSl7MCwxfTooPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfXwoPzo6W2EtZkEtRlxcXFxkXXsxLDR9KXsxLDN9fDopfFxuKD86W2EtZkEtRlxcXFxkXXsxLDR9Oil7M30oPzooPzo6W2EtZkEtRlxcXFxkXXsxLDR9KXswLDJ9Oig/OjI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxcXFxcZCkoPzpcXFxcLig/OjI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxcXFxcZCkpezN9fCg/OjpbYS1mQS1GXFxcXGRdezEsNH0pezEsNH18Oil8XG4oPzpbYS1mQS1GXFxcXGRdezEsNH06KXsyfSg/Oig/OjpbYS1mQS1GXFxcXGRdezEsNH0pezAsM306KD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M318KD86OlthLWZBLUZcXFxcZF17MSw0fSl7MSw1fXw6KXxcbig/OlthLWZBLUZcXFxcZF17MSw0fTopezF9KD86KD86OlthLWZBLUZcXFxcZF17MSw0fSl7MCw0fTooPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfXwoPzo6W2EtZkEtRlxcXFxkXXsxLDR9KXsxLDZ9fDopfFxuKD86Oig/Oig/OjpbYS1mQS1GXFxcXGRdezEsNH0pezAsNX06KD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M318KD86OlthLWZBLUZcXFxcZF17MSw0fSl7MSw3fXw6KSlcbikoPzolWzAtOWEtekEtWl17MSx9KT9cXFxcXT9cbmBcbiAgLnJlcGxhY2UoL1xccypcXC9cXC8uKiQvZ20sICcnKVxuICAucmVwbGFjZSgvXFxuL2csICcnKVxuICAudHJpbSgpXG5leHBvcnQgY29uc3QgSVBfVjZfUkVHRVhfT0JKRUNUOiBSZWdFeHAgPSBuZXcgUmVnRXhwKGBeJHtJUF9WNl9SRUdFWH0kYClcblxuY29uc3QgSVBfVjRfUkVHRVggPSBgKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlgXG5leHBvcnQgY29uc3QgSVBfVjRfUkVHRVhfT0JKRUNUOiBSZWdFeHAgPSBuZXcgUmVnRXhwKGBeJHtJUF9WNF9SRUdFWH0kYClcblxuLyoqXG4gKiBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgQ29va2llSmFyfS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkQ29va2llSmFyIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIGB0b3VnaC1jb29raWVgIHVzZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB1c2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLlxuICAgKi9cbiAgc3RvcmVUeXBlOiBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2Yge0BsaW5rIENyZWF0ZUNvb2tpZUphck9wdGlvbnMucmVqZWN0UHVibGljU3VmZml4ZXN9IGNvbmZpZ3VyZWQgb24gdGhlIHtAbGluayBDb29raWVKYXJ9LlxuICAgKi9cbiAgcmVqZWN0UHVibGljU3VmZml4ZXM6IGJvb2xlYW5cbiAgLyoqXG4gICAqIE90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgb24gdGhlIHtAbGluayBDb29raWVKYXJ9LlxuICAgKi9cbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Yge0BsaW5rIENvb2tpZX0gdmFsdWVzIHNlcmlhbGl6ZWQgYXMgSlNPTiBvYmplY3RzLlxuICAgKi9cbiAgY29va2llczogU2VyaWFsaXplZENvb2tpZVtdXG59XG5cbi8qKlxuICogQSBKU09OIG9iamVjdCB0aGF0IGlzIGNyZWF0ZWQgd2hlbiB7QGxpbmsgQ29va2llLnRvSlNPTn0gaXMgY2FsbGVkLiBUaGlzIG9iamVjdCB3aWxsIGNvbnRhaW4gdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB7QGxpbmsgQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXN9LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkQ29va2llID0ge1xuICBrZXk/OiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuIiwgImltcG9ydCB7IElQX1Y2X1JFR0VYX09CSkVDVCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3V0aWxzLmpzJ1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkb21haW4gdG8gbG93ZXJjYXNlIGFuZCBwdW55Y29kZS1lbmNvZGVkLlxuICogUnVudGltZS1hZ25vc3RpYyBlcXVpdmFsZW50IHRvIG5vZGUncyBgZG9tYWluVG9BU0NJSWAuXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9kb2NzL2xhdGVzdC12MjIueC9hcGkvdXJsLmh0bWwjdXJsZG9tYWludG9hc2NpaWRvbWFpblxuICovXG5mdW5jdGlvbiBkb21haW5Ub0FTQ0lJKGRvbWFpbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoYGh0dHA6Ly8ke2RvbWFpbn1gKS5ob3N0bmFtZVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBkb21haW4gbmFtZSBpbnRvIGEgY2Fub25pY2FsIGRvbWFpbiBuYW1lLiBUaGUgY2Fub25pY2FsIGRvbWFpbiBuYW1lIGlzIGEgZG9tYWluIG5hbWVcbiAqIHRoYXQgaGFzIGJlZW4gdHJpbW1lZCwgbG93ZXJjYXNlZCwgc3RyaXBwZWQgb2YgbGVhZGluZyBkb3QsIGFuZCBvcHRpb25hbGx5IHB1bnljb2RlLWVuY29kZWRcbiAqICh7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMS4yIHwgU2VjdGlvbiA1LjEuMiBvZiBSRkMgNjI2NX0pLiBGb3JcbiAqIHRoZSBtb3N0IHBhcnQsIHRoaXMgZnVuY3Rpb24gaXMgaWRlbXBvdGVudCAoY2FsbGluZyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgb3V0cHV0IGZyb20gYSBwcmV2aW91cyBjYWxsXG4gKiByZXR1cm5zIHRoZSBzYW1lIG91dHB1dCkuXG4gKlxuICogQHJlbWFya3NcbiAqIEEgY2Fub25pY2FsaXplZCBob3N0IG5hbWUgaXMgdGhlIHN0cmluZyBnZW5lcmF0ZWQgYnkgdGhlIGZvbGxvd2luZ1xuICogYWxnb3JpdGhtOlxuICpcbiAqIDEuICBDb252ZXJ0IHRoZSBob3N0IG5hbWUgdG8gYSBzZXF1ZW5jZSBvZiBpbmRpdmlkdWFsIGRvbWFpbiBuYW1lXG4gKiAgICAgbGFiZWxzLlxuICpcbiAqIDIuICBDb252ZXJ0IGVhY2ggbGFiZWwgdGhhdCBpcyBub3QgYSBOb24tUmVzZXJ2ZWQgTERIIChOUi1MREgpIGxhYmVsLFxuICogICAgIHRvIGFuIEEtbGFiZWwgKHNlZSBTZWN0aW9uIDIuMy4yLjEgb2YgW1JGQzU4OTBdIGZvciB0aGUgZm9ybWVyXG4gKiAgICAgYW5kIGxhdHRlciksIG9yIHRvIGEgXCJwdW55Y29kZSBsYWJlbFwiIChhIGxhYmVsIHJlc3VsdGluZyBmcm9tIHRoZVxuICogICAgIFwiVG9BU0NJSVwiIGNvbnZlcnNpb24gaW4gU2VjdGlvbiA0IG9mIFtSRkMzNDkwXSksIGFzIGFwcHJvcHJpYXRlXG4gKiAgICAgKHNlZSBTZWN0aW9uIDYuMyBvZiB0aGlzIHNwZWNpZmljYXRpb24pLlxuICpcbiAqIDMuICBDb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIGxhYmVscywgc2VwYXJhdGVkIGJ5IGEgJXgyRSAoXCIuXCIpXG4gKiAgICAgY2hhcmFjdGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGNhbm9uaWNhbERvbWFpbignLkVYQU1QTEUuY29tJykgPT09ICdleGFtcGxlLmNvbSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBkb21haW5OYW1lIC0gdGhlIGRvbWFpbiBuYW1lIHRvIGdlbmVyYXRlIHRoZSBjYW5vbmljYWwgZG9tYWluIGZyb21cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbm9uaWNhbERvbWFpbihcbiAgZG9tYWluTmFtZTogTnVsbGFibGU8c3RyaW5nPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChkb21haW5OYW1lID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgbGV0IHN0ciA9IGRvbWFpbk5hbWUudHJpbSgpLnJlcGxhY2UoL15cXC4vLCAnJykgLy8gUzQuMS4yLjMgJiBTNS4yLjM6IGlnbm9yZSBsZWFkaW5nIC5cblxuICBpZiAoSVBfVjZfUkVHRVhfT0JKRUNULnRlc3Qoc3RyKSkge1xuICAgIGlmICghc3RyLnN0YXJ0c1dpdGgoJ1snKSkge1xuICAgICAgc3RyID0gJ1snICsgc3RyXG4gICAgfVxuICAgIGlmICghc3RyLmVuZHNXaXRoKCddJykpIHtcbiAgICAgIHN0ciA9IHN0ciArICddJ1xuICAgIH1cbiAgICByZXR1cm4gZG9tYWluVG9BU0NJSShzdHIpLnNsaWNlKDEsIC0xKSAvLyByZW1vdmUgWyBhbmQgXVxuICB9XG5cbiAgLy8gY29udmVydCB0byBJRE4gaWYgYW55IG5vbi1BU0NJSSBjaGFyYWN0ZXJzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gIGlmICgvW15cXHUwMDAxLVxcdTAwN2ZdLy50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gZG9tYWluVG9BU0NJSShzdHIpXG4gIH1cblxuICAvLyBBU0NJSS1vbmx5IGRvbWFpbiAtIG5vdCBjYW5vbmljYWxpemVkIHdpdGggbmV3IFVSTCgpIGJlY2F1c2UgaXQgbWF5IGJlIGEgbWFsZm9ybWVkIFVSTFxuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKClcbn1cbiIsICIvKipcbiAqIEZvcm1hdCBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlIHwgRGF0ZX0gaW50b1xuICogdGhlIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMjYxNiNzZWN0aW9uLTMuMy4xIHwgcHJlZmVycmVkIEludGVybmV0IHN0YW5kYXJkIGZvcm1hdH1cbiAqIGRlZmluZWQgaW4ge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM4MjIjc2VjdGlvbi01IHwgUkZDODIyfSBhbmRcbiAqIHVwZGF0ZWQgaW4ge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMxMTIzI3BhZ2UtNTUgfCBSRkMxMTIzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiBmb3JtYXREYXRlKG5ldyBEYXRlKDApKSA9PT0gJ1RodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UYFxuICogYGBgXG4gKlxuICogQHBhcmFtIGRhdGUgLSB0aGUgZGF0ZSB2YWx1ZSB0byBmb3JtYXRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gIHJldHVybiBkYXRlLnRvVVRDU3RyaW5nKClcbn1cbiIsICIvLyBkYXRlLXRpbWUgcGFyc2luZyBjb25zdGFudHMgKFJGQzYyNjUgUzUuMS4xKVxuXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnLi4vdXRpbHMuanMnXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBEQVRFX0RFTElNID0gL1tcXHgwOVxceDIwLVxceDJGXFx4M0ItXFx4NDBcXHg1Qi1cXHg2MFxceDdCLVxceDdFXS9cblxuY29uc3QgTU9OVEhfVE9fTlVNID0ge1xuICBqYW46IDAsXG4gIGZlYjogMSxcbiAgbWFyOiAyLFxuICBhcHI6IDMsXG4gIG1heTogNCxcbiAganVuOiA1LFxuICBqdWw6IDYsXG4gIGF1ZzogNyxcbiAgc2VwOiA4LFxuICBvY3Q6IDksXG4gIG5vdjogMTAsXG4gIGRlYzogMTEsXG59XG5cbi8qXG4gKiBQYXJzZXMgYSBOYXR1cmFsIG51bWJlciAoaS5lLiwgbm9uLW5lZ2F0aXZlIGludGVnZXIpIHdpdGggZWl0aGVyIHRoZVxuICogICAgPG1pbj4qPG1heD5ESUdJVCAoIG5vbi1kaWdpdCAqT0NURVQgKVxuICogb3JcbiAqICAgIDxtaW4+KjxtYXg+RElHSVRcbiAqIGdyYW1tYXIgKFJGQzYyNjUgUzUuMS4xKS5cbiAqXG4gKiBUaGUgXCJ0cmFpbGluZ09LXCIgYm9vbGVhbiBjb250cm9scyBpZiB0aGUgZ3JhbW1hciBhY2NlcHRzIGFcbiAqIFwiKCBub24tZGlnaXQgKk9DVEVUIClcIiB0cmFpbGVyLlxuICovXG5mdW5jdGlvbiBwYXJzZURpZ2l0cyhcbiAgdG9rZW46IHN0cmluZyxcbiAgbWluRGlnaXRzOiBudW1iZXIsXG4gIG1heERpZ2l0czogbnVtYmVyLFxuICB0cmFpbGluZ09LOiBib29sZWFuLFxuKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGNvdW50ID0gMFxuICB3aGlsZSAoY291bnQgPCB0b2tlbi5sZW5ndGgpIHtcbiAgICBjb25zdCBjID0gdG9rZW4uY2hhckNvZGVBdChjb3VudClcbiAgICAvLyBcIm5vbi1kaWdpdCA9ICV4MDAtMkYgLyAleDNBLUZGXCJcbiAgICBpZiAoYyA8PSAweDJmIHx8IGMgPj0gMHgzYSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY291bnQrK1xuICB9XG5cbiAgLy8gY29uc3RyYWluIHRvIGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzLlxuICBpZiAoY291bnQgPCBtaW5EaWdpdHMgfHwgY291bnQgPiBtYXhEaWdpdHMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICghdHJhaWxpbmdPSyAmJiBjb3VudCAhPSB0b2tlbi5sZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHJldHVybiBwYXJzZUludCh0b2tlbi5zbGljZSgwLCBjb3VudCksIDEwKVxufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWUodG9rZW46IHN0cmluZyk6IG51bWJlcltdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnOicpXG4gIGNvbnN0IHJlc3VsdCA9IFswLCAwLCAwXVxuXG4gIC8qIFJGNjI1NiBTNS4xLjE6XG4gICAqICAgICAgdGltZSAgICAgICAgICAgID0gaG1zLXRpbWUgKCBub24tZGlnaXQgKk9DVEVUIClcbiAgICogICAgICBobXMtdGltZSAgICAgICAgPSB0aW1lLWZpZWxkIFwiOlwiIHRpbWUtZmllbGQgXCI6XCIgdGltZS1maWVsZFxuICAgKiAgICAgIHRpbWUtZmllbGQgICAgICA9IDEqMkRJR0lUXG4gICAqL1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgLy8gXCJ0aW1lLWZpZWxkXCIgbXVzdCBiZSBzdHJpY3RseSBcIjEqMkRJR0lUXCIsIEhPV0VWRVIsIFwiaG1zLXRpbWVcIiBjYW4gYmVcbiAgICAvLyBmb2xsb3dlZCBieSBcIiggbm9uLWRpZ2l0ICpPQ1RFVCApXCIgdGhlcmVmb3JlIHRoZSBsYXN0IHRpbWUtZmllbGQgY2FuXG4gICAgLy8gaGF2ZSBhIHRyYWlsZXJcbiAgICBjb25zdCB0cmFpbGluZ09LID0gaSA9PSAyXG4gICAgY29uc3QgbnVtUGFydCA9IHBhcnRzW2ldXG4gICAgaWYgKG51bVBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG51bSA9IHBhcnNlRGlnaXRzKG51bVBhcnQsIDEsIDIsIHRyYWlsaW5nT0spXG4gICAgaWYgKG51bSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmVzdWx0W2ldID0gbnVtXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9udGgodG9rZW46IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHRva2VuID0gU3RyaW5nKHRva2VuKS5zbGljZSgwLCAzKS50b0xvd2VyQ2FzZSgpXG4gIHN3aXRjaCAodG9rZW4pIHtcbiAgICBjYXNlICdqYW4nOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5qYW5cbiAgICBjYXNlICdmZWInOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5mZWJcbiAgICBjYXNlICdtYXInOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5tYXJcbiAgICBjYXNlICdhcHInOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5hcHJcbiAgICBjYXNlICdtYXknOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5tYXlcbiAgICBjYXNlICdqdW4nOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5qdW5cbiAgICBjYXNlICdqdWwnOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5qdWxcbiAgICBjYXNlICdhdWcnOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5hdWdcbiAgICBjYXNlICdzZXAnOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5zZXBcbiAgICBjYXNlICdvY3QnOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5vY3RcbiAgICBjYXNlICdub3YnOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5ub3ZcbiAgICBjYXNlICdkZWMnOlxuICAgICAgcmV0dXJuIE1PTlRIX1RPX05VTS5kZWNcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGNvb2tpZSBkYXRlIHN0cmluZyBpbnRvIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUgfCBEYXRlfS4gUGFyc2VzIGFjY29yZGluZyB0b1xuICoge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwjc2VjdGlvbi01LjEuMSB8IFJGQzYyNjUgLSBTZWN0aW9uIDUuMS4xfSwgbm90XG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS9wYXJzZSB8IERhdGUucGFyc2UoKX0uXG4gKlxuICogQHJlbWFya3NcbiAqXG4gKiAjIyMgUkZDNjI2NSAtIDUuMS4xLiBEYXRlc1xuICpcbiAqIFRoZSB1c2VyIGFnZW50IE1VU1QgdXNlIGFuIGFsZ29yaXRobSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmdcbiAqIGFsZ29yaXRobSB0byBwYXJzZSBhIGNvb2tpZS1kYXRlLiAgTm90ZSB0aGF0IHRoZSB2YXJpb3VzIGJvb2xlYW5cbiAqIGZsYWdzIGRlZmluZWQgYXMgYSBwYXJ0IG9mIHRoZSBhbGdvcml0aG0gKGkuZS4sIGZvdW5kLXRpbWUsIGZvdW5kLVxuICogZGF5LW9mLW1vbnRoLCBmb3VuZC1tb250aCwgZm91bmQteWVhcikgYXJlIGluaXRpYWxseSBcIm5vdCBzZXRcIi5cbiAqXG4gKiAxLiAgVXNpbmcgdGhlIGdyYW1tYXIgYmVsb3csIGRpdmlkZSB0aGUgY29va2llLWRhdGUgaW50byBkYXRlLXRva2Vucy5cbiAqXG4gKiBgYGBcbiAqICAgICBjb29raWUtZGF0ZSAgICAgPSAqZGVsaW1pdGVyIGRhdGUtdG9rZW4tbGlzdCAqZGVsaW1pdGVyXG4gKiAgICAgZGF0ZS10b2tlbi1saXN0ID0gZGF0ZS10b2tlbiAqKCAxKmRlbGltaXRlciBkYXRlLXRva2VuIClcbiAqICAgICBkYXRlLXRva2VuICAgICAgPSAxKm5vbi1kZWxpbWl0ZXJcbiAqXG4gKiAgICAgZGVsaW1pdGVyICAgICAgID0gJXgwOSAvICV4MjAtMkYgLyAleDNCLTQwIC8gJXg1Qi02MCAvICV4N0ItN0VcbiAqICAgICBub24tZGVsaW1pdGVyICAgPSAleDAwLTA4IC8gJXgwQS0xRiAvIERJR0lUIC8gXCI6XCIgLyBBTFBIQSAvICV4N0YtRkZcbiAqICAgICBub24tZGlnaXQgICAgICAgPSAleDAwLTJGIC8gJXgzQS1GRlxuICpcbiAqICAgICBkYXktb2YtbW9udGggICAgPSAxKjJESUdJVCAoIG5vbi1kaWdpdCAqT0NURVQgKVxuICogICAgIG1vbnRoICAgICAgICAgICA9ICggXCJqYW5cIiAvIFwiZmViXCIgLyBcIm1hclwiIC8gXCJhcHJcIiAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwibWF5XCIgLyBcImp1blwiIC8gXCJqdWxcIiAvIFwiYXVnXCIgL1xuICogICAgICAgICAgICAgICAgICAgICAgICBcInNlcFwiIC8gXCJvY3RcIiAvIFwibm92XCIgLyBcImRlY1wiICkgKk9DVEVUXG4gKiAgICAgeWVhciAgICAgICAgICAgID0gMio0RElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcbiAqICAgICB0aW1lICAgICAgICAgICAgPSBobXMtdGltZSAoIG5vbi1kaWdpdCAqT0NURVQgKVxuICogICAgIGhtcy10aW1lICAgICAgICA9IHRpbWUtZmllbGQgXCI6XCIgdGltZS1maWVsZCBcIjpcIiB0aW1lLWZpZWxkXG4gKiAgICAgdGltZS1maWVsZCAgICAgID0gMSoyRElHSVRcbiAqIGBgYFxuICpcbiAqIDIuIFByb2Nlc3MgZWFjaCBkYXRlLXRva2VuIHNlcXVlbnRpYWxseSBpbiB0aGUgb3JkZXIgdGhlIGRhdGUtdG9rZW5zXG4gKiAgICAgYXBwZWFyIGluIHRoZSBjb29raWUtZGF0ZTpcbiAqXG4gKiAgICAgMS4gSWYgdGhlIGZvdW5kLXRpbWUgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgdG9rZW4gbWF0Y2hlcyB0aGVcbiAqICAgICAgICAgdGltZSBwcm9kdWN0aW9uLCBzZXQgdGhlIGZvdW5kLXRpbWUgZmxhZyBhbmQgc2V0IHRoZSBob3VyLVxuICogICAgICAgICB2YWx1ZSwgbWludXRlLXZhbHVlLCBhbmQgc2Vjb25kLXZhbHVlIHRvIHRoZSBudW1iZXJzIGRlbm90ZWRcbiAqICAgICAgICAgYnkgdGhlIGRpZ2l0cyBpbiB0aGUgZGF0ZS10b2tlbiwgcmVzcGVjdGl2ZWx5LiAgU2tpcCB0aGVcbiAqICAgICAgICAgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmQgY29udGludWUgdG8gdGhlIG5leHQgZGF0ZS10b2tlbi5cbiAqXG4gKiAgICAgMi4gSWYgdGhlIGZvdW5kLWRheS1vZi1tb250aCBmbGFnIGlzIG5vdCBzZXQgYW5kIHRoZSBkYXRlLXRva2VuXG4gKiAgICAgICAgIG1hdGNoZXMgdGhlIGRheS1vZi1tb250aCBwcm9kdWN0aW9uLCBzZXQgdGhlIGZvdW5kLWRheS1vZi1cbiAqICAgICAgICAgbW9udGggZmxhZyBhbmQgc2V0IHRoZSBkYXktb2YtbW9udGgtdmFsdWUgdG8gdGhlIG51bWJlclxuICogICAgICAgICBkZW5vdGVkIGJ5IHRoZSBkYXRlLXRva2VuLiAgU2tpcCB0aGUgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmRcbiAqICAgICAgICAgY29udGludWUgdG8gdGhlIG5leHQgZGF0ZS10b2tlbi5cbiAqXG4gKiAgICAgMy4gSWYgdGhlIGZvdW5kLW1vbnRoIGZsYWcgaXMgbm90IHNldCBhbmQgdGhlIGRhdGUtdG9rZW4gbWF0Y2hlc1xuICogICAgICAgICB0aGUgbW9udGggcHJvZHVjdGlvbiwgc2V0IHRoZSBmb3VuZC1tb250aCBmbGFnIGFuZCBzZXQgdGhlXG4gKiAgICAgICAgIG1vbnRoLXZhbHVlIHRvIHRoZSBtb250aCBkZW5vdGVkIGJ5IHRoZSBkYXRlLXRva2VuLiAgU2tpcCB0aGVcbiAqICAgICAgICAgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmQgY29udGludWUgdG8gdGhlIG5leHQgZGF0ZS10b2tlbi5cbiAqXG4gKiAgICAgNC4gSWYgdGhlIGZvdW5kLXllYXIgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzXG4gKiAgICAgICAgIHRoZSB5ZWFyIHByb2R1Y3Rpb24sIHNldCB0aGUgZm91bmQteWVhciBmbGFnIGFuZCBzZXQgdGhlXG4gKiAgICAgICAgIHllYXItdmFsdWUgdG8gdGhlIG51bWJlciBkZW5vdGVkIGJ5IHRoZSBkYXRlLXRva2VuLiAgU2tpcCB0aGVcbiAqICAgICAgICAgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmQgY29udGludWUgdG8gdGhlIG5leHQgZGF0ZS10b2tlbi5cbiAqXG4gKiAgMy4gSWYgdGhlIHllYXItdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDcwIGFuZCBsZXNzIHRoYW4gb3JcbiAqICAgICAgZXF1YWwgdG8gOTksIGluY3JlbWVudCB0aGUgeWVhci12YWx1ZSBieSAxOTAwLlxuICpcbiAqICA0LiBJZiB0aGUgeWVhci12YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIG9yXG4gKiAgICAgIGVxdWFsIHRvIDY5LCBpbmNyZW1lbnQgdGhlIHllYXItdmFsdWUgYnkgMjAwMC5cbiAqXG4gKiAgICAgIDEuIE5PVEU6IFNvbWUgZXhpc3RpbmcgdXNlciBhZ2VudHMgaW50ZXJwcmV0IHR3by1kaWdpdCB5ZWFycyBkaWZmZXJlbnRseS5cbiAqXG4gKiAgNS4gQWJvcnQgdGhlc2Ugc3RlcHMgYW5kIGZhaWwgdG8gcGFyc2UgdGhlIGNvb2tpZS1kYXRlIGlmOlxuICpcbiAqICAgICAgLSBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvdW5kLWRheS1vZi1tb250aCwgZm91bmQtbW9udGgsIGZvdW5kLVxuICogICAgICAgICAgeWVhciwgb3IgZm91bmQtdGltZSBmbGFncyBpcyBub3Qgc2V0LFxuICpcbiAqICAgICAgLSB0aGUgZGF5LW9mLW1vbnRoLXZhbHVlIGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiAzMSxcbiAqXG4gKiAgICAgIC0gdGhlIHllYXItdmFsdWUgaXMgbGVzcyB0aGFuIDE2MDEsXG4gKlxuICogICAgICAtIHRoZSBob3VyLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAyMyxcbiAqXG4gKiAgICAgIC0gdGhlIG1pbnV0ZS12YWx1ZSBpcyBncmVhdGVyIHRoYW4gNTksIG9yXG4gKlxuICogICAgICAtIHRoZSBzZWNvbmQtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDU5LlxuICpcbiAqICAgICAgKE5vdGUgdGhhdCBsZWFwIHNlY29uZHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIHRoaXMgc3ludGF4LilcbiAqXG4gKiAgNi4gTGV0IHRoZSBwYXJzZWQtY29va2llLWRhdGUgYmUgdGhlIGRhdGUgd2hvc2UgZGF5LW9mLW1vbnRoLCBtb250aCxcbiAqICAgICAgeWVhciwgaG91ciwgbWludXRlLCBhbmQgc2Vjb25kIChpbiBVVEMpIGFyZSB0aGUgZGF5LW9mLW1vbnRoLVxuICogICAgICB2YWx1ZSwgdGhlIG1vbnRoLXZhbHVlLCB0aGUgeWVhci12YWx1ZSwgdGhlIGhvdXItdmFsdWUsIHRoZVxuICogICAgICBtaW51dGUtdmFsdWUsIGFuZCB0aGUgc2Vjb25kLXZhbHVlLCByZXNwZWN0aXZlbHkuICBJZiBubyBzdWNoXG4gKiAgICAgIGRhdGUgZXhpc3RzLCBhYm9ydCB0aGVzZSBzdGVwcyBhbmQgZmFpbCB0byBwYXJzZSB0aGUgY29va2llLWRhdGUuXG4gKlxuICogIDcuIFJldHVybiB0aGUgcGFyc2VkLWNvb2tpZS1kYXRlIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhbGdvcml0aG0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogcGFyc2VEYXRlKCdXZWQsIDA5IEp1biAyMDIxIDEwOjE4OjE0IEdNVCcpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29va2llRGF0ZSAtIHRoZSBjb29raWUgZGF0ZSBzdHJpbmdcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZShjb29raWVEYXRlOiBOdWxsYWJsZTxzdHJpbmc+KTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29va2llRGF0ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyogUkZDNjI2NSBTNS4xLjE6XG4gICAqIDIuIFByb2Nlc3MgZWFjaCBkYXRlLXRva2VuIHNlcXVlbnRpYWxseSBpbiB0aGUgb3JkZXIgdGhlIGRhdGUtdG9rZW5zXG4gICAqIGFwcGVhciBpbiB0aGUgY29va2llLWRhdGVcbiAgICovXG4gIGNvbnN0IHRva2VucyA9IGNvb2tpZURhdGUuc3BsaXQoREFURV9ERUxJTSlcblxuICBsZXQgaG91cjogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIGxldCBtaW51dGU6IG51bWJlciB8IHVuZGVmaW5lZFxuICBsZXQgc2Vjb25kOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgbGV0IGRheU9mTW9udGg6IG51bWJlciB8IHVuZGVmaW5lZFxuICBsZXQgbW9udGg6IG51bWJlciB8IHVuZGVmaW5lZFxuICBsZXQgeWVhcjogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9ICh0b2tlbnNbaV0gPz8gJycpLnRyaW0oKVxuICAgIGlmICghdG9rZW4ubGVuZ3RoKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8qIDIuMS4gSWYgdGhlIGZvdW5kLXRpbWUgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgdG9rZW4gbWF0Y2hlcyB0aGUgdGltZVxuICAgICAqIHByb2R1Y3Rpb24sIHNldCB0aGUgZm91bmQtdGltZSBmbGFnIGFuZCBzZXQgdGhlIGhvdXItIHZhbHVlLFxuICAgICAqIG1pbnV0ZS12YWx1ZSwgYW5kIHNlY29uZC12YWx1ZSB0byB0aGUgbnVtYmVycyBkZW5vdGVkIGJ5IHRoZSBkaWdpdHMgaW5cbiAgICAgKiB0aGUgZGF0ZS10b2tlbiwgcmVzcGVjdGl2ZWx5LiAgU2tpcCB0aGUgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmQgY29udGludWVcbiAgICAgKiB0byB0aGUgbmV4dCBkYXRlLXRva2VuLlxuICAgICAqL1xuICAgIGlmIChzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VUaW1lKHRva2VuKVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBob3VyID0gcmVzdWx0WzBdXG4gICAgICAgIG1pbnV0ZSA9IHJlc3VsdFsxXVxuICAgICAgICBzZWNvbmQgPSByZXN1bHRbMl1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiAyLjIuIElmIHRoZSBmb3VuZC1kYXktb2YtbW9udGggZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzXG4gICAgICogdGhlIGRheS1vZi1tb250aCBwcm9kdWN0aW9uLCBzZXQgdGhlIGZvdW5kLWRheS1vZi0gbW9udGggZmxhZyBhbmQgc2V0XG4gICAgICogdGhlIGRheS1vZi1tb250aC12YWx1ZSB0byB0aGUgbnVtYmVyIGRlbm90ZWQgYnkgdGhlIGRhdGUtdG9rZW4uICBTa2lwXG4gICAgICogdGhlIHJlbWFpbmluZyBzdWItc3RlcHMgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGRhdGUtdG9rZW4uXG4gICAgICovXG4gICAgaWYgKGRheU9mTW9udGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gXCJkYXktb2YtbW9udGggPSAxKjJESUdJVCAoIG5vbi1kaWdpdCAqT0NURVQgKVwiXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZURpZ2l0cyh0b2tlbiwgMSwgMiwgdHJ1ZSlcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkYXlPZk1vbnRoID0gcmVzdWx0XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogMi4zLiBJZiB0aGUgZm91bmQtbW9udGggZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzIHRoZVxuICAgICAqIG1vbnRoIHByb2R1Y3Rpb24sIHNldCB0aGUgZm91bmQtbW9udGggZmxhZyBhbmQgc2V0IHRoZSBtb250aC12YWx1ZSB0b1xuICAgICAqIHRoZSBtb250aCBkZW5vdGVkIGJ5IHRoZSBkYXRlLXRva2VuLiAgU2tpcCB0aGUgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmRcbiAgICAgKiBjb250aW51ZSB0byB0aGUgbmV4dCBkYXRlLXRva2VuLlxuICAgICAqL1xuICAgIGlmIChtb250aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZU1vbnRoKHRva2VuKVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1vbnRoID0gcmVzdWx0XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogMi40LiBJZiB0aGUgZm91bmQteWVhciBmbGFnIGlzIG5vdCBzZXQgYW5kIHRoZSBkYXRlLXRva2VuIG1hdGNoZXMgdGhlXG4gICAgICogeWVhciBwcm9kdWN0aW9uLCBzZXQgdGhlIGZvdW5kLXllYXIgZmxhZyBhbmQgc2V0IHRoZSB5ZWFyLXZhbHVlIHRvIHRoZVxuICAgICAqIG51bWJlciBkZW5vdGVkIGJ5IHRoZSBkYXRlLXRva2VuLiAgU2tpcCB0aGUgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmRcbiAgICAgKiBjb250aW51ZSB0byB0aGUgbmV4dCBkYXRlLXRva2VuLlxuICAgICAqL1xuICAgIGlmICh5ZWFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFwieWVhciA9IDIqNERJR0lUICggbm9uLWRpZ2l0ICpPQ1RFVCApXCJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRGlnaXRzKHRva2VuLCAyLCA0LCB0cnVlKVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHllYXIgPSByZXN1bHRcbiAgICAgICAgLyogRnJvbSBTNS4xLjE6XG4gICAgICAgICAqIDMuICBJZiB0aGUgeWVhci12YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNzAgYW5kIGxlc3NcbiAgICAgICAgICogdGhhbiBvciBlcXVhbCB0byA5OSwgaW5jcmVtZW50IHRoZSB5ZWFyLXZhbHVlIGJ5IDE5MDAuXG4gICAgICAgICAqIDQuICBJZiB0aGUgeWVhci12YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzc1xuICAgICAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIDY5LCBpbmNyZW1lbnQgdGhlIHllYXItdmFsdWUgYnkgMjAwMC5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh5ZWFyID49IDcwICYmIHllYXIgPD0gOTkpIHtcbiAgICAgICAgICB5ZWFyICs9IDE5MDBcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyID49IDAgJiYgeWVhciA8PSA2OSkge1xuICAgICAgICAgIHllYXIgKz0gMjAwMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUkZDIDYyNjUgUzUuMS4xXG4gICAqIFwiNS4gQWJvcnQgdGhlc2Ugc3RlcHMgYW5kIGZhaWwgdG8gcGFyc2UgdGhlIGNvb2tpZS1kYXRlIGlmOlxuICAgKiAgICAgKiAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb3VuZC1kYXktb2YtbW9udGgsIGZvdW5kLW1vbnRoLCBmb3VuZC1cbiAgICogICAgICAgIHllYXIsIG9yIGZvdW5kLXRpbWUgZmxhZ3MgaXMgbm90IHNldCxcbiAgICogICAgICogIHRoZSBkYXktb2YtbW9udGgtdmFsdWUgaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuIDMxLFxuICAgKiAgICAgKiAgdGhlIHllYXItdmFsdWUgaXMgbGVzcyB0aGFuIDE2MDEsXG4gICAqICAgICAqICB0aGUgaG91ci12YWx1ZSBpcyBncmVhdGVyIHRoYW4gMjMsXG4gICAqICAgICAqICB0aGUgbWludXRlLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiA1OSwgb3JcbiAgICogICAgICogIHRoZSBzZWNvbmQtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDU5LlxuICAgKiAgICAgKE5vdGUgdGhhdCBsZWFwIHNlY29uZHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIHRoaXMgc3ludGF4LilcIlxuICAgKlxuICAgKiBTbywgaW4gb3JkZXIgYXMgYWJvdmU6XG4gICAqL1xuICBpZiAoXG4gICAgZGF5T2ZNb250aCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgbW9udGggPT09IHVuZGVmaW5lZCB8fFxuICAgIHllYXIgPT09IHVuZGVmaW5lZCB8fFxuICAgIGhvdXIgPT09IHVuZGVmaW5lZCB8fFxuICAgIG1pbnV0ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgc2Vjb25kID09PSB1bmRlZmluZWQgfHxcbiAgICBkYXlPZk1vbnRoIDwgMSB8fFxuICAgIGRheU9mTW9udGggPiAzMSB8fFxuICAgIHllYXIgPCAxNjAxIHx8XG4gICAgaG91ciA+IDIzIHx8XG4gICAgbWludXRlID4gNTkgfHxcbiAgICBzZWNvbmQgPiA1OVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5T2ZNb250aCwgaG91ciwgbWludXRlLCBzZWNvbmQpKVxufVxuIiwgIi8qIVxuICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMjAsIFNhbGVzZm9yY2UuY29tLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNhbGVzZm9yY2UuY29tIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXlcbiAqIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5pbXBvcnQgeyBnZXRQdWJsaWNTdWZmaXggfSBmcm9tICcuLi9nZXRQdWJsaWNTdWZmaXguanMnXG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJy4uL3ZhbGlkYXRvcnMuanMnXG5pbXBvcnQgeyBpbk9wZXJhdG9yIH0gZnJvbSAnLi4vdXRpbHMuanMnXG5cbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuL2Zvcm1hdERhdGUuanMnXG5pbXBvcnQgeyBwYXJzZURhdGUgfSBmcm9tICcuL3BhcnNlRGF0ZS5qcydcbmltcG9ydCB7IGNhbm9uaWNhbERvbWFpbiB9IGZyb20gJy4vY2Fub25pY2FsRG9tYWluLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemVkQ29va2llIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5cbi8vIEZyb20gUkZDNjI2NSBTNC4xLjFcbi8vIG5vdGUgdGhhdCBpdCBleGNsdWRlcyBcXHgzQiBcIjtcIlxuY29uc3QgQ09PS0lFX09DVEVUUyA9IC9eW1xceDIxXFx4MjMtXFx4MkJcXHgyRC1cXHgzQVxceDNDLVxceDVCXFx4NUQtXFx4N0VdKyQvXG5cbi8vIFJGQzYyNjUgUzQuMS4xIGRlZmluZXMgcGF0aCB2YWx1ZSBhcyAnYW55IENIQVIgZXhjZXB0IENUTHMgb3IgXCI7XCInXG4vLyBOb3RlICc7JyBpcyBcXHgzQlxuY29uc3QgUEFUSF9WQUxVRSA9IC9bXFx4MjAtXFx4M0FcXHgzQy1cXHg3RV0rL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgQ09OVFJPTF9DSEFSUyA9IC9bXFx4MDAtXFx4MUZdL1xuXG4vLyBGcm9tIENocm9taXVtIC8vICdcXHInLCAnXFxuJyBhbmQgJ1xcMCcgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSB0ZXJtaW5hdG9yIGluXG4vLyB0aGUgXCJyZWxheGVkXCIgbW9kZSwgc2VlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nocm9taXVtV2ViQXBwcy9jaHJvbWl1bS9ibG9iL2IzZDNiNGRhOGJiOTRjMWIyZTA2MTYwMGRmMTA2ZDU5MGZkYTM2MjAvbmV0L2Nvb2tpZXMvcGFyc2VkX2Nvb2tpZS5jYyNMNjBcbmNvbnN0IFRFUk1JTkFUT1JTID0gWydcXG4nLCAnXFxyJywgJ1xcMCddXG5cbmZ1bmN0aW9uIHRyaW1UZXJtaW5hdG9yKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbGlkYXRvcnMuaXNFbXB0eVN0cmluZyhzdHIpKSByZXR1cm4gc3RyXG4gIGZvciAobGV0IHQgPSAwOyB0IDwgVEVSTUlOQVRPUlMubGVuZ3RoOyB0KyspIHtcbiAgICBjb25zdCB0ZXJtaW5hdG9yID0gVEVSTUlOQVRPUlNbdF1cbiAgICBjb25zdCB0ZXJtaW5hdG9ySWR4ID0gdGVybWluYXRvciA/IHN0ci5pbmRleE9mKHRlcm1pbmF0b3IpIDogLTFcbiAgICBpZiAodGVybWluYXRvcklkeCAhPT0gLTEpIHtcbiAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCB0ZXJtaW5hdG9ySWR4KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gcGFyc2VDb29raWVQYWlyKFxuICBjb29raWVQYWlyOiBzdHJpbmcsXG4gIGxvb3NlTW9kZTogYm9vbGVhbixcbik6IENvb2tpZSB8IHVuZGVmaW5lZCB7XG4gIGNvb2tpZVBhaXIgPSB0cmltVGVybWluYXRvcihjb29raWVQYWlyKVxuXG4gIGxldCBmaXJzdEVxID0gY29va2llUGFpci5pbmRleE9mKCc9JylcbiAgaWYgKGxvb3NlTW9kZSkge1xuICAgIGlmIChmaXJzdEVxID09PSAwKSB7XG4gICAgICAvLyAnPScgaXMgaW1tZWRpYXRlbHkgYXQgc3RhcnRcbiAgICAgIGNvb2tpZVBhaXIgPSBjb29raWVQYWlyLnN1YnN0cmluZygxKVxuICAgICAgZmlyc3RFcSA9IGNvb2tpZVBhaXIuaW5kZXhPZignPScpIC8vIG1pZ2h0IHN0aWxsIG5lZWQgdG8gc3BsaXQgb24gJz0nXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIG5vbi1sb29zZSBtb2RlXG4gICAgaWYgKGZpcnN0RXEgPD0gMCkge1xuICAgICAgLy8gbm8gJz0nIG9yIGlzIGF0IHN0YXJ0XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIC8vIG5lZWRzIHRvIGhhdmUgbm9uLWVtcHR5IFwiY29va2llLW5hbWVcIlxuICAgIH1cbiAgfVxuXG4gIGxldCBjb29raWVOYW1lLCBjb29raWVWYWx1ZVxuICBpZiAoZmlyc3RFcSA8PSAwKSB7XG4gICAgY29va2llTmFtZSA9ICcnXG4gICAgY29va2llVmFsdWUgPSBjb29raWVQYWlyLnRyaW0oKVxuICB9IGVsc2Uge1xuICAgIGNvb2tpZU5hbWUgPSBjb29raWVQYWlyLnNsaWNlKDAsIGZpcnN0RXEpLnRyaW0oKVxuICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFpci5zbGljZShmaXJzdEVxICsgMSkudHJpbSgpXG4gIH1cblxuICBpZiAoQ09OVFJPTF9DSEFSUy50ZXN0KGNvb2tpZU5hbWUpIHx8IENPTlRST0xfQ0hBUlMudGVzdChjb29raWVWYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBjID0gbmV3IENvb2tpZSgpXG4gIGMua2V5ID0gY29va2llTmFtZVxuICBjLnZhbHVlID0gY29va2llVmFsdWVcbiAgcmV0dXJuIGNcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2hlbiBwYXJzaW5nIGNvb2tpZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDb29raWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCB0aGVuIGtleWxlc3MgY29va2llcyBsaWtlIGA9YWJjYCBhbmQgYD1gIHdoaWNoIGFyZSBub3QgUkZDLWNvbXBsaWFudCB3aWxsIGJlIHBhcnNlZC5cbiAgICovXG4gIGxvb3NlPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBwYXJzZShzdHI6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlQ29va2llT3B0aW9ucyk6IENvb2tpZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWxpZGF0b3JzLmlzRW1wdHlTdHJpbmcoc3RyKSB8fCAhdmFsaWRhdG9ycy5pc1N0cmluZyhzdHIpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgc3RyID0gc3RyLnRyaW0oKVxuXG4gIC8vIFdlIHVzZSBhIHJlZ2V4IHRvIHBhcnNlIHRoZSBcIm5hbWUtdmFsdWUtcGFpclwiIHBhcnQgb2YgUzUuMlxuICBjb25zdCBmaXJzdFNlbWkgPSBzdHIuaW5kZXhPZignOycpIC8vIFM1LjIgc3RlcCAxXG4gIGNvbnN0IGNvb2tpZVBhaXIgPSBmaXJzdFNlbWkgPT09IC0xID8gc3RyIDogc3RyLnNsaWNlKDAsIGZpcnN0U2VtaSlcbiAgY29uc3QgYyA9IHBhcnNlQ29va2llUGFpcihjb29raWVQYWlyLCBvcHRpb25zPy5sb29zZSA/PyBmYWxzZSlcbiAgaWYgKCFjKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKGZpcnN0U2VtaSA9PT0gLTEpIHtcbiAgICByZXR1cm4gY1xuICB9XG5cbiAgLy8gUzUuMi4zIFwidW5wYXJzZWQtYXR0cmlidXRlcyBjb25zaXN0IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHNldC1jb29raWUtc3RyaW5nXG4gIC8vIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXCIgcGx1cyBsYXRlciBvbiBpbiB0aGUgc2FtZSBzZWN0aW9uXG4gIC8vIFwiZGlzY2FyZCB0aGUgZmlyc3QgXCI7XCIgYW5kIHRyaW1cIi5cbiAgY29uc3QgdW5wYXJzZWQgPSBzdHIuc2xpY2UoZmlyc3RTZW1pICsgMSkudHJpbSgpXG5cbiAgLy8gXCJJZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyBzdHJpbmcgaXMgZW1wdHksIHNraXAgdGhlIHJlc3Qgb2YgdGhlc2VcbiAgLy8gc3RlcHMuXCJcbiAgaWYgKHVucGFyc2VkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjXG4gIH1cblxuICAvKlxuICAgKiBTNS4yIHNheXMgdGhhdCB3aGVuIGxvb3Bpbmcgb3ZlciB0aGUgaXRlbXMgXCJbcF1yb2Nlc3MgdGhlIGF0dHJpYnV0ZS1uYW1lXG4gICAqIGFuZCBhdHRyaWJ1dGUtdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgaW4gdGhlIGZvbGxvd2luZ1xuICAgKiBzdWJzZWN0aW9uc1wiIGZvciBldmVyeSBpdGVtLiAgUGx1cywgZm9yIG1hbnkgb2YgdGhlIGluZGl2aWR1YWwgYXR0cmlidXRlc1xuICAgKiBpbiBTNS4zIGl0IHNheXMgdG8gdXNlIHRoZSBcImF0dHJpYnV0ZS12YWx1ZSBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgaW4gdGhlXG4gICAqIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFwiLiAgVGhlcmVmb3JlLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLCB3ZSBvdmVyd3JpdGVcbiAgICogdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgKi9cbiAgY29uc3QgY29va2llX2F2cyA9IHVucGFyc2VkLnNwbGl0KCc7JylcbiAgd2hpbGUgKGNvb2tpZV9hdnMubGVuZ3RoKSB7XG4gICAgY29uc3QgYXYgPSAoY29va2llX2F2cy5zaGlmdCgpID8/ICcnKS50cmltKClcbiAgICBpZiAoYXYubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBoYXBwZW5zIGlmIFwiOztcIiBhcHBlYXJzXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBhdl9zZXAgPSBhdi5pbmRleE9mKCc9JylcbiAgICBsZXQgYXZfa2V5OiBzdHJpbmcsIGF2X3ZhbHVlOiBzdHJpbmcgfCBudWxsXG5cbiAgICBpZiAoYXZfc2VwID09PSAtMSkge1xuICAgICAgYXZfa2V5ID0gYXZcbiAgICAgIGF2X3ZhbHVlID0gbnVsbFxuICAgIH0gZWxzZSB7XG4gICAgICBhdl9rZXkgPSBhdi5zbGljZSgwLCBhdl9zZXApXG4gICAgICBhdl92YWx1ZSA9IGF2LnNsaWNlKGF2X3NlcCArIDEpXG4gICAgfVxuXG4gICAgYXZfa2V5ID0gYXZfa2V5LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAoYXZfdmFsdWUpIHtcbiAgICAgIGF2X3ZhbHVlID0gYXZfdmFsdWUudHJpbSgpXG4gICAgfVxuXG4gICAgc3dpdGNoIChhdl9rZXkpIHtcbiAgICAgIGNhc2UgJ2V4cGlyZXMnOiAvLyBTNS4yLjFcbiAgICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgZXhwID0gcGFyc2VEYXRlKGF2X3ZhbHVlKVxuICAgICAgICAgIC8vIFwiSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBmYWlsZWQgdG8gcGFyc2UgYXMgYSBjb29raWUgZGF0ZSwgaWdub3JlIHRoZVxuICAgICAgICAgIC8vIGNvb2tpZS1hdi5cIlxuICAgICAgICAgIGlmIChleHApIHtcbiAgICAgICAgICAgIC8vIG92ZXIgYW5kIHVuZGVyZmxvdyBub3QgcmVhbGlzdGljYWxseSBhIGNvbmNlcm46IFY4J3MgZ2V0VGltZSgpIHNlZW1zIHRvXG4gICAgICAgICAgICAvLyBzdG9yZSBzb21ldGhpbmcgbGFyZ2VyIHRoYW4gYSAzMi1iaXQgdGltZV90IChldmVuIHdpdGggMzItYml0IG5vZGUpXG4gICAgICAgICAgICBjLmV4cGlyZXMgPSBleHBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWF4LWFnZSc6IC8vIFM1LjIuMlxuICAgICAgICBpZiAoYXZfdmFsdWUpIHtcbiAgICAgICAgICAvLyBcIklmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgYSBESUdJVCBvciBhIFwiLVwiXG4gICAgICAgICAgLy8gY2hhcmFjdGVyIC4uLltvcl0uLi4gSWYgdGhlIHJlbWFpbmRlciBvZiBhdHRyaWJ1dGUtdmFsdWUgY29udGFpbnMgYVxuICAgICAgICAgIC8vIG5vbi1ESUdJVCBjaGFyYWN0ZXIsIGlnbm9yZSB0aGUgY29va2llLWF2LlwiXG4gICAgICAgICAgaWYgKC9eLT9bMC05XSskLy50ZXN0KGF2X3ZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwYXJzZUludChhdl92YWx1ZSwgMTApXG4gICAgICAgICAgICAvLyBcIklmIGRlbHRhLXNlY29uZHMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gKDApLCBsZXQgZXhwaXJ5LXRpbWVcbiAgICAgICAgICAgIC8vIGJlIHRoZSBlYXJsaWVzdCByZXByZXNlbnRhYmxlIGRhdGUgYW5kIHRpbWUuXCJcbiAgICAgICAgICAgIGMuc2V0TWF4QWdlKGRlbHRhKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdkb21haW4nOiAvLyBTNS4yLjNcbiAgICAgICAgLy8gXCJJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiAgSG93ZXZlcixcbiAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgU0hPVUxEIGlnbm9yZSB0aGUgY29va2llLWF2IGVudGlyZWx5LlwiXG4gICAgICAgIGlmIChhdl92YWx1ZSkge1xuICAgICAgICAgIC8vIFM1LjIuMyBcIkxldCBjb29raWUtZG9tYWluIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgd2l0aG91dCB0aGUgbGVhZGluZyAleDJFXG4gICAgICAgICAgLy8gKFwiLlwiKSBjaGFyYWN0ZXIuXCJcbiAgICAgICAgICBjb25zdCBkb21haW4gPSBhdl92YWx1ZS50cmltKCkucmVwbGFjZSgvXlxcLi8sICcnKVxuICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgIC8vIFwiQ29udmVydCB0aGUgY29va2llLWRvbWFpbiB0byBsb3dlciBjYXNlLlwiXG4gICAgICAgICAgICBjLmRvbWFpbiA9IGRvbWFpbi50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ3BhdGgnOiAvLyBTNS4yLjRcbiAgICAgICAgLypcbiAgICAgICAgICogXCJJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgICAgICAqIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgJXgyRiAoXCIvXCIpOlxuICAgICAgICAgKiAgIExldCBjb29raWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRoLlxuICAgICAgICAgKiBPdGhlcndpc2U6XG4gICAgICAgICAqICAgTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuXCJcbiAgICAgICAgICpcbiAgICAgICAgICogV2UnbGwgcmVwcmVzZW50IHRoZSBkZWZhdWx0LXBhdGggYXMgbnVsbCBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZVxuICAgICAgICAgKiBjb250ZXh0IG9mIHRoZSBwYXJzaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYy5wYXRoID0gYXZfdmFsdWUgJiYgYXZfdmFsdWVbMF0gPT09ICcvJyA/IGF2X3ZhbHVlIDogbnVsbFxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdzZWN1cmUnOiAvLyBTNS4yLjVcbiAgICAgICAgLypcbiAgICAgICAgICogXCJJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIlNlY3VyZVwiLFxuICAgICAgICAgKiB0aGUgdXNlciBhZ2VudCBNVVNUIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFxuICAgICAgICAgKiB3aXRoIGFuIGF0dHJpYnV0ZS1uYW1lIG9mIFNlY3VyZSBhbmQgYW4gZW1wdHkgYXR0cmlidXRlLXZhbHVlLlwiXG4gICAgICAgICAqL1xuICAgICAgICBjLnNlY3VyZSA9IHRydWVcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnaHR0cG9ubHknOiAvLyBTNS4yLjYgLS0gZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgJ3NlY3VyZSdcbiAgICAgICAgYy5odHRwT25seSA9IHRydWVcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnc2FtZXNpdGUnOiAvLyBSRkM2MjY1YmlzLTAyIFM1LjMuN1xuICAgICAgICBzd2l0Y2ggKGF2X3ZhbHVlID8gYXZfdmFsdWUudG9Mb3dlckNhc2UoKSA6ICcnKSB7XG4gICAgICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgICAgIGMuc2FtZVNpdGUgPSAnc3RyaWN0J1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdsYXgnOlxuICAgICAgICAgICAgYy5zYW1lU2l0ZSA9ICdsYXgnXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgYy5zYW1lU2l0ZSA9ICdub25lJ1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYy5zYW1lU2l0ZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjLmV4dGVuc2lvbnMgPSBjLmV4dGVuc2lvbnMgfHwgW11cbiAgICAgICAgYy5leHRlbnNpb25zLnB1c2goYXYpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNcbn1cblxuZnVuY3Rpb24gZnJvbUpTT04oc3RyOiB1bmtub3duKTogQ29va2llIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzdHIgfHwgdmFsaWRhdG9ycy5pc0VtcHR5U3RyaW5nKHN0cikpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBsZXQgb2JqOiB1bmtub3duXG4gIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICBvYmogPSBKU09OLnBhcnNlKHN0cilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gYXNzdW1lIGl0J3MgYW4gT2JqZWN0XG4gICAgb2JqID0gc3RyXG4gIH1cblxuICBjb25zdCBjID0gbmV3IENvb2tpZSgpXG4gIENvb2tpZS5zZXJpYWxpemFibGVQcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIGluT3BlcmF0b3IocHJvcCwgb2JqKSkge1xuICAgICAgY29uc3QgdmFsID0gb2JqW3Byb3BdXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChpbk9wZXJhdG9yKHByb3AsIGNvb2tpZURlZmF1bHRzKSAmJiB2YWwgPT09IGNvb2tpZURlZmF1bHRzW3Byb3BdKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgY2FzZSAna2V5JzpcbiAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICBjYXNlICdzYW1lU2l0ZSc6XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjW3Byb3BdID0gdmFsXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2V4cGlyZXMnOlxuICAgICAgICBjYXNlICdjcmVhdGlvbic6XG4gICAgICAgIGNhc2UgJ2xhc3RBY2Nlc3NlZCc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB2YWwgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjW3Byb3BdID0gb2JqW3Byb3BdID09ICdJbmZpbml0eScgPyAnSW5maW5pdHknIDogbmV3IERhdGUodmFsKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICBjW3Byb3BdID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdtYXhBZ2UnOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB2YWwgPT09ICdJbmZpbml0eScgfHxcbiAgICAgICAgICAgIHZhbCA9PT0gJy1JbmZpbml0eSdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNbcHJvcF0gPSB2YWxcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZG9tYWluJzpcbiAgICAgICAgY2FzZSAncGF0aCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY1twcm9wXSA9IHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzZWN1cmUnOlxuICAgICAgICBjYXNlICdodHRwT25seSc6XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgY1twcm9wXSA9IHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdleHRlbnNpb25zJzpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbCkgJiZcbiAgICAgICAgICAgIHZhbC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY1twcm9wXSA9IHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdob3N0T25seSc6XG4gICAgICAgIGNhc2UgJ3BhdGhJc0RlZmF1bHQnOlxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicgfHwgdmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICBjW3Byb3BdID0gdmFsXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjXG59XG5cbi8qKlxuICogQ29uZmlndXJhYmxlIHZhbHVlcyB0aGF0IGNhbiBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIHtAbGluayBDb29raWV9LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNvb2tpZU9wdGlvbnMge1xuICAvKioge0Bpbmhlcml0RG9jIENvb2tpZS5rZXl9ICovXG4gIGtleT86IHN0cmluZ1xuICAvKioge0Bpbmhlcml0RG9jIENvb2tpZS52YWx1ZX0gKi9cbiAgdmFsdWU/OiBzdHJpbmdcbiAgLyoqIHtAaW5oZXJpdERvYyBDb29raWUuZXhwaXJlc30gKi9cbiAgZXhwaXJlcz86IERhdGUgfCAnSW5maW5pdHknIHwgbnVsbFxuICAvKioge0Bpbmhlcml0RG9jIENvb2tpZS5tYXhBZ2V9ICovXG4gIG1heEFnZT86IG51bWJlciB8ICdJbmZpbml0eScgfCAnLUluZmluaXR5JyB8IG51bGxcbiAgLyoqIHtAaW5oZXJpdERvYyBDb29raWUuZG9tYWlufSAqL1xuICBkb21haW4/OiBzdHJpbmcgfCBudWxsXG4gIC8qKiB7QGluaGVyaXREb2MgQ29va2llLnBhdGh9ICovXG4gIHBhdGg/OiBzdHJpbmcgfCBudWxsXG4gIC8qKiB7QGluaGVyaXREb2MgQ29va2llLnNlY3VyZX0gKi9cbiAgc2VjdXJlPzogYm9vbGVhblxuICAvKioge0Bpbmhlcml0RG9jIENvb2tpZS5odHRwT25seX0gKi9cbiAgaHR0cE9ubHk/OiBib29sZWFuXG4gIC8qKiB7QGluaGVyaXREb2MgQ29va2llLmV4dGVuc2lvbnN9ICovXG4gIGV4dGVuc2lvbnM/OiBzdHJpbmdbXSB8IG51bGxcbiAgLyoqIHtAaW5oZXJpdERvYyBDb29raWUuY3JlYXRpb259ICovXG4gIGNyZWF0aW9uPzogRGF0ZSB8ICdJbmZpbml0eScgfCBudWxsXG4gIC8qKiB7QGluaGVyaXREb2MgQ29va2llLmhvc3RPbmx5fSAqL1xuICBob3N0T25seT86IGJvb2xlYW4gfCBudWxsXG4gIC8qKiB7QGluaGVyaXREb2MgQ29va2llLnBhdGhJc0RlZmF1bHR9ICovXG4gIHBhdGhJc0RlZmF1bHQ/OiBib29sZWFuIHwgbnVsbFxuICAvKioge0Bpbmhlcml0RG9jIENvb2tpZS5sYXN0QWNjZXNzZWR9ICovXG4gIGxhc3RBY2Nlc3NlZD86IERhdGUgfCAnSW5maW5pdHknIHwgbnVsbFxuICAvKioge0Bpbmhlcml0RG9jIENvb2tpZS5zYW1lU2l0ZX0gKi9cbiAgc2FtZVNpdGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbn1cblxuY29uc3QgY29va2llRGVmYXVsdHMgPSB7XG4gIC8vIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgUkZDIGhhcyB0aGVtOlxuICBrZXk6ICcnLFxuICB2YWx1ZTogJycsXG4gIGV4cGlyZXM6ICdJbmZpbml0eScsXG4gIG1heEFnZTogbnVsbCxcbiAgZG9tYWluOiBudWxsLFxuICBwYXRoOiBudWxsLFxuICBzZWN1cmU6IGZhbHNlLFxuICBodHRwT25seTogZmFsc2UsXG4gIGV4dGVuc2lvbnM6IG51bGwsXG4gIC8vIHNldCBieSB0aGUgQ29va2llSmFyOlxuICBob3N0T25seTogbnVsbCxcbiAgcGF0aElzRGVmYXVsdDogbnVsbCxcbiAgY3JlYXRpb246IG51bGwsXG4gIGxhc3RBY2Nlc3NlZDogbnVsbCxcbiAgc2FtZVNpdGU6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlcXVpcmVkPENyZWF0ZUNvb2tpZU9wdGlvbnM+XG5cbi8qKlxuICogQW4gSFRUUCBjb29raWUgKHdlYiBjb29raWUsIGJyb3dzZXIgY29va2llKSBpcyBhIHNtYWxsIHBpZWNlIG9mIGRhdGEgdGhhdCBhIHNlcnZlciBzZW5kcyB0byBhIHVzZXIncyB3ZWIgYnJvd3Nlci5cbiAqIEl0IGlzIGRlZmluZWQgaW4ge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwgfCBSRkM2MjY1fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIENvb2tpZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvciBrZXkgb2YgdGhlIGNvb2tpZVxuICAgKi9cbiAga2V5OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY29va2llXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgJ0V4cGlyZXMnIGF0dHJpYnV0ZSBvZiB0aGUgY29va2llXG4gICAqIChTZWUge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwjc2VjdGlvbi01LjIuMSB8IFJGQzYyNjUgU2VjdGlvbiA1LjIuMX0pLlxuICAgKi9cbiAgZXhwaXJlczogRGF0ZSB8ICdJbmZpbml0eScgfCBudWxsXG4gIC8qKlxuICAgKiBUaGUgJ01heC1BZ2UnIGF0dHJpYnV0ZSBvZiB0aGUgY29va2llXG4gICAqIChTZWUge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwjc2VjdGlvbi01LjIuMiB8IFJGQzYyNjUgU2VjdGlvbiA1LjIuMn0pLlxuICAgKi9cbiAgbWF4QWdlOiBudW1iZXIgfCAnSW5maW5pdHknIHwgJy1JbmZpbml0eScgfCBudWxsXG4gIC8qKlxuICAgKiBUaGUgJ0RvbWFpbicgYXR0cmlidXRlIG9mIHRoZSBjb29raWUgcmVwcmVzZW50cyB0aGUgZG9tYWluIHRoZSBjb29raWUgYmVsb25ncyB0b1xuICAgKiAoU2VlIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNS4yLjMgfCBSRkM2MjY1IFNlY3Rpb24gNS4yLjN9KS5cbiAgICovXG4gIGRvbWFpbjogc3RyaW5nIHwgbnVsbFxuICAvKipcbiAgICogVGhlICdQYXRoJyBhdHRyaWJ1dGUgb2YgdGhlIGNvb2tpZSByZXByZXNlbnRzIHRoZSBwYXRoIG9mIHRoZSBjb29raWVcbiAgICogKFNlZSB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMi40IHwgUkZDNjI2NSBTZWN0aW9uIDUuMi40fSkuXG4gICAqL1xuICBwYXRoOiBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiBUaGUgJ1NlY3VyZScgZmxhZyBvZiB0aGUgY29va2llIGluZGljYXRlcyBpZiB0aGUgc2NvcGUgb2YgdGhlIGNvb2tpZSBpc1xuICAgKiBsaW1pdGVkIHRvIHNlY3VyZSBjaGFubmVscyAoZS5nLjsgSFRUUFMpIG9yIG5vdFxuICAgKiAoU2VlIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNS4yLjUgfCBSRkM2MjY1IFNlY3Rpb24gNS4yLjV9KS5cbiAgICovXG4gIHNlY3VyZTogYm9vbGVhblxuICAvKipcbiAgICogVGhlICdIdHRwT25seScgZmxhZyBvZiB0aGUgY29va2llIGluZGljYXRlcyBpZiB0aGUgY29va2llIGlzIGluYWNjZXNzaWJsZSB0b1xuICAgKiBjbGllbnQgc2NyaXB0cyBvciBub3RcbiAgICogKFNlZSB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMi42IHwgUkZDNjI2NSBTZWN0aW9uIDUuMi42fSkuXG4gICAqL1xuICBodHRwT25seTogYm9vbGVhblxuICAvKipcbiAgICogQ29udGFpbnMgYXR0cmlidXRlcyB3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIGRlZmluZWQgc3BlYyBidXQgbWF0Y2ggdGhlIGBleHRlbnNpb24tYXZgIHN5bnRheFxuICAgKiBkZWZpbmVkIGluIFNlY3Rpb24gNC4xLjEgb2YgUkZDNjI2NVxuICAgKiAoU2VlIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNC4xLjEgfCBSRkM2MjY1IFNlY3Rpb24gNC4xLjF9KS5cbiAgICovXG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdIHwgbnVsbFxuICAvKipcbiAgICogU2V0IHRvIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gYSBDb29raWUgaXMgaW5pdGlhbGx5IHN0b3JlZCBvciBhIG1hdGNoaW5nIGNvb2tpZSBpc1xuICAgKiByZWNlaXZlZCB0aGF0IHJlcGxhY2VzIGFuIGV4aXN0aW5nIGNvb2tpZVxuICAgKiAoU2VlIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNS4zIHwgUkZDNjI2NSBTZWN0aW9uIDUuM30pLlxuICAgKlxuICAgKiBBbHNvIHVzZWQgdG8gbWFpbnRhaW4gb3JkZXJpbmcgYW1vbmcgY29va2llcy4gQW1vbmcgY29va2llcyB0aGF0IGhhdmUgZXF1YWwtbGVuZ3RoIHBhdGggZmllbGRzLFxuICAgKiBjb29raWVzIHdpdGggZWFybGllciBjcmVhdGlvbi10aW1lcyBhcmUgbGlzdGVkIGJlZm9yZSBjb29raWVzIHdpdGggbGF0ZXIgY3JlYXRpb24tdGltZXNcbiAgICogKFNlZSB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuNCB8IFJGQzYyNjUgU2VjdGlvbiA1LjR9KS5cbiAgICovXG4gIGNyZWF0aW9uOiBEYXRlIHwgJ0luZmluaXR5JyB8IG51bGxcbiAgLyoqXG4gICAqIEEgZ2xvYmFsIGNvdW50ZXIgdXNlZCB0byBicmVhayBvcmRlcmluZyB0aWVzIGJldHdlZW4gdHdvIGNvb2tpZXMgdGhhdCBoYXZlIGVxdWFsLWxlbmd0aCBwYXRoIGZpZWxkc1xuICAgKiBhbmQgdGhlIHNhbWUgY3JlYXRpb24tdGltZS5cbiAgICovXG4gIGNyZWF0aW9uSW5kZXg6IG51bWJlclxuICAvKipcbiAgICogQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiBhIGNvb2tpZSBpcyBhIGhvc3Qtb25seSBjb29raWUgKGkuZS47IHdoZW4gdGhlIHJlcXVlc3QncyBob3N0IGV4YWN0bHlcbiAgICogbWF0Y2hlcyB0aGUgZG9tYWluIG9mIHRoZSBjb29raWUpIG9yIG5vdFxuICAgKiAoU2VlIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNS4zIHwgUkZDNjI2NSBTZWN0aW9uIDUuM30pLlxuICAgKi9cbiAgaG9zdE9ubHk6IGJvb2xlYW4gfCBudWxsXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIGEgY29va2llIGhhZCBubyAnUGF0aCcgYXR0cmlidXRlIGFuZCB0aGUgZGVmYXVsdCBwYXRoXG4gICAqIHdhcyB1c2VkXG4gICAqIChTZWUge0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwjc2VjdGlvbi01LjIuNCB8IFJGQzYyNjUgU2VjdGlvbiA1LjIuNH0pLlxuICAgKi9cbiAgcGF0aElzRGVmYXVsdDogYm9vbGVhbiB8IG51bGxcbiAgLyoqXG4gICAqIFNldCB0byB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIGEgY29va2llIHdhcyBpbml0aWFsbHkgc3RvcmVkICh7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMyB8IFJGQzYyNjUgU2VjdGlvbiA1LjN9KSBhbmQgdXBkYXRlZCB3aGVuZXZlclxuICAgKiB0aGUgY29va2llIGlzIHJldHJpZXZlZCBmcm9tIHRoZSB7QGxpbmsgQ29va2llSmFyfSAoe0BsaW5rIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1Lmh0bWwjc2VjdGlvbi01LjQgfCBSRkM2MjY1IFNlY3Rpb24gNS40fSkuXG4gICAqL1xuICBsYXN0QWNjZXNzZWQ6IERhdGUgfCAnSW5maW5pdHknIHwgbnVsbFxuICAvKipcbiAgICogVGhlICdTYW1lU2l0ZScgYXR0cmlidXRlIG9mIGEgY29va2llIGFzIGRlZmluZWQgaW4gUkZDNjI2NWJpc1xuICAgKiAoU2VlIHtAbGluayBodHRwczovL3d3dy5pZXRmLm9yZy9hcmNoaXZlL2lkL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzLTEzLmh0bWwjc2VjdGlvbi01LjIgfCBSRkM2MjY1YmlzICh2MTMpIFNlY3Rpb24gNS4yIH0pLlxuICAgKi9cbiAgc2FtZVNpdGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgQ29va2llIGluc3RhbmNlLlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGF0dHJpYnV0ZXMgdG8gc2V0IG9uIHRoZSBjb29raWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENyZWF0ZUNvb2tpZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMua2V5ID0gb3B0aW9ucy5rZXkgPz8gY29va2llRGVmYXVsdHMua2V5XG4gICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gY29va2llRGVmYXVsdHMudmFsdWVcbiAgICB0aGlzLmV4cGlyZXMgPSBvcHRpb25zLmV4cGlyZXMgPz8gY29va2llRGVmYXVsdHMuZXhwaXJlc1xuICAgIHRoaXMubWF4QWdlID0gb3B0aW9ucy5tYXhBZ2UgPz8gY29va2llRGVmYXVsdHMubWF4QWdlXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbiA/PyBjb29raWVEZWZhdWx0cy5kb21haW5cbiAgICB0aGlzLnBhdGggPSBvcHRpb25zLnBhdGggPz8gY29va2llRGVmYXVsdHMucGF0aFxuICAgIHRoaXMuc2VjdXJlID0gb3B0aW9ucy5zZWN1cmUgPz8gY29va2llRGVmYXVsdHMuc2VjdXJlXG4gICAgdGhpcy5odHRwT25seSA9IG9wdGlvbnMuaHR0cE9ubHkgPz8gY29va2llRGVmYXVsdHMuaHR0cE9ubHlcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgPz8gY29va2llRGVmYXVsdHMuZXh0ZW5zaW9uc1xuICAgIHRoaXMuY3JlYXRpb24gPSBvcHRpb25zLmNyZWF0aW9uID8/IGNvb2tpZURlZmF1bHRzLmNyZWF0aW9uXG4gICAgdGhpcy5ob3N0T25seSA9IG9wdGlvbnMuaG9zdE9ubHkgPz8gY29va2llRGVmYXVsdHMuaG9zdE9ubHlcbiAgICB0aGlzLnBhdGhJc0RlZmF1bHQgPSBvcHRpb25zLnBhdGhJc0RlZmF1bHQgPz8gY29va2llRGVmYXVsdHMucGF0aElzRGVmYXVsdFxuICAgIHRoaXMubGFzdEFjY2Vzc2VkID0gb3B0aW9ucy5sYXN0QWNjZXNzZWQgPz8gY29va2llRGVmYXVsdHMubGFzdEFjY2Vzc2VkXG4gICAgdGhpcy5zYW1lU2l0ZSA9IG9wdGlvbnMuc2FtZVNpdGUgPz8gY29va2llRGVmYXVsdHMuc2FtZVNpdGVcblxuICAgIHRoaXMuY3JlYXRpb24gPSBvcHRpb25zLmNyZWF0aW9uID8/IG5ldyBEYXRlKClcblxuICAgIC8vIHVzZWQgdG8gYnJlYWsgY3JlYXRpb24gdGllcyBpbiBjb29raWVDb21wYXJlKCk6XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjcmVhdGlvbkluZGV4Jywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLCAvLyBpbXBvcnRhbnQgZm9yIGFzc2VydC5kZWVwRXF1YWwgY2hlY2tzXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiArK0Nvb2tpZS5jb29raWVzQ3JlYXRlZCxcbiAgICB9KVxuICAgIC8vIER1cGxpY2F0ZSBvcGVyYXRpb24sIGJ1dCBpdCBtYWtlcyBUeXBlU2NyaXB0IGhhcHB5Li4uXG4gICAgdGhpcy5jcmVhdGlvbkluZGV4ID0gQ29va2llLmNvb2tpZXNDcmVhdGVkXG4gIH1cblxuICBbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0oKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgY29uc3QgaG9zdE9ubHkgPSB0aGlzLmhvc3RPbmx5ICE9IG51bGwgPyB0aGlzLmhvc3RPbmx5LnRvU3RyaW5nKCkgOiAnPydcbiAgICBjb25zdCBjcmVhdGVBZ2UgPVxuICAgICAgdGhpcy5jcmVhdGlvbiAmJiB0aGlzLmNyZWF0aW9uICE9PSAnSW5maW5pdHknXG4gICAgICAgID8gYCR7U3RyaW5nKG5vdyAtIHRoaXMuY3JlYXRpb24uZ2V0VGltZSgpKX1tc2BcbiAgICAgICAgOiAnPydcbiAgICBjb25zdCBhY2Nlc3NBZ2UgPVxuICAgICAgdGhpcy5sYXN0QWNjZXNzZWQgJiYgdGhpcy5sYXN0QWNjZXNzZWQgIT09ICdJbmZpbml0eSdcbiAgICAgICAgPyBgJHtTdHJpbmcobm93IC0gdGhpcy5sYXN0QWNjZXNzZWQuZ2V0VGltZSgpKX1tc2BcbiAgICAgICAgOiAnPydcbiAgICByZXR1cm4gYENvb2tpZT1cIiR7dGhpcy50b1N0cmluZygpfTsgaG9zdE9ubHk9JHtob3N0T25seX07IGFBZ2U9JHthY2Nlc3NBZ2V9OyBjQWdlPSR7Y3JlYXRlQWdlfVwiYFxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBjb252ZW5pZW5jZSBpbiB1c2luZyBgSlNPTi5zdHJpbmdpZnkoY29va2llKWAuIFJldHVybnMgYSBwbGFpbi1vbGQgT2JqZWN0IHRoYXQgY2FuIGJlIEpTT04tc2VyaWFsaXplZC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBBbnkgYERhdGVgIHByb3BlcnRpZXMgKHN1Y2ggYXMge0BsaW5rIENvb2tpZS5leHBpcmVzfSwge0BsaW5rIENvb2tpZS5jcmVhdGlvbn0sIGFuZCB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0pIGFyZSBleHBvcnRlZCBpbiBJU08gZm9ybWF0IChgRGF0ZS50b0lTT1N0cmluZygpYCkuXG4gICAqXG4gICAqICAtIEN1c3RvbSBDb29raWUgcHJvcGVydGllcyBhcmUgZGlzY2FyZGVkLiBJbiB0b3VnaC1jb29raWUgMS54LCBzaW5jZSB0aGVyZSB3YXMgbm8ge0BsaW5rIENvb2tpZS50b0pTT059IG1ldGhvZCBleHBsaWNpdGx5IGRlZmluZWQsIGFsbCBlbnVtZXJhYmxlIHByb3BlcnRpZXMgd2VyZSBjYXB0dXJlZC5cbiAgICogICAgICBJZiB5b3Ugd2FudCBhIHByb3BlcnR5IHRvIGJlIHNlcmlhbGl6ZWQsIGFkZCB0aGUgcHJvcGVydHkgbmFtZSB0byB7QGxpbmsgQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXN9LlxuICAgKi9cbiAgdG9KU09OKCk6IFNlcmlhbGl6ZWRDb29raWUge1xuICAgIGNvbnN0IG9iajogU2VyaWFsaXplZENvb2tpZSA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXNbcHJvcF1cblxuICAgICAgaWYgKHZhbCA9PT0gY29va2llRGVmYXVsdHNbcHJvcF0pIHtcbiAgICAgICAgY29udGludWUgLy8gbGVhdmUgYXMgcHJvdG90eXBlIGRlZmF1bHRcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChwcm9wKSB7XG4gICAgICAgIGNhc2UgJ2tleSc6XG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgY2FzZSAnc2FtZVNpdGUnOlxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gdmFsXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2V4cGlyZXMnOlxuICAgICAgICBjYXNlICdjcmVhdGlvbic6XG4gICAgICAgIGNhc2UgJ2xhc3RBY2Nlc3NlZCc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB2YWwgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBvYmpbcHJvcF0gPVxuICAgICAgICAgICAgICB2YWwgPT0gJ0luZmluaXR5JyA/ICdJbmZpbml0eScgOiBuZXcgRGF0ZSh2YWwpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdtYXhBZ2UnOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB2YWwgPT09ICdJbmZpbml0eScgfHxcbiAgICAgICAgICAgIHZhbCA9PT0gJy1JbmZpbml0eSdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9ialtwcm9wXSA9IHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkb21haW4nOlxuICAgICAgICBjYXNlICdwYXRoJzpcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICBvYmpbcHJvcF0gPSB2YWxcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc2VjdXJlJzpcbiAgICAgICAgY2FzZSAnaHR0cE9ubHknOlxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIG9ialtwcm9wXSA9IHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdleHRlbnNpb25zJzpcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICBvYmpbcHJvcF0gPSB2YWxcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnaG9zdE9ubHknOlxuICAgICAgICBjYXNlICdwYXRoSXNEZWZhdWx0JzpcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nIHx8IHZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gdmFsXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgYSBkZWVwIGNsb25lIG9mIHRoaXMgY29va2llLCBpbXBsZW1lbnRlZCBleGFjdGx5IGFzIGBDb29raWUuZnJvbUpTT04oY29va2llLnRvSlNPTigpKWAuXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsb25lKCk6IENvb2tpZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZyb21KU09OKHRoaXMudG9KU09OKCkpXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGNvb2tpZSBhdHRyaWJ1dGVzIGZvciBzZW1hbnRpYyBjb3JyZWN0bmVzcy4gVXNlZnVsIGZvciBcImxpbnRcIiBjaGVja2luZyBhbnkgYFNldC1Db29raWVgIGhlYWRlcnMgeW91IGdlbmVyYXRlLlxuICAgKiBGb3Igbm93LCBpdCByZXR1cm5zIGEgYm9vbGVhbiwgYnV0IGV2ZW50dWFsbHkgY291bGQgcmV0dXJuIGEgcmVhc29uIHN0cmluZy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogV29ya3MgZm9yIGEgZmV3IHRoaW5ncywgYnV0IGlzIGJ5IG5vIG1lYW5zIGNvbXByZWhlbnNpdmUuXG4gICAqXG4gICAqIEBiZXRhXG4gICAqL1xuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudmFsdWUgfHwgIUNPT0tJRV9PQ1RFVFMudGVzdCh0aGlzLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuZXhwaXJlcyAhPSAnSW5maW5pdHknICYmXG4gICAgICAhKHRoaXMuZXhwaXJlcyBpbnN0YW5jZW9mIERhdGUpICYmXG4gICAgICAhcGFyc2VEYXRlKHRoaXMuZXhwaXJlcylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLm1heEFnZSAhPSBudWxsICYmXG4gICAgICB0aGlzLm1heEFnZSAhPT0gJ0luZmluaXR5JyAmJlxuICAgICAgKHRoaXMubWF4QWdlID09PSAnLUluZmluaXR5JyB8fCB0aGlzLm1heEFnZSA8PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlIC8vIFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgICB9XG4gICAgaWYgKHRoaXMucGF0aCAhPSBudWxsICYmICFQQVRIX1ZBTFVFLnRlc3QodGhpcy5wYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgY2RvbWFpbiA9IHRoaXMuY2RvbWFpbigpXG4gICAgaWYgKGNkb21haW4pIHtcbiAgICAgIGlmIChjZG9tYWluLm1hdGNoKC9cXC4kLykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlIC8vIFM0LjEuMi4zIHN1Z2dlc3RzIHRoYXQgdGhpcyBpcyBiYWQuIGRvbWFpbk1hdGNoKCkgdGVzdHMgY29uZmlybSB0aGlzXG4gICAgICB9XG4gICAgICBjb25zdCBzdWZmaXggPSBnZXRQdWJsaWNTdWZmaXgoY2RvbWFpbilcbiAgICAgIGlmIChzdWZmaXggPT0gbnVsbCkge1xuICAgICAgICAvLyBpdCdzIGEgcHVibGljIHN1ZmZpeFxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSAnRXhwaXJlcycgYXR0cmlidXRlIG9uIGEgY29va2llLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBXaGVuIGdpdmVuIGEgYHN0cmluZ2AgdmFsdWUgaXQgd2lsbCBiZSBwYXJzZWQgd2l0aCB7QGxpbmsgcGFyc2VEYXRlfS4gSWYgdGhlIHZhbHVlIGNhbid0IGJlIHBhcnNlZCBhcyBhIGNvb2tpZSBkYXRlXG4gICAqIHRoZW4gdGhlICdFeHBpcmVzJyBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQgdG8gYFwiSW5maW5pdHlcImAuXG4gICAqXG4gICAqIEBwYXJhbSBleHAgLSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgJ0V4cGlyZXMnIGF0dHJpYnV0ZSBvZiB0aGUgY29va2llLlxuICAgKi9cbiAgc2V0RXhwaXJlcyhleHA6IHN0cmluZyB8IERhdGUpOiB2b2lkIHtcbiAgICBpZiAoZXhwIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdGhpcy5leHBpcmVzID0gZXhwXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwaXJlcyA9IHBhcnNlRGF0ZShleHApIHx8ICdJbmZpbml0eSdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgJ01heC1BZ2UnIGF0dHJpYnV0ZSAoaW4gc2Vjb25kcykgb24gYSBjb29raWUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIENvZXJjZXMgYC1JbmZpbml0eWAgdG8gYFwiLUluZmluaXR5XCJgIGFuZCBgSW5maW5pdHlgIHRvIGBcIkluZmluaXR5XCJgIHNvIGl0IGNhbiBiZSBzZXJpYWxpemVkIHRvIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSBhZ2UgLSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgJ01heC1BZ2UnIGF0dHJpYnV0ZSAoaW4gc2Vjb25kcykuXG4gICAqL1xuICBzZXRNYXhBZ2UoYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoYWdlID09PSBJbmZpbml0eSkge1xuICAgICAgdGhpcy5tYXhBZ2UgPSAnSW5maW5pdHknXG4gICAgfSBlbHNlIGlmIChhZ2UgPT09IC1JbmZpbml0eSkge1xuICAgICAgdGhpcy5tYXhBZ2UgPSAnLUluZmluaXR5J1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1heEFnZSA9IGFnZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIHRvIGEgYENvb2tpZWAgaGVhZGVyIHZhbHVlIChzcGVjaWZpY2FsbHksIHRoZSB7QGxpbmsgQ29va2llLmtleX0gYW5kIHtAbGluayBDb29raWUudmFsdWV9IHByb3BlcnRpZXMgam9pbmVkIHdpdGggXCI9XCIpLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBjb29raWVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnZhbHVlIHx8ICcnXG4gICAgaWYgKHRoaXMua2V5KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5rZXl9PSR7dmFsfWBcbiAgICB9XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgdG8gYSBgU2V0LUNvb2tpZSBoZWFkZXJgIHZhbHVlLlxuICAgKiBAcHVibGljXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGxldCBzdHIgPSB0aGlzLmNvb2tpZVN0cmluZygpXG5cbiAgICBpZiAodGhpcy5leHBpcmVzICE9ICdJbmZpbml0eScpIHtcbiAgICAgIGlmICh0aGlzLmV4cGlyZXMgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHN0ciArPSBgOyBFeHBpcmVzPSR7Zm9ybWF0RGF0ZSh0aGlzLmV4cGlyZXMpfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhBZ2UgIT0gbnVsbCAmJiB0aGlzLm1heEFnZSAhPSBJbmZpbml0eSkge1xuICAgICAgc3RyICs9IGA7IE1heC1BZ2U9JHtTdHJpbmcodGhpcy5tYXhBZ2UpfWBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kb21haW4gJiYgIXRoaXMuaG9zdE9ubHkpIHtcbiAgICAgIHN0ciArPSBgOyBEb21haW49JHt0aGlzLmRvbWFpbn1gXG4gICAgfVxuICAgIGlmICh0aGlzLnBhdGgpIHtcbiAgICAgIHN0ciArPSBgOyBQYXRoPSR7dGhpcy5wYXRofWBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWN1cmUpIHtcbiAgICAgIHN0ciArPSAnOyBTZWN1cmUnXG4gICAgfVxuICAgIGlmICh0aGlzLmh0dHBPbmx5KSB7XG4gICAgICBzdHIgKz0gJzsgSHR0cE9ubHknXG4gICAgfVxuICAgIGlmICh0aGlzLnNhbWVTaXRlICYmIHRoaXMuc2FtZVNpdGUgIT09ICdub25lJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnNhbWVTaXRlLnRvTG93ZXJDYXNlKCkgPT09XG4gICAgICAgIENvb2tpZS5zYW1lU2l0ZUNhbm9uaWNhbC5sYXgudG9Mb3dlckNhc2UoKVxuICAgICAgKSB7XG4gICAgICAgIHN0ciArPSBgOyBTYW1lU2l0ZT0ke0Nvb2tpZS5zYW1lU2l0ZUNhbm9uaWNhbC5sYXh9YFxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpID09PVxuICAgICAgICBDb29raWUuc2FtZVNpdGVDYW5vbmljYWwuc3RyaWN0LnRvTG93ZXJDYXNlKClcbiAgICAgICkge1xuICAgICAgICBzdHIgKz0gYDsgU2FtZVNpdGU9JHtDb29raWUuc2FtZVNpdGVDYW5vbmljYWwuc3RyaWN0fWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciArPSBgOyBTYW1lU2l0ZT0ke3RoaXMuc2FtZVNpdGV9YFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5leHRlbnNpb25zKSB7XG4gICAgICB0aGlzLmV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0KSA9PiB7XG4gICAgICAgIHN0ciArPSBgOyAke2V4dH1gXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBzdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgVFRMIHJlbGF0aXZlIHRvIG5vdyAobWlsbGlzZWNvbmRzKS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBgSW5maW5pdHlgIGlzIHJldHVybmVkIGZvciBjb29raWVzIHdpdGhvdXQgYW4gZXhwbGljaXQgZXhwaXJ5XG4gICAqXG4gICAqIC0gYDBgIGlzIHJldHVybmVkIGlmIHRoZSBjb29raWUgaXMgZXhwaXJlZC5cbiAgICpcbiAgICogLSBPdGhlcndpc2UgYSB0aW1lLXRvLWxpdmUgaW4gbWlsbGlzZWNvbmRzIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbm93IC0gcGFzc2luZyBhbiBleHBsaWNpdCB2YWx1ZSBpcyBtb3N0bHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBzaW5jZSB0aGlzIGRlZmF1bHRzIHRvIHRoZSBgRGF0ZS5ub3coKWBcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgVFRMKG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKSk6IG51bWJlciB7XG4gICAgLy8gVFRMKCkgcGFydGlhbGx5IHJlcGxhY2VzIHRoZSBcImV4cGlyeS10aW1lXCIgcGFydHMgb2YgUzUuMyBzdGVwIDMgKHNldENvb2tpZSgpXG4gICAgLy8gZWxzZXdoZXJlKVxuICAgIC8vIFM1LjMgc2F5cyB0byBnaXZlIHRoZSBcImxhdGVzdCByZXByZXNlbnRhYmxlIGRhdGVcIiBmb3Igd2hpY2ggd2UgdXNlIEluZmluaXR5XG4gICAgLy8gRm9yIFwiZXhwaXJlZFwiIHdlIHVzZSAwXG4gICAgLy8gLS0tLS1cbiAgICAvLyBSRkM2MjY1IFM0LjEuMi4yIElmIGEgY29va2llIGhhcyBib3RoIHRoZSBNYXgtQWdlIGFuZCB0aGUgRXhwaXJlc1xuICAgIC8vIGF0dHJpYnV0ZSwgdGhlIE1heC1BZ2UgYXR0cmlidXRlIGhhcyBwcmVjZWRlbmNlIGFuZCBjb250cm9scyB0aGVcbiAgICAvLyBleHBpcmF0aW9uIGRhdGUgb2YgdGhlIGNvb2tpZS5cbiAgICAvLyAoQ29uY3VycyB3aXRoIFM1LjMgc3RlcCAzKVxuICAgIGlmICh0aGlzLm1heEFnZSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLm1heEFnZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heEFnZSA8PSAwID8gMCA6IHRoaXMubWF4QWdlICogMTAwMFxuICAgIH1cblxuICAgIGNvbnN0IGV4cGlyZXMgPSB0aGlzLmV4cGlyZXNcbiAgICBpZiAoZXhwaXJlcyA9PT0gJ0luZmluaXR5Jykge1xuICAgICAgcmV0dXJuIEluZmluaXR5XG4gICAgfVxuXG4gICAgcmV0dXJuIChleHBpcmVzPy5nZXRUaW1lKCkgPz8gbm93KSAtIChub3cgfHwgRGF0ZS5ub3coKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgYWJzb2x1dGUgdW5peC1lcG9jaCBtaWxsaXNlY29uZHMgdGhhdCB0aGlzIGNvb2tpZSBleHBpcmVzLlxuICAgKlxuICAgKiBUaGUgXCJNYXgtQWdlXCIgYXR0cmlidXRlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBcIkV4cGlyZXNcIiAoYXMgcGVyIHRoZSBSRkMpLiBUaGUge0BsaW5rIENvb2tpZS5sYXN0QWNjZXNzZWR9IGF0dHJpYnV0ZVxuICAgKiAob3IgdGhlIGBub3dgIHBhcmFtZXRlciBpZiBnaXZlbikgaXMgdXNlZCB0byBvZmZzZXQgdGhlIHtAbGluayBDb29raWUubWF4QWdlfSBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIElmIEV4cGlyZXMgKHtAbGluayBDb29raWUuZXhwaXJlc30pIGlzIHNldCwgdGhhdCdzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbm93IC0gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHRpbWUgb2Zmc2V0IChpbnN0ZWFkIG9mIHtAbGluayBDb29raWUubGFzdEFjY2Vzc2VkfSkgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIFwiTWF4LUFnZVwiIHZhbHVlXG4gICAqL1xuICBleHBpcnlUaW1lKG5vdz86IERhdGUpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIC8vIGV4cGlyeVRpbWUoKSByZXBsYWNlcyB0aGUgXCJleHBpcnktdGltZVwiIHBhcnRzIG9mIFM1LjMgc3RlcCAzIChzZXRDb29raWUoKSBlbHNld2hlcmUpXG4gICAgaWYgKHRoaXMubWF4QWdlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlVG8gPSBub3cgfHwgdGhpcy5sYXN0QWNjZXNzZWQgfHwgbmV3IERhdGUoKVxuICAgICAgY29uc3QgbWF4QWdlID0gdHlwZW9mIHRoaXMubWF4QWdlID09PSAnbnVtYmVyJyA/IHRoaXMubWF4QWdlIDogLUluZmluaXR5XG4gICAgICBjb25zdCBhZ2UgPSBtYXhBZ2UgPD0gMCA/IC1JbmZpbml0eSA6IG1heEFnZSAqIDEwMDBcbiAgICAgIGlmIChyZWxhdGl2ZVRvID09PSAnSW5maW5pdHknKSB7XG4gICAgICAgIHJldHVybiBJbmZpbml0eVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbGF0aXZlVG8uZ2V0VGltZSgpICsgYWdlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXhwaXJlcyA9PSAnSW5maW5pdHknKSB7XG4gICAgICByZXR1cm4gSW5maW5pdHlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leHBpcmVzID8gdGhpcy5leHBpcmVzLmdldFRpbWUoKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8ge0BsaW5rIENvb2tpZS5leHBpcnlUaW1lfSwgY29tcHV0ZXMgdGhlIGFic29sdXRlIHVuaXgtZXBvY2ggbWlsbGlzZWNvbmRzIHRoYXQgdGhpcyBjb29raWUgZXhwaXJlcyBhbmQgcmV0dXJucyBpdCBhcyBhIERhdGUuXG4gICAqXG4gICAqIFRoZSBcIk1heC1BZ2VcIiBhdHRyaWJ1dGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFwiRXhwaXJlc1wiIChhcyBwZXIgdGhlIFJGQykuIFRoZSB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gYXR0cmlidXRlXG4gICAqIChvciB0aGUgYG5vd2AgcGFyYW1ldGVyIGlmIGdpdmVuKSBpcyB1c2VkIHRvIG9mZnNldCB0aGUge0BsaW5rIENvb2tpZS5tYXhBZ2V9IGF0dHJpYnV0ZS5cbiAgICpcbiAgICogSWYgRXhwaXJlcyAoe0BsaW5rIENvb2tpZS5leHBpcmVzfSkgaXMgc2V0LCB0aGF0J3MgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSBub3cgLSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdGltZSBvZmZzZXQgKGluc3RlYWQgb2Yge0BsaW5rIENvb2tpZS5sYXN0QWNjZXNzZWR9KSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgXCJNYXgtQWdlXCIgdmFsdWVcbiAgICovXG4gIGV4cGlyeURhdGUobm93PzogRGF0ZSk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1pbGxpc2VjID0gdGhpcy5leHBpcnlUaW1lKG5vdylcbiAgICBpZiAobWlsbGlzZWMgPT0gSW5maW5pdHkpIHtcbiAgICAgIC8vIFRoZSAzMS1iaXQgdmFsdWUgb2YgMjE0NzQ4MzY0NzAwMCB3YXMgY2hvc2VuIHRvIGJlIHRoZSBNQVhfVElNRSByZXByZXNlbnRhYmxlXG4gICAgICAvLyBpbiB0b3VnaC1jb29raWUgdGhvdWdoIE1ETiBzdGF0ZXMgdGhhdCB0aGUgYWN0dWFsIG1heGltdW0gdmFsdWUgZm9yIGEgRGF0ZSBpcyA4LjY0ZTE1LlxuICAgICAgLy8gSSdtIGd1ZXNzaW5nIHRoaXMgaXMgZHVlIHRvIHRoZSBZMjAzOCBwcm9ibGVtIHRoYXQgd291bGQgYWZmZWN0IHN5c3RlbXMgdGhhdCBzdG9yZVxuICAgICAgLy8gdW5peCB0aW1lIGFzIDMyLWJpdCBpbnRlZ2Vycy5cbiAgICAgIC8vIFNlZTpcbiAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL3NhbGVzZm9yY2UvdG91Z2gtY29va2llL2NvbW1pdC8wNjE2ZjcwYmY3MjVlMDBjNjNkNDQyNTQ0YWQyMzBjNGY4YjIzMzU3XG4gICAgICAvLyAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUjdGhlX2Vwb2NoX3RpbWVzdGFtcHNfYW5kX2ludmFsaWRfZGF0ZVxuICAgICAgLy8gLSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZZWFyXzIwMzhfcHJvYmxlbVxuICAgICAgcmV0dXJuIG5ldyBEYXRlKDIxNDc0ODM2NDcwMDApXG4gICAgfSBlbHNlIGlmIChtaWxsaXNlYyA9PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgwKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWlsbGlzZWMgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbmV3IERhdGUobWlsbGlzZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgY29va2llIGhhcyBiZWVuIHBlcnNpc3RlZCB0byBhIHN0b3JlIG9yIG5vdC5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgaXNQZXJzaXN0ZW50KCk6IGJvb2xlYW4ge1xuICAgIC8vIFRoaXMgcmVwbGFjZXMgdGhlIFwicGVyc2lzdGVudC1mbGFnXCIgcGFydHMgb2YgUzUuMyBzdGVwIDNcbiAgICByZXR1cm4gdGhpcy5tYXhBZ2UgIT0gbnVsbCB8fCB0aGlzLmV4cGlyZXMgIT0gJ0luZmluaXR5J1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHtAbGluayBjYW5vbmljYWxEb21haW59IHdpdGggdGhlIHtAbGluayBDb29raWUuZG9tYWlufSBwcm9wZXJ0eS5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY2Fub25pY2FsaXplZERvbWFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIE1vc3RseSBTNS4xLjIgYW5kIFM1LjIuMzpcbiAgICByZXR1cm4gY2Fub25pY2FsRG9tYWluKHRoaXMuZG9tYWluKVxuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmsgQ29va2llLmNhbm9uaWNhbGl6ZWREb21haW59XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNkb21haW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY2Fub25pY2FsRG9tYWluKHRoaXMuZG9tYWluKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHN0cmluZyBpbnRvIGEgQ29va2llIG9iamVjdC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogTm90ZTogd2hlbiBwYXJzaW5nIGEgYENvb2tpZWAgaGVhZGVyIGl0IG11c3QgYmUgc3BsaXQgYnkgJzsnIGJlZm9yZSBlYWNoIENvb2tpZSBzdHJpbmcgY2FuIGJlIHBhcnNlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIC8vIHBhcnNlIGEgYFNldC1Db29raWVgIGhlYWRlclxuICAgKiBjb25zdCBzZXRDb29raWVIZWFkZXIgPSAnYT1iY2Q7IEV4cGlyZXM9VHVlLCAxOCBPY3QgMjAxMSAwNzowNTowMyBHTVQnXG4gICAqIGNvbnN0IGNvb2tpZSA9IENvb2tpZS5wYXJzZShzZXRDb29raWVIZWFkZXIpXG4gICAqIGNvb2tpZS5rZXkgPT09ICdhJ1xuICAgKiBjb29raWUudmFsdWUgPT09ICdiY2QnXG4gICAqIGNvb2tpZS5leHBpcmVzID09PSBuZXcgRGF0ZShEYXRlLnBhcnNlKCdUdWUsIDE4IE9jdCAyMDExIDA3OjA1OjAzIEdNVCcpKVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIC8vIHBhcnNlIGEgYENvb2tpZWAgaGVhZGVyXG4gICAqIGNvbnN0IGNvb2tpZUhlYWRlciA9ICduYW1lPXZhbHVlOyBuYW1lMj12YWx1ZTI7IG5hbWUzPXZhbHVlMydcbiAgICogY29uc3QgY29va2llcyA9IGNvb2tpZUhlYWRlci5zcGxpdCgnOycpLm1hcChDb29raWUucGFyc2UpXG4gICAqIGNvb2tpZXNbMF0ubmFtZSA9PT0gJ25hbWUnXG4gICAqIGNvb2tpZXNbMF0udmFsdWUgPT09ICd2YWx1ZSdcbiAgICogY29va2llc1sxXS5uYW1lID09PSAnbmFtZTInXG4gICAqIGNvb2tpZXNbMV0udmFsdWUgPT09ICd2YWx1ZTInXG4gICAqIGNvb2tpZXNbMl0ubmFtZSA9PT0gJ25hbWUzJ1xuICAgKiBjb29raWVzWzJdLnZhbHVlID09PSAndmFsdWUzJ1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHN0ciAtIFRoZSBgU2V0LUNvb2tpZWAgaGVhZGVyIG9yIGEgQ29va2llIHN0cmluZyB0byBwYXJzZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmVzIGBzdHJpY3RgIG9yIGBsb29zZWAgbW9kZSBmb3IgY29va2llIHBhcnNpbmdcbiAgICovXG4gIHN0YXRpYyBwYXJzZShzdHI6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlQ29va2llT3B0aW9ucyk6IENvb2tpZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIHRoZSByZXZlcnNlIG9mIHtAbGluayBDb29raWUudG9KU09OfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQW55IERhdGUgcHJvcGVydGllcyAoc3VjaCBhcyAuZXhwaXJlcywgLmNyZWF0aW9uLCBhbmQgLmxhc3RBY2Nlc3NlZCkgYXJlIHBhcnNlZCB2aWEgRGF0ZS5wYXJzZSwgbm90IHRvdWdoLWNvb2tpZSdzIHBhcnNlRGF0ZSwgc2luY2UgSVNPIHRpbWVzdGFtcHMgYXJlIGJlaW5nIGhhbmRsZWQgYXQgdGhpcyBsYXllci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh7XG4gICAqICAga2V5OiAnYWxwaGEnLFxuICAgKiAgIHZhbHVlOiAnYmV0YScsXG4gICAqICAgZG9tYWluOiAnZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhdGg6ICcvZm9vJyxcbiAgICogICBleHBpcmVzOiAnMjAzOC0wMS0xOVQwMzoxNDowNy4wMDBaJyxcbiAgICogfSlcbiAgICogY29uc3QgY29va2llID0gQ29va2llLmZyb21KU09OKGpzb24pXG4gICAqIGNvb2tpZS5rZXkgPT09ICdhbHBoYSdcbiAgICogY29va2llLnZhbHVlID09PSAnYmV0YSdcbiAgICogY29va2llLmRvbWFpbiA9PT0gJ2V4YW1wbGUuY29tJ1xuICAgKiBjb29raWUucGF0aCA9PT0gJy9mb28nXG4gICAqIGNvb2tpZS5leHBpcmVzID09PSBuZXcgRGF0ZShEYXRlLnBhcnNlKCcyMDM4LTAxLTE5VDAzOjE0OjA3LjAwMFonKSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBzdHIgLSBBbiB1bnBhcnNlZCBKU09OIHN0cmluZyBvciBhIHZhbHVlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQgYXMgSlNPTlxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKHN0cjogdW5rbm93bik6IENvb2tpZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZyb21KU09OKHN0cilcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvb2tpZXNDcmVhdGVkID0gMFxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBzYW1lU2l0ZUxldmVsID0ge1xuICAgIHN0cmljdDogMyxcbiAgICBsYXg6IDIsXG4gICAgbm9uZTogMSxcbiAgfSBhcyBjb25zdFxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBzYW1lU2l0ZUNhbm9uaWNhbCA9IHtcbiAgICBzdHJpY3Q6ICdTdHJpY3QnLFxuICAgIGxheDogJ0xheCcsXG4gIH0gYXMgY29uc3RcblxuICAvKipcbiAgICogQ29va2llIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgd2hlbiB1c2luZyB7QGxpbmsgQ29va2llLmZyb21KU09OfSBhbmQge0BsaW5rIENvb2tpZS50b0pTT059LlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXphYmxlUHJvcGVydGllcyA9IFtcbiAgICAna2V5JyxcbiAgICAndmFsdWUnLFxuICAgICdleHBpcmVzJyxcbiAgICAnbWF4QWdlJyxcbiAgICAnZG9tYWluJyxcbiAgICAncGF0aCcsXG4gICAgJ3NlY3VyZScsXG4gICAgJ2h0dHBPbmx5JyxcbiAgICAnZXh0ZW5zaW9ucycsXG4gICAgJ2hvc3RPbmx5JyxcbiAgICAncGF0aElzRGVmYXVsdCcsXG4gICAgJ2NyZWF0aW9uJyxcbiAgICAnbGFzdEFjY2Vzc2VkJyxcbiAgICAnc2FtZVNpdGUnLFxuICBdIGFzIGNvbnN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb29raWUgfSBmcm9tICcuL2Nvb2tpZS5qcydcblxuLyoqXG4gKiBUaGUgbWF4aW11bSB0aW1lc3RhbXAgYSBjb29raWUsIGluIG1pbGxpc2Vjb25kcy4gVGhlIHZhbHVlIGlzICgyXjMxIC0gMSkgc2Vjb25kcyBzaW5jZSB0aGUgVW5peFxuICogZXBvY2gsIGNvcnJlc3BvbmRpbmcgdG8gMjAzOC0wMS0xOS5cbiAqL1xuY29uc3QgTUFYX1RJTUUgPSAyMTQ3NDgzNjQ3MDAwXG5cbi8qKlxuICogQSBjb21wYXJpc29uIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29ydCB8IEFycmF5LnNvcnQoKX0sXG4gKiB3aGljaCBvcmRlcnMgYSBsaXN0IG9mIGNvb2tpZXMgaW50byB0aGUgcmVjb21tZW5kZWQgb3JkZXIgZ2l2ZW4gaW4gU3RlcCAyIG9mIHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNS40IHwgUkZDNjI2NSAtIFNlY3Rpb24gNS40fS5cbiAqXG4gKiBUaGUgc29ydCBhbGdvcml0aG0gaXMsIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6XG4gKlxuICogLSBMb25nZXN0IHtAbGluayBDb29raWUucGF0aH1cbiAqXG4gKiAtIE9sZGVzdCB7QGxpbmsgQ29va2llLmNyZWF0aW9ufSAod2hpY2ggaGFzIGEgMS1tcyBwcmVjaXNpb24sIHNhbWUgYXMgRGF0ZSlcbiAqXG4gKiAtIExvd2VzdCB7QGxpbmsgQ29va2llLmNyZWF0aW9uSW5kZXh9ICh0byBnZXQgYmV5b25kIHRoZSAxLW1zIHByZWNpc2lvbilcbiAqXG4gKiBAcmVtYXJrc1xuICogIyMjIFJGQzYyNjUgLSBTZWN0aW9uIDUuNCAtIFN0ZXAgMlxuICpcbiAqIFRoZSB1c2VyIGFnZW50IFNIT1VMRCBzb3J0IHRoZSBjb29raWUtbGlzdCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICpcbiAqIC0gQ29va2llcyB3aXRoIGxvbmdlciBwYXRocyBhcmUgbGlzdGVkIGJlZm9yZSBjb29raWVzIHdpdGggc2hvcnRlciBwYXRocy5cbiAqXG4gKiAtIEFtb25nIGNvb2tpZXMgdGhhdCBoYXZlIGVxdWFsLWxlbmd0aCBwYXRoIGZpZWxkcywgY29va2llcyB3aXRoXG4gKiAgICBlYXJsaWVyIGNyZWF0aW9uLXRpbWVzIGFyZSBsaXN0ZWQgYmVmb3JlIGNvb2tpZXMgd2l0aCBsYXRlclxuICogICAgY3JlYXRpb24tdGltZXMuXG4gKlxuICogTk9URTogTm90IGFsbCB1c2VyIGFnZW50cyBzb3J0IHRoZSBjb29raWUtbGlzdCBpbiB0aGlzIG9yZGVyLCBidXRcbiAqIHRoaXMgb3JkZXIgcmVmbGVjdHMgY29tbW9uIHByYWN0aWNlIHdoZW4gdGhpcyBkb2N1bWVudCB3YXNcbiAqIHdyaXR0ZW4sIGFuZCwgaGlzdG9yaWNhbGx5LCB0aGVyZSBoYXZlIGJlZW4gc2VydmVycyB0aGF0XG4gKiAoZXJyb25lb3VzbHkpIGRlcGVuZGVkIG9uIHRoaXMgb3JkZXIuXG4gKlxuICogIyMjIEN1c3RvbSBTdG9yZSBJbXBsZW1lbnRvcnNcbiAqXG4gKiBTaW5jZSB0aGUgSmF2YVNjcmlwdCBEYXRlIGlzIGxpbWl0ZWQgdG8gYSAxLW1zIHByZWNpc2lvbiwgY29va2llcyB3aXRoaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQgYXJlIGVudGlyZWx5IHBvc3NpYmxlLlxuICogVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgd2hlbiB1c2luZyB0aGUgYG5vd2Agb3B0aW9uIHRvIGBDb29raWVKYXIuc2V0Q29va2llKC4uLilgLiBUaGUge0BsaW5rIENvb2tpZS5jcmVhdGlvbkluZGV4fVxuICogcHJvcGVydHkgaXMgYSBwZXItcHJvY2VzcyBnbG9iYWwgY291bnRlciwgYXNzaWduZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB3aXRoIGBuZXcgQ29va2llKClgLCB3aGljaCBwcmVzZXJ2ZXMgdGhlIHNwaXJpdFxuICogb2YgdGhlIFJGQyBzb3J0aW5nOiBvbGRlciBjb29raWVzIGdvIGZpcnN0LiBUaGlzIHdvcmtzIGdyZWF0IGZvciB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9IHNpbmNlIGBTZXQtQ29va2llYCBoZWFkZXJzXG4gKiBhcmUgcGFyc2VkIGluIG9yZGVyLCBidXQgaXMgbm90IHNvIGdyZWF0IGZvciBkaXN0cmlidXRlZCBzeXN0ZW1zLlxuICpcbiAqIFNvcGhpc3RpY2F0ZWQgU3RvcmVzIG1heSB3aXNoIHRvIHNldCB0aGlzIHRvIHNvbWUgb3RoZXJcbiAqIGxvZ2ljYWwgY2xvY2sgc28gdGhhdCBpZiBjb29raWVzIGBBYCBhbmQgYEJgIGFyZSBjcmVhdGVkIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBidXQgY29va2llIGBBYCBpcyBjcmVhdGVkIGJlZm9yZVxuICogY29va2llIGBCYCwgdGhlbiBgQS5jcmVhdGlvbkluZGV4IDwgQi5jcmVhdGlvbkluZGV4YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiBjb25zdCBjb29raWVzID0gW1xuICogICBuZXcgQ29va2llKHsga2V5OiAnYScsIHZhbHVlOiAnJyB9KSxcbiAqICAgbmV3IENvb2tpZSh7IGtleTogJ2InLCB2YWx1ZTogJycgfSksXG4gKiAgIG5ldyBDb29raWUoeyBrZXk6ICdjJywgdmFsdWU6ICcnLCBwYXRoOiAnL3BhdGgnIH0pLFxuICogICBuZXcgQ29va2llKHsga2V5OiAnZCcsIHZhbHVlOiAnJywgcGF0aDogJy9wYXRoJyB9KSxcbiAqIF1cbiAqIGNvb2tpZXMuc29ydChjb29raWVDb21wYXJlKVxuICogLy8gY29va2llIHNvcnQgb3JkZXIgd291bGQgYmUgWydjJywgJ2QnLCAnYScsICdiJ11cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIC0gdGhlIGZpcnN0IENvb2tpZSBmb3IgY29tcGFyaXNvblxuICogQHBhcmFtIGIgLSB0aGUgc2Vjb25kIENvb2tpZSBmb3IgY29tcGFyaXNvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29va2llQ29tcGFyZShhOiBDb29raWUsIGI6IENvb2tpZSk6IG51bWJlciB7XG4gIGxldCBjbXA6IG51bWJlclxuXG4gIC8vIGRlc2NlbmRpbmcgZm9yIGxlbmd0aDogYiBDTVAgYVxuICBjb25zdCBhUGF0aExlbiA9IGEucGF0aCA/IGEucGF0aC5sZW5ndGggOiAwXG4gIGNvbnN0IGJQYXRoTGVuID0gYi5wYXRoID8gYi5wYXRoLmxlbmd0aCA6IDBcbiAgY21wID0gYlBhdGhMZW4gLSBhUGF0aExlblxuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcFxuICB9XG5cbiAgLy8gYXNjZW5kaW5nIGZvciB0aW1lOiBhIENNUCBiXG4gIGNvbnN0IGFUaW1lID1cbiAgICBhLmNyZWF0aW9uICYmIGEuY3JlYXRpb24gaW5zdGFuY2VvZiBEYXRlID8gYS5jcmVhdGlvbi5nZXRUaW1lKCkgOiBNQVhfVElNRVxuICBjb25zdCBiVGltZSA9XG4gICAgYi5jcmVhdGlvbiAmJiBiLmNyZWF0aW9uIGluc3RhbmNlb2YgRGF0ZSA/IGIuY3JlYXRpb24uZ2V0VGltZSgpIDogTUFYX1RJTUVcbiAgY21wID0gYVRpbWUgLSBiVGltZVxuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcFxuICB9XG5cbiAgLy8gYnJlYWsgdGllcyBmb3IgdGhlIHNhbWUgbWlsbGlzZWNvbmQgKHByZWNpc2lvbiBvZiBKYXZhU2NyaXB0J3MgY2xvY2spXG4gIGNtcCA9IChhLmNyZWF0aW9uSW5kZXggfHwgMCkgLSAoYi5jcmVhdGlvbkluZGV4IHx8IDApXG5cbiAgcmV0dXJuIGNtcFxufVxuIiwgImltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICcuLi91dGlscy5qcydcblxuLyoqXG4gKiBHaXZlbiBhIGN1cnJlbnQgcmVxdWVzdC9yZXNwb25zZSBwYXRoLCBnaXZlcyB0aGUgcGF0aCBhcHByb3ByaWF0ZSBmb3Igc3RvcmluZ1xuICogaW4gYSBjb29raWUuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBcImRpcmVjdG9yeVwiIG9mIGEgXCJmaWxlXCIgaW4gdGhlIHBhdGgsIGJ1dFxuICogaXMgc3BlY2lmaWVkIGJ5IHtAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NS5odG1sI3NlY3Rpb24tNS4xLjQgfCBSRkM2MjY1IC0gU2VjdGlvbiA1LjEuNH0uXG4gKlxuICogQHJlbWFya3NcbiAqICMjIyBSRkM2MjY1IC0gU2VjdGlvbiA1LjEuNFxuICpcbiAqIFRoZSB1c2VyIGFnZW50IE1VU1QgdXNlIGFuIGFsZ29yaXRobSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIHRvIGNvbXB1dGUgdGhlIGRlZmF1bHQtcGF0aCBvZiBhIGNvb2tpZTpcbiAqXG4gKiAxLiBMZXQgdXJpLXBhdGggYmUgdGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgcmVxdWVzdC11cmkgaWYgc3VjaCBhXG4gKiAgICAgcG9ydGlvbiBleGlzdHMgKGFuZCBlbXB0eSBvdGhlcndpc2UpLiAgRm9yIGV4YW1wbGUsIGlmIHRoZVxuICogICAgIHJlcXVlc3QtdXJpIGNvbnRhaW5zIGp1c3QgYSBwYXRoIChhbmQgb3B0aW9uYWwgcXVlcnkgc3RyaW5nKSxcbiAqICAgICB0aGVuIHRoZSB1cmktcGF0aCBpcyB0aGF0IHBhdGggKHdpdGhvdXQgdGhlICV4M0YgKFwiP1wiKSBjaGFyYWN0ZXJcbiAqICAgICBvciBxdWVyeSBzdHJpbmcpLCBhbmQgaWYgdGhlIHJlcXVlc3QtdXJpIGNvbnRhaW5zIGEgZnVsbFxuICogICAgIGFic29sdXRlVVJJLCB0aGUgdXJpLXBhdGggaXMgdGhlIHBhdGggY29tcG9uZW50IG9mIHRoYXQgVVJJLlxuICpcbiAqIDIuIElmIHRoZSB1cmktcGF0aCBpcyBlbXB0eSBvciBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1cmktXG4gKiAgICAgcGF0aCBpcyBub3QgYSAleDJGIChcIi9cIikgY2hhcmFjdGVyLCBvdXRwdXQgJXgyRiAoXCIvXCIpIGFuZCBza2lwXG4gKiAgICAgdGhlIHJlbWFpbmluZyBzdGVwcy5cbiAqXG4gKiAzLiBJZiB0aGUgdXJpLXBhdGggY29udGFpbnMgbm8gbW9yZSB0aGFuIG9uZSAleDJGIChcIi9cIikgY2hhcmFjdGVyLFxuICogICAgIG91dHB1dCAleDJGIChcIi9cIikgYW5kIHNraXAgdGhlIHJlbWFpbmluZyBzdGVwLlxuICpcbiAqIDQuIE91dHB1dCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdXJpLXBhdGggZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIHVwXG4gKiAgICAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgcmlnaHQtbW9zdCAleDJGIChcIi9cIikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogZGVmYXVsdFBhdGgoJycpID09PSAnLydcbiAqIGRlZmF1bHRQYXRoKCcvc29tZS1wYXRoJykgPT09ICcvJ1xuICogZGVmYXVsdFBhdGgoJy9zb21lLXBhcmVudC1wYXRoL3NvbWUtcGF0aCcpID09PSAnL3NvbWUtcGFyZW50LXBhdGgnXG4gKiBkZWZhdWx0UGF0aCgncmVsYXRpdmUtcGF0aCcpID09PSAnLydcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwYXRoIC0gdGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgcmVxdWVzdC11cmkgKGV4Y2x1ZGluZyB0aGUgaG9zdG5hbWUsIHF1ZXJ5LCBmcmFnbWVudCwgYW5kIHNvIG9uKVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFBhdGgocGF0aD86IE51bGxhYmxlPHN0cmluZz4pOiBzdHJpbmcge1xuICAvLyBcIjIuIElmIHRoZSB1cmktcGF0aCBpcyBlbXB0eSBvciBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1cmktcGF0aCBpcyBub3RcbiAgLy8gYSAleDJGIChcIi9cIikgY2hhcmFjdGVyLCBvdXRwdXQgJXgyRiAoXCIvXCIpIGFuZCBza2lwIHRoZSByZW1haW5pbmcgc3RlcHMuXG4gIGlmICghcGF0aCB8fCBwYXRoLnNsaWNlKDAsIDEpICE9PSAnLycpIHtcbiAgICByZXR1cm4gJy8nXG4gIH1cblxuICAvLyBcIjMuIElmIHRoZSB1cmktcGF0aCBjb250YWlucyBubyBtb3JlIHRoYW4gb25lICV4MkYgKFwiL1wiKSBjaGFyYWN0ZXIsIG91dHB1dFxuICAvLyAleDJGIChcIi9cIikgYW5kIHNraXAgdGhlIHJlbWFpbmluZyBzdGVwLlwiXG4gIGlmIChwYXRoID09PSAnLycpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcmlnaHRTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKVxuICBpZiAocmlnaHRTbGFzaCA9PT0gMCkge1xuICAgIHJldHVybiAnLydcbiAgfVxuXG4gIC8vIFwiNC4gT3V0cHV0IHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1cmktcGF0aCBmcm9tIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdXAgdG8sXG4gIC8vIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgcmlnaHQtbW9zdCAleDJGIChcIi9cIikuXCJcbiAgcmV0dXJuIHBhdGguc2xpY2UoMCwgcmlnaHRTbGFzaClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnLi4vdXRpbHMuanMnXG5pbXBvcnQgeyBjYW5vbmljYWxEb21haW4gfSBmcm9tICcuL2Nhbm9uaWNhbERvbWFpbi5qcydcblxuLy8gRHVtcGVkIGZyb20gaXAtcmVnZXhANC4wLjAsIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2VzOlxuLy8gKiBhbGwgY2FwdHVyaW5nIGdyb3VwcyBjb252ZXJ0ZWQgdG8gbm9uLWNhcHR1cmluZyAtLSBcIig/OilcIlxuLy8gKiBzdXBwb3J0IGZvciBJUHY2IFNjb3BlZCBMaXRlcmFsIChcIiVldGgxXCIpIHJlbW92ZWRcbi8vICogbG93ZXJjYXNlIGhleGFkZWNpbWFsIG9ubHlcbmNvbnN0IElQX1JFR0VYX0xPV0VSQ0FTRSA9XG4gIC8oPzpeKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKXszfSQpfCg/Ol4oPzooPzpbYS1mXFxkXXsxLDR9Oil7N30oPzpbYS1mXFxkXXsxLDR9fDopfCg/OlthLWZcXGRdezEsNH06KXs2fSg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSl7M318OlthLWZcXGRdezEsNH18Oil8KD86W2EtZlxcZF17MSw0fTopezV9KD86Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSl7M318KD86OlthLWZcXGRdezEsNH0pezEsMn18Oil8KD86W2EtZlxcZF17MSw0fTopezR9KD86KD86OlthLWZcXGRdezEsNH0pezAsMX06KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKXszfXwoPzo6W2EtZlxcZF17MSw0fSl7MSwzfXw6KXwoPzpbYS1mXFxkXXsxLDR9Oil7M30oPzooPzo6W2EtZlxcZF17MSw0fSl7MCwyfTooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldXFxkfFxcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldXFxkfFxcZCkpezN9fCg/OjpbYS1mXFxkXXsxLDR9KXsxLDR9fDopfCg/OlthLWZcXGRdezEsNH06KXsyfSg/Oig/OjpbYS1mXFxkXXsxLDR9KXswLDN9Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSl7M318KD86OlthLWZcXGRdezEsNH0pezEsNX18Oil8KD86W2EtZlxcZF17MSw0fTopezF9KD86KD86OlthLWZcXGRdezEsNH0pezAsNH06KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKXszfXwoPzo6W2EtZlxcZF17MSw0fSl7MSw2fXw6KXwoPzo6KD86KD86OlthLWZcXGRdezEsNH0pezAsNX06KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKXszfXwoPzo6W2EtZlxcZF17MSw0fSl7MSw3fXw6KSkpJCkvXG5cbi8qKlxuICogQW5zd2VycyBcImRvZXMgdGhpcyByZWFsIGRvbWFpbiBtYXRjaCB0aGUgZG9tYWluIGluIGEgY29va2llP1wiLiBUaGUgYGRvbWFpbmAgaXMgdGhlIFwiY3VycmVudFwiIGRvbWFpbiBuYW1lIGFuZCB0aGVcbiAqIGBjb29raWVEb21haW5gIGlzIHRoZSBcImNvb2tpZVwiIGRvbWFpbiBuYW1lLiBNYXRjaGVzIGFjY29yZGluZyB0byB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMS4zIHwgUkZDNjI2NSAtIFNlY3Rpb24gNS4xLjN9LFxuICogYnV0IGl0IGhlbHBzIHRvIHRoaW5rIG9mIGl0IGFzIGEgXCJzdWZmaXggbWF0Y2hcIi5cbiAqXG4gKiBAcmVtYXJrc1xuICogIyMjIDUuMS4zLiAgRG9tYWluIE1hdGNoaW5nXG4gKlxuICogQSBzdHJpbmcgZG9tYWluLW1hdGNoZXMgYSBnaXZlbiBkb21haW4gc3RyaW5nIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVcbiAqIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6XG4gKlxuICogLSBUaGUgZG9tYWluIHN0cmluZyBhbmQgdGhlIHN0cmluZyBhcmUgaWRlbnRpY2FsLiAgKE5vdGUgdGhhdCBib3RoXG4gKiAgICAgdGhlIGRvbWFpbiBzdHJpbmcgYW5kIHRoZSBzdHJpbmcgd2lsbCBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCB0b1xuICogICAgIGxvd2VyIGNhc2UgYXQgdGhpcyBwb2ludC4pXG4gKlxuICogLSBBbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6XG4gKlxuICogICAgIC0gVGhlIGRvbWFpbiBzdHJpbmcgaXMgYSBzdWZmaXggb2YgdGhlIHN0cmluZy5cbiAqXG4gKiAgICAgLSBUaGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGVcbiAqICAgICAgICAgZG9tYWluIHN0cmluZyBpcyBhICV4MkUgKFwiLlwiKSBjaGFyYWN0ZXIuXG4gKlxuICogICAgIC0gVGhlIHN0cmluZyBpcyBhIGhvc3QgbmFtZSAoaS5lLiwgbm90IGFuIElQIGFkZHJlc3MpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGRvbWFpbk1hdGNoKCdleGFtcGxlLmNvbScsICdleGFtcGxlLmNvbScpID09PSB0cnVlXG4gKiBkb21haW5NYXRjaCgnZVhhTXBMZS5jT20nLCAnRXhBbVBsRS5Db00nKSA9PT0gdHJ1ZVxuICogZG9tYWluTWF0Y2goJ25vLmNhJywgJ3llcy5jYScpID09PSBmYWxzZVxuICogYGBgXG4gKlxuICogQHBhcmFtIGRvbWFpbiAtIFRoZSBkb21haW4gc3RyaW5nIHRvIHRlc3RcbiAqIEBwYXJhbSBjb29raWVEb21haW4gLSBUaGUgY29va2llIGRvbWFpbiBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIGNhbm9uaWNhbGl6ZSAtIFRoZSBjYW5vbmljYWxpemUgcGFyYW1ldGVyIHRvZ2dsZXMgd2hldGhlciB0aGUgZG9tYWluIHBhcmFtZXRlcnMgZ2V0IG5vcm1hbGl6ZWQgd2l0aCBjYW5vbmljYWxEb21haW4gb3Igbm90XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb21haW5NYXRjaChcbiAgZG9tYWluPzogTnVsbGFibGU8c3RyaW5nPixcbiAgY29va2llRG9tYWluPzogTnVsbGFibGU8c3RyaW5nPixcbiAgY2Fub25pY2FsaXplPzogYm9vbGVhbixcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoZG9tYWluID09IG51bGwgfHwgY29va2llRG9tYWluID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBsZXQgX3N0cjogTnVsbGFibGU8c3RyaW5nPlxuICBsZXQgX2RvbVN0cjogTnVsbGFibGU8c3RyaW5nPlxuXG4gIGlmIChjYW5vbmljYWxpemUgIT09IGZhbHNlKSB7XG4gICAgX3N0ciA9IGNhbm9uaWNhbERvbWFpbihkb21haW4pXG4gICAgX2RvbVN0ciA9IGNhbm9uaWNhbERvbWFpbihjb29raWVEb21haW4pXG4gIH0gZWxzZSB7XG4gICAgX3N0ciA9IGRvbWFpblxuICAgIF9kb21TdHIgPSBjb29raWVEb21haW5cbiAgfVxuXG4gIGlmIChfc3RyID09IG51bGwgfHwgX2RvbVN0ciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLypcbiAgICogUzUuMS4zOlxuICAgKiBcIkEgc3RyaW5nIGRvbWFpbi1tYXRjaGVzIGEgZ2l2ZW4gZG9tYWluIHN0cmluZyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlXG4gICAqIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6XCJcbiAgICpcbiAgICogXCIgbyBUaGUgZG9tYWluIHN0cmluZyBhbmQgdGhlIHN0cmluZyBhcmUgaWRlbnRpY2FsLiAoTm90ZSB0aGF0IGJvdGggdGhlXG4gICAqIGRvbWFpbiBzdHJpbmcgYW5kIHRoZSBzdHJpbmcgd2lsbCBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCB0byBsb3dlciBjYXNlIGF0XG4gICAqIHRoaXMgcG9pbnQpXCJcbiAgICovXG4gIGlmIChfc3RyID09IF9kb21TdHIpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyogXCIgbyBBbGwgb2YgdGhlIGZvbGxvd2luZyBbdGhyZWVdIGNvbmRpdGlvbnMgaG9sZDpcIiAqL1xuXG4gIC8qIFwiKiBUaGUgZG9tYWluIHN0cmluZyBpcyBhIHN1ZmZpeCBvZiB0aGUgc3RyaW5nXCIgKi9cbiAgY29uc3QgaWR4ID0gX3N0ci5sYXN0SW5kZXhPZihfZG9tU3RyKVxuICBpZiAoaWR4IDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2UgLy8gaXQncyBhIG5vbi1tYXRjaCAoLTEpIG9yIHByZWZpeCAoMClcbiAgfVxuXG4gIC8vIG5leHQsIGNoZWNrIGl0J3MgYSBwcm9wZXIgc3VmZml4XG4gIC8vIGUuZy4sIFwiYS5iLmNcIi5pbmRleE9mKFwiYi5jXCIpID09PSAyXG4gIC8vIDUgPT09IDMrMlxuICBpZiAoX3N0ci5sZW5ndGggIT09IF9kb21TdHIubGVuZ3RoICsgaWR4KSB7XG4gICAgcmV0dXJuIGZhbHNlIC8vIGl0J3Mgbm90IGEgc3VmZml4XG4gIH1cblxuICAvKiBcIiAgKiBUaGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGVcbiAgICogZG9tYWluIHN0cmluZyBpcyBhICV4MkUgKFwiLlwiKSBjaGFyYWN0ZXIuXCIgKi9cbiAgaWYgKF9zdHIuc3Vic3RyaW5nKGlkeCAtIDEsIGlkeCkgIT09ICcuJykge1xuICAgIHJldHVybiBmYWxzZSAvLyBkb2Vzbid0IGFsaWduIG9uIFwiLlwiXG4gIH1cblxuICAvKiBcIiAgKiBUaGUgc3RyaW5nIGlzIGEgaG9zdCBuYW1lIChpLmUuLCBub3QgYW4gSVAgYWRkcmVzcykuXCIgKi9cbiAgcmV0dXJuICFJUF9SRUdFWF9MT1dFUkNBU0UudGVzdChfc3RyKVxufVxuIiwgImltcG9ydCB7IElQX1Y0X1JFR0VYX09CSkVDVCwgSVBfVjZfUkVHRVhfT0JKRUNUIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5cbmZ1bmN0aW9uIGlzTG9vcGJhY2tWNChhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gMTI3LjAuMC4wLzg6IGZpcnN0IG9jdGV0ID0gMTI3XG4gIGNvbnN0IG9jdGV0cyA9IGFkZHJlc3Muc3BsaXQoJy4nKVxuICByZXR1cm4gKFxuICAgIG9jdGV0cy5sZW5ndGggPT09IDQgJiZcbiAgICBvY3RldHNbMF0gIT09IHVuZGVmaW5lZCAmJlxuICAgIHBhcnNlSW50KG9jdGV0c1swXSwgMTApID09PSAxMjdcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0xvb3BiYWNrVjYoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIG5ldyBVUkwoLi4uKSBmb2xsb3dzIHRoZSBXSEFUV0cgVVJMIFN0YW5kYXJkXG4gIC8vIHdoaWNoIGNvbXByZXNzZXMgSVB2NiBhZGRyZXNzZXMsIHRoZXJlZm9yZSB0aGUgSVB2NlxuICAvLyBsb29wYmFjayBhZGRyZXNzIHdpbGwgYWx3YXlzIGJlIGNvbXByZXNzZWQgdG8gJ1s6OjFdJzpcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWlwdjYtc2VyaWFsaXplclxuICByZXR1cm4gYWRkcmVzcyA9PT0gJzo6MSdcbn1cblxuZnVuY3Rpb24gaXNOb3JtYWxpemVkTG9jYWxob3N0VExEKGxvd2VySG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsb3dlckhvc3QuZW5kc1dpdGgoJy5sb2NhbGhvc3QnKVxufVxuXG5mdW5jdGlvbiBpc0xvY2FsSG9zdG5hbWUoaG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxvd2VySG9zdCA9IGhvc3QudG9Mb3dlckNhc2UoKVxuICByZXR1cm4gbG93ZXJIb3N0ID09PSAnbG9jYWxob3N0JyB8fCBpc05vcm1hbGl6ZWRMb2NhbGhvc3RUTEQobG93ZXJIb3N0KVxufVxuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvbWFpbi91cmwvZ3VybC5jYyNMNDQwLUw0NDhcbmZ1bmN0aW9uIGhvc3ROb0JyYWNrZXRzKGhvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChob3N0Lmxlbmd0aCA+PSAyICYmIGhvc3Quc3RhcnRzV2l0aCgnWycpICYmIGhvc3QuZW5kc1dpdGgoJ10nKSkge1xuICAgIHJldHVybiBob3N0LnN1YnN0cmluZygxLCBob3N0Lmxlbmd0aCAtIDEpXG4gIH1cbiAgcmV0dXJuIGhvc3Rcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgVVJMIHN0cmluZyByZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgb3JpZ2luLlxuICpcbiAqIEEgVVJMIGlzIGNvbnNpZGVyZWQgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgaWYgaXQ6XG4gKiAtIFVzZXMgSFRUUFMgb3IgV1NTIHNjaGVtZXNcbiAqIC0gSWYgYGFsbG93U2VjdXJlT25Mb2NhbGAgaXMgYHRydWVgOlxuICogICAtIFBvaW50cyB0byBhIGxvb3BiYWNrIGFkZHJlc3MgKElQdjQgMTI3LjAuMC4wLzggb3IgSVB2NiA6OjEpXG4gKiAgIC0gVXNlcyBsb2NhbGhvc3Qgb3IgKi5sb2NhbGhvc3QgaG9zdG5hbWVzXG4gKlxuICogQHBhcmFtIGlucHV0VXJsIC0gVGhlIFVSTCBzdHJpbmcgb3IgVVJMIG9iamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBhbGxvd1NlY3VyZU9uTG9jYWwgLSBXaGV0aGVyIHRvIHRyZWF0IGxvY2FsaG9zdCBhbmQgbG9vcGJhY2sgYWRkcmVzc2VzIGFzIHRydXN0d29ydGh5LlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBVUkwgaXMgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHksIG90aGVyd2lzZSBgZmFsc2VgLlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1zZWN1cmUtY29udGV4dHMvI3BvdGVudGlhbGx5LXRydXN0d29ydGh5LW9yaWdpbiB8IFBvdGVudGlhbGx5IFRydXN0d29ydGh5IE9yaWdpbiBhbGdvcml0aG19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvdGVudGlhbGx5VHJ1c3R3b3J0aHkoXG4gIGlucHV0VXJsOiBzdHJpbmcgfCBVUkwsXG4gIGFsbG93U2VjdXJlT25Mb2NhbDogYm9vbGVhbiA9IHRydWUsXG4pOiBib29sZWFuIHtcbiAgbGV0IHVybDogVVJMXG5cbiAgLy8gdHJ5IC4uLiBjYXRjaCBkb3VibGVzIGFzIGFuIG9wYXF1ZSBvcmlnaW4gY2hlY2tcbiAgaWYgKHR5cGVvZiBpbnB1dFVybCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgdXJsID0gbmV3IFVSTChpbnB1dFVybClcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB1cmwgPSBpbnB1dFVybFxuICB9XG5cbiAgY29uc3Qgc2NoZW1lID0gdXJsLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJykudG9Mb3dlckNhc2UoKVxuICBjb25zdCBob3N0bmFtZSA9IGhvc3ROb0JyYWNrZXRzKHVybC5ob3N0bmFtZSkucmVwbGFjZSgvXFwuKyQvLCAnJylcblxuICBpZiAoXG4gICAgc2NoZW1lID09PSAnaHR0cHMnIHx8XG4gICAgc2NoZW1lID09PSAnd3NzJyAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXNlY3VyZS1jb250ZXh0cy8jcG90ZW50aWFsbHktdHJ1c3R3b3J0aHktb3JpZ2luXG4gICkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoIWFsbG93U2VjdXJlT25Mb2NhbCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gSWYgaXQncyBhbHJlYWR5IGFuIElQIGxpdGVyYWwsIGNoZWNrIGlmIGl0J3MgYSBsb29wYmFjayBhZGRyZXNzXG4gIGlmIChJUF9WNF9SRUdFWF9PQkpFQ1QudGVzdChob3N0bmFtZSkpIHtcbiAgICByZXR1cm4gaXNMb29wYmFja1Y0KGhvc3RuYW1lKVxuICB9XG5cbiAgaWYgKElQX1Y2X1JFR0VYX09CSkVDVC50ZXN0KGhvc3RuYW1lKSkge1xuICAgIHJldHVybiBpc0xvb3BiYWNrVjYoaG9zdG5hbWUpXG4gIH1cblxuICAvLyBSRkMgNjc2MSBzdGF0ZXMgdGhhdCBsb2NhbGhvc3QgbmFtZXMgd2lsbCBhbHdheXMgcmVzb2x2ZVxuICAvLyB0byB0aGUgcmVzcGVjdGl2ZSBJUCBsb29wYmFjayBhZGRyZXNzOlxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY3NjEjc2VjdGlvbi02LjNcbiAgcmV0dXJuIGlzTG9jYWxIb3N0bmFtZShob3N0bmFtZSlcbn1cbiIsICJpbXBvcnQgeyBnZXRQdWJsaWNTdWZmaXggfSBmcm9tICcuLi9nZXRQdWJsaWNTdWZmaXguanMnXG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJy4uL3ZhbGlkYXRvcnMuanMnXG5pbXBvcnQgeyBQYXJhbWV0ZXJFcnJvciB9IGZyb20gJy4uL3ZhbGlkYXRvcnMuanMnXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJy4uL3N0b3JlLmpzJ1xuaW1wb3J0IHsgTWVtb3J5Q29va2llU3RvcmUgfSBmcm9tICcuLi9tZW1zdG9yZS5qcydcbmltcG9ydCB7IHBhdGhNYXRjaCB9IGZyb20gJy4uL3BhdGhNYXRjaC5qcydcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJy4vY29va2llLmpzJ1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2ssXG4gIGNyZWF0ZVByb21pc2VDYWxsYmFjayxcbiAgRXJyb3JDYWxsYmFjayxcbiAgaW5PcGVyYXRvcixcbiAgTnVsbGFibGUsXG4gIHNhZmVUb1N0cmluZyxcbn0gZnJvbSAnLi4vdXRpbHMuanMnXG5pbXBvcnQgeyBjYW5vbmljYWxEb21haW4gfSBmcm9tICcuL2Nhbm9uaWNhbERvbWFpbi5qcydcbmltcG9ydCB7XG4gIElQX1Y2X1JFR0VYX09CSkVDVCxcbiAgUHJlZml4U2VjdXJpdHlFbnVtLFxuICBTZXJpYWxpemVkQ29va2llSmFyLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGRlZmF1bHRQYXRoIH0gZnJvbSAnLi9kZWZhdWx0UGF0aC5qcydcbmltcG9ydCB7IGRvbWFpbk1hdGNoIH0gZnJvbSAnLi9kb21haW5NYXRjaC5qcydcbmltcG9ydCB7IGNvb2tpZUNvbXBhcmUgfSBmcm9tICcuL2Nvb2tpZUNvbXBhcmUuanMnXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcydcbmltcG9ydCB7IGlzUG90ZW50aWFsbHlUcnVzdHdvcnRoeSB9IGZyb20gJy4vc2VjdXJlQ29udGV4dC5qcydcblxuY29uc3QgZGVmYXVsdFNldENvb2tpZU9wdGlvbnM6IFNldENvb2tpZU9wdGlvbnMgPSB7XG4gIGxvb3NlOiBmYWxzZSxcbiAgc2FtZVNpdGVDb250ZXh0OiB1bmRlZmluZWQsXG4gIGlnbm9yZUVycm9yOiBmYWxzZSxcbiAgaHR0cDogdHJ1ZSxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCB3aGVuIGNhbGxpbmcgYENvb2tpZUphci5zZXRDb29raWUoLi4uKWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXRDb29raWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIGlmIGEgY29va2llIHN0cmluZyBzaG91bGQgYmUgcGFyc2VkIHVzaW5nIGBsb29zZWAgbW9kZSBvciBub3QuXG4gICAqIFNlZSB7QGxpbmsgQ29va2llLnBhcnNlfSBhbmQge0BsaW5rIFBhcnNlQ29va2llT3B0aW9uc30gZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBsb29zZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFNldCB0aGlzIHRvICdub25lJywgJ2xheCcsIG9yICdzdHJpY3QnIHRvIGVuZm9yY2UgU2FtZVNpdGUgY29va2llcyB1cG9uIHN0b3JhZ2UuXG4gICAqXG4gICAqIC0gYCdzdHJpY3QnYCAtIElmIHRoZSByZXF1ZXN0IGlzIG9uIHRoZSBzYW1lIFwic2l0ZSBmb3IgY29va2llc1wiIChzZWUgdGhlIFJGQyBkcmFmdFxuICAgKiAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24pLCBwYXNzIHRoaXMgb3B0aW9uIHRvIGFkZCBhIGxheWVyIG9mIGRlZmVuc2UgYWdhaW5zdCBDU1JGLlxuICAgKlxuICAgKiAtIGAnbGF4J2AgLSBJZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGFub3RoZXIgc2l0ZSwgYnV0IGlzIGRpcmVjdGx5IGJlY2F1c2Ugb2YgbmF2aWdhdGlvblxuICAgKiAgICAgYnkgdGhlIHVzZXIsIHN1Y2ggYXMsIGA8bGluayB0eXBlPXByZWZldGNoPmAgb3IgYDxhIGhyZWY9XCIuLi5cIj5gLCB0aGVuIHVzZSBgbGF4YC5cbiAgICpcbiAgICogLSBgJ25vbmUnYCAtIFRoaXMgaW5kaWNhdGVzIGEgY3Jvc3Mtb3JpZ2luIHJlcXVlc3QuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgLSBTYW1lU2l0ZSBpcyBub3QgZW5mb3JjZWQhIFRoaXMgY2FuIGJlIGEgdmFsaWQgdXNlLWNhc2UgZm9yIHdoZW5cbiAgICogICAgIENTUkYgaXNuJ3QgaW4gdGhlIHRocmVhdCBtb2RlbCBvZiB0aGUgc3lzdGVtIGJlaW5nIGJ1aWx0LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYCBpZiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHJlYWQge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcy0wMiMjc2VjdGlvbi04LjggfCBSRkM2MjY1YmlzIC0gU2VjdGlvbiA4Ljh9XG4gICAqICAgIHdoaWNoIGRpc2N1c3NlcyBzZWN1cml0eSBjb25zaWRlcmF0aW9ucyBhbmQgZGVmZW5jZSBvbiBTYW1lU2l0ZSBjb29raWVzIGluIGRlcHRoLlxuICAgKi9cbiAgc2FtZVNpdGVDb250ZXh0PzogJ3N0cmljdCcgfCAnbGF4JyB8ICdub25lJyB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogU2lsZW50bHkgaWdub3JlIHRoaW5ncyBsaWtlIHBhcnNlIGVycm9ycyBhbmQgaW52YWxpZCBkb21haW5zLiBTdG9yZSBlcnJvcnMgYXJlbid0IGlnbm9yZWQgYnkgdGhpcyBvcHRpb24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgaWdub3JlRXJyb3I/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyBhbiBIVFRQIG9yIG5vbi1IVFRQIEFQSS4gQWZmZWN0cyBIdHRwT25seSBjb29raWVzLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgaHR0cD86IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIEZvcmNlcyB0aGUgY29va2llIGNyZWF0aW9uIGFuZCBhY2Nlc3MgdGltZSBvZiBjb29raWVzIHRvIHRoaXMgdmFsdWUgd2hlbiBzdG9yZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBEYXRlLm5vdygpYCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBub3c/OiBEYXRlIHwgdW5kZWZpbmVkXG59XG5cbmNvbnN0IGRlZmF1bHRHZXRDb29raWVPcHRpb25zOiBHZXRDb29raWVzT3B0aW9ucyA9IHtcbiAgaHR0cDogdHJ1ZSxcbiAgZXhwaXJlOiB0cnVlLFxuICBhbGxQYXRoczogZmFsc2UsXG4gIHNhbWVTaXRlQ29udGV4dDogdW5kZWZpbmVkLFxuICBzb3J0OiB1bmRlZmluZWQsXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgd2hlbiBjYWxsaW5nIGBDb29raWVKYXIuZ2V0Q29va2llcyguLi4pYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRDb29raWVzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyBhbiBIVFRQIG9yIG5vbi1IVFRQIEFQSS4gQWZmZWN0cyBIdHRwT25seSBjb29raWVzLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgaHR0cD86IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFBlcmZvcm0gYGV4cGlyeS10aW1lYCBjaGVja2luZyBvZiBjb29raWVzIGFuZCBhc3luY2hyb25vdXNseSByZW1vdmUgZXhwaXJlZFxuICAgKiBjb29raWVzIGZyb20gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFVzaW5nIGBmYWxzZWAgcmV0dXJucyBleHBpcmVkIGNvb2tpZXMgYW5kIGRvZXMgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlXG4gICAqICAgICBzdG9yZSwgd2hpY2ggaXMgcG90ZW50aWFsbHkgdXNlZnVsIGZvciByZXBsYXlpbmcgYFNldC1Db29raWVgIGhlYWRlcnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBleHBpcmU/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGRvIG5vdCBzY29wZSBjb29raWVzIGJ5IHBhdGguIElmIGBmYWxzZWAsIHRoZW4gUkZDLWNvbXBsaWFudCBwYXRoIHNjb3Bpbmcgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIE1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN0b3JlICh0aGUgZGVmYXVsdCB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9IHN1cHBvcnRzIGl0KS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBhbGxQYXRocz86IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFNldCB0aGlzIHRvICdub25lJywgJ2xheCcsIG9yICdzdHJpY3QnIHRvIGVuZm9yY2UgU2FtZVNpdGUgY29va2llcyB1cG9uIHJldHJpZXZhbC5cbiAgICpcbiAgICogLSBgJ3N0cmljdCdgIC0gSWYgdGhlIHJlcXVlc3QgaXMgb24gdGhlIHNhbWUgXCJzaXRlIGZvciBjb29raWVzXCIgKHNlZSB0aGUgUkZDIGRyYWZ0XG4gICAqICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiksIHBhc3MgdGhpcyBvcHRpb24gdG8gYWRkIGEgbGF5ZXIgb2YgZGVmZW5zZSBhZ2FpbnN0IENTUkYuXG4gICAqXG4gICAqIC0gYCdsYXgnYCAtIElmIHRoZSByZXF1ZXN0IGlzIGZyb20gYW5vdGhlciBzaXRlLCBidXQgaXMgZGlyZWN0bHkgYmVjYXVzZSBvZiBuYXZpZ2F0aW9uXG4gICAqICAgICBieSB0aGUgdXNlciwgc3VjaCBhcywgYDxsaW5rIHR5cGU9cHJlZmV0Y2g+YCBvciBgPGEgaHJlZj1cIi4uLlwiPmAsIHRoZW4gdXNlIGBsYXhgLlxuICAgKlxuICAgKiAtIGAnbm9uZSdgIC0gVGhpcyBpbmRpY2F0ZXMgYSBjcm9zcy1vcmlnaW4gcmVxdWVzdC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAtIFNhbWVTaXRlIGlzIG5vdCBlbmZvcmNlZCEgVGhpcyBjYW4gYmUgYSB2YWxpZCB1c2UtY2FzZSBmb3Igd2hlblxuICAgKiAgICAgQ1NSRiBpc24ndCBpbiB0aGUgdGhyZWF0IG1vZGVsIG9mIHRoZSBzeXN0ZW0gYmVpbmcgYnVpbHQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgIGlmIG5vdCBwcm92aWRlZC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVhZCB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzLTAyIyNzZWN0aW9uLTguOCB8IFJGQzYyNjViaXMgLSBTZWN0aW9uIDguOH1cbiAgICogICAgd2hpY2ggZGlzY3Vzc2VzIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zIGFuZCBkZWZlbmNlIG9uIFNhbWVTaXRlIGNvb2tpZXMgaW4gZGVwdGguXG4gICAqL1xuICBzYW1lU2l0ZUNvbnRleHQ/OiAnbm9uZScgfCAnbGF4JyB8ICdzdHJpY3QnIHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSByZXR1cm5lZCBjb29raWVzIHNob3VsZCBiZSBzb3J0ZWQgb3Igbm90LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBzb3J0PzogYm9vbGVhbiB8IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8gYmUgdXNlZCB3aXRoIGEge0BsaW5rIENvb2tpZUphcn0uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ29va2llSmFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZWplY3QgY29va2llcyB0aGF0IG1hdGNoIHRob3NlIGRlZmluZWQgaW4gdGhlIHtAbGluayBodHRwczovL3B1YmxpY3N1ZmZpeC5vcmcvIHwgUHVibGljIFN1ZmZpeCBMaXN0fSAoZS5nLjsgZG9tYWlucyBsaWtlIFwiY29tXCIgYW5kIFwiY28udWtcIikuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVqZWN0UHVibGljU3VmZml4ZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBBY2NlcHQgbWFsZm9ybWVkIGNvb2tpZXMgbGlrZSBgYmFyYCBhbmQgYD1iYXJgLCB3aGljaCBoYXZlIGFuIGltcGxpZWQgZW1wdHkgbmFtZSBidXQgYXJlIG5vdCBSRkMtY29tcGxpYW50LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICBsb29zZU1vZGU/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgY29va2llIHByZWZpeGVzIGFyZSBoYW5kbGVkLiBTZWUge0BsaW5rIFByZWZpeFNlY3VyaXR5RW51bX0uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBzaWxlbnRgIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICBwcmVmaXhTZWN1cml0eT86ICdzdHJpY3QnIHwgJ3NpbGVudCcgfCAndW5zYWZlLWRpc2FibGVkJyB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQWNjZXB0cyB7QGxpbmsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NzYxIHwgc3BlY2lhbC11c2UgZG9tYWlucyB9IHN1Y2ggYXMgYGxvY2FsYC5cbiAgICogVGhpcyBpcyBub3QgaW4gdGhlIHN0YW5kYXJkLCBidXQgaXMgdXNlZCBzb21ldGltZXMgb24gdGhlIHdlYiBhbmQgaXMgYWNjZXB0ZWQgYnkgbW9zdCBicm93c2Vycy4gSXQgaXNcbiAgICogYWxzbyB1c2VmdWwgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgYWxsb3dTcGVjaWFsVXNlRG9tYWluPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogRmxhZyB0byBpbmRpY2F0ZSBpZiBsb2NhbGhvc3QgYW5kIGxvb3BiYWNrIGFkZHJlc3NlcyB3aXRoIGFuIHVuc2VjdXJlIHNjaGVtZSBzaG91bGQgc3RvcmUgYW5kIHJldHJpZXZlIGBTZWN1cmVgIGNvb2tpZXMuXG4gICAqXG4gICAqIElmIGB0cnVlYCwgbG9jYWxob3N0LCBsb29wYmFjayBhZGRyZXNzZXMgb3Igc2ltaWxhcmx5IGxvY2FsIGFkZHJlc3NlcyBhcmUgdHJlYXRlZCBhcyBzZWN1cmUgY29udGV4dHNcbiAgICogYW5kIHRodXMgd2lsbCBzdG9yZSBhbmQgcmV0cmlldmUgYFNlY3VyZWAgY29va2llcyBldmVuIHdpdGggYW4gdW5zZWN1cmUgc2NoZW1lLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgLCBvbmx5IHNlY3VyZSBzY2hlbWVzIChgaHR0cHNgIGFuZCBgd3NzYCkgd2lsbCBzdG9yZSBhbmQgcmV0cmlldmUgYFNlY3VyZWAgY29va2llcy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc2VjdXJlLWNvbnRleHRzLyNwb3RlbnRpYWxseS10cnVzdHdvcnRoeS1vcmlnaW4gfCBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeX1cbiAgICogIGFsZ29yaXRobSBpcyBmb2xsb3dlZCB0byBkZXRlcm1pbmUgaWYgYSBVUkwgaXMgY29uc2lkZXJlZCBhIHNlY3VyZSBjb250ZXh0LlxuICAgKi9cbiAgYWxsb3dTZWN1cmVPbkxvY2FsPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxufVxuXG5jb25zdCBTQU1FX1NJVEVfQ09OVEVYVF9WQUxfRVJSID1cbiAgJ0ludmFsaWQgc2FtZVNpdGVDb250ZXh0IG9wdGlvbiBmb3IgZ2V0Q29va2llcygpOyBleHBlY3RlZCBvbmUgb2YgXCJzdHJpY3RcIiwgXCJsYXhcIiwgb3IgXCJub25lXCInXG5cbnR5cGUgVXJsQ29udGV4dCA9IHtcbiAgaG9zdG5hbWU6IHN0cmluZ1xuICBwYXRobmFtZTogc3RyaW5nXG4gIHByb3RvY29sOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llQ29udGV4dCh1cmw6IHVua25vd24pOiBVcmxDb250ZXh0IHtcbiAgaWYgKFxuICAgIHVybCAmJlxuICAgIHR5cGVvZiB1cmwgPT09ICdvYmplY3QnICYmXG4gICAgJ2hvc3RuYW1lJyBpbiB1cmwgJiZcbiAgICB0eXBlb2YgdXJsLmhvc3RuYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICdwYXRobmFtZScgaW4gdXJsICYmXG4gICAgdHlwZW9mIHVybC5wYXRobmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAncHJvdG9jb2wnIGluIHVybCAmJlxuICAgIHR5cGVvZiB1cmwucHJvdG9jb2wgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgcGF0aG5hbWU6IHVybC5wYXRobmFtZSxcbiAgICAgIHByb3RvY29sOiB1cmwucHJvdG9jb2wsXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGRlY29kZVVSSSh1cmwpKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG5ldyBVUkwodXJsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgUGFyYW1ldGVyRXJyb3IoJ2B1cmxgIGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZyBvciBVUkwuJylcbiAgfVxufVxuXG50eXBlIFNhbWVTaXRlTGV2ZWwgPSBrZXlvZiAodHlwZW9mIENvb2tpZSlbJ3NhbWVTaXRlTGV2ZWwnXVxuZnVuY3Rpb24gY2hlY2tTYW1lU2l0ZUNvbnRleHQodmFsdWU6IHN0cmluZyk6IFNhbWVTaXRlTGV2ZWwgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb250ZXh0ID0gU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChjb250ZXh0ID09PSAnbm9uZScgfHwgY29udGV4dCA9PT0gJ2xheCcgfHwgY29udGV4dCA9PT0gJ3N0cmljdCcpIHtcbiAgICByZXR1cm4gY29udGV4dFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqICBJZiB0aGUgY29va2llLW5hbWUgYmVnaW5zIHdpdGggYSBjYXNlLXNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlXG4gKiAgc3RyaW5nIFwiX19TZWN1cmUtXCIsIGFib3J0IHRoZXNlIHN0ZXBzIGFuZCBpZ25vcmUgdGhlIGNvb2tpZVxuICogIGVudGlyZWx5IHVubGVzcyB0aGUgY29va2llJ3Mgc2VjdXJlLW9ubHktZmxhZyBpcyB0cnVlLlxuICogQHBhcmFtIGNvb2tpZVxuICogQHJldHVybnMgYm9vbGVhblxuICovXG5mdW5jdGlvbiBpc1NlY3VyZVByZWZpeENvbmRpdGlvbk1ldChjb29raWU6IENvb2tpZSk6IGJvb2xlYW4ge1xuICBjb25zdCBzdGFydHNXaXRoU2VjdXJlUHJlZml4ID1cbiAgICB0eXBlb2YgY29va2llLmtleSA9PT0gJ3N0cmluZycgJiYgY29va2llLmtleS5zdGFydHNXaXRoKCdfX1NlY3VyZS0nKVxuICByZXR1cm4gIXN0YXJ0c1dpdGhTZWN1cmVQcmVmaXggfHwgY29va2llLnNlY3VyZVxufVxuXG4vKipcbiAqICBJZiB0aGUgY29va2llLW5hbWUgYmVnaW5zIHdpdGggYSBjYXNlLXNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlXG4gKiAgc3RyaW5nIFwiX19Ib3N0LVwiLCBhYm9ydCB0aGVzZSBzdGVwcyBhbmQgaWdub3JlIHRoZSBjb29raWVcbiAqICBlbnRpcmVseSB1bmxlc3MgdGhlIGNvb2tpZSBtZWV0cyBhbGwgdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcbiAqICAgIDEuICBUaGUgY29va2llJ3Mgc2VjdXJlLW9ubHktZmxhZyBpcyB0cnVlLlxuICogICAgMi4gIFRoZSBjb29raWUncyBob3N0LW9ubHktZmxhZyBpcyB0cnVlLlxuICogICAgMy4gIFRoZSBjb29raWUtYXR0cmlidXRlLWxpc3QgY29udGFpbnMgYW4gYXR0cmlidXRlIHdpdGggYW5cbiAqICAgICAgICBhdHRyaWJ1dGUtbmFtZSBvZiBcIlBhdGhcIiwgYW5kIHRoZSBjb29raWUncyBwYXRoIGlzIFwiL1wiLlxuICogQHBhcmFtIGNvb2tpZVxuICogQHJldHVybnMgYm9vbGVhblxuICovXG5mdW5jdGlvbiBpc0hvc3RQcmVmaXhDb25kaXRpb25NZXQoY29va2llOiBDb29raWUpOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhcnRzV2l0aEhvc3RQcmVmaXggPVxuICAgIHR5cGVvZiBjb29raWUua2V5ID09PSAnc3RyaW5nJyAmJiBjb29raWUua2V5LnN0YXJ0c1dpdGgoJ19fSG9zdC0nKVxuICByZXR1cm4gKFxuICAgICFzdGFydHNXaXRoSG9zdFByZWZpeCB8fFxuICAgIEJvb2xlYW4oXG4gICAgICBjb29raWUuc2VjdXJlICYmXG4gICAgICAgIGNvb2tpZS5ob3N0T25seSAmJlxuICAgICAgICBjb29raWUucGF0aCAhPSBudWxsICYmXG4gICAgICAgIGNvb2tpZS5wYXRoID09PSAnLycsXG4gICAgKVxuICApXG59XG5cbnR5cGUgUHJlZml4U2VjdXJpdHlWYWx1ZSA9XG4gICh0eXBlb2YgUHJlZml4U2VjdXJpdHlFbnVtKVtrZXlvZiB0eXBlb2YgUHJlZml4U2VjdXJpdHlFbnVtXVxuZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZFByZWZpeFNlY3VyaXR5KFxuICBwcmVmaXhTZWN1cml0eTogc3RyaW5nLFxuKTogUHJlZml4U2VjdXJpdHlWYWx1ZSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQcmVmaXhTZWN1cml0eSA9IHByZWZpeFNlY3VyaXR5LnRvTG93ZXJDYXNlKClcbiAgLyogVGhlIHRocmVlIHN1cHBvcnRlZCBvcHRpb25zICovXG4gIHN3aXRjaCAobm9ybWFsaXplZFByZWZpeFNlY3VyaXR5KSB7XG4gICAgY2FzZSBQcmVmaXhTZWN1cml0eUVudW0uU1RSSUNUOlxuICAgIGNhc2UgUHJlZml4U2VjdXJpdHlFbnVtLlNJTEVOVDpcbiAgICBjYXNlIFByZWZpeFNlY3VyaXR5RW51bS5ESVNBQkxFRDpcbiAgICAgIHJldHVybiBub3JtYWxpemVkUHJlZml4U2VjdXJpdHlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFByZWZpeFNlY3VyaXR5RW51bS5TSUxFTlRcbiAgfVxufVxuXG4vKipcbiAqIEEgQ29va2llSmFyIGlzIGZvciBzdG9yYWdlIGFuZCByZXRyaWV2YWwgb2Yge0BsaW5rIENvb2tpZX0gb2JqZWN0cyBhcyBkZWZpbmVkIGluXG4gKiB7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUuaHRtbCNzZWN0aW9uLTUuMyB8IFJGQzYyNjUgLSBTZWN0aW9uIDUuM30uXG4gKlxuICogSXQgYWxzbyBzdXBwb3J0cyBhIHBsdWdnYWJsZSBwZXJzaXN0ZW5jZSBsYXllciB2aWEge0BsaW5rIFN0b3JlfS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIENvb2tpZUphciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVqZWN0UHVibGljU3VmZml4ZXM6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBlbmFibGVMb29zZU1vZGU6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd1NwZWNpYWxVc2VEb21haW46IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd1NlY3VyZU9uTG9jYWw6IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyZWQge0BsaW5rIFN0b3JlfSBmb3IgdGhlIHtAbGluayBDb29raWVKYXJ9LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmU6IFN0b3JlXG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmVkIHtAbGluayBQcmVmaXhTZWN1cml0eUVudW19IHZhbHVlIGZvciB0aGUge0BsaW5rIENvb2tpZUphcn0uXG4gICAqL1xuICByZWFkb25seSBwcmVmaXhTZWN1cml0eTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYENvb2tpZUphcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gSWYgYSBjdXN0b20gc3RvcmUgaXMgbm90IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IsIGFuIGluLW1lbW9yeSBzdG9yZSAoe0BsaW5rIE1lbW9yeUNvb2tpZVN0b3JlfSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHVzZWQuXG4gICAqIC0gSWYgYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCBhcyB0aGUgYG9wdGlvbnNgIHBhcmFtZXRlciwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYHsgcmVqZWN0UHVibGljU3VmZml4ZXM6IDx2YWx1ZT4gfWBcbiAgICpcbiAgICogQHBhcmFtIHN0b3JlIC0gYSBjdXN0b20ge0BsaW5rIFN0b3JlfSBpbXBsZW1lbnRhdGlvbiAoZGVmYXVsdHMgdG8ge0BsaW5rIE1lbW9yeUNvb2tpZVN0b3JlfSlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBjb25maWd1cmVzIGhvdyBjb29raWVzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGNvb2tpZSBqYXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0b3JlPzogTnVsbGFibGU8U3RvcmU+LFxuICAgIG9wdGlvbnM/OiBDcmVhdGVDb29raWVKYXJPcHRpb25zIHwgYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpIHtcbiAgICAgIG9wdGlvbnMgPSB7IHJlamVjdFB1YmxpY1N1ZmZpeGVzOiBvcHRpb25zIH1cbiAgICB9XG4gICAgdGhpcy5yZWplY3RQdWJsaWNTdWZmaXhlcyA9IG9wdGlvbnM/LnJlamVjdFB1YmxpY1N1ZmZpeGVzID8/IHRydWVcbiAgICB0aGlzLmVuYWJsZUxvb3NlTW9kZSA9IG9wdGlvbnM/Lmxvb3NlTW9kZSA/PyBmYWxzZVxuICAgIHRoaXMuYWxsb3dTcGVjaWFsVXNlRG9tYWluID0gb3B0aW9ucz8uYWxsb3dTcGVjaWFsVXNlRG9tYWluID8/IHRydWVcbiAgICB0aGlzLmFsbG93U2VjdXJlT25Mb2NhbCA9IG9wdGlvbnM/LmFsbG93U2VjdXJlT25Mb2NhbCA/PyB0cnVlXG4gICAgdGhpcy5wcmVmaXhTZWN1cml0eSA9IGdldE5vcm1hbGl6ZWRQcmVmaXhTZWN1cml0eShcbiAgICAgIG9wdGlvbnM/LnByZWZpeFNlY3VyaXR5ID8/ICdzaWxlbnQnLFxuICAgIClcbiAgICB0aGlzLnN0b3JlID0gc3RvcmUgPz8gbmV3IE1lbW9yeUNvb2tpZVN0b3JlKClcbiAgfVxuXG4gIHByaXZhdGUgY2FsbFN5bmM8VD4oXG4gICAgZm46ICh0aGlzOiBDb29raWVKYXIsIGNhbGxiYWNrOiBDYWxsYmFjazxUPikgPT4gdm9pZCxcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnN0b3JlLnN5bmNocm9ub3VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb29raWVKYXIgc3RvcmUgaXMgbm90IHN5bmNocm9ub3VzOyB1c2UgYXN5bmMgQVBJIGluc3RlYWQuJyxcbiAgICAgIClcbiAgICB9XG4gICAgbGV0IHN5bmNFcnI6IEVycm9yIHwgbnVsbCA9IG51bGxcbiAgICBsZXQgc3luY1Jlc3VsdDogVCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIGZuLmNhbGwodGhpcywgKGVycm9yOiBFcnJvciB8IG51bGwsIHJlc3VsdD86IFQpID0+IHtcbiAgICAgICAgc3luY0VyciA9IGVycm9yXG4gICAgICAgIHN5bmNSZXN1bHQgPSByZXN1bHRcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzeW5jRXJyID0gZXJyIGFzIEVycm9yXG4gICAgfVxuXG4gICAgaWYgKHN5bmNFcnIpIHRocm93IHN5bmNFcnJcblxuICAgIHJldHVybiBzeW5jUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBzZXQgdGhlIHtAbGluayBDb29raWV9IGluIHRoZSB7QGxpbmsgQ29va2llSmFyfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBJZiBzdWNjZXNzZnVsbHkgcGVyc2lzdGVkLCB0aGUge0BsaW5rIENvb2tpZX0gd2lsbCBoYXZlIHVwZGF0ZWRcbiAgICogICAgIHtAbGluayBDb29raWUuY3JlYXRpb259LCB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gYW5kIHtAbGluayBDb29raWUuaG9zdE9ubHl9XG4gICAqICAgICBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAtIEFzIHBlciB0aGUgUkZDLCB0aGUge0BsaW5rIENvb2tpZS5ob3N0T25seX0gZmxhZyBpcyBzZXQgaWYgdGhlcmUgd2FzIG5vIGBEb21haW49e3ZhbHVlfWBcbiAgICogICAgIGF0dHJpYnV0ZSBvbiB0aGUgY29va2llIHN0cmluZy4gVGhlIHtAbGluayBDb29raWUuZG9tYWlufSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlXG4gICAqICAgICBmdWxseS1xdWFsaWZpZWQgaG9zdG5hbWUgb2YgYGN1cnJlbnRVcmxgIGluIHRoaXMgY2FzZS4gTWF0Y2hpbmcgdGhpcyBjb29raWUgcmVxdWlyZXMgYW5cbiAgICogICAgIGV4YWN0IGhvc3RuYW1lIG1hdGNoIChub3QgYSB7QGxpbmsgZG9tYWluTWF0Y2h9IGFzIHBlciB1c3VhbClcbiAgICpcbiAgICogQHBhcmFtIGNvb2tpZSAtIFRoZSBjb29raWUgb2JqZWN0IG9yIGNvb2tpZSBzdHJpbmcgdG8gc3RvcmUuIEEgc3RyaW5nIHZhbHVlIHdpbGwgYmUgcGFyc2VkIGludG8gYSBjb29raWUgdXNpbmcge0BsaW5rIENvb2tpZS5wYXJzZX0uXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIGEgY29va2llIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdG9yZWQuXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHNldENvb2tpZShcbiAgICBjb29raWU6IHN0cmluZyB8IENvb2tpZSxcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2s8Q29va2llIHwgdW5kZWZpbmVkPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogQXR0ZW1wdCB0byBzZXQgdGhlIHtAbGluayBDb29raWV9IGluIHRoZSB7QGxpbmsgQ29va2llSmFyfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBJZiBzdWNjZXNzZnVsbHkgcGVyc2lzdGVkLCB0aGUge0BsaW5rIENvb2tpZX0gd2lsbCBoYXZlIHVwZGF0ZWRcbiAgICogICAgIHtAbGluayBDb29raWUuY3JlYXRpb259LCB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gYW5kIHtAbGluayBDb29raWUuaG9zdE9ubHl9XG4gICAqICAgICBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAtIEFzIHBlciB0aGUgUkZDLCB0aGUge0BsaW5rIENvb2tpZS5ob3N0T25seX0gZmxhZyBpcyBzZXQgaWYgdGhlcmUgd2FzIG5vIGBEb21haW49e3ZhbHVlfWBcbiAgICogICAgIGF0dHJpYnV0ZSBvbiB0aGUgY29va2llIHN0cmluZy4gVGhlIHtAbGluayBDb29raWUuZG9tYWlufSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlXG4gICAqICAgICBmdWxseS1xdWFsaWZpZWQgaG9zdG5hbWUgb2YgYGN1cnJlbnRVcmxgIGluIHRoaXMgY2FzZS4gTWF0Y2hpbmcgdGhpcyBjb29raWUgcmVxdWlyZXMgYW5cbiAgICogICAgIGV4YWN0IGhvc3RuYW1lIG1hdGNoIChub3QgYSB7QGxpbmsgZG9tYWluTWF0Y2h9IGFzIHBlciB1c3VhbClcbiAgICpcbiAgICogQHBhcmFtIGNvb2tpZSAtIFRoZSBjb29raWUgb2JqZWN0IG9yIGNvb2tpZSBzdHJpbmcgdG8gc3RvcmUuIEEgc3RyaW5nIHZhbHVlIHdpbGwgYmUgcGFyc2VkIGludG8gYSBjb29raWUgdXNpbmcge0BsaW5rIENvb2tpZS5wYXJzZX0uXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIHVzZSB3aGVuIHN0b3JpbmcgdGhlIGNvb2tpZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIGEgY29va2llIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdG9yZWQuXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHNldENvb2tpZShcbiAgICBjb29raWU6IHN0cmluZyB8IENvb2tpZSxcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICBvcHRpb25zOiBTZXRDb29raWVPcHRpb25zLFxuICAgIGNhbGxiYWNrOiBDYWxsYmFjazxDb29raWUgfCB1bmRlZmluZWQ+LFxuICApOiB2b2lkXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHNldCB0aGUge0BsaW5rIENvb2tpZX0gaW4gdGhlIHtAbGluayBDb29raWVKYXJ9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIElmIHN1Y2Nlc3NmdWxseSBwZXJzaXN0ZWQsIHRoZSB7QGxpbmsgQ29va2llfSB3aWxsIGhhdmUgdXBkYXRlZFxuICAgKiAgICAge0BsaW5rIENvb2tpZS5jcmVhdGlvbn0sIHtAbGluayBDb29raWUubGFzdEFjY2Vzc2VkfSBhbmQge0BsaW5rIENvb2tpZS5ob3N0T25seX1cbiAgICogICAgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIC0gQXMgcGVyIHRoZSBSRkMsIHRoZSB7QGxpbmsgQ29va2llLmhvc3RPbmx5fSBmbGFnIGlzIHNldCBpZiB0aGVyZSB3YXMgbm8gYERvbWFpbj17dmFsdWV9YFxuICAgKiAgICAgYXR0cmlidXRlIG9uIHRoZSBjb29raWUgc3RyaW5nLiBUaGUge0BsaW5rIENvb2tpZS5kb21haW59IHByb3BlcnR5IGlzIHNldCB0byB0aGVcbiAgICogICAgIGZ1bGx5LXF1YWxpZmllZCBob3N0bmFtZSBvZiBgY3VycmVudFVybGAgaW4gdGhpcyBjYXNlLiBNYXRjaGluZyB0aGlzIGNvb2tpZSByZXF1aXJlcyBhblxuICAgKiAgICAgZXhhY3QgaG9zdG5hbWUgbWF0Y2ggKG5vdCBhIHtAbGluayBkb21haW5NYXRjaH0gYXMgcGVyIHVzdWFsKVxuICAgKlxuICAgKiBAcGFyYW0gY29va2llIC0gVGhlIGNvb2tpZSBvYmplY3Qgb3IgY29va2llIHN0cmluZyB0byBzdG9yZS4gQSBzdHJpbmcgdmFsdWUgd2lsbCBiZSBwYXJzZWQgaW50byBhIGNvb2tpZSB1c2luZyB7QGxpbmsgQ29va2llLnBhcnNlfS5cbiAgICogQHBhcmFtIHVybCAtIFRoZSBkb21haW4gdG8gc3RvcmUgdGhlIGNvb2tpZSB3aXRoLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8gdXNlIHdoZW4gc3RvcmluZyB0aGUgY29va2llLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzZXRDb29raWUoXG4gICAgY29va2llOiBzdHJpbmcgfCBDb29raWUsXG4gICAgdXJsOiBzdHJpbmcgfCBVUkwsXG4gICAgb3B0aW9ucz86IFNldENvb2tpZU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29va2llIHwgdW5kZWZpbmVkPlxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIHNldENvb2tpZShcbiAgICBjb29raWU6IHN0cmluZyB8IENvb2tpZSxcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICBvcHRpb25zOiBTZXRDb29raWVPcHRpb25zIHwgQ2FsbGJhY2s8Q29va2llIHwgdW5kZWZpbmVkPixcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZSB8IHVuZGVmaW5lZD4sXG4gICk6IHVua25vd25cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIHRoZSBvdmVybG9hZCBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgc2V0Q29va2llKFxuICAgIGNvb2tpZTogc3RyaW5nIHwgQ29va2llLFxuICAgIHVybDogc3RyaW5nIHwgVVJMLFxuICAgIG9wdGlvbnM/OiBTZXRDb29raWVPcHRpb25zIHwgQ2FsbGJhY2s8Q29va2llIHwgdW5kZWZpbmVkPixcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZSB8IHVuZGVmaW5lZD4sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gICAgICBvcHRpb25zID0gdW5kZWZpbmVkXG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VDYWxsYmFjayA9IGNyZWF0ZVByb21pc2VDYWxsYmFjayhjYWxsYmFjaylcbiAgICBjb25zdCBjYiA9IHByb21pc2VDYWxsYmFjay5jYWxsYmFja1xuICAgIGxldCBjb250ZXh0OiBVcmxDb250ZXh0XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGUoXG4gICAgICAgICAgdmFsaWRhdG9ycy5pc05vbkVtcHR5U3RyaW5nKHVybCksXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgc2FmZVRvU3RyaW5nKG9wdGlvbnMpLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBnZXRDb29raWVDb250ZXh0KHVybClcblxuICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZWplY3QobmV3IEVycm9yKCdObyBVUkwgd2FzIHNwZWNpZmllZCcpKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0aW9ucyA9IGRlZmF1bHRTZXRDb29raWVPcHRpb25zXG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGUodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nLCBjYilcblxuICAgICAgaWYgKFxuICAgICAgICAhdmFsaWRhdG9ycy5pc05vbkVtcHR5U3RyaW5nKGNvb2tpZSkgJiZcbiAgICAgICAgIXZhbGlkYXRvcnMuaXNPYmplY3QoY29va2llKSAmJlxuICAgICAgICBjb29raWUgaW5zdGFuY2VvZiBTdHJpbmcgJiZcbiAgICAgICAgY29va2llLmxlbmd0aCA9PSAwXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICB9XG5cbiAgICBjb25zdCBob3N0ID0gY2Fub25pY2FsRG9tYWluKGNvbnRleHQuaG9zdG5hbWUpID8/IG51bGxcbiAgICBjb25zdCBsb29zZSA9IG9wdGlvbnM/Lmxvb3NlIHx8IHRoaXMuZW5hYmxlTG9vc2VNb2RlXG5cbiAgICBsZXQgc2FtZVNpdGVDb250ZXh0ID0gbnVsbFxuICAgIGlmIChvcHRpb25zPy5zYW1lU2l0ZUNvbnRleHQpIHtcbiAgICAgIHNhbWVTaXRlQ29udGV4dCA9IGNoZWNrU2FtZVNpdGVDb250ZXh0KG9wdGlvbnMuc2FtZVNpdGVDb250ZXh0KVxuICAgICAgaWYgKCFzYW1lU2l0ZUNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZWplY3QobmV3IEVycm9yKFNBTUVfU0lURV9DT05URVhUX1ZBTF9FUlIpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFM1LjMgc3RlcCAxXG4gICAgaWYgKHR5cGVvZiBjb29raWUgPT09ICdzdHJpbmcnIHx8IGNvb2tpZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgY29uc3QgcGFyc2VkQ29va2llID0gQ29va2llLnBhcnNlKGNvb2tpZS50b1N0cmluZygpLCB7IGxvb3NlOiBsb29zZSB9KVxuICAgICAgaWYgKCFwYXJzZWRDb29raWUpIHtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdDb29raWUgZmFpbGVkIHRvIHBhcnNlJylcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM/Lmlnbm9yZUVycm9yXG4gICAgICAgICAgPyBwcm9taXNlQ2FsbGJhY2sucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgOiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICAgIGNvb2tpZSA9IHBhcnNlZENvb2tpZVxuICAgIH0gZWxzZSBpZiAoIShjb29raWUgaW5zdGFuY2VvZiBDb29raWUpKSB7XG4gICAgICAvLyBJZiB5b3UncmUgc2VlaW5nIHRoaXMgZXJyb3IsIGFuZCBhcmUgcGFzc2luZyBpbiBhIENvb2tpZSBvYmplY3QsXG4gICAgICAvLyBpdCAqbWlnaHQqIGJlIGEgQ29va2llIG9iamVjdCBmcm9tIGFub3RoZXIgbG9hZGVkIHZlcnNpb24gb2YgdG91Z2gtY29va2llLlxuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAnRmlyc3QgYXJndW1lbnQgdG8gc2V0Q29va2llIG11c3QgYmUgYSBDb29raWUgb2JqZWN0IG9yIHN0cmluZycsXG4gICAgICApXG5cbiAgICAgIHJldHVybiBvcHRpb25zPy5pZ25vcmVFcnJvclxuICAgICAgICA/IHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgOiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KGVycilcbiAgICB9XG5cbiAgICAvLyBTNS4zIHN0ZXAgMlxuICAgIGNvbnN0IG5vdyA9IG9wdGlvbnM/Lm5vdyB8fCBuZXcgRGF0ZSgpIC8vIHdpbGwgYXNzaWduIGxhdGVyIHRvIHNhdmUgZWZmb3J0IGluIHRoZSBmYWNlIG9mIGVycm9yc1xuXG4gICAgLy8gUzUuMyBzdGVwIDM6IE5PT1A7IHBlcnNpc3RlbnQtZmxhZyBhbmQgZXhwaXJ5LXRpbWUgaXMgaGFuZGxlZCBieSBnZXRDb29raWUoKVxuXG4gICAgLy8gUzUuMyBzdGVwIDQ6IE5PT1A7IGRvbWFpbiBpcyBudWxsIGJ5IGRlZmF1bHRcblxuICAgIC8vIFM1LjMgc3RlcCA1OiBwdWJsaWMgc3VmZml4ZXNcbiAgICBpZiAodGhpcy5yZWplY3RQdWJsaWNTdWZmaXhlcyAmJiBjb29raWUuZG9tYWluKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjZG9tYWluID0gY29va2llLmNkb21haW4oKVxuICAgICAgICBjb25zdCBzdWZmaXggPVxuICAgICAgICAgIHR5cGVvZiBjZG9tYWluID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBnZXRQdWJsaWNTdWZmaXgoY2RvbWFpbiwge1xuICAgICAgICAgICAgICAgIGFsbG93U3BlY2lhbFVzZURvbWFpbjogdGhpcy5hbGxvd1NwZWNpYWxVc2VEb21haW4sXG4gICAgICAgICAgICAgICAgaWdub3JlRXJyb3I6IG9wdGlvbnM/Lmlnbm9yZUVycm9yLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGlmIChzdWZmaXggPT0gbnVsbCAmJiAhSVBfVjZfUkVHRVhfT0JKRUNULnRlc3QoY29va2llLmRvbWFpbikpIHtcbiAgICAgICAgICAvLyBlLmcuIFwiY29tXCJcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0Nvb2tpZSBoYXMgZG9tYWluIHNldCB0byBhIHB1YmxpYyBzdWZmaXgnKVxuXG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnM/Lmlnbm9yZUVycm9yXG4gICAgICAgICAgICA/IHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogcHJvbWlzZUNhbGxiYWNrLnJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNpbmcgYGFueWAgaGVyZSByYXRoZXIgdGhhbiBgdW5rbm93bmAgdG8gYXZvaWQgYSB0eXBlIGFzc2VydGlvbiwgYXQgdGhlIGNvc3Qgb2YgbmVlZGluZ1xuICAgICAgICAvLyB0byBkaXNhYmxlIGVzbGludCBkaXJlY3RpdmVzLiBJdCdzIGVhc2llciB0byBoYXZlIHRoaXMgb25lIHNwb3Qgb2YgdGVjaG5pY2FsbHkgaW5jb3JyZWN0XG4gICAgICAgIC8vIHR5cGVzLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gZGVhbCB3aXRoIF9hbGxfIGNhbGxiYWNrIGVycm9ycyBiZWluZyBgdW5rbm93bmAuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucz8uaWdub3JlRXJyb3JcbiAgICAgICAgICA/IHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICA6IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICAgICAgICBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTNS4zIHN0ZXAgNjpcbiAgICBpZiAoY29va2llLmRvbWFpbikge1xuICAgICAgaWYgKFxuICAgICAgICAhZG9tYWluTWF0Y2goaG9zdCA/PyB1bmRlZmluZWQsIGNvb2tpZS5jZG9tYWluKCkgPz8gdW5kZWZpbmVkLCBmYWxzZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvb2tpZSBub3QgaW4gdGhpcyBob3N0J3MgZG9tYWluLiBDb29raWU6JHtcbiAgICAgICAgICAgIGNvb2tpZS5jZG9tYWluKCkgPz8gJ251bGwnXG4gICAgICAgICAgfSBSZXF1ZXN0OiR7aG9zdCA/PyAnbnVsbCd9YCxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gb3B0aW9ucz8uaWdub3JlRXJyb3JcbiAgICAgICAgICA/IHByb21pc2VDYWxsYmFjay5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICA6IHByb21pc2VDYWxsYmFjay5yZWplY3QoZXJyKVxuICAgICAgfVxuXG4gICAgICBpZiAoY29va2llLmhvc3RPbmx5ID09IG51bGwpIHtcbiAgICAgICAgLy8gZG9uJ3QgcmVzZXQgaWYgYWxyZWFkeSBzZXRcbiAgICAgICAgY29va2llLmhvc3RPbmx5ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29va2llLmhvc3RPbmx5ID0gdHJ1ZVxuICAgICAgY29va2llLmRvbWFpbiA9IGhvc3RcbiAgICB9XG5cbiAgICAvL1M1LjIuNCBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgLy9hdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYgKFwiL1wiKTpcbiAgICAvL0xldCBjb29raWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRoLlxuICAgIGlmICghY29va2llLnBhdGggfHwgY29va2llLnBhdGhbMF0gIT09ICcvJykge1xuICAgICAgY29va2llLnBhdGggPSBkZWZhdWx0UGF0aChjb250ZXh0LnBhdGhuYW1lKVxuICAgICAgY29va2llLnBhdGhJc0RlZmF1bHQgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gUzUuMyBzdGVwIDg6IE5PT1A7IHNlY3VyZSBhdHRyaWJ1dGVcbiAgICAvLyBTNS4zIHN0ZXAgOTogTk9PUDsgaHR0cE9ubHkgYXR0cmlidXRlXG5cbiAgICAvLyBTNS4zIHN0ZXAgMTBcbiAgICBpZiAob3B0aW9ucz8uaHR0cCA9PT0gZmFsc2UgJiYgY29va2llLmh0dHBPbmx5KSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJDb29raWUgaXMgSHR0cE9ubHkgYW5kIHRoaXMgaXNuJ3QgYW4gSFRUUCBBUElcIilcbiAgICAgIHJldHVybiBvcHRpb25zLmlnbm9yZUVycm9yXG4gICAgICAgID8gcHJvbWlzZUNhbGxiYWNrLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICA6IHByb21pc2VDYWxsYmFjay5yZWplY3QoZXJyKVxuICAgIH1cblxuICAgIC8vIDYyNTJiaXMtMDIgUzUuNCBTdGVwIDEzICYgMTQ6XG4gICAgaWYgKFxuICAgICAgY29va2llLnNhbWVTaXRlICE9PSAnbm9uZScgJiZcbiAgICAgIGNvb2tpZS5zYW1lU2l0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBzYW1lU2l0ZUNvbnRleHRcbiAgICApIHtcbiAgICAgIC8vIFwiSWYgdGhlIGNvb2tpZSdzIFwic2FtZS1zaXRlLWZsYWdcIiBpcyBub3QgXCJOb25lXCIsIGFuZCB0aGUgY29va2llXG4gICAgICAvLyAgaXMgYmVpbmcgc2V0IGZyb20gYSBjb250ZXh0IHdob3NlIFwic2l0ZSBmb3IgY29va2llc1wiIGlzIG5vdCBhblxuICAgICAgLy8gIGV4YWN0IG1hdGNoIGZvciByZXF1ZXN0LXVyaSdzIGhvc3QncyByZWdpc3RlcmVkIGRvbWFpbiwgdGhlblxuICAgICAgLy8gIGFib3J0IHRoZXNlIHN0ZXBzIGFuZCBpZ25vcmUgdGhlIG5ld2x5IGNyZWF0ZWQgY29va2llIGVudGlyZWx5LlwiXG4gICAgICBpZiAoc2FtZVNpdGVDb250ZXh0ID09PSAnbm9uZScpIHtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICdDb29raWUgaXMgU2FtZVNpdGUgYnV0IHRoaXMgaXMgYSBjcm9zcy1vcmlnaW4gcmVxdWVzdCcsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM/Lmlnbm9yZUVycm9yXG4gICAgICAgICAgPyBwcm9taXNlQ2FsbGJhY2sucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgOiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiA2MjY1YmlzLTAyIFM1LjQgU3RlcHMgMTUgJiAxNiAqL1xuICAgIGNvbnN0IGlnbm9yZUVycm9yRm9yUHJlZml4U2VjdXJpdHkgPVxuICAgICAgdGhpcy5wcmVmaXhTZWN1cml0eSA9PT0gUHJlZml4U2VjdXJpdHlFbnVtLlNJTEVOVFxuICAgIGNvbnN0IHByZWZpeFNlY3VyaXR5RGlzYWJsZWQgPVxuICAgICAgdGhpcy5wcmVmaXhTZWN1cml0eSA9PT0gUHJlZml4U2VjdXJpdHlFbnVtLkRJU0FCTEVEXG4gICAgLyogSWYgcHJlZml4IGNoZWNraW5nIGlzIG5vdCBkaXNhYmxlZCAuLi4qL1xuICAgIGlmICghcHJlZml4U2VjdXJpdHlEaXNhYmxlZCkge1xuICAgICAgbGV0IGVycm9yRm91bmQgPSBmYWxzZVxuICAgICAgbGV0IGVycm9yTXNnXG4gICAgICAvKiBDaGVjayBzZWN1cmUgcHJlZml4IGNvbmRpdGlvbiAqL1xuICAgICAgaWYgKCFpc1NlY3VyZVByZWZpeENvbmRpdGlvbk1ldChjb29raWUpKSB7XG4gICAgICAgIGVycm9yRm91bmQgPSB0cnVlXG4gICAgICAgIGVycm9yTXNnID0gJ0Nvb2tpZSBoYXMgX19TZWN1cmUgcHJlZml4IGJ1dCBTZWN1cmUgYXR0cmlidXRlIGlzIG5vdCBzZXQnXG4gICAgICB9IGVsc2UgaWYgKCFpc0hvc3RQcmVmaXhDb25kaXRpb25NZXQoY29va2llKSkge1xuICAgICAgICAvKiBDaGVjayBob3N0IHByZWZpeCBjb25kaXRpb24gKi9cbiAgICAgICAgZXJyb3JGb3VuZCA9IHRydWVcbiAgICAgICAgZXJyb3JNc2cgPVxuICAgICAgICAgIFwiQ29va2llIGhhcyBfX0hvc3QgcHJlZml4IGJ1dCBlaXRoZXIgU2VjdXJlIG9yIEhvc3RPbmx5IGF0dHJpYnV0ZSBpcyBub3Qgc2V0IG9yIFBhdGggaXMgbm90ICcvJ1wiXG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JGb3VuZCkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucz8uaWdub3JlRXJyb3IgfHwgaWdub3JlRXJyb3JGb3JQcmVmaXhTZWN1cml0eVxuICAgICAgICAgID8gcHJvbWlzZUNhbGxiYWNrLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICAgIDogcHJvbWlzZUNhbGxiYWNrLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNc2cpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZVxuXG4gICAgLy8gVE9ETzogSXQgZmVlbHMgd2VpcmQgdG8gYmUgbWFuaXB1bGF0aW5nIHRoZSBzdG9yZSBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgbWV0aG9kLlxuICAgIC8vIFdlIHNob3VsZCBlaXRoZXIgZG8gaXQgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIG5vdCBhdCBhbGwuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICBpZiAoIXN0b3JlLnVwZGF0ZUNvb2tpZSkge1xuICAgICAgc3RvcmUudXBkYXRlQ29va2llID0gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBfb2xkQ29va2llOiBDb29raWUsXG4gICAgICAgIG5ld0Nvb2tpZTogQ29va2llLFxuICAgICAgICBjYj86IEVycm9yQ2FsbGJhY2ssXG4gICAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHV0Q29va2llKG5ld0Nvb2tpZSkudGhlbihcbiAgICAgICAgICAoKSA9PiBjYj8uKG51bGwpLFxuICAgICAgICAgIChlcnJvcjogdW5rbm93bikgPT4gY2I/LihlcnJvciBhcyBFcnJvciksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3aXRoQ29va2llOiBDYWxsYmFjazxDb29raWUgfCB1bmRlZmluZWQ+ID0gZnVuY3Rpb24gd2l0aENvb2tpZShcbiAgICAgIGVycixcbiAgICAgIG9sZENvb2tpZSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY2IoZXJyKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dDogRXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGNiKGVycilcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29va2llID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNiKG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYihudWxsLCBjb29raWUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9sZENvb2tpZSkge1xuICAgICAgICAvLyBTNS4zIHN0ZXAgMTEgLSBcIklmIHRoZSBjb29raWUgc3RvcmUgY29udGFpbnMgYSBjb29raWUgd2l0aCB0aGUgc2FtZSBuYW1lLFxuICAgICAgICAvLyBkb21haW4sIGFuZCBwYXRoIGFzIHRoZSBuZXdseSBjcmVhdGVkIGNvb2tpZTpcIlxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucyAmJlxuICAgICAgICAgICdodHRwJyBpbiBvcHRpb25zICYmXG4gICAgICAgICAgb3B0aW9ucy5odHRwID09PSBmYWxzZSAmJlxuICAgICAgICAgIG9sZENvb2tpZS5odHRwT25seVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzdGVwIDExLjJcbiAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJvbGQgQ29va2llIGlzIEh0dHBPbmx5IGFuZCB0aGlzIGlzbid0IGFuIEhUVFAgQVBJXCIpXG4gICAgICAgICAgaWYgKG9wdGlvbnMuaWdub3JlRXJyb3IpIGNiKG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgICBlbHNlIGNiKGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29va2llIGluc3RhbmNlb2YgQ29va2llKSB7XG4gICAgICAgICAgY29va2llLmNyZWF0aW9uID0gb2xkQ29va2llLmNyZWF0aW9uXG4gICAgICAgICAgLy8gc3RlcCAxMS4zXG4gICAgICAgICAgY29va2llLmNyZWF0aW9uSW5kZXggPSBvbGRDb29raWUuY3JlYXRpb25JbmRleFxuICAgICAgICAgIC8vIHByZXNlcnZlIHRpZS1icmVha2VyXG4gICAgICAgICAgY29va2llLmxhc3RBY2Nlc3NlZCA9IG5vd1xuICAgICAgICAgIC8vIFN0ZXAgMTEuNCAoZGVsZXRlIGNvb2tpZSkgaXMgaW1wbGllZCBieSBqdXN0IHNldHRpbmcgdGhlIG5ldyBvbmU6XG4gICAgICAgICAgc3RvcmUudXBkYXRlQ29va2llKG9sZENvb2tpZSwgY29va2llLCBuZXh0KSAvLyBzdGVwIDEyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb29raWUgaW5zdGFuY2VvZiBDb29raWUpIHtcbiAgICAgICAgICBjb29raWUuY3JlYXRpb24gPSBjb29raWUubGFzdEFjY2Vzc2VkID0gbm93XG4gICAgICAgICAgc3RvcmUucHV0Q29va2llKGNvb2tpZSwgbmV4dCkgLy8gc3RlcCAxMlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVmYWN0b3IgdG8gYXZvaWQgdXNpbmcgYSBjYWxsYmFja1xuICAgIHN0b3JlLmZpbmRDb29raWUoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5rZXksIHdpdGhDb29raWUpXG4gICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBhdHRlbXB0IHRvIHNldCB0aGUge0BsaW5rIENvb2tpZX0gaW4gdGhlIHtAbGluayBDb29raWVKYXJ9LlxuICAgKlxuICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IE9ubHkgd29ya3MgaWYgdGhlIGNvbmZpZ3VyZWQge0BsaW5rIFN0b3JlfSBpcyBhbHNvIHN5bmNocm9ub3VzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIElmIHN1Y2Nlc3NmdWxseSBwZXJzaXN0ZWQsIHRoZSB7QGxpbmsgQ29va2llfSB3aWxsIGhhdmUgdXBkYXRlZFxuICAgKiAgICAge0BsaW5rIENvb2tpZS5jcmVhdGlvbn0sIHtAbGluayBDb29raWUubGFzdEFjY2Vzc2VkfSBhbmQge0BsaW5rIENvb2tpZS5ob3N0T25seX1cbiAgICogICAgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIC0gQXMgcGVyIHRoZSBSRkMsIHRoZSB7QGxpbmsgQ29va2llLmhvc3RPbmx5fSBmbGFnIGlzIHNldCBpZiB0aGVyZSB3YXMgbm8gYERvbWFpbj17dmFsdWV9YFxuICAgKiAgICAgYXR0cmlidXRlIG9uIHRoZSBjb29raWUgc3RyaW5nLiBUaGUge0BsaW5rIENvb2tpZS5kb21haW59IHByb3BlcnR5IGlzIHNldCB0byB0aGVcbiAgICogICAgIGZ1bGx5LXF1YWxpZmllZCBob3N0bmFtZSBvZiBgY3VycmVudFVybGAgaW4gdGhpcyBjYXNlLiBNYXRjaGluZyB0aGlzIGNvb2tpZSByZXF1aXJlcyBhblxuICAgKiAgICAgZXhhY3QgaG9zdG5hbWUgbWF0Y2ggKG5vdCBhIHtAbGluayBkb21haW5NYXRjaH0gYXMgcGVyIHVzdWFsKVxuICAgKlxuICAgKiBAcGFyYW0gY29va2llIC0gVGhlIGNvb2tpZSBvYmplY3Qgb3IgY29va2llIHN0cmluZyB0byBzdG9yZS4gQSBzdHJpbmcgdmFsdWUgd2lsbCBiZSBwYXJzZWQgaW50byBhIGNvb2tpZSB1c2luZyB7QGxpbmsgQ29va2llLnBhcnNlfS5cbiAgICogQHBhcmFtIHVybCAtIFRoZSBkb21haW4gdG8gc3RvcmUgdGhlIGNvb2tpZSB3aXRoLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8gdXNlIHdoZW4gc3RvcmluZyB0aGUgY29va2llLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzZXRDb29raWVTeW5jKFxuICAgIGNvb2tpZTogc3RyaW5nIHwgQ29va2llLFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTZXRDb29raWVPcHRpb25zLFxuICApOiBDb29raWUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNldENvb2tpZUZuID0gb3B0aW9uc1xuICAgICAgPyB0aGlzLnNldENvb2tpZS5iaW5kKHRoaXMsIGNvb2tpZSwgdXJsLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLnNldENvb2tpZS5iaW5kKHRoaXMsIGNvb2tpZSwgdXJsKVxuICAgIHJldHVybiB0aGlzLmNhbGxTeW5jKHNldENvb2tpZUZuKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGNvb2tpZXMgdGhhdCBjYW4gYmUgc2VudCBpbiBhIENvb2tpZSBoZWFkZXIgZm9yIHRoZVxuICAgKiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBUaGUgYXJyYXkgb2YgY29va2llcyByZXR1cm5lZCB3aWxsIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8ge0BsaW5rIGNvb2tpZUNvbXBhcmV9LlxuICAgKlxuICAgKiAtIFRoZSB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gcHJvcGVydHkgd2lsbCBiZSB1cGRhdGVkIG9uIGFsbCByZXR1cm5lZCBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIGRvbWFpbiB0byBzdG9yZSB0aGUgY29va2llIHdpdGguXG4gICAqL1xuICBnZXRDb29raWVzKHVybDogc3RyaW5nKTogUHJvbWlzZTxDb29raWVbXT5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGNvb2tpZXMgdGhhdCBjYW4gYmUgc2VudCBpbiBhIENvb2tpZSBoZWFkZXIgZm9yIHRoZVxuICAgKiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBUaGUgYXJyYXkgb2YgY29va2llcyByZXR1cm5lZCB3aWxsIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8ge0BsaW5rIGNvb2tpZUNvbXBhcmV9LlxuICAgKlxuICAgKiAtIFRoZSB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gcHJvcGVydHkgd2lsbCBiZSB1cGRhdGVkIG9uIGFsbCByZXR1cm5lZCBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIGRvbWFpbiB0byBzdG9yZSB0aGUgY29va2llIHdpdGguXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCBhZnRlciBhIGNvb2tpZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlxuICAgKi9cbiAgZ2V0Q29va2llcyh1cmw6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrPENvb2tpZVtdPik6IHZvaWRcbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGNvb2tpZXMgdGhhdCBjYW4gYmUgc2VudCBpbiBhIENvb2tpZSBoZWFkZXIgZm9yIHRoZVxuICAgKiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBUaGUgYXJyYXkgb2YgY29va2llcyByZXR1cm5lZCB3aWxsIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8ge0BsaW5rIGNvb2tpZUNvbXBhcmV9LlxuICAgKlxuICAgKiAtIFRoZSB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gcHJvcGVydHkgd2lsbCBiZSB1cGRhdGVkIG9uIGFsbCByZXR1cm5lZCBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIGRvbWFpbiB0byBzdG9yZSB0aGUgY29va2llIHdpdGguXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIHRoZSBjb29raWVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgYSBjb29raWUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cbiAgICovXG4gIGdldENvb2tpZXMoXG4gICAgdXJsOiBzdHJpbmcgfCBVUkwsXG4gICAgb3B0aW9uczogR2V0Q29va2llc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrPENvb2tpZVtdPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgY29va2llcyB0aGF0IGNhbiBiZSBzZW50IGluIGEgQ29va2llIGhlYWRlciBmb3IgdGhlXG4gICAqIGN1cnJlbnQgVVJMLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoZSBhcnJheSBvZiBjb29raWVzIHJldHVybmVkIHdpbGwgYmUgc29ydGVkIGFjY29yZGluZyB0byB7QGxpbmsgY29va2llQ29tcGFyZX0uXG4gICAqXG4gICAqIC0gVGhlIHtAbGluayBDb29raWUubGFzdEFjY2Vzc2VkfSBwcm9wZXJ0eSB3aWxsIGJlIHVwZGF0ZWQgb24gYWxsIHJldHVybmVkIGNvb2tpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgdGhlIGNvb2tpZXMuXG4gICAqL1xuICBnZXRDb29raWVzKHVybDogc3RyaW5nIHwgVVJMLCBvcHRpb25zPzogR2V0Q29va2llc09wdGlvbnMpOiBQcm9taXNlPENvb2tpZVtdPlxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIGdldENvb2tpZXMoXG4gICAgdXJsOiBzdHJpbmcgfCBVUkwsXG4gICAgb3B0aW9uczogR2V0Q29va2llc09wdGlvbnMgfCB1bmRlZmluZWQgfCBDYWxsYmFjazxDb29raWVbXT4sXG4gICAgY2FsbGJhY2s/OiBDYWxsYmFjazxDb29raWVbXT4sXG4gICk6IHVua25vd25cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIHRoZSBvdmVybG9hZCBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgZ2V0Q29va2llcyhcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICBvcHRpb25zPzogR2V0Q29va2llc09wdGlvbnMgfCBDYWxsYmFjazxDb29raWVbXT4sXG4gICAgY2FsbGJhY2s/OiBDYWxsYmFjazxDb29raWVbXT4sXG4gICk6IHVua25vd24ge1xuICAgIC8vIFJGQzYzNjUgUzUuNFxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gICAgICBvcHRpb25zID0gZGVmYXVsdEdldENvb2tpZU9wdGlvbnNcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRHZXRDb29raWVPcHRpb25zXG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VDYWxsYmFjayA9IGNyZWF0ZVByb21pc2VDYWxsYmFjayhjYWxsYmFjaylcbiAgICBjb25zdCBjYiA9IHByb21pc2VDYWxsYmFjay5jYWxsYmFja1xuICAgIGxldCBjb250ZXh0OiBVcmxDb250ZXh0XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGUodmFsaWRhdG9ycy5pc05vbkVtcHR5U3RyaW5nKHVybCksIGNiLCB1cmwpXG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBnZXRDb29raWVDb250ZXh0KHVybClcblxuICAgICAgdmFsaWRhdG9ycy52YWxpZGF0ZShcbiAgICAgICAgdmFsaWRhdG9ycy5pc09iamVjdChvcHRpb25zKSxcbiAgICAgICAgY2IsXG4gICAgICAgIHNhZmVUb1N0cmluZyhvcHRpb25zKSxcbiAgICAgIClcblxuICAgICAgdmFsaWRhdG9ycy52YWxpZGF0ZSh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicsIGNiKVxuICAgIH0gY2F0Y2ggKHBhcmFtZXRlckVycm9yKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZUNhbGxiYWNrLnJlamVjdChwYXJhbWV0ZXJFcnJvciBhcyBFcnJvcilcbiAgICB9XG5cbiAgICBjb25zdCBob3N0ID0gY2Fub25pY2FsRG9tYWluKGNvbnRleHQuaG9zdG5hbWUpXG4gICAgY29uc3QgcGF0aCA9IGNvbnRleHQucGF0aG5hbWUgfHwgJy8nXG5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzLTE5I3NlY3Rpb24tNS44LjMtMi4xLjIuMy4yXG4gICAgLy8gZGVsaWJlcmF0ZWx5IGV4cGVjdHMgdGhlIHVzZXIgYWdlbnQgdG8gZGV0ZXJtaW5lIHRoZSBub3Rpb24gb2YgYSBcInNlY3VyZVwiIGNvbm5lY3Rpb24sXG4gICAgLy8gYW5kIGluIHByYWN0aWNlIHRoaXMgY29udmVyZ2VzIHRvIGEgXCJwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBvcmlnaW5cIiBhcyBkZWZpbmVkIGluOlxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWN1cmUtY29udGV4dHMvI2lzLW9yaWdpbi10cnVzdHdvcnRoeVxuICAgIGNvbnN0IHBvdGVudGlhbGx5VHJ1c3R3b3J0aHkgPSBpc1BvdGVudGlhbGx5VHJ1c3R3b3J0aHkoXG4gICAgICB1cmwsXG4gICAgICB0aGlzLmFsbG93U2VjdXJlT25Mb2NhbCxcbiAgICApXG5cbiAgICBsZXQgc2FtZVNpdGVMZXZlbCA9IDBcbiAgICBpZiAob3B0aW9ucy5zYW1lU2l0ZUNvbnRleHQpIHtcbiAgICAgIGNvbnN0IHNhbWVTaXRlQ29udGV4dCA9IGNoZWNrU2FtZVNpdGVDb250ZXh0KG9wdGlvbnMuc2FtZVNpdGVDb250ZXh0KVxuICAgICAgaWYgKHNhbWVTaXRlQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KG5ldyBFcnJvcihTQU1FX1NJVEVfQ09OVEVYVF9WQUxfRVJSKSlcbiAgICAgIH1cbiAgICAgIHNhbWVTaXRlTGV2ZWwgPSBDb29raWUuc2FtZVNpdGVMZXZlbFtzYW1lU2l0ZUNvbnRleHRdXG4gICAgICBpZiAoIXNhbWVTaXRlTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZWplY3QobmV3IEVycm9yKFNBTUVfU0lURV9DT05URVhUX1ZBTF9FUlIpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGh0dHAgPSBvcHRpb25zLmh0dHAgPz8gdHJ1ZVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGV4cGlyZUNoZWNrID0gb3B0aW9ucy5leHBpcmUgPz8gdHJ1ZVxuICAgIGNvbnN0IGFsbFBhdGhzID0gb3B0aW9ucy5hbGxQYXRocyA/PyBmYWxzZVxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hpbmdDb29raWUoYzogQ29va2llKTogYm9vbGVhbiB7XG4gICAgICAvLyBcIkVpdGhlcjpcbiAgICAgIC8vICAgVGhlIGNvb2tpZSdzIGhvc3Qtb25seS1mbGFnIGlzIHRydWUgYW5kIHRoZSBjYW5vbmljYWxpemVkXG4gICAgICAvLyAgIHJlcXVlc3QtaG9zdCBpcyBpZGVudGljYWwgdG8gdGhlIGNvb2tpZSdzIGRvbWFpbi5cbiAgICAgIC8vIE9yOlxuICAgICAgLy8gICBUaGUgY29va2llJ3MgaG9zdC1vbmx5LWZsYWcgaXMgZmFsc2UgYW5kIHRoZSBjYW5vbmljYWxpemVkXG4gICAgICAvLyAgIHJlcXVlc3QtaG9zdCBkb21haW4tbWF0Y2hlcyB0aGUgY29va2llJ3MgZG9tYWluLlwiXG4gICAgICBpZiAoYy5ob3N0T25seSkge1xuICAgICAgICBpZiAoYy5kb21haW4gIT0gaG9zdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWRvbWFpbk1hdGNoKGhvc3QgPz8gdW5kZWZpbmVkLCBjLmRvbWFpbiA/PyB1bmRlZmluZWQsIGZhbHNlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFwiVGhlIHJlcXVlc3QtdXJpJ3MgcGF0aCBwYXRoLW1hdGNoZXMgdGhlIGNvb2tpZSdzIHBhdGguXCJcbiAgICAgIGlmICghYWxsUGF0aHMgJiYgdHlwZW9mIGMucGF0aCA9PT0gJ3N0cmluZycgJiYgIXBhdGhNYXRjaChwYXRoLCBjLnBhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBcIklmIHRoZSBjb29raWUncyBzZWN1cmUtb25seS1mbGFnIGlzIHRydWUsIHRoZW4gdGhlIHJlcXVlc3QtdXJpJ3NcbiAgICAgIC8vIHNjaGVtZSBtdXN0IGRlbm90ZSBhIFwic2VjdXJlXCIgcHJvdG9jb2xcIlxuICAgICAgaWYgKGMuc2VjdXJlICYmICFwb3RlbnRpYWxseVRydXN0d29ydGh5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBcIklmIHRoZSBjb29raWUncyBodHRwLW9ubHktZmxhZyBpcyB0cnVlLCB0aGVuIGV4Y2x1ZGUgdGhlIGNvb2tpZSBpZiB0aGVcbiAgICAgIC8vIGNvb2tpZS1zdHJpbmcgaXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBhIFwibm9uLUhUVFBcIiBBUElcIlxuICAgICAgaWYgKGMuaHR0cE9ubHkgJiYgIWh0dHApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIFJGQzYyNjViaXMtMDIgUzUuMy43XG4gICAgICBpZiAoc2FtZVNpdGVMZXZlbCkge1xuICAgICAgICBsZXQgY29va2llTGV2ZWw6IG51bWJlclxuICAgICAgICBpZiAoYy5zYW1lU2l0ZSA9PT0gJ2xheCcpIHtcbiAgICAgICAgICBjb29raWVMZXZlbCA9IENvb2tpZS5zYW1lU2l0ZUxldmVsLmxheFxuICAgICAgICB9IGVsc2UgaWYgKGMuc2FtZVNpdGUgPT09ICdzdHJpY3QnKSB7XG4gICAgICAgICAgY29va2llTGV2ZWwgPSBDb29raWUuc2FtZVNpdGVMZXZlbC5zdHJpY3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb29raWVMZXZlbCA9IENvb2tpZS5zYW1lU2l0ZUxldmVsLm5vbmVcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29va2llTGV2ZWwgPiBzYW1lU2l0ZUxldmVsKSB7XG4gICAgICAgICAgLy8gb25seSBhbGxvdyBjb29raWVzIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0IGxldmVsXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGVmZXJyZWQgZnJvbSBTNS4zXG4gICAgICAvLyBub24tUkZDOiBhbGxvdyByZXRlbnRpb24gb2YgZXhwaXJlZCBjb29raWVzIGJ5IGNob2ljZVxuICAgICAgY29uc3QgZXhwaXJ5VGltZSA9IGMuZXhwaXJ5VGltZSgpXG4gICAgICBpZiAoZXhwaXJlQ2hlY2sgJiYgZXhwaXJ5VGltZSAhPSB1bmRlZmluZWQgJiYgZXhwaXJ5VGltZSA8PSBub3cpIHtcbiAgICAgICAgc3RvcmUucmVtb3ZlQ29va2llKGMuZG9tYWluLCBjLnBhdGgsIGMua2V5LCAoKSA9PiB7fSkgLy8gcmVzdWx0IGlnbm9yZWRcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgc3RvcmUuZmluZENvb2tpZXMoXG4gICAgICBob3N0LFxuICAgICAgYWxsUGF0aHMgPyBudWxsIDogcGF0aCxcbiAgICAgIHRoaXMuYWxsb3dTcGVjaWFsVXNlRG9tYWluLFxuICAgICAgKGVyciwgY29va2llcyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY2IoZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvb2tpZXMgPT0gbnVsbCkge1xuICAgICAgICAgIGNiKG51bGwsIFtdKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29va2llcyA9IGNvb2tpZXMuZmlsdGVyKG1hdGNoaW5nQ29va2llKVxuXG4gICAgICAgIC8vIHNvcnRpbmcgb2YgUzUuNCBwYXJ0IDJcbiAgICAgICAgaWYgKCdzb3J0JyBpbiBvcHRpb25zICYmIG9wdGlvbnMuc29ydCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjb29raWVzID0gY29va2llcy5zb3J0KGNvb2tpZUNvbXBhcmUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTNS40IHBhcnQgM1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGZvciAoY29uc3QgY29va2llIG9mIGNvb2tpZXMpIHtcbiAgICAgICAgICBjb29raWUubGFzdEFjY2Vzc2VkID0gbm93XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyBwZXJzaXN0IGxhc3RBY2Nlc3NlZFxuXG4gICAgICAgIGNiKG51bGwsIGNvb2tpZXMpXG4gICAgICB9LFxuICAgIClcblxuICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgcmV0cmlldmUgdGhlIGxpc3Qgb2YgY29va2llcyB0aGF0IGNhbiBiZSBzZW50IGluIGEgQ29va2llIGhlYWRlciBmb3IgdGhlXG4gICAqIGN1cnJlbnQgVVJMLlxuICAgKlxuICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IE9ubHkgd29ya3MgaWYgdGhlIGNvbmZpZ3VyZWQgU3RvcmUgaXMgYWxzbyBzeW5jaHJvbm91cy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBUaGUgYXJyYXkgb2YgY29va2llcyByZXR1cm5lZCB3aWxsIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8ge0BsaW5rIGNvb2tpZUNvbXBhcmV9LlxuICAgKlxuICAgKiAtIFRoZSB7QGxpbmsgQ29va2llLmxhc3RBY2Nlc3NlZH0gcHJvcGVydHkgd2lsbCBiZSB1cGRhdGVkIG9uIGFsbCByZXR1cm5lZCBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIGRvbWFpbiB0byBzdG9yZSB0aGUgY29va2llIHdpdGguXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIHRoZSBjb29raWVzLlxuICAgKi9cbiAgZ2V0Q29va2llc1N5bmModXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBHZXRDb29raWVzT3B0aW9ucyk6IENvb2tpZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsU3luYyh0aGlzLmdldENvb2tpZXMuYmluZCh0aGlzLCB1cmwsIG9wdGlvbnMpKSA/PyBbXVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyBgLmdldENvb2tpZXMoKWAgYnV0IHJldHVybnMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGFcbiAgICogYENvb2tpZWAgaGVhZGVyIHJhdGhlciB0aGFuIGFuIEFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIGRvbWFpbiB0byBzdG9yZSB0aGUgY29va2llIHdpdGguXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIHRoZSBjb29raWVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgdGhlIGBDb29raWVgIGhlYWRlciBzdHJpbmcgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICovXG4gIGdldENvb2tpZVN0cmluZyhcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXRDb29raWVzT3B0aW9ucyxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2s8c3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIGAuZ2V0Q29va2llcygpYCBidXQgcmV0dXJucyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYVxuICAgKiBgQ29va2llYCBoZWFkZXIgcmF0aGVyIHRoYW4gYW4gQXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIHRoZSBgQ29va2llYCBoZWFkZXIgc3RyaW5nIGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqL1xuICBnZXRDb29raWVTdHJpbmcodXJsOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjazxzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZFxuICAvKipcbiAgICogQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIGAuZ2V0Q29va2llcygpYCBidXQgcmV0dXJucyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYVxuICAgKiBgQ29va2llYCBoZWFkZXIgcmF0aGVyIHRoYW4gYW4gQXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgdGhlIGNvb2tpZXMuXG4gICAqL1xuICBnZXRDb29raWVTdHJpbmcodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBHZXRDb29raWVzT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgYW4gb3ZlcmxvYWQgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIGdldENvb2tpZVN0cmluZyhcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXRDb29raWVzT3B0aW9ucyB8IENhbGxiYWNrPHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gICAgY2FsbGJhY2s/OiBDYWxsYmFjazxzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICApOiB1bmtub3duXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyB0aGUgb3ZlcmxvYWQgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIGdldENvb2tpZVN0cmluZyhcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogR2V0Q29va2llc09wdGlvbnMgfCBDYWxsYmFjazxzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICAgIGNhbGxiYWNrPzogQ2FsbGJhY2s8c3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrKGNhbGxiYWNrKVxuICAgIGNvbnN0IG5leHQ6IENhbGxiYWNrPENvb2tpZVtdPiA9IGZ1bmN0aW9uIChlcnIsIGNvb2tpZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcHJvbWlzZUNhbGxiYWNrLmNhbGxiYWNrKGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2VDYWxsYmFjay5jYWxsYmFjayhcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGNvb2tpZXNcbiAgICAgICAgICAgID8uc29ydChjb29raWVDb21wYXJlKVxuICAgICAgICAgICAgLm1hcCgoYykgPT4gYy5jb29raWVTdHJpbmcoKSlcbiAgICAgICAgICAgIC5qb2luKCc7ICcpLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nZXRDb29raWVzKHVybCwgb3B0aW9ucywgbmV4dClcbiAgICByZXR1cm4gcHJvbWlzZUNhbGxiYWNrLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyB2ZXJzaW9uIG9mIGAuZ2V0Q29va2llU3RyaW5nKClgLiBBY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgYC5nZXRDb29raWVzKClgIGJ1dCByZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBhXG4gICAqIGBDb29raWVgIGhlYWRlciByYXRoZXIgdGhhbiBhbiBBcnJheS5cbiAgICpcbiAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBPbmx5IHdvcmtzIGlmIHRoZSBjb25maWd1cmVkIFN0b3JlIGlzIGFsc28gc3luY2hyb25vdXMuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgdGhlIGNvb2tpZXMuXG4gICAqL1xuICBnZXRDb29raWVTdHJpbmdTeW5jKHVybDogc3RyaW5nLCBvcHRpb25zPzogR2V0Q29va2llc09wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNhbGxTeW5jKFxuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgPyB0aGlzLmdldENvb2tpZVN0cmluZy5iaW5kKHRoaXMsIHVybCwgb3B0aW9ucylcbiAgICAgICAgICA6IHRoaXMuZ2V0Q29va2llU3RyaW5nLmJpbmQodGhpcywgdXJsKSxcbiAgICAgICkgPz8gJydcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHN1aXRhYmxlIGZvciBgU2V0LUNvb2tpZWAgaGVhZGVycy4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zXG4gICAqIGFzIGAuZ2V0Q29va2llcygpYC5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBkb21haW4gdG8gc3RvcmUgdGhlIGNvb2tpZSB3aXRoLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgdGhlIGBTZXQtQ29va2llYCBoZWFkZXIgc3RyaW5ncyBoYXZlIGJlZW4gY3JlYXRlZC5cbiAgICovXG4gIGdldFNldENvb2tpZVN0cmluZ3MoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrPHN0cmluZ1tdIHwgdW5kZWZpbmVkPixcbiAgKTogdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHN1aXRhYmxlIGZvciBgU2V0LUNvb2tpZWAgaGVhZGVycy4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zXG4gICAqIGFzIGAuZ2V0Q29va2llcygpYC5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBkb21haW4gdG8gc3RvcmUgdGhlIGNvb2tpZSB3aXRoLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8gdXNlIHdoZW4gcmV0cmlldmluZyB0aGUgY29va2llcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIHRoZSBgU2V0LUNvb2tpZWAgaGVhZGVyIHN0cmluZ3MgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAqL1xuICBnZXRTZXRDb29raWVTdHJpbmdzKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldENvb2tpZXNPcHRpb25zLFxuICAgIGNhbGxiYWNrOiBDYWxsYmFjazxzdHJpbmdbXSB8IHVuZGVmaW5lZD4sXG4gICk6IHZvaWRcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBzdWl0YWJsZSBmb3IgYFNldC1Db29raWVgIGhlYWRlcnMuIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9uc1xuICAgKiBhcyBgLmdldENvb2tpZXMoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgZG9tYWluIHRvIHN0b3JlIHRoZSBjb29raWUgd2l0aC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgdGhlIGNvb2tpZXMuXG4gICAqL1xuICBnZXRTZXRDb29raWVTdHJpbmdzKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHZXRDb29raWVzT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBnZXRTZXRDb29raWVTdHJpbmdzKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldENvb2tpZXNPcHRpb25zLFxuICAgIGNhbGxiYWNrPzogQ2FsbGJhY2s8c3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICApOiB1bmtub3duXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyB0aGUgb3ZlcmxvYWQgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIGdldFNldENvb2tpZVN0cmluZ3MoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEdldENvb2tpZXNPcHRpb25zIHwgQ2FsbGJhY2s8c3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgIGNhbGxiYWNrPzogQ2FsbGJhY2s8c3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICAgIH1cbiAgICBjb25zdCBwcm9taXNlQ2FsbGJhY2sgPSBjcmVhdGVQcm9taXNlQ2FsbGJhY2s8c3RyaW5nW10gfCB1bmRlZmluZWQ+KFxuICAgICAgY2FsbGJhY2ssXG4gICAgKVxuXG4gICAgY29uc3QgbmV4dDogQ2FsbGJhY2s8Q29va2llW10gfCB1bmRlZmluZWQ+ID0gZnVuY3Rpb24gKGVyciwgY29va2llcykge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcm9taXNlQ2FsbGJhY2suY2FsbGJhY2soZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZUNhbGxiYWNrLmNhbGxiYWNrKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgY29va2llcz8ubWFwKChjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYy50b1N0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmdldENvb2tpZXModXJsLCBvcHRpb25zLCBuZXh0KVxuICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgYC5nZXRTZXRDb29raWVTdHJpbmdzKClgLiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3Mgc3VpdGFibGUgZm9yIGBTZXQtQ29va2llYCBoZWFkZXJzLlxuICAgKiBBY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgYC5nZXRDb29raWVzKClgLlxuICAgKlxuICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IE9ubHkgd29ya3MgaWYgdGhlIGNvbmZpZ3VyZWQgU3RvcmUgaXMgYWxzbyBzeW5jaHJvbm91cy5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBkb21haW4gdG8gc3RvcmUgdGhlIGNvb2tpZSB3aXRoLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8gdXNlIHdoZW4gcmV0cmlldmluZyB0aGUgY29va2llcy5cbiAgICovXG4gIGdldFNldENvb2tpZVN0cmluZ3NTeW5jKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldENvb2tpZXNPcHRpb25zID0ge30sXG4gICk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jYWxsU3luYyh0aGlzLmdldFNldENvb2tpZVN0cmluZ3MuYmluZCh0aGlzLCB1cmwsIG9wdGlvbnMpKSA/PyBbXVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIENvb2tpZUphciBpZiB0aGUgdW5kZXJseWluZyBzdG9yZSBzdXBwb3J0cyBgLmdldEFsbENvb2tpZXNgLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgdGhlIENvb2tpZUphciBoYXMgYmVlbiBzZXJpYWxpemVkXG4gICAqL1xuICBzZXJpYWxpemUoY2FsbGJhY2s6IENhbGxiYWNrPFNlcmlhbGl6ZWRDb29raWVKYXI+KTogdm9pZFxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSBDb29raWVKYXIgaWYgdGhlIHVuZGVybHlpbmcgc3RvcmUgc3VwcG9ydHMgYC5nZXRBbGxDb29raWVzYC5cbiAgICovXG4gIHNlcmlhbGl6ZSgpOiBQcm9taXNlPFNlcmlhbGl6ZWRDb29raWVKYXI+XG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgTm8gZG9jIGJlY2F1c2UgdGhpcyBpcyB0aGUgb3ZlcmxvYWQgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIHNlcmlhbGl6ZShjYWxsYmFjaz86IENhbGxiYWNrPFNlcmlhbGl6ZWRDb29raWVKYXI+KTogdW5rbm93biB7XG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrPFNlcmlhbGl6ZWRDb29raWVKYXI+KGNhbGxiYWNrKVxuXG4gICAgbGV0IHR5cGU6IHN0cmluZyB8IG51bGwgPSB0aGlzLnN0b3JlLmNvbnN0cnVjdG9yLm5hbWVcbiAgICBpZiAodmFsaWRhdG9ycy5pc09iamVjdCh0eXBlKSkge1xuICAgICAgdHlwZSA9IG51bGxcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgUkVBRE1FLm1kIFwiU2VyaWFsaXphdGlvbiBGb3JtYXRcIiBpZiB5b3UgY2hhbmdlIHRoaXMsIHBsZWFzZSFcbiAgICBjb25zdCBzZXJpYWxpemVkOiBTZXJpYWxpemVkQ29va2llSmFyID0ge1xuICAgICAgLy8gVGhlIHZlcnNpb24gb2YgdG91Z2gtY29va2llIHRoYXQgc2VyaWFsaXplZCB0aGlzIGphci4gR2VuZXJhbGx5IGEgZ29vZFxuICAgICAgLy8gcHJhY3RpY2Ugc2luY2UgZnV0dXJlIHZlcnNpb25zIGNhbiBtYWtlIGRhdGEgaW1wb3J0IGRlY2lzaW9ucyBiYXNlZCBvblxuICAgICAgLy8ga25vd24gcGFzdCBiZWhhdmlvci4gV2hlbi9pZiB0aGlzIG1hdHRlcnMsIHVzZSBgc2VtdmVyYC5cbiAgICAgIHZlcnNpb246IGB0b3VnaC1jb29raWVAJHt2ZXJzaW9ufWAsXG5cbiAgICAgIC8vIGFkZCB0aGUgc3RvcmUgdHlwZSwgdG8gbWFrZSBodW1hbnMgaGFwcHk6XG4gICAgICBzdG9yZVR5cGU6IHR5cGUsXG5cbiAgICAgIC8vIENvb2tpZUphciBjb25maWd1cmF0aW9uOlxuICAgICAgcmVqZWN0UHVibGljU3VmZml4ZXM6IHRoaXMucmVqZWN0UHVibGljU3VmZml4ZXMsXG4gICAgICBlbmFibGVMb29zZU1vZGU6IHRoaXMuZW5hYmxlTG9vc2VNb2RlLFxuICAgICAgYWxsb3dTcGVjaWFsVXNlRG9tYWluOiB0aGlzLmFsbG93U3BlY2lhbFVzZURvbWFpbixcbiAgICAgIHByZWZpeFNlY3VyaXR5OiBnZXROb3JtYWxpemVkUHJlZml4U2VjdXJpdHkodGhpcy5wcmVmaXhTZWN1cml0eSksXG5cbiAgICAgIC8vIHRoaXMgZ2V0cyBmaWxsZWQgZnJvbSBnZXRBbGxDb29raWVzOlxuICAgICAgY29va2llczogW10sXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnN0b3JlLmdldEFsbENvb2tpZXMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3N0b3JlIGRvZXMgbm90IHN1cHBvcnQgZ2V0QWxsQ29va2llcyBhbmQgY2Fubm90IGJlIHNlcmlhbGl6ZWQnLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuc3RvcmUuZ2V0QWxsQ29va2llcygoZXJyLCBjb29raWVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHByb21pc2VDYWxsYmFjay5jYWxsYmFjayhlcnIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoY29va2llcyA9PSBudWxsKSB7XG4gICAgICAgIHByb21pc2VDYWxsYmFjay5jYWxsYmFjayhudWxsLCBzZXJpYWxpemVkKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2VyaWFsaXplZC5jb29raWVzID0gY29va2llcy5tYXAoKGNvb2tpZSkgPT4ge1xuICAgICAgICAvLyBjb252ZXJ0IHRvIHNlcmlhbGl6ZWQgJ3JhdycgY29va2llc1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkQ29va2llID0gY29va2llLnRvSlNPTigpXG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBpbmRleCBzbyBuZXcgb25lcyBnZXQgYXNzaWduZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvblxuICAgICAgICBkZWxldGUgc2VyaWFsaXplZENvb2tpZS5jcmVhdGlvbkluZGV4XG5cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWRDb29raWVcbiAgICAgIH0pXG5cbiAgICAgIHByb21pc2VDYWxsYmFjay5jYWxsYmFjayhudWxsLCBzZXJpYWxpemVkKVxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZUNhbGxiYWNrLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIENvb2tpZUphciBpZiB0aGUgdW5kZXJseWluZyBzdG9yZSBzdXBwb3J0cyBgLmdldEFsbENvb2tpZXNgLlxuICAgKlxuICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IE9ubHkgd29ya3MgaWYgdGhlIGNvbmZpZ3VyZWQgU3RvcmUgaXMgYWxzbyBzeW5jaHJvbm91cy5cbiAgICovXG4gIHNlcmlhbGl6ZVN5bmMoKTogU2VyaWFsaXplZENvb2tpZUphciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbFN5bmMoKGNhbGxiYWNrKSA9PiB7XG4gICAgICB0aGlzLnNlcmlhbGl6ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIG9mIHtAbGluayBDb29raWVKYXIuc2VyaWFsaXplU3luY30uIEFsbG93cyB0aGUgY29va2llIHRvIGJlIHNlcmlhbGl6ZWRcbiAgICogd2l0aCBgSlNPTi5zdHJpbmdpZnkoY29va2llSmFyKWAuXG4gICAqL1xuICB0b0pTT04oKTogU2VyaWFsaXplZENvb2tpZUphciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplU3luYygpXG4gIH1cblxuICAvKipcbiAgICogVXNlIHRoZSBjbGFzcyBtZXRob2QgQ29va2llSmFyLmRlc2VyaWFsaXplIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2ltcG9ydENvb2tpZXMoc2VyaWFsaXplZDogdW5rbm93biwgY2FsbGJhY2s6IENhbGxiYWNrPENvb2tpZUphcj4pOiB2b2lkIHtcbiAgICBsZXQgY29va2llczogdW5rbm93bltdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICBpZiAoXG4gICAgICBzZXJpYWxpemVkICYmXG4gICAgICB0eXBlb2Ygc2VyaWFsaXplZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGluT3BlcmF0b3IoJ2Nvb2tpZXMnLCBzZXJpYWxpemVkKSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShzZXJpYWxpemVkLmNvb2tpZXMpXG4gICAgKSB7XG4gICAgICBjb29raWVzID0gc2VyaWFsaXplZC5jb29raWVzXG4gICAgfVxuXG4gICAgaWYgKCFjb29raWVzKSB7XG4gICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ3NlcmlhbGl6ZWQgamFyIGhhcyBubyBjb29raWVzIGFycmF5JyksIHVuZGVmaW5lZClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvb2tpZXMgPSBjb29raWVzLnNsaWNlKCkgLy8gZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWxcblxuICAgIGNvbnN0IHB1dE5leHQ6IEVycm9yQ2FsbGJhY2sgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29va2llcykpIHtcbiAgICAgICAgaWYgKCFjb29raWVzLmxlbmd0aCkge1xuICAgICAgICAgIGNhbGxiYWNrKGVyciwgdGhpcylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb29raWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb29raWUgPSBDb29raWUuZnJvbUpTT04oY29va2llcy5zaGlmdCgpKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY2FsbGJhY2soZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IG5ldyBFcnJvcigpLCB1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29va2llID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwdXROZXh0KG51bGwpIC8vIHNraXAgdGhpcyBjb29raWVcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RvcmUucHV0Q29va2llKGNvb2tpZSwgcHV0TmV4dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXROZXh0KG51bGwpXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaW1wb3J0Q29va2llc1N5bmMoc2VyaWFsaXplZDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuY2FsbFN5bmModGhpcy5faW1wb3J0Q29va2llcy5iaW5kKHRoaXMsIHNlcmlhbGl6ZWQpKVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIGEgZGVlcCBjbG9uZSBvZiB0aGlzIENvb2tpZUphci4gTW9kaWZpY2F0aW9ucyB0byB0aGUgb3JpZ2luYWwgZG9cbiAgICogbm90IGFmZmVjdCB0aGUgY2xvbmUsIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFdoZW4gbm8ge0BsaW5rIFN0b3JlfSBpcyBwcm92aWRlZCwgYSBuZXcge0BsaW5rIE1lbW9yeUNvb2tpZVN0b3JlfSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIC0gVHJhbnNmZXJyaW5nIGJldHdlZW4gc3RvcmUgdHlwZXMgaXMgc3VwcG9ydGVkIHNvIGxvbmcgYXMgdGhlIHNvdXJjZVxuICAgKiAgICAgaW1wbGVtZW50cyBgLmdldEFsbENvb2tpZXMoKWAgYW5kIHRoZSBkZXN0aW5hdGlvbiBpbXBsZW1lbnRzIGAucHV0Q29va2llKClgLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgQ29va2llSmFyIGlzIGNsb25lZC5cbiAgICovXG4gIGNsb25lKGNhbGxiYWNrOiBDYWxsYmFjazxDb29raWVKYXI+KTogdm9pZFxuICAvKipcbiAgICogUHJvZHVjZXMgYSBkZWVwIGNsb25lIG9mIHRoaXMgQ29va2llSmFyLiBNb2RpZmljYXRpb25zIHRvIHRoZSBvcmlnaW5hbCBkb1xuICAgKiBub3QgYWZmZWN0IHRoZSBjbG9uZSwgYW5kIHZpY2UgdmVyc2EuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gV2hlbiBubyB7QGxpbmsgU3RvcmV9IGlzIHByb3ZpZGVkLCBhIG5ldyB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9IHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogLSBUcmFuc2ZlcnJpbmcgYmV0d2VlbiBzdG9yZSB0eXBlcyBpcyBzdXBwb3J0ZWQgc28gbG9uZyBhcyB0aGUgc291cmNlXG4gICAqICAgICBpbXBsZW1lbnRzIGAuZ2V0QWxsQ29va2llcygpYCBhbmQgdGhlIGRlc3RpbmF0aW9uIGltcGxlbWVudHMgYC5wdXRDb29raWUoKWAuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdTdG9yZSAtIFRoZSB0YXJnZXQge0BsaW5rIFN0b3JlfSB0byBjbG9uZSBjb29raWVzIGludG8uXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBDb29raWVKYXIgaXMgY2xvbmVkLlxuICAgKi9cbiAgY2xvbmUobmV3U3RvcmU6IFN0b3JlLCBjYWxsYmFjazogQ2FsbGJhY2s8Q29va2llSmFyPik6IHZvaWRcbiAgLyoqXG4gICAqIFByb2R1Y2VzIGEgZGVlcCBjbG9uZSBvZiB0aGlzIENvb2tpZUphci4gTW9kaWZpY2F0aW9ucyB0byB0aGUgb3JpZ2luYWwgZG9cbiAgICogbm90IGFmZmVjdCB0aGUgY2xvbmUsIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFdoZW4gbm8ge0BsaW5rIFN0b3JlfSBpcyBwcm92aWRlZCwgYSBuZXcge0BsaW5rIE1lbW9yeUNvb2tpZVN0b3JlfSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIC0gVHJhbnNmZXJyaW5nIGJldHdlZW4gc3RvcmUgdHlwZXMgaXMgc3VwcG9ydGVkIHNvIGxvbmcgYXMgdGhlIHNvdXJjZVxuICAgKiAgICAgaW1wbGVtZW50cyBgLmdldEFsbENvb2tpZXMoKWAgYW5kIHRoZSBkZXN0aW5hdGlvbiBpbXBsZW1lbnRzIGAucHV0Q29va2llKClgLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3U3RvcmUgLSBUaGUgdGFyZ2V0IHtAbGluayBTdG9yZX0gdG8gY2xvbmUgY29va2llcyBpbnRvLlxuICAgKi9cbiAgY2xvbmUobmV3U3RvcmU/OiBTdG9yZSk6IFByb21pc2U8Q29va2llSmFyPlxuICAvKipcbiAgICogQGludGVybmFsIE5vIGRvYyBiZWNhdXNlIHRoaXMgaXMgdGhlIG92ZXJsb2FkIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBjbG9uZShcbiAgICBuZXdTdG9yZT86IFN0b3JlIHwgQ2FsbGJhY2s8Q29va2llSmFyPixcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZUphcj4sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh0eXBlb2YgbmV3U3RvcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gbmV3U3RvcmVcbiAgICAgIG5ld1N0b3JlID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZUNhbGxiYWNrID0gY3JlYXRlUHJvbWlzZUNhbGxiYWNrPENvb2tpZUphcj4oY2FsbGJhY2spXG4gICAgY29uc3QgY2IgPSBwcm9taXNlQ2FsbGJhY2suY2FsbGJhY2tcblxuICAgIHRoaXMuc2VyaWFsaXplKChlcnIsIHNlcmlhbGl6ZWQpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5yZWplY3QoZXJyKVxuICAgICAgfVxuICAgICAgcmV0dXJuIENvb2tpZUphci5kZXNlcmlhbGl6ZShzZXJpYWxpemVkID8/ICcnLCBuZXdTdG9yZSwgY2IpXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2Nsb25lU3luYyhuZXdTdG9yZT86IFN0b3JlKTogQ29va2llSmFyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjbG9uZUZuID1cbiAgICAgIG5ld1N0b3JlICYmIHR5cGVvZiBuZXdTdG9yZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHRoaXMuY2xvbmUuYmluZCh0aGlzLCBuZXdTdG9yZSlcbiAgICAgICAgOiB0aGlzLmNsb25lLmJpbmQodGhpcylcbiAgICByZXR1cm4gdGhpcy5jYWxsU3luYygoY2FsbGJhY2spID0+IHtcbiAgICAgIGNsb25lRm4oY2FsbGJhY2spXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyBhIGRlZXAgY2xvbmUgb2YgdGhpcyBDb29raWVKYXIuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG9yaWdpbmFsIGRvXG4gICAqIG5vdCBhZmZlY3QgdGhlIGNsb25lLCBhbmQgdmljZSB2ZXJzYS5cbiAgICpcbiAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBPbmx5IHdvcmtzIGlmIGJvdGggdGhlIGNvbmZpZ3VyZWQgU3RvcmUgYW5kIGRlc3RpbmF0aW9uXG4gICAqIFN0b3JlIGFyZSBzeW5jaHJvbm91cy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBXaGVuIG5vIHtAbGluayBTdG9yZX0gaXMgcHJvdmlkZWQsIGEgbmV3IHtAbGluayBNZW1vcnlDb29raWVTdG9yZX0gd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiAtIFRyYW5zZmVycmluZyBiZXR3ZWVuIHN0b3JlIHR5cGVzIGlzIHN1cHBvcnRlZCBzbyBsb25nIGFzIHRoZSBzb3VyY2VcbiAgICogICAgIGltcGxlbWVudHMgYC5nZXRBbGxDb29raWVzKClgIGFuZCB0aGUgZGVzdGluYXRpb24gaW1wbGVtZW50cyBgLnB1dENvb2tpZSgpYC5cbiAgICpcbiAgICogQHBhcmFtIG5ld1N0b3JlIC0gVGhlIHRhcmdldCB7QGxpbmsgU3RvcmV9IHRvIGNsb25lIGNvb2tpZXMgaW50by5cbiAgICovXG4gIGNsb25lU3luYyhuZXdTdG9yZT86IFN0b3JlKTogQ29va2llSmFyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIW5ld1N0b3JlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2xvbmVTeW5jKClcbiAgICB9XG4gICAgaWYgKCFuZXdTdG9yZS5zeW5jaHJvbm91cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ29va2llSmFyIGNsb25lIGRlc3RpbmF0aW9uIHN0b3JlIGlzIG5vdCBzeW5jaHJvbm91czsgdXNlIGFzeW5jIEFQSSBpbnN0ZWFkLicsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbG9uZVN5bmMobmV3U3RvcmUpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY29va2llcyBmcm9tIHRoZSBDb29raWVKYXIuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gVGhpcyBpcyBhIG5ldyBiYWNrd2FyZHMtY29tcGF0aWJsZSBmZWF0dXJlIG9mIHRvdWdoLWNvb2tpZSB2ZXJzaW9uIDIuNSxcbiAgICogICAgIHNvIG5vdCBhbGwgU3RvcmVzIHdpbGwgaW1wbGVtZW50IGl0IGVmZmljaWVudGx5LiBGb3IgU3RvcmVzIHRoYXQgZG8gbm90XG4gICAqICAgICBpbXBsZW1lbnQgYHJlbW92ZUFsbENvb2tpZXNgLCB0aGUgZmFsbGJhY2sgaXMgdG8gY2FsbCBgcmVtb3ZlQ29va2llYCBhZnRlclxuICAgKiAgICAgYGdldEFsbENvb2tpZXNgLlxuICAgKlxuICAgKiAtIElmIGBnZXRBbGxDb29raWVzYCBmYWlscyBvciBpc24ndCBpbXBsZW1lbnRlZCBpbiB0aGUgU3RvcmUsIGFuIGVycm9yIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiAtIElmIG9uZSBvciBtb3JlIG9mIHRoZSBgcmVtb3ZlQ29va2llYCBjYWxscyBmYWlsLCBvbmx5IHRoZSBmaXJzdCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYWxsIHRoZSBjb29raWVzIGhhdmUgYmVlbiByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlQWxsQ29va2llcyhjYWxsYmFjazogRXJyb3JDYWxsYmFjayk6IHZvaWRcbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGNvb2tpZXMgZnJvbSB0aGUgQ29va2llSmFyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoaXMgaXMgYSBuZXcgYmFja3dhcmRzLWNvbXBhdGlibGUgZmVhdHVyZSBvZiB0b3VnaC1jb29raWUgdmVyc2lvbiAyLjUsXG4gICAqICAgICBzbyBub3QgYWxsIFN0b3JlcyB3aWxsIGltcGxlbWVudCBpdCBlZmZpY2llbnRseS4gRm9yIFN0b3JlcyB0aGF0IGRvIG5vdFxuICAgKiAgICAgaW1wbGVtZW50IGByZW1vdmVBbGxDb29raWVzYCwgdGhlIGZhbGxiYWNrIGlzIHRvIGNhbGwgYHJlbW92ZUNvb2tpZWAgYWZ0ZXJcbiAgICogICAgIGBnZXRBbGxDb29raWVzYC5cbiAgICpcbiAgICogLSBJZiBgZ2V0QWxsQ29va2llc2AgZmFpbHMgb3IgaXNuJ3QgaW1wbGVtZW50ZWQgaW4gdGhlIFN0b3JlLCBhbiBlcnJvciBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogLSBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgYHJlbW92ZUNvb2tpZWAgY2FsbHMgZmFpbCwgb25seSB0aGUgZmlyc3QgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAqL1xuICByZW1vdmVBbGxDb29raWVzKCk6IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIHRoZSBvdmVybG9hZCBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgcmVtb3ZlQWxsQ29va2llcyhjYWxsYmFjaz86IEVycm9yQ2FsbGJhY2spOiB1bmtub3duIHtcbiAgICBjb25zdCBwcm9taXNlQ2FsbGJhY2sgPSBjcmVhdGVQcm9taXNlQ2FsbGJhY2s8dW5kZWZpbmVkPihjYWxsYmFjaylcbiAgICBjb25zdCBjYiA9IHByb21pc2VDYWxsYmFjay5jYWxsYmFja1xuXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlXG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSBzdG9yZSBpbXBsZW1lbnRzIGl0cyBvd24gcmVtb3ZlQWxsQ29va2llcygpLiBUaGUgZGVmYXVsdFxuICAgIC8vIGltcGxlbWVudGF0aW9uIGluIFN0b3JlIHdpbGwgaW1tZWRpYXRlbHkgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBhIFwibm90XG4gICAgLy8gaW1wbGVtZW50ZWRcIiBFcnJvci5cbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygc3RvcmUucmVtb3ZlQWxsQ29va2llcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgc3RvcmUucmVtb3ZlQWxsQ29va2llcyAhPT0gU3RvcmUucHJvdG90eXBlLnJlbW92ZUFsbENvb2tpZXNcbiAgICApIHtcbiAgICAgIC8vIGBDYWxsYmFjazx1bmRlZmluZWQ+YCBhbmQgYEVycm9yQ2FsbGJhY2tgIGFyZSAqdGVjaG5pY2FsbHkqIGluY29tcGF0aWJsZSwgYnV0IGZvciB0aGVcbiAgICAgIC8vIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGBjYiA9IChlcnIsIHJlc3VsdCkgPT4ge31gLCB0aGV5J3JlIGVzc2VudGlhbGx5IHRoZSBzYW1lLlxuICAgICAgc3RvcmUucmVtb3ZlQWxsQ29va2llcyhjYiBhcyBFcnJvckNhbGxiYWNrKVxuICAgICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5wcm9taXNlXG4gICAgfVxuXG4gICAgc3RvcmUuZ2V0QWxsQ29va2llcygoZXJyLCBjb29raWVzKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNiKGVycilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghY29va2llcykge1xuICAgICAgICBjb29raWVzID0gW11cbiAgICAgIH1cblxuICAgICAgaWYgKGNvb2tpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNiKG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBjb21wbGV0ZWRDb3VudCA9IDBcbiAgICAgIGNvbnN0IHJlbW92ZUVycm9yczogRXJyb3JbXSA9IFtdXG5cbiAgICAgIC8vIFRPRE86IFJlZmFjdG9yIHRvIGF2b2lkIHVzaW5nIGNhbGxiYWNrXG4gICAgICBjb25zdCByZW1vdmVDb29raWVDYjogRXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uIHJlbW92ZUNvb2tpZUNiKHJlbW92ZUVycikge1xuICAgICAgICBpZiAocmVtb3ZlRXJyKSB7XG4gICAgICAgICAgcmVtb3ZlRXJyb3JzLnB1c2gocmVtb3ZlRXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkQ291bnQrK1xuXG4gICAgICAgIGlmIChjb21wbGV0ZWRDb3VudCA9PT0gY29va2llcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAocmVtb3ZlRXJyb3JzWzBdKSBjYihyZW1vdmVFcnJvcnNbMF0pXG4gICAgICAgICAgZWxzZSBjYihudWxsLCB1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29va2llcy5mb3JFYWNoKChjb29raWUpID0+IHtcbiAgICAgICAgc3RvcmUucmVtb3ZlQ29va2llKFxuICAgICAgICAgIGNvb2tpZS5kb21haW4sXG4gICAgICAgICAgY29va2llLnBhdGgsXG4gICAgICAgICAgY29va2llLmtleSxcbiAgICAgICAgICByZW1vdmVDb29raWVDYixcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY29va2llcyBmcm9tIHRoZSBDb29raWVKYXIuXG4gICAqXG4gICAqIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogT25seSB3b3JrcyBpZiB0aGUgY29uZmlndXJlZCBTdG9yZSBpcyBhbHNvIHN5bmNocm9ub3VzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoaXMgaXMgYSBuZXcgYmFja3dhcmRzLWNvbXBhdGlibGUgZmVhdHVyZSBvZiB0b3VnaC1jb29raWUgdmVyc2lvbiAyLjUsXG4gICAqICAgICBzbyBub3QgYWxsIFN0b3JlcyB3aWxsIGltcGxlbWVudCBpdCBlZmZpY2llbnRseS4gRm9yIFN0b3JlcyB0aGF0IGRvIG5vdFxuICAgKiAgICAgaW1wbGVtZW50IGByZW1vdmVBbGxDb29raWVzYCwgdGhlIGZhbGxiYWNrIGlzIHRvIGNhbGwgYHJlbW92ZUNvb2tpZWAgYWZ0ZXJcbiAgICogICAgIGBnZXRBbGxDb29raWVzYC5cbiAgICpcbiAgICogLSBJZiBgZ2V0QWxsQ29va2llc2AgZmFpbHMgb3IgaXNuJ3QgaW1wbGVtZW50ZWQgaW4gdGhlIFN0b3JlLCBhbiBlcnJvciBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogLSBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgYHJlbW92ZUNvb2tpZWAgY2FsbHMgZmFpbCwgb25seSB0aGUgZmlyc3QgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAqL1xuICByZW1vdmVBbGxDb29raWVzU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxTeW5jPHVuZGVmaW5lZD4oKGNhbGxiYWNrKSA9PiB7XG4gICAgICAvLyBgQ2FsbGJhY2s8dW5kZWZpbmVkPmAgYW5kIGBFcnJvckNhbGxiYWNrYCBhcmUgKnRlY2huaWNhbGx5KiBpbmNvbXBhdGlibGUsIGJ1dCBmb3IgdGhlXG4gICAgICAvLyBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBgY2IgPSAoZXJyLCByZXN1bHQpID0+IHt9YCwgdGhleSdyZSBlc3NlbnRpYWxseSB0aGUgc2FtZS5cbiAgICAgIHRoaXMucmVtb3ZlQWxsQ29va2llcyhjYWxsYmFjayBhcyBFcnJvckNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQSBuZXcgQ29va2llSmFyIGlzIGNyZWF0ZWQgYW5kIHRoZSBzZXJpYWxpemVkIHtAbGluayBDb29raWV9IHZhbHVlcyBhcmUgYWRkZWQgdG9cbiAgICogdGhlIHVuZGVybHlpbmcgc3RvcmUuIEVhY2gge0BsaW5rIENvb2tpZX0gaXMgYWRkZWQgdmlhIGBzdG9yZS5wdXRDb29raWUoLi4uKWAgaW5cbiAgICogdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFdoZW4gbm8ge0BsaW5rIFN0b3JlfSBpcyBwcm92aWRlZCwgYSBuZXcge0BsaW5rIE1lbW9yeUNvb2tpZVN0b3JlfSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIC0gQXMgYSBjb252ZW5pZW5jZSwgaWYgYHN0ck9yT2JqYCBpcyBhIHN0cmluZywgaXQgaXMgcGFzc2VkIHRocm91Z2ggYEpTT04ucGFyc2VgIGZpcnN0LlxuICAgKlxuICAgKiBAcGFyYW0gc3RyT3JPYmogLSBBIEpTT04gc3RyaW5nIG9yIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlc2VyaWFsaXplZCBjb29raWVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgdGhlIHtAbGluayBDb29raWVKYXJ9IGhhcyBiZWVuIGRlc2VyaWFsaXplZC5cbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShcbiAgICBzdHJPck9iajogc3RyaW5nIHwgb2JqZWN0LFxuICAgIGNhbGxiYWNrOiBDYWxsYmFjazxDb29raWVKYXI+LFxuICApOiB2b2lkXG4gIC8qKlxuICAgKiBBIG5ldyBDb29raWVKYXIgaXMgY3JlYXRlZCBhbmQgdGhlIHNlcmlhbGl6ZWQge0BsaW5rIENvb2tpZX0gdmFsdWVzIGFyZSBhZGRlZCB0b1xuICAgKiB0aGUgdW5kZXJseWluZyBzdG9yZS4gRWFjaCB7QGxpbmsgQ29va2llfSBpcyBhZGRlZCB2aWEgYHN0b3JlLnB1dENvb2tpZSguLi4pYCBpblxuICAgKiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gV2hlbiBubyB7QGxpbmsgU3RvcmV9IGlzIHByb3ZpZGVkLCBhIG5ldyB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9IHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogLSBBcyBhIGNvbnZlbmllbmNlLCBpZiBgc3RyT3JPYmpgIGlzIGEgc3RyaW5nLCBpdCBpcyBwYXNzZWQgdGhyb3VnaCBgSlNPTi5wYXJzZWAgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJPck9iaiAtIEEgSlNPTiBzdHJpbmcgb3Igb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVzZXJpYWxpemVkIGNvb2tpZXMuXG4gICAqIEBwYXJhbSBzdG9yZSAtIFRoZSB1bmRlcmx5aW5nIHN0b3JlIHRvIHBlcnNpc3QgdGhlIGRlc2VyaWFsaXplZCBjb29raWVzIGludG8uXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdG8gY2FsbCBhZnRlciB0aGUge0BsaW5rIENvb2tpZUphcn0gaGFzIGJlZW4gZGVzZXJpYWxpemVkLlxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKFxuICAgIHN0ck9yT2JqOiBzdHJpbmcgfCBvYmplY3QsXG4gICAgc3RvcmU6IFN0b3JlLFxuICAgIGNhbGxiYWNrOiBDYWxsYmFjazxDb29raWVKYXI+LFxuICApOiB2b2lkXG4gIC8qKlxuICAgKiBBIG5ldyBDb29raWVKYXIgaXMgY3JlYXRlZCBhbmQgdGhlIHNlcmlhbGl6ZWQge0BsaW5rIENvb2tpZX0gdmFsdWVzIGFyZSBhZGRlZCB0b1xuICAgKiB0aGUgdW5kZXJseWluZyBzdG9yZS4gRWFjaCB7QGxpbmsgQ29va2llfSBpcyBhZGRlZCB2aWEgYHN0b3JlLnB1dENvb2tpZSguLi4pYCBpblxuICAgKiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIC0gV2hlbiBubyB7QGxpbmsgU3RvcmV9IGlzIHByb3ZpZGVkLCBhIG5ldyB7QGxpbmsgTWVtb3J5Q29va2llU3RvcmV9IHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogLSBBcyBhIGNvbnZlbmllbmNlLCBpZiBgc3RyT3JPYmpgIGlzIGEgc3RyaW5nLCBpdCBpcyBwYXNzZWQgdGhyb3VnaCBgSlNPTi5wYXJzZWAgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJPck9iaiAtIEEgSlNPTiBzdHJpbmcgb3Igb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVzZXJpYWxpemVkIGNvb2tpZXMuXG4gICAqIEBwYXJhbSBzdG9yZSAtIFRoZSB1bmRlcmx5aW5nIHN0b3JlIHRvIHBlcnNpc3QgdGhlIGRlc2VyaWFsaXplZCBjb29raWVzIGludG8uXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemUoXG4gICAgc3RyT3JPYmo6IHN0cmluZyB8IG9iamVjdCxcbiAgICBzdG9yZT86IFN0b3JlLFxuICApOiBQcm9taXNlPENvb2tpZUphcj5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIGFuIG92ZXJsb2FkIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemUoXG4gICAgc3RyT3JPYmo6IHN0cmluZyB8IG9iamVjdCxcbiAgICBzdG9yZT86IFN0b3JlIHwgQ2FsbGJhY2s8Q29va2llSmFyPixcbiAgICBjYWxsYmFjaz86IENhbGxiYWNrPENvb2tpZUphcj4sXG4gICk6IHVua25vd25cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBObyBkb2MgYmVjYXVzZSB0aGlzIGlzIHRoZSBvdmVybG9hZCBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKFxuICAgIHN0ck9yT2JqOiBzdHJpbmcgfCBvYmplY3QsXG4gICAgc3RvcmU/OiBTdG9yZSB8IENhbGxiYWNrPENvb2tpZUphcj4sXG4gICAgY2FsbGJhY2s/OiBDYWxsYmFjazxDb29raWVKYXI+LFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodHlwZW9mIHN0b3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IHN0b3JlXG4gICAgICBzdG9yZSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VDYWxsYmFjayA9IGNyZWF0ZVByb21pc2VDYWxsYmFjazxDb29raWVKYXI+KGNhbGxiYWNrKVxuXG4gICAgbGV0IHNlcmlhbGl6ZWQ6IHVua25vd25cbiAgICBpZiAodHlwZW9mIHN0ck9yT2JqID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VyaWFsaXplZCA9IEpTT04ucGFyc2Uoc3RyT3JPYmopXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlQ2FsbGJhY2sucmVqZWN0KGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWFsaXplZCA9IHN0ck9yT2JqXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZFNlcmlhbGl6ZWRQcm9wZXJ0eSA9IChwcm9wZXJ0eTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZCAmJlxuICAgICAgICB0eXBlb2Ygc2VyaWFsaXplZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgaW5PcGVyYXRvcihwcm9wZXJ0eSwgc2VyaWFsaXplZClcbiAgICAgICAgPyBzZXJpYWxpemVkW3Byb3BlcnR5XVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHJlYWRTZXJpYWxpemVkQm9vbGVhbiA9IChwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJlYWRTZXJpYWxpemVkUHJvcGVydHkocHJvcGVydHkpXG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgPyB2YWx1ZSA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHJlYWRTZXJpYWxpemVkU3RyaW5nID0gKHByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSByZWFkU2VyaWFsaXplZFByb3BlcnR5KHByb3BlcnR5KVxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IGphciA9IG5ldyBDb29raWVKYXIoc3RvcmUsIHtcbiAgICAgIHJlamVjdFB1YmxpY1N1ZmZpeGVzOiByZWFkU2VyaWFsaXplZEJvb2xlYW4oJ3JlamVjdFB1YmxpY1N1ZmZpeGVzJyksXG4gICAgICBsb29zZU1vZGU6IHJlYWRTZXJpYWxpemVkQm9vbGVhbignZW5hYmxlTG9vc2VNb2RlJyksXG4gICAgICBhbGxvd1NwZWNpYWxVc2VEb21haW46IHJlYWRTZXJpYWxpemVkQm9vbGVhbignYWxsb3dTcGVjaWFsVXNlRG9tYWluJyksXG4gICAgICBwcmVmaXhTZWN1cml0eTogZ2V0Tm9ybWFsaXplZFByZWZpeFNlY3VyaXR5KFxuICAgICAgICByZWFkU2VyaWFsaXplZFN0cmluZygncHJlZml4U2VjdXJpdHknKSA/PyAnc2lsZW50JyxcbiAgICAgICksXG4gICAgfSlcblxuICAgIGphci5faW1wb3J0Q29va2llcyhzZXJpYWxpemVkLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHByb21pc2VDYWxsYmFjay5jYWxsYmFjayhlcnIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcHJvbWlzZUNhbGxiYWNrLmNhbGxiYWNrKG51bGwsIGphcilcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VDYWxsYmFjay5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQSBuZXcgQ29va2llSmFyIGlzIGNyZWF0ZWQgYW5kIHRoZSBzZXJpYWxpemVkIHtAbGluayBDb29raWV9IHZhbHVlcyBhcmUgYWRkZWQgdG9cbiAgICogdGhlIHVuZGVybHlpbmcgc3RvcmUuIEVhY2gge0BsaW5rIENvb2tpZX0gaXMgYWRkZWQgdmlhIGBzdG9yZS5wdXRDb29raWUoLi4uKWAgaW5cbiAgICogdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IE9ubHkgd29ya3MgaWYgdGhlIGNvbmZpZ3VyZWQgU3RvcmUgaXMgYWxzbyBzeW5jaHJvbm91cy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBXaGVuIG5vIHtAbGluayBTdG9yZX0gaXMgcHJvdmlkZWQsIGEgbmV3IHtAbGluayBNZW1vcnlDb29raWVTdG9yZX0gd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiAtIEFzIGEgY29udmVuaWVuY2UsIGlmIGBzdHJPck9iamAgaXMgYSBzdHJpbmcsIGl0IGlzIHBhc3NlZCB0aHJvdWdoIGBKU09OLnBhcnNlYCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHN0ck9yT2JqIC0gQSBKU09OIHN0cmluZyBvciBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZXNlcmlhbGl6ZWQgY29va2llcy5cbiAgICogQHBhcmFtIHN0b3JlIC0gVGhlIHVuZGVybHlpbmcgc3RvcmUgdG8gcGVyc2lzdCB0aGUgZGVzZXJpYWxpemVkIGNvb2tpZXMgaW50by5cbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZVN5bmMoXG4gICAgc3RyT3JPYmo6IHN0cmluZyB8IFNlcmlhbGl6ZWRDb29raWVKYXIsXG4gICAgc3RvcmU/OiBTdG9yZSxcbiAgKTogQ29va2llSmFyIHtcbiAgICBjb25zdCBzZXJpYWxpemVkOiB1bmtub3duID1cbiAgICAgIHR5cGVvZiBzdHJPck9iaiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHN0ck9yT2JqKSA6IHN0ck9yT2JqXG5cbiAgICBjb25zdCByZWFkU2VyaWFsaXplZFByb3BlcnR5ID0gKHByb3BlcnR5OiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkICYmXG4gICAgICAgIHR5cGVvZiBzZXJpYWxpemVkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBpbk9wZXJhdG9yKHByb3BlcnR5LCBzZXJpYWxpemVkKVxuICAgICAgICA/IHNlcmlhbGl6ZWRbcHJvcGVydHldXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZFNlcmlhbGl6ZWRCb29sZWFuID0gKHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVhZFNlcmlhbGl6ZWRQcm9wZXJ0eShwcm9wZXJ0eSlcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZFNlcmlhbGl6ZWRTdHJpbmcgPSAocHJvcGVydHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJlYWRTZXJpYWxpemVkUHJvcGVydHkocHJvcGVydHkpXG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgamFyID0gbmV3IENvb2tpZUphcihzdG9yZSwge1xuICAgICAgcmVqZWN0UHVibGljU3VmZml4ZXM6IHJlYWRTZXJpYWxpemVkQm9vbGVhbigncmVqZWN0UHVibGljU3VmZml4ZXMnKSxcbiAgICAgIGxvb3NlTW9kZTogcmVhZFNlcmlhbGl6ZWRCb29sZWFuKCdlbmFibGVMb29zZU1vZGUnKSxcbiAgICAgIGFsbG93U3BlY2lhbFVzZURvbWFpbjogcmVhZFNlcmlhbGl6ZWRCb29sZWFuKCdhbGxvd1NwZWNpYWxVc2VEb21haW4nKSxcbiAgICAgIHByZWZpeFNlY3VyaXR5OiBnZXROb3JtYWxpemVkUHJlZml4U2VjdXJpdHkoXG4gICAgICAgIHJlYWRTZXJpYWxpemVkU3RyaW5nKCdwcmVmaXhTZWN1cml0eScpID8/ICdzaWxlbnQnLFxuICAgICAgKSxcbiAgICB9KVxuXG4gICAgLy8gY2F0Y2ggdGhpcyBtaXN0YWtlIGVhcmx5OlxuICAgIGlmICghamFyLnN0b3JlLnN5bmNocm9ub3VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb29raWVKYXIgc3RvcmUgaXMgbm90IHN5bmNocm9ub3VzOyB1c2UgYXN5bmMgQVBJIGluc3RlYWQuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICBqYXIuX2ltcG9ydENvb2tpZXNTeW5jKHNlcmlhbGl6ZWQpXG4gICAgcmV0dXJuIGphclxuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIG9mIHtAbGluayBDb29raWVKYXIuZGVzZXJpYWxpemVTeW5jfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBXaGVuIG5vIHtAbGluayBTdG9yZX0gaXMgcHJvdmlkZWQsIGEgbmV3IHtAbGluayBNZW1vcnlDb29raWVTdG9yZX0gd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiAtIEFzIGEgY29udmVuaWVuY2UsIGlmIGBzdHJPck9iamAgaXMgYSBzdHJpbmcsIGl0IGlzIHBhc3NlZCB0aHJvdWdoIGBKU09OLnBhcnNlYCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGpzb25TdHJpbmcgLSBBIEpTT04gc3RyaW5nIG9yIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlc2VyaWFsaXplZCBjb29raWVzLlxuICAgKiBAcGFyYW0gc3RvcmUgLSBUaGUgdW5kZXJseWluZyBzdG9yZSB0byBwZXJzaXN0IHRoZSBkZXNlcmlhbGl6ZWQgY29va2llcyBpbnRvLlxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKFxuICAgIGpzb25TdHJpbmc6IHN0cmluZyB8IFNlcmlhbGl6ZWRDb29raWVKYXIsXG4gICAgc3RvcmU/OiBTdG9yZSxcbiAgKTogQ29va2llSmFyIHtcbiAgICByZXR1cm4gQ29va2llSmFyLmRlc2VyaWFsaXplU3luYyhqc29uU3RyaW5nLCBzdG9yZSlcbiAgfVxufVxuIiwgIi8qKlxuICogR2VuZXJhdGVzIHRoZSBwZXJtdXRhdGlvbiBvZiBhbGwgcG9zc2libGUgdmFsdWVzIHRoYXQge0BsaW5rIHBhdGhNYXRjaH0gdGhlIGBwYXRoYCBwYXJhbWV0ZXIuXG4gKiBUaGUgYXJyYXkgaXMgaW4gbG9uZ2VzdC10by1zaG9ydGVzdCBvcmRlci4gIFVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGN1c3RvbSB7QGxpbmsgU3RvcmV9IGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiBwZXJtdXRlUGF0aCgnL2Zvby9iYXIvJylcbiAqIC8vIFsnL2Zvby9iYXIvJywgJy9mb28vYmFyJywgJy9mb28nLCAnLyddXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGF0aCAtIHRoZSBwYXRoIHRvIGdlbmVyYXRlIHBlcm11dGF0aW9ucyBmb3JcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm11dGVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKHBhdGggPT09ICcvJykge1xuICAgIHJldHVybiBbJy8nXVxuICB9XG4gIGNvbnN0IHBlcm11dGF0aW9ucyA9IFtwYXRoXVxuICB3aGlsZSAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgbGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpXG4gICAgaWYgKGxpbmRleCA9PT0gMCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgbGluZGV4KVxuICAgIHBlcm11dGF0aW9ucy5wdXNoKHBhdGgpXG4gIH1cbiAgcGVybXV0YXRpb25zLnB1c2goJy8nKVxuICByZXR1cm4gcGVybXV0YXRpb25zXG59XG4iLCAiZXhwb3J0IHsgTWVtb3J5Q29va2llU3RvcmUsIHR5cGUgTWVtb3J5Q29va2llU3RvcmVJbmRleCB9IGZyb20gJy4uL21lbXN0b3JlLmpzJ1xuZXhwb3J0IHsgcGF0aE1hdGNoIH0gZnJvbSAnLi4vcGF0aE1hdGNoLmpzJ1xuZXhwb3J0IHsgcGVybXV0ZURvbWFpbiB9IGZyb20gJy4uL3Blcm11dGVEb21haW4uanMnXG5leHBvcnQge1xuICBnZXRQdWJsaWNTdWZmaXgsXG4gIHR5cGUgR2V0UHVibGljU3VmZml4T3B0aW9ucyxcbn0gZnJvbSAnLi4vZ2V0UHVibGljU3VmZml4LmpzJ1xuZXhwb3J0IHsgU3RvcmUgfSBmcm9tICcuLi9zdG9yZS5qcydcbmV4cG9ydCB7IFBhcmFtZXRlckVycm9yIH0gZnJvbSAnLi4vdmFsaWRhdG9ycy5qcydcbmV4cG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJ1xuZXhwb3J0IHsgdHlwZSBDYWxsYmFjaywgdHlwZSBFcnJvckNhbGxiYWNrLCB0eXBlIE51bGxhYmxlIH0gZnJvbSAnLi4vdXRpbHMuanMnXG5leHBvcnQgeyBjYW5vbmljYWxEb21haW4gfSBmcm9tICcuL2Nhbm9uaWNhbERvbWFpbi5qcydcbmV4cG9ydCB7XG4gIFByZWZpeFNlY3VyaXR5RW51bSxcbiAgdHlwZSBTZXJpYWxpemVkQ29va2llLFxuICB0eXBlIFNlcmlhbGl6ZWRDb29raWVKYXIsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuZXhwb3J0IHtcbiAgQ29va2llLFxuICB0eXBlIENyZWF0ZUNvb2tpZU9wdGlvbnMsXG4gIHR5cGUgUGFyc2VDb29raWVPcHRpb25zLFxufSBmcm9tICcuL2Nvb2tpZS5qcydcbmV4cG9ydCB7IGNvb2tpZUNvbXBhcmUgfSBmcm9tICcuL2Nvb2tpZUNvbXBhcmUuanMnXG5leHBvcnQge1xuICBDb29raWVKYXIsXG4gIHR5cGUgQ3JlYXRlQ29va2llSmFyT3B0aW9ucyxcbiAgdHlwZSBHZXRDb29raWVzT3B0aW9ucyxcbiAgdHlwZSBTZXRDb29raWVPcHRpb25zLFxufSBmcm9tICcuL2Nvb2tpZUphci5qcydcbmV4cG9ydCB7IGRlZmF1bHRQYXRoIH0gZnJvbSAnLi9kZWZhdWx0UGF0aC5qcydcbmV4cG9ydCB7IGRvbWFpbk1hdGNoIH0gZnJvbSAnLi9kb21haW5NYXRjaC5qcydcbmV4cG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuL2Zvcm1hdERhdGUuanMnXG5leHBvcnQgeyBwYXJzZURhdGUgfSBmcm9tICcuL3BhcnNlRGF0ZS5qcydcbmV4cG9ydCB7IHBlcm11dGVQYXRoIH0gZnJvbSAnLi9wZXJtdXRlUGF0aC5qcydcblxuaW1wb3J0IHsgQ29va2llLCBQYXJzZUNvb2tpZU9wdGlvbnMgfSBmcm9tICcuL2Nvb2tpZS5qcydcblxuLyoqXG4gKiB7QGluaGVyaXREb2MgQ29va2llLnBhcnNlfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoXG4gIHN0cjogc3RyaW5nLFxuICBvcHRpb25zPzogUGFyc2VDb29raWVPcHRpb25zLFxuKTogQ29va2llIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIENvb2tpZS5wYXJzZShzdHIsIG9wdGlvbnMpXG59XG5cbi8qKlxuICoge0Bpbmhlcml0RG9jIENvb2tpZS5mcm9tSlNPTn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21KU09OKHN0cjogdW5rbm93bik6IENvb2tpZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBDb29raWUuZnJvbUpTT04oc3RyKVxufVxuIiwgIi8qKlxuICogUGFyc2VzIGEgZ2l2ZW4gdmFsdWUgaW50byBhIEpTT04uXG4gKiBEb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gb24gYW4gaW52YWxpZCBKU09OIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25QYXJzZTxWYWx1ZVR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgdmFsdWU6IGFueSxcbik6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuIiwgImltcG9ydCB7IGlzTm9kZVByb2Nlc3MgfSBmcm9tICdpcy1ub2RlLXByb2Nlc3MnXG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHtcbiAgQ29va2llLFxuICBDb29raWVKYXIsXG4gIE1lbW9yeUNvb2tpZVN0b3JlLFxuICB0eXBlIE1lbW9yeUNvb2tpZVN0b3JlSW5kZXgsXG59IGZyb20gJ3RvdWdoLWNvb2tpZSdcbmltcG9ydCB7IGpzb25QYXJzZSB9IGZyb20gJy4vaW50ZXJuYWwvanNvblBhcnNlJ1xuXG5jbGFzcyBDb29raWVTdG9yZSB7XG4gICNzdG9yYWdlS2V5ID0gJ19fbXN3LWNvb2tpZS1zdG9yZV9fJ1xuICAjamFyOiBDb29raWVKYXJcbiAgI21lbW9yeVN0b3JlOiBNZW1vcnlDb29raWVTdG9yZVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghaXNOb2RlUHJvY2VzcygpKSB7XG4gICAgICBpbnZhcmlhbnQoXG4gICAgICAgIHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBhIENvb2tpZVN0b3JlOiBgbG9jYWxTdG9yYWdlYCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuIFRoaXMgaXMgbGlrZWx5IGFuIGlzc3VlIHdpdGggeW91ciBlbnZpcm9ubWVudCwgd2hpY2ggaGFzIGJlZW4gZGV0ZWN0ZWQgYXMgYnJvd3NlciAob3IgYnJvd3Nlci1saWtlKSBlbnZpcm9ubWVudCBhbmQgbXVzdCBpbXBsZW1lbnQgZ2xvYmFsIGJyb3dzZXIgQVBJcyBjb3JyZWN0bHkuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLiNtZW1vcnlTdG9yZSA9IG5ldyBNZW1vcnlDb29raWVTdG9yZSgpXG4gICAgdGhpcy4jbWVtb3J5U3RvcmUuaWR4ID0gdGhpcy5nZXRDb29raWVTdG9yZUluZGV4KClcbiAgICB0aGlzLiNqYXIgPSBuZXcgQ29va2llSmFyKHRoaXMuI21lbW9yeVN0b3JlKVxuICB9XG5cbiAgcHVibGljIGdldENvb2tpZXModXJsOiBzdHJpbmcpOiBBcnJheTxDb29raWU+IHtcbiAgICByZXR1cm4gdGhpcy4jamFyLmdldENvb2tpZXNTeW5jKHVybClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRDb29raWUoY29va2llTmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuI2phci5zZXRDb29raWUoY29va2llTmFtZSwgdXJsKVxuICAgIHRoaXMucGVyc2lzdCgpXG4gIH1cblxuICBwcml2YXRlIGdldENvb2tpZVN0b3JlSW5kZXgoKTogTWVtb3J5Q29va2llU3RvcmVJbmRleCB7XG4gICAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCBjb29raWVzU3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy4jc3RvcmFnZUtleSlcbiAgICBpZiAoY29va2llc1N0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCByYXdDb29raWVzID0ganNvblBhcnNlPEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4oY29va2llc1N0cmluZylcbiAgICBpZiAocmF3Q29va2llcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCBjb29raWVzOiBNZW1vcnlDb29raWVTdG9yZUluZGV4ID0ge31cblxuICAgIGZvciAoY29uc3QgcmF3Q29va2llIG9mIHJhd0Nvb2tpZXMpIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IENvb2tpZS5mcm9tSlNPTihyYXdDb29raWUpXG5cbiAgICAgIGlmIChjb29raWUgIT0gbnVsbCAmJiBjb29raWUuZG9tYWluICE9IG51bGwgJiYgY29va2llLnBhdGggIT0gbnVsbCkge1xuICAgICAgICBjb29raWVzW2Nvb2tpZS5kb21haW5dIHx8PSB7fVxuICAgICAgICBjb29raWVzW2Nvb2tpZS5kb21haW5dW2Nvb2tpZS5wYXRoXSB8fD0ge31cbiAgICAgICAgY29va2llc1tjb29raWUuZG9tYWluXVtjb29raWUucGF0aF1bY29va2llLmtleV0gPSBjb29raWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29va2llc1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJzaXN0KCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgbG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IFtdXG4gICAgY29uc3QgeyBpZHggfSA9IHRoaXMuI21lbW9yeVN0b3JlXG5cbiAgICBmb3IgKGNvbnN0IGRvbWFpbiBpbiBpZHgpIHtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBpbiBpZHhbZG9tYWluXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpZHhbZG9tYWluXVtwYXRoXSkge1xuICAgICAgICAgIGRhdGEucHVzaChpZHhbZG9tYWluXVtwYXRoXVtrZXldLnRvSlNPTigpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy4jc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvb2tpZVN0b3JlID0gbmV3IENvb2tpZVN0b3JlKClcbiIsICJ2YXIgX19jcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fY29tbW9uSlMgPSAoY2IsIG1vZCkgPT4gZnVuY3Rpb24gX19yZXF1aXJlKCkge1xuICByZXR1cm4gbW9kIHx8ICgwLCBjYltfX2dldE93blByb3BOYW1lcyhjYilbMF1dKSgobW9kID0geyBleHBvcnRzOiB7fSB9KS5leHBvcnRzLCBtb2QpLCBtb2QuZXhwb3J0cztcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKFxuICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNXG4gIC8vIGZpbGUgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBDb21tb25KUyBmaWxlIHVzaW5nIGEgQmFiZWwtXG4gIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuIFwiX19lc01vZHVsZVwiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldFxuICAvLyBcImRlZmF1bHRcIiB0byB0aGUgQ29tbW9uSlMgXCJtb2R1bGUuZXhwb3J0c1wiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuXG4gIGlzTm9kZU1vZGUgfHwgIW1vZCB8fCAhbW9kLl9fZXNNb2R1bGUgPyBfX2RlZlByb3AodGFyZ2V0LCBcImRlZmF1bHRcIiwgeyB2YWx1ZTogbW9kLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0LFxuICBtb2RcbikpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vc3RhdHVzZXNAMi4wLjIvbm9kZV9tb2R1bGVzL3N0YXR1c2VzL2NvZGVzLmpzb25cbnZhciByZXF1aXJlX2NvZGVzID0gX19jb21tb25KUyh7XG4gIFwibm9kZV9tb2R1bGVzLy5wbnBtL3N0YXR1c2VzQDIuMC4yL25vZGVfbW9kdWxlcy9zdGF0dXNlcy9jb2Rlcy5qc29uXCIoZXhwb3J0cywgbW9kdWxlKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICBcIjEwMFwiOiBcIkNvbnRpbnVlXCIsXG4gICAgICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgICAgIFwiMTAyXCI6IFwiUHJvY2Vzc2luZ1wiLFxuICAgICAgXCIxMDNcIjogXCJFYXJseSBIaW50c1wiLFxuICAgICAgXCIyMDBcIjogXCJPS1wiLFxuICAgICAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gICAgICBcIjIwMlwiOiBcIkFjY2VwdGVkXCIsXG4gICAgICBcIjIwM1wiOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsXG4gICAgICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgICAgIFwiMjA1XCI6IFwiUmVzZXQgQ29udGVudFwiLFxuICAgICAgXCIyMDZcIjogXCJQYXJ0aWFsIENvbnRlbnRcIixcbiAgICAgIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gICAgICBcIjIwOFwiOiBcIkFscmVhZHkgUmVwb3J0ZWRcIixcbiAgICAgIFwiMjI2XCI6IFwiSU0gVXNlZFwiLFxuICAgICAgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gICAgICBcIjMwMVwiOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG4gICAgICBcIjMwMlwiOiBcIkZvdW5kXCIsXG4gICAgICBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLFxuICAgICAgXCIzMDRcIjogXCJOb3QgTW9kaWZpZWRcIixcbiAgICAgIFwiMzA1XCI6IFwiVXNlIFByb3h5XCIsXG4gICAgICBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICAgICAgXCIzMDhcIjogXCJQZXJtYW5lbnQgUmVkaXJlY3RcIixcbiAgICAgIFwiNDAwXCI6IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICBcIjQwMlwiOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgICAgIFwiNDAzXCI6IFwiRm9yYmlkZGVuXCIsXG4gICAgICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuICAgICAgXCI0MDVcIjogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgICAgIFwiNDA2XCI6IFwiTm90IEFjY2VwdGFibGVcIixcbiAgICAgIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgICAgIFwiNDA4XCI6IFwiUmVxdWVzdCBUaW1lb3V0XCIsXG4gICAgICBcIjQwOVwiOiBcIkNvbmZsaWN0XCIsXG4gICAgICBcIjQxMFwiOiBcIkdvbmVcIixcbiAgICAgIFwiNDExXCI6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG4gICAgICBcIjQxMlwiOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgICAgIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgICAgIFwiNDE0XCI6IFwiVVJJIFRvbyBMb25nXCIsXG4gICAgICBcIjQxNVwiOiBcIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGVcIixcbiAgICAgIFwiNDE2XCI6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gICAgICBcIjQxN1wiOiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLFxuICAgICAgXCI0MThcIjogXCJJJ20gYSBUZWFwb3RcIixcbiAgICAgIFwiNDIxXCI6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICAgICAgXCI0MjJcIjogXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiLFxuICAgICAgXCI0MjNcIjogXCJMb2NrZWRcIixcbiAgICAgIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgICAgIFwiNDI1XCI6IFwiVG9vIEVhcmx5XCIsXG4gICAgICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgICAgIFwiNDI4XCI6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gICAgICBcIjQyOVwiOiBcIlRvbyBNYW55IFJlcXVlc3RzXCIsXG4gICAgICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgICAgIFwiNDUxXCI6IFwiVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnNcIixcbiAgICAgIFwiNTAwXCI6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXG4gICAgICBcIjUwMVwiOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICAgICAgXCI1MDJcIjogXCJCYWQgR2F0ZXdheVwiLFxuICAgICAgXCI1MDNcIjogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXG4gICAgICBcIjUwNFwiOiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICAgICAgXCI1MDVcIjogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiLFxuICAgICAgXCI1MDZcIjogXCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFxuICAgICAgXCI1MDdcIjogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuICAgICAgXCI1MDhcIjogXCJMb29wIERldGVjdGVkXCIsXG4gICAgICBcIjUwOVwiOiBcIkJhbmR3aWR0aCBMaW1pdCBFeGNlZWRlZFwiLFxuICAgICAgXCI1MTBcIjogXCJOb3QgRXh0ZW5kZWRcIixcbiAgICAgIFwiNTExXCI6IFwiTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiXG4gICAgfTtcbiAgfVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdGF0dXNlc0AyLjAuMi9ub2RlX21vZHVsZXMvc3RhdHVzZXMvaW5kZXguanNcbnZhciByZXF1aXJlX3N0YXR1c2VzID0gX19jb21tb25KUyh7XG4gIFwibm9kZV9tb2R1bGVzLy5wbnBtL3N0YXR1c2VzQDIuMC4yL25vZGVfbW9kdWxlcy9zdGF0dXNlcy9pbmRleC5qc1wiKGV4cG9ydHMsIG1vZHVsZSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBjb2RlcyA9IHJlcXVpcmVfY29kZXMoKTtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHN0YXR1cztcbiAgICBzdGF0dXMubWVzc2FnZSA9IGNvZGVzO1xuICAgIHN0YXR1cy5jb2RlID0gY3JlYXRlTWVzc2FnZVRvU3RhdHVzQ29kZU1hcChjb2Rlcyk7XG4gICAgc3RhdHVzLmNvZGVzID0gY3JlYXRlU3RhdHVzQ29kZUxpc3QoY29kZXMpO1xuICAgIHN0YXR1cy5yZWRpcmVjdCA9IHtcbiAgICAgIDMwMDogdHJ1ZSxcbiAgICAgIDMwMTogdHJ1ZSxcbiAgICAgIDMwMjogdHJ1ZSxcbiAgICAgIDMwMzogdHJ1ZSxcbiAgICAgIDMwNTogdHJ1ZSxcbiAgICAgIDMwNzogdHJ1ZSxcbiAgICAgIDMwODogdHJ1ZVxuICAgIH07XG4gICAgc3RhdHVzLmVtcHR5ID0ge1xuICAgICAgMjA0OiB0cnVlLFxuICAgICAgMjA1OiB0cnVlLFxuICAgICAgMzA0OiB0cnVlXG4gICAgfTtcbiAgICBzdGF0dXMucmV0cnkgPSB7XG4gICAgICA1MDI6IHRydWUsXG4gICAgICA1MDM6IHRydWUsXG4gICAgICA1MDQ6IHRydWVcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VUb1N0YXR1c0NvZGVNYXAoY29kZXMyKSB7XG4gICAgICB2YXIgbWFwID0ge307XG4gICAgICBPYmplY3Qua2V5cyhjb2RlczIpLmZvckVhY2goZnVuY3Rpb24gZm9yRWFjaENvZGUoY29kZSkge1xuICAgICAgICB2YXIgbWVzc2FnZTIgPSBjb2RlczJbY29kZV07XG4gICAgICAgIHZhciBzdGF0dXMyID0gTnVtYmVyKGNvZGUpO1xuICAgICAgICBtYXBbbWVzc2FnZTIudG9Mb3dlckNhc2UoKV0gPSBzdGF0dXMyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVTdGF0dXNDb2RlTGlzdChjb2RlczIpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2RlczIpLm1hcChmdW5jdGlvbiBtYXBDb2RlKGNvZGUpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcihjb2RlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKG1lc3NhZ2UyKSB7XG4gICAgICB2YXIgbXNnID0gbWVzc2FnZTIudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXR1cy5jb2RlLCBtc2cpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0dXMgbWVzc2FnZTogXCInICsgbWVzc2FnZTIgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0dXMuY29kZVttc2ddO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdGF0dXNNZXNzYWdlKGNvZGUpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXR1cy5tZXNzYWdlLCBjb2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHN0YXR1cyBjb2RlOiBcIiArIGNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXR1cy5tZXNzYWdlW2NvZGVdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGF0dXMoY29kZSkge1xuICAgICAgaWYgKHR5cGVvZiBjb2RlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBnZXRTdGF0dXNNZXNzYWdlKGNvZGUpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb2RlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb2RlIG11c3QgYmUgYSBudW1iZXIgb3Igc3RyaW5nXCIpO1xuICAgICAgfVxuICAgICAgdmFyIG4gPSBwYXJzZUludChjb2RlLCAxMCk7XG4gICAgICBpZiAoIWlzTmFOKG4pKSB7XG4gICAgICAgIHJldHVybiBnZXRTdGF0dXNNZXNzYWdlKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFN0YXR1c0NvZGUoY29kZSk7XG4gICAgfVxuICB9XG59KTtcblxuLy8gc3JjL3NoaW1zL3N0YXR1c2VzLnRzXG52YXIgYWxsU3RhdHVzZXMgPSBfX3RvRVNNKHJlcXVpcmVfc3RhdHVzZXMoKSwgMSk7XG52YXIgc3RhdHVzZXMgPSBhbGxTdGF0dXNlcy5kZWZhdWx0IHx8IGFsbFN0YXR1c2VzO1xudmFyIG1lc3NhZ2UgPSBzdGF0dXNlcy5tZXNzYWdlO1xudmFyIHN0YXR1c2VzX2RlZmF1bHQgPSBzdGF0dXNlcztcbmV4cG9ydCB7XG4gIHN0YXR1c2VzX2RlZmF1bHQgYXMgZGVmYXVsdCxcbiAgbWVzc2FnZVxufTtcbi8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246XG5cbnN0YXR1c2VzL2luZGV4LmpzOlxuICAoKiFcbiAgICogc3RhdHVzZXNcbiAgICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gICAqIENvcHlyaWdodChjKSAyMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gICAqIE1JVCBMaWNlbnNlZFxuICAgKilcbiovXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkZWZhdWx0UGFyc2VPcHRpb25zID0ge1xuICBkZWNvZGVWYWx1ZXM6IHRydWUsXG4gIG1hcDogZmFsc2UsXG4gIHNpbGVudDogZmFsc2UsXG59O1xuXG5mdW5jdGlvbiBpc05vbkVtcHR5U3RyaW5nKHN0cikge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiAmJiAhIXN0ci50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHNldENvb2tpZVZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciBwYXJ0cyA9IHNldENvb2tpZVZhbHVlLnNwbGl0KFwiO1wiKS5maWx0ZXIoaXNOb25FbXB0eVN0cmluZyk7XG5cbiAgdmFyIG5hbWVWYWx1ZVBhaXJTdHIgPSBwYXJ0cy5zaGlmdCgpO1xuICB2YXIgcGFyc2VkID0gcGFyc2VOYW1lVmFsdWVQYWlyKG5hbWVWYWx1ZVBhaXJTdHIpO1xuICB2YXIgbmFtZSA9IHBhcnNlZC5uYW1lO1xuICB2YXIgdmFsdWUgPSBwYXJzZWQudmFsdWU7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnNcbiAgICA/IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRQYXJzZU9wdGlvbnMsIG9wdGlvbnMpXG4gICAgOiBkZWZhdWx0UGFyc2VPcHRpb25zO1xuXG4gIHRyeSB7XG4gICAgdmFsdWUgPSBvcHRpb25zLmRlY29kZVZhbHVlcyA/IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgOiB2YWx1ZTsgLy8gZGVjb2RlIGNvb2tpZSB2YWx1ZVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwic2V0LWNvb2tpZS1wYXJzZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbGUgZGVjb2RpbmcgYSBjb29raWUgd2l0aCB2YWx1ZSAnXCIgK1xuICAgICAgICB2YWx1ZSArXG4gICAgICAgIFwiJy4gU2V0IG9wdGlvbnMuZGVjb2RlVmFsdWVzIHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLlwiLFxuICAgICAgZVxuICAgICk7XG4gIH1cblxuICB2YXIgY29va2llID0ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlLFxuICB9O1xuXG4gIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHtcbiAgICB2YXIgc2lkZXMgPSBwYXJ0LnNwbGl0KFwiPVwiKTtcbiAgICB2YXIga2V5ID0gc2lkZXMuc2hpZnQoKS50cmltTGVmdCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHZhbHVlID0gc2lkZXMuam9pbihcIj1cIik7XG4gICAgaWYgKGtleSA9PT0gXCJleHBpcmVzXCIpIHtcbiAgICAgIGNvb2tpZS5leHBpcmVzID0gbmV3IERhdGUodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIm1heC1hZ2VcIikge1xuICAgICAgY29va2llLm1heEFnZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwic2VjdXJlXCIpIHtcbiAgICAgIGNvb2tpZS5zZWN1cmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImh0dHBvbmx5XCIpIHtcbiAgICAgIGNvb2tpZS5odHRwT25seSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwic2FtZXNpdGVcIikge1xuICAgICAgY29va2llLnNhbWVTaXRlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvb2tpZVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29va2llO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5hbWVWYWx1ZVBhaXIobmFtZVZhbHVlUGFpclN0cikge1xuICAvLyBQYXJzZXMgbmFtZS12YWx1ZS1wYWlyIGFjY29yZGluZyB0byByZmM2MjY1YmlzIGRyYWZ0XG5cbiAgdmFyIG5hbWUgPSBcIlwiO1xuICB2YXIgdmFsdWUgPSBcIlwiO1xuICB2YXIgbmFtZVZhbHVlQXJyID0gbmFtZVZhbHVlUGFpclN0ci5zcGxpdChcIj1cIik7XG4gIGlmIChuYW1lVmFsdWVBcnIubGVuZ3RoID4gMSkge1xuICAgIG5hbWUgPSBuYW1lVmFsdWVBcnIuc2hpZnQoKTtcbiAgICB2YWx1ZSA9IG5hbWVWYWx1ZUFyci5qb2luKFwiPVwiKTsgLy8gZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgPSwgam9pbmVkIGJ5IGEgXCI9XCIgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgcGFydFxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbmFtZVZhbHVlUGFpclN0cjtcbiAgfVxuXG4gIHJldHVybiB7IG5hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZSB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9uc1xuICAgID8gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFBhcnNlT3B0aW9ucywgb3B0aW9ucylcbiAgICA6IGRlZmF1bHRQYXJzZU9wdGlvbnM7XG5cbiAgaWYgKCFpbnB1dCkge1xuICAgIGlmICghb3B0aW9ucy5tYXApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChpbnB1dC5oZWFkZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5oZWFkZXJzLmdldFNldENvb2tpZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBmb3IgZmV0Y2ggcmVzcG9uc2VzIC0gdGhleSBjb21iaW5lIGhlYWRlcnMgb2YgdGhlIHNhbWUgdHlwZSBpbiB0aGUgaGVhZGVycyBhcnJheSxcbiAgICAgIC8vIGJ1dCBnZXRTZXRDb29raWUgcmV0dXJucyBhbiB1bmNvbWJpbmVkIGFycmF5XG4gICAgICBpbnB1dCA9IGlucHV0LmhlYWRlcnMuZ2V0U2V0Q29va2llKCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC5oZWFkZXJzW1wic2V0LWNvb2tpZVwiXSkge1xuICAgICAgLy8gZmFzdC1wYXRoIGZvciBub2RlLmpzICh3aGljaCBhdXRvbWF0aWNhbGx5IG5vcm1hbGl6ZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyLWNhc2VcbiAgICAgIGlucHV0ID0gaW5wdXQuaGVhZGVyc1tcInNldC1jb29raWVcIl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNsb3ctcGF0aCBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gc2VlICMyNVxuICAgICAgdmFyIHNjaCA9XG4gICAgICAgIGlucHV0LmhlYWRlcnNbXG4gICAgICAgICAgT2JqZWN0LmtleXMoaW5wdXQuaGVhZGVycykuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IFwic2V0LWNvb2tpZVwiO1xuICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgICAvLyB3YXJuIGlmIGNhbGxlZCBvbiBhIHJlcXVlc3QtbGlrZSBvYmplY3Qgd2l0aCBhIGNvb2tpZSBoZWFkZXIgcmF0aGVyIHRoYW4gYSBzZXQtY29va2llIGhlYWRlciAtIHNlZSAjMzQsIDM2XG4gICAgICBpZiAoIXNjaCAmJiBpbnB1dC5oZWFkZXJzLmNvb2tpZSAmJiAhb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiV2FybmluZzogc2V0LWNvb2tpZS1wYXJzZXIgYXBwZWFycyB0byBoYXZlIGJlZW4gY2FsbGVkIG9uIGEgcmVxdWVzdCBvYmplY3QuIEl0IGlzIGRlc2lnbmVkIHRvIHBhcnNlIFNldC1Db29raWUgaGVhZGVycyBmcm9tIHJlc3BvbnNlcywgbm90IENvb2tpZSBoZWFkZXJzIGZyb20gcmVxdWVzdHMuIFNldCB0aGUgb3B0aW9uIHtzaWxlbnQ6IHRydWV9IHRvIHN1cHByZXNzIHRoaXMgd2FybmluZy5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5wdXQgPSBzY2g7XG4gICAgfVxuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBpbnB1dCA9IFtpbnB1dF07XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9uc1xuICAgID8gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFBhcnNlT3B0aW9ucywgb3B0aW9ucylcbiAgICA6IGRlZmF1bHRQYXJzZU9wdGlvbnM7XG5cbiAgaWYgKCFvcHRpb25zLm1hcCkge1xuICAgIHJldHVybiBpbnB1dC5maWx0ZXIoaXNOb25FbXB0eVN0cmluZykubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHJldHVybiBwYXJzZVN0cmluZyhzdHIsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBjb29raWVzID0ge307XG4gICAgcmV0dXJuIGlucHV0LmZpbHRlcihpc05vbkVtcHR5U3RyaW5nKS5yZWR1Y2UoZnVuY3Rpb24gKGNvb2tpZXMsIHN0cikge1xuICAgICAgdmFyIGNvb2tpZSA9IHBhcnNlU3RyaW5nKHN0ciwgb3B0aW9ucyk7XG4gICAgICBjb29raWVzW2Nvb2tpZS5uYW1lXSA9IGNvb2tpZTtcbiAgICAgIHJldHVybiBjb29raWVzO1xuICAgIH0sIGNvb2tpZXMpO1xuICB9XG59XG5cbi8qXG4gIFNldC1Db29raWUgaGVhZGVyIGZpZWxkLXZhbHVlcyBhcmUgc29tZXRpbWVzIGNvbW1hIGpvaW5lZCBpbiBvbmUgc3RyaW5nLiBUaGlzIHNwbGl0cyB0aGVtIHdpdGhvdXQgY2hva2luZyBvbiBjb21tYXNcbiAgdGhhdCBhcmUgd2l0aGluIGEgc2luZ2xlIHNldC1jb29raWUgZmllbGQtdmFsdWUsIHN1Y2ggYXMgaW4gdGhlIEV4cGlyZXMgcG9ydGlvbi5cblxuICBUaGlzIGlzIHVuY29tbW9uLCBidXQgZXhwbGljaXRseSBhbGxvd2VkIC0gc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNjE2I3NlY3Rpb24tNC4yXG4gIE5vZGUuanMgZG9lcyB0aGlzIGZvciBldmVyeSBoZWFkZXIgKmV4Y2VwdCogc2V0LWNvb2tpZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9kNWUzNjNiNzdlYmFmMWNhZjY3Y2Q3NTI4MjI0YjY1MWM4NjgxNWMxL2xpYi9faHR0cF9pbmNvbWluZy5qcyNMMTI4XG4gIFJlYWN0IE5hdGl2ZSdzIGZldGNoIGRvZXMgdGhpcyBmb3IgKmV2ZXJ5KiBoZWFkZXIsIGluY2x1ZGluZyBzZXQtY29va2llLlxuXG4gIEJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2oyb2JqYy9jb21taXQvMTY4MjBmZGJjOGY3NmNhMGMzMzQ3MjgxMGNlMGNiMDNkMjBlZmUyNVxuICBDcmVkaXRzIHRvOiBodHRwczovL2dpdGh1Yi5jb20vdG9tYmFsbCBmb3Igb3JpZ2luYWwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJ1c2FydCBmb3IgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvblxuKi9cbmZ1bmN0aW9uIHNwbGl0Q29va2llc1N0cmluZyhjb29raWVzU3RyaW5nKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvb2tpZXNTdHJpbmcpKSB7XG4gICAgcmV0dXJuIGNvb2tpZXNTdHJpbmc7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb29raWVzU3RyaW5nICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGNvb2tpZXNTdHJpbmdzID0gW107XG4gIHZhciBwb3MgPSAwO1xuICB2YXIgc3RhcnQ7XG4gIHZhciBjaDtcbiAgdmFyIGxhc3RDb21tYTtcbiAgdmFyIG5leHRTdGFydDtcbiAgdmFyIGNvb2tpZXNTZXBhcmF0b3JGb3VuZDtcblxuICBmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpIHtcbiAgICB3aGlsZSAocG9zIDwgY29va2llc1N0cmluZy5sZW5ndGggJiYgL1xccy8udGVzdChjb29raWVzU3RyaW5nLmNoYXJBdChwb3MpKSkge1xuICAgICAgcG9zICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBwb3MgPCBjb29raWVzU3RyaW5nLmxlbmd0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdFNwZWNpYWxDaGFyKCkge1xuICAgIGNoID0gY29va2llc1N0cmluZy5jaGFyQXQocG9zKTtcblxuICAgIHJldHVybiBjaCAhPT0gXCI9XCIgJiYgY2ggIT09IFwiO1wiICYmIGNoICE9PSBcIixcIjtcbiAgfVxuXG4gIHdoaWxlIChwb3MgPCBjb29raWVzU3RyaW5nLmxlbmd0aCkge1xuICAgIHN0YXJ0ID0gcG9zO1xuICAgIGNvb2tpZXNTZXBhcmF0b3JGb3VuZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHNraXBXaGl0ZXNwYWNlKCkpIHtcbiAgICAgIGNoID0gY29va2llc1N0cmluZy5jaGFyQXQocG9zKTtcbiAgICAgIGlmIChjaCA9PT0gXCIsXCIpIHtcbiAgICAgICAgLy8gJywnIGlzIGEgY29va2llIHNlcGFyYXRvciBpZiB3ZSBoYXZlIGxhdGVyIGZpcnN0ICc9Jywgbm90ICc7JyBvciAnLCdcbiAgICAgICAgbGFzdENvbW1hID0gcG9zO1xuICAgICAgICBwb3MgKz0gMTtcblxuICAgICAgICBza2lwV2hpdGVzcGFjZSgpO1xuICAgICAgICBuZXh0U3RhcnQgPSBwb3M7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvb2tpZXNTdHJpbmcubGVuZ3RoICYmIG5vdFNwZWNpYWxDaGFyKCkpIHtcbiAgICAgICAgICBwb3MgKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGN1cnJlbnRseSBzcGVjaWFsIGNoYXJhY3RlclxuICAgICAgICBpZiAocG9zIDwgY29va2llc1N0cmluZy5sZW5ndGggJiYgY29va2llc1N0cmluZy5jaGFyQXQocG9zKSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAvLyB3ZSBmb3VuZCBjb29raWVzIHNlcGFyYXRvclxuICAgICAgICAgIGNvb2tpZXNTZXBhcmF0b3JGb3VuZCA9IHRydWU7XG4gICAgICAgICAgLy8gcG9zIGlzIGluc2lkZSB0aGUgbmV4dCBjb29raWUsIHNvIGJhY2sgdXAgYW5kIHJldHVybiBpdC5cbiAgICAgICAgICBwb3MgPSBuZXh0U3RhcnQ7XG4gICAgICAgICAgY29va2llc1N0cmluZ3MucHVzaChjb29raWVzU3RyaW5nLnN1YnN0cmluZyhzdGFydCwgbGFzdENvbW1hKSk7XG4gICAgICAgICAgc3RhcnQgPSBwb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaW4gcGFyYW0gJywnIG9yIHBhcmFtIHNlcGFyYXRvciAnOycsXG4gICAgICAgICAgLy8gd2UgY29udGludWUgZnJvbSB0aGF0IGNvbW1hXG4gICAgICAgICAgcG9zID0gbGFzdENvbW1hICsgMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zICs9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFjb29raWVzU2VwYXJhdG9yRm91bmQgfHwgcG9zID49IGNvb2tpZXNTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBjb29raWVzU3RyaW5ncy5wdXNoKGNvb2tpZXNTdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBjb29raWVzU3RyaW5nLmxlbmd0aCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb29raWVzU3RyaW5ncztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5tb2R1bGUuZXhwb3J0cy5wYXJzZVN0cmluZyA9IHBhcnNlU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMuc3BsaXRDb29raWVzU3RyaW5nID0gc3BsaXRDb29raWVzU3RyaW5nO1xuIiwgImltcG9ydCB7IHNwbGl0Q29va2llc1N0cmluZyB9IGZyb20gJ3NldC1jb29raWUtcGFyc2VyJ1xuaW1wb3J0IHsgSGVhZGVyc0xpc3QsIEhlYWRlcnNPYmplY3QgfSBmcm9tICcuL2dsb3NzYXJ5J1xuaW1wb3J0IHsgbm9ybWFsaXplSGVhZGVyTmFtZSB9IGZyb20gJy4vdXRpbHMvbm9ybWFsaXplSGVhZGVyTmFtZSdcbmltcG9ydCB7IG5vcm1hbGl6ZUhlYWRlclZhbHVlIH0gZnJvbSAnLi91dGlscy9ub3JtYWxpemVIZWFkZXJWYWx1ZSdcbmltcG9ydCB7IGlzVmFsaWRIZWFkZXJOYW1lIH0gZnJvbSAnLi91dGlscy9pc1ZhbGlkSGVhZGVyTmFtZSdcbmltcG9ydCB7IGlzVmFsaWRIZWFkZXJWYWx1ZSB9IGZyb20gJy4vdXRpbHMvaXNWYWxpZEhlYWRlclZhbHVlJ1xuXG5leHBvcnQgY29uc3QgTk9STUFMSVpFRF9IRUFERVJTOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdub3JtYWxpemVkSGVhZGVycycpXG5cbmV4cG9ydCBjb25zdCBSQVdfSEVBREVSX05BTUVTOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdyYXdIZWFkZXJOYW1lcycpXG5cbmNvbnN0IEhFQURFUl9WQUxVRV9ERUxJTUlURVIgPSAnLCAnIGFzIGNvbnN0XG5cbmV4cG9ydCBjbGFzcyBIZWFkZXJzIHtcbiAgLy8gTm9ybWFsaXplZCBoZWFkZXIge1wibmFtZVwiOlwiYSwgYlwifSBzdG9yYWdlLlxuICBwcml2YXRlIFtOT1JNQUxJWkVEX0hFQURFUlNdOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAvLyBLZWVwcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSByYXcgaGVhZGVyIG5hbWVcbiAgLy8gYW5kIHRoZSBub3JtYWxpemVkIGhlYWRlciBuYW1lIHRvIGVhc2UgdGhlIGxvb2t1cC5cbiAgcHJpdmF0ZSBbUkFXX0hFQURFUl9OQU1FU106IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKClcblxuICBjb25zdHJ1Y3Rvcihpbml0PzogSGVhZGVyc0luaXQgfCBIZWFkZXJzT2JqZWN0IHwgSGVhZGVyc0xpc3QpIHtcbiAgICAvKipcbiAgICAgKiBAbm90ZSBDYW5ub3QgbmVjZXNzYXJpbHkgY2hlY2sgaWYgdGhlIGBpbml0YCBpcyBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgKiBgSGVhZGVyc2AgYmVjYXVzZSB0aGF0IGNsYXNzIG1heSBub3QgYmUgZGVmaW5lZCBpbiBOb2RlIG9yIGpzZG9tLlxuICAgICAqL1xuICAgIGlmIChcbiAgICAgIFsnSGVhZGVycycsICdIZWFkZXJzUG9seWZpbGwnXS5pbmNsdWRlcyhpbml0Py5jb25zdHJ1Y3Rvci5uYW1lKSB8fFxuICAgICAgaW5pdCBpbnN0YW5jZW9mIEhlYWRlcnMgfHxcbiAgICAgICh0eXBlb2YgZ2xvYmFsVGhpcy5IZWFkZXJzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBpbml0IGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5IZWFkZXJzKVxuICAgICkge1xuICAgICAgY29uc3QgaW5pdGlhbEhlYWRlcnMgPSBpbml0IGFzIEhlYWRlcnNcbiAgICAgIGluaXRpYWxIZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfSwgdGhpcylcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5pdCkpIHtcbiAgICAgIGluaXQuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICB0aGlzLmFwcGVuZChcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbihIRUFERVJfVkFMVUVfREVMSU1JVEVSKSA6IHZhbHVlXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChpbml0KSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbml0KS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaW5pdFtuYW1lXVxuICAgICAgICB0aGlzLmFwcGVuZChcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbihIRUFERVJfVkFMVUVfREVMSU1JVEVSKSA6IHZhbHVlXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnSGVhZGVycyc7XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIGZvciAoY29uc3QgW25hbWVdIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBuYW1lXG4gICAgfVxuICB9XG5cbiAgKnZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT4ge1xuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci1saXN0LXNvcnQtYW5kLWNvbWJpbmVcbiAgICBsZXQgc29ydGVkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXNbTk9STUFMSVpFRF9IRUFERVJTXSkuc29ydCgoYSwgYikgPT5cbiAgICAgIGEubG9jYWxlQ29tcGFyZShiKVxuICAgIClcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygc29ydGVkS2V5cykge1xuICAgICAgaWYgKG5hbWUgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuZ2V0U2V0Q29va2llKCkpIHtcbiAgICAgICAgICB5aWVsZCBbbmFtZSwgdmFsdWVdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlpZWxkIFtuYW1lLCB0aGlzLmdldChuYW1lKV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gc3RhdGluZyB3aGV0aGVyIGEgYEhlYWRlcnNgIG9iamVjdCBjb250YWlucyBhIGNlcnRhaW4gaGVhZGVyLlxuICAgKi9cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNWYWxpZEhlYWRlck5hbWUobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgaGVhZGVyIG5hbWUgXCIke25hbWV9XCJgKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzW05PUk1BTElaRURfSEVBREVSU10uaGFzT3duUHJvcGVydHkobm9ybWFsaXplSGVhZGVyTmFtZShuYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYEJ5dGVTdHJpbmdgIHNlcXVlbmNlIG9mIGFsbCB0aGUgdmFsdWVzIG9mIGEgaGVhZGVyIHdpdGggYSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghaXNWYWxpZEhlYWRlck5hbWUobmFtZSkpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcihgSW52YWxpZCBoZWFkZXIgbmFtZSBcIiR7bmFtZX1cImApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbTk9STUFMSVpFRF9IRUFERVJTXVtub3JtYWxpemVIZWFkZXJOYW1lKG5hbWUpXSA/PyBudWxsXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG5ldyB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgaGVhZGVyIGluc2lkZSBhIGBIZWFkZXJzYCBvYmplY3QsIG9yIGFkZHMgdGhlIGhlYWRlciBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKi9cbiAgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEhlYWRlck5hbWUobmFtZSkgfHwgIWlzVmFsaWRIZWFkZXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplSGVhZGVyTmFtZShuYW1lKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZUhlYWRlclZhbHVlKHZhbHVlKVxuXG4gICAgdGhpc1tOT1JNQUxJWkVEX0hFQURFUlNdW25vcm1hbGl6ZWROYW1lXSA9XG4gICAgICBub3JtYWxpemVIZWFkZXJWYWx1ZShub3JtYWxpemVkVmFsdWUpXG4gICAgdGhpc1tSQVdfSEVBREVSX05BTUVTXS5zZXQobm9ybWFsaXplZE5hbWUsIG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIG5ldyB2YWx1ZSBvbnRvIGFuIGV4aXN0aW5nIGhlYWRlciBpbnNpZGUgYSBgSGVhZGVyc2Agb2JqZWN0LCBvciBhZGRzIHRoZSBoZWFkZXIgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICovXG4gIGFwcGVuZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpIHx8ICFpc1ZhbGlkSGVhZGVyVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUhlYWRlck5hbWUobmFtZSlcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVIZWFkZXJWYWx1ZSh2YWx1ZSlcblxuICAgIGxldCByZXNvbHZlZFZhbHVlID0gdGhpcy5oYXMobm9ybWFsaXplZE5hbWUpXG4gICAgICA/IGAke3RoaXMuZ2V0KG5vcm1hbGl6ZWROYW1lKX0sICR7bm9ybWFsaXplZFZhbHVlfWBcbiAgICAgIDogbm9ybWFsaXplZFZhbHVlXG5cbiAgICB0aGlzLnNldChuYW1lLCByZXNvbHZlZFZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBoZWFkZXIgZnJvbSB0aGUgYEhlYWRlcnNgIG9iamVjdC5cbiAgICovXG4gIGRlbGV0ZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUhlYWRlck5hbWUobmFtZSlcbiAgICBkZWxldGUgdGhpc1tOT1JNQUxJWkVEX0hFQURFUlNdW25vcm1hbGl6ZWROYW1lXVxuICAgIHRoaXNbUkFXX0hFQURFUl9OQU1FU10uZGVsZXRlKG5vcm1hbGl6ZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlcyB0aGUgYEhlYWRlcnNgIG9iamVjdCxcbiAgICogY2FsbGluZyB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGVhY2ggaGVhZGVyLlxuICAgKi9cbiAgZm9yRWFjaDxUaGlzQXJnID0gdGhpcz4oXG4gICAgY2FsbGJhY2s6IChcbiAgICAgIHRoaXM6IFRoaXNBcmcsXG4gICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgcGFyZW50OiB0aGlzXG4gICAgKSA9PiB2b2lkLFxuICAgIHRoaXNBcmc/OiBUaGlzQXJnXG4gICkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB0aGlzLmVudHJpZXMoKSkge1xuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2YWx1ZSwgbmFtZSwgdGhpcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXNcbiAgICogb2YgYWxsIFNldC1Db29raWUgaGVhZGVycyBhc3NvY2lhdGVkXG4gICAqIHdpdGggYSByZXNwb25zZVxuICAgKi9cbiAgZ2V0U2V0Q29va2llKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZXRDb29raWVIZWFkZXIgPSB0aGlzLmdldCgnc2V0LWNvb2tpZScpXG5cbiAgICBpZiAoc2V0Q29va2llSGVhZGVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBpZiAoc2V0Q29va2llSGVhZGVyID09PSAnJykge1xuICAgICAgcmV0dXJuIFsnJ11cbiAgICB9XG5cbiAgICByZXR1cm4gc3BsaXRDb29raWVzU3RyaW5nKHNldENvb2tpZUhlYWRlcilcbiAgfVxufVxuIiwgImNvbnN0IEhFQURFUlNfSU5WQUxJRF9DSEFSQUNURVJTID0gL1teYS16MC05XFwtIyQlJicqKy5eX2B8fl0vaVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoSEVBREVSU19JTlZBTElEX0NIQVJBQ1RFUlMudGVzdChuYW1lKSB8fCBuYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZScpXG4gIH1cblxuICByZXR1cm4gbmFtZS50cmltKCkudG9Mb3dlckNhc2UoKVxufVxuIiwgImNvbnN0IGNoYXJDb2Rlc1RvUmVtb3ZlID0gW1xuICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MGEpLFxuICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MGQpLFxuICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDkpLFxuICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MjApLFxuXVxuXG5jb25zdCBIRUFERVJfVkFMVUVfUkVNT1ZFX1JFR0VYUCA9IG5ldyBSZWdFeHAoXG4gIGAoXlske2NoYXJDb2Rlc1RvUmVtb3ZlLmpvaW4oJycpfV18JFske2NoYXJDb2Rlc1RvUmVtb3ZlLmpvaW4oJycpfV0pYCxcbiAgJ2cnXG4pXG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBnaXZlbiBoZWFkZXIgdmFsdWUuXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci12YWx1ZS1ub3JtYWxpemVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBuZXh0VmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEhFQURFUl9WQUxVRV9SRU1PVkVfUkVHRVhQLCAnJylcbiAgcmV0dXJuIG5leHRWYWx1ZVxufVxuIiwgIi8qKlxuICogVmFsaWRhdGUgdGhlIGdpdmVuIGhlYWRlciBuYW1lLlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLW5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRIZWFkZXJOYW1lKHZhbHVlOiB1bmtub3duKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gdmFsdWUuY2hhckNvZGVBdChpKVxuXG4gICAgaWYgKGNoYXJhY3RlciA+IDB4N2YgfHwgIWlzVG9rZW4oY2hhcmFjdGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gaXNUb2tlbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAhW1xuICAgIDB4N2YsXG4gICAgMHgyMCxcbiAgICAnKCcsXG4gICAgJyknLFxuICAgICc8JyxcbiAgICAnPicsXG4gICAgJ0AnLFxuICAgICcsJyxcbiAgICAnOycsXG4gICAgJzonLFxuICAgICdcXFxcJyxcbiAgICAnXCInLFxuICAgICcvJyxcbiAgICAnWycsXG4gICAgJ10nLFxuICAgICc/JyxcbiAgICAnPScsXG4gICAgJ3snLFxuICAgICd9JyxcbiAgXS5pbmNsdWRlcyh2YWx1ZSlcbn1cbiIsICIvKipcbiAqIFZhbGlkYXRlIHRoZSBnaXZlbiBoZWFkZXIgdmFsdWUuXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNoZWFkZXItdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRIZWFkZXJWYWx1ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHZhbHVlLnRyaW0oKSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpXG5cbiAgICBpZiAoXG4gICAgICAvLyBOVUwuXG4gICAgICBjaGFyYWN0ZXIgPT09IDB4MDAgfHxcbiAgICAgIC8vIEhUVFAgbmV3bGluZSBieXRlcy5cbiAgICAgIGNoYXJhY3RlciA9PT0gMHgwYSB8fFxuICAgICAgY2hhcmFjdGVyID09PSAweDBkXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IFJBV19IRUFERVJfTkFNRVMgfSBmcm9tICcuL0hlYWRlcnMnXG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2JqZWN0IG9mIGFsbCByYXcgaGVhZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhd0hlYWRlcnMoaGVhZGVyczogSGVhZGVycykge1xuICBjb25zdCByYXdIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICByYXdIZWFkZXJzW2hlYWRlcnNbUkFXX0hFQURFUl9OQU1FU10uZ2V0KG5hbWUpXSA9IHZhbHVlXG4gIH1cblxuICByZXR1cm4gcmF3SGVhZGVyc1xufVxuIiwgImltcG9ydCB7IEhlYWRlcnNMaXN0IH0gZnJvbSAnLi4vZ2xvc3NhcnknXG5cbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9MaXN0KGhlYWRlcnM6IEhlYWRlcnMpOiBIZWFkZXJzTGlzdCB7XG4gIGNvbnN0IGhlYWRlcnNMaXN0OiBIZWFkZXJzTGlzdCA9IFtdXG5cbiAgaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB2YWx1ZS5pbmNsdWRlcygnLCcpXG4gICAgICA/IHZhbHVlLnNwbGl0KCcsJykubWFwKCh2YWx1ZSkgPT4gdmFsdWUudHJpbSgpKVxuICAgICAgOiB2YWx1ZVxuXG4gICAgaGVhZGVyc0xpc3QucHVzaChbbmFtZSwgcmVzb2x2ZWRWYWx1ZV0pXG4gIH0pXG5cbiAgcmV0dXJuIGhlYWRlcnNMaXN0XG59XG4iLCAiaW1wb3J0IHsgaGVhZGVyc1RvTGlzdCB9IGZyb20gJy4vaGVhZGVyc1RvTGlzdCdcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGdpdmVuIGBIZWFkZXJzYCBpbnN0YW5jZSB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZGVyc1RvU3RyaW5nKGhlYWRlcnM6IEhlYWRlcnMpOiBzdHJpbmcge1xuICBjb25zdCBsaXN0ID0gaGVhZGVyc1RvTGlzdChoZWFkZXJzKVxuICBjb25zdCBsaW5lcyA9IGxpc3QubWFwKChbbmFtZSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQodmFsdWUpXG4gICAgcmV0dXJuIGAke25hbWV9OiAke3ZhbHVlcy5qb2luKCcsICcpfWBcbiAgfSlcblxuICByZXR1cm4gbGluZXMuam9pbignXFxyXFxuJylcbn1cbiIsICJpbXBvcnQgeyBIZWFkZXJzT2JqZWN0IH0gZnJvbSAnLi4vZ2xvc3NhcnknXG5cbi8vIExpc3Qgb2YgaGVhZGVycyB0aGF0IGNhbm5vdCBoYXZlIG11bHRpcGxlIHZhbHVlcyxcbi8vIHdoaWxlIHBvdGVudGlhbGx5IGhhdmluZyBhIGNvbW1hIGluIHRoZWlyIHNpbmdsZSB2YWx1ZS5cbmNvbnN0IHNpbmdsZVZhbHVlSGVhZGVycyA9IFsndXNlci1hZ2VudCddXG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiBgSGVhZGVyc2AgaW5zdGFuY2UgaW50byBhIHBsYWluIG9iamVjdC5cbiAqIFJlc3BlY3RzIGhlYWRlcnMgd2l0aCBtdWx0aXBsZSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9PYmplY3QoaGVhZGVyczogSGVhZGVycyk6IEhlYWRlcnNPYmplY3Qge1xuICBjb25zdCBoZWFkZXJzT2JqZWN0OiBIZWFkZXJzT2JqZWN0ID0ge31cblxuICBoZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgY29uc3QgaXNNdWx0aVZhbHVlID1cbiAgICAgICFzaW5nbGVWYWx1ZUhlYWRlcnMuaW5jbHVkZXMobmFtZS50b0xvd2VyQ2FzZSgpKSAmJiB2YWx1ZS5pbmNsdWRlcygnLCcpXG4gICAgaGVhZGVyc09iamVjdFtuYW1lXSA9IGlzTXVsdGlWYWx1ZVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICA6IHZhbHVlXG4gIH0pXG5cbiAgcmV0dXJuIGhlYWRlcnNPYmplY3Rcbn1cbiIsICJpbXBvcnQgeyBIZWFkZXJzIH0gZnJvbSAnLi4vSGVhZGVycydcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBoZWFkZXJzIChpLmUuIGZyb20gWE1MSHR0cFJlcXVlc3QpXG4gKiB0byBhIG5ldyBgSGVhZGVyc2AgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0hlYWRlcnMoc3RyOiBzdHJpbmcpOiBIZWFkZXJzIHtcbiAgY29uc3QgbGluZXMgPSBzdHIudHJpbSgpLnNwbGl0KC9bXFxyXFxuXSsvKVxuXG4gIHJldHVybiBsaW5lcy5yZWR1Y2UoKGhlYWRlcnMsIGxpbmUpID0+IHtcbiAgICBpZiAobGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm4gaGVhZGVyc1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gbGluZS5zcGxpdCgnOiAnKVxuICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5zaGlmdCgpXG4gICAgY29uc3QgdmFsdWUgPSBwYXJ0cy5qb2luKCc6ICcpXG4gICAgaGVhZGVycy5hcHBlbmQobmFtZSwgdmFsdWUpXG5cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9LCBuZXcgSGVhZGVycygpKVxufVxuIiwgImltcG9ydCB7IEhlYWRlcnMgfSBmcm9tICcuLi9IZWFkZXJzJ1xuaW1wb3J0IHsgSGVhZGVyc0xpc3QgfSBmcm9tICcuLi9nbG9zc2FyeSdcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUb0hlYWRlcnMobGlzdDogSGVhZGVyc0xpc3QpOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICBsaXN0LmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCh2YWx1ZSlcblxuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaGVhZGVycy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gaGVhZGVyc1xufVxuIiwgImltcG9ydCB7IEhlYWRlcnNPYmplY3QgfSBmcm9tICcuLi9nbG9zc2FyeSdcblxuLyoqXG4gKiBSZWR1Y2VzIGdpdmVuIGhlYWRlcnMgb2JqZWN0IGluc3RuYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlSGVhZGVyc09iamVjdDxSPihcbiAgaGVhZGVyczogSGVhZGVyc09iamVjdCxcbiAgcmVkdWNlcjogKGhlYWRlcnM6IFIsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiBSLFxuICBpbml0aWFsU3RhdGU6IFJcbik6IFIge1xuICByZXR1cm4gT2JqZWN0LmtleXMoaGVhZGVycykucmVkdWNlPFI+KChuZXh0SGVhZGVycywgbmFtZSkgPT4ge1xuICAgIHJldHVybiByZWR1Y2VyKG5leHRIZWFkZXJzLCBuYW1lLCBoZWFkZXJzW25hbWVdKVxuICB9LCBpbml0aWFsU3RhdGUpXG59XG4iLCAiaW1wb3J0IHsgSGVhZGVycyB9IGZyb20gJy4uL0hlYWRlcnMnXG5pbXBvcnQgeyByZWR1Y2VIZWFkZXJzT2JqZWN0IH0gZnJvbSAnLi9yZWR1Y2VIZWFkZXJzT2JqZWN0J1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gaGVhZGVycyBvYmplY3QgdG8gYSBuZXcgYEhlYWRlcnNgIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VG9IZWFkZXJzKFxuICBoZWFkZXJzT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD5cbik6IEhlYWRlcnMge1xuICByZXR1cm4gcmVkdWNlSGVhZGVyc09iamVjdChcbiAgICBoZWFkZXJzT2JqZWN0LFxuICAgIChoZWFkZXJzLCBuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQodmFsdWUpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaGVhZGVycy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gaGVhZGVyc1xuICAgIH0sXG4gICAgbmV3IEhlYWRlcnMoKVxuICApXG59XG4iLCAiaW1wb3J0IHsgSGVhZGVyc0xpc3QsIEZsYXRIZWFkZXJzTGlzdCB9IGZyb20gJy4uL2dsb3NzYXJ5J1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkhlYWRlcnNMaXN0KGxpc3Q6IEhlYWRlcnNMaXN0KTogRmxhdEhlYWRlcnNMaXN0IHtcbiAgcmV0dXJuIGxpc3QubWFwKChbbmFtZSwgdmFsdWVzXSkgPT4ge1xuICAgIHJldHVybiBbbmFtZSwgKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQodmFsdWVzKS5qb2luKCcsICcpXVxuICB9KVxufVxuIiwgImltcG9ydCB7IEhlYWRlcnNPYmplY3QsIEZsYXRIZWFkZXJzT2JqZWN0IH0gZnJvbSAnLi4vZ2xvc3NhcnknXG5pbXBvcnQgeyByZWR1Y2VIZWFkZXJzT2JqZWN0IH0gZnJvbSAnLi9yZWR1Y2VIZWFkZXJzT2JqZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkhlYWRlcnNPYmplY3QoXG4gIGhlYWRlcnNPYmplY3Q6IEhlYWRlcnNPYmplY3Rcbik6IEZsYXRIZWFkZXJzT2JqZWN0IHtcbiAgcmV0dXJuIHJlZHVjZUhlYWRlcnNPYmplY3Q8RmxhdEhlYWRlcnNPYmplY3Q+KFxuICAgIGhlYWRlcnNPYmplY3QsXG4gICAgKGhlYWRlcnMsIG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBoZWFkZXJzW25hbWVdID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQodmFsdWUpLmpvaW4oJywgJylcbiAgICAgIHJldHVybiBoZWFkZXJzXG4gICAgfSxcbiAgICB7fVxuICApXG59XG4iLCAiaW1wb3J0IHN0YXR1c2VzIGZyb20gJy4uLy4uLy4uL3NoaW1zL3N0YXR1c2VzJ1xuaW1wb3J0IHsgSGVhZGVycyBhcyBIZWFkZXJzUG9seWZpbGwgfSBmcm9tICdoZWFkZXJzLXBvbHlmaWxsJ1xuaW1wb3J0IHR5cGUgeyBIdHRwUmVzcG9uc2VJbml0IH0gZnJvbSAnLi4vLi4vSHR0cFJlc3BvbnNlJ1xuXG5jb25zdCB7IG1lc3NhZ2UgfSA9IHN0YXR1c2VzXG5cbmV4cG9ydCBjb25zdCBrU2V0Q29va2llID0gU3ltYm9sKCdrU2V0Q29va2llJylcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVzcG9uc2VEZWNvcmF0ZWRJbml0IGV4dGVuZHMgSHR0cFJlc3BvbnNlSW5pdCB7XG4gIHN0YXR1czogbnVtYmVyXG4gIHN0YXR1c1RleHQ6IHN0cmluZ1xuICBoZWFkZXJzOiBIZWFkZXJzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZXNwb25zZUluaXQoXG4gIGluaXQ6IEh0dHBSZXNwb25zZUluaXQgPSB7fSxcbik6IEh0dHBSZXNwb25zZURlY29yYXRlZEluaXQge1xuICBjb25zdCBzdGF0dXMgPSBpbml0Py5zdGF0dXMgfHwgMjAwXG4gIGNvbnN0IHN0YXR1c1RleHQgPSBpbml0Py5zdGF0dXNUZXh0IHx8IG1lc3NhZ2Vbc3RhdHVzXSB8fCAnJ1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdD8uaGVhZGVycylcblxuICByZXR1cm4ge1xuICAgIC4uLmluaXQsXG4gICAgaGVhZGVycyxcbiAgICBzdGF0dXMsXG4gICAgc3RhdHVzVGV4dCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVSZXNwb25zZShcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICBpbml0OiBIdHRwUmVzcG9uc2VEZWNvcmF0ZWRJbml0LFxuKTogUmVzcG9uc2Uge1xuICAvLyBBbGxvdyB0byBtb2NrIHRoZSByZXNwb25zZSB0eXBlLlxuICBpZiAoaW5pdC50eXBlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHtcbiAgICAgIHZhbHVlOiBpbml0LnR5cGUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCByZXNwb25zZUNvb2tpZXMgPSBpbml0LmhlYWRlcnMuZ2V0KCdzZXQtY29va2llJylcblxuICBpZiAocmVzcG9uc2VDb29raWVzKSB7XG4gICAgLy8gUmVjb3JkIHRoZSByYXcgXCJTZXQtQ29va2llXCIgcmVzcG9uc2UgaGVhZGVyIHByb3ZpZGVkXG4gICAgLy8gaW4gdGhlIEhlYWRlcnNJbml0LiBUaGlzIGlzIGxhdGVyIHVzZWQgdG8gc3RvcmUgdGhlc2UgY29va2llc1xuICAgIC8vIGluIGNvb2tpZSBqYXIgYW5kIHJldHVybiB0aGUgcmlnaHQgY29va2llcyBpbiB0aGUgXCJjb29raWVzXCJcbiAgICAvLyByZXNwb25zZSByZXNvbHZlciBhcmd1bWVudC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsIGtTZXRDb29raWUsIHtcbiAgICAgIHZhbHVlOiByZXNwb25zZUNvb2tpZXMsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KVxuXG4gICAgLy8gQ29va2llIGZvcndhcmRpbmcgaXMgb25seSByZWxldmFudCBpbiB0aGUgYnJvd3Nlci5cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gV3JpdGUgdGhlIG1vY2tlZCByZXNwb25zZSBjb29raWVzIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgIC8vIFVzZSBgaGVhZGVycy1wb2x5ZmlsbGAgdG8gZ2V0IHRoZSBTZXQtQ29va2llIGhlYWRlciB2YWx1ZSBjb3JyZWN0bHkuXG4gICAgICAvLyBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHVudGlsIFR5cGVTY3JpcHQgNS4yXG4gICAgICAvLyBhbmQgTm9kZS5qcyB2MjAgYmVjb21lIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uXG4gICAgICAvLyBhbmQgZ2V0U2V0Q29va2llIGluIEhlYWRlcnMgY2FuIGJlIHVzZWQgZGlyZWN0bHkuXG4gICAgICBjb25zdCByZXNwb25zZUNvb2tpZVBhaXJzID0gSGVhZGVyc1BvbHlmaWxsLnByb3RvdHlwZS5nZXRTZXRDb29raWUuY2FsbChcbiAgICAgICAgaW5pdC5oZWFkZXJzLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IGNvb2tpZVN0cmluZyBvZiByZXNwb25zZUNvb2tpZVBhaXJzKSB7XG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcGFyc2UgdGhlIGNvb2tpZSBoZWFkZXJzIGJlY2F1c2UgaXQncyBkZWZpbmVkXG4gICAgICAgIC8vIGFzIHRoZSB2YWxpZCBjb29raWUgc3RyaW5nIHRvIGJlZ2luIHdpdGguXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZVN0cmluZ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNwb25zZVxufVxuIiwgImltcG9ydCB7IGNvb2tpZVN0b3JlIH0gZnJvbSAnLi4vY29va2llU3RvcmUnXG5pbXBvcnQgeyBrU2V0Q29va2llIH0gZnJvbSAnLi4vSHR0cFJlc3BvbnNlL2RlY29yYXRvcnMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9yZVJlc3BvbnNlQ29va2llcyhcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEdyYWIgdGhlIHJhdyBcIlNldC1Db29raWVcIiByZXNwb25zZSBoZWFkZXIgcHJvdmlkZWRcbiAgLy8gaW4gdGhlIEhlYWRlcnNJbml0IGZvciB0aGlzIG1vY2tlZCByZXNwb25zZS5cbiAgY29uc3QgcmVzcG9uc2VDb29raWVzID0gUmVmbGVjdC5nZXQocmVzcG9uc2UsIGtTZXRDb29raWUpIGFzXG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZFxuXG4gIGlmIChyZXNwb25zZUNvb2tpZXMpIHtcbiAgICBhd2FpdCBjb29raWVTdG9yZS5zZXRDb29raWUocmVzcG9uc2VDb29raWVzLCByZXF1ZXN0LnVybClcbiAgfVxufVxuIiwgImltcG9ydCB7IHVudGlsIH0gZnJvbSAndW50aWwtYXN5bmMnXG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSAnc3RyaWN0LWV2ZW50LWVtaXR0ZXInXG5pbXBvcnQgeyBMaWZlQ3ljbGVFdmVudHNNYXAsIFNoYXJlZE9wdGlvbnMgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zJ1xuaW1wb3J0IHsgUmVxdWlyZWREZWVwIH0gZnJvbSAnLi4vdHlwZVV0aWxzJ1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1JlcXVlc3RIYW5kbGVyJ1xuaW1wb3J0IHsgSGFuZGxlcnNFeGVjdXRpb25SZXN1bHQsIGV4ZWN1dGVIYW5kbGVycyB9IGZyb20gJy4vZXhlY3V0ZUhhbmRsZXJzJ1xuaW1wb3J0IHsgb25VbmhhbmRsZWRSZXF1ZXN0IH0gZnJvbSAnLi9yZXF1ZXN0L29uVW5oYW5kbGVkUmVxdWVzdCdcbmltcG9ydCB7IHN0b3JlUmVzcG9uc2VDb29raWVzIH0gZnJvbSAnLi9yZXF1ZXN0L3N0b3JlUmVzcG9uc2VDb29raWVzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZVJlcXVlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIGByZXNvbHV0aW9uQ29udGV4dGAgaXMgbm90IHBhcnQgb2YgdGhlIGdlbmVyYWwgcHVibGljIGFwaVxuICAgKiBidXQgaXMgZXhwb3NlZCB0byBhaWQgaW4gY3JlYXRpbmcgZXh0ZW5zaW9ucyBsaWtlXG4gICAqIGBAbXN3anMvaHR0cC1taWRkbGV3YXJlYC5cbiAgICovXG4gIHJlc29sdXRpb25Db250ZXh0Pzoge1xuICAgIC8qKlxuICAgICAqIEEgYmFzZSB1cmwgdG8gdXNlIHdoZW4gcmVzb2x2aW5nIHJlbGF0aXZlIHVybHMuXG4gICAgICogQG5vdGUgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBieSB0aGUgYEBtc3dqcy9odHRwLW1pZGRsZXdhcmVgXG4gICAgICogdG8gcmVzb2x2ZSByZWxhdGl2ZSB1cmxzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBydW5uaW5nIHNlcnZlclxuICAgICAqL1xuICAgIGJhc2VVcmw/OiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW5ldmVyIGEgcmVxdWVzdCBpcyBwZXJmb3JtZWQgYXMtaXMuXG4gICAqL1xuICBvblBhc3N0aHJvdWdoUmVzcG9uc2U/KHJlcXVlc3Q6IFJlcXVlc3QpOiB2b2lkXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgbW9ja2VkIHJlc3BvbnNlIGlzIHJlYWR5IHRvIGJlIHNlbnQuXG4gICAqL1xuICBvbk1vY2tlZFJlc3BvbnNlPyhcbiAgICByZXNwb25zZTogUmVzcG9uc2UsXG4gICAgaGFuZGxlcjogUmVxdWlyZWREZWVwPEhhbmRsZXJzRXhlY3V0aW9uUmVzdWx0PixcbiAgKTogdm9pZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgcmVxdWVzdElkOiBzdHJpbmcsXG4gIGhhbmRsZXJzOiBBcnJheTxSZXF1ZXN0SGFuZGxlcj4sXG4gIG9wdGlvbnM6IFJlcXVpcmVkRGVlcDxTaGFyZWRPcHRpb25zPixcbiAgZW1pdHRlcjogRW1pdHRlcjxMaWZlQ3ljbGVFdmVudHNNYXA+LFxuICBoYW5kbGVSZXF1ZXN0T3B0aW9ucz86IEhhbmRsZVJlcXVlc3RPcHRpb25zLFxuKTogUHJvbWlzZTxSZXNwb25zZSB8IHVuZGVmaW5lZD4ge1xuICBlbWl0dGVyLmVtaXQoJ3JlcXVlc3Q6c3RhcnQnLCB7IHJlcXVlc3QsIHJlcXVlc3RJZCB9KVxuXG4gIC8vIFBlcmZvcm0gcmVxdWVzdHMgd3JhcHBlZCBpbiBcImJ5cGFzcygpXCIgYXMtaXMuXG4gIGlmIChyZXF1ZXN0LmhlYWRlcnMuZ2V0KCdhY2NlcHQnKT8uaW5jbHVkZXMoJ21zdy9wYXNzdGhyb3VnaCcpKSB7XG4gICAgZW1pdHRlci5lbWl0KCdyZXF1ZXN0OmVuZCcsIHsgcmVxdWVzdCwgcmVxdWVzdElkIH0pXG4gICAgaGFuZGxlUmVxdWVzdE9wdGlvbnM/Lm9uUGFzc3Rocm91Z2hSZXNwb25zZT8uKHJlcXVlc3QpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBSZXNvbHZlIGEgbW9ja2VkIHJlc3BvbnNlIGZyb20gdGhlIGxpc3Qgb2YgcmVxdWVzdCBoYW5kbGVycy5cbiAgY29uc3QgW2xvb2t1cEVycm9yLCBsb29rdXBSZXN1bHRdID0gYXdhaXQgdW50aWwoKCkgPT4ge1xuICAgIHJldHVybiBleGVjdXRlSGFuZGxlcnMoe1xuICAgICAgcmVxdWVzdCxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIGhhbmRsZXJzLFxuICAgICAgcmVzb2x1dGlvbkNvbnRleHQ6IGhhbmRsZVJlcXVlc3RPcHRpb25zPy5yZXNvbHV0aW9uQ29udGV4dCxcbiAgICB9KVxuICB9KVxuXG4gIGlmIChsb29rdXBFcnJvcikge1xuICAgIC8vIEFsbG93IGRldmVsb3BlcnMgdG8gcmVhY3QgdG8gdW5oYW5kbGVkIGV4Y2VwdGlvbnMgaW4gcmVxdWVzdCBoYW5kbGVycy5cbiAgICBlbWl0dGVyLmVtaXQoJ3VuaGFuZGxlZEV4Y2VwdGlvbicsIHtcbiAgICAgIGVycm9yOiBsb29rdXBFcnJvcixcbiAgICAgIHJlcXVlc3QsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgfSlcbiAgICB0aHJvdyBsb29rdXBFcnJvclxuICB9XG5cbiAgLy8gSWYgdGhlIGhhbmRsZXIgbG9va3VwIHJldHVybmVkIG5vdGhpbmcsIG5vIHJlcXVlc3QgaGFuZGxlciB3YXMgZm91bmRcbiAgLy8gbWF0Y2hpbmcgdGhpcyByZXF1ZXN0LiBSZXBvcnQgdGhlIHJlcXVlc3QgYXMgdW5oYW5kbGVkLlxuICBpZiAoIWxvb2t1cFJlc3VsdCkge1xuICAgIGF3YWl0IG9uVW5oYW5kbGVkUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zLm9uVW5oYW5kbGVkUmVxdWVzdClcbiAgICBlbWl0dGVyLmVtaXQoJ3JlcXVlc3Q6dW5oYW5kbGVkJywgeyByZXF1ZXN0LCByZXF1ZXN0SWQgfSlcbiAgICBlbWl0dGVyLmVtaXQoJ3JlcXVlc3Q6ZW5kJywgeyByZXF1ZXN0LCByZXF1ZXN0SWQgfSlcbiAgICBoYW5kbGVSZXF1ZXN0T3B0aW9ucz8ub25QYXNzdGhyb3VnaFJlc3BvbnNlPy4ocmVxdWVzdClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcmVzcG9uc2UgfSA9IGxvb2t1cFJlc3VsdFxuXG4gIC8vIFdoZW4gdGhlIGhhbmRsZWQgcmVxdWVzdCByZXR1cm5lZCBubyBtb2NrZWQgcmVzcG9uc2UsIHdhcm4gdGhlIGRldmVsb3BlcixcbiAgLy8gYXMgaXQgbWF5IGJlIGFuIG92ZXJzaWdodCBvbiB0aGVpciBwYXJ0LiBQZXJmb3JtIHRoZSByZXF1ZXN0IGFzLWlzLlxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgZW1pdHRlci5lbWl0KCdyZXF1ZXN0OmVuZCcsIHsgcmVxdWVzdCwgcmVxdWVzdElkIH0pXG4gICAgaGFuZGxlUmVxdWVzdE9wdGlvbnM/Lm9uUGFzc3Rocm91Z2hSZXNwb25zZT8uKHJlcXVlc3QpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBQZXJmb3JtIHRoZSByZXF1ZXN0IGFzLWlzIHdoZW4gdGhlIGRldmVsb3BlciBleHBsaWNpdGx5IHJldHVybmVkIFwicmVxLnBhc3N0aHJvdWdoKClcIi5cbiAgLy8gVGhpcyBwcm9kdWNlcyBubyB3YXJuaW5nIGFzIHRoZSByZXF1ZXN0IHdhcyBoYW5kbGVkLlxuICBpZiAoXG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSAzMDIgJiZcbiAgICByZXNwb25zZS5oZWFkZXJzLmdldCgneC1tc3ctaW50ZW50aW9uJykgPT09ICdwYXNzdGhyb3VnaCdcbiAgKSB7XG4gICAgZW1pdHRlci5lbWl0KCdyZXF1ZXN0OmVuZCcsIHsgcmVxdWVzdCwgcmVxdWVzdElkIH0pXG4gICAgaGFuZGxlUmVxdWVzdE9wdGlvbnM/Lm9uUGFzc3Rocm91Z2hSZXNwb25zZT8uKHJlcXVlc3QpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBTdG9yZSBhbGwgdGhlIHJlY2VpdmVkIHJlc3BvbnNlIGNvb2tpZXMgaW4gdGhlIGNvb2tpZSBqYXIuXG4gIGF3YWl0IHN0b3JlUmVzcG9uc2VDb29raWVzKHJlcXVlc3QsIHJlc3BvbnNlKVxuXG4gIGVtaXR0ZXIuZW1pdCgncmVxdWVzdDptYXRjaCcsIHsgcmVxdWVzdCwgcmVxdWVzdElkIH0pXG5cbiAgY29uc3QgcmVxdWlyZWRMb29rdXBSZXN1bHQgPVxuICAgIGxvb2t1cFJlc3VsdCBhcyBSZXF1aXJlZERlZXA8SGFuZGxlcnNFeGVjdXRpb25SZXN1bHQ+XG5cbiAgaGFuZGxlUmVxdWVzdE9wdGlvbnM/Lm9uTW9ja2VkUmVzcG9uc2U/LihyZXNwb25zZSwgcmVxdWlyZWRMb29rdXBSZXN1bHQpXG5cbiAgZW1pdHRlci5lbWl0KCdyZXF1ZXN0OmVuZCcsIHsgcmVxdWVzdCwgcmVxdWVzdElkIH0pXG5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHRvUmVzcG9uc2VJbml0KHJlc3BvbnNlOiBSZXNwb25zZSk6IFJlc3BvbnNlSW5pdCB7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpLFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBIYW5kbGVyS2luZCB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL2NvbW1vbidcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9SZXF1ZXN0SGFuZGxlcidcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0SGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL1dlYlNvY2tldEhhbmRsZXInXG5cbi8qKlxuICogQSBmaWx0ZXIgZnVuY3Rpb24gdGhhdCBlbnN1cmVzIHRoYXQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50XG4gKiBpcyBhIGhhbmRsZXIgb2YgdGhlIGdpdmVuIGtpbmQuIFRoaXMgaGVscHMgZGlmZmVyZW50aWF0ZVxuICogYmV0d2VlbiBkaWZmZXJlbnQga2luZHMgb2YgaGFuZGxlcnMsIGUuZy4gcmVxdWVzdCBhbmQgZXZlbnQgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRsZXJLaW5kPEsgZXh0ZW5kcyBIYW5kbGVyS2luZD4oa2luZDogSykge1xuICByZXR1cm4gKFxuICAgIGlucHV0OiB1bmtub3duLFxuICApOiBpbnB1dCBpcyBLIGV4dGVuZHMgJ0V2ZW50SGFuZGxlcicgPyBXZWJTb2NrZXRIYW5kbGVyIDogUmVxdWVzdEhhbmRsZXIgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBpbnB1dCAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG4gICAgICAnX19raW5kJyBpbiBpbnB1dCAmJlxuICAgICAgaW5wdXQuX19raW5kID09PSBraW5kXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFbWl0dGVyIH0gZnJvbSAnLi9FbWl0dGVyJ1xuXG5leHBvcnQgY2xhc3MgTWVtb3J5TGVha0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW1pdHRlcjogRW1pdHRlcjxhbnk+LFxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvdW50OiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAke2NvdW50fSAke3R5cGUudG9TdHJpbmcoKX0gbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdGBcbiAgICApXG4gICAgdGhpcy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZydcbiAgfVxufVxuIiwgImltcG9ydCB7IE1lbW9yeUxlYWtFcnJvciB9IGZyb20gJy4vTWVtb3J5TGVha0Vycm9yJ1xuXG5leHBvcnQgdHlwZSBFdmVudE1hcCA9IHtcbiAgW2V2ZW50TmFtZTogc3RyaW5nXTogQXJyYXk8dW5rbm93bj5cbn1cblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxFdmVudE5hbWVzID0gJ25ld0xpc3RlbmVyJyB8ICdyZW1vdmVMaXN0ZW5lcidcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxMaXN0ZW5lcjxFdmVudHMgZXh0ZW5kcyBFdmVudE1hcD4gPSBMaXN0ZW5lcjxcbiAgW2V2ZW50TmFtZToga2V5b2YgRXZlbnRzLCBsaXN0ZW5lcjogTGlzdGVuZXI8QXJyYXk8dW5rbm93bj4+XVxuPlxuXG5leHBvcnQgdHlwZSBMaXN0ZW5lcjxEYXRhIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4+ID0gKC4uLmRhdGE6IERhdGEpID0+IHZvaWRcblxuLyoqXG4gKiBOb2RlLmpzLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgYEV2ZW50RW1pdHRlcmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcjx7IGhlbGxvOiBbc3RyaW5nXSB9PigpXG4gKiBlbWl0dGVyLm9uKCdoZWxsbycsIChuYW1lKSA9PiBjb25zb2xlLmxvZyhuYW1lKSlcbiAqIGVtaXR0ZXIuZW1pdCgnaGVsbG8nLCAnSm9obicpXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWl0dGVyPEV2ZW50cyBleHRlbmRzIEV2ZW50TWFwPiB7XG4gIHByaXZhdGUgZXZlbnRzOiBNYXA8a2V5b2YgRXZlbnRzLCBBcnJheTxMaXN0ZW5lcjxhbnk+Pj5cbiAgcHJpdmF0ZSBtYXhMaXN0ZW5lcnM6IG51bWJlclxuICBwcml2YXRlIGhhc1dhcm5lZEFib3V0UG90ZW50aWFsTWVtb3J5TGVhazogYm9vbGVhblxuXG4gIHN0YXRpYyBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTBcblxuICBzdGF0aWMgbGlzdGVuZXJDb3VudDxFdmVudHMgZXh0ZW5kcyBFdmVudE1hcD4oXG4gICAgZW1pdHRlcjogRW1pdHRlcjxFdmVudE1hcD4sXG4gICAgZXZlbnROYW1lOiBrZXlvZiBFdmVudHNcbiAgKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50PGFueT4oZXZlbnROYW1lKVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLm1heExpc3RlbmVycyA9IEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVyc1xuICAgIHRoaXMuaGFzV2FybmVkQWJvdXRQb3RlbnRpYWxNZW1vcnlMZWFrID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRJbnRlcm5hbEV2ZW50KFxuICAgIGludGVybmFsRXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgZXZlbnROYW1lOiBrZXlvZiBFdmVudHMsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEFycmF5PHVua25vd24+PlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoXG4gICAgICBpbnRlcm5hbEV2ZW50TmFtZSxcbiAgICAgIC8vIEFueXRoaW5nIHRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweS5cbiAgICAgIC4uLihbZXZlbnROYW1lLCBsaXN0ZW5lcl0gYXMgRXZlbnRzWyduZXdMaXN0ZW5lciddICZcbiAgICAgICAgRXZlbnRzWydyZW1vdmVMaXN0ZW5lciddKVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgX2dldExpc3RlbmVyczxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lXG4gICk6IEFycmF5PExpc3RlbmVyPEFycmF5PHVua25vd24+Pj4ge1xuICAgIC8vIEFsd2F5cyByZXR1cm4gYSBjb3B5IG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXlcbiAgICAvLyBzbyB0aGV5IGFyZSBmaXhlZCBhdCB0aGUgdGltZSBvZiB0aGUgXCJfZ2V0TGlzdGVuZXJzXCIgY2FsbC5cbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgdGhpcy5ldmVudHMuZ2V0KGV2ZW50TmFtZSkpIHx8IFtdXG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVMaXN0ZW5lcjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGxpc3RlbmVyczogQXJyYXk8TGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+PixcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+XG4gICk6IEFycmF5PExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPj4ge1xuICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpXG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHByaXZhdGUgX3dyYXBPbmNlTGlzdGVuZXI8RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+XG4gICk6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPiB7XG4gICAgY29uc3Qgb25jZUxpc3RlbmVyID0gKC4uLmRhdGE6IEV2ZW50c1trZXlvZiBFdmVudHNdKSA9PiB7XG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgb25jZUxpc3RlbmVyKVxuXG4gICAgICAvKipcbiAgICAgICAqIEBub3RlIFJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgICAqIFRoaXMgd2F5IHRoaXMgd3JhcHBlZCBwcmVzZXJ2ZXMgbGlzdGVuZXJzIHRoYXQgYXJlIGFzeW5jLlxuICAgICAgICovXG4gICAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICAvLyBJbmhlcml0IHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob25jZUxpc3RlbmVyLCAnbmFtZScsIHsgdmFsdWU6IGxpc3RlbmVyLm5hbWUgfSlcblxuICAgIHJldHVybiBvbmNlTGlzdGVuZXJcbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXhMaXN0ZW5lcnMobWF4TGlzdGVuZXJzOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLm1heExpc3RlbmVycyA9IG1heExpc3RlbmVyc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBtYXggbGlzdGVuZXIgdmFsdWUgZm9yIHRoZSBgRW1pdHRlcmAgd2hpY2ggaXNcbiAgICogZWl0aGVyIHNldCBieSBgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMobilgIG9yIGRlZmF1bHRzIHRvXG4gICAqIGBFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnNgLlxuICAgKi9cbiAgcHVibGljIGdldE1heExpc3RlbmVycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1heExpc3RlbmVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gICAqIFRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IHdpbGwgYmUgc3RyaW5ncyBvciBTeW1ib2xzLlxuICAgKi9cbiAgcHVibGljIGV2ZW50TmFtZXMoKTogQXJyYXk8a2V5b2YgRXZlbnRzPiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5ldmVudHMua2V5cygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgY2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBldmVudCBuYW1lZCBgZXZlbnROYW1lYCxcbiAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLCBwYXNzaW5nIHRoZSBzdXBwbGllZCBhcmd1bWVudHMgdG8gZWFjaC5cbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhcyBsaXN0ZW5lcnMsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXI8eyBoZWxsbzogW3N0cmluZ10gfT4oKVxuICAgKiBlbWl0dGVyLmVtaXQoJ2hlbGxvJywgJ0pvaG4nKVxuICAgKi9cbiAgcHVibGljIGVtaXQ8RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgICAuLi5kYXRhOiBFdmVudHNbRXZlbnROYW1lXVxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9nZXRMaXN0ZW5lcnMoZXZlbnROYW1lKVxuICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgZGF0YSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGggPiAwXG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPlxuICApOiB0aGlzXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICBwdWJsaWMgYWRkTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMgfCBrZXlvZiBFdmVudHMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPiB8IExpc3RlbmVyPEV2ZW50c1thbnldPlxuICApOiB0aGlzIHtcbiAgICAvLyBFbWl0IHRoZSBgbmV3TGlzdGVuZXJgIGV2ZW50IGJlZm9yZSBhZGRpbmcgdGhlIGxpc3RlbmVyLlxuICAgIHRoaXMuX2VtaXRJbnRlcm5hbEV2ZW50KCduZXdMaXN0ZW5lcicsIGV2ZW50TmFtZSwgbGlzdGVuZXIpXG5cbiAgICBjb25zdCBuZXh0TGlzdGVuZXJzID0gdGhpcy5fZ2V0TGlzdGVuZXJzKGV2ZW50TmFtZSkuY29uY2F0KGxpc3RlbmVyKVxuICAgIHRoaXMuZXZlbnRzLnNldChldmVudE5hbWUsIG5leHRMaXN0ZW5lcnMpXG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm1heExpc3RlbmVycyA+IDAgJiZcbiAgICAgIHRoaXMubGlzdGVuZXJDb3VudChldmVudE5hbWUpID4gdGhpcy5tYXhMaXN0ZW5lcnMgJiZcbiAgICAgICF0aGlzLmhhc1dhcm5lZEFib3V0UG90ZW50aWFsTWVtb3J5TGVha1xuICAgICkge1xuICAgICAgdGhpcy5oYXNXYXJuZWRBYm91dFBvdGVudGlhbE1lbW9yeUxlYWsgPSB0cnVlXG5cbiAgICAgIGNvbnN0IG1lbW9yeUxlYWtXYXJuaW5nID0gbmV3IE1lbW9yeUxlYWtFcnJvcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQoZXZlbnROYW1lKVxuICAgICAgKVxuICAgICAgY29uc29sZS53YXJuKG1lbW9yeUxlYWtXYXJuaW5nKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb24oXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPlxuICApOiB0aGlzXG4gIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICBwdWJsaWMgb248RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU6ICdyZW1vdmVMaXN0ZW5lcicgfCBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPGFueT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgfVxuXG4gIHB1YmxpYyBvbmNlKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzLFxuICAgIGxpc3RlbmVyOiBJbnRlcm5hbExpc3RlbmVyPEV2ZW50cz5cbiAgKTogdGhpc1xuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzIHwgRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxhbnk+XG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZExpc3RlbmVyKFxuICAgICAgZXZlbnROYW1lLFxuICAgICAgdGhpcy5fd3JhcE9uY2VMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBwcmVwZW5kTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPlxuICApOiB0aGlzXG4gIHB1YmxpYyBwcmVwZW5kTGlzdGVuZXI8RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+XG4gICk6IHRoaXNcbiAgcHVibGljIHByZXBlbmRMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50cyxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8YW55PlxuICApOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9nZXRMaXN0ZW5lcnMoZXZlbnROYW1lKVxuXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0TGlzdGVuZXJzID0gW2xpc3RlbmVyXS5jb25jYXQobGlzdGVuZXJzKVxuICAgICAgdGhpcy5ldmVudHMuc2V0KGV2ZW50TmFtZSwgbmV4dExpc3RlbmVycylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ldmVudHMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzLmNvbmNhdChsaXN0ZW5lcikpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyBwcmVwZW5kT25jZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzLFxuICAgIGxpc3RlbmVyOiBJbnRlcm5hbExpc3RlbmVyPEV2ZW50cz5cbiAgKTogdGhpc1xuICBwdWJsaWMgcHJlcGVuZE9uY2VMaXN0ZW5lcjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICBwdWJsaWMgcHJlcGVuZE9uY2VMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50cyxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8YW55PlxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICB0aGlzLl93cmFwT25jZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgKVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzLFxuICAgIGxpc3RlbmVyOiBJbnRlcm5hbExpc3RlbmVyPEV2ZW50cz5cbiAgKTogdGhpc1xuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+XG4gICk6IHRoaXNcbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzIHwga2V5b2YgRXZlbnRzLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxhbnk+XG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2dldExpc3RlbmVycyhldmVudE5hbWUpXG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVyKGxpc3RlbmVycywgbGlzdGVuZXIpXG4gICAgICB0aGlzLmV2ZW50cy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcnMpXG5cbiAgICAgIC8vIEVtaXQgdGhlIGByZW1vdmVMaXN0ZW5lcmAgZXZlbnQgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGxpc3RlbmVyLlxuICAgICAgdGhpcy5fZW1pdEludGVybmFsRXZlbnQoJ3JlbW92ZUxpc3RlbmVyJywgZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIG9mZihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyxcbiAgICBsaXN0ZW5lcjogSW50ZXJuYWxMaXN0ZW5lcjxFdmVudHM+XG4gICk6IHRoaXNcbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICAvKipcbiAgICogQWxpYXMgZm9yIGBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKClgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBlbWl0dGVyLm9mZignaGVsbG8nLCBsaXN0ZW5lcilcbiAgICovXG4gIHB1YmxpYyBvZmYoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMgfCBrZXlvZiBFdmVudHMsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPGFueT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnROYW1lPzogSW50ZXJuYWxFdmVudE5hbWVzKTogdGhpc1xuICBwdWJsaWMgcmVtb3ZlQWxsTGlzdGVuZXJzPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lPzogRXZlbnROYW1lXG4gICk6IHRoaXNcbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVycyhcbiAgICBldmVudE5hbWU/OiBJbnRlcm5hbEV2ZW50TmFtZXMgfCBrZXlvZiBFdmVudHNcbiAgKTogdGhpcyB7XG4gICAgaWYgKGV2ZW50TmFtZSkge1xuICAgICAgdGhpcy5ldmVudHMuZGVsZXRlKGV2ZW50TmFtZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ldmVudHMuY2xlYXIoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgbGlzdGVuZXJzKGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzKTogQXJyYXk8TGlzdGVuZXI8YW55Pj5cbiAgcHVibGljIGxpc3RlbmVyczxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lXG4gICk6IEFycmF5PExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPj5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBhcnJheSBvZiBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCBuYW1lZCBgZXZlbnROYW1lYC5cbiAgICovXG4gIHB1YmxpYyBsaXN0ZW5lcnMoZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMgfCBrZXlvZiBFdmVudHMpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9nZXRMaXN0ZW5lcnMoZXZlbnROYW1lKSlcbiAgfVxuXG4gIHB1YmxpYyBsaXN0ZW5lckNvdW50KGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzKTogbnVtYmVyXG4gIHB1YmxpYyBsaXN0ZW5lckNvdW50PEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWVcbiAgKTogbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byB0aGUgZXZlbnQgbmFtZWQgYGV2ZW50TmFtZWAuXG4gICAqL1xuICBwdWJsaWMgbGlzdGVuZXJDb3VudChldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50cyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldExpc3RlbmVycyhldmVudE5hbWUpLmxlbmd0aFxuICB9XG5cbiAgcHVibGljIHJhd0xpc3RlbmVyczxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lXG4gICk6IEFycmF5PExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPj4ge1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVycyhldmVudE5hbWUpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFbWl0dGVyLCBFdmVudE1hcCB9IGZyb20gJ3N0cmljdC1ldmVudC1lbWl0dGVyJ1xuXG4vKipcbiAqIFBpcGVzIGFsbCBlbWl0dGVkIGV2ZW50cyBmcm9tIG9uZSBlbWl0dGVyIHRvIGFub3RoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlRXZlbnRzPEV2ZW50cyBleHRlbmRzIEV2ZW50TWFwPihcbiAgc291cmNlOiBFbWl0dGVyPEV2ZW50cz4sXG4gIGRlc3RpbmF0aW9uOiBFbWl0dGVyPEV2ZW50cz4sXG4pOiB2b2lkIHtcbiAgY29uc3QgcmF3RW1pdDogdHlwZW9mIHNvdXJjZS5lbWl0ICYgeyBfaXNQaXBlZD86IGJvb2xlYW4gfSA9IHNvdXJjZS5lbWl0XG5cbiAgaWYgKHJhd0VtaXQuX2lzUGlwZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUVtaXQ6IHR5cGVvZiBzb3VyY2UuZW1pdCAmIHsgX2lzUGlwZWQ/OiBib29sZWFuIH0gPVxuICAgIGZ1bmN0aW9uIHNvdXJjZUVtaXQodGhpczogdHlwZW9mIHNvdXJjZSwgZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgIGRlc3RpbmF0aW9uLmVtaXQoZXZlbnQsIC4uLmRhdGEpXG4gICAgICByZXR1cm4gcmF3RW1pdC5jYWxsKHRoaXMsIGV2ZW50LCAuLi5kYXRhKVxuICAgIH1cblxuICBzb3VyY2VFbWl0Ll9pc1BpcGVkID0gdHJ1ZVxuXG4gIHNvdXJjZS5lbWl0ID0gc291cmNlRW1pdFxufVxuIiwgIi8qKlxuICogQ3JlYXRlcyBhbiBpbW11dGFibGUgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1JlYWRvbmx5QXJyYXk8VD4oc291cmNlOiBBcnJheTxUPik6IFJlYWRvbmx5QXJyYXk8VD4ge1xuICBjb25zdCBjbG9uZSA9IFsuLi5zb3VyY2VdIGFzIEFycmF5PFQ+XG4gIE9iamVjdC5mcmVlemUoY2xvbmUpXG4gIHJldHVybiBjbG9uZVxufVxuIiwgImV4cG9ydCB0eXBlIERpc3Bvc2FibGVTdWJzY3JpcHRpb24gPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnM6IEFycmF5PERpc3Bvc2FibGVTdWJzY3JpcHRpb24+ID0gW11cblxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBsZXQgc3Vic2NyaXB0aW9uOiBEaXNwb3NhYmxlU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkXG4gICAgd2hpbGUgKChzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnMuc2hpZnQoKSkpIHtcbiAgICAgIHN1YnNjcmlwdGlvbigpXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnb3V0dmFyaWFudCdcbmltcG9ydCB7IEV2ZW50TWFwLCBFbWl0dGVyIH0gZnJvbSAnc3RyaWN0LWV2ZW50LWVtaXR0ZXInXG5pbXBvcnQgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4vaGFuZGxlcnMvUmVxdWVzdEhhbmRsZXInXG5pbXBvcnQgeyBMaWZlQ3ljbGVFdmVudEVtaXR0ZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnMnXG5pbXBvcnQgeyBkZXZVdGlscyB9IGZyb20gJy4vdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5pbXBvcnQgeyBwaXBlRXZlbnRzIH0gZnJvbSAnLi91dGlscy9pbnRlcm5hbC9waXBlRXZlbnRzJ1xuaW1wb3J0IHsgdG9SZWFkb25seUFycmF5IH0gZnJvbSAnLi91dGlscy9pbnRlcm5hbC90b1JlYWRvbmx5QXJyYXknXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnLi91dGlscy9pbnRlcm5hbC9EaXNwb3NhYmxlJ1xuaW1wb3J0IHR5cGUgeyBXZWJTb2NrZXRIYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVycy9XZWJTb2NrZXRIYW5kbGVyJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSGFuZGxlcnNDb250cm9sbGVyIHtcbiAgYWJzdHJhY3QgcHJlcGVuZChcbiAgICBydW50aW1lSGFuZGxlcnM6IEFycmF5PFJlcXVlc3RIYW5kbGVyIHwgV2ViU29ja2V0SGFuZGxlcj4sXG4gICk6IHZvaWRcbiAgYWJzdHJhY3QgcmVzZXQobmV4dEhhbmRsZXM6IEFycmF5PFJlcXVlc3RIYW5kbGVyIHwgV2ViU29ja2V0SGFuZGxlcj4pOiB2b2lkXG4gIGFic3RyYWN0IGN1cnJlbnRIYW5kbGVycygpOiBBcnJheTxSZXF1ZXN0SGFuZGxlciB8IFdlYlNvY2tldEhhbmRsZXI+XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUhhbmRsZXJzQ29udHJvbGxlciBpbXBsZW1lbnRzIEhhbmRsZXJzQ29udHJvbGxlciB7XG4gIHByaXZhdGUgaGFuZGxlcnM6IEFycmF5PFJlcXVlc3RIYW5kbGVyIHwgV2ViU29ja2V0SGFuZGxlcj5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGluaXRpYWxIYW5kbGVyczogQXJyYXk8UmVxdWVzdEhhbmRsZXIgfCBXZWJTb2NrZXRIYW5kbGVyPixcbiAgKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFsuLi5pbml0aWFsSGFuZGxlcnNdXG4gIH1cblxuICBwdWJsaWMgcHJlcGVuZChcbiAgICBydW50aW1lSGFuZGxlczogQXJyYXk8UmVxdWVzdEhhbmRsZXIgfCBXZWJTb2NrZXRIYW5kbGVyPixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVycy51bnNoaWZ0KC4uLnJ1bnRpbWVIYW5kbGVzKVxuICB9XG5cbiAgcHVibGljIHJlc2V0KG5leHRIYW5kbGVyczogQXJyYXk8UmVxdWVzdEhhbmRsZXIgfCBXZWJTb2NrZXRIYW5kbGVyPik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcnMgPVxuICAgICAgbmV4dEhhbmRsZXJzLmxlbmd0aCA+IDAgPyBbLi4ubmV4dEhhbmRsZXJzXSA6IFsuLi50aGlzLmluaXRpYWxIYW5kbGVyc11cbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50SGFuZGxlcnMoKTogQXJyYXk8UmVxdWVzdEhhbmRsZXIgfCBXZWJTb2NrZXRIYW5kbGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnNcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyaWMgY2xhc3MgZm9yIHRoZSBtb2NrIEFQSSBzZXR1cC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNldHVwQXBpPEV2ZW50c01hcCBleHRlbmRzIEV2ZW50TWFwPiBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgaGFuZGxlcnNDb250cm9sbGVyOiBIYW5kbGVyc0NvbnRyb2xsZXJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtaXR0ZXI6IEVtaXR0ZXI8RXZlbnRzTWFwPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHVibGljRW1pdHRlcjogRW1pdHRlcjxFdmVudHNNYXA+XG5cbiAgcHVibGljIHJlYWRvbmx5IGV2ZW50czogTGlmZUN5Y2xlRXZlbnRFbWl0dGVyPEV2ZW50c01hcD5cblxuICBjb25zdHJ1Y3RvciguLi5pbml0aWFsSGFuZGxlcnM6IEFycmF5PFJlcXVlc3RIYW5kbGVyIHwgV2ViU29ja2V0SGFuZGxlcj4pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpbnZhcmlhbnQoXG4gICAgICB0aGlzLnZhbGlkYXRlSGFuZGxlcnMoaW5pdGlhbEhhbmRsZXJzKSxcbiAgICAgIGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgIGBGYWlsZWQgdG8gYXBwbHkgZ2l2ZW4gcmVxdWVzdCBoYW5kbGVyczogaW52YWxpZCBpbnB1dC4gRGlkIHlvdSBmb3JnZXQgdG8gc3ByZWFkIHRoZSByZXF1ZXN0IGhhbmRsZXJzIEFycmF5P2AsXG4gICAgICApLFxuICAgIClcblxuICAgIHRoaXMuaGFuZGxlcnNDb250cm9sbGVyID0gbmV3IEluTWVtb3J5SGFuZGxlcnNDb250cm9sbGVyKGluaXRpYWxIYW5kbGVycylcblxuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyPEV2ZW50c01hcD4oKVxuICAgIHRoaXMucHVibGljRW1pdHRlciA9IG5ldyBFbWl0dGVyPEV2ZW50c01hcD4oKVxuICAgIHBpcGVFdmVudHModGhpcy5lbWl0dGVyLCB0aGlzLnB1YmxpY0VtaXR0ZXIpXG5cbiAgICB0aGlzLmV2ZW50cyA9IHRoaXMuY3JlYXRlTGlmZUN5Y2xlRXZlbnRzKClcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgICAgdGhpcy5wdWJsaWNFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVIYW5kbGVycyhoYW5kbGVyczogUmVhZG9ubHlBcnJheTx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgIC8vIEd1YXJkIGFnYWluc3QgaW5jb3JyZWN0IGNhbGwgc2lnbmF0dXJlIG9mIHRoZSBzZXR1cCBBUEkuXG4gICAgcmV0dXJuIGhhbmRsZXJzLmV2ZXJ5KChoYW5kbGVyKSA9PiAhQXJyYXkuaXNBcnJheShoYW5kbGVyKSlcbiAgfVxuXG4gIHB1YmxpYyB1c2UoXG4gICAgLi4ucnVudGltZUhhbmRsZXJzOiBBcnJheTxSZXF1ZXN0SGFuZGxlciB8IFdlYlNvY2tldEhhbmRsZXI+XG4gICk6IHZvaWQge1xuICAgIGludmFyaWFudChcbiAgICAgIHRoaXMudmFsaWRhdGVIYW5kbGVycyhydW50aW1lSGFuZGxlcnMpLFxuICAgICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgYEZhaWxlZCB0byBjYWxsIFwidXNlKClcIiB3aXRoIHRoZSBnaXZlbiByZXF1ZXN0IGhhbmRsZXJzOiBpbnZhbGlkIGlucHV0LiBEaWQgeW91IGZvcmdldCB0byBzcHJlYWQgdGhlIGFycmF5IG9mIHJlcXVlc3QgaGFuZGxlcnM/YCxcbiAgICAgICksXG4gICAgKVxuXG4gICAgdGhpcy5oYW5kbGVyc0NvbnRyb2xsZXIucHJlcGVuZChydW50aW1lSGFuZGxlcnMpXG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZUhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcnNDb250cm9sbGVyLmN1cnJlbnRIYW5kbGVycygpLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgIGlmICgnaXNVc2VkJyBpbiBoYW5kbGVyKSB7XG4gICAgICAgIGhhbmRsZXIuaXNVc2VkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHVibGljIHJlc2V0SGFuZGxlcnMoXG4gICAgLi4ubmV4dEhhbmRsZXJzOiBBcnJheTxSZXF1ZXN0SGFuZGxlciB8IFdlYlNvY2tldEhhbmRsZXI+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcnNDb250cm9sbGVyLnJlc2V0KG5leHRIYW5kbGVycylcbiAgfVxuXG4gIHB1YmxpYyBsaXN0SGFuZGxlcnMoKTogUmVhZG9ubHlBcnJheTxSZXF1ZXN0SGFuZGxlciB8IFdlYlNvY2tldEhhbmRsZXI+IHtcbiAgICByZXR1cm4gdG9SZWFkb25seUFycmF5KHRoaXMuaGFuZGxlcnNDb250cm9sbGVyLmN1cnJlbnRIYW5kbGVycygpKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMaWZlQ3ljbGVFdmVudHMoKTogTGlmZUN5Y2xlRXZlbnRFbWl0dGVyPEV2ZW50c01hcD4ge1xuICAgIHJldHVybiB7XG4gICAgICBvbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5wdWJsaWNFbWl0dGVyLm9uIGFzIGFueSkoLi4uYXJncylcbiAgICAgIH0sXG4gICAgICByZW1vdmVMaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5wdWJsaWNFbWl0dGVyLnJlbW92ZUxpc3RlbmVyIGFzIGFueSkoLi4uYXJncylcbiAgICAgIH0sXG4gICAgICByZW1vdmVBbGxMaXN0ZW5lcnM6ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wdWJsaWNFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycyguLi5hcmdzKVxuICAgICAgfSxcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFbWl0dGVyLCBFdmVudE1hcCB9IGZyb20gJ3N0cmljdC1ldmVudC1lbWl0dGVyJ1xuXG4vKipcbiAqIEVtaXRzIGFuIGV2ZW50IG9uIHRoZSBnaXZlbiBlbWl0dGVyIGJ1dCBleGVjdXRlc1xuICogdGhlIGxpc3RlbmVycyBzZXF1ZW50aWFsbHkuIFRoaXMgYWNjb3VudHMgZm9yIGFzeW5jaHJvbm91c1xuICogbGlzdGVuZXJzIChlLmcuIHRob3NlIGhhdmluZyBcInNsZWVwXCIgYW5kIGhhbmRsaW5nIHRoZSByZXF1ZXN0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVtaXRBc3luYzxcbiAgRXZlbnRzIGV4dGVuZHMgRXZlbnRNYXAsXG4gIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50c1xuPihcbiAgZW1pdHRlcjogRW1pdHRlcjxFdmVudHM+LFxuICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgLi4uZGF0YTogRXZlbnRzW0V2ZW50TmFtZV1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBsaXN0ZW5lcnMgPSBlbWl0dGVyLmxpc3RlbmVycyhldmVudE5hbWUpXG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgYXdhaXQgbGlzdGVuZXIuYXBwbHkoZW1pdHRlciwgZGF0YSlcbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBnbG9iYWwgcHJvcGVydHlcbiAqIGlzIGRlZmluZWQgYW5kIGlzIGNvbmZpZ3VyYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbmZpZ3VyYWJsZUdsb2JhbChwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWxUaGlzLCBwcm9wZXJ0eU5hbWUpXG5cbiAgLy8gVGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgYXQgYWxsLlxuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUaGUgcHJvcGVydHkgaXMgc2V0IHRvIGEgZ2V0dGVyIHRoYXQgcmV0dXJucyB1bmRlZmluZWQuXG4gIGlmIChcbiAgICB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGVzY3JpcHRvci5nZXQoKSA9PT0gJ3VuZGVmaW5lZCdcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUaGUgcHJvcGVydHkgaXMgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gdW5kZWZpbmVkLlxuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IuZ2V0ID09PSAndW5kZWZpbmVkJyAmJiBkZXNjcmlwdG9yLnZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVzY3JpcHRvci5zZXQgPT09ICd1bmRlZmluZWQnICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgW01TV10gRmFpbGVkIHRvIGFwcGx5IGludGVyY2VwdG9yOiB0aGUgZ2xvYmFsIFxcYCR7cHJvcGVydHlOYW1lfVxcYCBwcm9wZXJ0eSBpcyBub24tY29uZmlndXJhYmxlLiBUaGlzIGlzIGxpa2VseSBhbiBpc3N1ZSB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgdXNpbmcgYSBmcmFtZXdvcmssIHBsZWFzZSBvcGVuIGFuIGlzc3VlIGFib3V0IHRoaXMgaW4gdGhlaXIgcmVwb3NpdG9yeS5gXG4gICAgKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xuXG4vLyBzcmMvaW5kZXgudHNcbmltcG9ydCB7IGlzTm9kZVByb2Nlc3MgfSBmcm9tIFwiaXMtbm9kZS1wcm9jZXNzXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwib3V0dmFyaWFudFwiO1xuXG4vLyBzcmMvY29sb3JzLnRzXG52YXIgY29sb3JzX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNvbG9yc19leHBvcnRzLCB7XG4gIGJsdWU6ICgpID0+IGJsdWUsXG4gIGdyYXk6ICgpID0+IGdyYXksXG4gIGdyZWVuOiAoKSA9PiBncmVlbixcbiAgcmVkOiAoKSA9PiByZWQsXG4gIHllbGxvdzogKCkgPT4geWVsbG93XG59KTtcbmZ1bmN0aW9uIHllbGxvdyh0ZXh0KSB7XG4gIHJldHVybiBgXFx4MUJbMzNtJHt0ZXh0fVxceDFCWzBtYDtcbn1cbmZ1bmN0aW9uIGJsdWUodGV4dCkge1xuICByZXR1cm4gYFxceDFCWzM0bSR7dGV4dH1cXHgxQlswbWA7XG59XG5mdW5jdGlvbiBncmF5KHRleHQpIHtcbiAgcmV0dXJuIGBcXHgxQls5MG0ke3RleHR9XFx4MUJbMG1gO1xufVxuZnVuY3Rpb24gcmVkKHRleHQpIHtcbiAgcmV0dXJuIGBcXHgxQlszMW0ke3RleHR9XFx4MUJbMG1gO1xufVxuZnVuY3Rpb24gZ3JlZW4odGV4dCkge1xuICByZXR1cm4gYFxceDFCWzMybSR7dGV4dH1cXHgxQlswbWA7XG59XG5cbi8vIHNyYy9pbmRleC50c1xudmFyIElTX05PREUgPSBpc05vZGVQcm9jZXNzKCk7XG52YXIgTG9nZ2VyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnByZWZpeCA9IGBbJHt0aGlzLm5hbWV9XWA7XG4gICAgY29uc3QgTE9HR0VSX05BTUUgPSBnZXRWYXJpYWJsZShcIkRFQlVHXCIpO1xuICAgIGNvbnN0IExPR0dFUl9MRVZFTCA9IGdldFZhcmlhYmxlKFwiTE9HX0xFVkVMXCIpO1xuICAgIGNvbnN0IGlzTG9nZ2luZ0VuYWJsZWQgPSBMT0dHRVJfTkFNRSA9PT0gXCIxXCIgfHwgTE9HR0VSX05BTUUgPT09IFwidHJ1ZVwiIHx8IHR5cGVvZiBMT0dHRVJfTkFNRSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLm5hbWUuc3RhcnRzV2l0aChMT0dHRVJfTkFNRSk7XG4gICAgaWYgKGlzTG9nZ2luZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuZGVidWcgPSBpc0RlZmluZWRBbmROb3RFcXVhbHMoTE9HR0VSX0xFVkVMLCBcImRlYnVnXCIpID8gbm9vcCA6IHRoaXMuZGVidWc7XG4gICAgICB0aGlzLmluZm8gPSBpc0RlZmluZWRBbmROb3RFcXVhbHMoTE9HR0VSX0xFVkVMLCBcImluZm9cIikgPyBub29wIDogdGhpcy5pbmZvO1xuICAgICAgdGhpcy5zdWNjZXNzID0gaXNEZWZpbmVkQW5kTm90RXF1YWxzKExPR0dFUl9MRVZFTCwgXCJzdWNjZXNzXCIpID8gbm9vcCA6IHRoaXMuc3VjY2VzcztcbiAgICAgIHRoaXMud2FybmluZyA9IGlzRGVmaW5lZEFuZE5vdEVxdWFscyhMT0dHRVJfTEVWRUwsIFwid2FybmluZ1wiKSA/IG5vb3AgOiB0aGlzLndhcm5pbmc7XG4gICAgICB0aGlzLmVycm9yID0gaXNEZWZpbmVkQW5kTm90RXF1YWxzKExPR0dFUl9MRVZFTCwgXCJlcnJvclwiKSA/IG5vb3AgOiB0aGlzLmVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluZm8gPSBub29wO1xuICAgICAgdGhpcy5zdWNjZXNzID0gbm9vcDtcbiAgICAgIHRoaXMud2FybmluZyA9IG5vb3A7XG4gICAgICB0aGlzLmVycm9yID0gbm9vcDtcbiAgICAgIHRoaXMub25seSA9IG5vb3A7XG4gICAgfVxuICB9XG4gIHByZWZpeDtcbiAgZXh0ZW5kKGRvbWFpbikge1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKGAke3RoaXMubmFtZX06JHtkb21haW59YCk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW50IGEgZGVidWcgbWVzc2FnZS5cbiAgICogQGV4YW1wbGVcbiAgICogbG9nZ2VyLmRlYnVnKCdubyBkdXBsaWNhdGVzIGZvdW5kLCBjcmVhdGluZyBhIGRvY3VtZW50Li4uJylcbiAgICovXG4gIGRlYnVnKG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSB7XG4gICAgdGhpcy5sb2dFbnRyeSh7XG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgbWVzc2FnZTogZ3JheShtZXNzYWdlKSxcbiAgICAgIHBvc2l0aW9uYWxzLFxuICAgICAgcHJlZml4OiB0aGlzLnByZWZpeCxcbiAgICAgIGNvbG9yczoge1xuICAgICAgICBwcmVmaXg6IFwiZ3JheVwiXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW50IGFuIGluZm8gbWVzc2FnZS5cbiAgICogQGV4YW1wbGVcbiAgICogbG9nZ2VyLmluZm8oJ3N0YXJ0IHBhcnNpbmcuLi4nKVxuICAgKi9cbiAgaW5mbyhtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykge1xuICAgIHRoaXMubG9nRW50cnkoe1xuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHBvc2l0aW9uYWxzLFxuICAgICAgcHJlZml4OiB0aGlzLnByZWZpeCxcbiAgICAgIGNvbG9yczoge1xuICAgICAgICBwcmVmaXg6IFwiYmx1ZVwiXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcGVyZm9ybWFuY2UyID0gbmV3IFBlcmZvcm1hbmNlRW50cnkoKTtcbiAgICByZXR1cm4gKG1lc3NhZ2UyLCAuLi5wb3NpdGlvbmFsczIpID0+IHtcbiAgICAgIHBlcmZvcm1hbmNlMi5tZWFzdXJlKCk7XG4gICAgICB0aGlzLmxvZ0VudHJ5KHtcbiAgICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgICBtZXNzYWdlOiBgJHttZXNzYWdlMn0gJHtncmF5KGAke3BlcmZvcm1hbmNlMi5kZWx0YVRpbWV9bXNgKX1gLFxuICAgICAgICBwb3NpdGlvbmFsczogcG9zaXRpb25hbHMyLFxuICAgICAgICBwcmVmaXg6IHRoaXMucHJlZml4LFxuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICBwcmVmaXg6IFwiYmx1ZVwiXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFByaW50IGEgc3VjY2VzcyBtZXNzYWdlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBsb2dnZXIuc3VjY2Vzcygnc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgZG9jdW1lbnQnKVxuICAgKi9cbiAgc3VjY2VzcyhtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykge1xuICAgIHRoaXMubG9nRW50cnkoe1xuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHBvc2l0aW9uYWxzLFxuICAgICAgcHJlZml4OiBgXFx1MjcxNCAke3RoaXMucHJlZml4fWAsXG4gICAgICBjb2xvcnM6IHtcbiAgICAgICAgdGltZXN0YW1wOiBcImdyZWVuXCIsXG4gICAgICAgIHByZWZpeDogXCJncmVlblwiXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW50IGEgd2FybmluZy5cbiAgICogQGV4YW1wbGVcbiAgICogbG9nZ2VyLndhcm5pbmcoJ2ZvdW5kIGxlZ2FjeSBkb2N1bWVudCBmb3JtYXQnKVxuICAgKi9cbiAgd2FybmluZyhtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykge1xuICAgIHRoaXMubG9nRW50cnkoe1xuICAgICAgbGV2ZWw6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHBvc2l0aW9uYWxzLFxuICAgICAgcHJlZml4OiBgXFx1MjZBMCAke3RoaXMucHJlZml4fWAsXG4gICAgICBjb2xvcnM6IHtcbiAgICAgICAgdGltZXN0YW1wOiBcInllbGxvd1wiLFxuICAgICAgICBwcmVmaXg6IFwieWVsbG93XCJcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQGV4YW1wbGVcbiAgICogbG9nZ2VyLmVycm9yKCdzb21ldGhpbmcgd2VudCB3cm9uZycpXG4gICAqL1xuICBlcnJvcihtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykge1xuICAgIHRoaXMubG9nRW50cnkoe1xuICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwb3NpdGlvbmFscyxcbiAgICAgIHByZWZpeDogYFxcdTI3MTYgJHt0aGlzLnByZWZpeH1gLFxuICAgICAgY29sb3JzOiB7XG4gICAgICAgIHRpbWVzdGFtcDogXCJyZWRcIixcbiAgICAgICAgcHJlZml4OiBcInJlZFwiXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNhbGxiYWNrIG9ubHkgd2hlbiB0aGUgbG9nZ2luZyBpcyBlbmFibGVkLlxuICAgKiBUaGlzIGlzIHNraXBwZWQgaW4gaXRzIGVudGlyZXR5IGFuZCBoYXMgbm8gcnVudGltZSBjb3N0IG90aGVyd2lzZS5cbiAgICogVGhpcyBleGVjdXRlcyByZWdhcmRsZXNzIG9mIHRoZSBsb2cgbGV2ZWwuXG4gICAqIEBleGFtcGxlXG4gICAqIGxvZ2dlci5vbmx5KCgpID0+IHtcbiAgICogICBsb2dnZXIuaW5mbygnYWRkaXRpb25hbCBpbmZvJylcbiAgICogfSlcbiAgICovXG4gIG9ubHkoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG4gIGNyZWF0ZUVudHJ5KGxldmVsLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVzdGFtcDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG4gICAgICBsZXZlbCxcbiAgICAgIG1lc3NhZ2VcbiAgICB9O1xuICB9XG4gIGxvZ0VudHJ5KGFyZ3MpIHtcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVmaXgsXG4gICAgICBjb2xvcnM6IGN1c3RvbUNvbG9ycyxcbiAgICAgIHBvc2l0aW9uYWxzID0gW11cbiAgICB9ID0gYXJncztcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY3JlYXRlRW50cnkobGV2ZWwsIG1lc3NhZ2UpO1xuICAgIGNvbnN0IHRpbWVzdGFtcENvbG9yID0gY3VzdG9tQ29sb3JzPy50aW1lc3RhbXAgfHwgXCJncmF5XCI7XG4gICAgY29uc3QgcHJlZml4Q29sb3IgPSBjdXN0b21Db2xvcnM/LnByZWZpeCB8fCBcImdyYXlcIjtcbiAgICBjb25zdCBjb2xvcml6ZSA9IHtcbiAgICAgIHRpbWVzdGFtcDogY29sb3JzX2V4cG9ydHNbdGltZXN0YW1wQ29sb3JdLFxuICAgICAgcHJlZml4OiBjb2xvcnNfZXhwb3J0c1twcmVmaXhDb2xvcl1cbiAgICB9O1xuICAgIGNvbnN0IHdyaXRlID0gdGhpcy5nZXRXcml0ZXIobGV2ZWwpO1xuICAgIHdyaXRlKFxuICAgICAgW2NvbG9yaXplLnRpbWVzdGFtcCh0aGlzLmZvcm1hdFRpbWVzdGFtcChlbnRyeS50aW1lc3RhbXApKV0uY29uY2F0KHByZWZpeCAhPSBudWxsID8gY29sb3JpemUucHJlZml4KHByZWZpeCkgOiBbXSkuY29uY2F0KHNlcmlhbGl6ZUlucHV0KG1lc3NhZ2UpKS5qb2luKFwiIFwiKSxcbiAgICAgIC4uLnBvc2l0aW9uYWxzLm1hcChzZXJpYWxpemVJbnB1dClcbiAgICApO1xuICB9XG4gIGZvcm1hdFRpbWVzdGFtcCh0aW1lc3RhbXApIHtcbiAgICByZXR1cm4gYCR7dGltZXN0YW1wLnRvTG9jYWxlVGltZVN0cmluZyhcbiAgICAgIFwiZW4tR0JcIlxuICAgICl9OiR7dGltZXN0YW1wLmdldE1pbGxpc2Vjb25kcygpfWA7XG4gIH1cbiAgZ2V0V3JpdGVyKGxldmVsKSB7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBcImRlYnVnXCI6XG4gICAgICBjYXNlIFwic3VjY2Vzc1wiOlxuICAgICAgY2FzZSBcImluZm9cIjoge1xuICAgICAgICByZXR1cm4gbG9nO1xuICAgICAgfVxuICAgICAgY2FzZSBcIndhcm5pbmdcIjoge1xuICAgICAgICByZXR1cm4gd2FybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJlcnJvclwiOiB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgUGVyZm9ybWFuY2VFbnRyeSA9IGNsYXNzIHtcbiAgc3RhcnRUaW1lO1xuICBlbmRUaW1lO1xuICBkZWx0YVRpbWU7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIH1cbiAgbWVhc3VyZSgpIHtcbiAgICB0aGlzLmVuZFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBkZWx0YVRpbWUgPSB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTtcbiAgICB0aGlzLmRlbHRhVGltZSA9IGRlbHRhVGltZS50b0ZpeGVkKDIpO1xuICB9XG59O1xudmFyIG5vb3AgPSAoKSA9PiB2b2lkIDA7XG5mdW5jdGlvbiBsb2cobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgaWYgKElTX05PREUpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShmb3JtYXQobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpICsgXCJcXG5cIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUubG9nKG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKTtcbn1cbmZ1bmN0aW9uIHdhcm4obWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgaWYgKElTX05PREUpIHtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShmb3JtYXQobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpICsgXCJcXG5cIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUud2FybihtZXNzYWdlLCAuLi5wb3NpdGlvbmFscyk7XG59XG5mdW5jdGlvbiBlcnJvcihtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykge1xuICBpZiAoSVNfTk9ERSkge1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGZvcm1hdChtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykgKyBcIlxcblwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihtZXNzYWdlLCAuLi5wb3NpdGlvbmFscyk7XG59XG5mdW5jdGlvbiBnZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUpIHtcbiAgaWYgKElTX05PREUpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXTtcbiAgfVxuICByZXR1cm4gZ2xvYmFsVGhpc1t2YXJpYWJsZU5hbWVdPy50b1N0cmluZygpO1xufVxuZnVuY3Rpb24gaXNEZWZpbmVkQW5kTm90RXF1YWxzKHZhbHVlLCBleHBlY3RlZCkge1xuICByZXR1cm4gdmFsdWUgIT09IHZvaWQgMCAmJiB2YWx1ZSAhPT0gZXhwZWN0ZWQ7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVJbnB1dChtZXNzYWdlKSB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChtZXNzYWdlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICB9XG4gIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG4gIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpO1xufVxuZXhwb3J0IHtcbiAgTG9nZ2VyXG59O1xuIiwgImltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BvcGVuLWRyYWZ0L2xvZ2dlcidcbmltcG9ydCB7IEVtaXR0ZXIsIExpc3RlbmVyIH0gZnJvbSAnc3RyaWN0LWV2ZW50LWVtaXR0ZXInXG5cbmV4cG9ydCB0eXBlIEludGVyY2VwdG9yRXZlbnRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5leHBvcnQgdHlwZSBJbnRlcmNlcHRvclN1YnNjcmlwdGlvbiA9ICgpID0+IHZvaWRcblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlciBuYW1lIHRvIGRldGVjdCB3aGVuIGEgc2luZ2xlIHJlcXVlc3RcbiAqIGlzIGJlaW5nIGhhbmRsZWQgYnkgbmVzdGVkIGludGVyY2VwdG9ycyAoWEhSIC0+IENsaWVudFJlcXVlc3QpLlxuICogT2JzY3VyZSBieSBkZXNpZ24gdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggdXNlci1kZWZpbmVkIGhlYWRlcnMuXG4gKiBJZGVhbGx5LCBjb21lIHVwIHdpdGggdGhlIEludGVyY2VwdG9yLWxldmVsIG1lY2hhbmlzbSBmb3IgdGhpcy5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21zd2pzL2ludGVyY2VwdG9ycy9pc3N1ZXMvMzc4XG4gKi9cbmV4cG9ydCBjb25zdCBJTlRFUk5BTF9SRVFVRVNUX0lEX0hFQURFUl9OQU1FID1cbiAgJ3gtaW50ZXJjZXB0b3JzLWludGVybmFsLXJlcXVlc3QtaWQnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxTeW1ib2w8Vj4oc3ltYm9sOiBTeW1ib2wpOiBWIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChcbiAgICAvLyBAdHMtaWdub3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjQ1ODdcbiAgICBnbG9iYWxUaGlzW3N5bWJvbF0gfHwgdW5kZWZpbmVkXG4gIClcbn1cblxuZnVuY3Rpb24gc2V0R2xvYmFsU3ltYm9sKHN5bWJvbDogU3ltYm9sLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgZ2xvYmFsVGhpc1tzeW1ib2xdID0gdmFsdWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUdsb2JhbFN5bWJvbChzeW1ib2w6IFN5bWJvbCk6IHZvaWQge1xuICAvLyBAdHMtaWdub3JlXG4gIGRlbGV0ZSBnbG9iYWxUaGlzW3N5bWJvbF1cbn1cblxuZXhwb3J0IGVudW0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlIHtcbiAgSU5BQ1RJVkUgPSAnSU5BQ1RJVkUnLFxuICBBUFBMWUlORyA9ICdBUFBMWUlORycsXG4gIEFQUExJRUQgPSAnQVBQTElFRCcsXG4gIERJU1BPU0lORyA9ICdESVNQT1NJTkcnLFxuICBESVNQT1NFRCA9ICdESVNQT1NFRCcsXG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgRXZlbnRzIGV4dGVuZHMgUmVjb3JkPGluZmVyIEV2ZW50TmFtZSwgYW55PiA/IEV2ZW50TmFtZSA6IG5ldmVyXG5cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRvcjxFdmVudHMgZXh0ZW5kcyBJbnRlcmNlcHRvckV2ZW50TWFwPiB7XG4gIHByb3RlY3RlZCBlbWl0dGVyOiBFbWl0dGVyPEV2ZW50cz5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnM6IEFycmF5PEludGVyY2VwdG9yU3Vic2NyaXB0aW9uPlxuICBwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXJcblxuICBwdWJsaWMgcmVhZHlTdGF0ZTogSW50ZXJjZXB0b3JSZWFkeVN0YXRlXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzeW1ib2w6IHN5bWJvbCkge1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IEludGVyY2VwdG9yUmVhZHlTdGF0ZS5JTkFDVElWRVxuXG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHN5bWJvbC5kZXNjcmlwdGlvbiEpXG5cbiAgICAvLyBEbyBub3QgbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVyc1xuICAgIC8vIHNvIG5vdCB0byBsaW1pdCB0aGUgbWF4aW11bSBhbW91bnQgb2YgcGFyYWxsZWwgZXZlbnRzIGVtaXR0ZWQuXG4gICAgdGhpcy5lbWl0dGVyLnNldE1heExpc3RlbmVycygwKVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygnY29uc3RydWN0aW5nIHRoZSBpbnRlcmNlcHRvci4uLicpXG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaW50ZXJjZXB0b3IgY2FuIGJlIGFwcGxpZWRcbiAgICogaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2hlY2tFbnZpcm9ubWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgaW50ZXJjZXB0b3IgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAgICogUmV0dXJucyBhbiBhbHJlYWR5IHJ1bm5pbmcgaW50ZXJjZXB0b3IgaW5zdGFuY2UgaWYgaXQncyBwcmVzZW50LlxuICAgKi9cbiAgcHVibGljIGFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyLmV4dGVuZCgnYXBwbHknKVxuICAgIGxvZ2dlci5pbmZvKCdhcHBseWluZyB0aGUgaW50ZXJjZXB0b3IuLi4nKVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkFQUExJRUQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdpbnRlcmNlcHRlZCBhbHJlYWR5IGFwcGxpZWQhJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gdGhpcy5jaGVja0Vudmlyb25tZW50KClcblxuICAgIGlmICghc2hvdWxkQXBwbHkpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCd0aGUgaW50ZXJjZXB0b3IgY2Fubm90IGJlIGFwcGxpZWQgaW4gdGhpcyBlbnZpcm9ubWVudCEnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkFQUExZSU5HXG5cbiAgICAvLyBXaGVuZXZlciBhcHBseWluZyBhIG5ldyBpbnRlcmNlcHRvciwgY2hlY2sgaWYgaXQgaGFzbid0IGJlZW4gYXBwbGllZCBhbHJlYWR5LlxuICAgIC8vIFRoaXMgZW5hYmxlcyB0byBhcHBseSB0aGUgc2FtZSBpbnRlcmNlcHRvciBtdWx0aXBsZSB0aW1lcywgZm9yIGV4YW1wbGUgZnJvbSBhIGRpZmZlcmVudFxuICAgIC8vIGludGVyY2VwdG9yLCBvbmx5IHByb3h5aW5nIGV2ZW50cyBidXQga2VlcGluZyB0aGUgc3R1YnMgaW4gYSBzaW5nbGUgcGxhY2UuXG4gICAgY29uc3QgcnVubmluZ0luc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZSgpXG5cbiAgICBpZiAocnVubmluZ0luc3RhbmNlKSB7XG4gICAgICBsb2dnZXIuaW5mbygnZm91bmQgYSBydW5uaW5nIGluc3RhbmNlLCByZXVzaW5nLi4uJylcblxuICAgICAgLy8gUHJveHkgYW55IGxpc3RlbmVycyB5b3Ugc2V0IG9uIHRoaXMgaW5zdGFuY2UgdG8gdGhlIHJ1bm5pbmcgaW5zdGFuY2UuXG4gICAgICB0aGlzLm9uID0gKGV2ZW50LCBsaXN0ZW5lcikgPT4ge1xuICAgICAgICBsb2dnZXIuaW5mbygncHJveHlpbmcgdGhlIFwiJXNcIiBsaXN0ZW5lcicsIGV2ZW50KVxuXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lcnMgdG8gdGhlIHJ1bm5pbmcgaW5zdGFuY2Ugc28gdGhleSBhcHBlYXJcbiAgICAgICAgLy8gYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbGlzdGVuZXJzIGxpc3QgYW5kIGFyZSBleGVjdXRlZCBmaXJzdC5cbiAgICAgICAgcnVubmluZ0luc3RhbmNlLmVtaXR0ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKVxuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IG9uY2UgdGhpcyBpbnRlcmNlcHRvciBpbnN0YW5jZSBpcyBkaXNwb3NlZCxcbiAgICAgICAgLy8gaXQgcmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGl0IGhhcyBhcHBlbmRlZCB0byB0aGUgcnVubmluZyBpbnRlcmNlcHRvciBpbnN0YW5jZS5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdJbnN0YW5jZS5lbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgICBsb2dnZXIuaW5mbygncmVtb3ZlZCBwcm94aWVkIFwiJXNcIiBsaXN0ZW5lciEnLCBldmVudClcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPSBJbnRlcmNlcHRvclJlYWR5U3RhdGUuQVBQTElFRFxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnbm8gcnVubmluZyBpbnN0YW5jZSBmb3VuZCwgc2V0dGluZyB1cCBhIG5ldyBpbnN0YW5jZS4uLicpXG5cbiAgICAvLyBTZXR1cCB0aGUgaW50ZXJjZXB0b3IuXG4gICAgdGhpcy5zZXR1cCgpXG5cbiAgICAvLyBTdG9yZSB0aGUgbmV3bHkgYXBwbGllZCBpbnRlcmNlcHRvciBpbnN0YW5jZSBnbG9iYWxseS5cbiAgICB0aGlzLnNldEluc3RhbmNlKClcblxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IEludGVyY2VwdG9yUmVhZHlTdGF0ZS5BUFBMSUVEXG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgdGhlIG1vZHVsZSBhdWdtZW50cyBhbmQgc3R1YnMgbmVjZXNzYXJ5IGZvciB0aGlzIGludGVyY2VwdG9yLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgcnVuIGlmIHRoZXJlJ3MgYSBydW5uaW5nIGludGVyY2VwdG9yIGluc3RhbmNlXG4gICAqIHRvIHByZXZlbnQgaW5zdGFudGlhdGluZyBhbiBpbnRlcmNlcHRvciBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIHByb3RlY3RlZCBzZXR1cCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byB0aGUgaW50ZXJjZXB0b3IncyBwdWJsaWMgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cz4+KFxuICAgIGV2ZW50OiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzIHtcbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5leHRlbmQoJ29uJylcblxuICAgIGlmIChcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9PT0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkRJU1BPU0lORyB8fFxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBJbnRlcmNlcHRvclJlYWR5U3RhdGUuRElTUE9TRURcbiAgICApIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdjYW5ub3QgbGlzdGVuIHRvIGV2ZW50cywgYWxyZWFkeSBkaXNwb3NlZCEnKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnYWRkaW5nIFwiJXNcIiBldmVudCBsaXN0ZW5lcjonLCBldmVudCwgbGlzdGVuZXIpXG5cbiAgICB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGxpc3RlbmVyKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudDogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgdGhpcy5lbWl0dGVyLm9uY2UoZXZlbnQsIGxpc3RlbmVyKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cz4+KFxuICAgIGV2ZW50OiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzIHtcbiAgICB0aGlzLmVtaXR0ZXIub2ZmKGV2ZW50LCBsaXN0ZW5lcilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudD86IEV2ZW50TmFtZVxuICApOiB0aGlzIHtcbiAgICB0aGlzLmVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgYW55IHNpZGUtZWZmZWN0cyB0aGlzIGludGVyY2VwdG9yIGhhcyBpbnRyb2R1Y2VkLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuZXh0ZW5kKCdkaXNwb3NlJylcblxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IEludGVyY2VwdG9yUmVhZHlTdGF0ZS5ESVNQT1NFRCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ2Nhbm5vdCBkaXNwb3NlLCBhbHJlYWR5IGRpc3Bvc2VkIScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnZGlzcG9zaW5nIHRoZSBpbnRlcmNlcHRvci4uLicpXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkRJU1BPU0lOR1xuXG4gICAgaWYgKCF0aGlzLmdldEluc3RhbmNlKCkpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdubyBpbnRlcmNlcHRvcnMgcnVubmluZywgc2tpcHBpbmcgZGlzcG9zZS4uLicpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdGhlIGdsb2JhbCBzeW1ib2wgYXMgc29vbiBhcyBwb3NzaWJsZSxcbiAgICAvLyBpbmRpY2F0aW5nIHRoYXQgdGhlIGludGVyY2VwdG9yIGlzIG5vIGxvbmdlciBydW5uaW5nLlxuICAgIHRoaXMuY2xlYXJJbnN0YW5jZSgpXG5cbiAgICBsb2dnZXIuaW5mbygnZ2xvYmFsIHN5bWJvbCBkZWxldGVkOicsIGdldEdsb2JhbFN5bWJvbCh0aGlzLnN5bWJvbCkpXG5cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdkaXNwb3Npbmcgb2YgJWQgc3Vic2NyaXB0aW9ucy4uLicsIHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGgpXG5cbiAgICAgIGZvciAoY29uc3QgZGlzcG9zZSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgZGlzcG9zZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdXG5cbiAgICAgIGxvZ2dlci5pbmZvKCdkaXNwb3NlZCBvZiBhbGwgc3Vic2NyaXB0aW9ucyEnLCB0aGlzLnN1YnNjcmlwdGlvbnMubGVuZ3RoKVxuICAgIH1cblxuICAgIHRoaXMuZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgIGxvZ2dlci5pbmZvKCdkZXN0cm95ZWQgdGhlIGxpc3RlbmVyIScpXG5cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBJbnRlcmNlcHRvclJlYWR5U3RhdGUuRElTUE9TRURcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5zdGFuY2UoKTogdGhpcyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRHbG9iYWxTeW1ib2w8dGhpcz4odGhpcy5zeW1ib2wpXG4gICAgdGhpcy5sb2dnZXIuaW5mbygncmV0cmlldmVkIGdsb2JhbCBpbnN0YW5jZTonLCBpbnN0YW5jZT8uY29uc3RydWN0b3I/Lm5hbWUpXG4gICAgcmV0dXJuIGluc3RhbmNlXG4gIH1cblxuICBwcml2YXRlIHNldEluc3RhbmNlKCk6IHZvaWQge1xuICAgIHNldEdsb2JhbFN5bWJvbCh0aGlzLnN5bWJvbCwgdGhpcylcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdzZXQgZ2xvYmFsIGluc3RhbmNlIScsIHRoaXMuc3ltYm9sLmRlc2NyaXB0aW9uKVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckluc3RhbmNlKCk6IHZvaWQge1xuICAgIGRlbGV0ZUdsb2JhbFN5bWJvbCh0aGlzLnN5bWJvbClcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdjbGVhcmVkIGdsb2JhbCBpbnN0YW5jZSEnLCB0aGlzLnN5bWJvbC5kZXNjcmlwdGlvbilcbiAgfVxufVxuIiwgIi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gSUQgc3RyaW5nIHRvIHJlcHJlc2VudCBhIHJlcXVlc3QuXG4gKiBAZXhhbXBsZVxuICogY3JlYXRlUmVxdWVzdElkKClcbiAqIC8vIFwiZjc3NGI2YzljNjAwZlwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0SWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpXG59XG4iLCAiZXhwb3J0IHR5cGUgUHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnIHwgJ2Z1bGZpbGxlZCcgfCAncmVqZWN0ZWQnXG5cbmV4cG9ydCB0eXBlIEV4ZWN1dG9yPFZhbHVlPiA9IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgUHJvbWlzZTxWYWx1ZT4+WzBdXG5leHBvcnQgdHlwZSBSZXNvbHZlRnVuY3Rpb248VmFsdWU+ID0gUGFyYW1ldGVyczxFeGVjdXRvcjxWYWx1ZT4+WzBdXG5leHBvcnQgdHlwZSBSZWplY3RGdW5jdGlvbjxSZWFzb24+ID0gUGFyYW1ldGVyczxFeGVjdXRvcjxSZWFzb24+PlsxXVxuXG5leHBvcnQgdHlwZSBEZWZlcnJlZFByb21pc2VFeGVjdXRvcjxJbnB1dCA9IG5ldmVyLCBPdXRwdXQgPSBJbnB1dD4gPSB7XG4gIChyZXNvbHZlPzogUmVzb2x2ZUZ1bmN0aW9uPElucHV0PiwgcmVqZWN0PzogUmVqZWN0RnVuY3Rpb248YW55Pik6IHZvaWRcblxuICByZXNvbHZlOiBSZXNvbHZlRnVuY3Rpb248SW5wdXQ+XG4gIHJlamVjdDogUmVqZWN0RnVuY3Rpb248YW55PlxuICByZXN1bHQ/OiBPdXRwdXRcbiAgc3RhdGU6IFByb21pc2VTdGF0ZVxuICByZWplY3Rpb25SZWFzb24/OiB1bmtub3duXG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmZXJyZWRFeGVjdXRvcjxcbiAgSW5wdXQgPSBuZXZlcixcbiAgT3V0cHV0ID0gSW5wdXRcbj4oKTogRGVmZXJyZWRQcm9taXNlRXhlY3V0b3I8SW5wdXQsIE91dHB1dD4ge1xuICBjb25zdCBleGVjdXRvciA9IDxEZWZlcnJlZFByb21pc2VFeGVjdXRvcjxJbnB1dCwgT3V0cHV0Pj4oKFxuICAgIHJlc29sdmUsXG4gICAgcmVqZWN0XG4gICkgPT4ge1xuICAgIGV4ZWN1dG9yLnN0YXRlID0gJ3BlbmRpbmcnXG5cbiAgICBleGVjdXRvci5yZXNvbHZlID0gKGRhdGEpID0+IHtcbiAgICAgIGlmIChleGVjdXRvci5zdGF0ZSAhPT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBleGVjdXRvci5yZXN1bHQgPSBkYXRhIGFzIE91dHB1dFxuXG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IDxWYWx1ZT4odmFsdWU6IFZhbHVlKSA9PiB7XG4gICAgICAgIGV4ZWN1dG9yLnN0YXRlID0gJ2Z1bGZpbGxlZCdcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKFxuICAgICAgICBkYXRhIGluc3RhbmNlb2YgUHJvbWlzZSA/IGRhdGEgOiBQcm9taXNlLnJlc29sdmUoZGF0YSkudGhlbihvbkZ1bGZpbGxlZClcbiAgICAgIClcbiAgICB9XG5cbiAgICBleGVjdXRvci5yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgICBpZiAoZXhlY3V0b3Iuc3RhdGUgIT09ICdwZW5kaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBleGVjdXRvci5zdGF0ZSA9ICdyZWplY3RlZCdcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiByZWplY3QoKGV4ZWN1dG9yLnJlamVjdGlvblJlYXNvbiA9IHJlYXNvbikpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBleGVjdXRvclxufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3IsXG4gIHR5cGUgUmVqZWN0RnVuY3Rpb24sXG4gIHR5cGUgUmVzb2x2ZUZ1bmN0aW9uLFxuICB0eXBlIERlZmVycmVkUHJvbWlzZUV4ZWN1dG9yLFxuICBjcmVhdGVEZWZlcnJlZEV4ZWN1dG9yLFxufSBmcm9tICcuL2NyZWF0ZURlZmVycmVkRXhlY3V0b3InXG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZFByb21pc2U8SW5wdXQsIE91dHB1dCA9IElucHV0PiBleHRlbmRzIFByb21pc2U8SW5wdXQ+IHtcbiAgI2V4ZWN1dG9yOiBEZWZlcnJlZFByb21pc2VFeGVjdXRvclxuXG4gIHB1YmxpYyByZXNvbHZlOiBSZXNvbHZlRnVuY3Rpb248T3V0cHV0PlxuICBwdWJsaWMgcmVqZWN0OiBSZWplY3RGdW5jdGlvbjxPdXRwdXQ+XG5cbiAgY29uc3RydWN0b3IoZXhlY3V0b3I6IEV4ZWN1dG9yPElucHV0PiB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgZGVmZXJyZWRFeGVjdXRvciA9IGNyZWF0ZURlZmVycmVkRXhlY3V0b3IoKVxuICAgIHN1cGVyKChvcmlnaW5hbFJlc29sdmUsIG9yaWdpbmFsUmVqZWN0KSA9PiB7XG4gICAgICBkZWZlcnJlZEV4ZWN1dG9yKG9yaWdpbmFsUmVzb2x2ZSwgb3JpZ2luYWxSZWplY3QpXG4gICAgICBleGVjdXRvcj8uKGRlZmVycmVkRXhlY3V0b3IucmVzb2x2ZSwgZGVmZXJyZWRFeGVjdXRvci5yZWplY3QpXG4gICAgfSlcblxuICAgIHRoaXMuI2V4ZWN1dG9yID0gZGVmZXJyZWRFeGVjdXRvclxuICAgIHRoaXMucmVzb2x2ZSA9IHRoaXMuI2V4ZWN1dG9yLnJlc29sdmVcbiAgICB0aGlzLnJlamVjdCA9IHRoaXMuI2V4ZWN1dG9yLnJlamVjdFxuICB9XG5cbiAgcHVibGljIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3Iuc3RhdGVcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVqZWN0aW9uUmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5yZWplY3Rpb25SZWFzb25cbiAgfVxuXG4gIHB1YmxpYyB0aGVuPFRoZW5SZXN1bHQgPSBJbnB1dCwgQ2F0Y2hSZXN1bHQgPSBuZXZlcj4oXG4gICAgb25GdWxmaWxsZWQ/OiAodmFsdWU6IElucHV0KSA9PiBUaGVuUmVzdWx0IHwgUHJvbWlzZUxpa2U8VGhlblJlc3VsdD4sXG4gICAgb25SZWplY3RlZD86IChyZWFzb246IGFueSkgPT4gQ2F0Y2hSZXN1bHQgfCBQcm9taXNlTGlrZTxDYXRjaFJlc3VsdD5cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlY29yYXRlKHN1cGVyLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpKVxuICB9XG5cbiAgcHVibGljIGNhdGNoPENhdGNoUmVzdWx0ID0gbmV2ZXI+KFxuICAgIG9uUmVqZWN0ZWQ/OiAocmVhc29uOiBhbnkpID0+IENhdGNoUmVzdWx0IHwgUHJvbWlzZUxpa2U8Q2F0Y2hSZXN1bHQ+XG4gICkge1xuICAgIHJldHVybiB0aGlzLiNkZWNvcmF0ZShzdXBlci5jYXRjaChvblJlamVjdGVkKSlcbiAgfVxuXG4gIHB1YmxpYyBmaW5hbGx5KG9uZmluYWxseT86ICgpID0+IHZvaWQgfCBQcm9taXNlPGFueT4pIHtcbiAgICByZXR1cm4gdGhpcy4jZGVjb3JhdGUoc3VwZXIuZmluYWxseShvbmZpbmFsbHkpKVxuICB9XG5cbiAgI2RlY29yYXRlPENoaWxkSW5wdXQ+KFxuICAgIHByb21pc2U6IFByb21pc2U8Q2hpbGRJbnB1dD5cbiAgKTogRGVmZXJyZWRQcm9taXNlPENoaWxkSW5wdXQsIE91dHB1dD4ge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm9taXNlLCB7XG4gICAgICByZXNvbHZlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMucmVzb2x2ZSB9LFxuICAgICAgcmVqZWN0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMucmVqZWN0IH0sXG4gICAgfSkgYXMgRGVmZXJyZWRQcm9taXNlPENoaWxkSW5wdXQsIE91dHB1dD5cbiAgfVxufVxuIiwgInR5cGUgRXZlbnRXaXRoVGFyZ2V0PEUgZXh0ZW5kcyBFdmVudCwgVD4gPSBFICYgeyB0YXJnZXQ6IFQgfVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZEV2ZW50PEUgZXh0ZW5kcyBFdmVudCwgVD4oXG4gIHRhcmdldDogVCxcbiAgZXZlbnQ6IEVcbik6IEV2ZW50V2l0aFRhcmdldDxFLCBUPiB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGV2ZW50LCB7XG4gICAgdGFyZ2V0OiB7XG4gICAgICB2YWx1ZTogdGFyZ2V0LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAgY3VycmVudFRhcmdldDoge1xuICAgICAgdmFsdWU6IHRhcmdldCxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybiBldmVudCBhcyBFdmVudFdpdGhUYXJnZXQ8RSwgVD5cbn1cbiIsICJjb25zdCBrQ2FuY2VsYWJsZSA9IFN5bWJvbCgna0NhbmNlbGFibGUnKVxuY29uc3Qga0RlZmF1bHRQcmV2ZW50ZWQgPSBTeW1ib2woJ2tEZWZhdWx0UHJldmVudGVkJylcblxuLyoqXG4gKiBBIGBNZXNzYWdlRXZlbnRgIHN1cGVyc2V0IHRoYXQgc3VwcG9ydHMgZXZlbnQgY2FuY2VsbGF0aW9uXG4gKiBpbiBOb2RlLmpzLiBJdCdzIHJhdGhlciBub24taW50cnVzaXZlIHNvIGl0IGNhbiBiZSBzYWZlbHlcbiAqIHVzZWQgaW4gdGhlIGJyb3dzZXIgYXMgd2VsbC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNTE3NjdcbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGFibGVNZXNzYWdlRXZlbnQ8VCA9IGFueT4gZXh0ZW5kcyBNZXNzYWdlRXZlbnQ8VD4ge1xuICBba0NhbmNlbGFibGVdOiBib29sZWFuO1xuICBba0RlZmF1bHRQcmV2ZW50ZWRdOiBib29sZWFuXG5cbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBpbml0OiBNZXNzYWdlRXZlbnRJbml0PFQ+KSB7XG4gICAgc3VwZXIodHlwZSwgaW5pdClcbiAgICB0aGlzW2tDYW5jZWxhYmxlXSA9ICEhaW5pdC5jYW5jZWxhYmxlXG4gICAgdGhpc1trRGVmYXVsdFByZXZlbnRlZF0gPSBmYWxzZVxuICB9XG5cbiAgZ2V0IGNhbmNlbGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXNba0NhbmNlbGFibGVdXG4gIH1cblxuICBzZXQgY2FuY2VsYWJsZShuZXh0Q2FuY2VsYWJsZSkge1xuICAgIHRoaXNba0NhbmNlbGFibGVdID0gbmV4dENhbmNlbGFibGVcbiAgfVxuXG4gIGdldCBkZWZhdWx0UHJldmVudGVkKCkge1xuICAgIHJldHVybiB0aGlzW2tEZWZhdWx0UHJldmVudGVkXVxuICB9XG5cbiAgc2V0IGRlZmF1bHRQcmV2ZW50ZWQobmV4dERlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICB0aGlzW2tEZWZhdWx0UHJldmVudGVkXSA9IG5leHREZWZhdWx0UHJldmVudGVkXG4gIH1cblxuICBwdWJsaWMgcHJldmVudERlZmF1bHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FuY2VsYWJsZSAmJiAhdGhpc1trRGVmYXVsdFByZXZlbnRlZF0pIHtcbiAgICAgIHRoaXNba0RlZmF1bHRQcmV2ZW50ZWRdID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2xvc2VFdmVudEluaXQgZXh0ZW5kcyBFdmVudEluaXQge1xuICBjb2RlPzogbnVtYmVyXG4gIHJlYXNvbj86IHN0cmluZ1xuICB3YXNDbGVhbj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNsYXNzIENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIHB1YmxpYyBjb2RlOiBudW1iZXJcbiAgcHVibGljIHJlYXNvbjogc3RyaW5nXG4gIHB1YmxpYyB3YXNDbGVhbjogYm9vbGVhblxuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgaW5pdDogQ2xvc2VFdmVudEluaXQgPSB7fSkge1xuICAgIHN1cGVyKHR5cGUsIGluaXQpXG4gICAgdGhpcy5jb2RlID0gaW5pdC5jb2RlID09PSB1bmRlZmluZWQgPyAwIDogaW5pdC5jb2RlXG4gICAgdGhpcy5yZWFzb24gPSBpbml0LnJlYXNvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBpbml0LnJlYXNvblxuICAgIHRoaXMud2FzQ2xlYW4gPSBpbml0Lndhc0NsZWFuID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGluaXQud2FzQ2xlYW5cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FuY2VsYWJsZUNsb3NlRXZlbnQgZXh0ZW5kcyBDbG9zZUV2ZW50IHtcbiAgW2tDYW5jZWxhYmxlXTogYm9vbGVhbjtcbiAgW2tEZWZhdWx0UHJldmVudGVkXTogYm9vbGVhblxuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgaW5pdDogQ2xvc2VFdmVudEluaXQgPSB7fSkge1xuICAgIHN1cGVyKHR5cGUsIGluaXQpXG4gICAgdGhpc1trQ2FuY2VsYWJsZV0gPSAhIWluaXQuY2FuY2VsYWJsZVxuICAgIHRoaXNba0RlZmF1bHRQcmV2ZW50ZWRdID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjYW5jZWxhYmxlKCkge1xuICAgIHJldHVybiB0aGlzW2tDYW5jZWxhYmxlXVxuICB9XG5cbiAgc2V0IGNhbmNlbGFibGUobmV4dENhbmNlbGFibGUpIHtcbiAgICB0aGlzW2tDYW5jZWxhYmxlXSA9IG5leHRDYW5jZWxhYmxlXG4gIH1cblxuICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICByZXR1cm4gdGhpc1trRGVmYXVsdFByZXZlbnRlZF1cbiAgfVxuXG4gIHNldCBkZWZhdWx0UHJldmVudGVkKG5leHREZWZhdWx0UHJldmVudGVkKSB7XG4gICAgdGhpc1trRGVmYXVsdFByZXZlbnRlZF0gPSBuZXh0RGVmYXVsdFByZXZlbnRlZFxuICB9XG5cbiAgcHVibGljIHByZXZlbnREZWZhdWx0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbmNlbGFibGUgJiYgIXRoaXNba0RlZmF1bHRQcmV2ZW50ZWRdKSB7XG4gICAgICB0aGlzW2tEZWZhdWx0UHJldmVudGVkXSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFdlYlNvY2tldERhdGEsIFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vV2ViU29ja2V0VHJhbnNwb3J0J1xuaW1wb3J0IHR5cGUgeyBXZWJTb2NrZXRFdmVudExpc3RlbmVyIH0gZnJvbSAnLi9XZWJTb2NrZXRPdmVycmlkZSdcbmltcG9ydCB7IGJpbmRFdmVudCB9IGZyb20gJy4vdXRpbHMvYmluZEV2ZW50J1xuaW1wb3J0IHsgQ2FuY2VsYWJsZU1lc3NhZ2VFdmVudCwgQ2xvc2VFdmVudCB9IGZyb20gJy4vdXRpbHMvZXZlbnRzJ1xuaW1wb3J0IHsgY3JlYXRlUmVxdWVzdElkIH0gZnJvbSAnLi4vLi4vY3JlYXRlUmVxdWVzdElkJ1xuXG5jb25zdCBrRW1pdHRlciA9IFN5bWJvbCgna0VtaXR0ZXInKVxuY29uc3Qga0JvdW5kTGlzdGVuZXIgPSBTeW1ib2woJ2tCb3VuZExpc3RlbmVyJylcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRDbGllbnRFdmVudE1hcCB7XG4gIG1lc3NhZ2U6IE1lc3NhZ2VFdmVudDxXZWJTb2NrZXREYXRhPlxuICBjbG9zZTogQ2xvc2VFdmVudFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2ViU29ja2V0Q2xpZW50Q29ubmVjdGlvblByb3RvY29sIHtcbiAgYWJzdHJhY3QgaWQ6IHN0cmluZ1xuICBhYnN0cmFjdCB1cmw6IFVSTFxuICBwdWJsaWMgYWJzdHJhY3Qgc2VuZChkYXRhOiBXZWJTb2NrZXREYXRhKTogdm9pZFxuICBwdWJsaWMgYWJzdHJhY3QgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZFxuXG4gIHB1YmxpYyBhYnN0cmFjdCBhZGRFdmVudExpc3RlbmVyPFxuICAgIEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIFdlYlNvY2tldENsaWVudEV2ZW50TWFwXG4gID4oXG4gICAgdHlwZTogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyPFdlYlNvY2tldENsaWVudEV2ZW50TWFwW0V2ZW50VHlwZV0+LFxuICAgIG9wdGlvbnM/OiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB8IGJvb2xlYW5cbiAgKTogdm9pZFxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZW1vdmVFdmVudExpc3RlbmVyPFxuICAgIEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIFdlYlNvY2tldENsaWVudEV2ZW50TWFwXG4gID4oXG4gICAgZXZlbnQ6IEV2ZW50VHlwZSxcbiAgICBsaXN0ZW5lcjogV2ViU29ja2V0RXZlbnRMaXN0ZW5lcjxXZWJTb2NrZXRDbGllbnRFdmVudE1hcFtFdmVudFR5cGVdPixcbiAgICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuXG4gICk6IHZvaWRcbn1cblxuLyoqXG4gKiBUaGUgV2ViU29ja2V0IGNsaWVudCBpbnN0YW5jZSByZXByZXNlbnRzIGFuIGluY29taW5nXG4gKiBjbGllbnQgY29ubmVjdGlvbi4gVGhlIHVzZXIgY2FuIGNvbnRyb2wgdGhlIGNvbm5lY3Rpb24sXG4gKiBzZW5kIGFuZCByZWNlaXZlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNvY2tldENsaWVudENvbm5lY3Rpb25cbiAgaW1wbGVtZW50cyBXZWJTb2NrZXRDbGllbnRDb25uZWN0aW9uUHJvdG9jb2xcbntcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IHVybDogVVJMXG5cbiAgcHJpdmF0ZSBba0VtaXR0ZXJdOiBFdmVudFRhcmdldFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBzb2NrZXQ6IFdlYlNvY2tldCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydDogV2ViU29ja2V0VHJhbnNwb3J0XG4gICkge1xuICAgIHRoaXMuaWQgPSBjcmVhdGVSZXF1ZXN0SWQoKVxuICAgIHRoaXMudXJsID0gbmV3IFVSTChzb2NrZXQudXJsKVxuICAgIHRoaXNba0VtaXR0ZXJdID0gbmV3IEV2ZW50VGFyZ2V0KClcblxuICAgIC8vIEVtaXQgb3V0Z29pbmcgY2xpZW50IGRhdGEgKFwid3Muc2VuZCgpXCIpIGFzIFwibWVzc2FnZVwiXG4gICAgLy8gZXZlbnRzIG9uIHRoZSBcImNsaWVudFwiIGNvbm5lY3Rpb24uXG4gICAgdGhpcy50cmFuc3BvcnQuYWRkRXZlbnRMaXN0ZW5lcignb3V0Z29pbmcnLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBiaW5kRXZlbnQoXG4gICAgICAgIHRoaXMuc29ja2V0LFxuICAgICAgICBuZXcgQ2FuY2VsYWJsZU1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICBkYXRhOiBldmVudC5kYXRhLFxuICAgICAgICAgIG9yaWdpbjogZXZlbnQub3JpZ2luLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIHRoaXNba0VtaXR0ZXJdLmRpc3BhdGNoRXZlbnQobWVzc2FnZSlcblxuICAgICAgLy8gVGhpcyBpcyBhIGJpdCBzaWxseSBidXQgZm9yd2FyZCB0aGUgY2FuY2VsbGF0aW9uIHN0YXRlXG4gICAgICAvLyBvZiB0aGUgXCJjbGllbnRcIiBtZXNzYWdlIGV2ZW50IHRvIHRoZSBcIm91dGdvaW5nXCIgdHJhbnNwb3J0IGV2ZW50LlxuICAgICAgLy8gVGhpcyB3YXksIG90aGVyIGFnZW5zIChsaWtlIFwic2VydmVyXCIgY29ubmVjdGlvbikgY2FuIGtub3dcbiAgICAgIC8vIHdoZXRoZXIgdGhlIGNsaWVudCBsaXN0ZW5lciBoYXMgcGVydmVudGVkIHRoZSBkZWZhdWx0LlxuICAgICAgaWYgKG1lc3NhZ2UuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8qKlxuICAgICAqIEVtaXQgdGhlIFwiY2xvc2VcIiBldmVudCBvbiB0aGUgXCJjbGllbnRcIiBjb25uZWN0aW9uXG4gICAgICogd2hlbmV2ZXIgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIGNsb3NlZC5cbiAgICAgKiBAbm90ZSBcImNsaWVudC5jbG9zZSgpXCIgZG9lcyBOT1QgZGlzcGF0Y2ggdGhlIFwiY2xvc2VcIlxuICAgICAqIGV2ZW50IG9uIHRoZSBXZWJTb2NrZXQgYmVjYXVzZSBpdCB1c2VzIG5vbi1jb25maWd1cmFibGVcbiAgICAgKiBjbG9zZSBzdGF0dXMgY29kZS4gVGh1cywgd2UgbGlzdGVuIHRvIHRoZSB0cmFuc3BvcnRcbiAgICAgKiBpbnN0ZWFkIG9mIHRoZSBXZWJTb2NrZXQncyBcImNsb3NlXCIgZXZlbnQuXG4gICAgICovXG4gICAgdGhpcy50cmFuc3BvcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXNba0VtaXR0ZXJdLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIGJpbmRFdmVudCh0aGlzLnNvY2tldCwgbmV3IENsb3NlRXZlbnQoJ2Nsb3NlJywgZXZlbnQpKVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciB0aGUgb3V0Z29pbmcgZXZlbnRzIGZyb20gdGhlIGNvbm5lY3RlZCBXZWJTb2NrZXQgY2xpZW50LlxuICAgKi9cbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXI8RXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0Q2xpZW50RXZlbnRNYXA+KFxuICAgIHR5cGU6IEV2ZW50VHlwZSxcbiAgICBsaXN0ZW5lcjogV2ViU29ja2V0RXZlbnRMaXN0ZW5lcjxXZWJTb2NrZXRDbGllbnRFdmVudE1hcFtFdmVudFR5cGVdPixcbiAgICBvcHRpb25zPzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICghUmVmbGVjdC5oYXMobGlzdGVuZXIsIGtCb3VuZExpc3RlbmVyKSkge1xuICAgICAgY29uc3QgYm91bmRMaXN0ZW5lciA9IGxpc3RlbmVyLmJpbmQodGhpcy5zb2NrZXQpXG5cbiAgICAgIC8vIFN0b3JlIHRoZSBib3VuZCBsaXN0ZW5lciBvbiB0aGUgb3JpZ2luYWwgbGlzdGVuZXJcbiAgICAgIC8vIHNvIHRoZSBleGFjdCBib3VuZCBmdW5jdGlvbiBjYW4gYmUgYWNjZXNzZWQgaW4gXCJyZW1vdmVFdmVudExpc3RlbmVyKClcIi5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsaXN0ZW5lciwga0JvdW5kTGlzdGVuZXIsIHtcbiAgICAgICAgdmFsdWU6IGJvdW5kTGlzdGVuZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tFbWl0dGVyXS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgdHlwZSxcbiAgICAgIFJlZmxlY3QuZ2V0KGxpc3RlbmVyLCBrQm91bmRMaXN0ZW5lcikgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG9wdGlvbnNcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyPEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIFdlYlNvY2tldENsaWVudEV2ZW50TWFwPihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyPFdlYlNvY2tldENsaWVudEV2ZW50TWFwW0V2ZW50VHlwZV0+LFxuICAgIG9wdGlvbnM/OiBFdmVudExpc3RlbmVyT3B0aW9ucyB8IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgdGhpc1trRW1pdHRlcl0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGV2ZW50LFxuICAgICAgUmVmbGVjdC5nZXQobGlzdGVuZXIsIGtCb3VuZExpc3RlbmVyKSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgb3B0aW9uc1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGRhdGEgdG8gdGhlIGNvbm5lY3RlZCBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgc2VuZChkYXRhOiBXZWJTb2NrZXREYXRhKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc3BvcnQuc2VuZChkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGUgQSBzdGF0dXMgY29kZSAoc2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NDU1I3NlY3Rpb24tNy40LjEpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIEEgY3VzdG9tIGNvbm5lY3Rpb24gY2xvc2UgcmVhc29uLlxuICAgKi9cbiAgcHVibGljIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxufVxuIiwgImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ291dHZhcmlhbnQnXG5pbXBvcnQge1xuICBrQ2xvc2UsXG4gIFdlYlNvY2tldEV2ZW50TGlzdGVuZXIsXG4gIFdlYlNvY2tldE92ZXJyaWRlLFxufSBmcm9tICcuL1dlYlNvY2tldE92ZXJyaWRlJ1xuaW1wb3J0IHR5cGUgeyBXZWJTb2NrZXREYXRhIH0gZnJvbSAnLi9XZWJTb2NrZXRUcmFuc3BvcnQnXG5pbXBvcnQgdHlwZSB7IFdlYlNvY2tldENsYXNzVHJhbnNwb3J0IH0gZnJvbSAnLi9XZWJTb2NrZXRDbGFzc1RyYW5zcG9ydCdcbmltcG9ydCB7IGJpbmRFdmVudCB9IGZyb20gJy4vdXRpbHMvYmluZEV2ZW50J1xuaW1wb3J0IHtcbiAgQ2FuY2VsYWJsZU1lc3NhZ2VFdmVudCxcbiAgQ2FuY2VsYWJsZUNsb3NlRXZlbnQsXG4gIENsb3NlRXZlbnQsXG59IGZyb20gJy4vdXRpbHMvZXZlbnRzJ1xuXG5jb25zdCBrRW1pdHRlciA9IFN5bWJvbCgna0VtaXR0ZXInKVxuY29uc3Qga0JvdW5kTGlzdGVuZXIgPSBTeW1ib2woJ2tCb3VuZExpc3RlbmVyJylcbmNvbnN0IGtTZW5kID0gU3ltYm9sKCdrU2VuZCcpXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0U2VydmVyRXZlbnRNYXAge1xuICBvcGVuOiBFdmVudFxuICBtZXNzYWdlOiBNZXNzYWdlRXZlbnQ8V2ViU29ja2V0RGF0YT5cbiAgZXJyb3I6IEV2ZW50XG4gIGNsb3NlOiBDbG9zZUV2ZW50XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uUHJvdG9jb2wge1xuICBwdWJsaWMgYWJzdHJhY3QgY29ubmVjdCgpOiB2b2lkXG4gIHB1YmxpYyBhYnN0cmFjdCBzZW5kKGRhdGE6IFdlYlNvY2tldERhdGEpOiB2b2lkXG4gIHB1YmxpYyBhYnN0cmFjdCBjbG9zZSgpOiB2b2lkXG5cbiAgcHVibGljIGFic3RyYWN0IGFkZEV2ZW50TGlzdGVuZXI8XG4gICAgRXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0U2VydmVyRXZlbnRNYXBcbiAgPihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyPFdlYlNvY2tldFNlcnZlckV2ZW50TWFwW0V2ZW50VHlwZV0+LFxuICAgIG9wdGlvbnM/OiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB8IGJvb2xlYW5cbiAgKTogdm9pZFxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZW1vdmVFdmVudExpc3RlbmVyPFxuICAgIEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIFdlYlNvY2tldFNlcnZlckV2ZW50TWFwXG4gID4oXG4gICAgZXZlbnQ6IEV2ZW50VHlwZSxcbiAgICBsaXN0ZW5lcjogV2ViU29ja2V0RXZlbnRMaXN0ZW5lcjxXZWJTb2NrZXRTZXJ2ZXJFdmVudE1hcFtFdmVudFR5cGVdPixcbiAgICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuXG4gICk6IHZvaWRcbn1cblxuLyoqXG4gKiBUaGUgV2ViU29ja2V0IHNlcnZlciBpbnN0YW5jZSByZXByZXNlbnRzIHRoZSBhY3R1YWwgcHJvZHVjdGlvblxuICogV2ViU29ja2V0IHNlcnZlciBjb25uZWN0aW9uLiBJdCdzIGlkbGUgYnkgZGVmYXVsdCBidXQgeW91IGNhblxuICogZXN0YWJsaXNoIGl0IGJ5IGNhbGxpbmcgYHNlcnZlci5jb25uZWN0KClgLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvblxuICBpbXBsZW1lbnRzIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb25Qcm90b2NvbFxue1xuICAvKipcbiAgICogQSBXZWJTb2NrZXQgaW5zdGFuY2UgY29ubmVjdGVkIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIHJlYWxXZWJTb2NrZXQ/OiBXZWJTb2NrZXRcbiAgcHJpdmF0ZSBtb2NrQ2xvc2VDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgcHJpdmF0ZSByZWFsQ2xvc2VDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgcHJpdmF0ZSBba0VtaXR0ZXJdOiBFdmVudFRhcmdldFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXZWJTb2NrZXRPdmVycmlkZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydDogV2ViU29ja2V0Q2xhc3NUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVDb25uZWN0aW9uOiAoKSA9PiBXZWJTb2NrZXRcbiAgKSB7XG4gICAgdGhpc1trRW1pdHRlcl0gPSBuZXcgRXZlbnRUYXJnZXQoKVxuICAgIHRoaXMubW9ja0Nsb3NlQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIHRoaXMucmVhbENsb3NlQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuXG4gICAgLy8gQXV0b21hdGljYWxseSBmb3J3YXJkIG91dGdvaW5nIGNsaWVudCBldmVudHNcbiAgICAvLyB0byB0aGUgYWN0dWFsIHNlcnZlciB1bmxlc3MgdGhlIG91dGdvaW5nIG1lc3NhZ2UgZXZlbnRcbiAgICAvLyBoYXMgYmVlbiBwcmV2ZW50ZWQuIFRoZSBcIm91dGdvaW5nXCIgdHJhbnNwb3J0IGV2ZW50IGl0XG4gICAgLy8gZGlzcGF0Y2hlZCBieSB0aGUgXCJjbGllbnRcIiBjb25uZWN0aW9uLlxuICAgIHRoaXMudHJhbnNwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ291dGdvaW5nJywgKGV2ZW50KSA9PiB7XG4gICAgICAvLyBJZ25vcmUgY2xpZW50IG1lc3NhZ2VzIGlmIHRoZSBzZXJ2ZXIgY29ubmVjdGlvblxuICAgICAgLy8gaGFzbid0IGJlZW4gZXN0YWJsaXNoZWQgeWV0LiBOb3doZXJlIHRvIGZvcndhcmQuXG4gICAgICBpZiAodHlwZW9mIHRoaXMucmVhbFdlYlNvY2tldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZXJ5IG91dGdvaW5nIGNsaWVudCBtZXNzYWdlIGNhbiBwcmV2ZW50IHRoaXMgZm9yd2FyZGluZ1xuICAgICAgLy8gYnkgcHJldmVudGluZyB0aGUgZGVmYXVsdCBvZiB0aGUgb3V0Z29pbmcgbWVzc2FnZSBldmVudC5cbiAgICAgIC8vIFRoaXMgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBiZWZvcmUgdXNlci1kZWZpbmVkIGxpc3RlbmVycyxcbiAgICAgIC8vIHNvIGV4ZWN1dGUgdGhlIGxvZ2ljIG9uIHRoZSBuZXh0IHRpY2suXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBub3RlIFVzZSB0aGUgaW50ZXJuYWwgc2VuZCBtZWNoYW5pc20gc28gY29uc3VtZXJzIGNhbiB0ZWxsXG4gICAgICAgICAgICogYXBhcnQgZGlyZWN0IHVzZXIgY2FsbHMgdG8gYHNlcnZlci5zZW5kKClgIGFuZCBpbnRlcm5hbCBjYWxscy5cbiAgICAgICAgICAgKiBFLmcuIE1TVyBoYXMgdG8gaWdub3JlIHRoaXMgaW50ZXJuYWwgY2FsbCB0byBsb2cgb3V0IG1lc3NhZ2VzIGNvcnJlY3RseS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzW2tTZW5kXShldmVudC5kYXRhKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICB0aGlzLnRyYW5zcG9ydC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2luY29taW5nJyxcbiAgICAgIHRoaXMuaGFuZGxlSW5jb21pbmdNZXNzYWdlLmJpbmQodGhpcylcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogVGhlIGBXZWJTb2NrZXRgIGluc3RhbmNlIGNvbm5lY3RlZCB0byB0aGUgb3JpZ2luYWwgc2VydmVyLlxuICAgKiBBY2Nlc3NpbmcgdGhpcyBiZWZvcmUgY2FsbGluZyBgc2VydmVyLmNvbm5lY3QoKWAgd2lsbCB0aHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc29ja2V0KCk6IFdlYlNvY2tldCB7XG4gICAgaW52YXJpYW50KFxuICAgICAgdGhpcy5yZWFsV2ViU29ja2V0LFxuICAgICAgJ0Nhbm5vdCBhY2Nlc3MgXCJzb2NrZXRcIiBvbiB0aGUgb3JpZ2luYWwgV2ViU29ja2V0IHNlcnZlciBvYmplY3Q6IHRoZSBjb25uZWN0aW9uIGlzIG5vdCBvcGVuLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIGBzZXJ2ZXIuY29ubmVjdCgpYD8nXG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXMucmVhbFdlYlNvY2tldFxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luYWwgV2ViU29ja2V0IHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBjb25uZWN0KCk6IHZvaWQge1xuICAgIGludmFyaWFudChcbiAgICAgICF0aGlzLnJlYWxXZWJTb2NrZXQgfHwgdGhpcy5yZWFsV2ViU29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOLFxuICAgICAgJ0ZhaWxlZCB0byBjYWxsIFwiY29ubmVjdCgpXCIgb24gdGhlIG9yaWdpbmFsIFdlYlNvY2tldCBpbnN0YW5jZTogdGhlIGNvbm5lY3Rpb24gYWxyZWFkeSBvcGVuJ1xuICAgIClcblxuICAgIGNvbnN0IHJlYWxXZWJTb2NrZXQgPSB0aGlzLmNyZWF0ZUNvbm5lY3Rpb24oKVxuXG4gICAgLy8gSW5oZXJpdCB0aGUgYmluYXJ5IHR5cGUgZnJvbSB0aGUgbW9jayBXZWJTb2NrZXQgY2xpZW50LlxuICAgIHJlYWxXZWJTb2NrZXQuYmluYXJ5VHlwZSA9IHRoaXMuY2xpZW50LmJpbmFyeVR5cGVcblxuICAgIC8vIEFsbG93IHRoZSBpbnRlcmNlcHRvciB0byBsaXN0ZW4gdG8gd2hlbiB0aGUgc2VydmVyIGNvbm5lY3Rpb25cbiAgICAvLyBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gVGhpcyBpc24ndCBuZWNlc3NhcnkgdG8gb3BlcmF0ZSB3aXRoIHRoZSBjb25uZWN0aW9uXG4gICAgLy8gYnV0IG1heSBiZSBiZW5lZmljaWFsIGluIHNvbWUgY2FzZXMgKGxpa2UgY29uZGl0aW9uYWxseSBhZGRpbmcgbG9nZ2luZykuXG4gICAgcmVhbFdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ29wZW4nLFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXNba0VtaXR0ZXJdLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgYmluZEV2ZW50KHRoaXMucmVhbFdlYlNvY2tldCEsIG5ldyBFdmVudCgnb3BlbicsIGV2ZW50KSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgcmVhbFdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAvLyBEaXNwYXRjaCB0aGUgXCJpbmNvbWluZ1wiIHRyYW5zcG9ydCBldmVudCBpbnN0ZWFkIG9mXG4gICAgICAvLyBpbnZva2luZyB0aGUgaW50ZXJuYWwgaGFuZGxlciBkaXJlY3RseS4gVGhpcyB3YXksXG4gICAgICAvLyBhbnlvbmUgY2FuIGxpc3RlbiB0byB0aGUgXCJpbmNvbWluZ1wiIGV2ZW50IGJ1dCB0aGlzXG4gICAgICAvLyBjbGFzcyBpcyB0aGUgb25lIHJlc3VsdGluZyBpbiBpdC5cbiAgICAgIHRoaXMudHJhbnNwb3J0LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIGJpbmRFdmVudChcbiAgICAgICAgICB0aGlzLnJlYWxXZWJTb2NrZXQhLFxuICAgICAgICAgIG5ldyBNZXNzYWdlRXZlbnQoJ2luY29taW5nJywge1xuICAgICAgICAgICAgZGF0YTogZXZlbnQuZGF0YSxcbiAgICAgICAgICAgIG9yaWdpbjogZXZlbnQub3JpZ2luLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9KVxuXG4gICAgLy8gQ2xvc2UgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gd2hlbiB0aGUgbW9jayBjbGllbnQgY2xvc2VzLlxuICAgIC8vIEUuZy4gXCJjbGllbnQuY2xvc2UoKVwiIHdhcyBjYWxsZWQuIFRoaXMgaXMgbmV2ZXIgZm9yd2FyZGVkIGFueXdoZXJlLlxuICAgIHRoaXMuY2xpZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnY2xvc2UnLFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9ja0Nsb3NlKGV2ZW50KVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLm1vY2tDbG9zZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfVxuICAgIClcblxuICAgIC8vIEZvcndhcmQgdGhlIFwiY2xvc2VcIiBldmVudCB0byBsZXQgdGhlIGludGVyY2VwdG9yIGhhbmRsZVxuICAgIC8vIGNsb3N1cmVzIGluaXRpYXRlZCBieSB0aGUgb3JpZ2luYWwgc2VydmVyLlxuICAgIHJlYWxXZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdjbG9zZScsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWFsQ2xvc2UoZXZlbnQpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzaWduYWw6IHRoaXMucmVhbENsb3NlQ29udHJvbGxlci5zaWduYWwsXG4gICAgICB9XG4gICAgKVxuXG4gICAgcmVhbFdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yRXZlbnQgPSBiaW5kRXZlbnQoXG4gICAgICAgIHJlYWxXZWJTb2NrZXQsXG4gICAgICAgIG5ldyBFdmVudCgnZXJyb3InLCB7IGNhbmNlbGFibGU6IHRydWUgfSlcbiAgICAgIClcblxuICAgICAgLy8gRW1pdCB0aGUgXCJlcnJvclwiIGV2ZW50IG9uIHRoZSBgc2VydmVyYCBjb25uZWN0aW9uXG4gICAgICAvLyB0byBsZXQgdGhlIGludGVyY2VwdG9yIHJlYWN0IHRvIG9yaWdpbmFsIHNlcnZlciBlcnJvcnMuXG4gICAgICB0aGlzW2tFbWl0dGVyXS5kaXNwYXRjaEV2ZW50KGVycm9yRXZlbnQpXG5cbiAgICAgIC8vIElmIHRoZSBlcnJvciBldmVudCBmcm9tIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgaGFzbid0IGJlZW4gcHJldmVudGVkLFxuICAgICAgLy8gZm9yd2FyZCBpdCB0byB0aGUgdW5kZXJseWluZyBjbGllbnQuXG4gICAgICBpZiAoIWVycm9yRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB0aGlzLmNsaWVudC5kaXNwYXRjaEV2ZW50KGJpbmRFdmVudCh0aGlzLmNsaWVudCwgbmV3IEV2ZW50KCdlcnJvcicpKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5yZWFsV2ViU29ja2V0ID0gcmVhbFdlYlNvY2tldFxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgdGhlIGluY29taW5nIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBXZWJTb2NrZXQgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXI8RXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0U2VydmVyRXZlbnRNYXA+KFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgbGlzdGVuZXI6IFdlYlNvY2tldEV2ZW50TGlzdGVuZXI8V2ViU29ja2V0U2VydmVyRXZlbnRNYXBbRXZlbnRUeXBlXT4sXG4gICAgb3B0aW9ucz86IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHwgYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAoIVJlZmxlY3QuaGFzKGxpc3RlbmVyLCBrQm91bmRMaXN0ZW5lcikpIHtcbiAgICAgIGNvbnN0IGJvdW5kTGlzdGVuZXIgPSBsaXN0ZW5lci5iaW5kKHRoaXMuY2xpZW50KVxuXG4gICAgICAvLyBTdG9yZSB0aGUgYm91bmQgbGlzdGVuZXIgb24gdGhlIG9yaWdpbmFsIGxpc3RlbmVyXG4gICAgICAvLyBzbyB0aGUgZXhhY3QgYm91bmQgZnVuY3Rpb24gY2FuIGJlIGFjY2Vzc2VkIGluIFwicmVtb3ZlRXZlbnRMaXN0ZW5lcigpXCIuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdGVuZXIsIGtCb3VuZExpc3RlbmVyLCB7XG4gICAgICAgIHZhbHVlOiBib3VuZExpc3RlbmVyLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpc1trRW1pdHRlcl0uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIGV2ZW50LFxuICAgICAgUmVmbGVjdC5nZXQobGlzdGVuZXIsIGtCb3VuZExpc3RlbmVyKSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgb3B0aW9uc1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcjxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRTZXJ2ZXJFdmVudE1hcD4oXG4gICAgZXZlbnQ6IEV2ZW50VHlwZSxcbiAgICBsaXN0ZW5lcjogV2ViU29ja2V0RXZlbnRMaXN0ZW5lcjxXZWJTb2NrZXRTZXJ2ZXJFdmVudE1hcFtFdmVudFR5cGVdPixcbiAgICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIHRoaXNba0VtaXR0ZXJdLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudCxcbiAgICAgIFJlZmxlY3QuZ2V0KGxpc3RlbmVyLCBrQm91bmRMaXN0ZW5lcikgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG9wdGlvbnNcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBkYXRhIHRvIHRoZSBvcmlnaW5hbCBXZWJTb2NrZXQgc2VydmVyLlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZXJ2ZXIuc2VuZCgnaGVsbG8nKVxuICAgKiBzZXJ2ZXIuc2VuZChuZXcgQmxvYihbJ2hlbGxvJ10pKVxuICAgKiBzZXJ2ZXIuc2VuZChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ2hlbGxvJykpXG4gICAqL1xuICBwdWJsaWMgc2VuZChkYXRhOiBXZWJTb2NrZXREYXRhKTogdm9pZCB7XG4gICAgdGhpc1trU2VuZF0oZGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgW2tTZW5kXShkYXRhOiBXZWJTb2NrZXREYXRhKTogdm9pZCB7XG4gICAgY29uc3QgeyByZWFsV2ViU29ja2V0IH0gPSB0aGlzXG5cbiAgICBpbnZhcmlhbnQoXG4gICAgICByZWFsV2ViU29ja2V0LFxuICAgICAgJ0ZhaWxlZCB0byBjYWxsIFwic2VydmVyLnNlbmQoKVwiIGZvciBcIiVzXCI6IHRoZSBjb25uZWN0aW9uIGlzIG5vdCBvcGVuLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIFwic2VydmVyLmNvbm5lY3QoKVwiPycsXG4gICAgICB0aGlzLmNsaWVudC51cmxcbiAgICApXG5cbiAgICAvLyBTaWxlbnRseSBpZ25vcmUgd3JpdGVzIG9uIHRoZSBjbG9zZWQgb3JpZ2luYWwgV2ViU29ja2V0LlxuICAgIGlmIChcbiAgICAgIHJlYWxXZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NJTkcgfHxcbiAgICAgIHJlYWxXZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRFxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRGVsZWdhdGUgdGhlIHNlbmQgdG8gd2hlbiB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbiBpcyBvcGVuLlxuICAgIC8vIFVubGlrZSB0aGUgbW9jaywgY29ubmVjdGluZyB0byB0aGUgb3JpZ2luYWwgc2VydmVyIG1heSB0YWtlIHRpbWVcbiAgICAvLyBzbyB3ZSBjYW5ub3QgY2FsbCB0aGlzIG9uIHRoZSBuZXh0IHRpY2suXG4gICAgaWYgKHJlYWxXZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHJlYWxXZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ29wZW4nLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgcmVhbFdlYlNvY2tldC5zZW5kKGRhdGEpXG4gICAgICAgIH0sXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTZW5kIHRoZSBkYXRhIHRvIHRoZSBvcmlnaW5hbCBXZWJTb2NrZXQgc2VydmVyLlxuICAgIHJlYWxXZWJTb2NrZXQuc2VuZChkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBhY3R1YWwgc2VydmVyIGNvbm5lY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgY29uc3QgeyByZWFsV2ViU29ja2V0IH0gPSB0aGlzXG5cbiAgICBpbnZhcmlhbnQoXG4gICAgICByZWFsV2ViU29ja2V0LFxuICAgICAgJ0ZhaWxlZCB0byBjbG9zZSBzZXJ2ZXIgY29ubmVjdGlvbiBmb3IgXCIlc1wiOiB0aGUgY29ubmVjdGlvbiBpcyBub3Qgb3Blbi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBcInNlcnZlci5jb25uZWN0KClcIj8nLFxuICAgICAgdGhpcy5jbGllbnQudXJsXG4gICAgKVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBcImNsb3NlXCIgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gc28gaXQgZG9lc24ndCBjbG9zZSB0aGUgdW5kZXJseWluZyBXZWJTb2NrZXQgY2xpZW50XG4gICAgLy8gd2hlbiB5b3UgY2FsbCBcInNlcnZlci5jbG9zZSgpXCIuIFRoaXMgYWxzbyBwcmV2ZW50cyB0aGVcbiAgICAvLyBgY2xvc2VgIGV2ZW50IG9uIHRoZSBgc2VydmVyYCBjb25uZWN0aW9uIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0d2ljZS5cbiAgICB0aGlzLnJlYWxDbG9zZUNvbnRyb2xsZXIuYWJvcnQoKVxuXG4gICAgaWYgKFxuICAgICAgcmVhbFdlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0lORyB8fFxuICAgICAgcmVhbFdlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgYWN0dWFsIGNsaWVudCBjb25uZWN0aW9uLlxuICAgIHJlYWxXZWJTb2NrZXQuY2xvc2UoKVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIFwiY2xvc2VcIiBldmVudCBvbiB0aGUgYHNlcnZlcmAgY29ubmVjdGlvbi5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzW2tFbWl0dGVyXS5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBiaW5kRXZlbnQoXG4gICAgICAgICAgdGhpcy5yZWFsV2ViU29ja2V0LFxuICAgICAgICAgIG5ldyBDYW5jZWxhYmxlQ2xvc2VFdmVudCgnY2xvc2UnLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBub3RlIGBzZXJ2ZXIuY2xvc2UoKWAgaW4gdGhlIGludGVyY2VwdG9yXG4gICAgICAgICAgICAgKiBhbHdheXMgcmVzdWx0cyBpbiBjbGVhbiBjbG9zdXJlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29kZTogMTAwMCxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUluY29taW5nTWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50PFdlYlNvY2tldERhdGE+KTogdm9pZCB7XG4gICAgLy8gQ2xvbmUgdGhlIGV2ZW50IHRvIGRpc3BhdGNoIGl0IG9uIHRoaXMgY2xhc3NcbiAgICAvLyBvbmNlIGFnYWluIGFuZCBwcmV2ZW50IHRoZSBcImFscmVhZHkgYmVpbmcgZGlzcGF0Y2hlZFwiXG4gICAgLy8gZXhjZXB0aW9uLiBDbG9uZSBpdCBoZXJlIHNvIHdlIGNhbiBvYnNlcnZlIHRoaXMgZXZlbnRcbiAgICAvLyBiZWluZyBwcmV2ZW50ZWQgaW4gdGhlIFwic2VydmVyLm9uKClcIiBsaXN0ZW5lcnMuXG4gICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gYmluZEV2ZW50KFxuICAgICAgZXZlbnQudGFyZ2V0LFxuICAgICAgbmV3IENhbmNlbGFibGVNZXNzYWdlRXZlbnQoJ21lc3NhZ2UnLCB7XG4gICAgICAgIGRhdGE6IGV2ZW50LmRhdGEsXG4gICAgICAgIG9yaWdpbjogZXZlbnQub3JpZ2luLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgfSlcbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBAbm90ZSBFbWl0IFwibWVzc2FnZVwiIGV2ZW50IG9uIHRoZSBzZXJ2ZXIgY29ubmVjdGlvblxuICAgICAqIGluc3RhbmNlIHRvIGxldCB0aGUgaW50ZXJjZXB0b3Iga25vdyBhYm91dCB0aGVzZVxuICAgICAqIGluY29taW5nIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuIEluIHRoYXQgbGlzdGVuZXIsXG4gICAgICogdGhlIGludGVyY2VwdG9yIGNhbiBtb2RpZnkgb3Igc2tpcCB0aGUgZXZlbnQgZm9yd2FyZGluZ1xuICAgICAqIHRvIHRoZSBtb2NrIFdlYlNvY2tldCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICB0aGlzW2tFbWl0dGVyXS5kaXNwYXRjaEV2ZW50KG1lc3NhZ2VFdmVudClcblxuICAgIC8qKlxuICAgICAqIEBub3RlIEZvcndhcmQgdGhlIGluY29taW5nIHNlcnZlciBldmVudHMgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IG9uIHRoZSBtZXNzYWdlIGV2ZW50IHN0b3BzIHRoaXMuXG4gICAgICovXG4gICAgaWYgKCFtZXNzYWdlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgdGhpcy5jbGllbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgYmluZEV2ZW50KFxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBub3RlIEJpbmQgdGhlIGZvcndhcmRlZCBvcmlnaW5hbCBzZXJ2ZXIgZXZlbnRzXG4gICAgICAgICAgICogdG8gdGhlIG1vY2sgV2ViU29ja2V0IGluc3RhbmNlIHNvIGl0IHdvdWxkXG4gICAgICAgICAgICogZGlzcGF0Y2ggdGhlbSBzdHJhaWdodCBhd2F5LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuY2xpZW50LFxuICAgICAgICAgIC8vIENsb25lIHRoZSBtZXNzYWdlIGV2ZW50IGFnYWluIHRvIHByZXZlbnRcbiAgICAgICAgICAvLyB0aGUgXCJhbHJlYWR5IGJlaW5nIGRpc3BhdGNoZWRcIiBleGNlcHRpb24uXG4gICAgICAgICAgbmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGV2ZW50LmRhdGEsXG4gICAgICAgICAgICBvcmlnaW46IGV2ZW50Lm9yaWdpbixcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNb2NrQ2xvc2UoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uIGlmIHRoZSBtb2NrIGNsaWVudCBjbG9zZXMuXG4gICAgaWYgKHRoaXMucmVhbFdlYlNvY2tldCkge1xuICAgICAgdGhpcy5yZWFsV2ViU29ja2V0LmNsb3NlKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlYWxDbG9zZShldmVudDogQ2xvc2VFdmVudCk6IHZvaWQge1xuICAgIC8vIEZvciBjbG9zdXJlcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBvcmlnaW5hbCBzZXJ2ZXIsXG4gICAgLy8gcmVtb3ZlIHRoZSBcImNsb3NlXCIgbGlzdGVuZXIgZnJvbSB0aGUgbW9jayBjbGllbnQuXG4gICAgLy8gb3JpZ2luYWwgY2xvc2UgLT4gKD8pIGNsaWVudFtrQ2xvc2VdKCkgLS1YLS0+IFwiY2xvc2VcIiAoYWdhaW4pLlxuICAgIHRoaXMubW9ja0Nsb3NlQ29udHJvbGxlci5hYm9ydCgpXG5cbiAgICBjb25zdCBjbG9zZUV2ZW50ID0gYmluZEV2ZW50KFxuICAgICAgdGhpcy5yZWFsV2ViU29ja2V0LFxuICAgICAgbmV3IENhbmNlbGFibGVDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgY29kZTogZXZlbnQuY29kZSxcbiAgICAgICAgcmVhc29uOiBldmVudC5yZWFzb24sXG4gICAgICAgIHdhc0NsZWFuOiBldmVudC53YXNDbGVhbixcbiAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgdGhpc1trRW1pdHRlcl0uZGlzcGF0Y2hFdmVudChjbG9zZUV2ZW50KVxuXG4gICAgLy8gSWYgdGhlIGNsb3NlIGV2ZW50IGZyb20gdGhlIHNlcnZlciBoYXNuJ3QgYmVlbiBwcmV2ZW50ZWQsXG4gICAgLy8gZm9yd2FyZCB0aGUgY2xvc3VyZSB0byB0aGUgbW9jayBjbGllbnQuXG4gICAgaWYgKCFjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIC8vIENsb3NlIHRoZSBpbnRlcmNlcHRlZCBjbGllbnQgZm9yY2VmdWxseSB0b1xuICAgICAgLy8gYWxsb3cgbm9uLWNvbmZpZ3VyYWJsZSBzdGF0dXMgY29kZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgLy8gSWYgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQgYnkgbm93LCBubyBoYXJtIGNhbGxpbmdcbiAgICAgIC8vIHRoaXMgYWdhaW7igJRpdCB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgICAgdGhpcy5jbGllbnRba0Nsb3NlXShldmVudC5jb2RlLCBldmVudC5yZWFzb24pXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnb3V0dmFyaWFudCdcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0RGF0YSB9IGZyb20gJy4vV2ViU29ja2V0VHJhbnNwb3J0J1xuaW1wb3J0IHsgYmluZEV2ZW50IH0gZnJvbSAnLi91dGlscy9iaW5kRXZlbnQnXG5pbXBvcnQgeyBDbG9zZUV2ZW50IH0gZnJvbSAnLi91dGlscy9ldmVudHMnXG5pbXBvcnQgeyBEZWZlcnJlZFByb21pc2UgfSBmcm9tICdAb3Blbi1kcmFmdC9kZWZlcnJlZC1wcm9taXNlJ1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRFdmVudExpc3RlbmVyPFxuICBFdmVudFR5cGUgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcFtrZXlvZiBXZWJTb2NrZXRFdmVudE1hcF0gPSBFdmVudFxuPiA9ICh0aGlzOiBXZWJTb2NrZXQsIGV2ZW50OiBFdmVudFR5cGUpID0+IHZvaWRcblxuY29uc3QgV0VCU09DS0VUX0NMT1NFX0NPREVfUkFOR0VfRVJST1IgPVxuICAnSW52YWxpZEFjY2Vzc0Vycm9yOiBjbG9zZSBjb2RlIG91dCBvZiB1c2VyIGNvbmZpZ3VyYWJsZSByYW5nZSdcblxuZXhwb3J0IGNvbnN0IGtQYXNzdGhyb3VnaFByb21pc2UgPSBTeW1ib2woJ2tQYXNzdGhyb3VnaFByb21pc2UnKVxuZXhwb3J0IGNvbnN0IGtPblNlbmQgPSBTeW1ib2woJ2tPblNlbmQnKVxuZXhwb3J0IGNvbnN0IGtDbG9zZSA9IFN5bWJvbCgna0Nsb3NlJylcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE92ZXJyaWRlIGV4dGVuZHMgRXZlbnRUYXJnZXQgaW1wbGVtZW50cyBXZWJTb2NrZXQge1xuICBzdGF0aWMgcmVhZG9ubHkgQ09OTkVDVElORyA9IDBcbiAgc3RhdGljIHJlYWRvbmx5IE9QRU4gPSAxXG4gIHN0YXRpYyByZWFkb25seSBDTE9TSU5HID0gMlxuICBzdGF0aWMgcmVhZG9ubHkgQ0xPU0VEID0gM1xuICByZWFkb25seSBDT05ORUNUSU5HID0gMFxuICByZWFkb25seSBPUEVOID0gMVxuICByZWFkb25seSBDTE9TSU5HID0gMlxuICByZWFkb25seSBDTE9TRUQgPSAzXG5cbiAgcHVibGljIHVybDogc3RyaW5nXG4gIHB1YmxpYyBwcm90b2NvbDogc3RyaW5nXG4gIHB1YmxpYyBleHRlbnNpb25zOiBzdHJpbmdcbiAgcHVibGljIGJpbmFyeVR5cGU6IEJpbmFyeVR5cGVcbiAgcHVibGljIHJlYWR5U3RhdGU6IG51bWJlclxuICBwdWJsaWMgYnVmZmVyZWRBbW91bnQ6IG51bWJlclxuXG4gIHByaXZhdGUgX29ub3BlbjogV2ViU29ja2V0RXZlbnRMaXN0ZW5lciB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgX29ubWVzc2FnZTogV2ViU29ja2V0RXZlbnRMaXN0ZW5lcjxcbiAgICBNZXNzYWdlRXZlbnQ8V2ViU29ja2V0RGF0YT5cbiAgPiB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgX29uZXJyb3I6IFdlYlNvY2tldEV2ZW50TGlzdGVuZXIgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIF9vbmNsb3NlOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyPENsb3NlRXZlbnQ+IHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIFtrUGFzc3Rocm91Z2hQcm9taXNlXTogRGVmZXJyZWRQcm9taXNlPGJvb2xlYW4+XG4gIHByaXZhdGUgW2tPblNlbmRdPzogKGRhdGE6IFdlYlNvY2tldERhdGEpID0+IHZvaWRcblxuICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZyB8IFVSTCwgcHJvdG9jb2xzPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPikge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLnVybCA9IHVybC50b1N0cmluZygpXG4gICAgdGhpcy5wcm90b2NvbCA9ICcnXG4gICAgdGhpcy5leHRlbnNpb25zID0gJydcbiAgICB0aGlzLmJpbmFyeVR5cGUgPSAnYmxvYidcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLkNPTk5FQ1RJTkdcbiAgICB0aGlzLmJ1ZmZlcmVkQW1vdW50ID0gMFxuXG4gICAgdGhpc1trUGFzc3Rocm91Z2hQcm9taXNlXSA9IG5ldyBEZWZlcnJlZFByb21pc2U8Ym9vbGVhbj4oKVxuXG4gICAgcXVldWVNaWNyb3Rhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGF3YWl0IHRoaXNba1Bhc3N0aHJvdWdoUHJvbWlzZV0pIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvdG9jb2wgPVxuICAgICAgICB0eXBlb2YgcHJvdG9jb2xzID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcHJvdG9jb2xzXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KHByb3RvY29scykgJiYgcHJvdG9jb2xzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHByb3RvY29sc1swXVxuICAgICAgICAgIDogJydcblxuICAgICAgLyoqXG4gICAgICAgKiBAbm90ZSBDaGVjayB0aGF0IG5vdGhpbmcgaGFzIHByZXZlbnRlZCB0aGlzIGNvbm5lY3Rpb25cbiAgICAgICAqIChlLmcuIGNhbGxlZCBgY2xpZW50LmNsb3NlKClgIGluIHRoZSBjb25uZWN0aW9uIGxpc3RlbmVyKS5cbiAgICAgICAqIElmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHByZXZlbnRlZCwgbmV2ZXIgZGlzcGF0Y2ggdGhlIG9wZW4gZXZlbnQsLlxuICAgICAgICovXG4gICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gdGhpcy5PUEVOXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChiaW5kRXZlbnQodGhpcywgbmV3IEV2ZW50KCdvcGVuJykpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzZXQgb25vcGVuKGxpc3RlbmVyOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyIHwgbnVsbCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX29ub3BlbilcbiAgICB0aGlzLl9vbm9wZW4gPSBsaXN0ZW5lclxuICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgbGlzdGVuZXIpXG4gICAgfVxuICB9XG4gIGdldCBvbm9wZW4oKTogV2ViU29ja2V0RXZlbnRMaXN0ZW5lciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9vbm9wZW5cbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UoXG4gICAgbGlzdGVuZXI6IFdlYlNvY2tldEV2ZW50TGlzdGVuZXI8TWVzc2FnZUV2ZW50PFdlYlNvY2tldERhdGE+PiB8IG51bGxcbiAgKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgJ21lc3NhZ2UnLFxuICAgICAgdGhpcy5fb25tZXNzYWdlIGFzIFdlYlNvY2tldEV2ZW50TGlzdGVuZXJcbiAgICApXG4gICAgdGhpcy5fb25tZXNzYWdlID0gbGlzdGVuZXJcbiAgICBpZiAobGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyKVxuICAgIH1cbiAgfVxuICBnZXQgb25tZXNzYWdlKCk6IFdlYlNvY2tldEV2ZW50TGlzdGVuZXI8TWVzc2FnZUV2ZW50PFdlYlNvY2tldERhdGE+PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9vbm1lc3NhZ2VcbiAgfVxuXG4gIHNldCBvbmVycm9yKGxpc3RlbmVyOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyIHwgbnVsbCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9vbmVycm9yKVxuICAgIHRoaXMuX29uZXJyb3IgPSBsaXN0ZW5lclxuICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKVxuICAgIH1cbiAgfVxuICBnZXQgb25lcnJvcigpOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX29uZXJyb3JcbiAgfVxuXG4gIHNldCBvbmNsb3NlKGxpc3RlbmVyOiBXZWJTb2NrZXRFdmVudExpc3RlbmVyPENsb3NlRXZlbnQ+IHwgbnVsbCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9vbmNsb3NlIGFzIFdlYlNvY2tldEV2ZW50TGlzdGVuZXIpXG4gICAgdGhpcy5fb25jbG9zZSA9IGxpc3RlbmVyXG4gICAgaWYgKGxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpXG4gICAgfVxuICB9XG4gIGdldCBvbmNsb3NlKCk6IFdlYlNvY2tldEV2ZW50TGlzdGVuZXI8Q2xvc2VFdmVudD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fb25jbG9zZVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jcmVmLWZvci1kb20td2Vic29ja2V0LXNlbmQlRTIlOTElQTBcbiAgICovXG4gIHB1YmxpYyBzZW5kKGRhdGE6IFdlYlNvY2tldERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZFN0YXRlRXJyb3InKVxuICAgIH1cblxuICAgIC8vIFNlbmRpbmcgd2hlbiB0aGUgc29ja2V0IGlzIGFib3V0IHRvIGNsb3NlXG4gICAgLy8gZGlzY2FyZHMgdGhlIHNlbnQgZGF0YS5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NJTkcgfHwgdGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NFRCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQnVmZmVyIHRoZSBkYXRhIHRvIHNlbmQgaW4gdGhpcyBldmVuIGxvb3BcbiAgICAvLyBidXQgc2VuZCBpdCBpbiB0aGUgbmV4dC5cbiAgICB0aGlzLmJ1ZmZlcmVkQW1vdW50ICs9IGdldERhdGFTaXplKGRhdGEpXG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyBUaGlzIGlzIGEgYml0IG9wdGltaXN0aWMgYnV0IHNpbmNlIG5vIGFjdHVhbCBkYXRhIHRyYW5zZmVyXG4gICAgICAvLyBpcyBpbnZvbHZlZCwgYWxsIHRoZSBkYXRhIHdpbGwgYmUgXCJzZW50XCIgb24gdGhlIG5leHQgdGljay5cbiAgICAgIHRoaXMuYnVmZmVyZWRBbW91bnQgPSAwXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5vdGUgTm90aWZ5IHRoZSBwYXJlbnQgYWJvdXQgb3V0Z29pbmcgZGF0YS5cbiAgICAgICAqIFRoaXMgbm90aWZpZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAqIGxpc3RlbnMgdG8gdGhlIG91dGdvaW5nIGRhdGEgdG8gZW1pdCB0aGUgXCJtZXNzYWdlXCIgZXZlbnQuXG4gICAgICAgKi9cbiAgICAgIHRoaXNba09uU2VuZF0/LihkYXRhKVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgY2xvc2UoY29kZTogbnVtYmVyID0gMTAwMCwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaW52YXJpYW50KGNvZGUsIFdFQlNPQ0tFVF9DTE9TRV9DT0RFX1JBTkdFX0VSUk9SKVxuICAgIGludmFyaWFudChcbiAgICAgIGNvZGUgPT09IDEwMDAgfHwgKGNvZGUgPj0gMzAwMCAmJiBjb2RlIDw9IDQ5OTkpLFxuICAgICAgV0VCU09DS0VUX0NMT1NFX0NPREVfUkFOR0VfRVJST1JcbiAgICApXG5cbiAgICB0aGlzW2tDbG9zZV0oY29kZSwgcmVhc29uKVxuICB9XG5cbiAgcHJpdmF0ZSBba0Nsb3NlXShcbiAgICBjb2RlOiBudW1iZXIgPSAxMDAwLFxuICAgIHJlYXNvbj86IHN0cmluZyxcbiAgICB3YXNDbGVhbiA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogQG5vdGUgTW92ZSB0aGlzIGNoZWNrIGhlcmUgc28gdGhhdCBldmVuIGludGVybmFsIGNsb3N1cmVzLFxuICAgICAqIGxpa2UgdGhvc2UgdHJpZ2dlcmVkIGJ5IHRoZSBgc2VydmVyYCBjb25uZWN0aW9uLCBhcmUgbm90XG4gICAgICogcGVyZm9ybWVkIHR3aWNlLlxuICAgICAqL1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuQ0xPU0lORyB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuQ0xPU0VEKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLkNMT1NJTkdcblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IHRoaXMuQ0xPU0VEXG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgYmluZEV2ZW50KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmV3IENsb3NlRXZlbnQoJ2Nsb3NlJywge1xuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIHdhc0NsZWFuLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMgb25jZSB0aGUgc29ja2V0IGlzIGNsb3NlZC5cbiAgICAgIHRoaXMuX29ub3BlbiA9IG51bGxcbiAgICAgIHRoaXMuX29ubWVzc2FnZSA9IG51bGxcbiAgICAgIHRoaXMuX29uZXJyb3IgPSBudWxsXG4gICAgICB0aGlzLl9vbmNsb3NlID0gbnVsbFxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0RXZlbnRNYXA+KFxuICAgIHR5cGU6IEssXG4gICAgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2ZW50OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gdm9pZCxcbiAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zXG4gICk6IHZvaWRcbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICAgIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnNcbiAgKTogdm9pZFxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihcbiAgICB0eXBlOiB1bmtub3duLFxuICAgIGxpc3RlbmVyOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiB1bmtub3duXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBzdXBlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgdHlwZSBhcyBzdHJpbmcsXG4gICAgICBsaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgb3B0aW9ucyBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuICAgIClcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEV2ZW50TWFwPihcbiAgICB0eXBlOiBLLFxuICAgIGNhbGxiYWNrOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0IHwgbnVsbCxcbiAgICBvcHRpb25zPzogYm9vbGVhbiB8IEV2ZW50TGlzdGVuZXJPcHRpb25zXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBzdXBlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGFTaXplKGRhdGE6IFdlYlNvY2tldERhdGEpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoXG4gIH1cblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICByZXR1cm4gZGF0YS5zaXplXG4gIH1cblxuICByZXR1cm4gZGF0YS5ieXRlTGVuZ3RoXG59XG4iLCAiaW1wb3J0IHsgYmluZEV2ZW50IH0gZnJvbSAnLi91dGlscy9iaW5kRXZlbnQnXG5pbXBvcnQge1xuICBTdHJpY3RFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICBXZWJTb2NrZXREYXRhLFxuICBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gIFdlYlNvY2tldFRyYW5zcG9ydEV2ZW50TWFwLFxufSBmcm9tICcuL1dlYlNvY2tldFRyYW5zcG9ydCdcbmltcG9ydCB7IGtPblNlbmQsIGtDbG9zZSwgV2ViU29ja2V0T3ZlcnJpZGUgfSBmcm9tICcuL1dlYlNvY2tldE92ZXJyaWRlJ1xuaW1wb3J0IHsgQ2FuY2VsYWJsZU1lc3NhZ2VFdmVudCwgQ2xvc2VFdmVudCB9IGZyb20gJy4vdXRpbHMvZXZlbnRzJ1xuXG4vKipcbiAqIEFic3RyYWN0aW9uIG92ZXIgdGhlIGdpdmVuIG1vY2sgYFdlYlNvY2tldGAgaW5zdGFuY2UgdGhhdCBhbGxvd3NcbiAqIGZvciBjb250cm9sbGluZyB0aGF0IGluc3RhbmNlIChlLmcuIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBtZXNzYWdlcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRDbGFzc1RyYW5zcG9ydFxuICBleHRlbmRzIEV2ZW50VGFyZ2V0XG4gIGltcGxlbWVudHMgV2ViU29ja2V0VHJhbnNwb3J0XG57XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IFdlYlNvY2tldE92ZXJyaWRlKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgLy8gRW1pdCB0aGUgXCJjbG9zZVwiIGV2ZW50IG9uIHRoZSB0cmFuc3BvcnQgaWYgdGhlIGNsb3NlXG4gICAgLy8gb3JpZ2luYXRlcyBmcm9tIHRoZSBXZWJTb2NrZXQgY2xpZW50LiBFLmcuIHRoZSBhcHBsaWNhdGlvblxuICAgIC8vIGNhbGxzIFwid3MuY2xvc2UoKVwiLCBub3QgdGhlIGludGVyY2VwdG9yLlxuICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoYmluZEV2ZW50KHRoaXMuc29ja2V0LCBuZXcgQ2xvc2VFdmVudCgnY2xvc2UnLCBldmVudCkpKVxuICAgIH0pXG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHRoZSBcIm91dGdvaW5nXCIgZXZlbnQgb24gdGhlIHRyYW5zcG9ydFxuICAgICAqIHdoZW5ldmVyIHRoZSBXZWJTb2NrZXQgY2xpZW50IHNlbmRzIGRhdGEgKFwid3Muc2VuZCgpXCIpLlxuICAgICAqL1xuICAgIHRoaXMuc29ja2V0W2tPblNlbmRdID0gKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgYmluZEV2ZW50KFxuICAgICAgICAgIHRoaXMuc29ja2V0LFxuICAgICAgICAgIC8vIERpc3BhdGNoIHRoaXMgYXMgY2FuY2VsYWJsZSBiZWNhdXNlIFwiY2xpZW50XCIgY29ubmVjdGlvblxuICAgICAgICAgIC8vIHJlLWNyZWF0ZXMgdGhpcyBtZXNzYWdlIGV2ZW50IChjYW5ub3QgZGlzcGF0Y2ggdGhlIHNhbWUgZXZlbnQpLlxuICAgICAgICAgIG5ldyBDYW5jZWxhYmxlTWVzc2FnZUV2ZW50KCdvdXRnb2luZycsIHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuc29ja2V0LnVybCxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyPEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIFdlYlNvY2tldFRyYW5zcG9ydEV2ZW50TWFwPihcbiAgICB0eXBlOiBFdmVudFR5cGUsXG4gICAgY2FsbGJhY2s6IFN0cmljdEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3Q8XG4gICAgICBXZWJTb2NrZXRUcmFuc3BvcnRFdmVudE1hcFtFdmVudFR5cGVdXG4gICAgPiB8IG51bGwsXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuICApOiB2b2lkIHtcbiAgICByZXR1cm4gc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLCBvcHRpb25zKVxuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoRXZlbnQ8RXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0VHJhbnNwb3J0RXZlbnRNYXA+KFxuICAgIGV2ZW50OiBXZWJTb2NrZXRUcmFuc3BvcnRFdmVudE1hcFtFdmVudFR5cGVdXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICB9XG5cbiAgcHVibGljIHNlbmQoZGF0YTogV2ViU29ja2V0RGF0YSk6IHZvaWQge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuQ0xPU0lORyB8fFxuICAgICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5DTE9TRURcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlzcGF0Y2hFdmVudCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBiaW5kRXZlbnQoXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBub3RlIFNldHRpbmcgdGhpcyBldmVudCdzIFwidGFyZ2V0XCIgdG8gdGhlXG4gICAgICAgICAgICAgKiBXZWJTb2NrZXQgb3ZlcnJpZGUgaW5zdGFuY2UgaXMgaW1wb3J0YW50LlxuICAgICAgICAgICAgICogVGhpcyB3YXkgaXQgY2FuIHRlbGwgYXBhcnQgb3JpZ2luYWwgaW5jb21pbmcgZXZlbnRzXG4gICAgICAgICAgICAgKiAobXVzdCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRyYW5zcG9ydCkgZnJvbSB0aGVcbiAgICAgICAgICAgICAqIG1vY2tlZCBtZXNzYWdlIGV2ZW50cyBsaWtlIHRoZSBvbmUgYmVsb3dcbiAgICAgICAgICAgICAqIChtdXN0IGJlIGRpc3BhdGNoZWQgb24gdGhlIGNsaWVudCBpbnN0YW5jZSkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LFxuICAgICAgICAgICAgbmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgb3JpZ2luOiB0aGlzLnNvY2tldC51cmwsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuQ09OTkVDVElORykge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICdvcGVuJyxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBkaXNwYXRjaEV2ZW50KClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgY2xvc2UoY29kZTogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBAbm90ZSBDYWxsIHRoZSBpbnRlcm5hbCBjbG9zZSBtZXRob2QgZGlyZWN0bHlcbiAgICAgKiB0byBhbGxvdyBjbG9zaW5nIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIHN0YXR1cyBjb2Rlc1xuICAgICAqIHRoYXQgYXJlIG5vbi1jb25maWd1cmFibGUgYnkgdGhlIHVzZXIgKD4gMTAwMCA8PSAxMDE1KS5cbiAgICAgKi9cbiAgICB0aGlzLnNvY2tldFtrQ2xvc2VdKGNvZGUsIHJlYXNvbilcbiAgfVxufVxuIiwgImltcG9ydCB7IEludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vSW50ZXJjZXB0b3InXG5pbXBvcnQge1xuICBXZWJTb2NrZXRDbGllbnRDb25uZWN0aW9uUHJvdG9jb2wsXG4gIFdlYlNvY2tldENsaWVudENvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0Q2xpZW50RXZlbnRNYXAsXG59IGZyb20gJy4vV2ViU29ja2V0Q2xpZW50Q29ubmVjdGlvbidcbmltcG9ydCB7XG4gIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb25Qcm90b2NvbCxcbiAgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbixcbiAgdHlwZSBXZWJTb2NrZXRTZXJ2ZXJFdmVudE1hcCxcbn0gZnJvbSAnLi9XZWJTb2NrZXRTZXJ2ZXJDb25uZWN0aW9uJ1xuaW1wb3J0IHsgV2ViU29ja2V0Q2xhc3NUcmFuc3BvcnQgfSBmcm9tICcuL1dlYlNvY2tldENsYXNzVHJhbnNwb3J0J1xuaW1wb3J0IHtcbiAga0Nsb3NlLFxuICBrUGFzc3Rocm91Z2hQcm9taXNlLFxuICBXZWJTb2NrZXRPdmVycmlkZSxcbn0gZnJvbSAnLi9XZWJTb2NrZXRPdmVycmlkZSdcbmltcG9ydCB7IGJpbmRFdmVudCB9IGZyb20gJy4vdXRpbHMvYmluZEV2ZW50J1xuaW1wb3J0IHsgaGFzQ29uZmlndXJhYmxlR2xvYmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGFzQ29uZmlndXJhYmxlR2xvYmFsJ1xuaW1wb3J0IHsgZW1pdEFzeW5jIH0gZnJvbSAnLi4vLi4vdXRpbHMvZW1pdEFzeW5jJ1xuXG5leHBvcnQgeyB0eXBlIFdlYlNvY2tldERhdGEsIFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vV2ViU29ja2V0VHJhbnNwb3J0J1xuZXhwb3J0IHtcbiAgV2ViU29ja2V0Q2xpZW50RXZlbnRNYXAsXG4gIFdlYlNvY2tldENsaWVudENvbm5lY3Rpb25Qcm90b2NvbCxcbiAgV2ViU29ja2V0Q2xpZW50Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0U2VydmVyRXZlbnRNYXAsXG4gIFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb25Qcm90b2NvbCxcbiAgV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvbixcbn1cblxuZXhwb3J0IHtcbiAgQ2xvc2VFdmVudCxcbiAgQ2FuY2VsYWJsZUNsb3NlRXZlbnQsXG4gIENhbmNlbGFibGVNZXNzYWdlRXZlbnQsXG59IGZyb20gJy4vdXRpbHMvZXZlbnRzJ1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRFdmVudE1hcCA9IHtcbiAgY29ubmVjdGlvbjogW2FyZ3M6IFdlYlNvY2tldENvbm5lY3Rpb25EYXRhXVxufVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uRGF0YSA9IHtcbiAgLyoqXG4gICAqIFRoZSBpbmNvbWluZyBXZWJTb2NrZXQgY2xpZW50IGNvbm5lY3Rpb24uXG4gICAqL1xuICBjbGllbnQ6IFdlYlNvY2tldENsaWVudENvbm5lY3Rpb25cblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIFdlYlNvY2tldCBzZXJ2ZXIgY29ubmVjdGlvbi5cbiAgICovXG4gIHNlcnZlcjogV2ViU29ja2V0U2VydmVyQ29ubmVjdGlvblxuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGluZm86IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvdG9jb2xzIHN1cHBvcnRlZCBieSB0aGUgV2ViU29ja2V0IGNsaWVudC5cbiAgICAgKi9cbiAgICBwcm90b2NvbHM6IHN0cmluZyB8IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEludGVyY2VwdCB0aGUgb3V0Z29pbmcgV2ViU29ja2V0IGNvbm5lY3Rpb25zIGNyZWF0ZWQgdXNpbmdcbiAqIHRoZSBnbG9iYWwgYFdlYlNvY2tldGAgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRJbnRlcmNlcHRvciBleHRlbmRzIEludGVyY2VwdG9yPFdlYlNvY2tldEV2ZW50TWFwPiB7XG4gIHN0YXRpYyBzeW1ib2wgPSBTeW1ib2woJ3dlYnNvY2tldCcpXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoV2ViU29ja2V0SW50ZXJjZXB0b3Iuc3ltYm9sKVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhhc0NvbmZpZ3VyYWJsZUdsb2JhbCgnV2ViU29ja2V0JylcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cCgpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbFdlYlNvY2tldERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICdXZWJTb2NrZXQnXG4gICAgKVxuXG4gICAgY29uc3QgV2ViU29ja2V0UHJveHkgPSBuZXcgUHJveHkoZ2xvYmFsVGhpcy5XZWJTb2NrZXQsIHtcbiAgICAgIGNvbnN0cnVjdDogKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgZ2xvYmFsVGhpcy5XZWJTb2NrZXQ+LFxuICAgICAgICBuZXdUYXJnZXRcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBbdXJsLCBwcm90b2NvbHNdID0gYXJnc1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZUNvbm5lY3Rpb24gPSAoKTogV2ViU29ja2V0ID0+IHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGwgV2ViU29ja2V0IGluc3RhbmNlcyBhcmUgbW9ja2VkIGFuZCBkb24ndCBmb3J3YXJkXG4gICAgICAgIC8vIGFueSBldmVudHMgdG8gdGhlIG9yaWdpbmFsIHNlcnZlciAobm8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCkuXG4gICAgICAgIC8vIFRvIGZvcndhcmQgdGhlIGV2ZW50cywgdGhlIHVzZXIgbXVzdCB1c2UgdGhlIFwic2VydmVyLnNlbmQoKVwiIEFQSS5cbiAgICAgICAgY29uc3Qgc29ja2V0ID0gbmV3IFdlYlNvY2tldE92ZXJyaWRlKHVybCwgcHJvdG9jb2xzKVxuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0Q2xhc3NUcmFuc3BvcnQoc29ja2V0KVxuXG4gICAgICAgIC8vIEVtaXQgdGhlIFwiY29ubmVjdGlvblwiIGV2ZW50IHRvIHRoZSBpbnRlcmNlcHRvciBvbiB0aGUgbmV4dCB0aWNrXG4gICAgICAgIC8vIHNvIHRoZSBjbGllbnQgY2FuIG1vZGlmeSBXZWJTb2NrZXQgb3B0aW9ucywgbGlrZSBcImJpbmFyeVR5cGVcIlxuICAgICAgICAvLyB3aGlsZSB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IHBlbmRpbmcuXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmVyID0gbmV3IFdlYlNvY2tldFNlcnZlckNvbm5lY3Rpb24oXG4gICAgICAgICAgICAgIHNvY2tldCxcbiAgICAgICAgICAgICAgdHJhbnNwb3J0LFxuICAgICAgICAgICAgICBjcmVhdGVDb25uZWN0aW9uXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGhhc0Nvbm5lY3Rpb25MaXN0ZW5lcnMgPVxuICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIubGlzdGVuZXJDb3VudCgnY29ubmVjdGlvbicpID4gMFxuXG4gICAgICAgICAgICAvLyBUaGUgXCJnbG9iYWxUaGlzLldlYlNvY2tldFwiIGNsYXNzIHN0YW5kcyBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjbGllbnQtc2lkZSBjb25uZWN0aW9uLiBBc3N1bWUgaXQncyBlc3RhYmxpc2hlZFxuICAgICAgICAgICAgLy8gYXMgc29vbiBhcyB0aGUgV2ViU29ja2V0IGluc3RhbmNlIGlzIGNvbnN0cnVjdGVkLlxuICAgICAgICAgICAgYXdhaXQgZW1pdEFzeW5jKHRoaXMuZW1pdHRlciwgJ2Nvbm5lY3Rpb24nLCB7XG4gICAgICAgICAgICAgIGNsaWVudDogbmV3IFdlYlNvY2tldENsaWVudENvbm5lY3Rpb24oc29ja2V0LCB0cmFuc3BvcnQpLFxuICAgICAgICAgICAgICBzZXJ2ZXIsXG4gICAgICAgICAgICAgIGluZm86IHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoaGFzQ29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgICAgICAgICBzb2NrZXRba1Bhc3N0aHJvdWdoUHJvbWlzZV0ucmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvY2tldFtrUGFzc3Rocm91Z2hQcm9taXNlXS5yZXNvbHZlKHRydWUpXG5cbiAgICAgICAgICAgICAgc2VydmVyLmNvbm5lY3QoKVxuXG4gICAgICAgICAgICAgIC8vIEZvcndhcmQgdGhlIFwib3BlblwiIGV2ZW50IGZyb20gdGhlIG9yaWdpbmFsIHNlcnZlclxuICAgICAgICAgICAgICAvLyB0byB0aGUgbW9jayBXZWJTb2NrZXQgY2xpZW50IGluIHRoZSBjYXNlIG9mIGEgcGFzc3Rocm91Z2ggY29ubmVjdGlvbi5cbiAgICAgICAgICAgICAgc2VydmVyLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc29ja2V0LmRpc3BhdGNoRXZlbnQoYmluZEV2ZW50KHNvY2tldCwgbmV3IEV2ZW50KCdvcGVuJykpKVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yd2FyZCB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbiBwcm90b2NvbCB0byB0aGVcbiAgICAgICAgICAgICAgICAvLyBtb2NrIFdlYlNvY2tldCBjbGllbnQuXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZlclsncmVhbFdlYlNvY2tldCddKSB7XG4gICAgICAgICAgICAgICAgICBzb2NrZXQucHJvdG9jb2wgPSBzZXJ2ZXJbJ3JlYWxXZWJTb2NrZXQnXS5wcm90b2NvbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAbm90ZSBUcmFuc2xhdGUgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgZHVyaW5nIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICAgKiBoYW5kbGluZyAoaS5lLiBpbnRlcmNlcHRvciBleGNlcHRpb25zKSBhcyBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICAgICAgICogY2xvc3VyZXMgd2l0aCBlcnJvci4gVGhpcyBwcmV2ZW50cyBmcm9tIHRoZSBleGNlcHRpb25zIG9jY3VycmluZ1xuICAgICAgICAgICAgICogaW4gYHF1ZXVlTWljcm90YXNrYCBmcm9tIGJlaW5nIHByb2Nlc3Mtd2lkZSBhbmQgdW5jYXRjaGFibGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHNvY2tldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXJyb3InKSlcblxuICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGlmIGl0J3MgYWxyZWFkeSBiZWluZyBjbG9zZWQuXG4gICAgICAgICAgICAgIC8vIEUuZy4gdGhlIGludGVyY2VwdG9yIGNhbGxlZCBgY2xpZW50LmNsb3NlKClgIGFuZCB0aGVuIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TSU5HICYmXG4gICAgICAgICAgICAgICAgc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TRURcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0W2tDbG9zZV0oMTAxMSwgZXJyb3IubWVzc2FnZSwgZmFsc2UpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gc29ja2V0XG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgJ1dlYlNvY2tldCcsIHtcbiAgICAgIHZhbHVlOiBXZWJTb2NrZXRQcm94eSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goKCkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAnV2ViU29ja2V0JyxcbiAgICAgICAgb3JpZ2luYWxXZWJTb2NrZXREZXNjcmlwdG9yIVxuICAgICAgKVxuICAgIH0pXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBXZWJTb2NrZXRJbnRlcmNlcHRvciB9IGZyb20gJ0Btc3dqcy9pbnRlcmNlcHRvcnMvV2ViU29ja2V0J1xuXG5leHBvcnQgY29uc3Qgd2ViU29ja2V0SW50ZXJjZXB0b3IgPSBuZXcgV2ViU29ja2V0SW50ZXJjZXB0b3IoKVxuIiwgImltcG9ydCB0eXBlIHsgV2ViU29ja2V0Q29ubmVjdGlvbkRhdGEgfSBmcm9tICdAbXN3anMvaW50ZXJjZXB0b3JzL1dlYlNvY2tldCdcbmltcG9ydCB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUmVxdWVzdEhhbmRsZXInXG5pbXBvcnQgeyBXZWJTb2NrZXRIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvV2ViU29ja2V0SGFuZGxlcidcbmltcG9ydCB7IHdlYlNvY2tldEludGVyY2VwdG9yIH0gZnJvbSAnLi93ZWJTb2NrZXRJbnRlcmNlcHRvcidcbmltcG9ydCB7XG4gIG9uVW5oYW5kbGVkUmVxdWVzdCxcbiAgVW5oYW5kbGVkUmVxdWVzdFN0cmF0ZWd5LFxufSBmcm9tICcuLi91dGlscy9yZXF1ZXN0L29uVW5oYW5kbGVkUmVxdWVzdCdcbmltcG9ydCB7IGlzSGFuZGxlcktpbmQgfSBmcm9tICcuLi91dGlscy9pbnRlcm5hbC9pc0hhbmRsZXJLaW5kJ1xuXG5pbnRlcmZhY2UgSGFuZGxlV2ViU29ja2V0RXZlbnRPcHRpb25zIHtcbiAgZ2V0VW5oYW5kbGVkUmVxdWVzdFN0cmF0ZWd5OiAoKSA9PiBVbmhhbmRsZWRSZXF1ZXN0U3RyYXRlZ3lcbiAgZ2V0SGFuZGxlcnM6ICgpID0+IEFycmF5PFJlcXVlc3RIYW5kbGVyIHwgV2ViU29ja2V0SGFuZGxlcj5cbiAgb25Nb2NrZWRDb25uZWN0aW9uOiAoY29ubmVjdGlvbjogV2ViU29ja2V0Q29ubmVjdGlvbkRhdGEpID0+IHZvaWRcbiAgb25QYXNzdGhyb3VnaENvbm5lY3Rpb246IChvbm5lY3Rpb246IFdlYlNvY2tldENvbm5lY3Rpb25EYXRhKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVXZWJTb2NrZXRFdmVudChvcHRpb25zOiBIYW5kbGVXZWJTb2NrZXRFdmVudE9wdGlvbnMpIHtcbiAgd2ViU29ja2V0SW50ZXJjZXB0b3Iub24oJ2Nvbm5lY3Rpb24nLCBhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gb3B0aW9ucy5nZXRIYW5kbGVycygpLmZpbHRlcihpc0hhbmRsZXJLaW5kKCdFdmVudEhhbmRsZXInKSlcblxuICAgIC8vIElnbm9yZSB0aGlzIGNvbm5lY3Rpb24gaWYgdGhlIHVzZXIgaGFzbid0IGRlZmluZWQgYW55IGhhbmRsZXJzLlxuICAgIGlmIChoYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zPy5vbk1vY2tlZENvbm5lY3Rpb24oY29ubmVjdGlvbilcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGhhbmRsZXJzLm1hcCgoaGFuZGxlcikgPT4ge1xuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaGFuZGxlcnMgYW5kIGZvcndhcmQgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAvLyBldmVudCB0byBXZWJTb2NrZXQgZXZlbnQgaGFuZGxlcnMuIFRoaXMgaXMgZXF1aXZhbGVudFxuICAgICAgICAgIC8vIHRvIGRpc3BhdGNoaW5nIHRoYXQgZXZlbnQgb250byBtdWx0aXBsZSBsaXN0ZW5lcnMuXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIucnVuKGNvbm5lY3Rpb24pXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgYSByZXF1ZXN0IHJlcHJlc2VudGluZyB0aGlzIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChjb25uZWN0aW9uLmNsaWVudC51cmwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgdXBncmFkZTogJ3dlYnNvY2tldCcsXG4gICAgICAgIGNvbm5lY3Rpb246ICd1cGdyYWRlJyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBhd2FpdCBvblVuaGFuZGxlZFJlcXVlc3QoXG4gICAgICByZXF1ZXN0LFxuICAgICAgb3B0aW9ucy5nZXRVbmhhbmRsZWRSZXF1ZXN0U3RyYXRlZ3koKSxcbiAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc3QgZXJyb3JFdmVudCA9IG5ldyBFdmVudCgnZXJyb3InKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yRXZlbnQsICdjYXVzZScsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IGVycm9yLFxuICAgICAgfSlcbiAgICAgIGNvbm5lY3Rpb24uY2xpZW50LnNvY2tldC5kaXNwYXRjaEV2ZW50KGVycm9yRXZlbnQpXG4gICAgfSlcblxuICAgIG9wdGlvbnM/Lm9uUGFzc3Rocm91Z2hDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICAvLyBJZiBub25lIG9mIHRoZSBcIndzXCIgaGFuZGxlcnMgbWF0Y2hlZCxcbiAgICAvLyBlc3RhYmxpc2ggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGFzLWlzLlxuICAgIGNvbm5lY3Rpb24uc2VydmVyLmNvbm5lY3QoKVxuICB9KVxufVxuIiwgImludGVyZmFjZSBHZXRUaW1lc3RhbXBPcHRpb25zIHtcbiAgbWlsbGlzZWNvbmRzPzogYm9vbGVhblxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgc3RyaW5nIGluIGEgXCJISDpNTTpTU1wiIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVzdGFtcChvcHRpb25zPzogR2V0VGltZXN0YW1wT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgdGltZXN0YW1wID0gYCR7bm93LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke25vdy5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke25vdy5nZXRTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWBcblxuICBpZiAob3B0aW9ucz8ubWlsbGlzZWNvbmRzKSB7XG4gICAgcmV0dXJuIGAke3RpbWVzdGFtcH0uJHtub3cuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpfWBcbiAgfVxuXG4gIHJldHVybiB0aW1lc3RhbXBcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFdlYlNvY2tldERhdGEgfSBmcm9tICdAbXN3anMvaW50ZXJjZXB0b3JzL1dlYlNvY2tldCdcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gV2ViU29ja2V0IG1lc3NhZ2UuXG4gKiBAZXhhbXBsZVxuICogZ2V0TWVzc2FnZUxlbmd0aCgnaGVsbG8nKSAvLyA1XG4gKiBnZXRNZXNzYWdlTGVuZ3RoKG5ldyBCbG9iKFsnaGVsbG8nXSkpIC8vIDVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VMZW5ndGgoZGF0YTogV2ViU29ja2V0RGF0YSk6IG51bWJlciB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgIHJldHVybiBkYXRhLnNpemVcbiAgfVxuXG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZGF0YS5ieXRlTGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbmV3IEJsb2IoW2RhdGEgYXMgYW55XSkuc2l6ZVxufVxuIiwgImNvbnN0IE1BWF9MRU5HVEggPSAyNFxuXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChtZXNzYWdlLmxlbmd0aCA8PSBNQVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfVxuXG4gIHJldHVybiBgJHttZXNzYWdlLnNsaWNlKDAsIE1BWF9MRU5HVEgpfeKApmBcbn1cbiIsICJpbXBvcnQgeyBXZWJTb2NrZXREYXRhIH0gZnJvbSAnQG1zd2pzL2ludGVyY2VwdG9ycy9XZWJTb2NrZXQnXG5pbXBvcnQgeyB0cnVuY2F0ZU1lc3NhZ2UgfSBmcm9tICcuL3RydW5jYXRlTWVzc2FnZSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFB1YmxpY0RhdGEoZGF0YTogV2ViU29ja2V0RGF0YSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkYXRhLnRleHQoKVxuICAgIHJldHVybiBgQmxvYigke3RydW5jYXRlTWVzc2FnZSh0ZXh0KX0pYFxuICB9XG5cbiAgLy8gSGFuZGxlIGFsbCBBcnJheUJ1ZmZlci1saWtlIG9iamVjdHMuXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2J5dGVMZW5ndGgnIGluIGRhdGEpIHtcbiAgICBjb25zdCB0ZXh0ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRhdGEgYXMgQXJyYXlCdWZmZXIpXG4gICAgcmV0dXJuIGBBcnJheUJ1ZmZlcigke3RydW5jYXRlTWVzc2FnZSh0ZXh0KX0pYFxuICB9XG5cbiAgcmV0dXJuIHRydW5jYXRlTWVzc2FnZShkYXRhKVxufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgV2ViU29ja2V0Q2xpZW50Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0Q29ubmVjdGlvbkRhdGEsXG4gIFdlYlNvY2tldERhdGEsXG59IGZyb20gJ0Btc3dqcy9pbnRlcmNlcHRvcnMvV2ViU29ja2V0J1xuaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcm5hbC9kZXZVdGlscydcbmltcG9ydCB7IGdldFRpbWVzdGFtcCB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dpbmcvZ2V0VGltZXN0YW1wJ1xuaW1wb3J0IHsgdG9QdWJsaWNVcmwgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0L3RvUHVibGljVXJsJ1xuaW1wb3J0IHsgZ2V0TWVzc2FnZUxlbmd0aCB9IGZyb20gJy4vZ2V0TWVzc2FnZUxlbmd0aCdcbmltcG9ydCB7IGdldFB1YmxpY0RhdGEgfSBmcm9tICcuL2dldFB1YmxpY0RhdGEnXG5cbmNvbnN0IGNvbG9ycyA9IHtcbiAgc3lzdGVtOiAnIzNiODJmNicsXG4gIG91dGdvaW5nOiAnIzIyYzU1ZScsXG4gIGluY29taW5nOiAnI2VmNDQ0NCcsXG4gIG1vY2tlZDogJyNmZjZhMzMnLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoV2ViU29ja2V0TG9nZ2VyKFxuICBjb25uZWN0aW9uOiBXZWJTb2NrZXRDb25uZWN0aW9uRGF0YSxcbik6IHZvaWQge1xuICBjb25zdCB7IGNsaWVudCwgc2VydmVyIH0gPSBjb25uZWN0aW9uXG5cbiAgbG9nQ29ubmVjdGlvbk9wZW4oY2xpZW50KVxuXG4gIC8vIExvZyB0aGUgZXZlbnRzIHNlbnQgZnJvbSB0aGUgV2ViU29ja2V0IGNsaWVudC5cbiAgLy8gV2ViU29ja2V0IGNsaWVudCBjb25uZWN0aW9uIG9iamVjdCBpcyB3cml0dGVuIGZyb20gdGhlXG4gIC8vIHNlcnZlcidzIHBlcnNwZWN0aXZlIHNvIHRoZXNlIG1lc3NhZ2UgZXZlbnRzIGFyZSBvdXRnb2luZy5cbiAgLyoqXG4gICAqIEB0b2RvIFByb3ZpZGUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZXhhY3QgZXZlbnQgaGFuZGxlclxuICAgKiB0aGF0IGNhbGxlZCB0aGlzIGBjbGllbnQuc2VuZCgpYC5cbiAgICovXG4gIGNsaWVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgbG9nT3V0Z29pbmdDbGllbnRNZXNzYWdlKGV2ZW50KVxuICB9KVxuXG4gIGNsaWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIChldmVudCkgPT4ge1xuICAgIGxvZ0Nvbm5lY3Rpb25DbG9zZShldmVudClcbiAgfSlcblxuICAvLyBMb2cgY2xpZW50IGVycm9ycyAoY29ubmVjdGlvbiBjbG9zdXJlcyBkdWUgdG8gZXJyb3JzKS5cbiAgY2xpZW50LnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4ge1xuICAgIGxvZ0NsaWVudEVycm9yKGV2ZW50KVxuICB9KVxuXG4gIGNsaWVudC5zZW5kID0gbmV3IFByb3h5KGNsaWVudC5zZW5kLCB7XG4gICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgICBjb25zdCBbZGF0YV0gPSBhcmdzXG4gICAgICBjb25zdCBtZXNzYWdlRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywgeyBkYXRhIH0pXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtZXNzYWdlRXZlbnQsIHtcbiAgICAgICAgY3VycmVudFRhcmdldDoge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBjbGllbnQuc29ja2V0LFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogY2xpZW50LnNvY2tldCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgbG9nSW5jb21pbmdNb2NrZWRDbGllbnRNZXNzYWdlKG1lc3NhZ2VFdmVudClcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncylcbiAgICB9LFxuICB9KVxuXG4gIHNlcnZlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICdvcGVuJyxcbiAgICAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICBsb2dJbmNvbWluZ1NlcnZlck1lc3NhZ2UoZXZlbnQpXG4gICAgICB9KVxuICAgIH0sXG4gICAgeyBvbmNlOiB0cnVlIH0sXG4gIClcblxuICAvLyBMb2cgb3V0Z29pbmcgY2xpZW50IGV2ZW50cyBpbml0aWF0ZWQgYnkgdGhlIGV2ZW50IGhhbmRsZXIuXG4gIC8vIFRoZSBhY3R1YWwgY2xpZW50IG5ldmVyIHNlbnQgdGhlc2UgYnV0IHRoZSBoYW5kbGVyIGRpZC5cbiAgc2VydmVyLnNlbmQgPSBuZXcgUHJveHkoc2VydmVyLnNlbmQsIHtcbiAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICAgIGNvbnN0IFtkYXRhXSA9IGFyZ3NcbiAgICAgIGNvbnN0IG1lc3NhZ2VFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQoJ21lc3NhZ2UnLCB7IGRhdGEgfSlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1lc3NhZ2VFdmVudCwge1xuICAgICAgICBjdXJyZW50VGFyZ2V0OiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IHNlcnZlci5zb2NrZXQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBzZXJ2ZXIuc29ja2V0LFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgbG9nT3V0Z29pbmdNb2NrZWRDbGllbnRNZXNzYWdlKG1lc3NhZ2VFdmVudClcblxuICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKVxuICAgIH0sXG4gIH0pXG59XG5cbi8qKlxuICogUHJpbnRzIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgbG9nZ2VkIGJ5IGV2ZXJ5IFdlYlNvY2tldCBoYW5kbGVyXG4gKiB0aGF0IGludGVyY2VwdGVkIHRoaXMgY29ubmVjdGlvbi4gVGhpcyBoZWxwcyB5b3Ugc2VlXG4gKiB3aGF0IGhhbmRsZXJzIG9ic2VydmUgdGhpcyBjb25uZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nQ29ubmVjdGlvbk9wZW4oY2xpZW50OiBXZWJTb2NrZXRDbGllbnRDb25uZWN0aW9uKSB7XG4gIGNvbnN0IHB1YmxpY1VybCA9IHRvUHVibGljVXJsKGNsaWVudC51cmwpXG5cbiAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICBkZXZVdGlscy5mb3JtYXRNZXNzYWdlKGAke2dldFRpbWVzdGFtcCgpfSAlY+KWtiVjICR7cHVibGljVXJsfWApLFxuICAgIGBjb2xvcjoke2NvbG9ycy5zeXN0ZW19YCxcbiAgICAnY29sb3I6aW5oZXJpdCcsXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coJ0NsaWVudDonLCBjbGllbnQuc29ja2V0KVxuICBjb25zb2xlLmdyb3VwRW5kKClcbn1cblxuZnVuY3Rpb24gbG9nQ29ubmVjdGlvbkNsb3NlKGV2ZW50OiBDbG9zZUV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBXZWJTb2NrZXRcbiAgY29uc3QgcHVibGljVXJsID0gdG9QdWJsaWNVcmwodGFyZ2V0LnVybClcblxuICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgIGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICBgJHtnZXRUaW1lc3RhbXAoeyBtaWxsaXNlY29uZHM6IHRydWUgfSl9ICVj4pagJWMgJHtwdWJsaWNVcmx9YCxcbiAgICApLFxuICAgIGBjb2xvcjoke2NvbG9ycy5zeXN0ZW19YCxcbiAgICAnY29sb3I6aW5oZXJpdCcsXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coZXZlbnQpXG4gIGNvbnNvbGUuZ3JvdXBFbmQoKVxufVxuXG5mdW5jdGlvbiBsb2dDbGllbnRFcnJvcihldmVudDogRXZlbnQpIHtcbiAgY29uc3Qgc29ja2V0ID0gZXZlbnQudGFyZ2V0IGFzIFdlYlNvY2tldFxuICBjb25zdCBwdWJsaWNVcmwgPSB0b1B1YmxpY1VybChzb2NrZXQudXJsKVxuXG4gIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgIGAke2dldFRpbWVzdGFtcCh7IG1pbGxpc2Vjb25kczogdHJ1ZSB9KX0gJWNcXHUwMEQ3JWMgJHtwdWJsaWNVcmx9YCxcbiAgICApLFxuICAgIGBjb2xvcjoke2NvbG9ycy5zeXN0ZW19YCxcbiAgICAnY29sb3I6aW5oZXJpdCcsXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coZXZlbnQpXG4gIGNvbnNvbGUuZ3JvdXBFbmQoKVxufVxuXG4vKipcbiAqIFByaW50cyB0aGUgb3V0Z29pbmcgY2xpZW50IG1lc3NhZ2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvZ091dGdvaW5nQ2xpZW50TWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50PFdlYlNvY2tldERhdGE+KSB7XG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBnZXRNZXNzYWdlTGVuZ3RoKGV2ZW50LmRhdGEpXG4gIGNvbnN0IHB1YmxpY0RhdGEgPSBhd2FpdCBnZXRQdWJsaWNEYXRhKGV2ZW50LmRhdGEpXG4gIGNvbnN0IGFycm93ID0gZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA/ICfih6EnIDogJ+KshidcblxuICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgIGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICBgJHtnZXRUaW1lc3RhbXAoeyBtaWxsaXNlY29uZHM6IHRydWUgfSl9ICVjJHthcnJvd30lYyAke3B1YmxpY0RhdGF9ICVjJHtieXRlTGVuZ3RofSVjYCxcbiAgICApLFxuICAgIGBjb2xvcjoke2NvbG9ycy5vdXRnb2luZ31gLFxuICAgICdjb2xvcjppbmhlcml0JyxcbiAgICAnY29sb3I6Z3JheTtmb250LXdlaWdodDpub3JtYWwnLFxuICAgICdjb2xvcjppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXQnLFxuICApXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKGV2ZW50KVxuICBjb25zb2xlLmdyb3VwRW5kKClcbn1cblxuLyoqXG4gKiBQcmludHMgdGhlIG91dGdvaW5nIGNsaWVudCBtZXNzYWdlIGluaXRpYXRlZFxuICogYnkgYHNlcnZlci5zZW5kKClgIGluIHRoZSBldmVudCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2dPdXRnb2luZ01vY2tlZENsaWVudE1lc3NhZ2UoXG4gIGV2ZW50OiBNZXNzYWdlRXZlbnQ8V2ViU29ja2V0RGF0YT4sXG4pIHtcbiAgY29uc3QgYnl0ZUxlbmd0aCA9IGdldE1lc3NhZ2VMZW5ndGgoZXZlbnQuZGF0YSlcbiAgY29uc3QgcHVibGljRGF0YSA9IGF3YWl0IGdldFB1YmxpY0RhdGEoZXZlbnQuZGF0YSlcblxuICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgIGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICBgJHtnZXRUaW1lc3RhbXAoeyBtaWxsaXNlY29uZHM6IHRydWUgfSl9ICVj4qyGJWMgJHtwdWJsaWNEYXRhfSAlYyR7Ynl0ZUxlbmd0aH0lY2AsXG4gICAgKSxcbiAgICBgY29sb3I6JHtjb2xvcnMubW9ja2VkfWAsXG4gICAgJ2NvbG9yOmluaGVyaXQnLFxuICAgICdjb2xvcjpncmF5O2ZvbnQtd2VpZ2h0Om5vcm1hbCcsXG4gICAgJ2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdCcsXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coZXZlbnQpXG4gIGNvbnNvbGUuZ3JvdXBFbmQoKVxufVxuXG4vKipcbiAqIFByaW50cyB0aGUgb3V0Z29pbmcgY2xpZW50IG1lc3NhZ2UgaW5pdGlhdGVkXG4gKiBieSBgY2xpZW50LnNlbmQoKWAgaW4gdGhlIGV2ZW50IGhhbmRsZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvZ0luY29taW5nTW9ja2VkQ2xpZW50TWVzc2FnZShcbiAgZXZlbnQ6IE1lc3NhZ2VFdmVudDxXZWJTb2NrZXREYXRhPixcbikge1xuICBjb25zdCBieXRlTGVuZ3RoID0gZ2V0TWVzc2FnZUxlbmd0aChldmVudC5kYXRhKVxuICBjb25zdCBwdWJsaWNEYXRhID0gYXdhaXQgZ2V0UHVibGljRGF0YShldmVudC5kYXRhKVxuXG4gIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgIGAke2dldFRpbWVzdGFtcCh7IG1pbGxpc2Vjb25kczogdHJ1ZSB9KX0gJWPirIclYyAke3B1YmxpY0RhdGF9ICVjJHtieXRlTGVuZ3RofSVjYCxcbiAgICApLFxuICAgIGBjb2xvcjoke2NvbG9ycy5tb2NrZWR9YCxcbiAgICAnY29sb3I6aW5oZXJpdCcsXG4gICAgJ2NvbG9yOmdyYXk7Zm9udC13ZWlnaHQ6bm9ybWFsJyxcbiAgICAnY29sb3I6aW5oZXJpdDtmb250LXdlaWdodDppbmhlcml0JyxcbiAgKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmxvZyhldmVudClcbiAgY29uc29sZS5ncm91cEVuZCgpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvZ0luY29taW5nU2VydmVyTWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50PFdlYlNvY2tldERhdGE+KSB7XG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBnZXRNZXNzYWdlTGVuZ3RoKGV2ZW50LmRhdGEpXG4gIGNvbnN0IHB1YmxpY0RhdGEgPSBhd2FpdCBnZXRQdWJsaWNEYXRhKGV2ZW50LmRhdGEpXG4gIGNvbnN0IGFycm93ID0gZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA/ICfih6MnIDogJ+KshydcblxuICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgIGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICBgJHtnZXRUaW1lc3RhbXAoeyBtaWxsaXNlY29uZHM6IHRydWUgfSl9ICVjJHthcnJvd30lYyAke3B1YmxpY0RhdGF9ICVjJHtieXRlTGVuZ3RofSVjYCxcbiAgICApLFxuICAgIGBjb2xvcjoke2NvbG9ycy5pbmNvbWluZ31gLFxuICAgICdjb2xvcjppbmhlcml0JyxcbiAgICAnY29sb3I6Z3JheTtmb250LXdlaWdodDpub3JtYWwnLFxuICAgICdjb2xvcjppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXQnLFxuICApXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKGV2ZW50KVxuICBjb25zb2xlLmdyb3VwRW5kKClcbn1cbiIsICJjb25zdCBQT1NJVElPTkFMU19FWFAgPSAvKCU/KSglKFtzZGlqb10pKS9nXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBvc2l0aW9uYWwocG9zaXRpb25hbDogYW55LCBmbGFnOiBzdHJpbmcpOiBhbnkge1xuICBzd2l0Y2ggKGZsYWcpIHtcbiAgICAvLyBTdHJpbmdzLlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIHBvc2l0aW9uYWxcblxuICAgIC8vIERpZ2l0cy5cbiAgICBjYXNlICdkJzpcbiAgICBjYXNlICdpJzpcbiAgICAgIHJldHVybiBOdW1iZXIocG9zaXRpb25hbClcblxuICAgIC8vIEpTT04uXG4gICAgY2FzZSAnaic6XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocG9zaXRpb25hbClcblxuICAgIC8vIE9iamVjdHMuXG4gICAgY2FzZSAnbyc6IHtcbiAgICAgIC8vIFByZXNlcnZlIHN0aW5ncyB0byBwcmV2ZW50IGV4dHJhIHF1b3RlcyBhcm91bmQgdGhlbS5cbiAgICAgIGlmICh0eXBlb2YgcG9zaXRpb25hbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uYWxcbiAgICAgIH1cblxuICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHBvc2l0aW9uYWwpXG5cbiAgICAgIC8vIElmIHRoZSBwb3NpdGlvbmFsIGlzbid0IHNlcmlhbGl6YWJsZSwgcmV0dXJuIGl0IGFzLWlzLlxuICAgICAgaWYgKGpzb24gPT09ICd7fScgfHwganNvbiA9PT0gJ1tdJyB8fCAvXlxcW29iamVjdCAuKz9cXF0kLy50ZXN0KGpzb24pKSB7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbmFsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBqc29uXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXQobWVzc2FnZTogc3RyaW5nLCAuLi5wb3NpdGlvbmFsczogYW55W10pOiBzdHJpbmcge1xuICBpZiAocG9zaXRpb25hbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfVxuXG4gIGxldCBwb3NpdGlvbmFsSW5kZXggPSAwXG4gIGxldCBmb3JtYXR0ZWRNZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKFxuICAgIFBPU0lUSU9OQUxTX0VYUCxcbiAgICAobWF0Y2gsIGlzRXNjYXBlZCwgXywgZmxhZykgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb25hbCA9IHBvc2l0aW9uYWxzW3Bvc2l0aW9uYWxJbmRleF1cbiAgICAgIGNvbnN0IHZhbHVlID0gc2VyaWFsaXplUG9zaXRpb25hbChwb3NpdGlvbmFsLCBmbGFnKVxuXG4gICAgICBpZiAoIWlzRXNjYXBlZCkge1xuICAgICAgICBwb3NpdGlvbmFsSW5kZXgrK1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoXG4gICAgfVxuICApXG5cbiAgLy8gQXBwZW5kIHVucmVzb2x2ZWQgcG9zaXRpb25hbHMgdG8gc3RyaW5nIGFzLWlzLlxuICBpZiAocG9zaXRpb25hbEluZGV4IDwgcG9zaXRpb25hbHMubGVuZ3RoKSB7XG4gICAgZm9ybWF0dGVkTWVzc2FnZSArPSBgICR7cG9zaXRpb25hbHMuc2xpY2UocG9zaXRpb25hbEluZGV4KS5qb2luKCcgJyl9YFxuICB9XG5cbiAgZm9ybWF0dGVkTWVzc2FnZSA9IGZvcm1hdHRlZE1lc3NhZ2UucmVwbGFjZSgvJXsyLDJ9L2csICclJylcblxuICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZVxufVxuIiwgImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJy4vZm9ybWF0J1xuXG5jb25zdCBTVEFDS19GUkFNRVNfVE9fSUdOT1JFID0gMlxuXG4vKipcbiAqIFJlbW92ZSB0aGUgXCJvdXR2YXJpYW50XCIgcGFja2FnZSB0cmFjZSBmcm9tIHRoZSBnaXZlbiBlcnJvci5cbiAqIFRoaXMgc2NvcGVzIGRvd24gdGhlIGVycm9yIHN0YWNrIHRvIHRoZSByZWxldmFudCBwYXJ0c1xuICogd2hlbiB1c2VkIGluIG90aGVyIGFwcGxpY2F0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY2xlYW5FcnJvclN0YWNrKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBpZiAoIWVycm9yLnN0YWNrKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuZXh0U3RhY2sgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJylcbiAgbmV4dFN0YWNrLnNwbGljZSgxLCBTVEFDS19GUkFNRVNfVE9fSUdOT1JFKVxuICBlcnJvci5zdGFjayA9IG5leHRTdGFjay5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY2xhc3MgSW52YXJpYW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbidcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLCAuLi5wb3NpdGlvbmFsczogYW55W10pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubWVzc2FnZSA9IGZvcm1hdChtZXNzYWdlLCAuLi5wb3NpdGlvbmFscylcbiAgICBjbGVhbkVycm9yU3RhY2sodGhpcylcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUVycm9yQ29uc3RydWN0b3Ige1xuICBuZXcgKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRXJyb3JGYWN0b3J5IHtcbiAgKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yXG59XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVycm9yID0gQ3VzdG9tRXJyb3JDb25zdHJ1Y3RvciB8IEN1c3RvbUVycm9yRmFjdG9yeVxuXG50eXBlIEludmFyaWFudCA9IHtcbiAgKFxuICAgIHByZWRpY2F0ZTogdW5rbm93bixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgLi4ucG9zaXRpb25hbHM6IGFueVtdXG4gICk6IGFzc2VydHMgcHJlZGljYXRlXG5cbiAgYXMoXG4gICAgRXJyb3JDb25zdHJ1Y3RvcjogQ3VzdG9tRXJyb3IsXG4gICAgcHJlZGljYXRlOiB1bmtub3duLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAuLi5wb3NpdGlvbmFsczogdW5rbm93bltdXG4gICk6IGFzc2VydHMgcHJlZGljYXRlXG59XG5cbmV4cG9ydCBjb25zdCBpbnZhcmlhbnQ6IEludmFyaWFudCA9IChcbiAgcHJlZGljYXRlLFxuICBtZXNzYWdlLFxuICAuLi5wb3NpdGlvbmFsc1xuKTogYXNzZXJ0cyBwcmVkaWNhdGUgPT4ge1xuICBpZiAoIXByZWRpY2F0ZSkge1xuICAgIHRocm93IG5ldyBJbnZhcmlhbnRFcnJvcihtZXNzYWdlLCAuLi5wb3NpdGlvbmFscylcbiAgfVxufVxuXG5pbnZhcmlhbnQuYXMgPSAoRXJyb3JDb25zdHJ1Y3RvciwgcHJlZGljYXRlLCBtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykgPT4ge1xuICBpZiAoIXByZWRpY2F0ZSkge1xuICAgIGNvbnN0IGZvcm1hdE1lc3NhZ2UgPVxuICAgICAgcG9zaXRpb25hbHMubGVuZ3RoID09PSAwID8gbWVzc2FnZSA6IGZvcm1hdChtZXNzYWdlLCAuLi5wb3NpdGlvbmFscylcbiAgICBsZXQgZXJyb3I6IEVycm9yXG5cbiAgICB0cnkge1xuICAgICAgZXJyb3IgPSBSZWZsZWN0LmNvbnN0cnVjdChFcnJvckNvbnN0cnVjdG9yIGFzIEN1c3RvbUVycm9yQ29uc3RydWN0b3IsIFtcbiAgICAgICAgZm9ybWF0TWVzc2FnZSxcbiAgICAgIF0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvciA9IChFcnJvckNvbnN0cnVjdG9yIGFzIEN1c3RvbUVycm9yRmFjdG9yeSkoZm9ybWF0TWVzc2FnZSlcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG4iLCAiLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYSBOb2RlLmpzIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVQcm9jZXNzKCk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEVsZWN0cm9uIChodHRwczovL3d3dy5lbGVjdHJvbmpzLm9yZy9kb2NzL2xhdGVzdC9hcGkvcHJvY2VzcyNwcm9jZXNzdHlwZS1yZWFkb25seSlcbiAgICBjb25zdCB0eXBlID0gKHByb2Nlc3MgYXMgYW55KS50eXBlXG4gICAgaWYgKHR5cGUgPT09ICdyZW5kZXJlcicgfHwgdHlwZSA9PT0gJ3dvcmtlcicpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuXG4gICAgcmV0dXJuICEhKFxuICAgICAgcHJvY2Vzcy52ZXJzaW9ucyAmJlxuICAgICAgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiZXhwb3J0IHR5cGUgUHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnIHwgJ2Z1bGZpbGxlZCcgfCAncmVqZWN0ZWQnXG5cbmV4cG9ydCB0eXBlIEV4ZWN1dG9yPFZhbHVlPiA9IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgUHJvbWlzZTxWYWx1ZT4+WzBdXG5leHBvcnQgdHlwZSBSZXNvbHZlRnVuY3Rpb248VmFsdWU+ID0gUGFyYW1ldGVyczxFeGVjdXRvcjxWYWx1ZT4+WzBdXG5leHBvcnQgdHlwZSBSZWplY3RGdW5jdGlvbjxSZWFzb24+ID0gUGFyYW1ldGVyczxFeGVjdXRvcjxSZWFzb24+PlsxXVxuXG5leHBvcnQgdHlwZSBEZWZlcnJlZFByb21pc2VFeGVjdXRvcjxJbnB1dCA9IG5ldmVyLCBPdXRwdXQgPSBJbnB1dD4gPSB7XG4gIChyZXNvbHZlPzogUmVzb2x2ZUZ1bmN0aW9uPElucHV0PiwgcmVqZWN0PzogUmVqZWN0RnVuY3Rpb248YW55Pik6IHZvaWRcblxuICByZXNvbHZlOiBSZXNvbHZlRnVuY3Rpb248SW5wdXQ+XG4gIHJlamVjdDogUmVqZWN0RnVuY3Rpb248YW55PlxuICByZXN1bHQ/OiBPdXRwdXRcbiAgc3RhdGU6IFByb21pc2VTdGF0ZVxuICByZWplY3Rpb25SZWFzb24/OiB1bmtub3duXG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmZXJyZWRFeGVjdXRvcjxcbiAgSW5wdXQgPSBuZXZlcixcbiAgT3V0cHV0ID0gSW5wdXRcbj4oKTogRGVmZXJyZWRQcm9taXNlRXhlY3V0b3I8SW5wdXQsIE91dHB1dD4ge1xuICBjb25zdCBleGVjdXRvciA9IDxEZWZlcnJlZFByb21pc2VFeGVjdXRvcjxJbnB1dCwgT3V0cHV0Pj4oKFxuICAgIHJlc29sdmUsXG4gICAgcmVqZWN0XG4gICkgPT4ge1xuICAgIGV4ZWN1dG9yLnN0YXRlID0gJ3BlbmRpbmcnXG5cbiAgICBleGVjdXRvci5yZXNvbHZlID0gKGRhdGEpID0+IHtcbiAgICAgIGlmIChleGVjdXRvci5zdGF0ZSAhPT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBleGVjdXRvci5yZXN1bHQgPSBkYXRhIGFzIE91dHB1dFxuXG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IDxWYWx1ZT4odmFsdWU6IFZhbHVlKSA9PiB7XG4gICAgICAgIGV4ZWN1dG9yLnN0YXRlID0gJ2Z1bGZpbGxlZCdcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKFxuICAgICAgICBkYXRhIGluc3RhbmNlb2YgUHJvbWlzZSA/IGRhdGEgOiBQcm9taXNlLnJlc29sdmUoZGF0YSkudGhlbihvbkZ1bGZpbGxlZClcbiAgICAgIClcbiAgICB9XG5cbiAgICBleGVjdXRvci5yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgICBpZiAoZXhlY3V0b3Iuc3RhdGUgIT09ICdwZW5kaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBleGVjdXRvci5zdGF0ZSA9ICdyZWplY3RlZCdcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiByZWplY3QoKGV4ZWN1dG9yLnJlamVjdGlvblJlYXNvbiA9IHJlYXNvbikpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBleGVjdXRvclxufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3IsXG4gIHR5cGUgUmVqZWN0RnVuY3Rpb24sXG4gIHR5cGUgUmVzb2x2ZUZ1bmN0aW9uLFxuICB0eXBlIERlZmVycmVkUHJvbWlzZUV4ZWN1dG9yLFxuICBjcmVhdGVEZWZlcnJlZEV4ZWN1dG9yLFxufSBmcm9tICcuL2NyZWF0ZURlZmVycmVkRXhlY3V0b3InXG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZFByb21pc2U8SW5wdXQsIE91dHB1dCA9IElucHV0PiBleHRlbmRzIFByb21pc2U8SW5wdXQ+IHtcbiAgI2V4ZWN1dG9yOiBEZWZlcnJlZFByb21pc2VFeGVjdXRvclxuXG4gIHB1YmxpYyByZXNvbHZlOiBSZXNvbHZlRnVuY3Rpb248T3V0cHV0PlxuICBwdWJsaWMgcmVqZWN0OiBSZWplY3RGdW5jdGlvbjxPdXRwdXQ+XG5cbiAgY29uc3RydWN0b3IoZXhlY3V0b3I6IEV4ZWN1dG9yPElucHV0PiB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgZGVmZXJyZWRFeGVjdXRvciA9IGNyZWF0ZURlZmVycmVkRXhlY3V0b3IoKVxuICAgIHN1cGVyKChvcmlnaW5hbFJlc29sdmUsIG9yaWdpbmFsUmVqZWN0KSA9PiB7XG4gICAgICBkZWZlcnJlZEV4ZWN1dG9yKG9yaWdpbmFsUmVzb2x2ZSwgb3JpZ2luYWxSZWplY3QpXG4gICAgICBleGVjdXRvcj8uKGRlZmVycmVkRXhlY3V0b3IucmVzb2x2ZSwgZGVmZXJyZWRFeGVjdXRvci5yZWplY3QpXG4gICAgfSlcblxuICAgIHRoaXMuI2V4ZWN1dG9yID0gZGVmZXJyZWRFeGVjdXRvclxuICAgIHRoaXMucmVzb2x2ZSA9IHRoaXMuI2V4ZWN1dG9yLnJlc29sdmVcbiAgICB0aGlzLnJlamVjdCA9IHRoaXMuI2V4ZWN1dG9yLnJlamVjdFxuICB9XG5cbiAgcHVibGljIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3Iuc3RhdGVcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVqZWN0aW9uUmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5yZWplY3Rpb25SZWFzb25cbiAgfVxuXG4gIHB1YmxpYyB0aGVuPFRoZW5SZXN1bHQgPSBJbnB1dCwgQ2F0Y2hSZXN1bHQgPSBuZXZlcj4oXG4gICAgb25GdWxmaWxsZWQ/OiAodmFsdWU6IElucHV0KSA9PiBUaGVuUmVzdWx0IHwgUHJvbWlzZUxpa2U8VGhlblJlc3VsdD4sXG4gICAgb25SZWplY3RlZD86IChyZWFzb246IGFueSkgPT4gQ2F0Y2hSZXN1bHQgfCBQcm9taXNlTGlrZTxDYXRjaFJlc3VsdD5cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlY29yYXRlKHN1cGVyLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpKVxuICB9XG5cbiAgcHVibGljIGNhdGNoPENhdGNoUmVzdWx0ID0gbmV2ZXI+KFxuICAgIG9uUmVqZWN0ZWQ/OiAocmVhc29uOiBhbnkpID0+IENhdGNoUmVzdWx0IHwgUHJvbWlzZUxpa2U8Q2F0Y2hSZXN1bHQ+XG4gICkge1xuICAgIHJldHVybiB0aGlzLiNkZWNvcmF0ZShzdXBlci5jYXRjaChvblJlamVjdGVkKSlcbiAgfVxuXG4gIHB1YmxpYyBmaW5hbGx5KG9uZmluYWxseT86ICgpID0+IHZvaWQgfCBQcm9taXNlPGFueT4pIHtcbiAgICByZXR1cm4gdGhpcy4jZGVjb3JhdGUoc3VwZXIuZmluYWxseShvbmZpbmFsbHkpKVxuICB9XG5cbiAgI2RlY29yYXRlPENoaWxkSW5wdXQ+KFxuICAgIHByb21pc2U6IFByb21pc2U8Q2hpbGRJbnB1dD5cbiAgKTogRGVmZXJyZWRQcm9taXNlPENoaWxkSW5wdXQsIE91dHB1dD4ge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm9taXNlLCB7XG4gICAgICByZXNvbHZlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMucmVzb2x2ZSB9LFxuICAgICAgcmVqZWN0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMucmVqZWN0IH0sXG4gICAgfSkgYXMgRGVmZXJyZWRQcm9taXNlPENoaWxkSW5wdXQsIE91dHB1dD5cbiAgfVxufVxuIiwgImltcG9ydCB7IFJlcXVpcmVkRGVlcCB9IGZyb20gJ34vY29yZS90eXBlVXRpbHMnXG5pbXBvcnQgeyBtZXJnZVJpZ2h0IH0gZnJvbSAnfi9jb3JlL3V0aWxzL2ludGVybmFsL21lcmdlUmlnaHQnXG5pbXBvcnQge1xuICBTZXR1cFdvcmtlcixcbiAgU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHQsXG4gIFN0YXJ0SGFuZGxlcixcbiAgU3RhcnRPcHRpb25zLFxufSBmcm9tICcuLi8uLi9nbG9zc2FyeSdcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RBUlRfT1BUSU9OUzogUmVxdWlyZWREZWVwPFN0YXJ0T3B0aW9ucz4gPSB7XG4gIHNlcnZpY2VXb3JrZXI6IHtcbiAgICB1cmw6ICcvbW9ja1NlcnZpY2VXb3JrZXIuanMnLFxuICAgIG9wdGlvbnM6IG51bGwgYXMgYW55LFxuICB9LFxuICBxdWlldDogZmFsc2UsXG4gIHdhaXRVbnRpbFJlYWR5OiB0cnVlLFxuICBvblVuaGFuZGxlZFJlcXVlc3Q6ICd3YXJuJyxcbiAgZmluZFdvcmtlcihzY3JpcHRVUkwsIG1vY2tTZXJ2aWNlV29ya2VyVXJsKSB7XG4gICAgcmV0dXJuIHNjcmlwdFVSTCA9PT0gbW9ja1NlcnZpY2VXb3JrZXJVcmxcbiAgfSxcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHJlc29sdmVkIHdvcmtlciBzdGFydCBvcHRpb25zLCBtZXJnaW5nIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAqIHdpdGggdGhlIGdpdmVuIGN1c3RvbSBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVN0YXJ0T3B0aW9ucyhcbiAgaW5pdGlhbE9wdGlvbnM/OiBTdGFydE9wdGlvbnMsXG4pOiBSZXF1aXJlZERlZXA8U3RhcnRPcHRpb25zPiB7XG4gIHJldHVybiBtZXJnZVJpZ2h0KFxuICAgIERFRkFVTFRfU1RBUlRfT1BUSU9OUyxcbiAgICBpbml0aWFsT3B0aW9ucyB8fCB7fSxcbiAgKSBhcyBSZXF1aXJlZERlZXA8U3RhcnRPcHRpb25zPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVN0YXJ0SGFuZGxlcihcbiAgaGFuZGxlcjogU3RhcnRIYW5kbGVyLFxuICBjb250ZXh0OiBTZXR1cFdvcmtlckludGVybmFsQ29udGV4dCxcbik6IFNldHVwV29ya2VyWydzdGFydCddIHtcbiAgcmV0dXJuIChpbml0aWFsT3B0aW9ucykgPT4ge1xuICAgIGNvbnRleHQuc3RhcnRPcHRpb25zID0gcmVzb2x2ZVN0YXJ0T3B0aW9ucyhpbml0aWFsT3B0aW9ucylcbiAgICByZXR1cm4gaGFuZGxlcihjb250ZXh0LnN0YXJ0T3B0aW9ucywgaW5pdGlhbE9wdGlvbnMgfHwge30pXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBkZXZVdGlscyB9IGZyb20gJ34vY29yZS91dGlscy9pbnRlcm5hbC9kZXZVdGlscydcbmltcG9ydCB7IGdldFdvcmtlckluc3RhbmNlIH0gZnJvbSAnLi91dGlscy9nZXRXb3JrZXJJbnN0YW5jZSdcbmltcG9ydCB7IGVuYWJsZU1vY2tpbmcgfSBmcm9tICcuL3V0aWxzL2VuYWJsZU1vY2tpbmcnXG5pbXBvcnQgdHlwZSB7IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0LCBTdGFydEhhbmRsZXIgfSBmcm9tICcuLi9nbG9zc2FyeSdcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RMaXN0ZW5lciB9IGZyb20gJy4vY3JlYXRlUmVxdWVzdExpc3RlbmVyJ1xuaW1wb3J0IHsgY2hlY2tXb3JrZXJJbnRlZ3JpdHkgfSBmcm9tICcuLi8uLi91dGlscy9jaGVja1dvcmtlckludGVncml0eSdcbmltcG9ydCB7IGNyZWF0ZVJlc3BvbnNlTGlzdGVuZXIgfSBmcm9tICcuL2NyZWF0ZVJlc3BvbnNlTGlzdGVuZXInXG5pbXBvcnQgeyB2YWxpZGF0ZVdvcmtlclNjb3BlIH0gZnJvbSAnLi91dGlscy92YWxpZGF0ZVdvcmtlclNjb3BlJ1xuaW1wb3J0IHsgRGVmZXJyZWRQcm9taXNlIH0gZnJvbSAnQG9wZW4tZHJhZnQvZGVmZXJyZWQtcHJvbWlzZSdcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVN0YXJ0SGFuZGxlciA9IChcbiAgY29udGV4dDogU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHQsXG4pOiBTdGFydEhhbmRsZXIgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gc3RhcnQob3B0aW9ucywgY3VzdG9tT3B0aW9ucykge1xuICAgIGNvbnN0IHN0YXJ0V29ya2VySW5zdGFuY2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBSZW1vdmUgYWxsIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgLy8gVGhpcyB3YXkgbm9uZSBvZiB0aGUgbGlzdGVuZXJzIHBlcnNpc3RzIGJldHdlZW4gRmFzdCByZWZyZXNoXG4gICAgICAvLyBvZiB0aGUgYXBwbGljYXRpb24ncyBjb2RlLlxuICAgICAgY29udGV4dC53b3JrZXJDaGFubmVsLnJlbW92ZUFsbExpc3RlbmVycygpXG5cbiAgICAgIC8vIEhhbmRsZSByZXF1ZXN0cyBzaWduYWxlZCBieSB0aGUgd29ya2VyLlxuICAgICAgY29udGV4dC53b3JrZXJDaGFubmVsLm9uKFxuICAgICAgICAnUkVRVUVTVCcsXG4gICAgICAgIGNyZWF0ZVJlcXVlc3RMaXN0ZW5lcihjb250ZXh0LCBvcHRpb25zKSxcbiAgICAgIClcblxuICAgICAgLy8gSGFuZGxlIHJlc3BvbnNlcyBzaWduYWxlZCBieSB0aGUgd29ya2VyLlxuICAgICAgY29udGV4dC53b3JrZXJDaGFubmVsLm9uKCdSRVNQT05TRScsIGNyZWF0ZVJlc3BvbnNlTGlzdGVuZXIoY29udGV4dCkpXG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0V29ya2VySW5zdGFuY2UoXG4gICAgICAgIG9wdGlvbnMuc2VydmljZVdvcmtlci51cmwsXG4gICAgICAgIG9wdGlvbnMuc2VydmljZVdvcmtlci5vcHRpb25zLFxuICAgICAgICBvcHRpb25zLmZpbmRXb3JrZXIsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IFt3b3JrZXIsIHJlZ2lzdHJhdGlvbl0gPSBpbnN0YW5jZVxuXG4gICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICBjb25zdCBtaXNzaW5nV29ya2VyTWVzc2FnZSA9IGN1c3RvbU9wdGlvbnM/LmZpbmRXb3JrZXJcbiAgICAgICAgICA/IGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9jYXRlIHRoZSBTZXJ2aWNlIFdvcmtlciByZWdpc3RyYXRpb24gdXNpbmcgYSBjdXN0b20gXCJmaW5kV29ya2VyXCIgcHJlZGljYXRlLlxuXG5QbGVhc2UgZW5zdXJlIHRoYXQgdGhlIGN1c3RvbSBwcmVkaWNhdGUgcHJvcGVybHkgbG9jYXRlcyB0aGUgU2VydmljZSBXb3JrZXIgcmVnaXN0cmF0aW9uIGF0IFwiJXNcIi5cbk1vcmUgZGV0YWlsczogaHR0cHM6Ly9tc3dqcy5pby9kb2NzL2FwaS9zZXR1cC13b3JrZXIvc3RhcnQjZmluZHdvcmtlclxuYCxcbiAgICAgICAgICAgICAgb3B0aW9ucy5zZXJ2aWNlV29ya2VyLnVybCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9jYXRlIHRoZSBTZXJ2aWNlIFdvcmtlciByZWdpc3RyYXRpb24uXG5cblRoaXMgbW9zdCBsaWtlbHkgbWVhbnMgdGhhdCB0aGUgd29ya2VyIHNjcmlwdCBVUkwgXCIlc1wiIGNhbm5vdCByZXNvbHZlIGFnYWluc3QgdGhlIGFjdHVhbCBwdWJsaWMgaG9zdG5hbWUgKCVzKS4gVGhpcyBtYXkgaGFwcGVuIGlmIHlvdXIgYXBwbGljYXRpb24gcnVucyBiZWhpbmQgYSBwcm94eSwgb3IgaGFzIGEgZHluYW1pYyBob3N0bmFtZS5cblxuUGxlYXNlIGNvbnNpZGVyIHVzaW5nIGEgY3VzdG9tIFwic2VydmljZVdvcmtlci51cmxcIiBvcHRpb24gdG8gcG9pbnQgdG8gdGhlIGFjdHVhbCB3b3JrZXIgc2NyaXB0IGxvY2F0aW9uLCBvciBhIGN1c3RvbSBcImZpbmRXb3JrZXJcIiBvcHRpb24gdG8gcmVzb2x2ZSB0aGUgU2VydmljZSBXb3JrZXIgcmVnaXN0cmF0aW9uIG1hbnVhbGx5LiBNb3JlIGRldGFpbHM6IGh0dHBzOi8vbXN3anMuaW8vZG9jcy9hcGkvc2V0dXAtd29ya2VyL3N0YXJ0YCxcbiAgICAgICAgICAgICAgb3B0aW9ucy5zZXJ2aWNlV29ya2VyLnVybCxcbiAgICAgICAgICAgICAgbG9jYXRpb24uaG9zdCxcbiAgICAgICAgICAgIClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWlzc2luZ1dvcmtlck1lc3NhZ2UpXG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQud29ya2VyUHJvbWlzZS5yZXNvbHZlKHdvcmtlcilcbiAgICAgIGNvbnRleHQucmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XG4gICAgICAgIGlmICh3b3JrZXIuc3RhdGUgIT09ICdyZWR1bmRhbnQnKSB7XG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSBTZXJ2aWNlIFdvcmtlciB0aGF0IHRoaXMgY2xpZW50IGhhcyBjbG9zZWQuXG4gICAgICAgICAgLy8gSW50ZXJuYWxseSwgaXQncyBzaW1pbGFyIHRvIGRpc2FibGluZyB0aGUgbW9ja2luZywgb25seVxuICAgICAgICAgIC8vIGNsaWVudCBjbG9zZSBldmVudCBoYXMgYSBoYW5kbGVyIHRoYXQgc2VsZi10ZXJtaW5hdGVzXG4gICAgICAgICAgLy8gdGhlIFNlcnZpY2UgV29ya2VyIHdoZW4gdGhlcmUgYXJlIG5vIG9wZW4gY2xpZW50cy5cbiAgICAgICAgICBjb250ZXh0LndvcmtlckNoYW5uZWwucG9zdE1lc3NhZ2UoJ0NMSUVOVF9DTE9TRUQnKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGFsd2F5cyBjbGVhcmluZyB0aGUgaW50ZXJ2YWwgLSB0aGVyZSBhcmUgcmVwb3J0cyB0aGF0IG5vdCBkb2luZyB0aGlzIGNhblxuICAgICAgICAvLyBjYXVzZSBtZW1vcnkgbGVha3MgaW4gaGVhZGxlc3MgYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvbnRleHQua2VlcEFsaXZlSW50ZXJ2YWwpXG5cbiAgICAgICAgLy8gTm90aWZ5IG90aGVycyBhYm91dCB0aGlzIGNsaWVudCBkaXNjb25uZWN0aW5nLlxuICAgICAgICAvLyBFLmcuIHRoaXMgd2lsbCBwdXJnZSB0aGUgaW4tbWVtb3J5IFdlYlNvY2tldCBjbGllbnRzIHNpbmNlXG4gICAgICAgIC8vIHN0YXJ0aW5nIHRoZSB3b3JrZXIgYWdhaW4gd2lsbCBhc3NpZ24gdGhlbSBuZXcgSURzLlxuICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlOiAnbXN3L3dvcmtlcjpzdG9wJyB9KVxuICAgICAgfSlcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGl2ZSBTZXJ2aWNlIFdvcmtlciBoYXMgYmVlbiBnZW5lcmF0ZWRcbiAgICAgIC8vIGJ5IHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIHZlcnNpb24gb2YgTVNXLlxuICAgICAgYXdhaXQgY2hlY2tXb3JrZXJJbnRlZ3JpdHkoY29udGV4dCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGRldlV0aWxzLmVycm9yKFxuICAgICAgICAgICdFcnJvciB3aGlsZSBjaGVja2luZyB0aGUgd29ya2VyIHNjcmlwdCBpbnRlZ3JpdHkuIFBsZWFzZSByZXBvcnQgdGhpcyBvbiBHaXRIdWIgKGh0dHBzOi8vZ2l0aHViLmNvbS9tc3dqcy9tc3cvaXNzdWVzKSBhbmQgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgYmVsb3cuJyxcbiAgICAgICAgKVxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgfSlcblxuICAgICAgY29udGV4dC5rZWVwQWxpdmVJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChcbiAgICAgICAgKCkgPT4gY29udGV4dC53b3JrZXJDaGFubmVsLnBvc3RNZXNzYWdlKCdLRUVQQUxJVkVfUkVRVUVTVCcpLFxuICAgICAgICA1MDAwLFxuICAgICAgKVxuXG4gICAgICAvLyBXYXJuIHRoZSB1c2VyIHdoZW4gbG9hZGluZyB0aGUgcGFnZSB0aGF0IGxpZXMgb3V0c2lkZVxuICAgICAgLy8gb2YgdGhlIHdvcmtlcidzIHNjb3BlLlxuICAgICAgdmFsaWRhdGVXb3JrZXJTY29wZShyZWdpc3RyYXRpb24sIGNvbnRleHQuc3RhcnRPcHRpb25zKVxuXG4gICAgICByZXR1cm4gcmVnaXN0cmF0aW9uXG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VyUmVnaXN0cmF0aW9uID0gc3RhcnRXb3JrZXJJbnN0YW5jZSgpLnRoZW4oXG4gICAgICBhc3luYyAocmVnaXN0cmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdJbnN0YW5jZSA9IHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nIHx8IHJlZ2lzdHJhdGlvbi53YWl0aW5nXG5cbiAgICAgICAgaWYgKHBlbmRpbmdJbnN0YW5jZSkge1xuICAgICAgICAgIGNvbnN0IGFjdGl2YXRpb25Qcm9taXNlID0gbmV3IERlZmVycmVkUHJvbWlzZTx2b2lkPigpXG5cbiAgICAgICAgICBwZW5kaW5nSW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGVuZGluZ0luc3RhbmNlLnN0YXRlID09PSAnYWN0aXZhdGVkJykge1xuICAgICAgICAgICAgICBhY3RpdmF0aW9uUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgd29ya2VyIGlzIGFjdGl2YXRlZC5cbiAgICAgICAgICAvLyBBc3N1bWUgdGhlIHdvcmtlciBpcyBhbHJlYWR5IGFjdGl2YXRlZCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgcmVnaXN0cmF0aW9uXG4gICAgICAgICAgLy8gKGkuZS4gd2hlbiByZWxvYWRpbmcgdGhlIHBhZ2UgYWZ0ZXIgYSBzdWNjZXNzZnVsIGFjdGl2YXRpb24pLlxuICAgICAgICAgIGF3YWl0IGFjdGl2YXRpb25Qcm9taXNlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmludCB0aGUgYWN0aXZhdGlvbiBtZXNzYWdlIG9ubHkgYWZ0ZXIgdGhlIHdvcmtlciBoYXMgYmVlbiBhY3RpdmF0ZWQuXG4gICAgICAgIGF3YWl0IGVuYWJsZU1vY2tpbmcoY29udGV4dCwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgZGV2VXRpbHMuZXJyb3IoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIGVuYWJsZSBtb2NraW5nLiBQbGVhc2UgcmVwb3J0IHRoaXMgb24gR2l0SHViIChodHRwczovL2dpdGh1Yi5jb20vbXN3anMvbXN3L2lzc3VlcykgYW5kIGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIGJlbG93LicsXG4gICAgICAgICAgKVxuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvblxuICAgICAgfSxcbiAgICApXG5cbiAgICByZXR1cm4gd29ya2VyUmVnaXN0cmF0aW9uXG4gIH1cbn1cbiIsICJleHBvcnQgdHlwZSBVbnRpbFJlc3VsdDxSZWplY3Rpb25SZWFzb24sIFJlc29sdmVEYXRhPiA9XG4gIHwgW3JlYXNvbjogUmVqZWN0aW9uUmVhc29uLCBkYXRhOiBudWxsXVxuICB8IFtyZWFzb246IG51bGwsIGRhdGE6IFJlc29sdmVEYXRhXVxuXG4vKipcbiAqIEdyYWNlZnVsbHkgaGFuZGxlcyBhIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBhIHByb21pc2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHVudGlsKCgpID0+IFByb21pc2UucmVzb2x2ZSgxMjMpKVxuICogLy8gW251bGwsIDEyM11cbiAqXG4gKiBhd2FpdCB1bnRpbCgoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ09vcHMhJykpKVxuICogLy8gW25ldyBFcnJvcignT29wcyEnKSwgbnVsbF1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVudGlsPFJlamVjdGlvblJlYXNvbiA9IEVycm9yLCBSZXNvbHZlRGF0YSA9IHVua25vd24+KFxuICBjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxSZXNvbHZlRGF0YT4sXG4pOiBQcm9taXNlPFVudGlsUmVzdWx0PFJlamVjdGlvblJlYXNvbiwgUmVzb2x2ZURhdGE+PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGNhbGxiYWNrKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0pXG4gICAgcmV0dXJuIFtudWxsLCBkYXRhXVxuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIFtlcnJvciwgbnVsbF1cbiAgfVxufVxuIiwgImltcG9ydCB7IHVudGlsIH0gZnJvbSAndW50aWwtYXN5bmMnXG5pbXBvcnQgeyBkZXZVdGlscyB9IGZyb20gJ34vY29yZS91dGlscy9pbnRlcm5hbC9kZXZVdGlscydcbmltcG9ydCB7IGdldEFic29sdXRlV29ya2VyVXJsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZ2V0QWJzb2x1dGVXb3JrZXJVcmwnXG5pbXBvcnQgeyBnZXRXb3JrZXJCeVJlZ2lzdHJhdGlvbiB9IGZyb20gJy4vZ2V0V29ya2VyQnlSZWdpc3RyYXRpb24nXG5pbXBvcnQgeyBTZXJ2aWNlV29ya2VySW5zdGFuY2VUdXBsZSwgRmluZFdvcmtlciB9IGZyb20gJy4uLy4uL2dsb3NzYXJ5J1xuXG4vKipcbiAqIFJldHVybnMgYW4gYWN0aXZlIFNlcnZpY2UgV29ya2VyIGluc3RhbmNlLlxuICogV2hlbiBub3QgZm91bmQsIHJlZ2lzdGVycyBhIG5ldyBTZXJ2aWNlIFdvcmtlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFdvcmtlckluc3RhbmNlID0gYXN5bmMgKFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVnaXN0cmF0aW9uT3B0aW9ucyA9IHt9LFxuICBmaW5kV29ya2VyOiBGaW5kV29ya2VyLFxuKTogUHJvbWlzZTxTZXJ2aWNlV29ya2VySW5zdGFuY2VUdXBsZT4gPT4ge1xuICAvLyBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBTZXJ2aWNlIFdvcmtlciBVUkwuXG4gIGNvbnN0IGFic29sdXRlV29ya2VyVXJsID0gZ2V0QWJzb2x1dGVXb3JrZXJVcmwodXJsKVxuXG4gIGNvbnN0IG1vY2tSZWdpc3RyYXRpb25zID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXJcbiAgICAuZ2V0UmVnaXN0cmF0aW9ucygpXG4gICAgLnRoZW4oKHJlZ2lzdHJhdGlvbnMpID0+XG4gICAgICByZWdpc3RyYXRpb25zLmZpbHRlcigocmVnaXN0cmF0aW9uKSA9PlxuICAgICAgICBnZXRXb3JrZXJCeVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24sIGFic29sdXRlV29ya2VyVXJsLCBmaW5kV29ya2VyKSxcbiAgICAgICksXG4gICAgKVxuICBpZiAoIW5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLmNvbnRyb2xsZXIgJiYgbW9ja1JlZ2lzdHJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIC8vIFJlbG9hZCB0aGUgcGFnZSB3aGVuIGl0IGhhcyBhc3NvY2lhdGVkIHdvcmtlcnMsIGJ1dCBubyBhY3RpdmUgY29udHJvbGxlci5cbiAgICAvLyBUaGUgYWJzZW5jZSBvZiBhIGNvbnRyb2xsZXIgY2FuIG1lYW4gZWl0aGVyOlxuICAgIC8vIC0gcGFnZSBoYXMgbm8gU2VydmljZSBXb3JrZXIgYXNzb2NpYXRlZCB3aXRoIGl0XG4gICAgLy8gLSBwYWdlIGhhcyBiZWVuIGhhcmQtcmVsb2FkZWQgYW5kIGl0cyB3b3JrZXJzIHdvbid0IGJlIHVzZWQgdW50aWwgdGhlIG5leHQgcmVsb2FkLlxuICAgIC8vIFNpbmNlIHdlJ3ZlIGNoZWNrZWQgdGhhdCB0aGVyZSBhcmUgcmVnaXN0cmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLFxuICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgaXQncyBoYXJkIHJlbG9hZCB0aGF0IGZhbGxzIGludG8gdGhpcyBjbGF1c2UuXG4gICAgbG9jYXRpb24ucmVsb2FkKClcbiAgfVxuXG4gIGNvbnN0IFtleGlzdGluZ1JlZ2lzdHJhdGlvbl0gPSBtb2NrUmVnaXN0cmF0aW9uc1xuXG4gIGlmIChleGlzdGluZ1JlZ2lzdHJhdGlvbikge1xuICAgIC8vIFNjaGVkdWxlIHRoZSB3b3JrZXIgdXBkYXRlIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgIC8vIFVwZGF0ZSBlbnN1cmVzIHRoZSBleGlzdGluZyB3b3JrZXIgaXMgdXAtdG8tZGF0ZS5cbiAgICBleGlzdGluZ1JlZ2lzdHJhdGlvbi51cGRhdGUoKVxuXG4gICAgLy8gUmV0dXJuIHRoZSB3b3JrZXIgcmVmZXJlbmNlIGltbWVkaWF0ZWx5LlxuICAgIHJldHVybiBbXG4gICAgICBnZXRXb3JrZXJCeVJlZ2lzdHJhdGlvbihcbiAgICAgICAgZXhpc3RpbmdSZWdpc3RyYXRpb24sXG4gICAgICAgIGFic29sdXRlV29ya2VyVXJsLFxuICAgICAgICBmaW5kV29ya2VyLFxuICAgICAgKSxcbiAgICAgIGV4aXN0aW5nUmVnaXN0cmF0aW9uLFxuICAgIF1cbiAgfVxuXG4gIC8vIFdoZW4gdGhlIFNlcnZpY2UgV29ya2VyIHdhc24ndCBmb3VuZCwgcmVnaXN0ZXIgaXQgYW5ldyBhbmQgcmV0dXJuIHRoZSByZWZlcmVuY2UuXG4gIGNvbnN0IFtyZWdpc3RyYXRpb25FcnJvciwgcmVnaXN0cmF0aW9uUmVzdWx0XSA9IGF3YWl0IHVudGlsPFxuICAgIEVycm9yLFxuICAgIFNlcnZpY2VXb3JrZXJJbnN0YW5jZVR1cGxlXG4gID4oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKHVybCwgb3B0aW9ucylcbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ29tcGFyZSBleGlzdGluZyB3b3JrZXIgcmVnaXN0cmF0aW9uIGJ5IGl0cyB3b3JrZXIgVVJMLFxuICAgICAgLy8gdG8gcHJldmVudCBpcnJlbGV2YW50IHdvcmtlcnMgdG8gcmVzb2x2ZSBoZXJlIChzdWNoIGFzIENvZGVzYW5kYm94IHdvcmtlcikuXG4gICAgICBnZXRXb3JrZXJCeVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24sIGFic29sdXRlV29ya2VyVXJsLCBmaW5kV29ya2VyKSxcbiAgICAgIHJlZ2lzdHJhdGlvbixcbiAgICBdXG4gIH0pXG5cbiAgLy8gSGFuZGxlIFNlcnZpY2UgV29ya2VyIHJlZ2lzdHJhdGlvbiBlcnJvcnMuXG4gIGlmIChyZWdpc3RyYXRpb25FcnJvcikge1xuICAgIGNvbnN0IGlzV29ya2VyTWlzc2luZyA9IHJlZ2lzdHJhdGlvbkVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJyg0MDQpJylcblxuICAgIC8vIFByb2R1Y2UgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB3aGVuIGdpdmVuIGEgbm9uLWV4aXN0aW5nIFNlcnZpY2UgV29ya2VyIHVybC5cbiAgICAvLyBTdWdnZXN0IGRldmVsb3BlcnMgdG8gY2hlY2sgdGhlaXIgc2V0dXAuXG4gICAgaWYgKGlzV29ya2VyTWlzc2luZykge1xuICAgICAgY29uc3Qgc2NvcGVVcmwgPSBuZXcgVVJMKG9wdGlvbnM/LnNjb3BlIHx8ICcvJywgbG9jYXRpb24uaHJlZilcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBkZXZVdGlscy5mb3JtYXRNZXNzYWdlKGBcXFxuRmFpbGVkIHRvIHJlZ2lzdGVyIGEgU2VydmljZSBXb3JrZXIgZm9yIHNjb3BlICgnJHtzY29wZVVybC5ocmVmfScpIHdpdGggc2NyaXB0ICgnJHthYnNvbHV0ZVdvcmtlclVybH0nKTogU2VydmljZSBXb3JrZXIgc2NyaXB0IGRvZXMgbm90IGV4aXN0IGF0IHRoZSBnaXZlbiBwYXRoLlxuXG5EaWQgeW91IGZvcmdldCB0byBydW4gXCJucHggbXN3IGluaXQgPFBVQkxJQ19ESVI+XCI/XG5cbkxlYXJuIG1vcmUgYWJvdXQgY3JlYXRpbmcgdGhlIFNlcnZpY2UgV29ya2VyIHNjcmlwdDogaHR0cHM6Ly9tc3dqcy5pby9kb2NzL2NsaS9pbml0YCksXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZXJyb3IgbWVzc2FnZSBmb3IgYW55IG90aGVyIHJlZ2lzdHJhdGlvbiBlcnJvcnMuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgJ0ZhaWxlZCB0byByZWdpc3RlciB0aGUgU2VydmljZSBXb3JrZXI6XFxuXFxuJXMnLFxuICAgICAgICByZWdpc3RyYXRpb25FcnJvci5tZXNzYWdlLFxuICAgICAgKSxcbiAgICApXG4gIH1cblxuICByZXR1cm4gcmVnaXN0cmF0aW9uUmVzdWx0XG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIGFuIGFic29sdXRlIFNlcnZpY2UgV29ya2VyIFVSTCBiYXNlZCBvbiB0aGUgZ2l2ZW5cbiAqIHJlbGF0aXZlIFVSTCAoa25vd24gZHVyaW5nIHRoZSByZWdpc3RyYXRpb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWJzb2x1dGVXb3JrZXJVcmwod29ya2VyVXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTCh3b3JrZXJVcmwsIGxvY2F0aW9uLmhyZWYpLmhyZWZcbn1cbiIsICJpbXBvcnQgeyBGaW5kV29ya2VyIH0gZnJvbSAnLi4vLi4vZ2xvc3NhcnknXG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSBhIFNlcnZpY2UgV29ya2VyIGluc3RhbmNlIGZyb20gYSBnaXZlbiByZWdpc3RyYXRpb24sXG4gKiByZWdhcmRsZXNzIG9mIGl0cyBzdGF0ZSAoYWN0aXZlLCBpbnN0YWxsaW5nLCB3YWl0aW5nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtlckJ5UmVnaXN0cmF0aW9uKFxuICByZWdpc3RyYXRpb246IFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24sXG4gIGFic29sdXRlV29ya2VyVXJsOiBzdHJpbmcsXG4gIGZpbmRXb3JrZXI6IEZpbmRXb3JrZXIsXG4pOiBTZXJ2aWNlV29ya2VyIHwgbnVsbCB7XG4gIGNvbnN0IGFsbFN0YXRlcyA9IFtcbiAgICByZWdpc3RyYXRpb24uYWN0aXZlLFxuICAgIHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nLFxuICAgIHJlZ2lzdHJhdGlvbi53YWl0aW5nLFxuICBdXG4gIGNvbnN0IHJlbGV2YW50U3RhdGVzID0gYWxsU3RhdGVzLmZpbHRlcigoc3RhdGUpOiBzdGF0ZSBpcyBTZXJ2aWNlV29ya2VyID0+IHtcbiAgICByZXR1cm4gc3RhdGUgIT0gbnVsbFxuICB9KVxuICBjb25zdCB3b3JrZXIgPSByZWxldmFudFN0YXRlcy5maW5kKCh3b3JrZXIpID0+IHtcbiAgICByZXR1cm4gZmluZFdvcmtlcih3b3JrZXIuc2NyaXB0VVJMLCBhYnNvbHV0ZVdvcmtlclVybClcbiAgfSlcblxuICByZXR1cm4gd29ya2VyIHx8IG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNlcnZpY2VXb3JrZXJJbmNvbWluZ0V2ZW50c01hcCB9IGZyb20gJy4uLy4uL2dsb3NzYXJ5J1xuaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5cbmludGVyZmFjZSBQcmludFN0YXJ0TWVzc2FnZUFyZ3Mge1xuICBxdWlldD86IGJvb2xlYW5cbiAgbWVzc2FnZT86IHN0cmluZ1xuICB3b3JrZXJVcmw/OiBzdHJpbmdcbiAgd29ya2VyU2NvcGU/OiBzdHJpbmdcbiAgY2xpZW50PzogU2VydmljZVdvcmtlckluY29taW5nRXZlbnRzTWFwWydNT0NLSU5HX0VOQUJMRUQnXVsnY2xpZW50J11cbn1cblxuLyoqXG4gKiBQcmludHMgYSB3b3JrZXIgYWN0aXZhdGlvbiBtZXNzYWdlIGluIHRoZSBicm93c2VyJ3MgY29uc29sZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnRNZXNzYWdlKGFyZ3M6IFByaW50U3RhcnRNZXNzYWdlQXJncyA9IHt9KSB7XG4gIGlmIChhcmdzLnF1aWV0KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gYXJncy5tZXNzYWdlIHx8ICdNb2NraW5nIGVuYWJsZWQuJ1xuXG4gIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgYCVjJHtkZXZVdGlscy5mb3JtYXRNZXNzYWdlKG1lc3NhZ2UpfWAsXG4gICAgJ2NvbG9yOm9yYW5nZXJlZDtmb250LXdlaWdodDpib2xkOycsXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coXG4gICAgJyVjRG9jdW1lbnRhdGlvbjogJWNodHRwczovL21zd2pzLmlvL2RvY3MnLFxuICAgICdmb250LXdlaWdodDpib2xkJyxcbiAgICAnZm9udC13ZWlnaHQ6bm9ybWFsJyxcbiAgKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmxvZygnRm91bmQgYW4gaXNzdWU/IGh0dHBzOi8vZ2l0aHViLmNvbS9tc3dqcy9tc3cvaXNzdWVzJylcblxuICBpZiAoYXJncy53b3JrZXJVcmwpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgc2NyaXB0IFVSTDonLCBhcmdzLndvcmtlclVybClcbiAgfVxuXG4gIGlmIChhcmdzLndvcmtlclNjb3BlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnV29ya2VyIHNjb3BlOicsIGFyZ3Mud29ya2VyU2NvcGUpXG4gIH1cblxuICBpZiAoYXJncy5jbGllbnQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdDbGllbnQgSUQ6ICVzICglcyknLCBhcmdzLmNsaWVudC5pZCwgYXJncy5jbGllbnQuZnJhbWVUeXBlKVxuICB9XG5cbiAgY29uc29sZS5ncm91cEVuZCgpXG59XG4iLCAiaW1wb3J0IHsgRGVmZXJyZWRQcm9taXNlIH0gZnJvbSAnQG9wZW4tZHJhZnQvZGVmZXJyZWQtcHJvbWlzZSdcbmltcG9ydCB0eXBlIHsgU3RhcnRPcHRpb25zLCBTZXR1cFdvcmtlckludGVybmFsQ29udGV4dCB9IGZyb20gJy4uLy4uL2dsb3NzYXJ5J1xuaW1wb3J0IHsgcHJpbnRTdGFydE1lc3NhZ2UgfSBmcm9tICcuL3ByaW50U3RhcnRNZXNzYWdlJ1xuXG4vKipcbiAqIFNpZ25hbHMgdGhlIHdvcmtlciB0byBlbmFibGUgdGhlIGludGVyY2VwdGlvbiBvZiByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZU1vY2tpbmcoXG4gIGNvbnRleHQ6IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0LFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnMsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbW9ja2luZ0VuYWJsZWRQcm9taXNlID0gbmV3IERlZmVycmVkUHJvbWlzZTxib29sZWFuPigpXG5cbiAgY29udGV4dC53b3JrZXJDaGFubmVsLnBvc3RNZXNzYWdlKCdNT0NLX0FDVElWQVRFJylcbiAgY29udGV4dC53b3JrZXJDaGFubmVsLm9uY2UoJ01PQ0tJTkdfRU5BQkxFRCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnRleHQuaXNNb2NraW5nRW5hYmxlZCA9IHRydWVcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBjb250ZXh0LndvcmtlclByb21pc2VcblxuICAgIHByaW50U3RhcnRNZXNzYWdlKHtcbiAgICAgIHF1aWV0OiBvcHRpb25zLnF1aWV0LFxuICAgICAgd29ya2VyU2NvcGU6IGNvbnRleHQucmVnaXN0cmF0aW9uPy5zY29wZSxcbiAgICAgIHdvcmtlclVybDogd29ya2VyLnNjcmlwdFVSTCxcbiAgICAgIGNsaWVudDogZXZlbnQuZGF0YS5jbGllbnQsXG4gICAgfSlcblxuICAgIG1vY2tpbmdFbmFibGVkUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gIH0pXG5cbiAgcmV0dXJuIG1vY2tpbmdFbmFibGVkUHJvbWlzZVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2VydmljZVdvcmtlckluY29taW5nUmVxdWVzdCB9IGZyb20gJy4uL3NldHVwV29ya2VyL2dsb3NzYXJ5J1xuXG50eXBlIElucHV0ID0gUGljazxTZXJ2aWNlV29ya2VySW5jb21pbmdSZXF1ZXN0LCAnbWV0aG9kJyB8ICdib2R5Jz5cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYW4gZW1wdHkgR0VUIHJlcXVlc3QgYm9keSBpcyBhbHdheXMgcmVwcmVzZW50ZWQgYXMgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZUdldFJlcXVlc3RCb2R5KFxuICByZXF1ZXN0OiBJbnB1dCxcbik6IFNlcnZpY2VXb3JrZXJJbmNvbWluZ1JlcXVlc3RbJ2JvZHknXSB7XG4gIC8vIEZvcmNlIEhFQUQvR0VUIHJlcXVlc3QgYm9keSB0byBhbHdheXMgYmUgZW1wdHkuXG4gIC8vIFRoZSB3b3JrZXIgcmVhZHMgYW55IHJlcXVlc3QncyBib2R5IGFzIEFycmF5QnVmZmVyLFxuICAvLyBhbmQgeW91IGNhbm5vdCByZS1jb25zdHJ1Y3QgYSBHRVQvSEVBRCBSZXF1ZXN0XG4gIC8vIHdpdGggYW4gQXJyYXlCdWZmZXIsIGV2ZW4gaWYgZW1wdHkuIEFsc28gbm90ZSB0aGF0XG4gIC8vIFwicmVxdWVzdC5ib2R5XCIgaXMgYWx3YXlzIHVuZGVmaW5lZCBpbiB0aGUgd29ya2VyLlxuICBpZiAoWydIRUFEJywgJ0dFVCddLmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0LmJvZHlcbn1cbiIsICJpbXBvcnQgeyBwcnVuZUdldFJlcXVlc3RCb2R5IH0gZnJvbSAnLi9wcnVuZUdldFJlcXVlc3RCb2R5J1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlV29ya2VySW5jb21pbmdSZXF1ZXN0IH0gZnJvbSAnLi4vc2V0dXBXb3JrZXIvZ2xvc3NhcnknXG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIFNlcnZpY2UgV29ya2VyXG4gKiBpbnRvIGEgRmV0Y2ggYFJlcXVlc3RgIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVSZXF1ZXN0KFxuICBzZXJpYWxpemVkUmVxdWVzdDogU2VydmljZVdvcmtlckluY29taW5nUmVxdWVzdCxcbik6IFJlcXVlc3Qge1xuICByZXR1cm4gbmV3IFJlcXVlc3Qoc2VyaWFsaXplZFJlcXVlc3QudXJsLCB7XG4gICAgLi4uc2VyaWFsaXplZFJlcXVlc3QsXG4gICAgYm9keTogcHJ1bmVHZXRSZXF1ZXN0Qm9keShzZXJpYWxpemVkUmVxdWVzdCksXG4gIH0pXG59XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgdGhlIFNlcnZpY2UgV29ya2VyIEFQSSBpcyBzdXBwcm90ZWQgYW5kIGF2YWlsYWJsZVxuICogaW4gdGhlIGN1cnJlbnQgYnJvd3NpbmcgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzU2VydmljZVdvcmtlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICdzZXJ2aWNlV29ya2VyJyBpbiBuYXZpZ2F0b3IgJiZcbiAgICB0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnICYmXG4gICAgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOidcbiAgKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudCBicm93c2VyXG4gKiBzdXBwb3J0cyBgUmVhZGFibGVTdHJlYW1gIGFzIGEgYFRyYW5zZmVyYWJsZWAgd2hlbiBwb3N0aW5nXG4gKiBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVhZGFibGVTdHJlYW1UcmFuc2ZlcigpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgc3RhcnQ6IChjb250cm9sbGVyKSA9PiBjb250cm9sbGVyLmNsb3NlKCksXG4gICAgfSlcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2VDaGFubmVsKClcbiAgICBtZXNzYWdlLnBvcnQxLnBvc3RNZXNzYWdlKHN0cmVhbSwgW3N0cmVhbV0pXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSAncmV0dGltZSdcbmltcG9ydCB7IFN0YXJ0T3B0aW9ucywgU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHQgfSBmcm9tICcuLi9nbG9zc2FyeSdcbmltcG9ydCB7IGRlc2VyaWFsaXplUmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL2Rlc2VyaWFsaXplUmVxdWVzdCdcbmltcG9ydCB7IHN1cHBvcnRzUmVhZGFibGVTdHJlYW1UcmFuc2ZlciB9IGZyb20gJy4uLy4uL3V0aWxzL3N1cHBvcnRzJ1xuaW1wb3J0IHsgUmVxdWVzdEhhbmRsZXIgfSBmcm9tICd+L2NvcmUvaGFuZGxlcnMvUmVxdWVzdEhhbmRsZXInXG5pbXBvcnQgeyBoYW5kbGVSZXF1ZXN0IH0gZnJvbSAnfi9jb3JlL3V0aWxzL2hhbmRsZVJlcXVlc3QnXG5pbXBvcnQgeyBSZXF1aXJlZERlZXAgfSBmcm9tICd+L2NvcmUvdHlwZVV0aWxzJ1xuaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5pbXBvcnQgeyB0b1Jlc3BvbnNlSW5pdCB9IGZyb20gJ34vY29yZS91dGlscy90b1Jlc3BvbnNlSW5pdCdcbmltcG9ydCB7IGlzSGFuZGxlcktpbmQgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvaXNIYW5kbGVyS2luZCdcblxuY29uc3QgU1VQUE9SVFNfUkVBREFCTEVfU1RSRUFNX1RSQU5TRkVSID0gc3VwcG9ydHNSZWFkYWJsZVN0cmVhbVRyYW5zZmVyKClcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RMaXN0ZW5lciA9IChcbiAgY29udGV4dDogU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHQsXG4gIG9wdGlvbnM6IFJlcXVpcmVkRGVlcDxTdGFydE9wdGlvbnM+LFxuKTogRW1pdHRlci5MaXN0ZW5lclR5cGU8dHlwZW9mIGNvbnRleHQud29ya2VyQ2hhbm5lbCwgJ1JFUVVFU1QnPiA9PiB7XG4gIHJldHVybiBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAvLyBUcmVhdCBhbnkgaW5jb21pbmcgcmVxdWVzdHMgZnJvbSB0aGUgd29ya2VyIGFzIHBhc3N0aHJvdWdoXG4gICAgLy8gaWYgYHdvcmtlci5zdG9wKClgIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhpcyBjbGllbnQuXG4gICAgaWYgKFxuICAgICAgIWNvbnRleHQuaXNNb2NraW5nRW5hYmxlZCAmJlxuICAgICAgY29udGV4dC53b3JrZXJTdG9wcGVkQXQgJiZcbiAgICAgIGV2ZW50LmRhdGEuaW50ZXJjZXB0ZWRBdCA+IGNvbnRleHQud29ya2VyU3RvcHBlZEF0XG4gICAgKSB7XG4gICAgICBldmVudC5wb3N0TWVzc2FnZSgnUEFTU1RIUk9VR0gnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdElkID0gZXZlbnQuZGF0YS5pZFxuICAgIGNvbnN0IHJlcXVlc3QgPSBkZXNlcmlhbGl6ZVJlcXVlc3QoZXZlbnQuZGF0YSlcbiAgICBjb25zdCByZXF1ZXN0Q2xvbmVGb3JMb2dzID0gcmVxdWVzdC5jbG9uZSgpXG5cbiAgICAvLyBNYWtlIHRoaXMgdGhlIGZpcnN0IHJlcXVlc3QgY2xvbmUgYmVmb3JlIHRoZVxuICAgIC8vIHJlcXVlc3QgcmVzb2x1dGlvbiBwaXBlbGluZSBldmVuIHN0YXJ0cy5cbiAgICAvLyBTdG9yZSB0aGUgY2xvbmUgaW4gY2FjaGUgc28gdGhlIGZpcnN0IG1hdGNoaW5nXG4gICAgLy8gcmVxdWVzdCBoYW5kbGVyIHdvdWxkIHNraXAgdGhlIGNsb25pbmcgcGhhc2UuXG4gICAgY29uc3QgcmVxdWVzdENsb25lID0gcmVxdWVzdC5jbG9uZSgpXG4gICAgUmVxdWVzdEhhbmRsZXIuY2FjaGUuc2V0KHJlcXVlc3QsIHJlcXVlc3RDbG9uZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBoYW5kbGVSZXF1ZXN0KFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGNvbnRleHQuZ2V0UmVxdWVzdEhhbmRsZXJzKCkuZmlsdGVyKGlzSGFuZGxlcktpbmQoJ1JlcXVlc3RIYW5kbGVyJykpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb250ZXh0LmVtaXR0ZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBvblBhc3N0aHJvdWdoUmVzcG9uc2UoKSB7XG4gICAgICAgICAgICBldmVudC5wb3N0TWVzc2FnZSgnUEFTU1RIUk9VR0gnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgb25Nb2NrZWRSZXNwb25zZShyZXNwb25zZSwgeyBoYW5kbGVyLCBwYXJzZWRSZXN1bHQgfSkge1xuICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIG1vY2tlZCByZXNwb25zZSBzbyBpdHMgYm9keSBjb3VsZCBiZSByZWFkXG4gICAgICAgICAgICAvLyB0byBidWZmZXIgdG8gYmUgc2VudCB0byB0aGUgd29ya2VyIGFuZCBhbHNvIGluIHRoZVxuICAgICAgICAgICAgLy8gXCIubG9nKClcIiBtZXRob2Qgb2YgdGhlIHJlcXVlc3QgaGFuZGxlci5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ2xvbmUgPSByZXNwb25zZS5jbG9uZSgpXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUNsb25lRm9yTG9ncyA9IHJlc3BvbnNlLmNsb25lKClcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSW5pdCA9IHRvUmVzcG9uc2VJbml0KHJlc3BvbnNlKVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBub3RlIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdHJhbnNmZXJyaW5nIGEgXCJSZWFkYWJsZVN0cmVhbVwiLlxuICAgICAgICAgICAgICogQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGF0IGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSB3b3JrZXIuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChTVVBQT1JUU19SRUFEQUJMRV9TVFJFQU1fVFJBTlNGRVIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VTdHJlYW1Pck51bGwgPSByZXNwb25zZS5ib2R5XG5cbiAgICAgICAgICAgICAgZXZlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgJ01PQ0tfUkVTUE9OU0UnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLnJlc3BvbnNlSW5pdCxcbiAgICAgICAgICAgICAgICAgIGJvZHk6IHJlc3BvbnNlU3RyZWFtT3JOdWxsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VTdHJlYW1Pck51bGwgPyBbcmVzcG9uc2VTdHJlYW1Pck51bGxdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQG5vdGUgSWYgd2UgYXJlIGhlcmUsIHRoaXMgbWVhbnMgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndFxuICAgICAgICAgICAgICAgKiBzdXBwb3J0IFwiUmVhZGFibGVTdHJlYW1cIiBhcyB0cmFuc2ZlcmFibGUuIEluIHRoYXQgY2FzZSxcbiAgICAgICAgICAgICAgICogYXR0ZW1wdCB0byByZWFkIHRoZSBub24tZW1wdHkgcmVzcG9uc2UgYm9keSBhcyBBcnJheUJ1ZmZlciwgaWYgaXQncyBub3QgZW1wdHkuXG4gICAgICAgICAgICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21zd2pzL21zdy9pc3N1ZXMvMTgyN1xuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCdWZmZXJPck51bGwgPVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgOiBhd2FpdCByZXNwb25zZUNsb25lLmFycmF5QnVmZmVyKClcblxuICAgICAgICAgICAgICBldmVudC5wb3N0TWVzc2FnZSgnTU9DS19SRVNQT05TRScsIHtcbiAgICAgICAgICAgICAgICAuLi5yZXNwb25zZUluaXQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVzcG9uc2VCdWZmZXJPck51bGwsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5xdWlldCkge1xuICAgICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIub25jZSgncmVzcG9uc2U6bW9ja2VkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RDbG9uZUZvckxvZ3MsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VDbG9uZUZvckxvZ3MsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRSZXN1bHQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBkZXZVdGlscy5lcnJvcihcbiAgICAgICAgICBgVW5jYXVnaHQgZXhjZXB0aW9uIGluIHRoZSByZXF1ZXN0IGhhbmRsZXIgZm9yIFwiJXMgJXNcIjpcblxuJXNcblxuVGhpcyBleGNlcHRpb24gaGFzIGJlZW4gZ3JhY2VmdWxseSBoYW5kbGVkIGFzIGEgNTAwIHJlc3BvbnNlLCBob3dldmVyLCBpdCdzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHJlc29sdmUgdGhpcyBlcnJvciwgYXMgaXQgaW5kaWNhdGVzIGEgbWlzdGFrZSBpbiB5b3VyIGNvZGUuIElmIHlvdSB3aXNoIHRvIG1vY2sgYW4gZXJyb3IgcmVzcG9uc2UsIHBsZWFzZSBzZWUgdGhpcyBndWlkZTogaHR0cHM6Ly9tc3dqcy5pby9kb2NzL2h0dHAvbW9ja2luZy1yZXNwb25zZXMvZXJyb3ItcmVzcG9uc2VzYCxcbiAgICAgICAgICByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgICBlcnJvci5zdGFjayA/PyBlcnJvcixcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFRyZWF0IGFsbCBvdGhlciBleGNlcHRpb25zIGluIGEgcmVxdWVzdCBoYW5kbGVyIGFzIHVuaW50ZW5kZWQsXG4gICAgICAgIC8vIGFsZXJ0aW5nIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIHRoYXQgbmVlZHMgZml4aW5nLlxuICAgICAgICBldmVudC5wb3N0TWVzc2FnZSgnTU9DS19SRVNQT05TRScsIHtcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgICBzdGF0dXNUZXh0OiAnUmVxdWVzdCBIYW5kbGVyIEVycm9yJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5pbXBvcnQgdHlwZSB7IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0IH0gZnJvbSAnLi4vc2V0dXBXb3JrZXIvZ2xvc3NhcnknXG5pbXBvcnQgeyBEZWZlcnJlZFByb21pc2UgfSBmcm9tICdAb3Blbi1kcmFmdC9kZWZlcnJlZC1wcm9taXNlJ1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHJlZ2lzdGVyZWQgU2VydmljZSBXb3JrZXIgaGFzIGJlZW5cbiAqIGdlbmVyYXRlZCBieSB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuXG4gKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgdGhlIHdvcmtlciBzY3JpcHRzIG1pc21hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tXb3JrZXJJbnRlZ3JpdHkoXG4gIGNvbnRleHQ6IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludGVncml0eUNoZWNrUHJvbWlzZSA9IG5ldyBEZWZlcnJlZFByb21pc2U8dm9pZD4oKVxuXG4gIC8vIFJlcXVlc3QgdGhlIGludGVncml0eSBjaGVja3N1bSBmcm9tIHRoZSByZWdpc3RlcmVkIHdvcmtlci5cbiAgY29udGV4dC53b3JrZXJDaGFubmVsLnBvc3RNZXNzYWdlKCdJTlRFR1JJVFlfQ0hFQ0tfUkVRVUVTVCcpXG4gIGNvbnRleHQud29ya2VyQ2hhbm5lbC5vbmNlKCdJTlRFR1JJVFlfQ0hFQ0tfUkVTUE9OU0UnLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGNoZWNrc3VtLCBwYWNrYWdlVmVyc2lvbiB9ID0gZXZlbnQuZGF0YVxuXG4gICAgLy8gQ29tcGFyZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgU2VydmljZSBXb3JrZXIgYW5kIHRoZVxuICAgIC8vIGdsb2JhbCB2YXJpYWJsZSBzZXQgZHVyaW5nIHRoZSBidWlsZC5cblxuICAgIC8vIFRoZSBpbnRlZ3JpdHkgaXMgdmFsaWRhdGVkIGJhc2VkIG9uIHRoZSB3b3JrZXIgc2NyaXB0J3MgY2hlY2tzdW1cbiAgICAvLyB0aGF0J3MgZGVyaXZlZCBmcm9tIGl0cyBtaW5pZmllZCBjb250ZW50IGR1cmluZyB0aGUgYnVpbGQuXG4gICAgLy8gVGhlIFwiU0VSVklDRV9XT1JLRVJfQ0hFQ0tTVU1cIiBnbG9iYWwgdmFyaWFibGUgaXMgaW5qZWN0ZWQgYnkgdGhlIGJ1aWxkLlxuICAgIGlmIChjaGVja3N1bSAhPT0gU0VSVklDRV9XT1JLRVJfQ0hFQ0tTVU0pIHtcbiAgICAgIGRldlV0aWxzLndhcm4oXG4gICAgICAgIGBUaGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgU2VydmljZSBXb3JrZXIgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGEgZGlmZmVyZW50IHZlcnNpb24gb2YgTVNXICgke3BhY2thZ2VWZXJzaW9ufSkgYW5kIG1heSBub3QgYmUgZnVsbHkgY29tcGF0aWJsZSB3aXRoIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi5cblxuSXQncyByZWNvbW1lbmRlZCB5b3UgdXBkYXRlIHlvdXIgd29ya2VyIHNjcmlwdCBieSBydW5uaW5nIHRoaXMgY29tbWFuZDpcblxuICBcXHUyMDIyIG5weCBtc3cgaW5pdCA8UFVCTElDX0RJUj5cblxuWW91IGNhbiBhbHNvIGF1dG9tYXRlIHRoaXMgcHJvY2VzcyBhbmQgbWFrZSB0aGUgd29ya2VyIHNjcmlwdCB1cGRhdGUgYXV0b21hdGljYWxseSB1cG9uIHRoZSBsaWJyYXJ5IGluc3RhbGxhdGlvbnMuIFJlYWQgbW9yZTogaHR0cHM6Ly9tc3dqcy5pby9kb2NzL2NsaS9pbml0LmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgaW50ZWdyaXR5Q2hlY2tQcm9taXNlLnJlc29sdmUoKVxuICB9KVxuXG4gIHJldHVybiBpbnRlZ3JpdHlDaGVja1Byb21pc2Vcbn1cbiIsICJjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJ1ZmZlcih0ZXh0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKHRleHQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCdWZmZXIoYnVmZmVyOiBBcnJheUJ1ZmZlciwgZW5jb2Rpbmc/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKVxuICByZXR1cm4gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBgQXJyYXlCdWZmZXJgIGZyb20gdGhlIGdpdmVuIGBVaW50OEFycmF5YC5cbiAqIFRha2VzIHRoZSBieXRlIG9mZnNldCBpbnRvIGFjY291bnQgdG8gcHJvZHVjZSB0aGUgcmlnaHQgYnVmZmVyXG4gKiBpbiB0aGUgY2FzZSB3aGVuIHRoZSBidWZmZXIgaXMgYmlnZ2VyIHRoYW4gdGhlIGRhdGEgdmlldy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIoYXJyYXk6IFVpbnQ4QXJyYXkpOiBBcnJheUJ1ZmZlciB7XG4gIHJldHVybiBhcnJheS5idWZmZXIuc2xpY2UoXG4gICAgYXJyYXkuYnl0ZU9mZnNldCxcbiAgICBhcnJheS5ieXRlT2Zmc2V0ICsgYXJyYXkuYnl0ZUxlbmd0aFxuICApXG59XG4iLCAidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcblxuLy8gc3JjL2luZGV4LnRzXG5pbXBvcnQgeyBpc05vZGVQcm9jZXNzIH0gZnJvbSBcImlzLW5vZGUtcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcIm91dHZhcmlhbnRcIjtcblxuLy8gc3JjL2NvbG9ycy50c1xudmFyIGNvbG9yc19leHBvcnRzID0ge307XG5fX2V4cG9ydChjb2xvcnNfZXhwb3J0cywge1xuICBibHVlOiAoKSA9PiBibHVlLFxuICBncmF5OiAoKSA9PiBncmF5LFxuICBncmVlbjogKCkgPT4gZ3JlZW4sXG4gIHJlZDogKCkgPT4gcmVkLFxuICB5ZWxsb3c6ICgpID0+IHllbGxvd1xufSk7XG5mdW5jdGlvbiB5ZWxsb3codGV4dCkge1xuICByZXR1cm4gYFxceDFCWzMzbSR7dGV4dH1cXHgxQlswbWA7XG59XG5mdW5jdGlvbiBibHVlKHRleHQpIHtcbiAgcmV0dXJuIGBcXHgxQlszNG0ke3RleHR9XFx4MUJbMG1gO1xufVxuZnVuY3Rpb24gZ3JheSh0ZXh0KSB7XG4gIHJldHVybiBgXFx4MUJbOTBtJHt0ZXh0fVxceDFCWzBtYDtcbn1cbmZ1bmN0aW9uIHJlZCh0ZXh0KSB7XG4gIHJldHVybiBgXFx4MUJbMzFtJHt0ZXh0fVxceDFCWzBtYDtcbn1cbmZ1bmN0aW9uIGdyZWVuKHRleHQpIHtcbiAgcmV0dXJuIGBcXHgxQlszMm0ke3RleHR9XFx4MUJbMG1gO1xufVxuXG4vLyBzcmMvaW5kZXgudHNcbnZhciBJU19OT0RFID0gaXNOb2RlUHJvY2VzcygpO1xudmFyIExvZ2dlciA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wcmVmaXggPSBgWyR7dGhpcy5uYW1lfV1gO1xuICAgIGNvbnN0IExPR0dFUl9OQU1FID0gZ2V0VmFyaWFibGUoXCJERUJVR1wiKTtcbiAgICBjb25zdCBMT0dHRVJfTEVWRUwgPSBnZXRWYXJpYWJsZShcIkxPR19MRVZFTFwiKTtcbiAgICBjb25zdCBpc0xvZ2dpbmdFbmFibGVkID0gTE9HR0VSX05BTUUgPT09IFwiMVwiIHx8IExPR0dFUl9OQU1FID09PSBcInRydWVcIiB8fCB0eXBlb2YgTE9HR0VSX05BTUUgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5uYW1lLnN0YXJ0c1dpdGgoTE9HR0VSX05BTUUpO1xuICAgIGlmIChpc0xvZ2dpbmdFbmFibGVkKSB7XG4gICAgICB0aGlzLmRlYnVnID0gaXNEZWZpbmVkQW5kTm90RXF1YWxzKExPR0dFUl9MRVZFTCwgXCJkZWJ1Z1wiKSA/IG5vb3AgOiB0aGlzLmRlYnVnO1xuICAgICAgdGhpcy5pbmZvID0gaXNEZWZpbmVkQW5kTm90RXF1YWxzKExPR0dFUl9MRVZFTCwgXCJpbmZvXCIpID8gbm9vcCA6IHRoaXMuaW5mbztcbiAgICAgIHRoaXMuc3VjY2VzcyA9IGlzRGVmaW5lZEFuZE5vdEVxdWFscyhMT0dHRVJfTEVWRUwsIFwic3VjY2Vzc1wiKSA/IG5vb3AgOiB0aGlzLnN1Y2Nlc3M7XG4gICAgICB0aGlzLndhcm5pbmcgPSBpc0RlZmluZWRBbmROb3RFcXVhbHMoTE9HR0VSX0xFVkVMLCBcIndhcm5pbmdcIikgPyBub29wIDogdGhpcy53YXJuaW5nO1xuICAgICAgdGhpcy5lcnJvciA9IGlzRGVmaW5lZEFuZE5vdEVxdWFscyhMT0dHRVJfTEVWRUwsIFwiZXJyb3JcIikgPyBub29wIDogdGhpcy5lcnJvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbmZvID0gbm9vcDtcbiAgICAgIHRoaXMuc3VjY2VzcyA9IG5vb3A7XG4gICAgICB0aGlzLndhcm5pbmcgPSBub29wO1xuICAgICAgdGhpcy5lcnJvciA9IG5vb3A7XG4gICAgICB0aGlzLm9ubHkgPSBub29wO1xuICAgIH1cbiAgfVxuICBwcmVmaXg7XG4gIGV4dGVuZChkb21haW4pIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcihgJHt0aGlzLm5hbWV9OiR7ZG9tYWlufWApO1xuICB9XG4gIC8qKlxuICAgKiBQcmludCBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBleGFtcGxlXG4gICAqIGxvZ2dlci5kZWJ1Zygnbm8gZHVwbGljYXRlcyBmb3VuZCwgY3JlYXRpbmcgYSBkb2N1bWVudC4uLicpXG4gICAqL1xuICBkZWJ1ZyhtZXNzYWdlLCAuLi5wb3NpdGlvbmFscykge1xuICAgIHRoaXMubG9nRW50cnkoe1xuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIG1lc3NhZ2U6IGdyYXkobWVzc2FnZSksXG4gICAgICBwb3NpdGlvbmFscyxcbiAgICAgIHByZWZpeDogdGhpcy5wcmVmaXgsXG4gICAgICBjb2xvcnM6IHtcbiAgICAgICAgcHJlZml4OiBcImdyYXlcIlxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBQcmludCBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBleGFtcGxlXG4gICAqIGxvZ2dlci5pbmZvKCdzdGFydCBwYXJzaW5nLi4uJylcbiAgICovXG4gIGluZm8obWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgICB0aGlzLmxvZ0VudHJ5KHtcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwb3NpdGlvbmFscyxcbiAgICAgIHByZWZpeDogdGhpcy5wcmVmaXgsXG4gICAgICBjb2xvcnM6IHtcbiAgICAgICAgcHJlZml4OiBcImJsdWVcIlxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlMiA9IG5ldyBQZXJmb3JtYW5jZUVudHJ5KCk7XG4gICAgcmV0dXJuIChtZXNzYWdlMiwgLi4ucG9zaXRpb25hbHMyKSA9PiB7XG4gICAgICBwZXJmb3JtYW5jZTIubWVhc3VyZSgpO1xuICAgICAgdGhpcy5sb2dFbnRyeSh7XG4gICAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgICAgbWVzc2FnZTogYCR7bWVzc2FnZTJ9ICR7Z3JheShgJHtwZXJmb3JtYW5jZTIuZGVsdGFUaW1lfW1zYCl9YCxcbiAgICAgICAgcG9zaXRpb25hbHM6IHBvc2l0aW9uYWxzMixcbiAgICAgICAgcHJlZml4OiB0aGlzLnByZWZpeCxcbiAgICAgICAgY29sb3JzOiB7XG4gICAgICAgICAgcHJlZml4OiBcImJsdWVcIlxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBQcmludCBhIHN1Y2Nlc3MgbWVzc2FnZS5cbiAgICogQGV4YW1wbGVcbiAgICogbG9nZ2VyLnN1Y2Nlc3MoJ3N1Y2Nlc3NmdWxseSBjcmVhdGVkIGRvY3VtZW50JylcbiAgICovXG4gIHN1Y2Nlc3MobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgICB0aGlzLmxvZ0VudHJ5KHtcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwb3NpdGlvbmFscyxcbiAgICAgIHByZWZpeDogYFxcdTI3MTQgJHt0aGlzLnByZWZpeH1gLFxuICAgICAgY29sb3JzOiB7XG4gICAgICAgIHRpbWVzdGFtcDogXCJncmVlblwiLFxuICAgICAgICBwcmVmaXg6IFwiZ3JlZW5cIlxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBQcmludCBhIHdhcm5pbmcuXG4gICAqIEBleGFtcGxlXG4gICAqIGxvZ2dlci53YXJuaW5nKCdmb3VuZCBsZWdhY3kgZG9jdW1lbnQgZm9ybWF0JylcbiAgICovXG4gIHdhcm5pbmcobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgICB0aGlzLmxvZ0VudHJ5KHtcbiAgICAgIGxldmVsOiBcIndhcm5pbmdcIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwb3NpdGlvbmFscyxcbiAgICAgIHByZWZpeDogYFxcdTI2QTAgJHt0aGlzLnByZWZpeH1gLFxuICAgICAgY29sb3JzOiB7XG4gICAgICAgIHRpbWVzdGFtcDogXCJ5ZWxsb3dcIixcbiAgICAgICAgcHJlZml4OiBcInllbGxvd1wiXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW50IGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBleGFtcGxlXG4gICAqIGxvZ2dlci5lcnJvcignc29tZXRoaW5nIHdlbnQgd3JvbmcnKVxuICAgKi9cbiAgZXJyb3IobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgICB0aGlzLmxvZ0VudHJ5KHtcbiAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICBtZXNzYWdlLFxuICAgICAgcG9zaXRpb25hbHMsXG4gICAgICBwcmVmaXg6IGBcXHUyNzE2ICR7dGhpcy5wcmVmaXh9YCxcbiAgICAgIGNvbG9yczoge1xuICAgICAgICB0aW1lc3RhbXA6IFwicmVkXCIsXG4gICAgICAgIHByZWZpeDogXCJyZWRcIlxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjayBvbmx5IHdoZW4gdGhlIGxvZ2dpbmcgaXMgZW5hYmxlZC5cbiAgICogVGhpcyBpcyBza2lwcGVkIGluIGl0cyBlbnRpcmV0eSBhbmQgaGFzIG5vIHJ1bnRpbWUgY29zdCBvdGhlcndpc2UuXG4gICAqIFRoaXMgZXhlY3V0ZXMgcmVnYXJkbGVzcyBvZiB0aGUgbG9nIGxldmVsLlxuICAgKiBAZXhhbXBsZVxuICAgKiBsb2dnZXIub25seSgoKSA9PiB7XG4gICAqICAgbG9nZ2VyLmluZm8oJ2FkZGl0aW9uYWwgaW5mbycpXG4gICAqIH0pXG4gICAqL1xuICBvbmx5KGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuICBjcmVhdGVFbnRyeShsZXZlbCwgbWVzc2FnZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lc3RhbXA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlXG4gICAgfTtcbiAgfVxuICBsb2dFbnRyeShhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlLFxuICAgICAgcHJlZml4LFxuICAgICAgY29sb3JzOiBjdXN0b21Db2xvcnMsXG4gICAgICBwb3NpdGlvbmFscyA9IFtdXG4gICAgfSA9IGFyZ3M7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmNyZWF0ZUVudHJ5KGxldmVsLCBtZXNzYWdlKTtcbiAgICBjb25zdCB0aW1lc3RhbXBDb2xvciA9IGN1c3RvbUNvbG9ycz8udGltZXN0YW1wIHx8IFwiZ3JheVwiO1xuICAgIGNvbnN0IHByZWZpeENvbG9yID0gY3VzdG9tQ29sb3JzPy5wcmVmaXggfHwgXCJncmF5XCI7XG4gICAgY29uc3QgY29sb3JpemUgPSB7XG4gICAgICB0aW1lc3RhbXA6IGNvbG9yc19leHBvcnRzW3RpbWVzdGFtcENvbG9yXSxcbiAgICAgIHByZWZpeDogY29sb3JzX2V4cG9ydHNbcHJlZml4Q29sb3JdXG4gICAgfTtcbiAgICBjb25zdCB3cml0ZSA9IHRoaXMuZ2V0V3JpdGVyKGxldmVsKTtcbiAgICB3cml0ZShcbiAgICAgIFtjb2xvcml6ZS50aW1lc3RhbXAodGhpcy5mb3JtYXRUaW1lc3RhbXAoZW50cnkudGltZXN0YW1wKSldLmNvbmNhdChwcmVmaXggIT0gbnVsbCA/IGNvbG9yaXplLnByZWZpeChwcmVmaXgpIDogW10pLmNvbmNhdChzZXJpYWxpemVJbnB1dChtZXNzYWdlKSkuam9pbihcIiBcIiksXG4gICAgICAuLi5wb3NpdGlvbmFscy5tYXAoc2VyaWFsaXplSW5wdXQpXG4gICAgKTtcbiAgfVxuICBmb3JtYXRUaW1lc3RhbXAodGltZXN0YW1wKSB7XG4gICAgcmV0dXJuIGAke3RpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoXG4gICAgICBcImVuLUdCXCJcbiAgICApfToke3RpbWVzdGFtcC5nZXRNaWxsaXNlY29uZHMoKX1gO1xuICB9XG4gIGdldFdyaXRlcihsZXZlbCkge1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJkZWJ1Z1wiOlxuICAgICAgY2FzZSBcInN1Y2Nlc3NcIjpcbiAgICAgIGNhc2UgXCJpbmZvXCI6IHtcbiAgICAgICAgcmV0dXJuIGxvZztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ3YXJuaW5nXCI6IHtcbiAgICAgICAgcmV0dXJuIHdhcm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiZXJyb3JcIjoge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xudmFyIFBlcmZvcm1hbmNlRW50cnkgPSBjbGFzcyB7XG4gIHN0YXJ0VGltZTtcbiAgZW5kVGltZTtcbiAgZGVsdGFUaW1lO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICB9XG4gIG1lYXN1cmUoKSB7XG4gICAgdGhpcy5lbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZGVsdGFUaW1lID0gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7XG4gICAgdGhpcy5kZWx0YVRpbWUgPSBkZWx0YVRpbWUudG9GaXhlZCgyKTtcbiAgfVxufTtcbnZhciBub29wID0gKCkgPT4gdm9pZCAwO1xuZnVuY3Rpb24gbG9nKG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSB7XG4gIGlmIChJU19OT0RFKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZm9ybWF0KG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSArIFwiXFxuXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmxvZyhtZXNzYWdlLCAuLi5wb3NpdGlvbmFscyk7XG59XG5mdW5jdGlvbiB3YXJuKG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSB7XG4gIGlmIChJU19OT0RFKSB7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZm9ybWF0KG1lc3NhZ2UsIC4uLnBvc2l0aW9uYWxzKSArIFwiXFxuXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4obWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpO1xufVxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpIHtcbiAgaWYgKElTX05PREUpIHtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShmb3JtYXQobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpICsgXCJcXG5cIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4ucG9zaXRpb25hbHMpO1xufVxuZnVuY3Rpb24gZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lKSB7XG4gIGlmIChJU19OT0RFKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W3ZhcmlhYmxlTmFtZV07XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFRoaXNbdmFyaWFibGVOYW1lXT8udG9TdHJpbmcoKTtcbn1cbmZ1bmN0aW9uIGlzRGVmaW5lZEFuZE5vdEVxdWFscyh2YWx1ZSwgZXhwZWN0ZWQpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWUgIT09IGV4cGVjdGVkO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplSW5wdXQobWVzc2FnZSkge1xuICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgfVxuICBpZiAobWVzc2FnZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTtcbn1cbmV4cG9ydCB7XG4gIExvZ2dlclxufTtcbiIsICJpbXBvcnQgdHlwZSB7IEVtaXR0ZXIgfSBmcm9tICcuL0VtaXR0ZXInXG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlMZWFrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBlbWl0dGVyOiBFbWl0dGVyPGFueT4sXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY291bnQ6IG51bWJlclxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGBQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICR7Y291bnR9ICR7dHlwZS50b1N0cmluZygpfSBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0YFxuICAgIClcbiAgICB0aGlzLm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJ1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTWVtb3J5TGVha0Vycm9yIH0gZnJvbSAnLi9NZW1vcnlMZWFrRXJyb3InXG5cbmV4cG9ydCB0eXBlIEV2ZW50TWFwID0ge1xuICBbZXZlbnROYW1lOiBzdHJpbmddOiBBcnJheTx1bmtub3duPlxufVxuXG5leHBvcnQgdHlwZSBJbnRlcm5hbEV2ZW50TmFtZXMgPSAnbmV3TGlzdGVuZXInIHwgJ3JlbW92ZUxpc3RlbmVyJ1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbExpc3RlbmVyPEV2ZW50cyBleHRlbmRzIEV2ZW50TWFwPiA9IExpc3RlbmVyPFxuICBbZXZlbnROYW1lOiBrZXlvZiBFdmVudHMsIGxpc3RlbmVyOiBMaXN0ZW5lcjxBcnJheTx1bmtub3duPj5dXG4+XG5cbmV4cG9ydCB0eXBlIExpc3RlbmVyPERhdGEgZXh0ZW5kcyBBcnJheTx1bmtub3duPj4gPSAoLi4uZGF0YTogRGF0YSkgPT4gdm9pZFxuXG4vKipcbiAqIE5vZGUuanMtY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBgRXZlbnRFbWl0dGVyYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyPHsgaGVsbG86IFtzdHJpbmddIH0+KClcbiAqIGVtaXR0ZXIub24oJ2hlbGxvJywgKG5hbWUpID0+IGNvbnNvbGUubG9nKG5hbWUpKVxuICogZW1pdHRlci5lbWl0KCdoZWxsbycsICdKb2huJylcbiAqL1xuZXhwb3J0IGNsYXNzIEVtaXR0ZXI8RXZlbnRzIGV4dGVuZHMgRXZlbnRNYXA+IHtcbiAgcHJpdmF0ZSBldmVudHM6IE1hcDxrZXlvZiBFdmVudHMsIEFycmF5PExpc3RlbmVyPGFueT4+PlxuICBwcml2YXRlIG1heExpc3RlbmVyczogbnVtYmVyXG4gIHByaXZhdGUgaGFzV2FybmVkQWJvdXRQb3RlbnRpYWxNZW1vcnlMZWFrOiBib29sZWFuXG5cbiAgc3RhdGljIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMFxuXG4gIHN0YXRpYyBsaXN0ZW5lckNvdW50PEV2ZW50cyBleHRlbmRzIEV2ZW50TWFwPihcbiAgICBlbWl0dGVyOiBFbWl0dGVyPEV2ZW50TWFwPixcbiAgICBldmVudE5hbWU6IGtleW9mIEV2ZW50c1xuICApOiBudW1iZXIge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQ8YW55PihldmVudE5hbWUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMubWF4TGlzdGVuZXJzID0gRW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzXG4gICAgdGhpcy5oYXNXYXJuZWRBYm91dFBvdGVudGlhbE1lbW9yeUxlYWsgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdEludGVybmFsRXZlbnQoXG4gICAgaW50ZXJuYWxFdmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyxcbiAgICBldmVudE5hbWU6IGtleW9mIEV2ZW50cyxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8QXJyYXk8dW5rbm93bj4+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZW1pdChcbiAgICAgIGludGVybmFsRXZlbnROYW1lLFxuICAgICAgLy8gQW55dGhpbmcgdG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5LlxuICAgICAgLi4uKFtldmVudE5hbWUsIGxpc3RlbmVyXSBhcyBFdmVudHNbJ25ld0xpc3RlbmVyJ10gJlxuICAgICAgICBFdmVudHNbJ3JlbW92ZUxpc3RlbmVyJ10pXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0TGlzdGVuZXJzPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWVcbiAgKTogQXJyYXk8TGlzdGVuZXI8QXJyYXk8dW5rbm93bj4+PiB7XG4gICAgLy8gQWx3YXlzIHJldHVybiBhIGNvcHkgb2YgdGhlIGxpc3RlbmVycyBhcnJheVxuICAgIC8vIHNvIHRoZXkgYXJlIGZpeGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBcIl9nZXRMaXN0ZW5lcnNcIiBjYWxsLlxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCB0aGlzLmV2ZW50cy5nZXQoZXZlbnROYW1lKSkgfHwgW11cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUxpc3RlbmVyPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgbGlzdGVuZXJzOiBBcnJheTxMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT4+LFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogQXJyYXk8TGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+PiB7XG4gICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcilcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcHJpdmF0ZSBfd3JhcE9uY2VMaXN0ZW5lcjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+IHtcbiAgICBjb25zdCBvbmNlTGlzdGVuZXIgPSAoLi4uZGF0YTogRXZlbnRzW2tleW9mIEV2ZW50c10pID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBvbmNlTGlzdGVuZXIpXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5vdGUgUmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGxpc3RlbmVyLlxuICAgICAgICogVGhpcyB3YXkgdGhpcyB3cmFwcGVkIHByZXNlcnZlcyBsaXN0ZW5lcnMgdGhhdCBhcmUgYXN5bmMuXG4gICAgICAgKi9cbiAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGlzLCBkYXRhKVxuICAgIH1cblxuICAgIC8vIEluaGVyaXQgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGxpc3RlbmVyLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvbmNlTGlzdGVuZXIsICduYW1lJywgeyB2YWx1ZTogbGlzdGVuZXIubmFtZSB9KVxuXG4gICAgcmV0dXJuIG9uY2VMaXN0ZW5lclxuICB9XG5cbiAgcHVibGljIHNldE1heExpc3RlbmVycyhtYXhMaXN0ZW5lcnM6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMubWF4TGlzdGVuZXJzID0gbWF4TGlzdGVuZXJzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1heCBsaXN0ZW5lciB2YWx1ZSBmb3IgdGhlIGBFbWl0dGVyYCB3aGljaCBpc1xuICAgKiBlaXRoZXIgc2V0IGJ5IGBlbWl0dGVyLnNldE1heExpc3RlbmVycyhuKWAgb3IgZGVmYXVsdHMgdG9cbiAgICogYEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVyc2AuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4TGlzdGVuZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWF4TGlzdGVuZXJzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAgICogVGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgd2lsbCBiZSBzdHJpbmdzIG9yIFN5bWJvbHMuXG4gICAqL1xuICBwdWJsaWMgZXZlbnROYW1lcygpOiBBcnJheTxrZXlvZiBFdmVudHM+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmV2ZW50cy5rZXlzKCkpXG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBjYWxscyBlYWNoIG9mIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIGV2ZW50IG5hbWVkIGBldmVudE5hbWVgLFxuICAgKiBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQsIHBhc3NpbmcgdGhlIHN1cHBsaWVkIGFyZ3VtZW50cyB0byBlYWNoLlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFzIGxpc3RlbmVycywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcjx7IGhlbGxvOiBbc3RyaW5nXSB9PigpXG4gICAqIGVtaXR0ZXIuZW1pdCgnaGVsbG8nLCAnSm9obicpXG4gICAqL1xuICBwdWJsaWMgZW1pdDxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIC4uLmRhdGE6IEV2ZW50c1tFdmVudE5hbWVdXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2dldExpc3RlbmVycyhldmVudE5hbWUpXG4gICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBkYXRhKVxuICAgIH0pXG5cbiAgICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyxcbiAgICBsaXN0ZW5lcjogSW50ZXJuYWxMaXN0ZW5lcjxFdmVudHM+XG4gICk6IHRoaXNcbiAgcHVibGljIGFkZExpc3RlbmVyPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50cyxcbiAgICBsaXN0ZW5lcjogSW50ZXJuYWxMaXN0ZW5lcjxFdmVudHM+IHwgTGlzdGVuZXI8RXZlbnRzW2FueV0+XG4gICk6IHRoaXMge1xuICAgIC8vIEVtaXQgdGhlIGBuZXdMaXN0ZW5lcmAgZXZlbnQgYmVmb3JlIGFkZGluZyB0aGUgbGlzdGVuZXIuXG4gICAgdGhpcy5fZW1pdEludGVybmFsRXZlbnQoJ25ld0xpc3RlbmVyJywgZXZlbnROYW1lLCBsaXN0ZW5lcilcblxuICAgIGNvbnN0IG5leHRMaXN0ZW5lcnMgPSB0aGlzLl9nZXRMaXN0ZW5lcnMoZXZlbnROYW1lKS5jb25jYXQobGlzdGVuZXIpXG4gICAgdGhpcy5ldmVudHMuc2V0KGV2ZW50TmFtZSwgbmV4dExpc3RlbmVycylcblxuICAgIGlmIChcbiAgICAgIHRoaXMubWF4TGlzdGVuZXJzID4gMCAmJlxuICAgICAgdGhpcy5saXN0ZW5lckNvdW50KGV2ZW50TmFtZSkgPiB0aGlzLm1heExpc3RlbmVycyAmJlxuICAgICAgIXRoaXMuaGFzV2FybmVkQWJvdXRQb3RlbnRpYWxNZW1vcnlMZWFrXG4gICAgKSB7XG4gICAgICB0aGlzLmhhc1dhcm5lZEFib3V0UG90ZW50aWFsTWVtb3J5TGVhayA9IHRydWVcblxuICAgICAgY29uc3QgbWVtb3J5TGVha1dhcm5pbmcgPSBuZXcgTWVtb3J5TGVha0Vycm9yKFxuICAgICAgICB0aGlzLFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIHRoaXMubGlzdGVuZXJDb3VudChldmVudE5hbWUpXG4gICAgICApXG4gICAgICBjb25zb2xlLndhcm4obWVtb3J5TGVha1dhcm5pbmcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyBvbihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyxcbiAgICBsaXN0ZW5lcjogSW50ZXJuYWxMaXN0ZW5lcjxFdmVudHM+XG4gICk6IHRoaXNcbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzXG4gIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogJ3JlbW92ZUxpc3RlbmVyJyB8IEV2ZW50TmFtZSxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8YW55PlxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICB9XG5cbiAgcHVibGljIG9uY2UoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPlxuICApOiB0aGlzXG4gIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzXG4gIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMgfCBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPGFueT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICB0aGlzLl93cmFwT25jZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgKVxuICB9XG5cbiAgcHVibGljIHByZXBlbmRMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyxcbiAgICBsaXN0ZW5lcjogSW50ZXJuYWxMaXN0ZW5lcjxFdmVudHM+XG4gICk6IHRoaXNcbiAgcHVibGljIHByZXBlbmRMaXN0ZW5lcjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICBwdWJsaWMgcHJlcGVuZExpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzIHwga2V5b2YgRXZlbnRzLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxhbnk+XG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2dldExpc3RlbmVycyhldmVudE5hbWUpXG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5leHRMaXN0ZW5lcnMgPSBbbGlzdGVuZXJdLmNvbmNhdChsaXN0ZW5lcnMpXG4gICAgICB0aGlzLmV2ZW50cy5zZXQoZXZlbnROYW1lLCBuZXh0TGlzdGVuZXJzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV2ZW50cy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcnMuY29uY2F0KGxpc3RlbmVyKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIHByZXBlbmRPbmNlTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPlxuICApOiB0aGlzXG4gIHB1YmxpYyBwcmVwZW5kT25jZUxpc3RlbmVyPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzXG4gIHB1YmxpYyBwcmVwZW5kT25jZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzIHwga2V5b2YgRXZlbnRzLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxhbnk+XG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnByZXBlbmRMaXN0ZW5lcihcbiAgICAgIGV2ZW50TmFtZSxcbiAgICAgIHRoaXMuX3dyYXBPbmNlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICApXG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMsXG4gICAgbGlzdGVuZXI6IEludGVybmFsTGlzdGVuZXI8RXZlbnRzPlxuICApOiB0aGlzXG4gIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjxFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpc1xuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMgfCBrZXlvZiBFdmVudHMsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPGFueT5cbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZ2V0TGlzdGVuZXJzKGV2ZW50TmFtZSlcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJzLCBsaXN0ZW5lcilcbiAgICAgIHRoaXMuZXZlbnRzLnNldChldmVudE5hbWUsIGxpc3RlbmVycylcblxuICAgICAgLy8gRW1pdCB0aGUgYHJlbW92ZUxpc3RlbmVyYCBldmVudCBhZnRlciByZW1vdmluZyB0aGUgbGlzdGVuZXIuXG4gICAgICB0aGlzLl9lbWl0SW50ZXJuYWxFdmVudCgncmVtb3ZlTGlzdGVuZXInLCBldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb2ZmKFxuICAgIGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzLFxuICAgIGxpc3RlbmVyOiBJbnRlcm5hbExpc3RlbmVyPEV2ZW50cz5cbiAgKTogdGhpc1xuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzXG4gIC8qKlxuICAgKiBBbGlhcyBmb3IgYGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoKWAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGVtaXR0ZXIub2ZmKCdoZWxsbycsIGxpc3RlbmVyKVxuICAgKi9cbiAgcHVibGljIG9mZihcbiAgICBldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50cyxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8YW55PlxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVycyhldmVudE5hbWU/OiBJbnRlcm5hbEV2ZW50TmFtZXMpOiB0aGlzXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU/OiBFdmVudE5hbWVcbiAgKTogdGhpc1xuICBwdWJsaWMgcmVtb3ZlQWxsTGlzdGVuZXJzKFxuICAgIGV2ZW50TmFtZT86IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50c1xuICApOiB0aGlzIHtcbiAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICB0aGlzLmV2ZW50cy5kZWxldGUoZXZlbnROYW1lKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV2ZW50cy5jbGVhcigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyBsaXN0ZW5lcnMoZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMpOiBBcnJheTxMaXN0ZW5lcjxhbnk+PlxuICBwdWJsaWMgbGlzdGVuZXJzPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWVcbiAgKTogQXJyYXk8TGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+PlxuICAvKipcbiAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGFycmF5IG9mIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50IG5hbWVkIGBldmVudE5hbWVgLlxuICAgKi9cbiAgcHVibGljIGxpc3RlbmVycyhldmVudE5hbWU6IEludGVybmFsRXZlbnROYW1lcyB8IGtleW9mIEV2ZW50cykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2dldExpc3RlbmVycyhldmVudE5hbWUpKVxuICB9XG5cbiAgcHVibGljIGxpc3RlbmVyQ291bnQoZXZlbnROYW1lOiBJbnRlcm5hbEV2ZW50TmFtZXMpOiBudW1iZXJcbiAgcHVibGljIGxpc3RlbmVyQ291bnQ8RXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZVxuICApOiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIHRoZSBldmVudCBuYW1lZCBgZXZlbnROYW1lYC5cbiAgICovXG4gIHB1YmxpYyBsaXN0ZW5lckNvdW50KGV2ZW50TmFtZTogSW50ZXJuYWxFdmVudE5hbWVzIHwga2V5b2YgRXZlbnRzKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0TGlzdGVuZXJzKGV2ZW50TmFtZSkubGVuZ3RoXG4gIH1cblxuICBwdWJsaWMgcmF3TGlzdGVuZXJzPEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWVcbiAgKTogQXJyYXk8TGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+PiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzKGV2ZW50TmFtZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BvcGVuLWRyYWZ0L2xvZ2dlcidcbmltcG9ydCB7IEVtaXR0ZXIsIExpc3RlbmVyIH0gZnJvbSAnc3RyaWN0LWV2ZW50LWVtaXR0ZXInXG5cbmV4cG9ydCB0eXBlIEludGVyY2VwdG9yRXZlbnRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5leHBvcnQgdHlwZSBJbnRlcmNlcHRvclN1YnNjcmlwdGlvbiA9ICgpID0+IHZvaWRcblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlciBuYW1lIHRvIGRldGVjdCB3aGVuIGEgc2luZ2xlIHJlcXVlc3RcbiAqIGlzIGJlaW5nIGhhbmRsZWQgYnkgbmVzdGVkIGludGVyY2VwdG9ycyAoWEhSIC0+IENsaWVudFJlcXVlc3QpLlxuICogT2JzY3VyZSBieSBkZXNpZ24gdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggdXNlci1kZWZpbmVkIGhlYWRlcnMuXG4gKiBJZGVhbGx5LCBjb21lIHVwIHdpdGggdGhlIEludGVyY2VwdG9yLWxldmVsIG1lY2hhbmlzbSBmb3IgdGhpcy5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21zd2pzL2ludGVyY2VwdG9ycy9pc3N1ZXMvMzc4XG4gKi9cbmV4cG9ydCBjb25zdCBJTlRFUk5BTF9SRVFVRVNUX0lEX0hFQURFUl9OQU1FID1cbiAgJ3gtaW50ZXJjZXB0b3JzLWludGVybmFsLXJlcXVlc3QtaWQnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxTeW1ib2w8Vj4oc3ltYm9sOiBTeW1ib2wpOiBWIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChcbiAgICAvLyBAdHMtaWdub3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjQ1ODdcbiAgICBnbG9iYWxUaGlzW3N5bWJvbF0gfHwgdW5kZWZpbmVkXG4gIClcbn1cblxuZnVuY3Rpb24gc2V0R2xvYmFsU3ltYm9sKHN5bWJvbDogU3ltYm9sLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgZ2xvYmFsVGhpc1tzeW1ib2xdID0gdmFsdWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUdsb2JhbFN5bWJvbChzeW1ib2w6IFN5bWJvbCk6IHZvaWQge1xuICAvLyBAdHMtaWdub3JlXG4gIGRlbGV0ZSBnbG9iYWxUaGlzW3N5bWJvbF1cbn1cblxuZXhwb3J0IGVudW0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlIHtcbiAgSU5BQ1RJVkUgPSAnSU5BQ1RJVkUnLFxuICBBUFBMWUlORyA9ICdBUFBMWUlORycsXG4gIEFQUExJRUQgPSAnQVBQTElFRCcsXG4gIERJU1BPU0lORyA9ICdESVNQT1NJTkcnLFxuICBESVNQT1NFRCA9ICdESVNQT1NFRCcsXG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgRXZlbnRzIGV4dGVuZHMgUmVjb3JkPGluZmVyIEV2ZW50TmFtZSwgYW55PiA/IEV2ZW50TmFtZSA6IG5ldmVyXG5cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRvcjxFdmVudHMgZXh0ZW5kcyBJbnRlcmNlcHRvckV2ZW50TWFwPiB7XG4gIHByb3RlY3RlZCBlbWl0dGVyOiBFbWl0dGVyPEV2ZW50cz5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnM6IEFycmF5PEludGVyY2VwdG9yU3Vic2NyaXB0aW9uPlxuICBwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXJcblxuICBwdWJsaWMgcmVhZHlTdGF0ZTogSW50ZXJjZXB0b3JSZWFkeVN0YXRlXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzeW1ib2w6IHN5bWJvbCkge1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IEludGVyY2VwdG9yUmVhZHlTdGF0ZS5JTkFDVElWRVxuXG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHN5bWJvbC5kZXNjcmlwdGlvbiEpXG5cbiAgICAvLyBEbyBub3QgbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVyc1xuICAgIC8vIHNvIG5vdCB0byBsaW1pdCB0aGUgbWF4aW11bSBhbW91bnQgb2YgcGFyYWxsZWwgZXZlbnRzIGVtaXR0ZWQuXG4gICAgdGhpcy5lbWl0dGVyLnNldE1heExpc3RlbmVycygwKVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygnY29uc3RydWN0aW5nIHRoZSBpbnRlcmNlcHRvci4uLicpXG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaW50ZXJjZXB0b3IgY2FuIGJlIGFwcGxpZWRcbiAgICogaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2hlY2tFbnZpcm9ubWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgaW50ZXJjZXB0b3IgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAgICogUmV0dXJucyBhbiBhbHJlYWR5IHJ1bm5pbmcgaW50ZXJjZXB0b3IgaW5zdGFuY2UgaWYgaXQncyBwcmVzZW50LlxuICAgKi9cbiAgcHVibGljIGFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyLmV4dGVuZCgnYXBwbHknKVxuICAgIGxvZ2dlci5pbmZvKCdhcHBseWluZyB0aGUgaW50ZXJjZXB0b3IuLi4nKVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkFQUExJRUQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdpbnRlcmNlcHRlZCBhbHJlYWR5IGFwcGxpZWQhJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gdGhpcy5jaGVja0Vudmlyb25tZW50KClcblxuICAgIGlmICghc2hvdWxkQXBwbHkpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCd0aGUgaW50ZXJjZXB0b3IgY2Fubm90IGJlIGFwcGxpZWQgaW4gdGhpcyBlbnZpcm9ubWVudCEnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkFQUExZSU5HXG5cbiAgICAvLyBXaGVuZXZlciBhcHBseWluZyBhIG5ldyBpbnRlcmNlcHRvciwgY2hlY2sgaWYgaXQgaGFzbid0IGJlZW4gYXBwbGllZCBhbHJlYWR5LlxuICAgIC8vIFRoaXMgZW5hYmxlcyB0byBhcHBseSB0aGUgc2FtZSBpbnRlcmNlcHRvciBtdWx0aXBsZSB0aW1lcywgZm9yIGV4YW1wbGUgZnJvbSBhIGRpZmZlcmVudFxuICAgIC8vIGludGVyY2VwdG9yLCBvbmx5IHByb3h5aW5nIGV2ZW50cyBidXQga2VlcGluZyB0aGUgc3R1YnMgaW4gYSBzaW5nbGUgcGxhY2UuXG4gICAgY29uc3QgcnVubmluZ0luc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZSgpXG5cbiAgICBpZiAocnVubmluZ0luc3RhbmNlKSB7XG4gICAgICBsb2dnZXIuaW5mbygnZm91bmQgYSBydW5uaW5nIGluc3RhbmNlLCByZXVzaW5nLi4uJylcblxuICAgICAgLy8gUHJveHkgYW55IGxpc3RlbmVycyB5b3Ugc2V0IG9uIHRoaXMgaW5zdGFuY2UgdG8gdGhlIHJ1bm5pbmcgaW5zdGFuY2UuXG4gICAgICB0aGlzLm9uID0gKGV2ZW50LCBsaXN0ZW5lcikgPT4ge1xuICAgICAgICBsb2dnZXIuaW5mbygncHJveHlpbmcgdGhlIFwiJXNcIiBsaXN0ZW5lcicsIGV2ZW50KVxuXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lcnMgdG8gdGhlIHJ1bm5pbmcgaW5zdGFuY2Ugc28gdGhleSBhcHBlYXJcbiAgICAgICAgLy8gYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbGlzdGVuZXJzIGxpc3QgYW5kIGFyZSBleGVjdXRlZCBmaXJzdC5cbiAgICAgICAgcnVubmluZ0luc3RhbmNlLmVtaXR0ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKVxuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IG9uY2UgdGhpcyBpbnRlcmNlcHRvciBpbnN0YW5jZSBpcyBkaXNwb3NlZCxcbiAgICAgICAgLy8gaXQgcmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGl0IGhhcyBhcHBlbmRlZCB0byB0aGUgcnVubmluZyBpbnRlcmNlcHRvciBpbnN0YW5jZS5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdJbnN0YW5jZS5lbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgICBsb2dnZXIuaW5mbygncmVtb3ZlZCBwcm94aWVkIFwiJXNcIiBsaXN0ZW5lciEnLCBldmVudClcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPSBJbnRlcmNlcHRvclJlYWR5U3RhdGUuQVBQTElFRFxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnbm8gcnVubmluZyBpbnN0YW5jZSBmb3VuZCwgc2V0dGluZyB1cCBhIG5ldyBpbnN0YW5jZS4uLicpXG5cbiAgICAvLyBTZXR1cCB0aGUgaW50ZXJjZXB0b3IuXG4gICAgdGhpcy5zZXR1cCgpXG5cbiAgICAvLyBTdG9yZSB0aGUgbmV3bHkgYXBwbGllZCBpbnRlcmNlcHRvciBpbnN0YW5jZSBnbG9iYWxseS5cbiAgICB0aGlzLnNldEluc3RhbmNlKClcblxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IEludGVyY2VwdG9yUmVhZHlTdGF0ZS5BUFBMSUVEXG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgdGhlIG1vZHVsZSBhdWdtZW50cyBhbmQgc3R1YnMgbmVjZXNzYXJ5IGZvciB0aGlzIGludGVyY2VwdG9yLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgcnVuIGlmIHRoZXJlJ3MgYSBydW5uaW5nIGludGVyY2VwdG9yIGluc3RhbmNlXG4gICAqIHRvIHByZXZlbnQgaW5zdGFudGlhdGluZyBhbiBpbnRlcmNlcHRvciBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIHByb3RlY3RlZCBzZXR1cCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byB0aGUgaW50ZXJjZXB0b3IncyBwdWJsaWMgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cz4+KFxuICAgIGV2ZW50OiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzIHtcbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5leHRlbmQoJ29uJylcblxuICAgIGlmIChcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9PT0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkRJU1BPU0lORyB8fFxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBJbnRlcmNlcHRvclJlYWR5U3RhdGUuRElTUE9TRURcbiAgICApIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdjYW5ub3QgbGlzdGVuIHRvIGV2ZW50cywgYWxyZWFkeSBkaXNwb3NlZCEnKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnYWRkaW5nIFwiJXNcIiBldmVudCBsaXN0ZW5lcjonLCBldmVudCwgbGlzdGVuZXIpXG5cbiAgICB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGxpc3RlbmVyKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudDogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgdGhpcy5lbWl0dGVyLm9uY2UoZXZlbnQsIGxpc3RlbmVyKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cz4+KFxuICAgIGV2ZW50OiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzIHtcbiAgICB0aGlzLmVtaXR0ZXIub2ZmKGV2ZW50LCBsaXN0ZW5lcilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudD86IEV2ZW50TmFtZVxuICApOiB0aGlzIHtcbiAgICB0aGlzLmVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgYW55IHNpZGUtZWZmZWN0cyB0aGlzIGludGVyY2VwdG9yIGhhcyBpbnRyb2R1Y2VkLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuZXh0ZW5kKCdkaXNwb3NlJylcblxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IEludGVyY2VwdG9yUmVhZHlTdGF0ZS5ESVNQT1NFRCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ2Nhbm5vdCBkaXNwb3NlLCBhbHJlYWR5IGRpc3Bvc2VkIScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnZGlzcG9zaW5nIHRoZSBpbnRlcmNlcHRvci4uLicpXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gSW50ZXJjZXB0b3JSZWFkeVN0YXRlLkRJU1BPU0lOR1xuXG4gICAgaWYgKCF0aGlzLmdldEluc3RhbmNlKCkpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdubyBpbnRlcmNlcHRvcnMgcnVubmluZywgc2tpcHBpbmcgZGlzcG9zZS4uLicpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdGhlIGdsb2JhbCBzeW1ib2wgYXMgc29vbiBhcyBwb3NzaWJsZSxcbiAgICAvLyBpbmRpY2F0aW5nIHRoYXQgdGhlIGludGVyY2VwdG9yIGlzIG5vIGxvbmdlciBydW5uaW5nLlxuICAgIHRoaXMuY2xlYXJJbnN0YW5jZSgpXG5cbiAgICBsb2dnZXIuaW5mbygnZ2xvYmFsIHN5bWJvbCBkZWxldGVkOicsIGdldEdsb2JhbFN5bWJvbCh0aGlzLnN5bWJvbCkpXG5cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdkaXNwb3Npbmcgb2YgJWQgc3Vic2NyaXB0aW9ucy4uLicsIHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGgpXG5cbiAgICAgIGZvciAoY29uc3QgZGlzcG9zZSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgZGlzcG9zZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdXG5cbiAgICAgIGxvZ2dlci5pbmZvKCdkaXNwb3NlZCBvZiBhbGwgc3Vic2NyaXB0aW9ucyEnLCB0aGlzLnN1YnNjcmlwdGlvbnMubGVuZ3RoKVxuICAgIH1cblxuICAgIHRoaXMuZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgIGxvZ2dlci5pbmZvKCdkZXN0cm95ZWQgdGhlIGxpc3RlbmVyIScpXG5cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBJbnRlcmNlcHRvclJlYWR5U3RhdGUuRElTUE9TRURcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5zdGFuY2UoKTogdGhpcyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRHbG9iYWxTeW1ib2w8dGhpcz4odGhpcy5zeW1ib2wpXG4gICAgdGhpcy5sb2dnZXIuaW5mbygncmV0cmlldmVkIGdsb2JhbCBpbnN0YW5jZTonLCBpbnN0YW5jZT8uY29uc3RydWN0b3I/Lm5hbWUpXG4gICAgcmV0dXJuIGluc3RhbmNlXG4gIH1cblxuICBwcml2YXRlIHNldEluc3RhbmNlKCk6IHZvaWQge1xuICAgIHNldEdsb2JhbFN5bWJvbCh0aGlzLnN5bWJvbCwgdGhpcylcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdzZXQgZ2xvYmFsIGluc3RhbmNlIScsIHRoaXMuc3ltYm9sLmRlc2NyaXB0aW9uKVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckluc3RhbmNlKCk6IHZvaWQge1xuICAgIGRlbGV0ZUdsb2JhbFN5bWJvbCh0aGlzLnN5bWJvbClcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdjbGVhcmVkIGdsb2JhbCBpbnN0YW5jZSEnLCB0aGlzLnN5bWJvbC5kZXNjcmlwdGlvbilcbiAgfVxufVxuIiwgIi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gSUQgc3RyaW5nIHRvIHJlcHJlc2VudCBhIHJlcXVlc3QuXG4gKiBAZXhhbXBsZVxuICogY3JlYXRlUmVxdWVzdElkKClcbiAqIC8vIFwiZjc3NGI2YzljNjAwZlwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0SWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udHJvbGxlciB9IGZyb20gJy4vUmVxdWVzdENvbnRyb2xsZXInXG5cbmV4cG9ydCBjb25zdCBJU19QQVRDSEVEX01PRFVMRTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnaXNQYXRjaGVkTW9kdWxlJylcblxuLyoqXG4gKiBAbm90ZSBFeHBvcnQgYFJlcXVlc3RDb250cm9sbGVyYCBhcyBhIHR5cGUgb25seS5cbiAqIEl0J3MgbmV2ZXIgbWVhbnQgdG8gYmUgY3JlYXRlZCBpbiB0aGUgdXNlcmxhbmQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmVxdWVzdENvbnRyb2xsZXIgfVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0Q3JlZGVudGlhbHMgPSAnb21pdCcgfCAnaW5jbHVkZScgfCAnc2FtZS1vcmlnaW4nXG5cbmV4cG9ydCB0eXBlIEh0dHBSZXF1ZXN0RXZlbnRNYXAgPSB7XG4gIHJlcXVlc3Q6IFtcbiAgICBhcmdzOiB7XG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgICByZXF1ZXN0SWQ6IHN0cmluZ1xuICAgICAgY29udHJvbGxlcjogUmVxdWVzdENvbnRyb2xsZXJcbiAgICB9XG4gIF1cbiAgcmVzcG9uc2U6IFtcbiAgICBhcmdzOiB7XG4gICAgICByZXNwb25zZTogUmVzcG9uc2VcbiAgICAgIGlzTW9ja2VkUmVzcG9uc2U6IGJvb2xlYW5cbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgfVxuICBdXG4gIHVuaGFuZGxlZEV4Y2VwdGlvbjogW1xuICAgIGFyZ3M6IHtcbiAgICAgIGVycm9yOiB1bmtub3duXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgICByZXF1ZXN0SWQ6IHN0cmluZ1xuICAgICAgY29udHJvbGxlcjogUmVxdWVzdENvbnRyb2xsZXJcbiAgICB9XG4gIF1cbn1cbiIsICJpbXBvcnQgeyBEZWZlcnJlZFByb21pc2UgfSBmcm9tICdAb3Blbi1kcmFmdC9kZWZlcnJlZC1wcm9taXNlJ1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnb3V0dmFyaWFudCdcbmltcG9ydCB7IEludGVyY2VwdG9yRXJyb3IgfSBmcm9tICcuL0ludGVyY2VwdG9yRXJyb3InXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRyb2xsZXJTb3VyY2Uge1xuICBwYXNzdGhyb3VnaCgpOiB2b2lkXG4gIHJlc3BvbmRXaXRoKHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWRcbiAgZXJyb3JXaXRoKHJlYXNvbj86IHVua25vd24pOiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0Q29udHJvbGxlciB7XG4gIHN0YXRpYyBQRU5ESU5HID0gMCBhcyBjb25zdFxuICBzdGF0aWMgUEFTU1RIUk9VR0ggPSAxIGFzIGNvbnN0XG4gIHN0YXRpYyBSRVNQT05TRSA9IDIgYXMgY29uc3RcbiAgc3RhdGljIEVSUk9SID0gMyBhcyBjb25zdFxuXG4gIHB1YmxpYyByZWFkeVN0YXRlOiBudW1iZXJcblxuICAvKipcbiAgICogQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGlzIGNvbnRyb2xsZXIgaGFuZGxlcyBhIHJlcXVlc3QuXG4gICAqIFNlZSBgY29udHJvbGxlci5yZWFkeVN0YXRlYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgaGFuZGxpbmcgcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZWQ6IFByb21pc2U8dm9pZD5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc291cmNlOiBSZXF1ZXN0Q29udHJvbGxlclNvdXJjZVxuICApIHtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZXF1ZXN0Q29udHJvbGxlci5QRU5ESU5HXG4gICAgdGhpcy5oYW5kbGVkID0gbmV3IERlZmVycmVkUHJvbWlzZTx2b2lkPigpXG4gIH1cblxuICBnZXQgI2hhbmRsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlZCBhcyBEZWZlcnJlZFByb21pc2U8dm9pZD5cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoaXMgcmVxdWVzdCBhcy1pcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwYXNzdGhyb3VnaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpbnZhcmlhbnQuYXMoXG4gICAgICBJbnRlcmNlcHRvckVycm9yLFxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBSZXF1ZXN0Q29udHJvbGxlci5QRU5ESU5HLFxuICAgICAgJ0ZhaWxlZCB0byBwYXNzdGhyb3VnaCB0aGUgXCIlcyAlc1wiIHJlcXVlc3Q6IHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCcsXG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kLFxuICAgICAgdGhpcy5yZXF1ZXN0LnVybFxuICAgIClcblxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlcXVlc3RDb250cm9sbGVyLlBBU1NUSFJPVUdIXG4gICAgYXdhaXQgdGhpcy5zb3VyY2UucGFzc3Rocm91Z2goKVxuICAgIHRoaXMuI2hhbmRsZWQucmVzb2x2ZSgpXG4gIH1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byB0aGlzIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gYFJlc3BvbnNlYCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29udHJvbGxlci5yZXNwb25kV2l0aChuZXcgUmVzcG9uc2UoKSlcbiAgICogY29udHJvbGxlci5yZXNwb25kV2l0aChSZXNwb25zZS5qc29uKHsgaWQgfSkpXG4gICAqIGNvbnRyb2xsZXIucmVzcG9uZFdpdGgoUmVzcG9uc2UuZXJyb3IoKSlcbiAgICovXG4gIHB1YmxpYyByZXNwb25kV2l0aChyZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBpbnZhcmlhbnQuYXMoXG4gICAgICBJbnRlcmNlcHRvckVycm9yLFxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBSZXF1ZXN0Q29udHJvbGxlci5QRU5ESU5HLFxuICAgICAgJ0ZhaWxlZCB0byByZXNwb25kIHRvIHRoZSBcIiVzICVzXCIgcmVxdWVzdCB3aXRoIFwiJWQgJXNcIjogdGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkICglZCknLFxuICAgICAgdGhpcy5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHRoaXMucmVxdWVzdC51cmwsXG4gICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5zdGF0dXNUZXh0IHx8ICdPSycsXG4gICAgICB0aGlzLnJlYWR5U3RhdGVcbiAgICApXG5cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZXF1ZXN0Q29udHJvbGxlci5SRVNQT05TRVxuICAgIHRoaXMuI2hhbmRsZWQucmVzb2x2ZSgpXG5cbiAgICAvKipcbiAgICAgKiBAbm90ZSBBbHRob3VnaCBgc291cmNlLnJlc3BvbmRXaXRoKClgIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cyxcbiAgICAgKiBkbyBOT1QgYXdhaXQgaXQgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkuIEF3YWl0aW5nIGl0IHdpbGwgc2hvcnQtY2lyY3VpdFxuICAgICAqIHRoZSByZXF1ZXN0IGxpc3RlbmVyIGludm9jYXRpb24gYXMgc29vbiBhcyBhIGxpc3RlbmVyIHJlc3BvbmRzIHRvIGEgcmVxdWVzdC5cbiAgICAgKiBJZGVhbGx5LCB0aGF0J3Mgd2hhdCB3ZSB3YW50LCBidXQgdGhhdCdzIG5vdCB3aGF0IHdlIHByb21pc2UgdGhlIHVzZXIuXG4gICAgICovXG4gICAgdGhpcy5zb3VyY2UucmVzcG9uZFdpdGgocmVzcG9uc2UpXG4gIH1cblxuICAvKipcbiAgICogRXJyb3IgdGhpcyByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29udHJvbGxlci5lcnJvcldpdGgoKVxuICAgKiBjb250cm9sbGVyLmVycm9yV2l0aChuZXcgRXJyb3IoJ09vcHMhJykpXG4gICAqIGNvbnRyb2xsZXIuZXJyb3JXaXRoKHsgbWVzc2FnZTogJ09vcHMhJ30pXG4gICAqL1xuICBwdWJsaWMgZXJyb3JXaXRoKHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICBpbnZhcmlhbnQuYXMoXG4gICAgICBJbnRlcmNlcHRvckVycm9yLFxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBSZXF1ZXN0Q29udHJvbGxlci5QRU5ESU5HLFxuICAgICAgJ0ZhaWxlZCB0byBlcnJvciB0aGUgXCIlcyAlc1wiIHJlcXVlc3Qgd2l0aCBcIiVzXCI6IHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCAoJWQpJyxcbiAgICAgIHRoaXMucmVxdWVzdC5tZXRob2QsXG4gICAgICB0aGlzLnJlcXVlc3QudXJsLFxuICAgICAgcmVhc29uPy50b1N0cmluZygpLFxuICAgICAgdGhpcy5yZWFkeVN0YXRlXG4gICAgKVxuXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gUmVxdWVzdENvbnRyb2xsZXIuRVJST1JcbiAgICB0aGlzLnNvdXJjZS5lcnJvcldpdGgocmVhc29uKVxuICAgIHRoaXMuI2hhbmRsZWQucmVzb2x2ZSgpXG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgSW50ZXJjZXB0b3JFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ0ludGVyY2VwdG9yRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEludGVyY2VwdG9yRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIFVSTCBzdHJpbmdcbiAqIGNhbiBiZSBwYXJzZWQgaW50byBhIGBVUkxgIGluc3RhbmNlLlxuICogQSBzdWJzdGl0dXRlIGZvciBgVVJMLmNhblBhcnNlKClgIGZvciBOb2RlLmpzIDE4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuUGFyc2VVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBuZXcgVVJMKHVybClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgYmVoaW5kIHRoZSBzeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQnlTeW1ib2w8VD4oXG4gIHN5bWJvbE5hbWU6IHN0cmluZyxcbiAgc291cmNlOiBvYmplY3Rcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBvd25TeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpXG5cbiAgY29uc3Qgc3ltYm9sID0gb3duU3ltYm9scy5maW5kKChzeW1ib2wpID0+IHtcbiAgICByZXR1cm4gc3ltYm9sLmRlc2NyaXB0aW9uID09PSBzeW1ib2xOYW1lXG4gIH0pXG5cbiAgaWYgKHN5bWJvbCkge1xuICAgIHJldHVybiBSZWZsZWN0LmdldChzb3VyY2UsIHN5bWJvbClcbiAgfVxuXG4gIHJldHVyblxufVxuIiwgImltcG9ydCB7IGNhblBhcnNlVXJsIH0gZnJvbSAnLi9jYW5QYXJzZVVybCdcbmltcG9ydCB7IGdldFZhbHVlQnlTeW1ib2wgfSBmcm9tICcuL2dldFZhbHVlQnlTeW1ib2wnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hSZXNwb25zZUluaXQgZXh0ZW5kcyBSZXNwb25zZUluaXQge1xuICB1cmw/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFVuZGljaUZldGNoSW50ZXJuYWxTdGF0ZSB7XG4gIGFib3J0ZWQ6IGJvb2xlYW5cbiAgcmFuZ2VSZXF1ZXN0ZWQ6IGJvb2xlYW5cbiAgdGltaW5nQWxsb3dQYXNzZWQ6IGJvb2xlYW5cbiAgcmVxdWVzdEluY2x1ZGVzQ3JlZGVudGlhbHM6IGJvb2xlYW5cbiAgdHlwZTogUmVzcG9uc2VUeXBlXG4gIHN0YXR1czogbnVtYmVyXG4gIHN0YXR1c1RleHQ6IHN0cmluZ1xuICB0aW1pbmdJbmZvOiB1bmtub3duXG4gIGNhY2hlU3RhdGU6IHVua25vd25cbiAgaGVhZGVyc0xpc3Q6IFJlY29yZDxzeW1ib2wsIE1hcDxzdHJpbmcsIHVua25vd24+PlxuICB1cmxMaXN0OiBBcnJheTxVUkw+XG4gIGJvZHk/OiB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbVxuICAgIHNvdXJjZTogdW5rbm93blxuICAgIGxlbmd0aDogbnVtYmVyXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZldGNoUmVzcG9uc2UgZXh0ZW5kcyBSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBSZXNwb25zZSBzdGF0dXMgY29kZXMgZm9yIHJlc3BvbnNlcyB0aGF0IGNhbm5vdCBoYXZlIGJvZHkuXG4gICAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3N0YXR1c2VzXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX0NPREVTX1dJVEhPVVRfQk9EWSA9IFsxMDEsIDEwMywgMjA0LCAyMDUsIDMwNF1cblxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX0NPREVTX1dJVEhfUkVESVJFQ1QgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5cbiAgc3RhdGljIGlzQ29uZmlndXJhYmxlU3RhdHVzQ29kZShzdGF0dXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8PSA1OTlcbiAgfVxuXG4gIHN0YXRpYyBpc1JlZGlyZWN0UmVzcG9uc2Uoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRmV0Y2hSZXNwb25zZS5TVEFUVVNfQ09ERVNfV0lUSF9SRURJUkVDVC5pbmNsdWRlcyhzdGF0dXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiByZXNwb25zZSBzdGF0dXNcbiAgICogY29kZSByZXByZXNlbnRzIGEgcmVzcG9uc2UgdGhhdCBjYW4gaGF2ZSBhIGJvZHkuXG4gICAqL1xuICBzdGF0aWMgaXNSZXNwb25zZVdpdGhCb2R5KHN0YXR1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFGZXRjaFJlc3BvbnNlLlNUQVRVU19DT0RFU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMoc3RhdHVzKVxuICB9XG5cbiAgc3RhdGljIHNldFVybCh1cmw6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZCB7XG4gICAgaWYgKCF1cmwgfHwgdXJsID09PSAnYWJvdXQ6JyB8fCAhY2FuUGFyc2VVcmwodXJsKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSBnZXRWYWx1ZUJ5U3ltYm9sPFVuZGljaUZldGNoSW50ZXJuYWxTdGF0ZT4oJ3N0YXRlJywgcmVzcG9uc2UpXG5cbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIC8vIEluIFVuZGljaSwgcHVzaCB0aGUgVVJMIHRvIHRoZSBpbnRlcm5hbCBsaXN0IG9mIFVSTHMuXG4gICAgICAvLyBUaGlzIHdpbGwgcmVzcGVjdCB0aGUgYHJlc3BvbnNlLnVybGAgZ2V0dGVyIGxvZ2ljIGNvcnJlY3RseS5cbiAgICAgIHN0YXRlLnVybExpc3QucHVzaChuZXcgVVJMKHVybCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIG90aGVyIGxpYnJhcmllcywgcmVkZWZpbmUgdGhlIGB1cmxgIHByb3BlcnR5IGRpcmVjdGx5LlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywge1xuICAgICAgICB2YWx1ZTogdXJsLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gcmF3IEhUVFAgaGVhZGVycyBpbnRvIGEgRmV0Y2ggQVBJIGBIZWFkZXJzYCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBwYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVyczogQXJyYXk8c3RyaW5nPik6IEhlYWRlcnMge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gICAgZm9yIChsZXQgbGluZSA9IDA7IGxpbmUgPCByYXdIZWFkZXJzLmxlbmd0aDsgbGluZSArPSAyKSB7XG4gICAgICBoZWFkZXJzLmFwcGVuZChyYXdIZWFkZXJzW2xpbmVdLCByYXdIZWFkZXJzW2xpbmUgKyAxXSlcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJvZHk/OiBCb2R5SW5pdCB8IG51bGwsIGluaXQ6IEZldGNoUmVzcG9uc2VJbml0ID0ge30pIHtcbiAgICBjb25zdCBzdGF0dXMgPSBpbml0LnN0YXR1cyA/PyAyMDBcbiAgICBjb25zdCBzYWZlU3RhdHVzID0gRmV0Y2hSZXNwb25zZS5pc0NvbmZpZ3VyYWJsZVN0YXR1c0NvZGUoc3RhdHVzKVxuICAgICAgPyBzdGF0dXNcbiAgICAgIDogMjAwXG4gICAgY29uc3QgZmluYWxCb2R5ID0gRmV0Y2hSZXNwb25zZS5pc1Jlc3BvbnNlV2l0aEJvZHkoc3RhdHVzKSA/IGJvZHkgOiBudWxsXG5cbiAgICBzdXBlcihmaW5hbEJvZHksIHtcbiAgICAgIHN0YXR1czogc2FmZVN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IGluaXQuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnM6IGluaXQuaGVhZGVycyxcbiAgICB9KVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gc2FmZVN0YXR1cykge1xuICAgICAgLyoqXG4gICAgICAgKiBAbm90ZSBVbmRpY2kga2VlcHMgYW4gaW50ZXJuYWwgXCJTeW1ib2woc3RhdGUpXCIgdGhhdCBob2xkc1xuICAgICAgICogdGhlIGFjdHVhbCB2YWx1ZSBvZiByZXNwb25zZSBzdGF0dXMuIFVwZGF0ZSB0aGF0IGluIE5vZGUuanMuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHN0YXRlID0gZ2V0VmFsdWVCeVN5bWJvbDxVbmRpY2lGZXRjaEludGVybmFsU3RhdGU+KCdzdGF0ZScsIHRoaXMpXG5cbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBzdGF0ZS5zdGF0dXMgPSBzdGF0dXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc3RhdHVzJywge1xuICAgICAgICAgIHZhbHVlOiBzdGF0dXMsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIEZldGNoUmVzcG9uc2Uuc2V0VXJsKGluaXQudXJsLCB0aGlzKVxuICB9XG59XG4iLCAiY29uc3Qga1Jhd1JlcXVlc3QgPSBTeW1ib2woJ2tSYXdSZXF1ZXN0JylcblxuLyoqXG4gKiBSZXR1cm5zIGEgcmF3IHJlcXVlc3QgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJjZXB0b3Iub24oJ3JlcXVlc3QnLCAoeyByZXF1ZXN0IH0pID0+IHtcbiAqICAgY29uc3QgcmF3UmVxdWVzdCA9IGdldFJhd1JlcXVlc3QocmVxdWVzdClcbiAqXG4gKiAgIGlmIChyYXdSZXF1ZXN0IGluc3RhbmNlb2YgaHR0cC5DbGllbnRSZXF1ZXN0KSB7XG4gKiAgICAgY29uc29sZS5sb2cocmF3UmVxdWVzdC5yYXdIZWFkZXJzKVxuICogICB9XG4gKiB9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmF3UmVxdWVzdChyZXF1ZXN0OiBSZXF1ZXN0KTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBSZWZsZWN0LmdldChyZXF1ZXN0LCBrUmF3UmVxdWVzdClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJhd1JlcXVlc3QocmVxdWVzdDogUmVxdWVzdCwgcmF3UmVxdWVzdDogdW5rbm93bik6IHZvaWQge1xuICBSZWZsZWN0LnNldChyZXF1ZXN0LCBrUmF3UmVxdWVzdCwgcmF3UmVxdWVzdClcbn1cbiIsICJpbXBvcnQgeyBFdmVudE1hcCwgTGlzdGVuZXIgfSBmcm9tICdzdHJpY3QtZXZlbnQtZW1pdHRlcidcbmltcG9ydCB7IEludGVyY2VwdG9yLCBFeHRyYWN0RXZlbnROYW1lcyB9IGZyb20gJy4vSW50ZXJjZXB0b3InXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hJbnRlcmNlcHRvck9wdGlvbnM8XG4gIEludGVyY2VwdG9yTGlzdCBleHRlbmRzIFJlYWRvbmx5QXJyYXk8SW50ZXJjZXB0b3I8YW55Pj5cbj4ge1xuICBuYW1lOiBzdHJpbmdcbiAgaW50ZXJjZXB0b3JzOiBJbnRlcmNlcHRvckxpc3Rcbn1cblxuZXhwb3J0IHR5cGUgRXh0cmFjdEV2ZW50TWFwVHlwZTxcbiAgSW50ZXJjZXB0b3JMaXN0IGV4dGVuZHMgUmVhZG9ubHlBcnJheTxJbnRlcmNlcHRvcjxhbnk+PlxuPiA9IEludGVyY2VwdG9yTGlzdCBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgSW50ZXJjZXB0b3JUeXBlPlxuICA/IEludGVyY2VwdG9yVHlwZSBleHRlbmRzIEludGVyY2VwdG9yPGluZmVyIEV2ZW50TWFwPlxuICAgID8gRXZlbnRNYXBcbiAgICA6IG5ldmVyXG4gIDogbmV2ZXJcblxuLyoqXG4gKiBBIGJhdGNoIGludGVyY2VwdG9yIHRoYXQgZXhwb3NlcyBhIHNpbmdsZSBpbnRlcmZhY2VcbiAqIHRvIGFwcGx5IGFuZCBvcGVyYXRlIHdpdGggbXVsdGlwbGUgaW50ZXJjZXB0b3JzIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXRjaEludGVyY2VwdG9yPFxuICBJbnRlcmNlcHRvckxpc3QgZXh0ZW5kcyBSZWFkb25seUFycmF5PEludGVyY2VwdG9yPGFueT4+LFxuICBFdmVudHMgZXh0ZW5kcyBFdmVudE1hcCA9IEV4dHJhY3RFdmVudE1hcFR5cGU8SW50ZXJjZXB0b3JMaXN0PlxuPiBleHRlbmRzIEludGVyY2VwdG9yPEV2ZW50cz4ge1xuICBzdGF0aWMgc3ltYm9sOiBzeW1ib2xcblxuICBwcml2YXRlIGludGVyY2VwdG9yczogSW50ZXJjZXB0b3JMaXN0XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQmF0Y2hJbnRlcmNlcHRvck9wdGlvbnM8SW50ZXJjZXB0b3JMaXN0Pikge1xuICAgIEJhdGNoSW50ZXJjZXB0b3Iuc3ltYm9sID0gU3ltYm9sKG9wdGlvbnMubmFtZSlcbiAgICBzdXBlcihCYXRjaEludGVyY2VwdG9yLnN5bWJvbClcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzXG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXAoKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuZXh0ZW5kKCdzZXR1cCcpXG5cbiAgICBsb2dnZXIuaW5mbygnYXBwbHlpbmcgYWxsICVkIGludGVyY2VwdG9ycy4uLicsIHRoaXMuaW50ZXJjZXB0b3JzLmxlbmd0aClcblxuICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdhcHBseWluZyBcIiVzXCIgaW50ZXJjZXB0b3IuLi4nLCBpbnRlcmNlcHRvci5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgaW50ZXJjZXB0b3IuYXBwbHkoKVxuXG4gICAgICBsb2dnZXIuaW5mbygnYWRkaW5nIGludGVyY2VwdG9yIGRpc3Bvc2Ugc3Vic2NyaXB0aW9uJylcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKCgpID0+IGludGVyY2VwdG9yLmRpc3Bvc2UoKSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb248RXZlbnROYW1lIGV4dGVuZHMgRXh0cmFjdEV2ZW50TmFtZXM8RXZlbnRzPj4oXG4gICAgZXZlbnQ6IEV2ZW50TmFtZSxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+XG4gICk6IHRoaXMge1xuICAgIC8vIEluc3RlYWQgb2YgYWRkaW5nIGEgbGlzdGVuZXIgdG8gdGhlIGJhdGNoIGludGVyY2VwdG9yLFxuICAgIC8vIHByb3BhZ2F0ZSB0aGUgbGlzdGVuZXIgdG8gZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBpbnRlcmNlcHRvcnMuXG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgaW50ZXJjZXB0b3Iub24oZXZlbnQsIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudDogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgaW50ZXJjZXB0b3Iub25jZShldmVudCwgbGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyBvZmY8RXZlbnROYW1lIGV4dGVuZHMgRXh0cmFjdEV2ZW50TmFtZXM8RXZlbnRzPj4oXG4gICAgZXZlbnQ6IEV2ZW50TmFtZSxcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXI8RXZlbnRzW0V2ZW50TmFtZV0+XG4gICk6IHRoaXMge1xuICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGludGVyY2VwdG9yLm9mZihldmVudCwgbGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8RXZlbnROYW1lIGV4dGVuZHMgRXh0cmFjdEV2ZW50TmFtZXM8RXZlbnRzPj4oXG4gICAgZXZlbnQ/OiBFdmVudE5hbWUgfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvcnMgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGludGVyY2VwdG9ycy5yZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuIiwgIi8qKlxuICogUmVtb3ZlcyBxdWVyeSBwYXJhbWV0ZXJzIGFuZCBoYXNoZXMgZnJvbSBhIGdpdmVuIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsZWFuVXJsKHVybDogVVJMLCBpc0Fic29sdXRlOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gIHJldHVybiBbaXNBYnNvbHV0ZSAmJiB1cmwub3JpZ2luLCB1cmwucGF0aG5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcnKVxufVxuIiwgImltcG9ydCB7IEZldGNoUmVzcG9uc2UgfSBmcm9tICdAbXN3anMvaW50ZXJjZXB0b3JzJ1xuaW1wb3J0IHR5cGUgeyBFbWl0dGVyIH0gZnJvbSAncmV0dGltZSdcbmltcG9ydCB0eXBlIHsgU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHQgfSBmcm9tICcuLi9nbG9zc2FyeSdcbmltcG9ydCB7IGRlc2VyaWFsaXplUmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL2Rlc2VyaWFsaXplUmVxdWVzdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlTGlzdGVuZXIoXG4gIGNvbnRleHQ6IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0LFxuKTogRW1pdHRlci5MaXN0ZW5lclR5cGU8dHlwZW9mIGNvbnRleHQud29ya2VyQ2hhbm5lbCwgJ1JFU1BPTlNFJz4ge1xuICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgIGNvbnN0IHJlcXVlc3QgPSBkZXNlcmlhbGl6ZVJlcXVlc3QocmVzcG9uc2VNZXNzYWdlLnJlcXVlc3QpXG5cbiAgICAvKipcbiAgICAgKiBDT1JTIHJlcXVlc3RzIHdpdGggYG1vZGU6IFwibm8tY29yc1wiYCByZXN1bHQgaW4gXCJvcGFxdWVcIiByZXNwb25zZXMuXG4gICAgICogVGhhdCBraW5kIG9mIHJlc3BvbnNlcyBjYW5ub3QgYmUgbWFuaXB1bGF0ZWQgaW4gSmF2YVNjcmlwdCBkdWVcbiAgICAgKiB0byB0aGUgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMuXG4gICAgICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1maWx0ZXJlZC1yZXNwb25zZS1vcGFxdWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tc3dqcy9tc3cvaXNzdWVzLzUyOVxuICAgICAqL1xuICAgIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzcG9uc2UudHlwZT8uaW5jbHVkZXMoJ29wYXF1ZScpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICByZXNwb25zZU1lc3NhZ2UucmVzcG9uc2Uuc3RhdHVzID09PSAwXG4gICAgICAgID8gUmVzcG9uc2UuZXJyb3IoKVxuICAgICAgICA6IG5ldyBGZXRjaFJlc3BvbnNlKFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXNwb25zZXMgbWF5IGJlIHN0cmVhbXMgaGVyZSwgYnV0IHdoZW4gd2UgY3JlYXRlIGEgcmVzcG9uc2Ugb2JqZWN0XG4gICAgICAgICAgICAgKiB3aXRoIG51bGwtYm9keSBzdGF0dXMgY29kZXMsIGxpa2UgMjA0LCAyMDUsIDMwNCBSZXNwb25zZSB3aWxsXG4gICAgICAgICAgICAgKiB0aHJvdyB3aGVuIHBhc3NlZCBhIG5vbi1udWxsIGJvZHksIHNvIGVuc3VyZSBpdCdzIG51bGwgaGVyZVxuICAgICAgICAgICAgICogZm9yIHRob3NlIGNvZGVzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIEZldGNoUmVzcG9uc2UuaXNSZXNwb25zZVdpdGhCb2R5KHJlc3BvbnNlTWVzc2FnZS5yZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgICAgID8gcmVzcG9uc2VNZXNzYWdlLnJlc3BvbnNlLmJvZHlcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5yZXNwb25zZU1lc3NhZ2UsXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBTZXQgcmVzcG9uc2UgVVJMIGlmIGl0J3Mgbm90IHNldCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tc3dqcy9tc3cvaXNzdWVzLzIwMzBcbiAgICAgICAgICAgICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzcG9uc2UvdXJsXG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG5cbiAgICBjb250ZXh0LmVtaXR0ZXIuZW1pdChcbiAgICAgIHJlc3BvbnNlTWVzc2FnZS5pc01vY2tlZFJlc3BvbnNlID8gJ3Jlc3BvbnNlOm1vY2tlZCcgOiAncmVzcG9uc2U6YnlwYXNzJyxcbiAgICAgIHtcbiAgICAgICAgcmVxdWVzdElkOiByZXNwb25zZU1lc3NhZ2UucmVxdWVzdC5pZCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICB9LFxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB7IGRldlV0aWxzIH0gZnJvbSAnfi9jb3JlL3V0aWxzL2ludGVybmFsL2RldlV0aWxzJ1xuaW1wb3J0IHsgU3RhcnRPcHRpb25zIH0gZnJvbSAnLi4vLi4vZ2xvc3NhcnknXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVdvcmtlclNjb3BlKFxuICByZWdpc3RyYXRpb246IFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24sXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnMsXG4pOiB2b2lkIHtcbiAgaWYgKCFvcHRpb25zPy5xdWlldCAmJiAhbG9jYXRpb24uaHJlZi5zdGFydHNXaXRoKHJlZ2lzdHJhdGlvbi5zY29wZSkpIHtcbiAgICBkZXZVdGlscy53YXJuKFxuICAgICAgYFxcXG5DYW5ub3QgaW50ZXJjZXB0IHJlcXVlc3RzIG9uIHRoaXMgcGFnZSBiZWNhdXNlIGl0J3Mgb3V0c2lkZSBvZiB0aGUgd29ya2VyJ3Mgc2NvcGUgKFwiJHtyZWdpc3RyYXRpb24uc2NvcGV9XCIpLiBJZiB5b3Ugd2lzaCB0byBtb2NrIEFQSSByZXF1ZXN0cyBvbiB0aGlzIHBhZ2UsIHlvdSBtdXN0IHJlc29sdmUgdGhpcyBzY29wZSBpc3N1ZS5cblxuLSAoUmVjb21tZW5kZWQpIFJlZ2lzdGVyIHRoZSB3b3JrZXIgYXQgdGhlIHJvb3QgbGV2ZWwgKFwiL1wiKSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuLSBTZXQgdGhlIFwiU2VydmljZS1Xb3JrZXItQWxsb3dlZFwiIHJlc3BvbnNlIGhlYWRlciB0byBhbGxvdyBvdXQtb2Ytc2NvcGUgd29ya2Vycy5cXFxuYCxcbiAgICApXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHsgaXNOb2RlUHJvY2VzcyB9IGZyb20gJ2lzLW5vZGUtcHJvY2VzcydcbmltcG9ydCB7IERlZmVycmVkUHJvbWlzZSB9IGZyb20gJ0BvcGVuLWRyYWZ0L2RlZmVycmVkLXByb21pc2UnXG5pbXBvcnQgdHlwZSB7XG4gIFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0LFxuICBTdGFydFJldHVyblR5cGUsXG4gIFN0YXJ0T3B0aW9ucyxcbiAgU2V0dXBXb3JrZXIsXG59IGZyb20gJy4vZ2xvc3NhcnknXG5pbXBvcnQgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gJ34vY29yZS9oYW5kbGVycy9SZXF1ZXN0SGFuZGxlcidcbmltcG9ydCB7IERFRkFVTFRfU1RBUlRfT1BUSU9OUyB9IGZyb20gJy4vc3RhcnQvdXRpbHMvcHJlcGFyZVN0YXJ0SGFuZGxlcidcbmltcG9ydCB7IGNyZWF0ZVN0YXJ0SGFuZGxlciB9IGZyb20gJy4vc3RhcnQvY3JlYXRlU3RhcnRIYW5kbGVyJ1xuaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5pbXBvcnQgeyBTZXR1cEFwaSB9IGZyb20gJ34vY29yZS9TZXR1cEFwaSdcbmltcG9ydCB7IG1lcmdlUmlnaHQgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvbWVyZ2VSaWdodCdcbmltcG9ydCB0eXBlIHsgTGlmZUN5Y2xlRXZlbnRzTWFwIH0gZnJvbSAnfi9jb3JlL3NoYXJlZE9wdGlvbnMnXG5pbXBvcnQgdHlwZSB7IFdlYlNvY2tldEhhbmRsZXIgfSBmcm9tICd+L2NvcmUvaGFuZGxlcnMvV2ViU29ja2V0SGFuZGxlcidcbmltcG9ydCB7IHdlYlNvY2tldEludGVyY2VwdG9yIH0gZnJvbSAnfi9jb3JlL3dzL3dlYlNvY2tldEludGVyY2VwdG9yJ1xuaW1wb3J0IHsgaGFuZGxlV2ViU29ja2V0RXZlbnQgfSBmcm9tICd+L2NvcmUvd3MvaGFuZGxlV2ViU29ja2V0RXZlbnQnXG5pbXBvcnQgeyBhdHRhY2hXZWJTb2NrZXRMb2dnZXIgfSBmcm9tICd+L2NvcmUvd3MvdXRpbHMvYXR0YWNoV2ViU29ja2V0TG9nZ2VyJ1xuaW1wb3J0IHsgV29ya2VyQ2hhbm5lbCB9IGZyb20gJy4uL3V0aWxzL3dvcmtlckNoYW5uZWwnXG5pbXBvcnQgeyBjcmVhdGVGYWxsYmFja1JlcXVlc3RMaXN0ZW5lciB9IGZyb20gJy4vc3RhcnQvY3JlYXRlRmFsbGJhY2tSZXF1ZXN0TGlzdGVuZXInXG5pbXBvcnQgeyBwcmludFN0YXJ0TWVzc2FnZSB9IGZyb20gJy4vc3RhcnQvdXRpbHMvcHJpbnRTdGFydE1lc3NhZ2UnXG5pbXBvcnQgeyBwcmludFN0b3BNZXNzYWdlIH0gZnJvbSAnLi9zdG9wL3V0aWxzL3ByaW50U3RvcE1lc3NhZ2UnXG5pbXBvcnQgeyBzdXBwb3J0c1NlcnZpY2VXb3JrZXIgfSBmcm9tICcuLi91dGlscy9zdXBwb3J0cydcblxuZXhwb3J0IGNsYXNzIFNldHVwV29ya2VyQXBpXG4gIGV4dGVuZHMgU2V0dXBBcGk8TGlmZUN5Y2xlRXZlbnRzTWFwPlxuICBpbXBsZW1lbnRzIFNldHVwV29ya2VyXG57XG4gIHByaXZhdGUgY29udGV4dDogU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHRcblxuICBjb25zdHJ1Y3RvciguLi5oYW5kbGVyczogQXJyYXk8UmVxdWVzdEhhbmRsZXIgfCBXZWJTb2NrZXRIYW5kbGVyPikge1xuICAgIHN1cGVyKC4uLmhhbmRsZXJzKVxuXG4gICAgaW52YXJpYW50KFxuICAgICAgIWlzTm9kZVByb2Nlc3MoKSxcbiAgICAgIGRldlV0aWxzLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICdGYWlsZWQgdG8gZXhlY3V0ZSBgc2V0dXBXb3JrZXJgIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQuIENvbnNpZGVyIHVzaW5nIGBzZXR1cFNlcnZlcmAgZm9yIE5vZGUuanMgZW52aXJvbm1lbnQgaW5zdGVhZC4nLFxuICAgICAgKSxcbiAgICApXG5cbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmNyZWF0ZVdvcmtlckNvbnRleHQoKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrZXJDb250ZXh0KCk6IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0IHtcbiAgICBjb25zdCB3b3JrZXJQcm9taXNlID0gbmV3IERlZmVycmVkUHJvbWlzZTxTZXJ2aWNlV29ya2VyPigpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gTW9ja2luZyBpcyBub3QgY29uc2lkZXJlZCBlbmFibGVkIHVudGlsIHRoZSB3b3JrZXJcbiAgICAgIC8vIHNpZ25hbHMgYmFjayB0aGUgc3VjY2Vzc2Z1bCBhY3RpdmF0aW9uIGV2ZW50LlxuICAgICAgaXNNb2NraW5nRW5hYmxlZDogZmFsc2UsXG4gICAgICBzdGFydE9wdGlvbnM6IG51bGwgYXMgYW55LFxuICAgICAgd29ya2VyUHJvbWlzZSxcbiAgICAgIHJlZ2lzdHJhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgZ2V0UmVxdWVzdEhhbmRsZXJzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzQ29udHJvbGxlci5jdXJyZW50SGFuZGxlcnMoKVxuICAgICAgfSxcbiAgICAgIGVtaXR0ZXI6IHRoaXMuZW1pdHRlcixcbiAgICAgIHdvcmtlckNoYW5uZWw6IG5ldyBXb3JrZXJDaGFubmVsKHtcbiAgICAgICAgd29ya2VyOiB3b3JrZXJQcm9taXNlLFxuICAgICAgfSksXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0KG9wdGlvbnM6IFN0YXJ0T3B0aW9ucyA9IHt9KTogU3RhcnRSZXR1cm5UeXBlIHtcbiAgICBpZiAoJ3dhaXRVbnRpbFJlYWR5JyBpbiBvcHRpb25zKSB7XG4gICAgICBkZXZVdGlscy53YXJuKFxuICAgICAgICAnVGhlIFwid2FpdFVudGlsUmVhZHlcIiBvcHRpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHJlbW92ZSBpdCBmcm9tIHRoaXMgXCJ3b3JrZXIuc3RhcnQoKVwiIGNhbGwuIEZvbGxvdyB0aGUgcmVjb21tZW5kZWQgQnJvd3NlciBpbnRlZ3JhdGlvbiAoaHR0cHM6Ly9tc3dqcy5pby9kb2NzL2ludGVncmF0aW9ucy9icm93c2VyKSB0byBlbGltaW5hdGUgYW55IHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIHRoZSBTZXJ2aWNlIFdvcmtlciByZWdpc3RyYXRpb24gYW5kIGFueSByZXF1ZXN0cyBtYWRlIGJ5IHlvdXIgYXBwbGljYXRpb24gb24gaW5pdGlhbCByZW5kZXIuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBXYXJuIHRoZSBkZXZlbG9wZXIgb24gbXVsdGlwbGUgXCJ3b3JrZXIuc3RhcnQoKVwiIGNhbGxzLlxuICAgIC8vIFdoaWxlIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSB3b3JrZXIgaW4gYW55IHdheSxcbiAgICAvLyBpdCBsaWtlbHkgaW5kaWNhdGVzIGFuIGlzc3VlIHdpdGggdGhlIGRldmVsb3BlcidzIGNvZGUuXG4gICAgaWYgKHRoaXMuY29udGV4dC5pc01vY2tpbmdFbmFibGVkKSB7XG4gICAgICBkZXZVdGlscy53YXJuKFxuICAgICAgICBgRm91bmQgYSByZWR1bmRhbnQgXCJ3b3JrZXIuc3RhcnQoKVwiIGNhbGwuIE5vdGUgdGhhdCBzdGFydGluZyB0aGUgd29ya2VyIHdoaWxlIG1vY2tpbmcgaXMgYWxyZWFkeSBlbmFibGVkIHdpbGwgaGF2ZSBubyBlZmZlY3QuIENvbnNpZGVyIHJlbW92aW5nIHRoaXMgXCJ3b3JrZXIuc3RhcnQoKVwiIGNhbGwuYCxcbiAgICAgIClcbiAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVnaXN0cmF0aW9uXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LndvcmtlclN0b3BwZWRBdCA9IHVuZGVmaW5lZFxuXG4gICAgdGhpcy5jb250ZXh0LnN0YXJ0T3B0aW9ucyA9IG1lcmdlUmlnaHQoXG4gICAgICBERUZBVUxUX1NUQVJUX09QVElPTlMsXG4gICAgICBvcHRpb25zLFxuICAgICkgYXMgU2V0dXBXb3JrZXJJbnRlcm5hbENvbnRleHRbJ3N0YXJ0T3B0aW9ucyddXG5cbiAgICAvLyBFbmFibGUgdGhlIFdlYlNvY2tldCBpbnRlcmNlcHRpb24uXG4gICAgaGFuZGxlV2ViU29ja2V0RXZlbnQoe1xuICAgICAgZ2V0VW5oYW5kbGVkUmVxdWVzdFN0cmF0ZWd5OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuc3RhcnRPcHRpb25zLm9uVW5oYW5kbGVkUmVxdWVzdFxuICAgICAgfSxcbiAgICAgIGdldEhhbmRsZXJzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzQ29udHJvbGxlci5jdXJyZW50SGFuZGxlcnMoKVxuICAgICAgfSxcbiAgICAgIG9uTW9ja2VkQ29ubmVjdGlvbjogKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuc3RhcnRPcHRpb25zLnF1aWV0KSB7XG4gICAgICAgICAgLy8gQXR0YWNoIHRoZSBsb2dnZXIgZm9yIG1vY2tlZCBjb25uZWN0aW9ucyBzaW5jZVxuICAgICAgICAgIC8vIHRob3NlIHdvbid0IGJlIHZpc2libGUgaW4gdGhlIGJyb3dzZXIncyBkZXZ0b29scy5cbiAgICAgICAgICBhdHRhY2hXZWJTb2NrZXRMb2dnZXIoY29ubmVjdGlvbilcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uUGFzc3Rocm91Z2hDb25uZWN0aW9uKCkge30sXG4gICAgfSlcbiAgICB3ZWJTb2NrZXRJbnRlcmNlcHRvci5hcHBseSgpXG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICB3ZWJTb2NrZXRJbnRlcmNlcHRvci5kaXNwb3NlKClcbiAgICB9KVxuXG4gICAgLy8gVXNlIGEgZmFsbGJhY2sgaW50ZXJjZXB0aW9uIGFsZ29yaXRobSBpbiB0aGUgZW52aXJvbm1lbnRzXG4gICAgLy8gd2hlcmUgdGhlIFNlcnZpY2UgV29ya2VyIEFQSSBpc24ndCBzdXBwb3J0ZWQuXG4gICAgaWYgKCFzdXBwb3J0c1NlcnZpY2VXb3JrZXIoKSkge1xuICAgICAgY29uc3QgZmFsbGJhY2tJbnRlcmNlcHRvciA9IGNyZWF0ZUZhbGxiYWNrUmVxdWVzdExpc3RlbmVyKFxuICAgICAgICB0aGlzLmNvbnRleHQsXG4gICAgICAgIHRoaXMuY29udGV4dC5zdGFydE9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgZmFsbGJhY2tJbnRlcmNlcHRvci5kaXNwb3NlKClcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuY29udGV4dC5pc01vY2tpbmdFbmFibGVkID0gdHJ1ZVxuXG4gICAgICBwcmludFN0YXJ0TWVzc2FnZSh7XG4gICAgICAgIG1lc3NhZ2U6ICdNb2NraW5nIGVuYWJsZWQgKGZhbGxiYWNrIG1vZGUpLicsXG4gICAgICAgIHF1aWV0OiB0aGlzLmNvbnRleHQuc3RhcnRPcHRpb25zLnF1aWV0LFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SGFuZGxlciA9IGNyZWF0ZVN0YXJ0SGFuZGxlcih0aGlzLmNvbnRleHQpXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgc3RhcnRIYW5kbGVyKHRoaXMuY29udGV4dC5zdGFydE9wdGlvbnMsIG9wdGlvbnMpXG5cbiAgICB0aGlzLmNvbnRleHQuaXNNb2NraW5nRW5hYmxlZCA9IHRydWVcblxuICAgIHJldHVybiByZWdpc3RyYXRpb25cbiAgfVxuXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc3Bvc2UoKVxuXG4gICAgaWYgKCF0aGlzLmNvbnRleHQuaXNNb2NraW5nRW5hYmxlZCkge1xuICAgICAgZGV2VXRpbHMud2FybihcbiAgICAgICAgJ0ZvdW5kIGEgcmVkdW5kYW50IFwid29ya2VyLnN0b3AoKVwiIGNhbGwuIE5vdGljZSB0aGF0IHN0b3BwaW5nIHRoZSB3b3JrZXIgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBzdG9wcGVkIGhhcyBubyBlZmZlY3QuIENvbnNpZGVyIHJlbW92aW5nIHRoaXMgXCJ3b3JrZXIuc3RvcCgpXCIgY2FsbC4nLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LmlzTW9ja2luZ0VuYWJsZWQgPSBmYWxzZVxuICAgIHRoaXMuY29udGV4dC53b3JrZXJTdG9wcGVkQXQgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5jb250ZXh0LmVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKClcblxuICAgIGlmIChzdXBwb3J0c1NlcnZpY2VXb3JrZXIoKSkge1xuICAgICAgdGhpcy5jb250ZXh0LndvcmtlckNoYW5uZWwucmVtb3ZlQWxsTGlzdGVuZXJzKCdSRVNQT05TRScpXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmNvbnRleHQua2VlcEFsaXZlSW50ZXJ2YWwpXG4gICAgfVxuXG4gICAgLy8gUG9zdCB0aGUgaW50ZXJuYWwgc3RvcCBtZXNzYWdlIG9uIHRoZSB3aW5kb3dcbiAgICAvLyB0byBsZXQgYW55IGxvZ2ljIGtub3cgd2hlbiB0aGUgd29ya2VyIGhhcyBzdG9wcGVkLlxuICAgIC8vIEUuZy4gdGhlIFdlYlNvY2tldCBjbGllbnQgbWFuYWdlciBuZWVkcyB0aGlzIHRvIGtub3dcbiAgICAvLyB3aGVuIHRvIGNsZWFyIGl0cyBpbi1tZW1vcnkgY2xpZW50cyBsaXN0LlxuICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGU6ICdtc3cvd29ya2VyOnN0b3AnIH0pXG5cbiAgICBwcmludFN0b3BNZXNzYWdlKHtcbiAgICAgIHF1aWV0OiB0aGlzLmNvbnRleHQuc3RhcnRPcHRpb25zPy5xdWlldCxcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogU2V0cyB1cCBhIHJlcXVlc3RzIGludGVyY2VwdGlvbiBpbiB0aGUgYnJvd3NlciB3aXRoIHRoZSBnaXZlbiByZXF1ZXN0IGhhbmRsZXJzLlxuICogQHBhcmFtIHtSZXF1ZXN0SGFuZGxlcltdfSBoYW5kbGVycyBMaXN0IG9mIHJlcXVlc3QgaGFuZGxlcnMuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tc3dqcy5pby9kb2NzL2FwaS9zZXR1cC13b3JrZXIgYHNldHVwV29ya2VyKClgIEFQSSByZWZlcmVuY2V9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFdvcmtlcihcbiAgLi4uaGFuZGxlcnM6IEFycmF5PFJlcXVlc3RIYW5kbGVyIHwgV2ViU29ja2V0SGFuZGxlcj5cbik6IFNldHVwV29ya2VyIHtcbiAgcmV0dXJuIG5ldyBTZXR1cFdvcmtlckFwaSguLi5oYW5kbGVycylcbn1cbiIsICJleHBvcnQgdHlwZSBEZWZhdWx0RXZlbnRNYXAgPSB7XG4gIFtldmVudFR5cGU6IHN0cmluZ106IFR5cGVkRXZlbnQ8YW55LCBhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZWRFdmVudDxcbiAgRGF0YVR5cGUgPSB2b2lkLFxuICBSZXR1cm5UeXBlID0gYW55LFxuICBFdmVudFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+IGV4dGVuZHMgT21pdDxNZXNzYWdlRXZlbnQ8RGF0YVR5cGU+LCAndHlwZSc+IHtcbiAgdHlwZTogRXZlbnRUeXBlXG59XG5cbmNvbnN0IGtEZWZhdWx0UHJldmVudGVkID0gU3ltYm9sKCdrRGVmYXVsdFByZXZlbnRlZCcpXG5jb25zdCBrUHJvcGFnYXRpb25TdG9wcGVkID0gU3ltYm9sKCdrUHJvcGFnYXRpb25TdG9wcGVkJylcbmNvbnN0IGtJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBTeW1ib2woJ2tJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQnKVxuXG5leHBvcnQgY2xhc3MgVHlwZWRFdmVudDxcbiAgICBEYXRhVHlwZSA9IHZvaWQsXG4gICAgUmV0dXJuVHlwZSA9IGFueSxcbiAgICBFdmVudFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gID5cbiAgZXh0ZW5kcyBNZXNzYWdlRXZlbnQ8RGF0YVR5cGU+XG4gIGltcGxlbWVudHMgVHlwZWRFdmVudDxEYXRhVHlwZSwgUmV0dXJuVHlwZSwgRXZlbnRUeXBlPlxue1xuICAvKipcbiAgICogQG5vdGUgS2VlcCBhIHBsYWNlaG9sZGVyIHByb3BlcnR5IHdpdGggdGhlIHJldHVybiB0eXBlXG4gICAqIGJlY2F1c2UgdGhlIHR5cGUgbXVzdCBiZSBzZXQgc29tZXdoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIGNvcnJlY3RseSBhc3NvY2lhdGVkIGFuZCBpbmZlcnJlZCBmcm9tIHRoZSBldmVudC5cbiAgICovXG4gICNyZXR1cm5UeXBlOiBSZXR1cm5UeXBlO1xuXG4gIFtrRGVmYXVsdFByZXZlbnRlZF06IGJvb2xlYW47XG4gIFtrUHJvcGFnYXRpb25TdG9wcGVkXT86IEVtaXR0ZXI8YW55PjtcbiAgW2tJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWRdPzogYm9vbGVhblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC4uLmFyZ3M6IFtEYXRhVHlwZV0gZXh0ZW5kcyBbdm9pZF1cbiAgICAgID8gW3R5cGU6IEV2ZW50VHlwZV1cbiAgICAgIDogW3R5cGU6IEV2ZW50VHlwZSwgaW5pdDogeyBkYXRhOiBEYXRhVHlwZSB9XVxuICApIHtcbiAgICBzdXBlcihhcmdzWzBdLCBhcmdzWzFdKVxuICAgIHRoaXNba0RlZmF1bHRQcmV2ZW50ZWRdID0gZmFsc2VcbiAgfVxuXG4gIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzW2tEZWZhdWx0UHJldmVudGVkXVxuICB9XG5cbiAgcHVibGljIHByZXZlbnREZWZhdWx0KCk6IHZvaWQge1xuICAgIHN1cGVyLnByZXZlbnREZWZhdWx0KClcbiAgICB0aGlzW2tEZWZhdWx0UHJldmVudGVkXSA9IHRydWVcbiAgfVxuXG4gIHB1YmxpYyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogQG5vdGUgRGVzcGl0ZSBgLnN0b3BQcm9wYWdhdGlvbigpYCBhbmQgYC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKWAgYmVpbmcgZGVmaW5lZFxuICAgICAqIGluIE5vZGUuanMsIHRoZXkgZG8gbm90aGluZy4gSXQgaXMgc2FmZSB0byByZS1kZWZpbmUgdGhlbS5cbiAgICAgKi9cbiAgICBzdXBlci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgIHRoaXNba0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZF0gPSB0cnVlXG4gIH1cbn1cblxuLyoqXG4gKiBCcmFuZHMgYSBUeXBlZEV2ZW50IG9yIGl0cyBzdWJjbGFzcyB3aGlsZSBwcmVzZXJ2aW5nIGl0cyAobmFycm93ZXIpIHR5cGUuXG4gKi9cbnR5cGUgQnJhbmQ8RXZlbnQgZXh0ZW5kcyBUeXBlZEV2ZW50LCBFdmVudFR5cGUgZXh0ZW5kcyBzdHJpbmc+ID0gRXZlbnQgJiB7XG4gIHR5cGU6IEV2ZW50VHlwZVxufVxuXG50eXBlIEluZmVyRXZlbnRNYXA8VGFyZ2V0IGV4dGVuZHMgRW1pdHRlcjxhbnk+PiA9IFRhcmdldCBleHRlbmRzIEVtaXR0ZXI8XG4gIGluZmVyIEV2ZW50TWFwXG4+XG4gID8gRXZlbnRNYXBcbiAgOiBuZXZlclxuXG50eXBlIEludGVybmFsTGlzdGVuZXJzTWFwPFxuICBUYXJnZXQgZXh0ZW5kcyBFbWl0dGVyPGFueT4sXG4gIEV2ZW50TWFwIGV4dGVuZHMgRGVmYXVsdEV2ZW50TWFwID0gSW5mZXJFdmVudE1hcDxUYXJnZXQ+LFxuICBFdmVudFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBrZXlvZiBFdmVudE1hcCAmIHN0cmluZyxcbj4gPSBSZWNvcmQ8XG4gIGtleW9mIEV2ZW50TWFwLFxuICBBcnJheTxFbWl0dGVyLkxpc3RlbmVyVHlwZTxUYXJnZXQsIEV2ZW50VHlwZSwgRXZlbnRNYXA+PlxuPlxuXG5leHBvcnQgdHlwZSBUeXBlZExpc3RlbmVyT3B0aW9ucyA9IHtcbiAgb25jZT86IGJvb2xlYW5cbiAgc2lnbmFsPzogQWJvcnRTaWduYWxcbn1cblxuY29uc3Qga0xpc3RlbmVyT3B0aW9ucyA9IFN5bWJvbCgna0xpc3RlbmVyT3B0aW9ucycpXG5cbmV4cG9ydCBuYW1lc3BhY2UgRW1pdHRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGBFdmVudGAgdHlwZSBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcjx7IGdyZWV0aW5nOiBUeXBlZEV2ZW50PHN0cmluZz4gfT4oKVxuICAgKiB0eXBlIEdyZWV0aW5nRXZlbnQgPSBFbWl0dGVyLkluZmVyRXZlbnRUeXBlPHR5cGVvZiBlbWl0dGVyLCAnZ3JlZXRpbmcnPlxuICAgKiAvLyBUeXBlZEV2ZW50PHN0cmluZz5cbiAgICovXG4gIGV4cG9ydCB0eXBlIEV2ZW50VHlwZTxcbiAgICBUYXJnZXQgZXh0ZW5kcyBFbWl0dGVyPGFueT4sXG4gICAgRXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgRXZlbnRNYXAgJiBzdHJpbmcsXG4gICAgRXZlbnRNYXAgZXh0ZW5kcyBEZWZhdWx0RXZlbnRNYXAgPSBJbmZlckV2ZW50TWFwPFRhcmdldD4sXG4gID4gPSBCcmFuZDxFdmVudE1hcFtFdmVudFR5cGVdLCBFdmVudFR5cGU+XG5cbiAgZXhwb3J0IHR5cGUgRXZlbnREYXRhVHlwZTxcbiAgICBUYXJnZXQgZXh0ZW5kcyBFbWl0dGVyPGFueT4sXG4gICAgRXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgRXZlbnRNYXAgJiBzdHJpbmcsXG4gICAgRXZlbnRNYXAgZXh0ZW5kcyBEZWZhdWx0RXZlbnRNYXAgPSBJbmZlckV2ZW50TWFwPFRhcmdldD4sXG4gID4gPSBFdmVudE1hcFtFdmVudFR5cGVdIGV4dGVuZHMgVHlwZWRFdmVudDxpbmZlciBEYXRhVHlwZT4gPyBEYXRhVHlwZSA6IG5ldmVyXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIHR5cGUgZm9yIHRoZSBnaXZlbiBldmVudCB0eXBlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXI8eyBnZXRUb3RhbFByaWNlOiBUeXBlZEV2ZW50PENhcnQsIG51bWJlcj4gfT4oKVxuICAgKiB0eXBlIExpc3RlbmVyID0gRW1pdHRlci5MaXN0ZW5lclR5cGU8dHlwZW9mIGVtaXR0ZXIsICdnZXRUb3RhbFByaWNlJz5cbiAgICogLy8gKGV2ZW50OiBUeXBlZEV2ZW50PENhcnQ+KSA9PiBudW1iZXJcbiAgICovXG4gIGV4cG9ydCB0eXBlIExpc3RlbmVyVHlwZTxcbiAgICBUYXJnZXQgZXh0ZW5kcyBFbWl0dGVyPGFueT4sXG4gICAgVHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nLFxuICAgIEV2ZW50TWFwIGV4dGVuZHMgRGVmYXVsdEV2ZW50TWFwID0gSW5mZXJFdmVudE1hcDxUYXJnZXQ+LFxuICA+ID0gKFxuICAgIGV2ZW50OiBFbWl0dGVyLkV2ZW50VHlwZTxUYXJnZXQsIFR5cGUsIEV2ZW50TWFwPixcbiAgKSA9PiBFbWl0dGVyLkxpc3RlbmVyUmV0dXJuVHlwZTxUYXJnZXQsIFR5cGUsIEV2ZW50TWFwPiBleHRlbmRzIFt2b2lkXVxuICAgID8gdm9pZFxuICAgIDogRW1pdHRlci5MaXN0ZW5lclJldHVyblR5cGU8VGFyZ2V0LCBUeXBlLCBFdmVudE1hcD5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyPHsgZ2V0VG90YWxQcmljZTogVHlwZWRFdmVudDxDYXJ0LCBudW1iZXI+IH0+KClcbiAgICogdHlwZSBMaXN0ZW5lclJldHVyblR5cGUgPSBFbWl0dGVyLkluZmVyTGlzdGVuZXJSZXR1cm5UeXBlPHR5cGVvZiBlbWl0dGVyLCAnZ2V0VG90YWxQcmljZSc+XG4gICAqIC8vIG51bWJlclxuICAgKi9cbiAgZXhwb3J0IHR5cGUgTGlzdGVuZXJSZXR1cm5UeXBlPFxuICAgIFRhcmdldCBleHRlbmRzIEVtaXR0ZXI8YW55PixcbiAgICBFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZyxcbiAgICBFdmVudE1hcCBleHRlbmRzIERlZmF1bHRFdmVudE1hcCA9IEluZmVyRXZlbnRNYXA8VGFyZ2V0PixcbiAgPiA9IEV2ZW50TWFwW0V2ZW50VHlwZV0gZXh0ZW5kcyBUeXBlZEV2ZW50PHVua25vd24sIGluZmVyIFJldHVyblR5cGU+XG4gICAgPyBSZXR1cm5UeXBlXG4gICAgOiBuZXZlclxufVxuXG5leHBvcnQgY2xhc3MgRW1pdHRlcjxFdmVudE1hcCBleHRlbmRzIERlZmF1bHRFdmVudE1hcD4ge1xuICAjbGlzdGVuZXJzOiBJbnRlcm5hbExpc3RlbmVyc01hcDx0eXBlb2YgdGhpcywgRXZlbnRNYXA+XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy4jbGlzdGVuZXJzID0ge30gYXMgSW50ZXJuYWxMaXN0ZW5lcnNNYXA8dHlwZW9mIHRoaXMsIEV2ZW50TWFwPlxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBYm9ydENvbnRyb2xsZXJ9IEFuIGBBYm9ydENvbnRyb2xsZXJgIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvbjxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZz4oXG4gICAgdHlwZTogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBFbWl0dGVyLkxpc3RlbmVyVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4sXG4gICAgb3B0aW9ucz86IFR5cGVkTGlzdGVuZXJPcHRpb25zLFxuICApOiB0eXBlb2YgdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuI2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBYm9ydENvbnRyb2xsZXJ9IEFuIGBBYm9ydENvbnRyb2xsZXJgIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvbmNlPEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nPihcbiAgICB0eXBlOiBFdmVudFR5cGUsXG4gICAgbGlzdGVuZXI6IEVtaXR0ZXIuTGlzdGVuZXJUeXBlPHR5cGVvZiB0aGlzLCBFdmVudFR5cGUsIEV2ZW50TWFwPixcbiAgICBvcHRpb25zPzogT21pdDxUeXBlZExpc3RlbmVyT3B0aW9ucywgJ29uY2UnPixcbiAgKTogdHlwZW9mIHRoaXMge1xuICAgIHJldHVybiB0aGlzLm9uKHR5cGUsIGxpc3RlbmVyLCB7IC4uLihvcHRpb25zIHx8IHt9KSwgb25jZTogdHJ1ZSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmRzIGEgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBldmVudCB0eXBlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QWJvcnRDb250cm9sbGVyfSBBbiBgQWJvcnRDb250cm9sbGVyYCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgZWFybHlPbjxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZz4oXG4gICAgdHlwZTogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBFbWl0dGVyLkxpc3RlbmVyVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4sXG4gICAgb3B0aW9ucz86IFR5cGVkTGlzdGVuZXJPcHRpb25zLFxuICApOiB0eXBlb2YgdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuI2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zLCAncHJlcGVuZCcpXG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZWFybHlPbmNlPEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nPihcbiAgICB0eXBlOiBFdmVudFR5cGUsXG4gICAgbGlzdGVuZXI6IEVtaXR0ZXIuTGlzdGVuZXJUeXBlPHR5cGVvZiB0aGlzLCBFdmVudFR5cGUsIEV2ZW50TWFwPixcbiAgICBvcHRpb25zPzogT21pdDxUeXBlZExpc3RlbmVyT3B0aW9ucywgJ29uY2UnPixcbiAgKTogdHlwZW9mIHRoaXMge1xuICAgIHJldHVybiB0aGlzLmVhcmx5T24odHlwZSwgbGlzdGVuZXIsIHsgLi4uKG9wdGlvbnMgfHwge30pLCBvbmNlOiB0cnVlIH0pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIGdpdmVuIHR5cGVkIGV2ZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBhbnkgbGlzdGVuZXJzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBlbWl0PEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nPihcbiAgICBldmVudDogQnJhbmQ8RXZlbnRNYXBbRXZlbnRUeXBlXSwgRXZlbnRUeXBlPixcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudChldmVudC50eXBlKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgcHJveGllZEV2ZW50ID0gdGhpcy4jcHJveHlFdmVudChldmVudClcblxuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy4jbGlzdGVuZXJzW2V2ZW50LnR5cGVdKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3hpZWRFdmVudC5ldmVudFtrUHJvcGFnYXRpb25TdG9wcGVkXSAhPSBudWxsICYmXG4gICAgICAgIHByb3hpZWRFdmVudC5ldmVudFtrUHJvcGFnYXRpb25TdG9wcGVkXSAhPT0gdGhpc1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpZiAocHJveGllZEV2ZW50LmV2ZW50W2tJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWRdKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHRoaXMuI2NhbGxMaXN0ZW5lcihwcm94aWVkRXZlbnQuZXZlbnQsIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHByb3hpZWRFdmVudC5yZXZva2UoKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgZ2l2ZW4gdHlwZWQgZXZlbnQgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAgICogd2hlbiBhbGwgdGhlIGxpc3RlbmVycyBmb3IgdGhhdCBldmVudCBoYXZlIHNldHRsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEVtaXR0ZXIuTGlzdGVuZXJSZXR1cm5UeXBlPj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gICAqIHdpdGggdGhlIHJldHVybiB2YWx1ZXMgb2YgYWxsIGxpc3RlbmVycy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWl0QXNQcm9taXNlPEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nPihcbiAgICBldmVudDogQnJhbmQ8RXZlbnRNYXBbRXZlbnRUeXBlXSwgRXZlbnRUeXBlPixcbiAgKTogUHJvbWlzZTxcbiAgICBBcnJheTxFbWl0dGVyLkxpc3RlbmVyUmV0dXJuVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4+XG4gID4ge1xuICAgIGlmICh0aGlzLmxpc3RlbmVyQ291bnQoZXZlbnQudHlwZSkgPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdMaXN0ZW5lcnM6IEFycmF5PFxuICAgICAgUHJvbWlzZTxFbWl0dGVyLkxpc3RlbmVyUmV0dXJuVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4+XG4gICAgPiA9IFtdXG5cbiAgICBjb25zdCBwcm94aWVkRXZlbnQgPSB0aGlzLiNwcm94eUV2ZW50KGV2ZW50KVxuXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnNbZXZlbnQudHlwZV0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJveGllZEV2ZW50LmV2ZW50W2tQcm9wYWdhdGlvblN0b3BwZWRdICE9IG51bGwgJiZcbiAgICAgICAgcHJveGllZEV2ZW50LmV2ZW50W2tQcm9wYWdhdGlvblN0b3BwZWRdICE9PSB0aGlzXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIGlmIChwcm94aWVkRXZlbnQuZXZlbnRba0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZF0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZ0xpc3RlbmVycy5wdXNoKFxuICAgICAgICAvLyBBd2FpdGluZyBpbmRpdmlkdWFsIGxpc3RlbmVycyBndWFyYW50ZWVzIHRoZWlyIGNhbGwgb3JkZXIuXG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSh0aGlzLiNjYWxsTGlzdGVuZXIocHJveGllZEV2ZW50LmV2ZW50LCBsaXN0ZW5lcikpLFxuICAgICAgKVxuICAgIH1cblxuICAgIHByb3hpZWRFdmVudC5yZXZva2UoKVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nTGlzdGVuZXJzKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT5cbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyByZXN1bHQudmFsdWUgOiByZXN1bHQucmVhc29uLFxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIGdpdmVuIGV2ZW50IGFuZCByZXR1cm5zIGEgZ2VuZXJhdG9yIHRoYXQgeWllbGRzXG4gICAqIHRoZSByZXN1bHQgb2YgZWFjaCBsaXN0ZW5lciBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgcmVnaXN0cmF0aW9uLlxuICAgKiBUaGlzIHdheSwgeW91IHN0b3AgZXhoYXVzdGluZyB0aGUgbGlzdGVuZXJzIG9uY2UgeW91IGdldCB0aGUgZXhwZWN0ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgKmVtaXRBc0dlbmVyYXRvcjxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZz4oXG4gICAgZXZlbnQ6IEJyYW5kPEV2ZW50TWFwW0V2ZW50VHlwZV0sIEV2ZW50VHlwZT4sXG4gICk6IEdlbmVyYXRvcjxFbWl0dGVyLkxpc3RlbmVyUmV0dXJuVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4+IHtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KGV2ZW50LnR5cGUpID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwcm94aWVkRXZlbnQgPSB0aGlzLiNwcm94eUV2ZW50KGV2ZW50KVxuXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnNbZXZlbnQudHlwZV0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJveGllZEV2ZW50LmV2ZW50W2tQcm9wYWdhdGlvblN0b3BwZWRdICE9IG51bGwgJiZcbiAgICAgICAgcHJveGllZEV2ZW50LmV2ZW50W2tQcm9wYWdhdGlvblN0b3BwZWRdICE9PSB0aGlzXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChwcm94aWVkRXZlbnQuZXZlbnRba0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZF0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgeWllbGQgdGhpcy4jY2FsbExpc3RlbmVyKHByb3hpZWRFdmVudC5ldmVudCwgbGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcHJveGllZEV2ZW50LnJldm9rZSgpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZz4oXG4gICAgdHlwZTogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBFbWl0dGVyLkxpc3RlbmVyVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4sXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3RlbmVyQ291bnQodHlwZSkgPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5leHRMaXN0ZW5lcnM6IEFycmF5PFxuICAgICAgRW1pdHRlci5MaXN0ZW5lclR5cGU8dHlwZW9mIHRoaXMsIEV2ZW50VHlwZSwgRXZlbnRNYXA+XG4gICAgPiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGV4aXN0aW5nTGlzdGVuZXIgb2YgdGhpcy4jbGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICBpZiAoZXhpc3RpbmdMaXN0ZW5lciAhPT0gbGlzdGVuZXIpIHtcbiAgICAgICAgbmV4dExpc3RlbmVycy5wdXNoKGV4aXN0aW5nTGlzdGVuZXIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jbGlzdGVuZXJzW3R5cGVdID0gbmV4dExpc3RlbmVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqIElmIG5vIGV2ZW50IHR5cGUgaXMgcHJvdmlkZWQsIHJlbW92ZXMgYWxsIGV4aXN0aW5nIGxpc3RlbmVycy5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8RXZlbnRUeXBlIGV4dGVuZHMga2V5b2YgRXZlbnRNYXAgJiBzdHJpbmc+KFxuICAgIHR5cGU/OiBFdmVudFR5cGUsXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAgIHRoaXMuI2xpc3RlbmVycyA9IHt9IGFzIEludGVybmFsTGlzdGVuZXJzTWFwPHR5cGVvZiB0aGlzPlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy4jbGlzdGVuZXJzW3R5cGVdID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqIElmIG5vIGV2ZW4gdHlwZSBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbGlzdGVuZXJzLlxuICAgKi9cbiAgcHVibGljIGxpc3RlbmVyczxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZz4oXG4gICAgdHlwZT86IEV2ZW50VHlwZSxcbiAgKTogQXJyYXk8RW1pdHRlci5MaXN0ZW5lclR5cGU8dHlwZW9mIHRoaXMsIEV2ZW50VHlwZSwgRXZlbnRNYXA+PiB7XG4gICAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jbGlzdGVuZXJzKS5mbGF0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jbGlzdGVuZXJzW3R5cGVdIHx8IFtdXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gICAqIElmIG5vIGV2ZW4gdHlwZSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAgICovXG4gIHB1YmxpYyBsaXN0ZW5lckNvdW50PEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nPihcbiAgICB0eXBlPzogRXZlbnRUeXBlLFxuICApOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVycyh0eXBlKS5sZW5ndGhcbiAgfVxuXG4gICNhZGRMaXN0ZW5lcjxFdmVudFR5cGUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCAmIHN0cmluZz4oXG4gICAgdHlwZTogRXZlbnRUeXBlLFxuICAgIGxpc3RlbmVyOiBFbWl0dGVyLkxpc3RlbmVyVHlwZTx0eXBlb2YgdGhpcywgRXZlbnRUeXBlLCBFdmVudE1hcD4sXG4gICAgb3B0aW9uczogVHlwZWRMaXN0ZW5lck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICAgaW5zZXJ0TW9kZTogJ2FwcGVuZCcgfCAncHJlcGVuZCcgPSAnYXBwZW5kJyxcbiAgKTogdHlwZW9mIHRoaXMge1xuICAgIHRoaXMuI2xpc3RlbmVyc1t0eXBlXSA/Pz0gW11cblxuICAgIGlmIChpbnNlcnRNb2RlID09PSAncHJlcGVuZCcpIHtcbiAgICAgIHRoaXMuI2xpc3RlbmVyc1t0eXBlXS51bnNoaWZ0KGxpc3RlbmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcilcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3RlbmVyLCBrTGlzdGVuZXJPcHRpb25zLCB7XG4gICAgICAgIHZhbHVlOiBvcHRpb25zLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSlcblxuICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsKSB7XG4gICAgICAgIG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgI3Byb3h5RXZlbnQ8RXZlbnQgZXh0ZW5kcyBUeXBlZEV2ZW50PihcbiAgICBldmVudDogRXZlbnQsXG4gICk6IHsgZXZlbnQ6IEV2ZW50OyByZXZva2U6ICgpID0+IHZvaWQgfSB7XG4gICAgY29uc3QgeyBzdG9wUHJvcGFnYXRpb24gfSA9IGV2ZW50XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSBuZXcgUHJveHkoZXZlbnQuc3RvcFByb3BhZ2F0aW9uLCB7XG4gICAgICBhcHBseTogKHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpID0+IHtcbiAgICAgICAgZXZlbnRba1Byb3BhZ2F0aW9uU3RvcHBlZF0gPSB0aGlzXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnQsXG4gICAgICByZXZva2UoKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHN0b3BQcm9wYWdhdGlvblxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICAjY2FsbExpc3RlbmVyPEV2ZW50VHlwZSBleHRlbmRzIGtleW9mIEV2ZW50TWFwICYgc3RyaW5nPihcbiAgICBldmVudDogRXZlbnQsXG4gICAgbGlzdGVuZXI6IEVtaXR0ZXIuTGlzdGVuZXJUeXBlPHR5cGVvZiB0aGlzLCBFdmVudFR5cGUsIEV2ZW50TWFwPiAmIHtcbiAgICAgIFtrTGlzdGVuZXJPcHRpb25zXT86IFR5cGVkTGlzdGVuZXJPcHRpb25zXG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KVxuXG4gICAgaWYgKGxpc3RlbmVyW2tMaXN0ZW5lck9wdGlvbnNdPy5vbmNlKSB7XG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LnR5cGUsIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG59XG4iLCAiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnb3V0dmFyaWFudCdcbmltcG9ydCB7IEVtaXR0ZXIsIFR5cGVkRXZlbnQgfSBmcm9tICdyZXR0aW1lJ1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvaXNPYmplY3QnXG5pbXBvcnQgdHlwZSB7IFN0cmluZ2lmaWVkUmVzcG9uc2UgfSBmcm9tICcuLi9zZXR1cFdvcmtlci9nbG9zc2FyeSdcbmltcG9ydCB7IHN1cHBvcnRzU2VydmljZVdvcmtlciB9IGZyb20gJy4uL3V0aWxzL3N1cHBvcnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckNoYW5uZWxPcHRpb25zIHtcbiAgd29ya2VyOiBQcm9taXNlPFNlcnZpY2VXb3JrZXI+XG59XG5cbmV4cG9ydCB0eXBlIFdvcmtlckNoYW5uZWxFdmVudE1hcCA9IHtcbiAgUkVRVUVTVDogV29ya2VyRXZlbnQ8SW5jb21pbmdXb3JrZXJSZXF1ZXN0PlxuICBSRVNQT05TRTogV29ya2VyRXZlbnQ8SW5jb21pbmdXb3JrZXJSZXNwb25zZT5cbiAgTU9DS0lOR19FTkFCTEVEOiBXb3JrZXJFdmVudDx7XG4gICAgY2xpZW50OiB7XG4gICAgICBpZDogc3RyaW5nXG4gICAgICBmcmFtZVR5cGU6IHN0cmluZ1xuICAgIH1cbiAgfT5cbiAgSU5URUdSSVRZX0NIRUNLX1JFU1BPTlNFOiBXb3JrZXJFdmVudDx7XG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZ1xuICAgIGNoZWNrc3VtOiBzdHJpbmdcbiAgfT5cbiAgS0VFUEFMSVZFX1JFU1BPTlNFOiBUeXBlZEV2ZW50PG5ldmVyPlxufVxuXG4vKipcbiAqIFJlcXVlc3QgcmVwcmVzZW50YXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgd29ya2VyIG1lc3NhZ2UgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21pbmdXb3JrZXJSZXF1ZXN0XG4gIGV4dGVuZHMgT21pdDxcbiAgICBSZXF1ZXN0LFxuICAgIHwgJ3RleHQnXG4gICAgfCAnYm9keSdcbiAgICB8ICdqc29uJ1xuICAgIHwgJ2Jsb2InXG4gICAgfCAnYXJyYXlCdWZmZXInXG4gICAgfCAnZm9ybURhdGEnXG4gICAgfCAnY2xvbmUnXG4gICAgfCAnc2lnbmFsJ1xuICAgIHwgJ2lzSGlzdG9yeU5hdmlnYXRpb24nXG4gICAgfCAnaXNSZWxvYWROYXZpZ2F0aW9uJ1xuICA+IHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBJRCBvZiB0aGUgcmVxdWVzdCBnZW5lcmF0ZWQgb25jZSB0aGUgcmVxdWVzdCBpc1xuICAgKiBpbnRlcmNlcHRlZCBieSB0aGUgXCJmZXRjaFwiIGV2ZW50IGluIHRoZSBTZXJ2aWNlIFdvcmtlci5cbiAgICovXG4gIGlkOiBzdHJpbmdcbiAgaW50ZXJjZXB0ZWRBdDogbnVtYmVyXG4gIGJvZHk/OiBBcnJheUJ1ZmZlciB8IG51bGxcbn1cblxudHlwZSBJbmNvbWluZ1dvcmtlclJlc3BvbnNlID0ge1xuICBpc01vY2tlZFJlc3BvbnNlOiBib29sZWFuXG4gIHJlcXVlc3Q6IEluY29taW5nV29ya2VyUmVxdWVzdFxuICByZXNwb25zZTogUGljazxcbiAgICBSZXNwb25zZSxcbiAgICAndHlwZScgfCAnb2snIHwgJ3N0YXR1cycgfCAnc3RhdHVzVGV4dCcgfCAnYm9keScgfCAnaGVhZGVycycgfCAncmVkaXJlY3RlZCdcbiAgPlxufVxuXG5leHBvcnQgdHlwZSBXb3JrZXJFdmVudFJlc3BvbnNlID0ge1xuICBNT0NLX1JFU1BPTlNFOiBbXG4gICAgZGF0YTogU3RyaW5naWZpZWRSZXNwb25zZSxcbiAgICB0cmFuc2Zlcj86IFtSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pl0sXG4gIF1cbiAgUEFTU1RIUk9VR0g6IFtdXG59XG5cbmNvbnN0IFNVUFBPUlRTX1NFUlZJQ0VfV09SS0VSID0gc3VwcG9ydHNTZXJ2aWNlV29ya2VyKClcblxuZXhwb3J0IGNsYXNzIFdvcmtlckV2ZW50PFxuICBEYXRhVHlwZSxcbiAgUmV0dXJuVHlwZSA9IGFueSxcbiAgRXZlbnRUeXBlIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiBleHRlbmRzIFR5cGVkRXZlbnQ8RGF0YVR5cGUsIFJldHVyblR5cGUsIEV2ZW50VHlwZT4ge1xuICAjd29ya2VyRXZlbnQ6IE1lc3NhZ2VFdmVudFxuXG4gIGNvbnN0cnVjdG9yKHdvcmtlckV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCB0eXBlID0gd29ya2VyRXZlbnQuZGF0YS50eXBlIGFzIEV2ZW50VHlwZVxuICAgIGNvbnN0IGRhdGEgPSB3b3JrZXJFdmVudC5kYXRhLnBheWxvYWQgYXMgRGF0YVR5cGVcblxuICAgIC8qKlxuICAgICAqIEBub3RlIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2Ugd2UncmUgbWFwcGluZyB7IHR5cGUsIHBheWxvYWQgfVxuICAgICAqIG1lc3NhZ2Ugc3RydWN0dXJlIG9mIHRoZSB3b3JrZXIuIFRoZSBjbGllbnQgcmVmZXJlbmNlcyB0aGVcbiAgICAgKiBwYXlsb2FkIHZpYSBgZXZlbnQuZGF0YWAuXG4gICAgICovXG4gICAgc3VwZXIoXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRyb3VibGVzb21lIGBUeXBlZEV2ZW50YCBleHRlbnNpb24uXG4gICAgICB0eXBlLFxuICAgICAgeyBkYXRhIH0sXG4gICAgKVxuICAgIHRoaXMuI3dvcmtlckV2ZW50ID0gd29ya2VyRXZlbnRcbiAgfVxuXG4gIGdldCBwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jd29ya2VyRXZlbnQucG9ydHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBseSBkaXJlY3RseSB0byB0aGlzIGV2ZW50IHVzaW5nIGl0cyBgTWVzc2FnZVBvcnRgLlxuICAgKi9cbiAgcHVibGljIHBvc3RNZXNzYWdlPFR5cGUgZXh0ZW5kcyBrZXlvZiBXb3JrZXJFdmVudFJlc3BvbnNlPihcbiAgICB0eXBlOiBUeXBlLFxuICAgIC4uLnJlc3Q6IFdvcmtlckV2ZW50UmVzcG9uc2VbVHlwZV1cbiAgKTogdm9pZCB7XG4gICAgdGhpcy4jd29ya2VyRXZlbnQucG9ydHNbMF0ucG9zdE1lc3NhZ2UoXG4gICAgICB7IHR5cGUsIGRhdGE6IHJlc3RbMF0gfSxcbiAgICAgIHsgdHJhbnNmZXI6IHJlc3RbMV0gfSxcbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBNYXAgb2YgdGhlIGV2ZW50cyB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBTZXJ2aWNlIFdvcmtlclxuICogZnJvbSBhbnkgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbnR5cGUgT3V0Z29pbmdXb3JrZXJFdmVudHMgPVxuICB8ICdNT0NLX0FDVElWQVRFJ1xuICB8ICdJTlRFR1JJVFlfQ0hFQ0tfUkVRVUVTVCdcbiAgfCAnS0VFUEFMSVZFX1JFUVVFU1QnXG4gIHwgJ0NMSUVOVF9DTE9TRUQnXG5cbmV4cG9ydCBjbGFzcyBXb3JrZXJDaGFubmVsIGV4dGVuZHMgRW1pdHRlcjxXb3JrZXJDaGFubmVsRXZlbnRNYXA+IHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IFdvcmtlckNoYW5uZWxPcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKCFTVVBQT1JUU19TRVJWSUNFX1dPUktFUikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5vcHRpb25zLndvcmtlclxuXG4gICAgICBpZiAoZXZlbnQuc291cmNlICE9IG51bGwgJiYgZXZlbnQuc291cmNlICE9PSB3b3JrZXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5kYXRhICYmIGlzT2JqZWN0KGV2ZW50LmRhdGEpICYmICd0eXBlJyBpbiBldmVudC5kYXRhKSB7XG4gICAgICAgIHRoaXMuZW1pdChuZXcgV29ya2VyRXZlbnQ8YW55LCBhbnksIGFueT4oZXZlbnQpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBkYXRhIHRvIHRoZSBTZXJ2aWNlIFdvcmtlciBjb250cm9sbGluZyB0aGlzIGNsaWVudC5cbiAgICogVGhpcyB0cmlnZ2VycyB0aGUgYG1lc3NhZ2VgIGV2ZW50IGxpc3RlbmVyIG9uIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZS5cbiAgICovXG4gIHB1YmxpYyBwb3N0TWVzc2FnZSh0eXBlOiBPdXRnb2luZ1dvcmtlckV2ZW50cyk6IHZvaWQge1xuICAgIGludmFyaWFudChcbiAgICAgIFNVUFBPUlRTX1NFUlZJQ0VfV09SS0VSLFxuICAgICAgJ0ZhaWxlZCB0byBwb3N0IG1lc3NhZ2Ugb24gYSBXb3JrZXJDaGFubmVsOiB0aGUgU2VydmljZSBXb3JrZXIgQVBJIGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dC4gVGhpcyBpcyBsaWtlbHkgYW4gaXNzdWUgd2l0aCBNU1cuIFBsZWFzZSByZXBvcnQgaXQgb24gR2l0SHViOiBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvbXN3L2lzc3VlcycsXG4gICAgKVxuXG4gICAgdGhpcy5vcHRpb25zLndvcmtlci50aGVuKCh3b3JrZXIpID0+IHtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh0eXBlKVxuICAgIH0pXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFbWl0dGVyLCBFdmVudE1hcCB9IGZyb20gJ3N0cmljdC1ldmVudC1lbWl0dGVyJ1xuXG4vKipcbiAqIEVtaXRzIGFuIGV2ZW50IG9uIHRoZSBnaXZlbiBlbWl0dGVyIGJ1dCBleGVjdXRlc1xuICogdGhlIGxpc3RlbmVycyBzZXF1ZW50aWFsbHkuIFRoaXMgYWNjb3VudHMgZm9yIGFzeW5jaHJvbm91c1xuICogbGlzdGVuZXJzIChlLmcuIHRob3NlIGhhdmluZyBcInNsZWVwXCIgYW5kIGhhbmRsaW5nIHRoZSByZXF1ZXN0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVtaXRBc3luYzxcbiAgRXZlbnRzIGV4dGVuZHMgRXZlbnRNYXAsXG4gIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIEV2ZW50c1xuPihcbiAgZW1pdHRlcjogRW1pdHRlcjxFdmVudHM+LFxuICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgLi4uZGF0YTogRXZlbnRzW0V2ZW50TmFtZV1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBsaXN0ZW5lcnMgPSBlbWl0dGVyLmxpc3RlbmVycyhldmVudE5hbWUpXG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgYXdhaXQgbGlzdGVuZXIuYXBwbHkoZW1pdHRlciwgZGF0YSlcbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBnbG9iYWwgcHJvcGVydHlcbiAqIGlzIGRlZmluZWQgYW5kIGlzIGNvbmZpZ3VyYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbmZpZ3VyYWJsZUdsb2JhbChwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWxUaGlzLCBwcm9wZXJ0eU5hbWUpXG5cbiAgLy8gVGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgYXQgYWxsLlxuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUaGUgcHJvcGVydHkgaXMgc2V0IHRvIGEgZ2V0dGVyIHRoYXQgcmV0dXJucyB1bmRlZmluZWQuXG4gIGlmIChcbiAgICB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGVzY3JpcHRvci5nZXQoKSA9PT0gJ3VuZGVmaW5lZCdcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUaGUgcHJvcGVydHkgaXMgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gdW5kZWZpbmVkLlxuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IuZ2V0ID09PSAndW5kZWZpbmVkJyAmJiBkZXNjcmlwdG9yLnZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVzY3JpcHRvci5zZXQgPT09ICd1bmRlZmluZWQnICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgW01TV10gRmFpbGVkIHRvIGFwcGx5IGludGVyY2VwdG9yOiB0aGUgZ2xvYmFsIFxcYCR7cHJvcGVydHlOYW1lfVxcYCBwcm9wZXJ0eSBpcyBub24tY29uZmlndXJhYmxlLiBUaGlzIGlzIGxpa2VseSBhbiBpc3N1ZSB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgdXNpbmcgYSBmcmFtZXdvcmssIHBsZWFzZSBvcGVuIGFuIGlzc3VlIGFib3V0IHRoaXMgaW4gdGhlaXIgcmVwb3NpdG9yeS5gXG4gICAgKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJleHBvcnQgdHlwZSBBc3luY1R1cGxlPFxuICBFcnJvclR5cGUgZXh0ZW5kcyBhbnkgPSBFcnJvcixcbiAgRGF0YVR5cGUgZXh0ZW5kcyBhbnkgPSB1bmtub3duLFxuPiA9XG4gIHwge1xuICAgICAgZXJyb3I6IEVycm9yVHlwZVxuICAgICAgZGF0YTogbnVsbFxuICAgIH1cbiAgfCB7IGVycm9yOiBudWxsOyBkYXRhOiBEYXRhVHlwZSB9XG5cbi8qKlxuICogR3JhY2VmdWxseSBoYW5kbGVzIGEgZ2l2ZW4gUHJvbWlzZSBmYWN0b3J5LlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHsgZXJyb3IsIGRhdGEgfSA9IGF3YWl0IHVudGlsKCgpID0+IGFzeW5jQWN0aW9uKCkpXG4gKi9cbmV4cG9ydCBjb25zdCB1bnRpbCA9IGFzeW5jIDxcbiAgRXJyb3JUeXBlIGV4dGVuZHMgYW55ID0gRXJyb3IsXG4gIERhdGFUeXBlIGV4dGVuZHMgYW55ID0gdW5rbm93bixcbj4oXG4gIHByb21pc2U6ICgpID0+IFByb21pc2U8RGF0YVR5cGU+LFxuKTogUHJvbWlzZTxBc3luY1R1cGxlPEVycm9yVHlwZSwgRGF0YVR5cGU+PiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHByb21pc2UoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfSlcbiAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgZGF0YSB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3IsIGRhdGE6IG51bGwgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2Ygb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3Q8VD4odmFsdWU6IGFueSwgbG9vc2UgPSBmYWxzZSk6IHZhbHVlIGlzIFQge1xuICByZXR1cm4gbG9vc2VcbiAgICA/IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc3RhcnRzV2l0aCgnW29iamVjdCAnKVxuICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cbiIsICIvKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB2YWxpZGF0ZXMgaWYgcHJvcGVydHkgYWNjZXNzIGlzIHBvc3NpYmxlIG9uIGFuIG9iamVjdFxuICogd2l0aG91dCB0aHJvd2luZy4gSXQgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGFjY2VzcyBpcyBwb3NzaWJsZVxuICogYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEVudmlyb25tZW50cyBsaWtlIG1pbmlmbGFyZSB3aWxsIHRocm93IG9uIHByb3BlcnR5IGFjY2VzcyBvbiBjZXJ0YWluIG9iamVjdHNcbiAqIGxpa2UgUmVxdWVzdCBhbmQgUmVzcG9uc2UsIGZvciB1bmltcGxlbWVudGVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5QWNjZXNzaWJsZTxPYmogZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqOiBPYmosXG4gIGtleToga2V5b2YgT2JqXG4pIHtcbiAgdHJ5IHtcbiAgICBvYmpba2V5XVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iLCAiaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuL2lzT2JqZWN0J1xuaW1wb3J0IHsgaXNQcm9wZXJ0eUFjY2Vzc2libGUgfSBmcm9tICcuL2lzUHJvcGVydHlBY2Nlc3NpYmxlJ1xuXG4vKipcbiAqIENyZWF0ZXMgYSBnZW5lcmljIDUwMCBVbmhhbmRsZWQgRXhjZXB0aW9uIHJlc3BvbnNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVyRXJyb3JSZXNwb25zZShib2R5OiB1bmtub3duKTogUmVzcG9uc2Uge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgYm9keSBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbmFtZTogYm9keS5uYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogYm9keS5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhY2s6IGJvZHkuc3RhY2ssXG4gICAgICAgICAgfVxuICAgICAgICA6IGJvZHlcbiAgICApLFxuICAgIHtcbiAgICAgIHN0YXR1czogNTAwLFxuICAgICAgc3RhdHVzVGV4dDogJ1VuaGFuZGxlZCBFeGNlcHRpb24nLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9XG4gIClcbn1cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VFcnJvciA9IFJlc3BvbnNlICYgeyB0eXBlOiAnZXJyb3InIH1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gcmVzcG9uc2UgaXMgYSBgUmVzcG9uc2UuZXJyb3IoKWAuXG4gKlxuICogQG5vdGUgU29tZSBlbnZpcm9ubWVudHMsIGxpa2UgTWluaWZsYXJlIChDbG91ZGZsYXJlKSBkbyBub3RcbiAqIGltcGxlbWVudCB0aGUgXCJSZXNwb25zZS50eXBlXCIgcHJvcGVydHkgYW5kIHRocm93IG9uIGl0cyBhY2Nlc3MuXG4gKiBTYWZlbHkgY2hlY2sgaWYgd2UgY2FuIGFjY2VzcyBcInR5cGVcIiBvbiBcIlJlc3BvbnNlXCIgYmVmb3JlIGNvbnRpbnVpbmcuXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tc3dqcy9tc3cvaXNzdWVzLzE4MzRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzcG9uc2VFcnJvcihyZXNwb25zZTogdW5rbm93bik6IHJlc3BvbnNlIGlzIFJlc3BvbnNlRXJyb3Ige1xuICByZXR1cm4gKFxuICAgIHJlc3BvbnNlICE9IG51bGwgJiZcbiAgICByZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlICYmXG4gICAgaXNQcm9wZXJ0eUFjY2Vzc2libGUocmVzcG9uc2UsICd0eXBlJykgJiZcbiAgICByZXNwb25zZS50eXBlID09PSAnZXJyb3InXG4gIClcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBgUmVzcG9uc2VgIG9yIGEgUmVzcG9uc2UtbGlrZSBvYmplY3QuXG4gKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGB2YWx1ZSBpbnN0YW5jZW9mIFJlc3BvbnNlYCBiZWNhdXNlIGl0IHN1cHBvcnRzXG4gKiBjdXN0b20gYFJlc3BvbnNlYCBjb25zdHJ1Y3RvcnMsIGxpa2UgdGhlIG9uZSB3aGVuIHVzaW5nIFVuZGljaSBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzcG9uc2VMaWtlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVzcG9uc2Uge1xuICByZXR1cm4gKFxuICAgIGlzT2JqZWN0PFJlY29yZDxzdHJpbmcsIGFueT4+KHZhbHVlLCB0cnVlKSAmJlxuICAgIGlzUHJvcGVydHlBY2Nlc3NpYmxlKHZhbHVlLCAnc3RhdHVzJykgJiZcbiAgICBpc1Byb3BlcnR5QWNjZXNzaWJsZSh2YWx1ZSwgJ3N0YXR1c1RleHQnKSAmJlxuICAgIGlzUHJvcGVydHlBY2Nlc3NpYmxlKHZhbHVlLCAnYm9keVVzZWQnKVxuICApXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFbWl0dGVyIH0gZnJvbSAnc3RyaWN0LWV2ZW50LWVtaXR0ZXInXG5pbXBvcnQgeyBEZWZlcnJlZFByb21pc2UgfSBmcm9tICdAb3Blbi1kcmFmdC9kZWZlcnJlZC1wcm9taXNlJ1xuaW1wb3J0IHsgdW50aWwgfSBmcm9tICdAb3Blbi1kcmFmdC91bnRpbCdcbmltcG9ydCB0eXBlIHsgSHR0cFJlcXVlc3RFdmVudE1hcCB9IGZyb20gJy4uL2dsb3NzYXJ5J1xuaW1wb3J0IHsgZW1pdEFzeW5jIH0gZnJvbSAnLi9lbWl0QXN5bmMnXG5pbXBvcnQgeyBSZXF1ZXN0Q29udHJvbGxlciB9IGZyb20gJy4uL1JlcXVlc3RDb250cm9sbGVyJ1xuaW1wb3J0IHtcbiAgY3JlYXRlU2VydmVyRXJyb3JSZXNwb25zZSxcbiAgaXNSZXNwb25zZUVycm9yLFxuICBpc1Jlc3BvbnNlTGlrZSxcbn0gZnJvbSAnLi9yZXNwb25zZVV0aWxzJ1xuaW1wb3J0IHsgSW50ZXJjZXB0b3JFcnJvciB9IGZyb20gJy4uL0ludGVyY2VwdG9yRXJyb3InXG5pbXBvcnQgeyBpc05vZGVMaWtlRXJyb3IgfSBmcm9tICcuL2lzTm9kZUxpa2VFcnJvcidcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi9pc09iamVjdCdcblxuaW50ZXJmYWNlIEhhbmRsZVJlcXVlc3RPcHRpb25zIHtcbiAgcmVxdWVzdElkOiBzdHJpbmdcbiAgcmVxdWVzdDogUmVxdWVzdFxuICBlbWl0dGVyOiBFbWl0dGVyPEh0dHBSZXF1ZXN0RXZlbnRNYXA+XG4gIGNvbnRyb2xsZXI6IFJlcXVlc3RDb250cm9sbGVyXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KFxuICBvcHRpb25zOiBIYW5kbGVSZXF1ZXN0T3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gYXN5bmMgKFxuICAgIHJlc3BvbnNlOiBSZXNwb25zZSB8IEVycm9yIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICApID0+IHtcbiAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgYXdhaXQgb3B0aW9ucy5jb250cm9sbGVyLmVycm9yV2l0aChyZXNwb25zZSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFwiUmVzcG9uc2UuZXJyb3IoKVwiIGluc3RhbmNlcy5cbiAgICBpZiAoaXNSZXNwb25zZUVycm9yKHJlc3BvbnNlKSkge1xuICAgICAgYXdhaXQgb3B0aW9ucy5jb250cm9sbGVyLnJlc3BvbmRXaXRoKHJlc3BvbnNlKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbm9ybWFsIHJlc3BvbnNlcyBvciByZXNwb25zZS1saWtlIG9iamVjdHMuXG4gICAgICogQG5vdGUgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSBhcmJpdHJhcnkgb2JqZWN0IGNoZWNrXG4gICAgICogc2luY2UgUmVzcG9uc2UgaW5zdGFuY2VzIGFyZSwgaW4gZmFjdCwgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNwb25zZUxpa2UocmVzcG9uc2UpKSB7XG4gICAgICBhd2FpdCBvcHRpb25zLmNvbnRyb2xsZXIucmVzcG9uZFdpdGgocmVzcG9uc2UpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcmJpdHJhcnkgb2JqZWN0cyBwcm92aWRlZCB0byBgLmVycm9yV2l0aChyZWFzb24pYC5cbiAgICBpZiAoaXNPYmplY3QocmVzcG9uc2UpKSB7XG4gICAgICBhd2FpdCBvcHRpb25zLmNvbnRyb2xsZXIuZXJyb3JXaXRoKHJlc3BvbnNlKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVJlc3BvbnNlRXJyb3IgPSBhc3luYyAoZXJyb3I6IHVua25vd24pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAvLyBGb3J3YXJkIHRoZSBzcGVjaWFsIGludGVyY2VwdG9yIGVycm9yIGluc3RhbmNlc1xuICAgIC8vIHRvIHRoZSBkZXZlbG9wZXIuIFRoZXNlIG11c3Qgbm90IGJlIGhhbmRsZWQgaW4gYW55IHdheS5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJbnRlcmNlcHRvckVycm9yKSB7XG4gICAgICB0aHJvdyByZXN1bHQuZXJyb3JcbiAgICB9XG5cbiAgICAvLyBTdXBwb3J0IG1vY2tpbmcgTm9kZS5qcy1saWtlIGVycm9ycy5cbiAgICBpZiAoaXNOb2RlTGlrZUVycm9yKGVycm9yKSkge1xuICAgICAgYXdhaXQgb3B0aW9ucy5jb250cm9sbGVyLmVycm9yV2l0aChlcnJvcilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRocm93biByZXNwb25zZXMuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVSZXNwb25zZShlcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEFkZCB0aGUgbGFzdCBcInJlcXVlc3RcIiBsaXN0ZW5lciB0byBjaGVjayBpZiB0aGUgcmVxdWVzdFxuICAvLyBoYXMgYmVlbiBoYW5kbGVkIGluIGFueSB3YXkuIElmIGl0IGhhc24ndCwgcmVzb2x2ZSB0aGVcbiAgLy8gcmVzcG9uc2UgcHJvbWlzZSB3aXRoIHVuZGVmaW5lZC5cbiAgLy8gb3B0aW9ucy5lbWl0dGVyLm9uY2UoJ3JlcXVlc3QnLCBhc3luYyAoeyByZXF1ZXN0SWQ6IHBlbmRpbmdSZXF1ZXN0SWQgfSkgPT4ge1xuICAvLyAgIGlmIChcbiAgLy8gICAgIHBlbmRpbmdSZXF1ZXN0SWQgPT09IG9wdGlvbnMucmVxdWVzdElkICYmXG4gIC8vICAgICBvcHRpb25zLmNvbnRyb2xsZXIucmVhZHlTdGF0ZSA9PT0gUmVxdWVzdENvbnRyb2xsZXIuUEVORElOR1xuICAvLyAgICkge1xuICAvLyAgICAgYXdhaXQgb3B0aW9ucy5jb250cm9sbGVyLnBhc3N0aHJvdWdoKClcbiAgLy8gICB9XG4gIC8vIH0pXG5cbiAgY29uc3QgcmVxdWVzdEFib3J0UHJvbWlzZSA9IG5ldyBEZWZlcnJlZFByb21pc2U8dm9pZCwgdW5rbm93bj4oKVxuXG4gIC8qKlxuICAgKiBAbm90ZSBgc2lnbmFsYCBpcyBub3QgYWx3YXlzIGRlZmluZWQgaW4gUmVhY3QgTmF0aXZlLlxuICAgKi9cbiAgaWYgKG9wdGlvbnMucmVxdWVzdC5zaWduYWwpIHtcbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBhd2FpdCBvcHRpb25zLmNvbnRyb2xsZXIuZXJyb3JXaXRoKG9wdGlvbnMucmVxdWVzdC5zaWduYWwucmVhc29uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2Fib3J0JyxcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmVxdWVzdEFib3J0UHJvbWlzZS5yZWplY3Qob3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5yZWFzb24pXG4gICAgICB9LFxuICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICApXG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bnRpbChhc3luYyAoKSA9PiB7XG4gICAgLy8gRW1pdCB0aGUgXCJyZXF1ZXN0XCIgZXZlbnQgYW5kIHdhaXQgdW50aWwgYWxsIHRoZSBsaXN0ZW5lcnNcbiAgICAvLyBmb3IgdGhhdCBldmVudCBhcmUgZmluaXNoZWQgKGUuZy4gYXN5bmMgbGlzdGVuZXJzIGF3YWl0ZWQpLlxuICAgIC8vIEJ5IHRoZSBlbmQgb2YgdGhpcyBwcm9taXNlLCB0aGUgZGV2ZWxvcGVyIGNhbm5vdCBhZmZlY3QgdGhlXG4gICAgLy8gcmVxdWVzdCBhbnltb3JlLlxuICAgIGNvbnN0IHJlcXVlc3RMaXN0ZW5lcnNQcm9taXNlID0gZW1pdEFzeW5jKG9wdGlvbnMuZW1pdHRlciwgJ3JlcXVlc3QnLCB7XG4gICAgICByZXF1ZXN0SWQ6IG9wdGlvbnMucmVxdWVzdElkLFxuICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgY29udHJvbGxlcjogb3B0aW9ucy5jb250cm9sbGVyLFxuICAgIH0pXG5cbiAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgLy8gU2hvcnQtY2lyY3VpdCB0aGUgcmVxdWVzdCBoYW5kbGluZyBwcm9taXNlIGlmIHRoZSByZXF1ZXN0IGdldHMgYWJvcnRlZC5cbiAgICAgIHJlcXVlc3RBYm9ydFByb21pc2UsXG4gICAgICByZXF1ZXN0TGlzdGVuZXJzUHJvbWlzZSxcbiAgICAgIG9wdGlvbnMuY29udHJvbGxlci5oYW5kbGVkLFxuICAgIF0pXG4gIH0pXG5cbiAgLy8gSGFuZGxlIHRoZSByZXF1ZXN0IGJlaW5nIGFib3J0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHJlcXVlc3QgbGlzdGVuZXJzLlxuICBpZiAocmVxdWVzdEFib3J0UHJvbWlzZS5zdGF0ZSA9PT0gJ3JlamVjdGVkJykge1xuICAgIGF3YWl0IG9wdGlvbnMuY29udHJvbGxlci5lcnJvcldpdGgocmVxdWVzdEFib3J0UHJvbWlzZS5yZWplY3Rpb25SZWFzb24pXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBlcnJvciBkdXJpbmcgdGhlIHJlcXVlc3QgbGlzdGVuZXIgZXhlY3V0aW9uLlxuICAgIC8vIFRoZXNlIGNhbiBiZSB0aHJvd24gcmVzcG9uc2VzIG9yIHJlcXVlc3QgZXJyb3JzLlxuICAgIGlmIChhd2FpdCBoYW5kbGVSZXNwb25zZUVycm9yKHJlc3VsdC5lcnJvcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoZSBkZXZlbG9wZXIgaGFzIGFkZGVkIFwidW5oYW5kbGVkRXhjZXB0aW9uXCIgbGlzdGVuZXJzLFxuICAgIC8vIGFsbG93IHRoZW0gdG8gaGFuZGxlIHRoZSBlcnJvci4gVGhleSBjYW4gdHJhbnNsYXRlIGl0IHRvIGFcbiAgICAvLyBtb2NrZWQgcmVzcG9uc2UsIG5ldHdvcmsgZXJyb3IsIG9yIGZvcndhcmQgaXQgYXMtaXMuXG4gICAgaWYgKG9wdGlvbnMuZW1pdHRlci5saXN0ZW5lckNvdW50KCd1bmhhbmRsZWRFeGNlcHRpb24nKSA+IDApIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyByZXF1ZXN0IGNvbnRyb2xsZXIganVzdCBmb3IgdGhlIHVuaGFuZGxlZCBleGNlcHRpb24gY2FzZS5cbiAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIG9yaWdpbmFsIGNvbnRyb2xsZXIgbWlnaHQgaGF2ZSBiZWVuIGFscmVhZHlcbiAgICAgIC8vIGludGVyYWN0ZWQgd2l0aCAoZS5nLiBcInJlc3BvbmRXaXRoXCIgb3IgXCJlcnJvcldpdGhcIiBjYWxsZWQgb24gaXQpLlxuICAgICAgY29uc3QgdW5oYW5kbGVkRXhjZXB0aW9uQ29udHJvbGxlciA9IG5ldyBSZXF1ZXN0Q29udHJvbGxlcihcbiAgICAgICAgb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5vdGUgSW50ZW50aW9uYWxseSBlbXB0eSBwYXNzdGhyb3VnaCBoYW5kbGUuXG4gICAgICAgICAgICogVGhpcyBjb250cm9sbGVyIGlzIGNyZWF0ZWQgd2l0aGluIGFub3RoZXIgY29udHJvbGxlciBhbmQgd2Ugb25seSBuZWVkXG4gICAgICAgICAgICogdG8ga25vdyBpZiBgdW5oYW5kbGVkRXhjZXB0aW9uYCBsaXN0ZW5lcnMgaGFuZGxlZCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBwYXNzdGhyb3VnaCgpIHt9LFxuICAgICAgICAgIGFzeW5jIHJlc3BvbmRXaXRoKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVSZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzeW5jIGVycm9yV2l0aChyZWFzb24pIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQG5vdGUgSGFuZGxlIHRoZSByZXN1bHQgb2YgdGhlIHVuaGFuZGxlZCBjb250cm9sbGVyXG4gICAgICAgICAgICAgKiBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG9yaWdpbmFsIHJlcXVlc3QgY29udHJvbGxlci5cbiAgICAgICAgICAgICAqIFRoZSBleGNlcHRpb24gaGVyZSBpcyB0aGF0IHRocm93biBlcnJvcnMgd2l0aGluIHRoZVxuICAgICAgICAgICAgICogXCJ1bmhhbmRsZWRFeGNlcHRpb25cIiBldmVudCBkbyBOT1QgcmVzdWx0IGluIGFub3RoZXJcbiAgICAgICAgICAgICAqIGVtaXQgb2YgdGhlIHNhbWUgZXZlbnQuIFRoZXkgYXJlIGZvcndhcmRlZCBhcy1pcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5jb250cm9sbGVyLmVycm9yV2l0aChyZWFzb24pXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKVxuXG4gICAgICBhd2FpdCBlbWl0QXN5bmMob3B0aW9ucy5lbWl0dGVyLCAndW5oYW5kbGVkRXhjZXB0aW9uJywge1xuICAgICAgICBlcnJvcjogcmVzdWx0LmVycm9yLFxuICAgICAgICByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QsXG4gICAgICAgIHJlcXVlc3RJZDogb3B0aW9ucy5yZXF1ZXN0SWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IHVuaGFuZGxlZEV4Y2VwdGlvbkNvbnRyb2xsZXIsXG4gICAgICB9KVxuXG4gICAgICAvLyBJZiBhbGwgdGhlIFwidW5oYW5kbGVkRXhjZXB0aW9uXCIgbGlzdGVuZXJzIGhhdmUgZmluaXNoZWRcbiAgICAgIC8vIGJ1dCBoYXZlIG5vdCBoYW5kbGVkIHRoZSByZXF1ZXN0IGluIGFueSB3YXksIHBhc3N0aHJvdWdoLlxuICAgICAgaWYgKFxuICAgICAgICB1bmhhbmRsZWRFeGNlcHRpb25Db250cm9sbGVyLnJlYWR5U3RhdGUgIT09IFJlcXVlc3RDb250cm9sbGVyLlBFTkRJTkdcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGNvZXJjZSB1bmhhbmRsZWQgZXhjZXB0aW9ucyB0byBhIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IgcmVzcG9uc2UuXG4gICAgYXdhaXQgb3B0aW9ucy5jb250cm9sbGVyLnJlc3BvbmRXaXRoKFxuICAgICAgY3JlYXRlU2VydmVyRXJyb3JSZXNwb25zZShyZXN1bHQuZXJyb3IpXG4gICAgKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSWYgdGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gaGFuZGxlZCBieSB0aGlzIHBvaW50LCBwYXNzdGhyb3VnaC5cbiAgaWYgKG9wdGlvbnMuY29udHJvbGxlci5yZWFkeVN0YXRlID09PSBSZXF1ZXN0Q29udHJvbGxlci5QRU5ESU5HKSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMuY29udHJvbGxlci5wYXNzdGhyb3VnaCgpXG4gIH1cblxuICByZXR1cm4gb3B0aW9ucy5jb250cm9sbGVyLmhhbmRsZWRcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNOb2RlTGlrZUVycm9yKFxuICBlcnJvcjogdW5rbm93blxuKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gJ2NvZGUnIGluIGVycm9yICYmICdlcnJubycgaW4gZXJyb3Jcbn1cbiIsICJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHsgdW50aWwgfSBmcm9tICdAb3Blbi1kcmFmdC91bnRpbCdcbmltcG9ydCB7IERlZmVycmVkUHJvbWlzZSB9IGZyb20gJ0BvcGVuLWRyYWZ0L2RlZmVycmVkLXByb21pc2UnXG5pbXBvcnQgeyBIdHRwUmVxdWVzdEV2ZW50TWFwLCBJU19QQVRDSEVEX01PRFVMRSB9IGZyb20gJy4uLy4uL2dsb3NzYXJ5J1xuaW1wb3J0IHsgSW50ZXJjZXB0b3IgfSBmcm9tICcuLi8uLi9JbnRlcmNlcHRvcidcbmltcG9ydCB7IFJlcXVlc3RDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vUmVxdWVzdENvbnRyb2xsZXInXG5pbXBvcnQgeyBlbWl0QXN5bmMgfSBmcm9tICcuLi8uLi91dGlscy9lbWl0QXN5bmMnXG5pbXBvcnQgeyBoYW5kbGVSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvaGFuZGxlUmVxdWVzdCdcbmltcG9ydCB7IGNhblBhcnNlVXJsIH0gZnJvbSAnLi4vLi4vdXRpbHMvY2FuUGFyc2VVcmwnXG5pbXBvcnQgeyBjcmVhdGVSZXF1ZXN0SWQgfSBmcm9tICcuLi8uLi9jcmVhdGVSZXF1ZXN0SWQnXG5pbXBvcnQgeyBjcmVhdGVOZXR3b3JrRXJyb3IgfSBmcm9tICcuL3V0aWxzL2NyZWF0ZU5ldHdvcmtFcnJvcidcbmltcG9ydCB7IGZvbGxvd0ZldGNoUmVkaXJlY3QgfSBmcm9tICcuL3V0aWxzL2ZvbGxvd1JlZGlyZWN0J1xuaW1wb3J0IHsgZGVjb21wcmVzc1Jlc3BvbnNlIH0gZnJvbSAnLi91dGlscy9kZWNvbXByZXNzaW9uJ1xuaW1wb3J0IHsgaGFzQ29uZmlndXJhYmxlR2xvYmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGFzQ29uZmlndXJhYmxlR2xvYmFsJ1xuaW1wb3J0IHsgRmV0Y2hSZXNwb25zZSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZldGNoVXRpbHMnXG5pbXBvcnQgeyBzZXRSYXdSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vZ2V0UmF3UmVxdWVzdCdcbmltcG9ydCB7IGlzUmVzcG9uc2VFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL3Jlc3BvbnNlVXRpbHMnXG5cbmV4cG9ydCBjbGFzcyBGZXRjaEludGVyY2VwdG9yIGV4dGVuZHMgSW50ZXJjZXB0b3I8SHR0cFJlcXVlc3RFdmVudE1hcD4ge1xuICBzdGF0aWMgc3ltYm9sID0gU3ltYm9sKCdmZXRjaCcpXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRmV0Y2hJbnRlcmNlcHRvci5zeW1ib2wpXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tFbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gaGFzQ29uZmlndXJhYmxlR2xvYmFsKCdmZXRjaCcpXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2V0dXAoKSB7XG4gICAgY29uc3QgcHVyZUZldGNoID0gZ2xvYmFsVGhpcy5mZXRjaFxuXG4gICAgaW52YXJpYW50KFxuICAgICAgIShwdXJlRmV0Y2ggYXMgYW55KVtJU19QQVRDSEVEX01PRFVMRV0sXG4gICAgICAnRmFpbGVkIHRvIHBhdGNoIHRoZSBcImZldGNoXCIgbW9kdWxlOiBhbHJlYWR5IHBhdGNoZWQuJ1xuICAgIClcblxuICAgIGdsb2JhbFRoaXMuZmV0Y2ggPSBhc3luYyAoaW5wdXQsIGluaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGNyZWF0ZVJlcXVlc3RJZCgpXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5vdGUgUmVzb2x2ZSBwb3RlbnRpYWxseSByZWxhdGl2ZSByZXF1ZXN0IFVSTFxuICAgICAgICogYWdhaW5zdCB0aGUgcHJlc2VudCBgbG9jYXRpb25gLiBUaGlzIGlzIG1haW5seVxuICAgICAgICogZm9yIG5hdGl2ZSBgZmV0Y2hgIGluIEpTRE9NLlxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvbXN3L2lzc3Vlcy8xNjI1XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHJlc29sdmVkSW5wdXQgPVxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgIWNhblBhcnNlVXJsKGlucHV0KVxuICAgICAgICAgID8gbmV3IFVSTChpbnB1dCwgbG9jYXRpb24uaHJlZilcbiAgICAgICAgICA6IGlucHV0XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChyZXNvbHZlZElucHV0LCBpbml0KVxuXG4gICAgICAvKipcbiAgICAgICAqIEBub3RlIFNldCB0aGUgcmF3IHJlcXVlc3Qgb25seSBpZiBhIFJlcXVlc3QgaW5zdGFuY2Ugd2FzIHByb3ZpZGVkIHRvIGZldGNoLlxuICAgICAgICovXG4gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICAgIHNldFJhd1JlcXVlc3QocmVxdWVzdCwgaW5wdXQpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlUHJvbWlzZSA9IG5ldyBEZWZlcnJlZFByb21pc2U8UmVzcG9uc2U+KClcblxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBSZXF1ZXN0Q29udHJvbGxlcihyZXF1ZXN0LCB7XG4gICAgICAgIHBhc3N0aHJvdWdoOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygncmVxdWVzdCBoYXMgbm90IGJlZW4gaGFuZGxlZCwgcGFzc3Rocm91Z2guLi4nKVxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5vdGUgQ2xvbmUgdGhlIHJlcXVlc3QgaW5zdGFuY2UgcmlnaHQgYmVmb3JlIHBlcmZvcm1pbmcgaXQuXG4gICAgICAgICAgICogVGhpcyBwcmVzZXJ2ZXMgYW55IG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgaW50ZXJjZXB0ZWQgcmVxdWVzdFxuICAgICAgICAgICAqIGluIHRoZSBcInJlcXVlc3RcIiBsaXN0ZW5lci4gVGhpcyBhbHNvIGFsbG93cyB0aGUgdXNlciB0byByZWFkIHRoZVxuICAgICAgICAgICAqIHJlcXVlc3QgYm9keSBpbiB0aGUgXCJyZXNwb25zZVwiIGxpc3RlbmVyIChvdGhlcndpc2UgXCJ1bnVzYWJsZVwiKS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCByZXF1ZXN0Q2xvbmVGb3JSZXNwb25zZUV2ZW50ID0gcmVxdWVzdC5jbG9uZSgpXG5cbiAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbnRlcmNlcHRlZCByZXF1ZXN0IGFzLWlzLlxuICAgICAgICAgIGNvbnN0IHsgZXJyb3I6IHJlc3BvbnNlRXJyb3IsIGRhdGE6IG9yaWdpbmFsUmVzcG9uc2UgfSA9IGF3YWl0IHVudGlsKFxuICAgICAgICAgICAgKCkgPT4gcHVyZUZldGNoKHJlcXVlc3QpXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2UucmVqZWN0KHJlc3BvbnNlRXJyb3IpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnb3JpZ2luYWwgZmV0Y2ggcGVyZm9ybWVkJywgb3JpZ2luYWxSZXNwb25zZSlcblxuICAgICAgICAgIGlmICh0aGlzLmVtaXR0ZXIubGlzdGVuZXJDb3VudCgncmVzcG9uc2UnKSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2VtaXR0aW5nIHRoZSBcInJlc3BvbnNlXCIgZXZlbnQuLi4nKVxuXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUNsb25lID0gb3JpZ2luYWxSZXNwb25zZS5jbG9uZSgpXG4gICAgICAgICAgICBhd2FpdCBlbWl0QXN5bmModGhpcy5lbWl0dGVyLCAncmVzcG9uc2UnLCB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZUNsb25lLFxuICAgICAgICAgICAgICBpc01vY2tlZFJlc3BvbnNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdENsb25lRm9yUmVzcG9uc2VFdmVudCxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXNvbHZlIHRoZSByZXNwb25zZSBwcm9taXNlIHdpdGggdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gICAgICAgICAgLy8gc2luY2UgdGhlIGBmZXRjaCgpYCByZXR1cm4gdGhpcyBpbnRlcm5hbCBwcm9taXNlLlxuICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKG9yaWdpbmFsUmVzcG9uc2UpXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3BvbmRXaXRoOiBhc3luYyAocmF3UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAvLyBIYW5kbGUgbW9ja2VkIGBSZXNwb25zZS5lcnJvcigpYCAoaS5lLiByZXF1ZXN0IGVycm9ycykuXG4gICAgICAgICAgaWYgKGlzUmVzcG9uc2VFcnJvcihyYXdSZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3JlcXVlc3QgaGFzIGVycm9yZWQhJywgeyByZXNwb25zZTogcmF3UmVzcG9uc2UgfSlcbiAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3QoY3JlYXRlTmV0d29ya0Vycm9yKHJhd1Jlc3BvbnNlKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3JlY2VpdmVkIG1vY2tlZCByZXNwb25zZSEnLCB7XG4gICAgICAgICAgICByYXdSZXNwb25zZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gRGVjb21wcmVzcyB0aGUgbW9ja2VkIHJlc3BvbnNlIGJvZHksIGlmIGFwcGxpY2FibGUuXG4gICAgICAgICAgY29uc3QgZGVjb21wcmVzc2VkU3RyZWFtID0gZGVjb21wcmVzc1Jlc3BvbnNlKHJhd1Jlc3BvbnNlKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID1cbiAgICAgICAgICAgIGRlY29tcHJlc3NlZFN0cmVhbSA9PT0gbnVsbFxuICAgICAgICAgICAgICA/IHJhd1Jlc3BvbnNlXG4gICAgICAgICAgICAgIDogbmV3IEZldGNoUmVzcG9uc2UoZGVjb21wcmVzc2VkU3RyZWFtLCByYXdSZXNwb25zZSlcblxuICAgICAgICAgIEZldGNoUmVzcG9uc2Uuc2V0VXJsKHJlcXVlc3QudXJsLCByZXNwb25zZSlcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFVuZGljaSdzIGhhbmRsaW5nIG9mIGZvbGxvd2luZyByZWRpcmVjdCByZXNwb25zZXMuXG4gICAgICAgICAgICogVHJlYXQgdGhlIFwibWFudWFsXCIgcmVkaXJlY3QgbW9kZSBhcyBhIHJlZ3VsYXIgbW9ja2VkIHJlc3BvbnNlLlxuICAgICAgICAgICAqIFRoaXMgd2F5LCB0aGUgY2xpZW50IGNhbiBtYW51YWxseSBmb2xsb3cgdGhlIHJlZGlyZWN0IGl0IHJlY2VpdmVzLlxuICAgICAgICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvYmxvYi9hNmRhYzMxNDljNTA1YjU4ZDJlNmQwNjhiOTdmNGRjOTkzZGE1NWYwL2xpYi93ZWIvZmV0Y2gvaW5kZXguanMjTDExNzNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBpZiAoRmV0Y2hSZXNwb25zZS5pc1JlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAgICAgLy8gUmVqZWN0IHRoZSByZXF1ZXN0IHByb21pc2UgaWYgaXRzIGByZWRpcmVjdGAgaXMgc2V0IHRvIGBlcnJvcmBcbiAgICAgICAgICAgIC8vIGFuZCBpdCByZWNlaXZlcyBhIG1vY2tlZCByZWRpcmVjdCByZXNwb25zZS5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3QoY3JlYXRlTmV0d29ya0Vycm9yKCd1bmV4cGVjdGVkIHJlZGlyZWN0JykpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2ZvbGxvdycpIHtcbiAgICAgICAgICAgICAgZm9sbG93RmV0Y2hSZWRpcmVjdChyZXF1ZXN0LCByZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChyZWFzb24pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmVtaXR0ZXIubGlzdGVuZXJDb3VudCgncmVzcG9uc2UnKSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2VtaXR0aW5nIHRoZSBcInJlc3BvbnNlXCIgZXZlbnQuLi4nKVxuXG4gICAgICAgICAgICAvLyBBd2FpdCB0aGUgcmVzcG9uc2UgbGlzdGVuZXJzIHRvIGZpbmlzaCBiZWZvcmUgcmVzb2x2aW5nXG4gICAgICAgICAgICAvLyB0aGUgcmVzcG9uc2UgcHJvbWlzZS4gVGhpcyBlbnN1cmVzIGFsbCB5b3VyIGxvZ2ljIGZpbmlzaGVzXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIGludGVyY2VwdG9yIHJlc29sdmVzIHRoZSBwZW5kaW5nIHJlc3BvbnNlLlxuICAgICAgICAgICAgYXdhaXQgZW1pdEFzeW5jKHRoaXMuZW1pdHRlciwgJ3Jlc3BvbnNlJywge1xuICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgbW9ja2VkIHJlc3BvbnNlIGZvciB0aGUgXCJyZXNwb25zZVwiIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICAgICAgICAvLyBUaGlzIHdheSwgdGhlIGxpc3RlbmVyIGNhbiByZWFkIHRoZSByZXNwb25zZSBhbmQgbm90IGxvY2sgaXRzIGJvZHlcbiAgICAgICAgICAgICAgLy8gZm9yIHRoZSBhY3R1YWwgZmV0Y2ggY29uc3VtZXIuXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZS5jbG9uZSgpLFxuICAgICAgICAgICAgICBpc01vY2tlZFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcldpdGg6IChyZWFzb24pID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQhJywgeyByZWFzb24gfSlcbiAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KHJlYXNvbilcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1slc10gJXMnLCByZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwpXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdhd2FpdGluZyBmb3IgdGhlIG1vY2tlZCByZXNwb25zZS4uLicpXG5cbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICdlbWl0dGluZyB0aGUgXCJyZXF1ZXN0XCIgZXZlbnQgZm9yICVzIGxpc3RlbmVyKHMpLi4uJyxcbiAgICAgICAgdGhpcy5lbWl0dGVyLmxpc3RlbmVyQ291bnQoJ3JlcXVlc3QnKVxuICAgICAgKVxuXG4gICAgICBhd2FpdCBoYW5kbGVSZXF1ZXN0KHtcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBlbWl0dGVyOiB0aGlzLmVtaXR0ZXIsXG4gICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2VQcm9taXNlXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuZmV0Y2gsIElTX1BBVENIRURfTU9EVUxFLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHRydWUsXG4gICAgfSlcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLmZldGNoLCBJU19QQVRDSEVEX01PRFVMRSwge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgZ2xvYmFsVGhpcy5mZXRjaCA9IHB1cmVGZXRjaFxuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAncmVzdG9yZWQgbmF0aXZlIFwiZ2xvYmFsVGhpcy5mZXRjaFwiIScsXG4gICAgICAgIGdsb2JhbFRoaXMuZmV0Y2gubmFtZVxuICAgICAgKVxuICAgIH0pXG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV0d29ya0Vycm9yKGNhdXNlPzogdW5rbm93bikge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCdGYWlsZWQgdG8gZmV0Y2gnKSwge1xuICAgIGNhdXNlLFxuICB9KVxufVxuIiwgImltcG9ydCB7IGNyZWF0ZU5ldHdvcmtFcnJvciB9IGZyb20gJy4vY3JlYXRlTmV0d29ya0Vycm9yJ1xuXG5jb25zdCBSRVFVRVNUX0JPRFlfSEVBREVSUyA9IFtcbiAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAnY29udGVudC1sYW5ndWFnZScsXG4gICdjb250ZW50LWxvY2F0aW9uJyxcbiAgJ2NvbnRlbnQtdHlwZScsXG4gICdjb250ZW50LWxlbmd0aCcsXG5dXG5cbmNvbnN0IGtSZWRpcmVjdENvdW50ID0gU3ltYm9sKCdrUmVkaXJlY3RDb3VudCcpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9ibG9iL2E2ZGFjMzE0OWM1MDViNThkMmU2ZDA2OGI5N2Y0ZGM5OTNkYTU1ZjAvbGliL3dlYi9mZXRjaC9pbmRleC5qcyNMMTIxMFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9sbG93RmV0Y2hSZWRpcmVjdChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDMwMyAmJiByZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVOZXR3b3JrRXJyb3IoKSlcbiAgfVxuXG4gIGNvbnN0IHJlcXVlc3RVcmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuXG4gIGxldCBsb2NhdGlvblVybDogVVJMXG4gIHRyeSB7XG4gICAgLy8gSWYgdGhlIGxvY2F0aW9uIGlzIGEgcmVsYXRpdmUgVVJMLCB1c2UgdGhlIHJlcXVlc3QgVVJMIGFzIHRoZSBiYXNlIFVSTC5cbiAgICBsb2NhdGlvblVybCA9IG5ldyBVUkwocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJykhLCByZXF1ZXN0LnVybCkgXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGNyZWF0ZU5ldHdvcmtFcnJvcihlcnJvcikpXG4gIH1cblxuICBpZiAoXG4gICAgIShsb2NhdGlvblVybC5wcm90b2NvbCA9PT0gJ2h0dHA6JyB8fCBsb2NhdGlvblVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgIGNyZWF0ZU5ldHdvcmtFcnJvcignVVJMIHNjaGVtZSBtdXN0IGJlIGEgSFRUUChTKSBzY2hlbWUnKVxuICAgIClcbiAgfVxuXG4gIGlmIChSZWZsZWN0LmdldChyZXF1ZXN0LCBrUmVkaXJlY3RDb3VudCkgPiAyMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVOZXR3b3JrRXJyb3IoJ3JlZGlyZWN0IGNvdW50IGV4Y2VlZGVkJykpXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWVzdCwga1JlZGlyZWN0Q291bnQsIHtcbiAgICB2YWx1ZTogKFJlZmxlY3QuZ2V0KHJlcXVlc3QsIGtSZWRpcmVjdENvdW50KSB8fCAwKSArIDEsXG4gIH0pXG5cbiAgaWYgKFxuICAgIHJlcXVlc3QubW9kZSA9PT0gJ2NvcnMnICYmXG4gICAgKGxvY2F0aW9uVXJsLnVzZXJuYW1lIHx8IGxvY2F0aW9uVXJsLnBhc3N3b3JkKSAmJlxuICAgICFzYW1lT3JpZ2luKHJlcXVlc3RVcmwsIGxvY2F0aW9uVXJsKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBjcmVhdGVOZXR3b3JrRXJyb3IoJ2Nyb3NzIG9yaWdpbiBub3QgYWxsb3dlZCBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJylcbiAgICApXG4gIH1cblxuICBjb25zdCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB7fVxuXG4gIGlmIChcbiAgICAoWzMwMSwgMzAyXS5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpICYmIHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpIHx8XG4gICAgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMzAzICYmICFbJ0hFQUQnLCAnR0VUJ10uaW5jbHVkZXMocmVxdWVzdC5tZXRob2QpKVxuICApIHtcbiAgICByZXF1ZXN0SW5pdC5tZXRob2QgPSAnR0VUJ1xuICAgIHJlcXVlc3RJbml0LmJvZHkgPSBudWxsXG5cbiAgICBSRVFVRVNUX0JPRFlfSEVBREVSUy5mb3JFYWNoKChoZWFkZXJOYW1lKSA9PiB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKGhlYWRlck5hbWUpXG4gICAgfSlcbiAgfVxuXG4gIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0VXJsLCBsb2NhdGlvblVybCkpIHtcbiAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKCdhdXRob3JpemF0aW9uJylcbiAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKCdwcm94eS1hdXRob3JpemF0aW9uJylcbiAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKCdjb29raWUnKVxuICAgIHJlcXVlc3QuaGVhZGVycy5kZWxldGUoJ2hvc3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBub3RlIFVuZGljaSBcInNhZmVseVwiIGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkuXG4gICAqIEkgc3VzcGVjdCB3ZSBjYW5ub3QgZGlzcGF0Y2ggdGhpcyByZXF1ZXN0IGFnYWluXG4gICAqIHNpbmNlIGl0cyBib2R5IGhhcyBiZWVuIHJlYWQgYW5kIHRoZSBzdHJlYW0gaXMgbG9ja2VkLlxuICAgKi9cblxuICByZXF1ZXN0SW5pdC5oZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzXG4gIGNvbnN0IGZpbmFsUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgUmVxdWVzdChsb2NhdGlvblVybCwgcmVxdWVzdEluaXQpKVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmluYWxSZXNwb25zZSwgJ3JlZGlyZWN0ZWQnLCB7XG4gICAgdmFsdWU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KVxuXG4gIHJldHVybiBmaW5hbFJlc3BvbnNlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9ibG9iL2E2ZGFjMzE0OWM1MDViNThkMmU2ZDA2OGI5N2Y0ZGM5OTNkYTU1ZjAvbGliL3dlYi9mZXRjaC91dGlsLmpzI0w3NjFcbiAqL1xuZnVuY3Rpb24gc2FtZU9yaWdpbihsZWZ0OiBVUkwsIHJpZ2h0OiBVUkwpOiBib29sZWFuIHtcbiAgaWYgKGxlZnQub3JpZ2luID09PSByaWdodC5vcmlnaW4gJiYgbGVmdC5vcmlnaW4gPT09ICdudWxsJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoXG4gICAgbGVmdC5wcm90b2NvbCA9PT0gcmlnaHQucHJvdG9jb2wgJiZcbiAgICBsZWZ0Lmhvc3RuYW1lID09PSByaWdodC5ob3N0bmFtZSAmJlxuICAgIGxlZnQucG9ydCA9PT0gcmlnaHQucG9ydFxuICApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiZXhwb3J0IGNsYXNzIEJyb3RsaURlY29tcHJlc3Npb25TdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm1TdHJlYW0ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW0ludGVyY2VwdG9yc106IEJyb3RsaSBkZWNvbXByZXNzaW9uIG9mIHJlc3BvbnNlIHN0cmVhbXMgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlcidcbiAgICApXG5cbiAgICBzdXBlcih7XG4gICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgc3RyZWFtIGFzIHBhc3N0aHJvdWdoLCBpdCBkb2VzIG5vdGhpbmcuXG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuaylcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxufVxuIiwgIi8vIEltcG9ydCBmcm9tIGFuIGludGVybmFsIGFsaWFzIHRoYXQgcmVzb2x2ZXMgdG8gZGlmZmVyZW50IG1vZHVsZXNcbi8vIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQuIFRoaXMgd2F5LCB3ZSBjYW4ga2VlcCB0aGUgZmV0Y2ggaW50ZXJjZXB0b3Jcbi8vIGludGFjdCB3aGlsZSB1c2luZyBkaWZmZXJlbnQgc3RyYXRlZ2llcyBmb3IgQnJvdGxpIGRlY29tcHJlc3Npb24uXG5pbXBvcnQgeyBCcm90bGlEZWNvbXByZXNzaW9uU3RyZWFtIH0gZnJvbSAnaW50ZXJuYWw6YnJvdGxpLWRlY29tcHJlc3MnXG5cbmNsYXNzIFBpcGVsaW5lU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtU3RyZWFtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNmb3JtU3RyZWFtczogQXJyYXk8VHJhbnNmb3JtU3RyZWFtPixcbiAgICAuLi5zdHJhdGVnaWVzOiBBcnJheTxRdWV1aW5nU3RyYXRlZ3k+XG4gICkge1xuICAgIHN1cGVyKHt9LCAuLi5zdHJhdGVnaWVzKVxuXG4gICAgY29uc3QgcmVhZGFibGUgPSBbc3VwZXIucmVhZGFibGUgYXMgYW55LCAuLi50cmFuc2Zvcm1TdHJlYW1zXS5yZWR1Y2UoXG4gICAgICAocmVhZGFibGUsIHRyYW5zZm9ybSkgPT4gcmVhZGFibGUucGlwZVRocm91Z2godHJhbnNmb3JtKVxuICAgIClcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVhZGFibGUnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiByZWFkYWJsZVxuICAgICAgfSxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbnRlbnRFbmNvZGluZyhjb250ZW50RW5jb2Rpbmc6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICByZXR1cm4gY29udGVudEVuY29kaW5nXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKGNvZGluZykgPT4gY29kaW5nLnRyaW0oKSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVjb21wcmVzc2lvblN0cmVhbShcbiAgY29udGVudEVuY29kaW5nOiBzdHJpbmdcbik6IFRyYW5zZm9ybVN0cmVhbSB8IG51bGwge1xuICBpZiAoY29udGVudEVuY29kaW5nID09PSAnJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBjb2RpbmdzID0gcGFyc2VDb250ZW50RW5jb2RpbmcoY29udGVudEVuY29kaW5nKVxuXG4gIGlmIChjb2RpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lcnMgPSBjb2RpbmdzLnJlZHVjZVJpZ2h0PEFycmF5PFRyYW5zZm9ybVN0cmVhbT4+KFxuICAgICh0cmFuc2Zvcm1lcnMsIGNvZGluZykgPT4ge1xuICAgICAgaWYgKGNvZGluZyA9PT0gJ2d6aXAnIHx8IGNvZGluZyA9PT0gJ3gtZ3ppcCcpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVycy5jb25jYXQobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2d6aXAnKSlcbiAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnZGVmbGF0ZScpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVycy5jb25jYXQobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2RlZmxhdGUnKSlcbiAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcnMuY29uY2F0KG5ldyBCcm90bGlEZWNvbXByZXNzaW9uU3RyZWFtKCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2Zvcm1lcnMubGVuZ3RoID0gMFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNmb3JtZXJzXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgcmV0dXJuIG5ldyBQaXBlbGluZVN0cmVhbSh0cmFuc2Zvcm1lcnMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXByZXNzUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZVxuKTogUmVhZGFibGVTdHJlYW08YW55PiB8IG51bGwge1xuICBpZiAocmVzcG9uc2UuYm9keSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBkZWNvbXByZXNzaW9uU3RyZWFtID0gY3JlYXRlRGVjb21wcmVzc2lvblN0cmVhbShcbiAgICByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1lbmNvZGluZycpIHx8ICcnXG4gIClcblxuICBpZiAoIWRlY29tcHJlc3Npb25TdHJlYW0pIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gVXNlIGBwaXBlVG9gIGFuZCByZXR1cm4gdGhlIGRlY29tcHJlc3Npb24gc3RyZWFtJ3MgcmVhZGFibGVcbiAgLy8gaW5zdGVhZCBvZiBgcGlwZVRocm91Z2hgIGJlY2F1c2UgdGhhdCB3aWxsIGxvY2sgdGhlIG9yaWdpbmFsXG4gIC8vIHJlc3BvbnNlIHN0cmVhbSwgbWFraW5nIGl0IHVudXNhYmxlIGFzIHRoZSBpbnB1dCB0byBSZXNwb25zZS5cbiAgcmVzcG9uc2UuYm9keS5waXBlVG8oZGVjb21wcmVzc2lvblN0cmVhbS53cml0YWJsZSlcbiAgcmV0dXJuIGRlY29tcHJlc3Npb25TdHJlYW0ucmVhZGFibGVcbn1cbiIsICJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gJ3N0cmljdC1ldmVudC1lbWl0dGVyJ1xuaW1wb3J0IHsgSHR0cFJlcXVlc3RFdmVudE1hcCwgSVNfUEFUQ0hFRF9NT0RVTEUgfSBmcm9tICcuLi8uLi9nbG9zc2FyeSdcbmltcG9ydCB7IEludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vSW50ZXJjZXB0b3InXG5pbXBvcnQgeyBjcmVhdGVYTUxIdHRwUmVxdWVzdFByb3h5IH0gZnJvbSAnLi9YTUxIdHRwUmVxdWVzdFByb3h5J1xuaW1wb3J0IHsgaGFzQ29uZmlndXJhYmxlR2xvYmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGFzQ29uZmlndXJhYmxlR2xvYmFsJ1xuXG5leHBvcnQgdHlwZSBYTUxIdHRwUmVxdWVzdEVtaXR0ZXIgPSBFbWl0dGVyPEh0dHBSZXF1ZXN0RXZlbnRNYXA+XG5cbmV4cG9ydCBjbGFzcyBYTUxIdHRwUmVxdWVzdEludGVyY2VwdG9yIGV4dGVuZHMgSW50ZXJjZXB0b3I8SHR0cFJlcXVlc3RFdmVudE1hcD4ge1xuICBzdGF0aWMgaW50ZXJjZXB0b3JTeW1ib2wgPSBTeW1ib2woJ3hocicpXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoWE1MSHR0cFJlcXVlc3RJbnRlcmNlcHRvci5pbnRlcmNlcHRvclN5bWJvbClcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0Vudmlyb25tZW50KCkge1xuICAgIHJldHVybiBoYXNDb25maWd1cmFibGVHbG9iYWwoJ1hNTEh0dHBSZXF1ZXN0JylcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cCgpIHtcbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5leHRlbmQoJ3NldHVwJylcblxuICAgIGxvZ2dlci5pbmZvKCdwYXRjaGluZyBcIlhNTEh0dHBSZXF1ZXN0XCIgbW9kdWxlLi4uJylcblxuICAgIGNvbnN0IFB1cmVYTUxIdHRwUmVxdWVzdCA9IGdsb2JhbFRoaXMuWE1MSHR0cFJlcXVlc3RcblxuICAgIGludmFyaWFudChcbiAgICAgICEoUHVyZVhNTEh0dHBSZXF1ZXN0IGFzIGFueSlbSVNfUEFUQ0hFRF9NT0RVTEVdLFxuICAgICAgJ0ZhaWxlZCB0byBwYXRjaCB0aGUgXCJYTUxIdHRwUmVxdWVzdFwiIG1vZHVsZTogYWxyZWFkeSBwYXRjaGVkLidcbiAgICApXG5cbiAgICBnbG9iYWxUaGlzLlhNTEh0dHBSZXF1ZXN0ID0gY3JlYXRlWE1MSHR0cFJlcXVlc3RQcm94eSh7XG4gICAgICBlbWl0dGVyOiB0aGlzLmVtaXR0ZXIsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgICduYXRpdmUgXCJYTUxIdHRwUmVxdWVzdFwiIG1vZHVsZSBwYXRjaGVkIScsXG4gICAgICBnbG9iYWxUaGlzLlhNTEh0dHBSZXF1ZXN0Lm5hbWVcbiAgICApXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcy5YTUxIdHRwUmVxdWVzdCwgSVNfUEFUQ0hFRF9NT0RVTEUsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goKCkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuWE1MSHR0cFJlcXVlc3QsIElTX1BBVENIRURfTU9EVUxFLCB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB9KVxuXG4gICAgICBnbG9iYWxUaGlzLlhNTEh0dHBSZXF1ZXN0ID0gUHVyZVhNTEh0dHBSZXF1ZXN0XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ25hdGl2ZSBcIlhNTEh0dHBSZXF1ZXN0XCIgbW9kdWxlIHJlc3RvcmVkIScsXG4gICAgICAgIGdsb2JhbFRoaXMuWE1MSHR0cFJlcXVlc3QubmFtZVxuICAgICAgKVxuICAgIH0pXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHsgaXNOb2RlUHJvY2VzcyB9IGZyb20gJ2lzLW5vZGUtcHJvY2VzcydcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnQG9wZW4tZHJhZnQvbG9nZ2VyJ1xuaW1wb3J0IHsgY29uY2F0QXJyYXlCdWZmZXIgfSBmcm9tICcuL3V0aWxzL2NvbmNhdEFycmF5QnVmZmVyJ1xuaW1wb3J0IHsgY3JlYXRlRXZlbnQgfSBmcm9tICcuL3V0aWxzL2NyZWF0ZUV2ZW50J1xuaW1wb3J0IHtcbiAgZGVjb2RlQnVmZmVyLFxuICBlbmNvZGVCdWZmZXIsXG4gIHRvQXJyYXlCdWZmZXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL2J1ZmZlclV0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlUHJveHkgfSBmcm9tICcuLi8uLi91dGlscy9jcmVhdGVQcm94eSdcbmltcG9ydCB7IGlzRG9tUGFyc2VyU3VwcG9ydGVkVHlwZSB9IGZyb20gJy4vdXRpbHMvaXNEb21QYXJzZXJTdXBwb3J0ZWRUeXBlJ1xuaW1wb3J0IHsgcGFyc2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGFyc2VKc29uJ1xuaW1wb3J0IHsgY3JlYXRlUmVzcG9uc2UgfSBmcm9tICcuL3V0aWxzL2NyZWF0ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgSU5URVJOQUxfUkVRVUVTVF9JRF9IRUFERVJfTkFNRSB9IGZyb20gJy4uLy4uL0ludGVyY2VwdG9yJ1xuaW1wb3J0IHsgY3JlYXRlUmVxdWVzdElkIH0gZnJvbSAnLi4vLi4vY3JlYXRlUmVxdWVzdElkJ1xuaW1wb3J0IHsgZ2V0Qm9keUJ5dGVMZW5ndGggfSBmcm9tICcuL3V0aWxzL2dldEJvZHlCeXRlTGVuZ3RoJ1xuaW1wb3J0IHsgc2V0UmF3UmVxdWVzdCB9IGZyb20gJy4uLy4uL2dldFJhd1JlcXVlc3QnXG5cbmNvbnN0IGtJc1JlcXVlc3RIYW5kbGVkID0gU3ltYm9sKCdrSXNSZXF1ZXN0SGFuZGxlZCcpXG5jb25zdCBJU19OT0RFID0gaXNOb2RlUHJvY2VzcygpXG5jb25zdCBrRmV0Y2hSZXF1ZXN0ID0gU3ltYm9sKCdrRmV0Y2hSZXF1ZXN0JylcblxuLyoqXG4gKiBBbiBgWE1MSHR0cFJlcXVlc3RgIGluc3RhbmNlIGNvbnRyb2xsZXIgdGhhdCBhbGxvd3MgdXNcbiAqIHRvIGhhbmRsZSBhbnkgZ2l2ZW4gcmVxdWVzdCBpbnN0YW5jZSAoZS5nLiByZXNwb25kaW5nIHRvIGl0KS5cbiAqL1xuZXhwb3J0IGNsYXNzIFhNTEh0dHBSZXF1ZXN0Q29udHJvbGxlciB7XG4gIHB1YmxpYyByZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdFxuICBwdWJsaWMgcmVxdWVzdElkOiBzdHJpbmdcbiAgcHVibGljIG9uUmVxdWVzdD86IChcbiAgICB0aGlzOiBYTUxIdHRwUmVxdWVzdENvbnRyb2xsZXIsXG4gICAgYXJnczoge1xuICAgICAgcmVxdWVzdDogUmVxdWVzdFxuICAgICAgcmVxdWVzdElkOiBzdHJpbmdcbiAgICB9XG4gICkgPT4gUHJvbWlzZTx2b2lkPlxuICBwdWJsaWMgb25SZXNwb25zZT86IChcbiAgICB0aGlzOiBYTUxIdHRwUmVxdWVzdENvbnRyb2xsZXIsXG4gICAgYXJnczoge1xuICAgICAgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICBpc01vY2tlZFJlc3BvbnNlOiBib29sZWFuXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgICByZXF1ZXN0SWQ6IHN0cmluZ1xuICAgIH1cbiAgKSA9PiB2b2lkO1xuXG4gIFtrSXNSZXF1ZXN0SGFuZGxlZF06IGJvb2xlYW47XG4gIFtrRmV0Y2hSZXF1ZXN0XT86IFJlcXVlc3RcbiAgcHJpdmF0ZSBtZXRob2Q6IHN0cmluZyA9ICdHRVQnXG4gIHByaXZhdGUgdXJsOiBVUkwgPSBudWxsIGFzIGFueVxuICBwcml2YXRlIHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzXG4gIHByaXZhdGUgcmVzcG9uc2VCdWZmZXI6IFVpbnQ4QXJyYXlcbiAgcHJpdmF0ZSBldmVudHM6IE1hcDxrZXlvZiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0RXZlbnRNYXAsIEFycmF5PEZ1bmN0aW9uPj5cbiAgcHJpdmF0ZSB1cGxvYWRFdmVudHM6IE1hcDxcbiAgICBrZXlvZiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0RXZlbnRNYXAsXG4gICAgQXJyYXk8RnVuY3Rpb24+XG4gID5cblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBpbml0aWFsUmVxdWVzdDogWE1MSHR0cFJlcXVlc3QsXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyXG4gICkge1xuICAgIHRoaXNba0lzUmVxdWVzdEhhbmRsZWRdID0gZmFsc2VcblxuICAgIHRoaXMuZXZlbnRzID0gbmV3IE1hcCgpXG4gICAgdGhpcy51cGxvYWRFdmVudHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLnJlcXVlc3RJZCA9IGNyZWF0ZVJlcXVlc3RJZCgpXG4gICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICB0aGlzLnJlc3BvbnNlQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoKVxuXG4gICAgdGhpcy5yZXF1ZXN0ID0gY3JlYXRlUHJveHkoaW5pdGlhbFJlcXVlc3QsIHtcbiAgICAgIHNldFByb3BlcnR5OiAoW3Byb3BlcnR5TmFtZSwgbmV4dFZhbHVlXSwgaW52b2tlKSA9PiB7XG4gICAgICAgIHN3aXRjaCAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgY2FzZSAnb250aW1lb3V0Jzoge1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gcHJvcGVydHlOYW1lLnNsaWNlKFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApIGFzIGtleW9mIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRFdmVudE1hcFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBub3RlIFByb3h5IGNhbGxiYWNrcyB0byBldmVudCBsaXN0ZW5lcnMgYmVjYXVzZSBKU0RPTSBoYXMgdHJvdWJsZVxuICAgICAgICAgICAgICogdHJhbnNsYXRpbmcgdGhlc2UgcHJvcGVydGllcyB0byBjYWxsYmFja3MuIEl0IHNlZW1lZCB0byBiZSBvcGVyYXRpbmdcbiAgICAgICAgICAgICAqIG9uIGV2ZW50cyBleGNsdXNpdmVseS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBuZXh0VmFsdWUgYXMgYW55KVxuXG4gICAgICAgICAgICByZXR1cm4gaW52b2tlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtZXRob2RDYWxsOiAoW21ldGhvZE5hbWUsIGFyZ3NdLCBpbnZva2UpID0+IHtcbiAgICAgICAgc3dpdGNoIChtZXRob2ROYW1lKSB7XG4gICAgICAgICAgY2FzZSAnb3Blbic6IHtcbiAgICAgICAgICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSBhcmdzIGFzIFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRoaXMubWV0aG9kID0gJ0dFVCdcbiAgICAgICAgICAgICAgdGhpcy51cmwgPSB0b0Fic29sdXRlVXJsKG1ldGhvZClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kXG4gICAgICAgICAgICAgIHRoaXMudXJsID0gdG9BYnNvbHV0ZVVybCh1cmwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gdGhpcy5sb2dnZXIuZXh0ZW5kKGAke3RoaXMubWV0aG9kfSAke3RoaXMudXJsLmhyZWZ9YClcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ29wZW4nLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwuaHJlZilcblxuICAgICAgICAgICAgcmV0dXJuIGludm9rZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnYWRkRXZlbnRMaXN0ZW5lcic6IHtcbiAgICAgICAgICAgIGNvbnN0IFtldmVudE5hbWUsIGxpc3RlbmVyXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgICBrZXlvZiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0RXZlbnRNYXAsXG4gICAgICAgICAgICAgIEZ1bmN0aW9uLFxuICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2FkZEV2ZW50TGlzdGVuZXInLCBldmVudE5hbWUsIGxpc3RlbmVyKVxuXG4gICAgICAgICAgICByZXR1cm4gaW52b2tlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdzZXRSZXF1ZXN0SGVhZGVyJzoge1xuICAgICAgICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycy5zZXQobmFtZSwgdmFsdWUpXG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3NldFJlcXVlc3RIZWFkZXInLCBuYW1lLCB2YWx1ZSlcblxuICAgICAgICAgICAgcmV0dXJuIGludm9rZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnc2VuZCc6IHtcbiAgICAgICAgICAgIGNvbnN0IFtib2R5XSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgICBib2R5PzogWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCB8IERvY3VtZW50IHwgbnVsbCxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc3BvbnNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIEZldGNoIEFQSSBSZXNwb25zZSByZXByZXNlbnRhdGlvbiBvZiB3aGljaGV2ZXJcbiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0aGlzIFhNTEh0dHBSZXF1ZXN0IHJlY2VpdmVkLiBOb3RlIHRob3NlIG1heVxuICAgICAgICAgICAgICAgIC8vIGJlIGVpdGhlciBhIG1vY2tlZCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUmVzcG9uc2UgPSBjcmVhdGVSZXNwb25zZShcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGByZXNwb25zZWAgcHJvcGVydHkgaXMgdGhlIHJpZ2h0IHdheSB0byByZWFkXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgYW1iaWd1b3VzIHJlc3BvbnNlIGJvZHksIGFzIHRoZSByZXF1ZXN0J3MgXCJyZXNwb25zZVR5cGVcIiBtYXkgZGlmZmVyLlxuICAgICAgICAgICAgICAgICAgICogQHNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1yZXNwb25zZS1hdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LnJlc3BvbnNlXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjb25zdW1lciBhYm91dCB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgdGhpcy5vblJlc3BvbnNlLmNhbGwodGhpcywge1xuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGZldGNoUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICBpc01vY2tlZFJlc3BvbnNlOiB0aGlzW2tJc1JlcXVlc3RIYW5kbGVkXSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IGZldGNoUmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5yZXF1ZXN0SWQhLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID1cbiAgICAgICAgICAgICAgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnID8gZW5jb2RlQnVmZmVyKGJvZHkpIDogYm9keVxuXG4gICAgICAgICAgICAvLyBEZWxlZ2F0ZSByZXF1ZXN0IGhhbmRsaW5nIHRvIHRoZSBjb25zdW1lci5cbiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHRoaXMudG9GZXRjaEFwaVJlcXVlc3QocmVxdWVzdEJvZHkpXG4gICAgICAgICAgICB0aGlzW2tGZXRjaFJlcXVlc3RdID0gZmV0Y2hSZXF1ZXN0LmNsb25lKClcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAbm90ZSBTdGFydCByZXF1ZXN0IGhhbmRsaW5nIG9uIHRoZSBuZXh0IHRpY2sgc28gdGhhdCB0aGUgdXNlclxuICAgICAgICAgICAgICogY291bGQgYWRkIGV2ZW50IGxpc3RlbmVycyBmb3IgXCJsb2FkZW5kXCIgYmVmb3JlIHRoZSBpbnRlcmNlcHRvciBmaXJlcyBpdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBvbmNlUmVxdWVzdFNldHRsZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMub25SZXF1ZXN0Py5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IGZldGNoUmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5yZXF1ZXN0SWQhLFxuICAgICAgICAgICAgICAgIH0pIHx8IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICAgICAgICAgICAgb25jZVJlcXVlc3RTZXR0bGVkLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdW1lciBkaWRuJ3QgaGFuZGxlIHRoZSByZXF1ZXN0IChjYWxsZWQgYC5yZXNwb25kV2l0aCgpYCkgcGVyZm9ybSBpdCBhcy1pcy5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXNba0lzUmVxdWVzdEhhbmRsZWRdKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAncmVxdWVzdCBjYWxsYmFjayBzZXR0bGVkIGJ1dCByZXF1ZXN0IGhhcyBub3QgYmVlbiBoYW5kbGVkIChyZWFkeXN0YXRlICVkKSwgcGVyZm9ybWluZyBhcy1pcy4uLicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdC5yZWFkeVN0YXRlXG4gICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogQG5vdGUgU2V0IHRoZSBpbnRlcmNlcHRlZCByZXF1ZXN0IElEIG9uIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGluIE5vZGUuanNcbiAgICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgaWYgaXQgdHJpZ2dlcnMgYW55IG90aGVyIGludGVyY2VwdG9ycywgdGhleSBkb24ndCBhdHRlbXB0XG4gICAgICAgICAgICAgICAgICAgKiB0byBwcm9jZXNzIGl0IG9uY2UgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRm9yIGluc3RhbmNlLCBYTUxIdHRwUmVxdWVzdCBpcyBvZnRlbiBpbXBsZW1lbnRlZCB2aWEgXCJodHRwLkNsaWVudFJlcXVlc3RcIlxuICAgICAgICAgICAgICAgICAgICogYW5kIHdlIGRvbid0IHdhbnQgZm9yIGJvdGggWEhSIGFuZCBDbGllbnRSZXF1ZXN0IGludGVyY2VwdG9ycyB0b1xuICAgICAgICAgICAgICAgICAgICogaGFuZGxlIHRoZSBzYW1lIHJlcXVlc3QgYXQgdGhlIHNhbWUgdGltZSAoZS5nLiBlbWl0IHRoZSBcInJlc3BvbnNlXCIgZXZlbnQgdHdpY2UpLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihcbiAgICAgICAgICAgICAgICAgICAgICBJTlRFUk5BTF9SRVFVRVNUX0lEX0hFQURFUl9OQU1FLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdElkIVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2UoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pXG5cbiAgICAvKipcbiAgICAgKiBQcm94eSB0aGUgYC51cGxvYWRgIHByb3BlcnR5IHRvIGdhdGhlciB0aGUgZXZlbnQgbGlzdGVuZXJzL2NhbGxiYWNrcy5cbiAgICAgKi9cbiAgICBkZWZpbmUoXG4gICAgICB0aGlzLnJlcXVlc3QsXG4gICAgICAndXBsb2FkJyxcbiAgICAgIGNyZWF0ZVByb3h5KHRoaXMucmVxdWVzdC51cGxvYWQsIHtcbiAgICAgICAgc2V0UHJvcGVydHk6IChbcHJvcGVydHlOYW1lLCBuZXh0VmFsdWVdLCBpbnZva2UpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnb25sb2Fkc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnb25wcm9ncmVzcyc6XG4gICAgICAgICAgICBjYXNlICdvbmFib2FydCc6XG4gICAgICAgICAgICBjYXNlICdvbmVycm9yJzpcbiAgICAgICAgICAgIGNhc2UgJ29ubG9hZCc6XG4gICAgICAgICAgICBjYXNlICdvbnRpbWVvdXQnOlxuICAgICAgICAgICAgY2FzZSAnb25sb2FkZW5kJzoge1xuICAgICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wZXJ0eU5hbWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICApIGFzIGtleW9mIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRFdmVudE1hcFxuXG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJVcGxvYWRFdmVudChldmVudE5hbWUsIG5leHRWYWx1ZSBhcyBGdW5jdGlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKClcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kQ2FsbDogKFttZXRob2ROYW1lLCBhcmdzXSwgaW52b2tlKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdhZGRFdmVudExpc3RlbmVyJzoge1xuICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBsaXN0ZW5lcl0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgICAgICBrZXlvZiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0RXZlbnRNYXAsXG4gICAgICAgICAgICAgICAgRnVuY3Rpb24sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlclVwbG9hZEV2ZW50KGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3VwbG9hZC5hZGRFdmVudExpc3RlbmVyJywgZXZlbnROYW1lLCBsaXN0ZW5lcilcblxuICAgICAgICAgICAgICByZXR1cm4gaW52b2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJFdmVudChcbiAgICBldmVudE5hbWU6IGtleW9mIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRFdmVudE1hcCxcbiAgICBsaXN0ZW5lcjogRnVuY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcHJldkV2ZW50cyA9IHRoaXMuZXZlbnRzLmdldChldmVudE5hbWUpIHx8IFtdXG4gICAgY29uc3QgbmV4dEV2ZW50cyA9IHByZXZFdmVudHMuY29uY2F0KGxpc3RlbmVyKVxuICAgIHRoaXMuZXZlbnRzLnNldChldmVudE5hbWUsIG5leHRFdmVudHMpXG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZWdpc3RlcmVkIGV2ZW50IFwiJXNcIicsIGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyVXBsb2FkRXZlbnQoXG4gICAgZXZlbnROYW1lOiBrZXlvZiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0RXZlbnRNYXAsXG4gICAgbGlzdGVuZXI6IEZ1bmN0aW9uXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZFdmVudHMgPSB0aGlzLnVwbG9hZEV2ZW50cy5nZXQoZXZlbnROYW1lKSB8fCBbXVxuICAgIGNvbnN0IG5leHRFdmVudHMgPSBwcmV2RXZlbnRzLmNvbmNhdChsaXN0ZW5lcilcbiAgICB0aGlzLnVwbG9hZEV2ZW50cy5zZXQoZXZlbnROYW1lLCBuZXh0RXZlbnRzKVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygncmVnaXN0ZXJlZCB1cGxvYWQgZXZlbnQgXCIlc1wiJywgZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kcyB0byB0aGUgY3VycmVudCByZXF1ZXN0IHdpdGggdGhlIGdpdmVuXG4gICAqIEZldGNoIEFQSSBgUmVzcG9uc2VgIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc3BvbmRXaXRoKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8qKlxuICAgICAqIEBub3RlIFNpbmNlIGBYTUxIdHRwUmVxdWVzdENvbnRyb2xsZXJgIGRlbGVnYXRlcyB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlc3BvbnNlc1xuICAgICAqIHRvIHRoZSBcImxvYWRcIiBldmVudCBsaXN0ZW5lciB0aGF0IGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgbW9ja2VkIGFuZCBvcmlnaW5hbFxuICAgICAqIHJlc3BvbnNlcywgbWFyayB0aGUgcmVxdWVzdCB0aGF0IGhhZCBhIG1vY2tlZCByZXNwb25zZSB3aXRoIGEgY29ycmVzcG9uZGluZyBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBNYXJrIHRoaXMgcmVxdWVzdCBhcyBoYXZpbmcgYSBtb2NrZWQgcmVzcG9uc2UgaW1tZWRpYXRlbHkgc2luY2VcbiAgICAgKiBjYWxjdWxhdGluZyByZXF1ZXN0L3Jlc3BvbnNlIHRvdGFsIGJvZHkgbGVuZ3RoIGlzIGFzeW5jaHJvbm91cy5cbiAgICAgKi9cbiAgICB0aGlzW2tJc1JlcXVlc3RIYW5kbGVkXSA9IHRydWVcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIHJlcXVlc3QgdXBsb2FkIGV2ZW50cyBmb3IgcmVxdWVzdHMgd2l0aCBhIGJvZHkuXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvaW50ZXJjZXB0b3JzL2lzc3Vlcy81NzNcbiAgICAgKi9cbiAgICBpZiAodGhpc1trRmV0Y2hSZXF1ZXN0XSkge1xuICAgICAgY29uc3QgdG90YWxSZXF1ZXN0Qm9keUxlbmd0aCA9IGF3YWl0IGdldEJvZHlCeXRlTGVuZ3RoKFxuICAgICAgICB0aGlzW2tGZXRjaFJlcXVlc3RdXG4gICAgICApXG5cbiAgICAgIHRoaXMudHJpZ2dlcignbG9hZHN0YXJ0JywgdGhpcy5yZXF1ZXN0LnVwbG9hZCwge1xuICAgICAgICBsb2FkZWQ6IDAsXG4gICAgICAgIHRvdGFsOiB0b3RhbFJlcXVlc3RCb2R5TGVuZ3RoLFxuICAgICAgfSlcbiAgICAgIHRoaXMudHJpZ2dlcigncHJvZ3Jlc3MnLCB0aGlzLnJlcXVlc3QudXBsb2FkLCB7XG4gICAgICAgIGxvYWRlZDogdG90YWxSZXF1ZXN0Qm9keUxlbmd0aCxcbiAgICAgICAgdG90YWw6IHRvdGFsUmVxdWVzdEJvZHlMZW5ndGgsXG4gICAgICB9KVxuICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywgdGhpcy5yZXF1ZXN0LnVwbG9hZCwge1xuICAgICAgICBsb2FkZWQ6IHRvdGFsUmVxdWVzdEJvZHlMZW5ndGgsXG4gICAgICAgIHRvdGFsOiB0b3RhbFJlcXVlc3RCb2R5TGVuZ3RoLFxuICAgICAgfSlcblxuICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkZW5kJywgdGhpcy5yZXF1ZXN0LnVwbG9hZCwge1xuICAgICAgICBsb2FkZWQ6IHRvdGFsUmVxdWVzdEJvZHlMZW5ndGgsXG4gICAgICAgIHRvdGFsOiB0b3RhbFJlcXVlc3RCb2R5TGVuZ3RoLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgJ3Jlc3BvbmRpbmcgd2l0aCBhIG1vY2tlZCByZXNwb25zZTogJWQgJXMnLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgIClcblxuICAgIGRlZmluZSh0aGlzLnJlcXVlc3QsICdzdGF0dXMnLCByZXNwb25zZS5zdGF0dXMpXG4gICAgZGVmaW5lKHRoaXMucmVxdWVzdCwgJ3N0YXR1c1RleHQnLCByZXNwb25zZS5zdGF0dXNUZXh0KVxuICAgIGRlZmluZSh0aGlzLnJlcXVlc3QsICdyZXNwb25zZVVSTCcsIHRoaXMudXJsLmhyZWYpXG5cbiAgICB0aGlzLnJlcXVlc3QuZ2V0UmVzcG9uc2VIZWFkZXIgPSBuZXcgUHJveHkodGhpcy5yZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyLCB7XG4gICAgICBhcHBseTogKF8sIF9fLCBhcmdzOiBbbmFtZTogc3RyaW5nXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdnZXRSZXNwb25zZUhlYWRlcicsIGFyZ3NbMF0pXG5cbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdC5yZWFkeVN0YXRlIDwgdGhpcy5yZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdoZWFkZXJzIG5vdCByZWNlaXZlZCB5ZXQsIHJldHVybmluZyBudWxsJylcblxuICAgICAgICAgIC8vIEhlYWRlcnMgbm90IHJlY2VpdmVkIHlldCwgbm90aGluZyB0byByZXR1cm4uXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoYXJnc1swXSlcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAncmVzb2x2ZWQgcmVzcG9uc2UgaGVhZGVyIFwiJXNcIiB0bycsXG4gICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICBoZWFkZXJWYWx1ZVxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIGhlYWRlclZhbHVlXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICB0aGlzLnJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzID0gbmV3IFByb3h5KFxuICAgICAgdGhpcy5yZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHtcbiAgICAgICAgYXBwbHk6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdnZXRBbGxSZXNwb25zZUhlYWRlcnMnKVxuXG4gICAgICAgICAgaWYgKHRoaXMucmVxdWVzdC5yZWFkeVN0YXRlIDwgdGhpcy5yZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2hlYWRlcnMgbm90IHJlY2VpdmVkIHlldCwgcmV0dXJuaW5nIGVtcHR5IHN0cmluZycpXG5cbiAgICAgICAgICAgIC8vIEhlYWRlcnMgbm90IHJlY2VpdmVkIHlldCwgbm90aGluZyB0byByZXR1cm4uXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBoZWFkZXJzTGlzdCA9IEFycmF5LmZyb20ocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpXG4gICAgICAgICAgY29uc3QgYWxsSGVhZGVycyA9IGhlYWRlcnNMaXN0XG4gICAgICAgICAgICAubWFwKChbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBgJHtoZWFkZXJOYW1lfTogJHtoZWFkZXJWYWx1ZX1gXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJ1xcclxcbicpXG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZXNvbHZlZCBhbGwgcmVzcG9uc2UgaGVhZGVycyB0bycsIGFsbEhlYWRlcnMpXG5cbiAgICAgICAgICByZXR1cm4gYWxsSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgfVxuICAgIClcblxuICAgIC8vIFVwZGF0ZSB0aGUgcmVzcG9uc2UgZ2V0dGVycyB0byByZXNvbHZlIGFnYWluc3QgdGhlIG1vY2tlZCByZXNwb25zZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnJlcXVlc3QsIHtcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGdldDogKCkgPT4gdGhpcy5yZXNwb25zZSxcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVRleHQ6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLnJlc3BvbnNlVGV4dCxcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVhNTDoge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBnZXQ6ICgpID0+IHRoaXMucmVzcG9uc2VYTUwsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBjb25zdCB0b3RhbFJlc3BvbnNlQm9keUxlbmd0aCA9IGF3YWl0IGdldEJvZHlCeXRlTGVuZ3RoKHJlc3BvbnNlLmNsb25lKCkpXG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdjYWxjdWxhdGVkIHJlc3BvbnNlIGJvZHkgbGVuZ3RoJywgdG90YWxSZXNwb25zZUJvZHlMZW5ndGgpXG5cbiAgICB0aGlzLnRyaWdnZXIoJ2xvYWRzdGFydCcsIHRoaXMucmVxdWVzdCwge1xuICAgICAgbG9hZGVkOiAwLFxuICAgICAgdG90YWw6IHRvdGFsUmVzcG9uc2VCb2R5TGVuZ3RoLFxuICAgIH0pXG5cbiAgICB0aGlzLnNldFJlYWR5U3RhdGUodGhpcy5yZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQpXG4gICAgdGhpcy5zZXRSZWFkeVN0YXRlKHRoaXMucmVxdWVzdC5MT0FESU5HKVxuXG4gICAgY29uc3QgZmluYWxpemVSZXNwb25zZSA9ICgpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2ZpbmFsaXppbmcgdGhlIG1vY2tlZCByZXNwb25zZS4uLicpXG5cbiAgICAgIHRoaXMuc2V0UmVhZHlTdGF0ZSh0aGlzLnJlcXVlc3QuRE9ORSlcblxuICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywgdGhpcy5yZXF1ZXN0LCB7XG4gICAgICAgIGxvYWRlZDogdGhpcy5yZXNwb25zZUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgICB0b3RhbDogdG90YWxSZXNwb25zZUJvZHlMZW5ndGgsXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnRyaWdnZXIoJ2xvYWRlbmQnLCB0aGlzLnJlcXVlc3QsIHtcbiAgICAgICAgbG9hZGVkOiB0aGlzLnJlc3BvbnNlQnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgIHRvdGFsOiB0b3RhbFJlc3BvbnNlQm9keUxlbmd0aCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmJvZHkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ21vY2tlZCByZXNwb25zZSBoYXMgYm9keSwgc3RyZWFtaW5nLi4uJylcblxuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKVxuXG4gICAgICBjb25zdCByZWFkTmV4dFJlc3BvbnNlQm9keUNodW5rID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG5cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZXNwb25zZSBib2R5IHN0cmVhbSBkb25lIScpXG4gICAgICAgICAgZmluYWxpemVSZXNwb25zZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZWFkIHJlc3BvbnNlIGJvZHkgY2h1bms6JywgdmFsdWUpXG4gICAgICAgICAgdGhpcy5yZXNwb25zZUJ1ZmZlciA9IGNvbmNhdEFycmF5QnVmZmVyKHRoaXMucmVzcG9uc2VCdWZmZXIsIHZhbHVlKVxuXG4gICAgICAgICAgdGhpcy50cmlnZ2VyKCdwcm9ncmVzcycsIHRoaXMucmVxdWVzdCwge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLnJlc3BvbnNlQnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB0b3RhbDogdG90YWxSZXNwb25zZUJvZHlMZW5ndGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWROZXh0UmVzcG9uc2VCb2R5Q2h1bmsoKVxuICAgICAgfVxuXG4gICAgICByZWFkTmV4dFJlc3BvbnNlQm9keUNodW5rKClcbiAgICB9IGVsc2Uge1xuICAgICAgZmluYWxpemVSZXNwb25zZSgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNwb25zZUJ1ZmZlclRvVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBkZWNvZGVCdWZmZXIodGhpcy5yZXNwb25zZUJ1ZmZlcilcbiAgfVxuXG4gIGdldCByZXNwb25zZSgpOiB1bmtub3duIHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgJ2dldFJlc3BvbnNlIChyZXNwb25zZVR5cGU6ICVzKScsXG4gICAgICB0aGlzLnJlcXVlc3QucmVzcG9uc2VUeXBlXG4gICAgKVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5yZWFkeVN0YXRlICE9PSB0aGlzLnJlcXVlc3QuRE9ORSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMucmVxdWVzdC5yZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2pzb24nOiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSnNvbiA9IHBhcnNlSnNvbih0aGlzLnJlc3BvbnNlQnVmZmVyVG9UZXh0KCkpXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3Jlc29sdmVkIHJlc3BvbnNlIEpTT04nLCByZXNwb25zZUpzb24pXG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSnNvblxuICAgICAgfVxuXG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6IHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB0b0FycmF5QnVmZmVyKHRoaXMucmVzcG9uc2VCdWZmZXIpXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3Jlc29sdmVkIHJlc3BvbnNlIEFycmF5QnVmZmVyJywgYXJyYXlCdWZmZXIpXG5cbiAgICAgICAgcmV0dXJuIGFycmF5QnVmZmVyXG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2Jsb2InOiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID1cbiAgICAgICAgICB0aGlzLnJlcXVlc3QuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpIHx8ICd0ZXh0L3BsYWluJ1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPSBuZXcgQmxvYihbdGhpcy5yZXNwb25zZUJ1ZmZlclRvVGV4dCgpXSwge1xuICAgICAgICAgIHR5cGU6IG1pbWVUeXBlLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ3Jlc29sdmVkIHJlc3BvbnNlIEJsb2IgKG1pbWUgdHlwZTogJXMpJyxcbiAgICAgICAgICByZXNwb25zZUJsb2IsXG4gICAgICAgICAgbWltZVR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZUJsb2JcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSB0aGlzLnJlc3BvbnNlQnVmZmVyVG9UZXh0KClcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAncmVzb2x2aW5nIFwiJXNcIiByZXNwb25zZSB0eXBlIGFzIHRleHQnLFxuICAgICAgICAgIHRoaXMucmVxdWVzdC5yZXNwb25zZVR5cGUsXG4gICAgICAgICAgcmVzcG9uc2VUZXh0XG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VUZXh0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVGV4dCgpOiBzdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRocm93IHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIHJlc3BvbnNlIGJvZHkgYXMgdGV4dCB3aGVuIHRoZVxuICAgICAqIFwicmVzcG9uc2VUeXBlXCIgZG9lc24ndCBleHBlY3QgdGV4dC4gVGhpcyBqdXN0IHJlc3BlY3RzIHRoZSBzcGVjIGJldHRlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jdGhlLXJlc3BvbnNldGV4dC1hdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBpbnZhcmlhbnQoXG4gICAgICB0aGlzLnJlcXVlc3QucmVzcG9uc2VUeXBlID09PSAnJyB8fCB0aGlzLnJlcXVlc3QucmVzcG9uc2VUeXBlID09PSAndGV4dCcsXG4gICAgICAnSW52YWxpZFN0YXRlRXJyb3I6IFRoZSBvYmplY3QgaXMgaW4gaW52YWxpZCBzdGF0ZS4nXG4gICAgKVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5yZXF1ZXN0LnJlYWR5U3RhdGUgIT09IHRoaXMucmVxdWVzdC5MT0FESU5HICYmXG4gICAgICB0aGlzLnJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gdGhpcy5yZXF1ZXN0LkRPTkVcbiAgICApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IHRoaXMucmVzcG9uc2VCdWZmZXJUb1RleHQoKVxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ2dldFJlc3BvbnNlVGV4dDogXCIlc1wiJywgcmVzcG9uc2VUZXh0KVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlVGV4dFxuICB9XG5cbiAgZ2V0IHJlc3BvbnNlWE1MKCk6IERvY3VtZW50IHwgbnVsbCB7XG4gICAgaW52YXJpYW50KFxuICAgICAgdGhpcy5yZXF1ZXN0LnJlc3BvbnNlVHlwZSA9PT0gJycgfHxcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJlc3BvbnNlVHlwZSA9PT0gJ2RvY3VtZW50JyxcbiAgICAgICdJbnZhbGlkU3RhdGVFcnJvcjogVGhlIG9iamVjdCBpcyBpbiBpbnZhbGlkIHN0YXRlLidcbiAgICApXG5cbiAgICBpZiAodGhpcy5yZXF1ZXN0LnJlYWR5U3RhdGUgIT09IHRoaXMucmVxdWVzdC5ET05FKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5yZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKSB8fCAnJ1xuXG4gICAgaWYgKHR5cGVvZiBET01QYXJzZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdDYW5ub3QgcmV0cmlldmUgWE1MSHR0cFJlcXVlc3QgcmVzcG9uc2UgYm9keSBhcyBYTUw6IERPTVBhcnNlciBpcyBub3QgZGVmaW5lZC4gWW91IGFyZSBsaWtlbHkgdXNpbmcgYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgYnJvd3NlciBvciBkb2VzIG5vdCBwb2x5ZmlsbCBicm93c2VyIGdsb2JhbHMgY29ycmVjdGx5LidcbiAgICAgIClcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKGlzRG9tUGFyc2VyU3VwcG9ydGVkVHlwZShjb250ZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgICB0aGlzLnJlc3BvbnNlQnVmZmVyVG9UZXh0KCksXG4gICAgICAgIGNvbnRlbnRUeXBlXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHB1YmxpYyBlcnJvcldpdGgoZXJyb3I/OiBFcnJvcik6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIEBub3RlIE1hcmsgdGhpcyByZXF1ZXN0IGFzIGhhbmRsZWQgZXZlbiBpZiBpdCByZWNlaXZlZCBhIG1vY2sgZXJyb3IuXG4gICAgICogVGhpcyBwcmV2ZW50cyB0aGUgY29udHJvbGxlciBmcm9tIHRyeWluZyB0byBwZXJmb3JtIHRoaXMgcmVxdWVzdCBhcy1pcy5cbiAgICAgKi9cbiAgICB0aGlzW2tJc1JlcXVlc3RIYW5kbGVkXSA9IHRydWVcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZXNwb25kaW5nIHdpdGggYW4gZXJyb3InKVxuXG4gICAgdGhpcy5zZXRSZWFkeVN0YXRlKHRoaXMucmVxdWVzdC5ET05FKVxuICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB0aGlzLnJlcXVlc3QpXG4gICAgdGhpcy50cmlnZ2VyKCdsb2FkZW5kJywgdGhpcy5yZXF1ZXN0KVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb25zIHRoaXMgcmVxdWVzdCdzIGByZWFkeVN0YXRlYCB0byB0aGUgZ2l2ZW4gb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRSZWFkeVN0YXRlKG5leHRSZWFkeVN0YXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgJ3NldFJlYWR5U3RhdGU6ICVkIC0+ICVkJyxcbiAgICAgIHRoaXMucmVxdWVzdC5yZWFkeVN0YXRlLFxuICAgICAgbmV4dFJlYWR5U3RhdGVcbiAgICApXG5cbiAgICBpZiAodGhpcy5yZXF1ZXN0LnJlYWR5U3RhdGUgPT09IG5leHRSZWFkeVN0YXRlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdyZWFkeSBzdGF0ZSBpZGVudGljYWwsIHNraXBwaW5nIHRyYW5zaXRpb24uLi4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGVmaW5lKHRoaXMucmVxdWVzdCwgJ3JlYWR5U3RhdGUnLCBuZXh0UmVhZHlTdGF0ZSlcblxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ3NldCByZWFkeVN0YXRlIHRvOiAlZCcsIG5leHRSZWFkeVN0YXRlKVxuXG4gICAgaWYgKG5leHRSZWFkeVN0YXRlICE9PSB0aGlzLnJlcXVlc3QuVU5TRU5UKSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCd0cmlnZ2VyaW5nIFwicmVhZHlzdGF0ZWNoYW5nZVwiIGV2ZW50Li4uJylcblxuICAgICAgdGhpcy50cmlnZ2VyKCdyZWFkeXN0YXRlY2hhbmdlJywgdGhpcy5yZXF1ZXN0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBnaXZlbiBldmVudCBvbiB0aGUgYFhNTEh0dHBSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlcjxcbiAgICBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiAoWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldEV2ZW50TWFwICYge1xuICAgICAgcmVhZHlzdGF0ZWNoYW5nZTogUHJvZ3Jlc3NFdmVudDxYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0PlxuICAgIH0pLFxuICA+KFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIHRhcmdldDogWE1MSHR0cFJlcXVlc3QgfCBYTUxIdHRwUmVxdWVzdFVwbG9hZCxcbiAgICBvcHRpb25zPzogUHJvZ3Jlc3NFdmVudEluaXRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAodGFyZ2V0IGFzIFhNTEh0dHBSZXF1ZXN0KVtgb24ke2V2ZW50TmFtZX1gXVxuICAgIGNvbnN0IGV2ZW50ID0gY3JlYXRlRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpXG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKCd0cmlnZ2VyIFwiJXNcIicsIGV2ZW50TmFtZSwgb3B0aW9ucyB8fCAnJylcblxuICAgIC8vIEludm9rZSBkaXJlY3QgY2FsbGJhY2tzLlxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2ZvdW5kIGEgZGlyZWN0IFwiJXNcIiBjYWxsYmFjaywgY2FsbGluZy4uLicsIGV2ZW50TmFtZSlcbiAgICAgIGNhbGxiYWNrLmNhbGwodGFyZ2V0IGFzIFhNTEh0dHBSZXF1ZXN0LCBldmVudClcbiAgICB9XG5cbiAgICAvLyBJbnZva2UgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGNvbnN0IGV2ZW50cyA9XG4gICAgICB0YXJnZXQgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCA/IHRoaXMudXBsb2FkRXZlbnRzIDogdGhpcy5ldmVudHNcblxuICAgIGZvciAoY29uc3QgW3JlZ2lzdGVyZWRFdmVudE5hbWUsIGxpc3RlbmVyc10gb2YgZXZlbnRzKSB7XG4gICAgICBpZiAocmVnaXN0ZXJlZEV2ZW50TmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ2ZvdW5kICVkIGxpc3RlbmVyKHMpIGZvciBcIiVzXCIgZXZlbnQsIGNhbGxpbmcuLi4nLFxuICAgICAgICAgIGxpc3RlbmVycy5sZW5ndGgsXG4gICAgICAgICAgZXZlbnROYW1lXG4gICAgICAgIClcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyLmNhbGwodGFyZ2V0LCBldmVudCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoaXMgYFhNTEh0dHBSZXF1ZXN0YCBpbnN0YW5jZSBpbnRvIGEgRmV0Y2ggQVBJIGBSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgdG9GZXRjaEFwaVJlcXVlc3QoXG4gICAgYm9keTogWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCB8IERvY3VtZW50IHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBSZXF1ZXN0IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdjb252ZXJ0aW5nIHJlcXVlc3QgdG8gYSBGZXRjaCBBUEkgUmVxdWVzdC4uLicpXG5cbiAgICAvLyBJZiB0aGUgYERvY3VtZW50YCBpcyB1c2VkIGFzIHRoZSBib2R5IG9mIHRoaXMgWE1MSHR0cFJlcXVlc3QsXG4gICAgLy8gc2V0IGl0cyBpbm5lciB0ZXh0IGFzIHRoZSBGZXRjaCBBUEkgUmVxdWVzdCBib2R5LlxuICAgIGNvbnN0IHJlc29sdmVkQm9keSA9XG4gICAgICBib2R5IGluc3RhbmNlb2YgRG9jdW1lbnQgPyBib2R5LmRvY3VtZW50RWxlbWVudC5pbm5lclRleHQgOiBib2R5XG5cbiAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzLnVybC5ocmVmLCB7XG4gICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgaGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcbiAgICAgIC8qKlxuICAgICAgICogQHNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI2Nyb3NzLW9yaWdpbi1jcmVkZW50aWFsc1xuICAgICAgICovXG4gICAgICBjcmVkZW50aWFsczogdGhpcy5yZXF1ZXN0LndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbicsXG4gICAgICBib2R5OiBbJ0dFVCcsICdIRUFEJ10uaW5jbHVkZXModGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSlcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogcmVzb2x2ZWRCb2R5LFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm94eUhlYWRlcnMgPSBjcmVhdGVQcm94eShmZXRjaFJlcXVlc3QuaGVhZGVycywge1xuICAgICAgbWV0aG9kQ2FsbDogKFttZXRob2ROYW1lLCBhcmdzXSwgaW52b2tlKSA9PiB7XG4gICAgICAgIC8vIEZvcndhcmQgdGhlIGxhdGVzdCBzdGF0ZSBvZiB0aGUgaW50ZXJuYWwgcmVxdWVzdCBoZWFkZXJzXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGludGVyY2VwdG9yIG1pZ2h0IGhhdmUgbW9kaWZpZWQgdGhlbVxuICAgICAgICAvLyB3aXRob3V0IHJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3QuXG4gICAgICAgIHN3aXRjaCAobWV0aG9kTmFtZSkge1xuICAgICAgICAgIGNhc2UgJ2FwcGVuZCc6XG4gICAgICAgICAgY2FzZSAnc2V0Jzoge1xuICAgICAgICAgICAgY29uc3QgW2hlYWRlck5hbWUsIGhlYWRlclZhbHVlXSA9IGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IFtoZWFkZXJOYW1lXSA9IGFyZ3MgYXMgW3N0cmluZ11cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFhNTEh0dHBSZXF1ZXN0OiBDYW5ub3QgcmVtb3ZlIGEgXCIke2hlYWRlck5hbWV9XCIgaGVhZGVyIGZyb20gdGhlIEZldGNoIEFQSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgXCIke2ZldGNoUmVxdWVzdC5tZXRob2R9ICR7ZmV0Y2hSZXF1ZXN0LnVybH1cIiByZXF1ZXN0LiBYTUxIdHRwUmVxdWVzdCBoZWFkZXJzIGNhbm5vdCBiZSByZW1vdmVkLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGludm9rZSgpXG4gICAgICB9LFxuICAgIH0pXG4gICAgZGVmaW5lKGZldGNoUmVxdWVzdCwgJ2hlYWRlcnMnLCBwcm94eUhlYWRlcnMpXG4gICAgc2V0UmF3UmVxdWVzdChmZXRjaFJlcXVlc3QsIHRoaXMucmVxdWVzdClcblxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ2NvbnZlcnRlZCByZXF1ZXN0IHRvIGEgRmV0Y2ggQVBJIFJlcXVlc3QhJywgZmV0Y2hSZXF1ZXN0KVxuXG4gICAgcmV0dXJuIGZldGNoUmVxdWVzdFxuICB9XG59XG5cbmZ1bmN0aW9uIHRvQWJzb2x1dGVVcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBVUkwge1xuICAvKipcbiAgICogQG5vdGUgWE1MSHR0cFJlcXVlc3QgaW50ZXJjZXB0b3IgbWF5IHJ1biBpbiBlbnZpcm9ubWVudHNcbiAgICogdGhhdCBpbXBsZW1lbnQgWE1MSHR0cFJlcXVlc3QgYnV0IGRvbid0IGltcGxlbWVudCBcImxvY2F0aW9uXCJcbiAgICogKGZvciBleGFtcGxlLCBSZWFjdCBOYXRpdmUpLiBJZiB0aGF0J3MgdGhlIGNhc2UsIHJldHVybiB0aGVcbiAgICogaW5wdXQgVVJMIGFzLWlzIChub3RoaW5nIHRvIGJlIHJlbGF0aXZlIHRvKS5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvbXN3L2lzc3Vlcy8xNzc3XG4gICAqL1xuICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgVVJMKHVybClcbiAgfVxuXG4gIHJldHVybiBuZXcgVVJMKHVybC50b1N0cmluZygpLCBsb2NhdGlvbi5ocmVmKVxufVxuXG5mdW5jdGlvbiBkZWZpbmUoXG4gIHRhcmdldDogb2JqZWN0LFxuICBwcm9wZXJ0eTogc3RyaW5nIHwgc3ltYm9sLFxuICB2YWx1ZTogdW5rbm93blxuKTogdm9pZCB7XG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwge1xuICAgIC8vIEVuc3VyZSB3cml0YWJsZSBwcm9wZXJ0aWVzIHRvIGFsbG93IHJlZGVmaW5pbmcgcmVhZG9ubHkgcHJvcGVydGllcy5cbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlLFxuICB9KVxufVxuIiwgIi8qKlxuICogQ29uY2F0ZW5hdGUgdHdvIGBVaW50OEFycmF5YCBidWZmZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0QXJyYXlCdWZmZXIoXG4gIGxlZnQ6IFVpbnQ4QXJyYXksXG4gIHJpZ2h0OiBVaW50OEFycmF5XG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVmdC5ieXRlTGVuZ3RoICsgcmlnaHQuYnl0ZUxlbmd0aClcbiAgcmVzdWx0LnNldChsZWZ0LCAwKVxuICByZXN1bHQuc2V0KHJpZ2h0LCBsZWZ0LmJ5dGVMZW5ndGgpXG4gIHJldHVybiByZXN1bHRcbn1cbiIsICJleHBvcnQgY2xhc3MgRXZlbnRQb2x5ZmlsbCBpbXBsZW1lbnRzIEV2ZW50IHtcbiAgcmVhZG9ubHkgTk9ORSA9IDBcbiAgcmVhZG9ubHkgQ0FQVFVSSU5HX1BIQVNFID0gMVxuICByZWFkb25seSBBVF9UQVJHRVQgPSAyXG4gIHJlYWRvbmx5IEJVQkJMSU5HX1BIQVNFID0gM1xuXG4gIHB1YmxpYyB0eXBlOiBzdHJpbmcgPSAnJ1xuICBwdWJsaWMgc3JjRWxlbWVudDogRXZlbnRUYXJnZXQgfCBudWxsID0gbnVsbFxuICBwdWJsaWMgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGxcbiAgcHVibGljIGN1cnJlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCA9IG51bGxcbiAgcHVibGljIGV2ZW50UGhhc2U6IG51bWJlciA9IDBcbiAgcHVibGljIHRpbWVTdGFtcDogbnVtYmVyXG4gIHB1YmxpYyBpc1RydXN0ZWQ6IGJvb2xlYW4gPSB0cnVlXG4gIHB1YmxpYyBjb21wb3NlZDogYm9vbGVhbiA9IGZhbHNlXG4gIHB1YmxpYyBjYW5jZWxhYmxlOiBib29sZWFuID0gdHJ1ZVxuICBwdWJsaWMgZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbiA9IGZhbHNlXG4gIHB1YmxpYyBidWJibGVzOiBib29sZWFuID0gdHJ1ZVxuICBwdWJsaWMgbGVuZ3RoQ29tcHV0YWJsZTogYm9vbGVhbiA9IHRydWVcbiAgcHVibGljIGxvYWRlZDogbnVtYmVyID0gMFxuICBwdWJsaWMgdG90YWw6IG51bWJlciA9IDBcblxuICBjYW5jZWxCdWJibGU6IGJvb2xlYW4gPSBmYWxzZVxuICByZXR1cm5WYWx1ZTogYm9vbGVhbiA9IHRydWVcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0OiBFdmVudFRhcmdldDsgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXQgfVxuICApIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlXG4gICAgdGhpcy50YXJnZXQgPSBvcHRpb25zPy50YXJnZXQgfHwgbnVsbFxuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG9wdGlvbnM/LmN1cnJlbnRUYXJnZXQgfHwgbnVsbFxuICAgIHRoaXMudGltZVN0YW1wID0gRGF0ZS5ub3coKVxuICB9XG5cbiAgcHVibGljIGNvbXBvc2VkUGF0aCgpOiBFdmVudFRhcmdldFtdIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHB1YmxpYyBpbml0RXZlbnQodHlwZTogc3RyaW5nLCBidWJibGVzPzogYm9vbGVhbiwgY2FuY2VsYWJsZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlXG4gICAgdGhpcy5idWJibGVzID0gISFidWJibGVzXG4gICAgdGhpcy5jYW5jZWxhYmxlID0gISFjYW5jZWxhYmxlXG4gIH1cblxuICBwdWJsaWMgcHJldmVudERlZmF1bHQoKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZVxuICB9XG5cbiAgcHVibGljIHN0b3BQcm9wYWdhdGlvbigpIHt9XG4gIHB1YmxpYyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7fVxufVxuIiwgImltcG9ydCB7IEV2ZW50UG9seWZpbGwgfSBmcm9tICcuL0V2ZW50UG9seWZpbGwnXG5cbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0V2ZW50UG9seWZpbGwgZXh0ZW5kcyBFdmVudFBvbHlmaWxsIHtcbiAgcmVhZG9ubHkgbGVuZ3RoQ29tcHV0YWJsZTogYm9vbGVhblxuICByZWFkb25seSBjb21wb3NlZDogYm9vbGVhblxuICByZWFkb25seSBsb2FkZWQ6IG51bWJlclxuICByZWFkb25seSB0b3RhbDogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBpbml0PzogUHJvZ3Jlc3NFdmVudEluaXQpIHtcbiAgICBzdXBlcih0eXBlKVxuXG4gICAgdGhpcy5sZW5ndGhDb21wdXRhYmxlID0gaW5pdD8ubGVuZ3RoQ29tcHV0YWJsZSB8fCBmYWxzZVxuICAgIHRoaXMuY29tcG9zZWQgPSBpbml0Py5jb21wb3NlZCB8fCBmYWxzZVxuICAgIHRoaXMubG9hZGVkID0gaW5pdD8ubG9hZGVkIHx8IDBcbiAgICB0aGlzLnRvdGFsID0gaW5pdD8udG90YWwgfHwgMFxuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnRQb2x5ZmlsbCB9IGZyb20gJy4uL3BvbHlmaWxscy9FdmVudFBvbHlmaWxsJ1xuaW1wb3J0IHsgUHJvZ3Jlc3NFdmVudFBvbHlmaWxsIH0gZnJvbSAnLi4vcG9seWZpbGxzL1Byb2dyZXNzRXZlbnRQb2x5ZmlsbCdcblxuY29uc3QgU1VQUE9SVFNfUFJPR1JFU1NfRVZFTlQgPSB0eXBlb2YgUHJvZ3Jlc3NFdmVudCAhPT0gJ3VuZGVmaW5lZCdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KFxuICB0YXJnZXQ6IFhNTEh0dHBSZXF1ZXN0IHwgWE1MSHR0cFJlcXVlc3RVcGxvYWQsXG4gIHR5cGU6IHN0cmluZyxcbiAgaW5pdD86IFByb2dyZXNzRXZlbnRJbml0XG4pOiBFdmVudFBvbHlmaWxsIHwgUHJvZ3Jlc3NFdmVudCB7XG4gIGNvbnN0IHByb2dyZXNzRXZlbnRzID0gW1xuICAgICdlcnJvcicsXG4gICAgJ3Byb2dyZXNzJyxcbiAgICAnbG9hZHN0YXJ0JyxcbiAgICAnbG9hZGVuZCcsXG4gICAgJ2xvYWQnLFxuICAgICd0aW1lb3V0JyxcbiAgICAnYWJvcnQnLFxuICBdXG5cbiAgLyoqXG4gICAqIGBQcm9ncmVzc0V2ZW50YCBpcyBub3Qgc3VwcG9ydGVkIGluIFJlYWN0IE5hdGl2ZS5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvaW50ZXJjZXB0b3JzL2lzc3Vlcy80MFxuICAgKi9cbiAgY29uc3QgUHJvZ3Jlc3NFdmVudENsYXNzID0gU1VQUE9SVFNfUFJPR1JFU1NfRVZFTlRcbiAgICA/IFByb2dyZXNzRXZlbnRcbiAgICA6IFByb2dyZXNzRXZlbnRQb2x5ZmlsbFxuXG4gIGNvbnN0IGV2ZW50ID0gcHJvZ3Jlc3NFdmVudHMuaW5jbHVkZXModHlwZSlcbiAgICA/IG5ldyBQcm9ncmVzc0V2ZW50Q2xhc3ModHlwZSwge1xuICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLFxuICAgICAgICBsb2FkZWQ6IGluaXQ/LmxvYWRlZCB8fCAwLFxuICAgICAgICB0b3RhbDogaW5pdD8udG90YWwgfHwgMCxcbiAgICAgIH0pXG4gICAgOiBuZXcgRXZlbnRQb2x5ZmlsbCh0eXBlLCB7XG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgY3VycmVudFRhcmdldDogdGFyZ2V0LFxuICAgICAgfSlcblxuICByZXR1cm4gZXZlbnRcbn1cbiIsICIvKipcbiAqIFJldHVybnMgdGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGdpdmVuIHByb3BlcnR5IG9uIHRoZSB0YXJnZXQgb2JqZWN0XG4gKiAodGhlIHRhcmdldCBpdHNlbGYsIGFueSBwYXJlbnQgaW4gaXRzIHByb3RvdHlwZSwgb3IgbnVsbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUHJvcGVydHlTb3VyY2UoXG4gIHRhcmdldDogb2JqZWN0LFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN5bWJvbFxuKTogb2JqZWN0IHwgbnVsbCB7XG4gIGlmICghKHByb3BlcnR5TmFtZSBpbiB0YXJnZXQpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGhhc1Byb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcGVydHlOYW1lKVxuICBpZiAoaGFzUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldClcbiAgcmV0dXJuIHByb3RvdHlwZSA/IGZpbmRQcm9wZXJ0eVNvdXJjZShwcm90b3R5cGUsIHByb3BlcnR5TmFtZSkgOiBudWxsXG59XG4iLCAiaW1wb3J0IHsgZmluZFByb3BlcnR5U291cmNlIH0gZnJvbSAnLi9maW5kUHJvcGVydHlTb3VyY2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlPcHRpb25zPFRhcmdldCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgY29uc3RydWN0b3JDYWxsPyhhcmdzOiBBcnJheTx1bmtub3duPiwgbmV4dDogTmV4dEZ1bmN0aW9uPFRhcmdldD4pOiBUYXJnZXRcblxuICBtZXRob2RDYWxsPzxGIGV4dGVuZHMga2V5b2YgVGFyZ2V0PihcbiAgICB0aGlzOiBUYXJnZXQsXG4gICAgZGF0YTogW21ldGhvZE5hbWU6IEYsIGFyZ3M6IEFycmF5PHVua25vd24+XSxcbiAgICBuZXh0OiBOZXh0RnVuY3Rpb248dm9pZD5cbiAgKTogdm9pZFxuXG4gIHNldFByb3BlcnR5PyhcbiAgICBkYXRhOiBbcHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzeW1ib2wsIG5leHRWYWx1ZTogdW5rbm93bl0sXG4gICAgbmV4dDogTmV4dEZ1bmN0aW9uPGJvb2xlYW4+XG4gICk6IGJvb2xlYW5cblxuICBnZXRQcm9wZXJ0eT8oXG4gICAgZGF0YTogW3Byb3BlcnR5TmFtZTogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogVGFyZ2V0XSxcbiAgICBuZXh0OiBOZXh0RnVuY3Rpb248dm9pZD5cbiAgKTogdm9pZFxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb248UmV0dXJuVHlwZT4gPSAoKSA9PiBSZXR1cm5UeXBlXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm94eTxUYXJnZXQgZXh0ZW5kcyBvYmplY3Q+KFxuICB0YXJnZXQ6IFRhcmdldCxcbiAgb3B0aW9uczogUHJveHlPcHRpb25zPFRhcmdldD5cbik6IFRhcmdldCB7XG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgb3B0aW9uc1RvUHJveHlIYW5kbGVyKG9wdGlvbnMpKVxuXG4gIHJldHVybiBwcm94eVxufVxuXG5mdW5jdGlvbiBvcHRpb25zVG9Qcm94eUhhbmRsZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBvcHRpb25zOiBQcm94eU9wdGlvbnM8VD5cbik6IFByb3h5SGFuZGxlcjxUPiB7XG4gIGNvbnN0IHsgY29uc3RydWN0b3JDYWxsLCBtZXRob2RDYWxsLCBnZXRQcm9wZXJ0eSwgc2V0UHJvcGVydHkgfSA9IG9wdGlvbnNcbiAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPFQ+ID0ge31cblxuICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yQ2FsbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBoYW5kbGVyLmNvbnN0cnVjdCA9IGZ1bmN0aW9uICh0YXJnZXQsIGFyZ3MsIG5ld1RhcmdldCkge1xuICAgICAgY29uc3QgbmV4dCA9IFJlZmxlY3QuY29uc3RydWN0LmJpbmQobnVsbCwgdGFyZ2V0IGFzIGFueSwgYXJncywgbmV3VGFyZ2V0KVxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yQ2FsbC5jYWxsKG5ld1RhcmdldCwgYXJncywgbmV4dClcbiAgICB9XG4gIH1cblxuICBoYW5kbGVyLnNldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5TmFtZSwgbmV4dFZhbHVlKSB7XG4gICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5U291cmNlID0gZmluZFByb3BlcnR5U291cmNlKHRhcmdldCwgcHJvcGVydHlOYW1lKSB8fCB0YXJnZXRcbiAgICAgIGNvbnN0IG93bkRlc2NyaXB0b3JzID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHByb3BlcnR5U291cmNlLFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgIClcblxuICAgICAgLy8gUmVzcGVjdCBhbnkgY3VzdG9tIHNldHRlcnMgcHJlc2VudCBmb3IgdGhpcyBwcm9wZXJ0eS5cbiAgICAgIGlmICh0eXBlb2Ygb3duRGVzY3JpcHRvcnM/LnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3duRGVzY3JpcHRvcnMuc2V0LmFwcGx5KHRhcmdldCwgW25leHRWYWx1ZV0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHRoZSBwcm9wZXJ0eSBvbiB0aGUgc291cmNlLlxuICAgICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkocHJvcGVydHlTb3VyY2UsIHByb3BlcnR5TmFtZSwge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV4dFZhbHVlLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNldFByb3BlcnR5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHNldFByb3BlcnR5LmNhbGwodGFyZ2V0LCBbcHJvcGVydHlOYW1lLCBuZXh0VmFsdWVdLCBuZXh0KVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0KClcbiAgfVxuXG4gIGhhbmRsZXIuZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlOYW1lLCByZWNlaXZlcikge1xuICAgIC8qKlxuICAgICAqIEBub3RlIFVzaW5nIGBSZWZsZWN0LmdldCgpYCBoZXJlIGNhdXNlcyBcIlR5cGVFcnJvcjogSWxsZWdhbCBpbnZvY2F0aW9uXCIuXG4gICAgICovXG4gICAgY29uc3QgbmV4dCA9ICgpID0+IHRhcmdldFtwcm9wZXJ0eU5hbWUgYXMgYW55XVxuXG4gICAgY29uc3QgdmFsdWUgPVxuICAgICAgdHlwZW9mIGdldFByb3BlcnR5ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IGdldFByb3BlcnR5LmNhbGwodGFyZ2V0LCBbcHJvcGVydHlOYW1lLCByZWNlaXZlcl0sIG5leHQpXG4gICAgICAgIDogbmV4dCgpXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKC4uLmFyZ3M6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHZhbHVlLmJpbmQodGFyZ2V0LCAuLi5hcmdzKVxuXG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kQ2FsbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gbWV0aG9kQ2FsbC5jYWxsKHRhcmdldCwgW3Byb3BlcnR5TmFtZSBhcyBhbnksIGFyZ3NdLCBuZXh0KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIGhhbmRsZXJcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNEb21QYXJzZXJTdXBwb3J0ZWRUeXBlKFxuICB0eXBlOiBzdHJpbmdcbik6IHR5cGUgaXMgRE9NUGFyc2VyU3VwcG9ydGVkVHlwZSB7XG4gIGNvbnN0IHN1cHBvcnRlZFR5cGVzOiBBcnJheTxET01QYXJzZXJTdXBwb3J0ZWRUeXBlPiA9IFtcbiAgICAnYXBwbGljYXRpb24veGh0bWwreG1sJyxcbiAgICAnYXBwbGljYXRpb24veG1sJyxcbiAgICAnaW1hZ2Uvc3ZnK3htbCcsXG4gICAgJ3RleHQvaHRtbCcsXG4gICAgJ3RleHQveG1sJyxcbiAgXVxuICByZXR1cm4gc3VwcG9ydGVkVHlwZXMuc29tZSgoc3VwcG9ydGVkVHlwZSkgPT4ge1xuICAgIHJldHVybiB0eXBlLnN0YXJ0c1dpdGgoc3VwcG9ydGVkVHlwZSlcbiAgfSlcbn1cbiIsICIvKipcbiAqIFBhcnNlcyBhIGdpdmVuIHN0cmluZyBpbnRvIEpTT04uXG4gKiBHcmFjZWZ1bGx5IGhhbmRsZXMgaW52YWxpZCBKU09OIGJ5IHJldHVybmluZyBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUpzb24oZGF0YTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShkYXRhKVxuICAgIHJldHVybiBqc29uXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG4iLCAiaW1wb3J0IHsgRmV0Y2hSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ZldGNoVXRpbHMnXG5cbi8qKlxuICogQ3JlYXRlcyBhIEZldGNoIEFQSSBgUmVzcG9uc2VgIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuXG4gKiBgWE1MSHR0cFJlcXVlc3RgIGluc3RhbmNlIGFuZCBhIHJlc3BvbnNlIGJvZHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXNwb25zZShcbiAgcmVxdWVzdDogWE1MSHR0cFJlcXVlc3QsXG4gIGJvZHk6IEJvZHlJbml0IHwgbnVsbFxuKTogUmVzcG9uc2Uge1xuICAvKipcbiAgICogSGFuZGxlIFhNTEh0dHBSZXF1ZXN0IHJlc3BvbnNlcyB0aGF0IG11c3QgaGF2ZSBudWxsIGFzIHRoZVxuICAgKiByZXNwb25zZSBib2R5IHdoZW4gcmVwcmVzZW50ZWQgdXNpbmcgRmV0Y2ggQVBJIFJlc3BvbnNlLlxuICAgKiBYTUxIdHRwUmVxdWVzdCByZXNwb25zZSB3aWxsIGFsd2F5cyBoYXZlIGFuIGVtcHR5IHN0cmluZ1xuICAgKiBhcyB0aGUgXCJyZXF1ZXN0LnJlc3BvbnNlXCIgaW4gdGhvc2UgY2FzZXMsIHJlc3VsdGluZyBpbiBhbiBlcnJvclxuICAgKiB3aGVuIGNvbnN0cnVjdGluZyBhIFJlc3BvbnNlIGluc3RhbmNlLlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tc3dqcy9pbnRlcmNlcHRvcnMvaXNzdWVzLzM3OVxuICAgKi9cbiAgY29uc3QgcmVzcG9uc2VCb2R5T3JOdWxsID0gRmV0Y2hSZXNwb25zZS5pc1Jlc3BvbnNlV2l0aEJvZHkocmVxdWVzdC5zdGF0dXMpXG4gICAgPyBib2R5XG4gICAgOiBudWxsXG5cbiAgcmV0dXJuIG5ldyBGZXRjaFJlc3BvbnNlKHJlc3BvbnNlQm9keU9yTnVsbCwge1xuICAgIHVybDogcmVxdWVzdC5yZXNwb25zZVVSTCxcbiAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBjcmVhdGVIZWFkZXJzRnJvbVhNTEh0dHBSZXF1ZXN0SGVhZGVycyhcbiAgICAgIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICApLFxuICB9KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzRnJvbVhNTEh0dHBSZXF1ZXN0SGVhZGVycyhoZWFkZXJzU3RyaW5nOiBzdHJpbmcpOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICBjb25zdCBsaW5lcyA9IGhlYWRlcnNTdHJpbmcuc3BsaXQoL1tcXHJcXG5dKy8pXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgW25hbWUsIC4uLnBhcnRzXSA9IGxpbmUuc3BsaXQoJzogJylcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnRzLmpvaW4oJzogJylcblxuICAgIGhlYWRlcnMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnNcbn1cbiIsICIvKipcbiAqIFJldHVybiBhIHRvdGFsIGJ5dGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiByZXF1ZXN0L3Jlc3BvbnNlIGJvZHkuXG4gKiBJZiB0aGUgYENvbnRlbnQtTGVuZ3RoYCBoZWFkZXIgaXMgcHJlc2VudCwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBieXRlIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJvZHlCeXRlTGVuZ3RoKFxuICBpbnB1dDogUmVxdWVzdCB8IFJlc3BvbnNlXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBleHBsaWNpdENvbnRlbnRMZW5ndGggPSBpbnB1dC5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKVxuXG4gIGlmIChleHBsaWNpdENvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBleHBsaWNpdENvbnRlbnRMZW5ndGggIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlcihleHBsaWNpdENvbnRlbnRMZW5ndGgpXG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBhd2FpdCBpbnB1dC5hcnJheUJ1ZmZlcigpXG4gIHJldHVybiBidWZmZXIuYnl0ZUxlbmd0aFxufVxuIiwgImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnQG9wZW4tZHJhZnQvbG9nZ2VyJ1xuaW1wb3J0IHsgWE1MSHR0cFJlcXVlc3RFbWl0dGVyIH0gZnJvbSAnLidcbmltcG9ydCB7IFJlcXVlc3RDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vUmVxdWVzdENvbnRyb2xsZXInXG5pbXBvcnQgeyBYTUxIdHRwUmVxdWVzdENvbnRyb2xsZXIgfSBmcm9tICcuL1hNTEh0dHBSZXF1ZXN0Q29udHJvbGxlcidcbmltcG9ydCB7IGhhbmRsZVJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9oYW5kbGVSZXF1ZXN0J1xuaW1wb3J0IHsgaXNSZXNwb25zZUVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVzcG9uc2VVdGlscydcblxuZXhwb3J0IGludGVyZmFjZSBYTUxIdHRwUmVxdWVzdFByb3h5T3B0aW9ucyB7XG4gIGVtaXR0ZXI6IFhNTEh0dHBSZXF1ZXN0RW1pdHRlclxuICBsb2dnZXI6IExvZ2dlclxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHByb3hpZWQgYFhNTEh0dHBSZXF1ZXN0YCBjbGFzcy5cbiAqIFRoZSBwcm94aWVkIGNsYXNzIGVzdGFibGlzaGVzIHNwaWVzIG9uIGNlcnRhaW4gbWV0aG9kcyxcbiAqIGFsbG93aW5nIHVzIHRvIGludGVyY2VwdCByZXF1ZXN0cyBhbmQgcmVzcG9uZCB0byB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlWE1MSHR0cFJlcXVlc3RQcm94eSh7XG4gIGVtaXR0ZXIsXG4gIGxvZ2dlcixcbn06IFhNTEh0dHBSZXF1ZXN0UHJveHlPcHRpb25zKSB7XG4gIGNvbnN0IFhNTEh0dHBSZXF1ZXN0UHJveHkgPSBuZXcgUHJveHkoZ2xvYmFsVGhpcy5YTUxIdHRwUmVxdWVzdCwge1xuICAgIGNvbnN0cnVjdCh0YXJnZXQsIGFyZ3MsIG5ld1RhcmdldCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ2NvbnN0cnVjdGVkIG5ldyBYTUxIdHRwUmVxdWVzdCcpXG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWVzdCA9IFJlZmxlY3QuY29uc3RydWN0KFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIG5ld1RhcmdldFxuICAgICAgKSBhcyBYTUxIdHRwUmVxdWVzdFxuXG4gICAgICAvKipcbiAgICAgICAqIEBub3RlIEZvcndhcmQgcHJvdG90eXBlIGRlc2NyaXB0b3JzIG9udG8gdGhlIHByb3hpZWQgb2JqZWN0LlxuICAgICAgICogWE1MSHR0cFJlcXVlc3QgaXMgaW1wbGVtZW50ZWQgaW4gSlNET00gaW4gYSB3YXkgdGhhdCBhc3NpZ25zXG4gICAgICAgKiBhIGJ1bmNoIG9mIGRlc2NyaXB0b3JzLCBsaWtlIFwic2V0IHJlc3BvbnNlVHlwZSgpXCIgb24gdGhlIHByb3RvdHlwZS5cbiAgICAgICAqIFdpdGggdGhpcyBwcm9wYWdhdGlvbiwgd2UgbWFrZSBzdXJlIHRoYXQgdGhvc2UgZGVzY3JpcHRvcnMgdHJpZ2dlclxuICAgICAgICogd2hlbiB0aGUgdXNlciBvcGVyYXRlcyB3aXRoIHRoZSBwcm94aWVkIHJlcXVlc3QgaW5zdGFuY2UuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHByb3RvdHlwZURlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGVcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3RvdHlwZURlc2NyaXB0b3JzKSB7XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgb3JpZ2luYWxSZXF1ZXN0LFxuICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBwcm90b3R5cGVEZXNjcmlwdG9yc1twcm9wZXJ0eU5hbWVdXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29uc3QgeGhyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgWE1MSHR0cFJlcXVlc3RDb250cm9sbGVyKFxuICAgICAgICBvcmlnaW5hbFJlcXVlc3QsXG4gICAgICAgIGxvZ2dlclxuICAgICAgKVxuXG4gICAgICB4aHJSZXF1ZXN0Q29udHJvbGxlci5vblJlcXVlc3QgPSBhc3luYyBmdW5jdGlvbiAoeyByZXF1ZXN0LCByZXF1ZXN0SWQgfSkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IFJlcXVlc3RDb250cm9sbGVyKHJlcXVlc3QsIHtcbiAgICAgICAgICBwYXNzdGhyb3VnaDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ25vIG1vY2tlZCByZXNwb25zZSByZWNlaXZlZCwgcGVyZm9ybWluZyByZXF1ZXN0IGFzLWlzLi4uJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzcG9uZFdpdGg6IGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUmVzcG9uc2VFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvcldpdGgobmV3IFR5cGVFcnJvcignTmV0d29yayBlcnJvcicpKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kV2l0aChyZXNwb25zZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yV2l0aDogKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygncmVxdWVzdCBlcnJvcmVkIScsIHsgZXJyb3I6IHJlYXNvbiB9KVxuXG4gICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvcldpdGgocmVhc29uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnYXdhaXRpbmcgbW9ja2VkIHJlc3BvbnNlLi4uJylcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICdlbWl0dGluZyB0aGUgXCJyZXF1ZXN0XCIgZXZlbnQgZm9yICVzIGxpc3RlbmVyKHMpLi4uJyxcbiAgICAgICAgICBlbWl0dGVyLmxpc3RlbmVyQ291bnQoJ3JlcXVlc3QnKVxuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgaGFuZGxlUmVxdWVzdCh7XG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB4aHJSZXF1ZXN0Q29udHJvbGxlci5vblJlc3BvbnNlID0gYXN5bmMgZnVuY3Rpb24gKHtcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgIGlzTW9ja2VkUmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgIH0pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAnZW1pdHRpbmcgdGhlIFwicmVzcG9uc2VcIiBldmVudCBmb3IgJXMgbGlzdGVuZXIocykuLi4nLFxuICAgICAgICAgIGVtaXR0ZXIubGlzdGVuZXJDb3VudCgncmVzcG9uc2UnKVxuICAgICAgICApXG5cbiAgICAgICAgZW1pdHRlci5lbWl0KCdyZXNwb25zZScsIHtcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICBpc01vY2tlZFJlc3BvbnNlLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gdGhlIHByb3hpZWQgcmVxdWVzdCBmcm9tIHRoZSBjb250cm9sbGVyXG4gICAgICAvLyBzbyB0aGF0IHRoZSBjb250cm9sbGVyIGNhbiByZWFjdCB0byB0aGUgY29uc3VtZXIncyBpbnRlcmFjdGlvbnNcbiAgICAgIC8vIHdpdGggdGhpcyByZXF1ZXN0IChvcGVuaW5nL3NlbmRpbmcvZXRjKS5cbiAgICAgIHJldHVybiB4aHJSZXF1ZXN0Q29udHJvbGxlci5yZXF1ZXN0XG4gICAgfSxcbiAgfSlcblxuICByZXR1cm4gWE1MSHR0cFJlcXVlc3RQcm94eVxufVxuIiwgImltcG9ydCB7XG4gIEludGVyY2VwdG9yLFxuICBCYXRjaEludGVyY2VwdG9yLFxuICBIdHRwUmVxdWVzdEV2ZW50TWFwLFxufSBmcm9tICdAbXN3anMvaW50ZXJjZXB0b3JzJ1xuaW1wb3J0IHsgRmV0Y2hJbnRlcmNlcHRvciB9IGZyb20gJ0Btc3dqcy9pbnRlcmNlcHRvcnMvZmV0Y2gnXG5pbXBvcnQgeyBYTUxIdHRwUmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnQG1zd2pzL2ludGVyY2VwdG9ycy9YTUxIdHRwUmVxdWVzdCdcbmltcG9ydCB7IFNldHVwV29ya2VySW50ZXJuYWxDb250ZXh0LCBTdGFydE9wdGlvbnMgfSBmcm9tICcuLi9nbG9zc2FyeSdcbmltcG9ydCB0eXBlIHsgUmVxdWlyZWREZWVwIH0gZnJvbSAnfi9jb3JlL3R5cGVVdGlscydcbmltcG9ydCB7IGhhbmRsZVJlcXVlc3QgfSBmcm9tICd+L2NvcmUvdXRpbHMvaGFuZGxlUmVxdWVzdCdcbmltcG9ydCB7IGlzSGFuZGxlcktpbmQgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvaXNIYW5kbGVyS2luZCdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrUmVxdWVzdExpc3RlbmVyKFxuICBjb250ZXh0OiBTZXR1cFdvcmtlckludGVybmFsQ29udGV4dCxcbiAgb3B0aW9uczogUmVxdWlyZWREZWVwPFN0YXJ0T3B0aW9ucz4sXG4pOiBJbnRlcmNlcHRvcjxIdHRwUmVxdWVzdEV2ZW50TWFwPiB7XG4gIGNvbnN0IGludGVyY2VwdG9yID0gbmV3IEJhdGNoSW50ZXJjZXB0b3Ioe1xuICAgIG5hbWU6ICdmYWxsYmFjaycsXG4gICAgaW50ZXJjZXB0b3JzOiBbbmV3IEZldGNoSW50ZXJjZXB0b3IoKSwgbmV3IFhNTEh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IoKV0sXG4gIH0pXG5cbiAgaW50ZXJjZXB0b3Iub24oJ3JlcXVlc3QnLCBhc3luYyAoeyByZXF1ZXN0LCByZXF1ZXN0SWQsIGNvbnRyb2xsZXIgfSkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RDbG9uZUZvckxvZ3MgPSByZXF1ZXN0LmNsb25lKClcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaGFuZGxlUmVxdWVzdChcbiAgICAgIHJlcXVlc3QsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgICBjb250ZXh0LmdldFJlcXVlc3RIYW5kbGVycygpLmZpbHRlcihpc0hhbmRsZXJLaW5kKCdSZXF1ZXN0SGFuZGxlcicpKSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBjb250ZXh0LmVtaXR0ZXIsXG4gICAgICB7XG4gICAgICAgIG9uTW9ja2VkUmVzcG9uc2UoXywgeyBoYW5kbGVyLCBwYXJzZWRSZXN1bHQgfSkge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5xdWlldCkge1xuICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLm9uY2UoJ3Jlc3BvbnNlOm1vY2tlZCcsICh7IHJlc3BvbnNlIH0pID0+IHtcbiAgICAgICAgICAgICAgaGFuZGxlci5sb2coe1xuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RDbG9uZUZvckxvZ3MsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcGFyc2VkUmVzdWx0LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIClcblxuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgY29udHJvbGxlci5yZXNwb25kV2l0aChyZXNwb25zZSlcbiAgICB9XG4gIH0pXG5cbiAgaW50ZXJjZXB0b3Iub24oXG4gICAgJ3Jlc3BvbnNlJyxcbiAgICAoeyByZXNwb25zZSwgaXNNb2NrZWRSZXNwb25zZSwgcmVxdWVzdCwgcmVxdWVzdElkIH0pID0+IHtcbiAgICAgIGNvbnRleHQuZW1pdHRlci5lbWl0KFxuICAgICAgICBpc01vY2tlZFJlc3BvbnNlID8gJ3Jlc3BvbnNlOm1vY2tlZCcgOiAncmVzcG9uc2U6YnlwYXNzJyxcbiAgICAgICAge1xuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0sXG4gIClcblxuICBpbnRlcmNlcHRvci5hcHBseSgpXG5cbiAgcmV0dXJuIGludGVyY2VwdG9yXG59XG4iLCAiaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICd+L2NvcmUvdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0b3BNZXNzYWdlKGFyZ3M6IHsgcXVpZXQ/OiBib29sZWFuIH0gPSB7fSk6IHZvaWQge1xuICBpZiAoYXJncy5xdWlldCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coXG4gICAgYCVjJHtkZXZVdGlscy5mb3JtYXRNZXNzYWdlKCdNb2NraW5nIGRpc2FibGVkLicpfWAsXG4gICAgJ2NvbG9yOm9yYW5nZXJlZDtmb250LXdlaWdodDpib2xkOycsXG4gIClcbn1cbiIsICJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHsgZGV2VXRpbHMgfSBmcm9tICcuL2RldlV0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tHbG9iYWxzKCkge1xuICAvKipcbiAgICogTVNXIGV4cGVjdHMgdGhlIFwiVVJMXCIgY29uc3RydWN0b3IgdG8gYmUgZGVmaW5lZC5cbiAgICogSXQncyBub3QgcHJlc2VudCBpbiBSZWFjdCBOYXRpdmUgc28gc3VnZ2VzdCBhIHBvbHlmaWxsXG4gICAqIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseS5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXN3anMvbXN3L2lzc3Vlcy8xNDA4XG4gICAqL1xuICBpbnZhcmlhbnQoXG4gICAgdHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgIGBHbG9iYWwgXCJVUkxcIiBjbGFzcyBpcyBub3QgZGVmaW5lZC4gVGhpcyBsaWtlbHkgbWVhbnMgdGhhdCB5b3UncmUgcnVubmluZyBNU1cgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2Vzbid0IHN1cHBvcnQgYWxsIE5vZGUuanMgc3RhbmRhcmQgQVBJIChlLmcuIFJlYWN0IE5hdGl2ZSkuIElmIHRoYXQncyB0aGUgY2FzZSwgcGxlYXNlIHVzZSBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCBmb3IgdGhlIFwiVVJMXCIgY2xhc3MsIGxpa2UgXCJyZWFjdC1uYXRpdmUtdXJsLXBvbHlmaWxsXCIuYCxcbiAgICApLFxuICApXG59XG4iLCAiLyoqXG4gKiBQZXJmb3JtcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBvZiB0d28gZ2l2ZW4gc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nRXF1YWwoYWN0dWFsOiBzdHJpbmcsIGV4cGVjdGVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFjdHVhbC50b0xvd2VyQ2FzZSgpID09PSBleHBlY3RlZC50b0xvd2VyQ2FzZSgpXG59XG4iLCAiZXhwb3J0IGVudW0gU3RhdHVzQ29kZUNvbG9yIHtcbiAgU3VjY2VzcyA9ICcjNjlBQjMyJyxcbiAgV2FybmluZyA9ICcjRjBCQjRCJyxcbiAgRGFuZ2VyID0gJyNFOTVGNUQnLFxufVxuXG4vKipcbiAqIFJldHVybnMgYSBIRVggY29sb3IgZm9yIGEgZ2l2ZW4gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZUNvbG9yKHN0YXR1czogbnVtYmVyKTogU3RhdHVzQ29kZUNvbG9yIHtcbiAgaWYgKHN0YXR1cyA8IDMwMCkge1xuICAgIHJldHVybiBTdGF0dXNDb2RlQ29sb3IuU3VjY2Vzc1xuICB9XG5cbiAgaWYgKHN0YXR1cyA8IDQwMCkge1xuICAgIHJldHVybiBTdGF0dXNDb2RlQ29sb3IuV2FybmluZ1xuICB9XG5cbiAgcmV0dXJuIFN0YXR1c0NvZGVDb2xvci5EYW5nZXJcbn1cbiIsICJleHBvcnQgaW50ZXJmYWNlIExvZ2dlZFJlcXVlc3Qge1xuICB1cmw6IFVSTFxuICBtZXRob2Q6IHN0cmluZ1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGJvZHk6IHN0cmluZ1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBtb2NrZWQgcmVxdWVzdCBmb3IgaW50cm9zcGVjdGlvbiBpbiBicm93c2VyJ3MgY29uc29sZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlcXVlc3QoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4pOiBQcm9taXNlPExvZ2dlZFJlcXVlc3Q+IHtcbiAgY29uc3QgcmVxdWVzdENsb25lID0gcmVxdWVzdC5jbG9uZSgpXG4gIGNvbnN0IHJlcXVlc3RUZXh0ID0gYXdhaXQgcmVxdWVzdENsb25lLnRleHQoKVxuXG4gIHJldHVybiB7XG4gICAgdXJsOiBuZXcgVVJMKHJlcXVlc3QudXJsKSxcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXF1ZXN0LmhlYWRlcnMuZW50cmllcygpKSxcbiAgICBib2R5OiByZXF1ZXN0VGV4dCxcbiAgfVxufVxuIiwgImltcG9ydCBzdGF0dXNlcyBmcm9tICcuLi8uLi8uLi9zaGltcy9zdGF0dXNlcydcblxuY29uc3QgeyBtZXNzYWdlIH0gPSBzdGF0dXNlc1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRSZXNwb25zZSB7XG4gIHN0YXR1czogbnVtYmVyXG4gIHN0YXR1c1RleHQ6IHN0cmluZ1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIGJvZHk6IHN0cmluZ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbik6IFByb21pc2U8U2VyaWFsaXplZFJlc3BvbnNlPiB7XG4gIGNvbnN0IHJlc3BvbnNlQ2xvbmUgPSByZXNwb25zZS5jbG9uZSgpXG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlQ2xvbmUudGV4dCgpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSByZXNwb25zZSBzdGF0dXMgYW5kIHN0YXR1cyB0ZXh0IHdoZW4gbG9nZ2luZ1xuICAvLyBzaW5jZSB0aGUgZGVmYXVsdCBSZXNwb25zZSBpbnN0YW5jZSBkb2Vzbid0IGluZmVyIHN0YXR1cyB0ZXh0c1xuICAvLyBmcm9tIHN0YXR1cyBjb2Rlcy4gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBhY3R1YWwgcmVzcG9uc2UgaW5zdGFuY2UuXG4gIGNvbnN0IHJlc3BvbnNlU3RhdHVzID0gcmVzcG9uc2VDbG9uZS5zdGF0dXMgfHwgMjAwXG4gIGNvbnN0IHJlc3BvbnNlU3RhdHVzVGV4dCA9XG4gICAgcmVzcG9uc2VDbG9uZS5zdGF0dXNUZXh0IHx8IG1lc3NhZ2VbcmVzcG9uc2VTdGF0dXNdIHx8ICdPSydcblxuICByZXR1cm4ge1xuICAgIHN0YXR1czogcmVzcG9uc2VTdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2VTdGF0dXNUZXh0LFxuICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZUNsb25lLmhlYWRlcnMuZW50cmllcygpKSxcbiAgICBib2R5OiByZXNwb25zZVRleHQsXG4gIH1cbn1cbiIsICIvKipcbiAqIFRva2VuaXplciByZXN1bHRzLlxuICovXG5pbnRlcmZhY2UgTGV4VG9rZW4ge1xuICB0eXBlOlxuICAgIHwgXCJPUEVOXCJcbiAgICB8IFwiQ0xPU0VcIlxuICAgIHwgXCJQQVRURVJOXCJcbiAgICB8IFwiTkFNRVwiXG4gICAgfCBcIkNIQVJcIlxuICAgIHwgXCJFU0NBUEVEX0NIQVJcIlxuICAgIHwgXCJNT0RJRklFUlwiXG4gICAgfCBcIkVORFwiO1xuICBpbmRleDogbnVtYmVyO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRva2VuaXplIGlucHV0IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gbGV4ZXIoc3RyOiBzdHJpbmcpOiBMZXhUb2tlbltdIHtcbiAgY29uc3QgdG9rZW5zOiBMZXhUb2tlbltdID0gW107XG4gIGxldCBpID0gMDtcblxuICB3aGlsZSAoaSA8IHN0ci5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc3RyW2ldO1xuXG4gICAgaWYgKGNoYXIgPT09IFwiKlwiIHx8IGNoYXIgPT09IFwiK1wiIHx8IGNoYXIgPT09IFwiP1wiKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwiTU9ESUZJRVJcIiwgaW5kZXg6IGksIHZhbHVlOiBzdHJbaSsrXSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIlxcXFxcIikge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIkVTQ0FQRURfQ0hBUlwiLCBpbmRleDogaSsrLCB2YWx1ZTogc3RyW2krK10gfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gXCJ7XCIpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogXCJPUEVOXCIsIGluZGV4OiBpLCB2YWx1ZTogc3RyW2krK10gfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gXCJ9XCIpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogXCJDTE9TRVwiLCBpbmRleDogaSwgdmFsdWU6IHN0cltpKytdIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiOlwiKSB7XG4gICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICBsZXQgaiA9IGkgKyAxO1xuXG4gICAgICB3aGlsZSAoaiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGopO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBgMC05YFxuICAgICAgICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8XG4gICAgICAgICAgLy8gYEEtWmBcbiAgICAgICAgICAoY29kZSA+PSA2NSAmJiBjb2RlIDw9IDkwKSB8fFxuICAgICAgICAgIC8vIGBhLXpgXG4gICAgICAgICAgKGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMjIpIHx8XG4gICAgICAgICAgLy8gYF9gXG4gICAgICAgICAgY29kZSA9PT0gOTVcbiAgICAgICAgKSB7XG4gICAgICAgICAgbmFtZSArPSBzdHJbaisrXTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgcGFyYW1ldGVyIG5hbWUgYXQgJHtpfWApO1xuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwiTkFNRVwiLCBpbmRleDogaSwgdmFsdWU6IG5hbWUgfSk7XG4gICAgICBpID0gajtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgbGV0IGNvdW50ID0gMTtcbiAgICAgIGxldCBwYXR0ZXJuID0gXCJcIjtcbiAgICAgIGxldCBqID0gaSArIDE7XG5cbiAgICAgIGlmIChzdHJbal0gPT09IFwiP1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFBhdHRlcm4gY2Fubm90IHN0YXJ0IHdpdGggXCI/XCIgYXQgJHtqfWApO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoaiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN0cltqXSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICBwYXR0ZXJuICs9IHN0cltqKytdICsgc3RyW2orK107XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyW2pdID09PSBcIilcIikge1xuICAgICAgICAgIGNvdW50LS07XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyW2pdID09PSBcIihcIikge1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgaWYgKHN0cltqICsgMV0gIT09IFwiP1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYXB0dXJpbmcgZ3JvdXBzIGFyZSBub3QgYWxsb3dlZCBhdCAke2p9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcGF0dGVybiArPSBzdHJbaisrXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdW50KSB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmJhbGFuY2VkIHBhdHRlcm4gYXQgJHtpfWApO1xuICAgICAgaWYgKCFwYXR0ZXJuKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBNaXNzaW5nIHBhdHRlcm4gYXQgJHtpfWApO1xuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwiUEFUVEVSTlwiLCBpbmRleDogaSwgdmFsdWU6IHBhdHRlcm4gfSk7XG4gICAgICBpID0gajtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHsgdHlwZTogXCJDSEFSXCIsIGluZGV4OiBpLCB2YWx1ZTogc3RyW2krK10gfSk7XG4gIH1cblxuICB0b2tlbnMucHVzaCh7IHR5cGU6IFwiRU5EXCIsIGluZGV4OiBpLCB2YWx1ZTogXCJcIiB9KTtcblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgZGVsaW1pdGVyIGZvciByZXBlYXQgcGFyYW1ldGVycy4gKGRlZmF1bHQ6IGAnLydgKVxuICAgKi9cbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGF1dG9tYXRpY2FsbHkgY29uc2lkZXIgcHJlZml4ZXMgd2hlbiBwYXJzaW5nLlxuICAgKi9cbiAgcHJlZml4ZXM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgYSBzdHJpbmcgZm9yIHRoZSByYXcgdG9rZW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Uoc3RyOiBzdHJpbmcsIG9wdGlvbnM6IFBhcnNlT3B0aW9ucyA9IHt9KTogVG9rZW5bXSB7XG4gIGNvbnN0IHRva2VucyA9IGxleGVyKHN0cik7XG4gIGNvbnN0IHsgcHJlZml4ZXMgPSBcIi4vXCIsIGRlbGltaXRlciA9IFwiLyM/XCIgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlc3VsdDogVG9rZW5bXSA9IFtdO1xuICBsZXQga2V5ID0gMDtcbiAgbGV0IGkgPSAwO1xuICBsZXQgcGF0aCA9IFwiXCI7XG5cbiAgY29uc3QgdHJ5Q29uc3VtZSA9ICh0eXBlOiBMZXhUb2tlbltcInR5cGVcIl0pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChpIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaV0udHlwZSA9PT0gdHlwZSkgcmV0dXJuIHRva2Vuc1tpKytdLnZhbHVlO1xuICB9O1xuXG4gIGNvbnN0IG11c3RDb25zdW1lID0gKHR5cGU6IExleFRva2VuW1widHlwZVwiXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0cnlDb25zdW1lKHR5cGUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgeyB0eXBlOiBuZXh0VHlwZSwgaW5kZXggfSA9IHRva2Vuc1tpXTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmV4cGVjdGVkICR7bmV4dFR5cGV9IGF0ICR7aW5kZXh9LCBleHBlY3RlZCAke3R5cGV9YCk7XG4gIH07XG5cbiAgY29uc3QgY29uc3VtZVRleHQgPSAoKTogc3RyaW5nID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB3aGlsZSAoKHZhbHVlID0gdHJ5Q29uc3VtZShcIkNIQVJcIikgfHwgdHJ5Q29uc3VtZShcIkVTQ0FQRURfQ0hBUlwiKSkpIHtcbiAgICAgIHJlc3VsdCArPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCBpc1NhZmUgPSAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBkZWxpbWl0ZXIpIGlmICh2YWx1ZS5pbmRleE9mKGNoYXIpID4gLTEpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBzYWZlUGF0dGVybiA9IChwcmVmaXg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHByZXYgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHByZXZUZXh0ID0gcHJlZml4IHx8IChwcmV2ICYmIHR5cGVvZiBwcmV2ID09PSBcInN0cmluZ1wiID8gcHJldiA6IFwiXCIpO1xuXG4gICAgaWYgKHByZXYgJiYgIXByZXZUZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgTXVzdCBoYXZlIHRleHQgYmV0d2VlbiB0d28gcGFyYW1ldGVycywgbWlzc2luZyB0ZXh0IGFmdGVyIFwiJHsocHJldiBhcyBLZXkpLm5hbWV9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXByZXZUZXh0IHx8IGlzU2FmZShwcmV2VGV4dCkpIHJldHVybiBgW14ke2VzY2FwZVN0cmluZyhkZWxpbWl0ZXIpfV0rP2A7XG4gICAgcmV0dXJuIGAoPzooPyEke2VzY2FwZVN0cmluZyhwcmV2VGV4dCl9KVteJHtlc2NhcGVTdHJpbmcoZGVsaW1pdGVyKX1dKSs/YDtcbiAgfTtcblxuICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gdHJ5Q29uc3VtZShcIkNIQVJcIik7XG4gICAgY29uc3QgbmFtZSA9IHRyeUNvbnN1bWUoXCJOQU1FXCIpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0cnlDb25zdW1lKFwiUEFUVEVSTlwiKTtcblxuICAgIGlmIChuYW1lIHx8IHBhdHRlcm4pIHtcbiAgICAgIGxldCBwcmVmaXggPSBjaGFyIHx8IFwiXCI7XG5cbiAgICAgIGlmIChwcmVmaXhlcy5pbmRleE9mKHByZWZpeCkgPT09IC0xKSB7XG4gICAgICAgIHBhdGggKz0gcHJlZml4O1xuICAgICAgICBwcmVmaXggPSBcIlwiO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF0aCkge1xuICAgICAgICByZXN1bHQucHVzaChwYXRoKTtcbiAgICAgICAgcGF0aCA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSB8fCBrZXkrKyxcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBzdWZmaXg6IFwiXCIsXG4gICAgICAgIHBhdHRlcm46IHBhdHRlcm4gfHwgc2FmZVBhdHRlcm4ocHJlZml4KSxcbiAgICAgICAgbW9kaWZpZXI6IHRyeUNvbnN1bWUoXCJNT0RJRklFUlwiKSB8fCBcIlwiLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGNoYXIgfHwgdHJ5Q29uc3VtZShcIkVTQ0FQRURfQ0hBUlwiKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHBhdGggKz0gdmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgICAgcmVzdWx0LnB1c2gocGF0aCk7XG4gICAgICBwYXRoID0gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuID0gdHJ5Q29uc3VtZShcIk9QRU5cIik7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IGNvbnN1bWVUZXh0KCk7XG4gICAgICBjb25zdCBuYW1lID0gdHJ5Q29uc3VtZShcIk5BTUVcIikgfHwgXCJcIjtcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSB0cnlDb25zdW1lKFwiUEFUVEVSTlwiKSB8fCBcIlwiO1xuICAgICAgY29uc3Qgc3VmZml4ID0gY29uc3VtZVRleHQoKTtcblxuICAgICAgbXVzdENvbnN1bWUoXCJDTE9TRVwiKTtcblxuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lIHx8IChwYXR0ZXJuID8ga2V5KysgOiBcIlwiKSxcbiAgICAgICAgcGF0dGVybjogbmFtZSAmJiAhcGF0dGVybiA/IHNhZmVQYXR0ZXJuKHByZWZpeCkgOiBwYXR0ZXJuLFxuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHN1ZmZpeCxcbiAgICAgICAgbW9kaWZpZXI6IHRyeUNvbnN1bWUoXCJNT0RJRklFUlwiKSB8fCBcIlwiLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBtdXN0Q29uc3VtZShcIkVORFwiKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5zVG9GdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgdGhlIHJlZ2V4cCB3aWxsIGJlIGNhc2Ugc2Vuc2l0aXZlLiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIHNlbnNpdGl2ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmb3IgZW5jb2RpbmcgaW5wdXQgc3RyaW5ncyBmb3Igb3V0cHV0LlxuICAgKi9cbiAgZW5jb2RlPzogKHZhbHVlOiBzdHJpbmcsIHRva2VuOiBLZXkpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCB0aGUgZnVuY3Rpb24gY2FuIHByb2R1Y2UgYW4gaW52YWxpZCAodW5tYXRjaGVkKSBwYXRoLiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgdmFsaWRhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBzdHJpbmcgdG8gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGhlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlPFAgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+KFxuICBzdHI6IHN0cmluZyxcbiAgb3B0aW9ucz86IFBhcnNlT3B0aW9ucyAmIFRva2Vuc1RvRnVuY3Rpb25PcHRpb25zLFxuKSB7XG4gIHJldHVybiB0b2tlbnNUb0Z1bmN0aW9uPFA+KHBhcnNlKHN0ciwgb3B0aW9ucyksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgdHlwZSBQYXRoRnVuY3Rpb248UCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPSAoZGF0YT86IFApID0+IHN0cmluZztcblxuLyoqXG4gKiBFeHBvc2UgYSBtZXRob2QgZm9yIHRyYW5zZm9ybWluZyB0b2tlbnMgaW50byB0aGUgcGF0aCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2Vuc1RvRnVuY3Rpb248UCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4oXG4gIHRva2VuczogVG9rZW5bXSxcbiAgb3B0aW9uczogVG9rZW5zVG9GdW5jdGlvbk9wdGlvbnMgPSB7fSxcbik6IFBhdGhGdW5jdGlvbjxQPiB7XG4gIGNvbnN0IHJlRmxhZ3MgPSBmbGFncyhvcHRpb25zKTtcbiAgY29uc3QgeyBlbmNvZGUgPSAoeDogc3RyaW5nKSA9PiB4LCB2YWxpZGF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHRva2VucyBpbnRvIHJlZ2V4cHMuXG4gIGNvbnN0IG1hdGNoZXMgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKD86JHt0b2tlbi5wYXR0ZXJufSkkYCwgcmVGbGFncyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gKGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgbGV0IHBhdGggPSBcIlwiO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBhdGggKz0gdG9rZW47XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGEgPyBkYXRhW3Rva2VuLm5hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgb3B0aW9uYWwgPSB0b2tlbi5tb2RpZmllciA9PT0gXCI/XCIgfHwgdG9rZW4ubW9kaWZpZXIgPT09IFwiKlwiO1xuICAgICAgY29uc3QgcmVwZWF0ID0gdG9rZW4ubW9kaWZpZXIgPT09IFwiKlwiIHx8IHRva2VuLm1vZGlmaWVyID09PSBcIitcIjtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlmICghcmVwZWF0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBcIiR7dG9rZW4ubmFtZX1cIiB0byBub3QgcmVwZWF0LCBidXQgZ290IGFuIGFycmF5YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmIChvcHRpb25hbCkgY29udGludWU7XG5cbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcIiR7dG9rZW4ubmFtZX1cIiB0byBub3QgYmUgZW1wdHlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBjb25zdCBzZWdtZW50ID0gZW5jb2RlKHZhbHVlW2pdLCB0b2tlbik7XG5cbiAgICAgICAgICBpZiAodmFsaWRhdGUgJiYgIShtYXRjaGVzW2ldIGFzIFJlZ0V4cCkudGVzdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYEV4cGVjdGVkIGFsbCBcIiR7dG9rZW4ubmFtZX1cIiB0byBtYXRjaCBcIiR7dG9rZW4ucGF0dGVybn1cIiwgYnV0IGdvdCBcIiR7c2VnbWVudH1cImAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4ICsgc2VnbWVudCArIHRva2VuLnN1ZmZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gZW5jb2RlKFN0cmluZyh2YWx1ZSksIHRva2VuKTtcblxuICAgICAgICBpZiAodmFsaWRhdGUgJiYgIShtYXRjaGVzW2ldIGFzIFJlZ0V4cCkudGVzdChzZWdtZW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgXCIke3Rva2VuLm5hbWV9XCIgdG8gbWF0Y2ggXCIke3Rva2VuLnBhdHRlcm59XCIsIGJ1dCBnb3QgXCIke3NlZ21lbnR9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXRoICs9IHRva2VuLnByZWZpeCArIHNlZ21lbnQgKyB0b2tlbi5zdWZmaXg7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9uYWwpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB0eXBlT2ZNZXNzYWdlID0gcmVwZWF0ID8gXCJhbiBhcnJheVwiIDogXCJhIHN0cmluZ1wiO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXCIke3Rva2VuLm5hbWV9XCIgdG8gYmUgJHt0eXBlT2ZNZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2V4cFRvRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGZvciBkZWNvZGluZyBzdHJpbmdzIGZvciBwYXJhbXMuXG4gICAqL1xuICBkZWNvZGU/OiAodmFsdWU6IHN0cmluZywgdG9rZW46IEtleSkgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbWF0Y2ggcmVzdWx0IGNvbnRhaW5zIGRhdGEgYWJvdXQgdGhlIHBhdGggbWF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hSZXN1bHQ8UCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICBwYXRoOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHBhcmFtczogUDtcbn1cblxuLyoqXG4gKiBBIG1hdGNoIGlzIGVpdGhlciBgZmFsc2VgIChubyBtYXRjaCkgb3IgYSBtYXRjaCByZXN1bHQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hdGNoPFAgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+ID0gZmFsc2UgfCBNYXRjaFJlc3VsdDxQPjtcblxuLyoqXG4gKiBUaGUgbWF0Y2ggZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgd2hldGhlciBpdCBtYXRjaGVkIHRoZSBwYXRoLlxuICovXG5leHBvcnQgdHlwZSBNYXRjaEZ1bmN0aW9uPFAgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+ID0gKFxuICBwYXRoOiBzdHJpbmcsXG4pID0+IE1hdGNoPFA+O1xuXG4vKipcbiAqIENyZWF0ZSBwYXRoIG1hdGNoIGZ1bmN0aW9uIGZyb20gYHBhdGgtdG8tcmVnZXhwYCBzcGVjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2g8UCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4oXG4gIHN0cjogUGF0aCxcbiAgb3B0aW9ucz86IFBhcnNlT3B0aW9ucyAmIFRva2Vuc1RvUmVnZXhwT3B0aW9ucyAmIFJlZ2V4cFRvRnVuY3Rpb25PcHRpb25zLFxuKSB7XG4gIGNvbnN0IGtleXM6IEtleVtdID0gW107XG4gIGNvbnN0IHJlID0gcGF0aFRvUmVnZXhwKHN0ciwga2V5cywgb3B0aW9ucyk7XG4gIHJldHVybiByZWdleHBUb0Z1bmN0aW9uPFA+KHJlLCBrZXlzLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwYXRoIG1hdGNoIGZ1bmN0aW9uIGZyb20gYHBhdGgtdG8tcmVnZXhwYCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdleHBUb0Z1bmN0aW9uPFAgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+KFxuICByZTogUmVnRXhwLFxuICBrZXlzOiBLZXlbXSxcbiAgb3B0aW9uczogUmVnZXhwVG9GdW5jdGlvbk9wdGlvbnMgPSB7fSxcbik6IE1hdGNoRnVuY3Rpb248UD4ge1xuICBjb25zdCB7IGRlY29kZSA9ICh4OiBzdHJpbmcpID0+IHggfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbSA9IHJlLmV4ZWMocGF0aG5hbWUpO1xuICAgIGlmICghbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgeyAwOiBwYXRoLCBpbmRleCB9ID0gbTtcbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobVtpXSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpIC0gMV07XG5cbiAgICAgIGlmIChrZXkubW9kaWZpZXIgPT09IFwiKlwiIHx8IGtleS5tb2RpZmllciA9PT0gXCIrXCIpIHtcbiAgICAgICAgcGFyYW1zW2tleS5uYW1lXSA9IG1baV0uc3BsaXQoa2V5LnByZWZpeCArIGtleS5zdWZmaXgpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlKHZhbHVlLCBrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtc1trZXkubmFtZV0gPSBkZWNvZGUobVtpXSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBwYXRoLCBpbmRleCwgcGFyYW1zIH07XG4gIH07XG59XG5cbi8qKlxuICogRXNjYXBlIGEgcmVndWxhciBleHByZXNzaW9uIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKyo/PV4hOiR7fSgpW1xcXXwvXFxcXF0pL2csIFwiXFxcXCQxXCIpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZmxhZ3MgZm9yIGEgcmVnZXhwIGZyb20gdGhlIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGZsYWdzKG9wdGlvbnM/OiB7IHNlbnNpdGl2ZT86IGJvb2xlYW4gfSkge1xuICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLnNlbnNpdGl2ZSA/IFwiXCIgOiBcImlcIjtcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCBhIGtleS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXkge1xuICBuYW1lOiBzdHJpbmcgfCBudW1iZXI7XG4gIHByZWZpeDogc3RyaW5nO1xuICBzdWZmaXg6IHN0cmluZztcbiAgcGF0dGVybjogc3RyaW5nO1xuICBtb2RpZmllcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdG9rZW4gaXMgYSBzdHJpbmcgKG5vdGhpbmcgc3BlY2lhbCkgb3Iga2V5IG1ldGFkYXRhIChjYXB0dXJlIGdyb3VwKS5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW4gPSBzdHJpbmcgfCBLZXk7XG5cbi8qKlxuICogUHVsbCBvdXQga2V5cyBmcm9tIGEgcmVnZXhwLlxuICovXG5mdW5jdGlvbiByZWdleHBUb1JlZ2V4cChwYXRoOiBSZWdFeHAsIGtleXM/OiBLZXlbXSk6IFJlZ0V4cCB7XG4gIGlmICgha2V5cykgcmV0dXJuIHBhdGg7XG5cbiAgY29uc3QgZ3JvdXBzUmVnZXggPSAvXFwoKD86XFw/PCguKj8pPik/KD8hXFw/KS9nO1xuXG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBleGVjUmVzdWx0ID0gZ3JvdXBzUmVnZXguZXhlYyhwYXRoLnNvdXJjZSk7XG4gIHdoaWxlIChleGVjUmVzdWx0KSB7XG4gICAga2V5cy5wdXNoKHtcbiAgICAgIC8vIFVzZSBwYXJlbnRoZXNpemVkIHN1YnN0cmluZyBtYXRjaCBpZiBhdmFpbGFibGUsIGluZGV4IG90aGVyd2lzZVxuICAgICAgbmFtZTogZXhlY1Jlc3VsdFsxXSB8fCBpbmRleCsrLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgICAgc3VmZml4OiBcIlwiLFxuICAgICAgbW9kaWZpZXI6IFwiXCIsXG4gICAgICBwYXR0ZXJuOiBcIlwiLFxuICAgIH0pO1xuICAgIGV4ZWNSZXN1bHQgPSBncm91cHNSZWdleC5leGVjKHBhdGguc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiBwYXRoO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheSBpbnRvIGEgcmVnZXhwLlxuICovXG5mdW5jdGlvbiBhcnJheVRvUmVnZXhwKFxuICBwYXRoczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPixcbiAga2V5cz86IEtleVtdLFxuICBvcHRpb25zPzogVG9rZW5zVG9SZWdleHBPcHRpb25zICYgUGFyc2VPcHRpb25zLFxuKTogUmVnRXhwIHtcbiAgY29uc3QgcGFydHMgPSBwYXRocy5tYXAoKHBhdGgpID0+IHBhdGhUb1JlZ2V4cChwYXRoLCBrZXlzLCBvcHRpb25zKS5zb3VyY2UpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgKD86JHtwYXJ0cy5qb2luKFwifFwiKX0pYCwgZmxhZ3Mob3B0aW9ucykpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHBhdGggcmVnZXhwIGZyb20gc3RyaW5nIGlucHV0LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb1JlZ2V4cChcbiAgcGF0aDogc3RyaW5nLFxuICBrZXlzPzogS2V5W10sXG4gIG9wdGlvbnM/OiBUb2tlbnNUb1JlZ2V4cE9wdGlvbnMgJiBQYXJzZU9wdGlvbnMsXG4pIHtcbiAgcmV0dXJuIHRva2Vuc1RvUmVnZXhwKHBhcnNlKHBhdGgsIG9wdGlvbnMpLCBrZXlzLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlbnNUb1JlZ2V4cE9wdGlvbnMge1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgdGhlIHJlZ2V4cCB3aWxsIGJlIGNhc2Ugc2Vuc2l0aXZlLiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIHNlbnNpdGl2ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCB0aGUgcmVnZXhwIHdvbid0IGFsbG93IGFuIG9wdGlvbmFsIHRyYWlsaW5nIGRlbGltaXRlciB0byBtYXRjaC4gKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBzdHJpY3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgdGhlIHJlZ2V4cCB3aWxsIG1hdGNoIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCB0aGUgcmVnZXhwIHdpbGwgbWF0Y2ggZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBzdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmaW5hbCBjaGFyYWN0ZXIgZm9yIG5vbi1lbmRpbmcgb3B0aW1pc3RpYyBtYXRjaGVzLiAoZGVmYXVsdDogYC9gKVxuICAgKi9cbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGFsc28gYmUgXCJlbmRcIiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgZW5kc1dpdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFbmNvZGUgcGF0aCB0b2tlbnMgZm9yIHVzZSBpbiB0aGUgYFJlZ0V4cGAuXG4gICAqL1xuICBlbmNvZGU/OiAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4cG9zZSBhIGZ1bmN0aW9uIGZvciB0YWtpbmcgdG9rZW5zIGFuZCByZXR1cm5pbmcgYSBSZWdFeHAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbnNUb1JlZ2V4cChcbiAgdG9rZW5zOiBUb2tlbltdLFxuICBrZXlzPzogS2V5W10sXG4gIG9wdGlvbnM6IFRva2Vuc1RvUmVnZXhwT3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBzdHJpY3QgPSBmYWxzZSxcbiAgICBzdGFydCA9IHRydWUsXG4gICAgZW5kID0gdHJ1ZSxcbiAgICBlbmNvZGUgPSAoeDogc3RyaW5nKSA9PiB4LFxuICAgIGRlbGltaXRlciA9IFwiLyM/XCIsXG4gICAgZW5kc1dpdGggPSBcIlwiLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5kc1dpdGhSZSA9IGBbJHtlc2NhcGVTdHJpbmcoZW5kc1dpdGgpfV18JGA7XG4gIGNvbnN0IGRlbGltaXRlclJlID0gYFske2VzY2FwZVN0cmluZyhkZWxpbWl0ZXIpfV1gO1xuICBsZXQgcm91dGUgPSBzdGFydCA/IFwiXlwiIDogXCJcIjtcblxuICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRva2VucyBhbmQgY3JlYXRlIG91ciByZWdleHAgc3RyaW5nLlxuICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJvdXRlICs9IGVzY2FwZVN0cmluZyhlbmNvZGUodG9rZW4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ID0gZXNjYXBlU3RyaW5nKGVuY29kZSh0b2tlbi5wcmVmaXgpKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGVzY2FwZVN0cmluZyhlbmNvZGUodG9rZW4uc3VmZml4KSk7XG5cbiAgICAgIGlmICh0b2tlbi5wYXR0ZXJuKSB7XG4gICAgICAgIGlmIChrZXlzKSBrZXlzLnB1c2godG9rZW4pO1xuXG4gICAgICAgIGlmIChwcmVmaXggfHwgc3VmZml4KSB7XG4gICAgICAgICAgaWYgKHRva2VuLm1vZGlmaWVyID09PSBcIitcIiB8fCB0b2tlbi5tb2RpZmllciA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IHRva2VuLm1vZGlmaWVyID09PSBcIipcIiA/IFwiP1wiIDogXCJcIjtcbiAgICAgICAgICAgIHJvdXRlICs9IGAoPzoke3ByZWZpeH0oKD86JHt0b2tlbi5wYXR0ZXJufSkoPzoke3N1ZmZpeH0ke3ByZWZpeH0oPzoke3Rva2VuLnBhdHRlcm59KSkqKSR7c3VmZml4fSkke21vZH1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3V0ZSArPSBgKD86JHtwcmVmaXh9KCR7dG9rZW4ucGF0dGVybn0pJHtzdWZmaXh9KSR7dG9rZW4ubW9kaWZpZXJ9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRva2VuLm1vZGlmaWVyID09PSBcIitcIiB8fCB0b2tlbi5tb2RpZmllciA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIGBDYW4gbm90IHJlcGVhdCBcIiR7dG9rZW4ubmFtZX1cIiB3aXRob3V0IGEgcHJlZml4IGFuZCBzdWZmaXhgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3V0ZSArPSBgKCR7dG9rZW4ucGF0dGVybn0pJHt0b2tlbi5tb2RpZmllcn1gO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3V0ZSArPSBgKD86JHtwcmVmaXh9JHtzdWZmaXh9KSR7dG9rZW4ubW9kaWZpZXJ9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5kKSB7XG4gICAgaWYgKCFzdHJpY3QpIHJvdXRlICs9IGAke2RlbGltaXRlclJlfT9gO1xuXG4gICAgcm91dGUgKz0gIW9wdGlvbnMuZW5kc1dpdGggPyBcIiRcIiA6IGAoPz0ke2VuZHNXaXRoUmV9KWA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZW5kVG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGlzRW5kRGVsaW1pdGVkID1cbiAgICAgIHR5cGVvZiBlbmRUb2tlbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRlbGltaXRlclJlLmluZGV4T2YoZW5kVG9rZW5bZW5kVG9rZW4ubGVuZ3RoIC0gMV0pID4gLTFcbiAgICAgICAgOiBlbmRUb2tlbiA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFzdHJpY3QpIHtcbiAgICAgIHJvdXRlICs9IGAoPzoke2RlbGltaXRlclJlfSg/PSR7ZW5kc1dpdGhSZX0pKT9gO1xuICAgIH1cblxuICAgIGlmICghaXNFbmREZWxpbWl0ZWQpIHtcbiAgICAgIHJvdXRlICs9IGAoPz0ke2RlbGltaXRlclJlfXwke2VuZHNXaXRoUmV9KWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocm91dGUsIGZsYWdzKG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBTdXBwb3J0ZWQgYHBhdGgtdG8tcmVnZXhwYCBpbnB1dCB0eXBlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGF0aCA9IHN0cmluZyB8IFJlZ0V4cCB8IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBnaXZlbiBwYXRoIHN0cmluZywgcmV0dXJuaW5nIGEgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEFuIGVtcHR5IGFycmF5IGNhbiBiZSBwYXNzZWQgaW4gZm9yIHRoZSBrZXlzLCB3aGljaCB3aWxsIGhvbGQgdGhlXG4gKiBwbGFjZWhvbGRlciBrZXkgZGVzY3JpcHRpb25zLiBGb3IgZXhhbXBsZSwgdXNpbmcgYC91c2VyLzppZGAsIGBrZXlzYCB3aWxsXG4gKiBjb250YWluIGBbeyBuYW1lOiAnaWQnLCBkZWxpbWl0ZXI6ICcvJywgb3B0aW9uYWw6IGZhbHNlLCByZXBlYXQ6IGZhbHNlIH1dYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhUb1JlZ2V4cChcbiAgcGF0aDogUGF0aCxcbiAga2V5cz86IEtleVtdLFxuICBvcHRpb25zPzogVG9rZW5zVG9SZWdleHBPcHRpb25zICYgUGFyc2VPcHRpb25zLFxuKSB7XG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gcmVnZXhwVG9SZWdleHAocGF0aCwga2V5cyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSByZXR1cm4gYXJyYXlUb1JlZ2V4cChwYXRoLCBrZXlzLCBvcHRpb25zKTtcbiAgcmV0dXJuIHN0cmluZ1RvUmVnZXhwKHBhdGgsIGtleXMsIG9wdGlvbnMpO1xufVxuIiwgImNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQnVmZmVyKHRleHQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2Rlci5lbmNvZGUodGV4dClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyLCBlbmNvZGluZz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpXG4gIHJldHVybiBkZWNvZGVyLmRlY29kZShidWZmZXIpXG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBBcnJheUJ1ZmZlcmAgZnJvbSB0aGUgZ2l2ZW4gYFVpbnQ4QXJyYXlgLlxuICogVGFrZXMgdGhlIGJ5dGUgb2Zmc2V0IGludG8gYWNjb3VudCB0byBwcm9kdWNlIHRoZSByaWdodCBidWZmZXJcbiAqIGluIHRoZSBjYXNlIHdoZW4gdGhlIGJ1ZmZlciBpcyBiaWdnZXIgdGhhbiB0aGUgZGF0YSB2aWV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheUJ1ZmZlcihhcnJheTogVWludDhBcnJheSk6IEFycmF5QnVmZmVyIHtcbiAgcmV0dXJuIGFycmF5LmJ1ZmZlci5zbGljZShcbiAgICBhcnJheS5ieXRlT2Zmc2V0LFxuICAgIGFycmF5LmJ5dGVPZmZzZXQgKyBhcnJheS5ieXRlTGVuZ3RoXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250cm9sbGVyIH0gZnJvbSAnLi9SZXF1ZXN0Q29udHJvbGxlcidcblxuZXhwb3J0IGNvbnN0IElTX1BBVENIRURfTU9EVUxFOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdpc1BhdGNoZWRNb2R1bGUnKVxuXG4vKipcbiAqIEBub3RlIEV4cG9ydCBgUmVxdWVzdENvbnRyb2xsZXJgIGFzIGEgdHlwZSBvbmx5LlxuICogSXQncyBuZXZlciBtZWFudCB0byBiZSBjcmVhdGVkIGluIHRoZSB1c2VybGFuZC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZXF1ZXN0Q29udHJvbGxlciB9XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RDcmVkZW50aWFscyA9ICdvbWl0JyB8ICdpbmNsdWRlJyB8ICdzYW1lLW9yaWdpbidcblxuZXhwb3J0IHR5cGUgSHR0cFJlcXVlc3RFdmVudE1hcCA9IHtcbiAgcmVxdWVzdDogW1xuICAgIGFyZ3M6IHtcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgICBjb250cm9sbGVyOiBSZXF1ZXN0Q29udHJvbGxlclxuICAgIH1cbiAgXVxuICByZXNwb25zZTogW1xuICAgIGFyZ3M6IHtcbiAgICAgIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgICAgaXNNb2NrZWRSZXNwb25zZTogYm9vbGVhblxuICAgICAgcmVxdWVzdDogUmVxdWVzdFxuICAgICAgcmVxdWVzdElkOiBzdHJpbmdcbiAgICB9XG4gIF1cbiAgdW5oYW5kbGVkRXhjZXB0aW9uOiBbXG4gICAgYXJnczoge1xuICAgICAgZXJyb3I6IHVua25vd25cbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgICBjb250cm9sbGVyOiBSZXF1ZXN0Q29udHJvbGxlclxuICAgIH1cbiAgXVxufVxuIiwgImltcG9ydCB7IERlZmVycmVkUHJvbWlzZSB9IGZyb20gJ0BvcGVuLWRyYWZ0L2RlZmVycmVkLXByb21pc2UnXG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdvdXR2YXJpYW50J1xuaW1wb3J0IHsgSW50ZXJjZXB0b3JFcnJvciB9IGZyb20gJy4vSW50ZXJjZXB0b3JFcnJvcidcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0Q29udHJvbGxlclNvdXJjZSB7XG4gIHBhc3N0aHJvdWdoKCk6IHZvaWRcbiAgcmVzcG9uZFdpdGgocmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZFxuICBlcnJvcldpdGgocmVhc29uPzogdW5rbm93bik6IHZvaWRcbn1cblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb250cm9sbGVyIHtcbiAgc3RhdGljIFBFTkRJTkcgPSAwIGFzIGNvbnN0XG4gIHN0YXRpYyBQQVNTVEhST1VHSCA9IDEgYXMgY29uc3RcbiAgc3RhdGljIFJFU1BPTlNFID0gMiBhcyBjb25zdFxuICBzdGF0aWMgRVJST1IgPSAzIGFzIGNvbnN0XG5cbiAgcHVibGljIHJlYWR5U3RhdGU6IG51bWJlclxuXG4gIC8qKlxuICAgKiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoaXMgY29udHJvbGxlciBoYW5kbGVzIGEgcmVxdWVzdC5cbiAgICogU2VlIGBjb250cm9sbGVyLnJlYWR5U3RhdGVgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBoYW5kbGluZyByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlZDogUHJvbWlzZTx2b2lkPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBzb3VyY2U6IFJlcXVlc3RDb250cm9sbGVyU291cmNlXG4gICkge1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlcXVlc3RDb250cm9sbGVyLlBFTkRJTkdcbiAgICB0aGlzLmhhbmRsZWQgPSBuZXcgRGVmZXJyZWRQcm9taXNlPHZvaWQ+KClcbiAgfVxuXG4gIGdldCAjaGFuZGxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVkIGFzIERlZmVycmVkUHJvbWlzZTx2b2lkPlxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhpcyByZXF1ZXN0IGFzLWlzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBhc3N0aHJvdWdoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGludmFyaWFudC5hcyhcbiAgICAgIEludGVyY2VwdG9yRXJyb3IsXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFJlcXVlc3RDb250cm9sbGVyLlBFTkRJTkcsXG4gICAgICAnRmFpbGVkIHRvIHBhc3N0aHJvdWdoIHRoZSBcIiVzICVzXCIgcmVxdWVzdDogdGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkJyxcbiAgICAgIHRoaXMucmVxdWVzdC5tZXRob2QsXG4gICAgICB0aGlzLnJlcXVlc3QudXJsXG4gICAgKVxuXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gUmVxdWVzdENvbnRyb2xsZXIuUEFTU1RIUk9VR0hcbiAgICBhd2FpdCB0aGlzLnNvdXJjZS5wYXNzdGhyb3VnaCgpXG4gICAgdGhpcy4jaGFuZGxlZC5yZXNvbHZlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kIHRvIHRoaXMgcmVxdWVzdCB3aXRoIHRoZSBnaXZlbiBgUmVzcG9uc2VgIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb250cm9sbGVyLnJlc3BvbmRXaXRoKG5ldyBSZXNwb25zZSgpKVxuICAgKiBjb250cm9sbGVyLnJlc3BvbmRXaXRoKFJlc3BvbnNlLmpzb24oeyBpZCB9KSlcbiAgICogY29udHJvbGxlci5yZXNwb25kV2l0aChSZXNwb25zZS5lcnJvcigpKVxuICAgKi9cbiAgcHVibGljIHJlc3BvbmRXaXRoKHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICAgIGludmFyaWFudC5hcyhcbiAgICAgIEludGVyY2VwdG9yRXJyb3IsXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFJlcXVlc3RDb250cm9sbGVyLlBFTkRJTkcsXG4gICAgICAnRmFpbGVkIHRvIHJlc3BvbmQgdG8gdGhlIFwiJXMgJXNcIiByZXF1ZXN0IHdpdGggXCIlZCAlc1wiOiB0aGUgcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgKCVkKScsXG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kLFxuICAgICAgdGhpcy5yZXF1ZXN0LnVybCxcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgfHwgJ09LJyxcbiAgICAgIHRoaXMucmVhZHlTdGF0ZVxuICAgIClcblxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlcXVlc3RDb250cm9sbGVyLlJFU1BPTlNFXG4gICAgdGhpcy4jaGFuZGxlZC5yZXNvbHZlKClcblxuICAgIC8qKlxuICAgICAqIEBub3RlIEFsdGhvdWdoIGBzb3VyY2UucmVzcG9uZFdpdGgoKWAgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLFxuICAgICAqIGRvIE5PVCBhd2FpdCBpdCBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4gQXdhaXRpbmcgaXQgd2lsbCBzaG9ydC1jaXJjdWl0XG4gICAgICogdGhlIHJlcXVlc3QgbGlzdGVuZXIgaW52b2NhdGlvbiBhcyBzb29uIGFzIGEgbGlzdGVuZXIgcmVzcG9uZHMgdG8gYSByZXF1ZXN0LlxuICAgICAqIElkZWFsbHksIHRoYXQncyB3aGF0IHdlIHdhbnQsIGJ1dCB0aGF0J3Mgbm90IHdoYXQgd2UgcHJvbWlzZSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICB0aGlzLnNvdXJjZS5yZXNwb25kV2l0aChyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFcnJvciB0aGlzIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcmVhc29uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb250cm9sbGVyLmVycm9yV2l0aCgpXG4gICAqIGNvbnRyb2xsZXIuZXJyb3JXaXRoKG5ldyBFcnJvcignT29wcyEnKSlcbiAgICogY29udHJvbGxlci5lcnJvcldpdGgoeyBtZXNzYWdlOiAnT29wcyEnfSlcbiAgICovXG4gIHB1YmxpYyBlcnJvcldpdGgocmVhc29uPzogdW5rbm93bik6IHZvaWQge1xuICAgIGludmFyaWFudC5hcyhcbiAgICAgIEludGVyY2VwdG9yRXJyb3IsXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFJlcXVlc3RDb250cm9sbGVyLlBFTkRJTkcsXG4gICAgICAnRmFpbGVkIHRvIGVycm9yIHRoZSBcIiVzICVzXCIgcmVxdWVzdCB3aXRoIFwiJXNcIjogdGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkICglZCknLFxuICAgICAgdGhpcy5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHRoaXMucmVxdWVzdC51cmwsXG4gICAgICByZWFzb24/LnRvU3RyaW5nKCksXG4gICAgICB0aGlzLnJlYWR5U3RhdGVcbiAgICApXG5cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZXF1ZXN0Q29udHJvbGxlci5FUlJPUlxuICAgIHRoaXMuc291cmNlLmVycm9yV2l0aChyZWFzb24pXG4gICAgdGhpcy4jaGFuZGxlZC5yZXNvbHZlKClcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBJbnRlcmNlcHRvckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnSW50ZXJjZXB0b3JFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSW50ZXJjZXB0b3JFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsICIvKipcbiAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gVVJMIHN0cmluZ1xuICogY2FuIGJlIHBhcnNlZCBpbnRvIGEgYFVSTGAgaW5zdGFuY2UuXG4gKiBBIHN1YnN0aXR1dGUgZm9yIGBVUkwuY2FuUGFyc2UoKWAgZm9yIE5vZGUuanMgMTguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5QYXJzZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBVUkwodXJsKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBiZWhpbmQgdGhlIHN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVN5bWJvbDxUPihcbiAgc3ltYm9sTmFtZTogc3RyaW5nLFxuICBzb3VyY2U6IG9iamVjdFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG93blN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSlcblxuICBjb25zdCBzeW1ib2wgPSBvd25TeW1ib2xzLmZpbmQoKHN5bWJvbCkgPT4ge1xuICAgIHJldHVybiBzeW1ib2wuZGVzY3JpcHRpb24gPT09IHN5bWJvbE5hbWVcbiAgfSlcblxuICBpZiAoc3ltYm9sKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHNvdXJjZSwgc3ltYm9sKVxuICB9XG5cbiAgcmV0dXJuXG59XG4iLCAiaW1wb3J0IHsgY2FuUGFyc2VVcmwgfSBmcm9tICcuL2NhblBhcnNlVXJsJ1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVN5bWJvbCB9IGZyb20gJy4vZ2V0VmFsdWVCeVN5bWJvbCdcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaFJlc3BvbnNlSW5pdCBleHRlbmRzIFJlc3BvbnNlSW5pdCB7XG4gIHVybD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVW5kaWNpRmV0Y2hJbnRlcm5hbFN0YXRlIHtcbiAgYWJvcnRlZDogYm9vbGVhblxuICByYW5nZVJlcXVlc3RlZDogYm9vbGVhblxuICB0aW1pbmdBbGxvd1Bhc3NlZDogYm9vbGVhblxuICByZXF1ZXN0SW5jbHVkZXNDcmVkZW50aWFsczogYm9vbGVhblxuICB0eXBlOiBSZXNwb25zZVR5cGVcbiAgc3RhdHVzOiBudW1iZXJcbiAgc3RhdHVzVGV4dDogc3RyaW5nXG4gIHRpbWluZ0luZm86IHVua25vd25cbiAgY2FjaGVTdGF0ZTogdW5rbm93blxuICBoZWFkZXJzTGlzdDogUmVjb3JkPHN5bWJvbCwgTWFwPHN0cmluZywgdW5rbm93bj4+XG4gIHVybExpc3Q6IEFycmF5PFVSTD5cbiAgYm9keT86IHtcbiAgICBzdHJlYW06IFJlYWRhYmxlU3RyZWFtXG4gICAgc291cmNlOiB1bmtub3duXG4gICAgbGVuZ3RoOiBudW1iZXJcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXNwb25zZSBleHRlbmRzIFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFJlc3BvbnNlIHN0YXR1cyBjb2RlcyBmb3IgcmVzcG9uc2VzIHRoYXQgY2Fubm90IGhhdmUgYm9keS5cbiAgICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jc3RhdHVzZXNcbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfQ09ERVNfV0lUSE9VVF9CT0RZID0gWzEwMSwgMTAzLCAyMDQsIDIwNSwgMzA0XVxuXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfQ09ERVNfV0lUSF9SRURJUkVDVCA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuICBzdGF0aWMgaXNDb25maWd1cmFibGVTdGF0dXNDb2RlKHN0YXR1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDw9IDU5OVxuICB9XG5cbiAgc3RhdGljIGlzUmVkaXJlY3RSZXNwb25zZShzdGF0dXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBGZXRjaFJlc3BvbnNlLlNUQVRVU19DT0RFU19XSVRIX1JFRElSRUNULmluY2x1ZGVzKHN0YXR1cylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIHJlc3BvbnNlIHN0YXR1c1xuICAgKiBjb2RlIHJlcHJlc2VudHMgYSByZXNwb25zZSB0aGF0IGNhbiBoYXZlIGEgYm9keS5cbiAgICovXG4gIHN0YXRpYyBpc1Jlc3BvbnNlV2l0aEJvZHkoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIUZldGNoUmVzcG9uc2UuU1RBVFVTX0NPREVTX1dJVEhPVVRfQk9EWS5pbmNsdWRlcyhzdGF0dXMpXG4gIH1cblxuICBzdGF0aWMgc2V0VXJsKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBpZiAoIXVybCB8fCB1cmwgPT09ICdhYm91dDonIHx8ICFjYW5QYXJzZVVybCh1cmwpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGdldFZhbHVlQnlTeW1ib2w8VW5kaWNpRmV0Y2hJbnRlcm5hbFN0YXRlPignc3RhdGUnLCByZXNwb25zZSlcblxuICAgIGlmIChzdGF0ZSkge1xuICAgICAgLy8gSW4gVW5kaWNpLCBwdXNoIHRoZSBVUkwgdG8gdGhlIGludGVybmFsIGxpc3Qgb2YgVVJMcy5cbiAgICAgIC8vIFRoaXMgd2lsbCByZXNwZWN0IHRoZSBgcmVzcG9uc2UudXJsYCBnZXR0ZXIgbG9naWMgY29ycmVjdGx5LlxuICAgICAgc3RhdGUudXJsTGlzdC5wdXNoKG5ldyBVUkwodXJsKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gb3RoZXIgbGlicmFyaWVzLCByZWRlZmluZSB0aGUgYHVybGAgcHJvcGVydHkgZGlyZWN0bHkuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7XG4gICAgICAgIHZhbHVlOiB1cmwsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBnaXZlbiByYXcgSFRUUCBoZWFkZXJzIGludG8gYSBGZXRjaCBBUEkgYEhlYWRlcnNgIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIHBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzOiBBcnJheTxzdHJpbmc+KTogSGVhZGVycyB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICBmb3IgKGxldCBsaW5lID0gMDsgbGluZSA8IHJhd0hlYWRlcnMubGVuZ3RoOyBsaW5lICs9IDIpIHtcbiAgICAgIGhlYWRlcnMuYXBwZW5kKHJhd0hlYWRlcnNbbGluZV0sIHJhd0hlYWRlcnNbbGluZSArIDFdKVxuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgY29uc3RydWN0b3IoYm9keT86IEJvZHlJbml0IHwgbnVsbCwgaW5pdDogRmV0Y2hSZXNwb25zZUluaXQgPSB7fSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGluaXQuc3RhdHVzID8/IDIwMFxuICAgIGNvbnN0IHNhZmVTdGF0dXMgPSBGZXRjaFJlc3BvbnNlLmlzQ29uZmlndXJhYmxlU3RhdHVzQ29kZShzdGF0dXMpXG4gICAgICA/IHN0YXR1c1xuICAgICAgOiAyMDBcbiAgICBjb25zdCBmaW5hbEJvZHkgPSBGZXRjaFJlc3BvbnNlLmlzUmVzcG9uc2VXaXRoQm9keShzdGF0dXMpID8gYm9keSA6IG51bGxcblxuICAgIHN1cGVyKGZpbmFsQm9keSwge1xuICAgICAgc3RhdHVzOiBzYWZlU3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogaW5pdC5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogaW5pdC5oZWFkZXJzLFxuICAgIH0pXG5cbiAgICBpZiAoc3RhdHVzICE9PSBzYWZlU3RhdHVzKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBub3RlIFVuZGljaSBrZWVwcyBhbiBpbnRlcm5hbCBcIlN5bWJvbChzdGF0ZSlcIiB0aGF0IGhvbGRzXG4gICAgICAgKiB0aGUgYWN0dWFsIHZhbHVlIG9mIHJlc3BvbnNlIHN0YXR1cy4gVXBkYXRlIHRoYXQgaW4gTm9kZS5qcy5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRWYWx1ZUJ5U3ltYm9sPFVuZGljaUZldGNoSW50ZXJuYWxTdGF0ZT4oJ3N0YXRlJywgdGhpcylcblxuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIHN0YXRlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdGF0dXMnLCB7XG4gICAgICAgICAgdmFsdWU6IHN0YXR1cyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgRmV0Y2hSZXNwb25zZS5zZXRVcmwoaW5pdC51cmwsIHRoaXMpXG4gIH1cbn1cbiIsICJjb25zdCBrUmF3UmVxdWVzdCA9IFN5bWJvbCgna1Jhd1JlcXVlc3QnKVxuXG4vKipcbiAqIFJldHVybnMgYSByYXcgcmVxdWVzdCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbnRlcmNlcHRvci5vbigncmVxdWVzdCcsICh7IHJlcXVlc3QgfSkgPT4ge1xuICogICBjb25zdCByYXdSZXF1ZXN0ID0gZ2V0UmF3UmVxdWVzdChyZXF1ZXN0KVxuICpcbiAqICAgaWYgKHJhd1JlcXVlc3QgaW5zdGFuY2VvZiBodHRwLkNsaWVudFJlcXVlc3QpIHtcbiAqICAgICBjb25zb2xlLmxvZyhyYXdSZXF1ZXN0LnJhd0hlYWRlcnMpXG4gKiAgIH1cbiAqIH0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYXdSZXF1ZXN0KHJlcXVlc3Q6IFJlcXVlc3QpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHJlcXVlc3QsIGtSYXdSZXF1ZXN0KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmF3UmVxdWVzdChyZXF1ZXN0OiBSZXF1ZXN0LCByYXdSZXF1ZXN0OiB1bmtub3duKTogdm9pZCB7XG4gIFJlZmxlY3Quc2V0KHJlcXVlc3QsIGtSYXdSZXF1ZXN0LCByYXdSZXF1ZXN0KVxufVxuIiwgImltcG9ydCB7IEV2ZW50TWFwLCBMaXN0ZW5lciB9IGZyb20gJ3N0cmljdC1ldmVudC1lbWl0dGVyJ1xuaW1wb3J0IHsgSW50ZXJjZXB0b3IsIEV4dHJhY3RFdmVudE5hbWVzIH0gZnJvbSAnLi9JbnRlcmNlcHRvcidcblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaEludGVyY2VwdG9yT3B0aW9uczxcbiAgSW50ZXJjZXB0b3JMaXN0IGV4dGVuZHMgUmVhZG9ubHlBcnJheTxJbnRlcmNlcHRvcjxhbnk+PlxuPiB7XG4gIG5hbWU6IHN0cmluZ1xuICBpbnRlcmNlcHRvcnM6IEludGVyY2VwdG9yTGlzdFxufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0RXZlbnRNYXBUeXBlPFxuICBJbnRlcmNlcHRvckxpc3QgZXh0ZW5kcyBSZWFkb25seUFycmF5PEludGVyY2VwdG9yPGFueT4+XG4+ID0gSW50ZXJjZXB0b3JMaXN0IGV4dGVuZHMgUmVhZG9ubHlBcnJheTxpbmZlciBJbnRlcmNlcHRvclR5cGU+XG4gID8gSW50ZXJjZXB0b3JUeXBlIGV4dGVuZHMgSW50ZXJjZXB0b3I8aW5mZXIgRXZlbnRNYXA+XG4gICAgPyBFdmVudE1hcFxuICAgIDogbmV2ZXJcbiAgOiBuZXZlclxuXG4vKipcbiAqIEEgYmF0Y2ggaW50ZXJjZXB0b3IgdGhhdCBleHBvc2VzIGEgc2luZ2xlIGludGVyZmFjZVxuICogdG8gYXBwbHkgYW5kIG9wZXJhdGUgd2l0aCBtdWx0aXBsZSBpbnRlcmNlcHRvcnMgYXQgb25jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhdGNoSW50ZXJjZXB0b3I8XG4gIEludGVyY2VwdG9yTGlzdCBleHRlbmRzIFJlYWRvbmx5QXJyYXk8SW50ZXJjZXB0b3I8YW55Pj4sXG4gIEV2ZW50cyBleHRlbmRzIEV2ZW50TWFwID0gRXh0cmFjdEV2ZW50TWFwVHlwZTxJbnRlcmNlcHRvckxpc3Q+XG4+IGV4dGVuZHMgSW50ZXJjZXB0b3I8RXZlbnRzPiB7XG4gIHN0YXRpYyBzeW1ib2w6IHN5bWJvbFxuXG4gIHByaXZhdGUgaW50ZXJjZXB0b3JzOiBJbnRlcmNlcHRvckxpc3RcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCYXRjaEludGVyY2VwdG9yT3B0aW9uczxJbnRlcmNlcHRvckxpc3Q+KSB7XG4gICAgQmF0Y2hJbnRlcmNlcHRvci5zeW1ib2wgPSBTeW1ib2wob3B0aW9ucy5uYW1lKVxuICAgIHN1cGVyKEJhdGNoSW50ZXJjZXB0b3Iuc3ltYm9sKVxuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gb3B0aW9ucy5pbnRlcmNlcHRvcnNcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cCgpIHtcbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5leHRlbmQoJ3NldHVwJylcblxuICAgIGxvZ2dlci5pbmZvKCdhcHBseWluZyBhbGwgJWQgaW50ZXJjZXB0b3JzLi4uJywgdGhpcy5pbnRlcmNlcHRvcnMubGVuZ3RoKVxuXG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgbG9nZ2VyLmluZm8oJ2FwcGx5aW5nIFwiJXNcIiBpbnRlcmNlcHRvci4uLicsIGludGVyY2VwdG9yLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgICBpbnRlcmNlcHRvci5hcHBseSgpXG5cbiAgICAgIGxvZ2dlci5pbmZvKCdhZGRpbmcgaW50ZXJjZXB0b3IgZGlzcG9zZSBzdWJzY3JpcHRpb24nKVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goKCkgPT4gaW50ZXJjZXB0b3IuZGlzcG9zZSgpKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudDogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgLy8gSW5zdGVhZCBvZiBhZGRpbmcgYSBsaXN0ZW5lciB0byB0aGUgYmF0Y2ggaW50ZXJjZXB0b3IsXG4gICAgLy8gcHJvcGFnYXRlIHRoZSBsaXN0ZW5lciB0byBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIGludGVyY2VwdG9ycy5cbiAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIHRoaXMuaW50ZXJjZXB0b3JzKSB7XG4gICAgICBpbnRlcmNlcHRvci5vbihldmVudCwgbGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIEV4dHJhY3RFdmVudE5hbWVzPEV2ZW50cz4+KFxuICAgIGV2ZW50OiBFdmVudE5hbWUsXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyPEV2ZW50c1tFdmVudE5hbWVdPlxuICApOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIHRoaXMuaW50ZXJjZXB0b3JzKSB7XG4gICAgICBpbnRlcmNlcHRvci5vbmNlKGV2ZW50LCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudDogRXZlbnROYW1lLFxuICAgIGxpc3RlbmVyOiBMaXN0ZW5lcjxFdmVudHNbRXZlbnROYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgaW50ZXJjZXB0b3Iub2ZmKGV2ZW50LCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxFdmVudE5hbWUgZXh0ZW5kcyBFeHRyYWN0RXZlbnROYW1lczxFdmVudHM+PihcbiAgICBldmVudD86IEV2ZW50TmFtZSB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9ycyBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgaW50ZXJjZXB0b3JzLnJlbW92ZUFsbExpc3RlbmVycyhldmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG4iLCAiLyoqXG4gKiBSZW1vdmVzIHF1ZXJ5IHBhcmFtZXRlcnMgYW5kIGhhc2hlcyBmcm9tIGEgZ2l2ZW4gVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xlYW5VcmwodXJsOiBVUkwsIGlzQWJzb2x1dGU6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtpc0Fic29sdXRlICYmIHVybC5vcmlnaW4sIHVybC5wYXRobmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJycpXG59XG4iLCAiY29uc3QgUkVEVU5EQU5UX0NIQVJBQ1RFUlNfRVhQID0gL1s/fCNdLiokL2dcblxuLyoqXG4gKiBSZW1vdmVzIHNlYXJjaCBwYXJhbWV0ZXJzIGFuZCB0aGUgZnJhZ21lbnRcbiAqIGZyb20gYSBnaXZlbiBVUkwgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSWYgdGhlIHBhdGggZW5kcyB3aXRoIGFuIG9wdGlvbmFsIHBhdGggcGFyYW1ldGVyLFxuICAvLyByZXR1cm4gaXQgYXMtaXMuXG4gIGlmIChwYXRoLmVuZHNXaXRoKCc/JykpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCByZW1vdmUgdGhlIHNlYXJjaCBhbmQgZnJhZ21lbnQgZnJvbSBpdC5cbiAgcmV0dXJuIHBhdGgucmVwbGFjZShSRURVTkRBTlRfQ0hBUkFDVEVSU19FWFAsICcnKVxufVxuIiwgIi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gVVJMIHN0cmluZyBpcyBhbiBhYnNvbHV0ZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Fic29sdXRlVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpXG59XG4iLCAiaW1wb3J0IHsgaXNBYnNvbHV0ZVVybCB9IGZyb20gJy4vaXNBYnNvbHV0ZVVybCdcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFic29sdXRlIFVSTCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic29sdXRlVXJsKHBhdGg6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGFscmVhZHkgYWJzb2x1dGUgVVJMXG4gIGlmIChpc0Fic29sdXRlVXJsKHBhdGgpKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8vIElnbm9yZSBwYXRoIHdpdGggcGF0dGVybiBzdGFydCB3aXRoICpcbiAgaWYgKHBhdGguc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8vIFJlc29sdmUgYSByZWxhdGl2ZSByZXF1ZXN0IFVSTCBhZ2FpbnN0IGEgZ2l2ZW4gY3VzdG9tIFwiYmFzZVVybFwiXG4gIC8vIG9yIHRoZSBkb2N1bWVudCBiYXNlVVJJIChpbiB0aGUgY2FzZSBvZiBicm93c2VyL2Jyb3dzZXItbGlrZSBlbnZpcm9ubWVudHMpLlxuICBjb25zdCBvcmlnaW4gPSBiYXNlVXJsIHx8ICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnICYmIGxvY2F0aW9uLmhyZWYpXG5cbiAgcmV0dXJuIG9yaWdpblxuICAgID8gLy8gRW5jb2RlIGFuZCBkZWNvZGUgdGhlIHBhdGggdG8gcHJlc2VydmUgZXNjYXBlZCBjaGFyYWN0ZXJzLlxuICAgICAgZGVjb2RlVVJJKG5ldyBVUkwoZW5jb2RlVVJJKHBhdGgpLCBvcmlnaW4pLmhyZWYpXG4gICAgOiBwYXRoXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSAnLi9tYXRjaFJlcXVlc3RVcmwnXG5pbXBvcnQgeyBjbGVhblVybCB9IGZyb20gJy4uL3VybC9jbGVhblVybCdcbmltcG9ydCB7IGdldEFic29sdXRlVXJsIH0gZnJvbSAnLi4vdXJsL2dldEFic29sdXRlVXJsJ1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBnaXZlbiByZXF1ZXN0IGhhbmRsZXIgcGF0aDpcbiAqIC0gUHJlc2VydmVzIFJlZ0V4cC5cbiAqIC0gUmVtb3ZlcyBxdWVyeSBwYXJhbWV0ZXJzIGFuZCBoYXNoZXMuXG4gKiAtIFJlYmFzZXMgcmVsYXRpdmUgVVJMcyBhZ2FpbnN0IHRoZSBcImJhc2VVcmxcIiBvciB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqIC0gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMgaW4gTm9kZS5qcywgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuXG4gKiAtIFByZXNlcnZlcyBvcHRpb25hbCBwYXRoIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGg6IFBhdGgsIGJhc2VVcmw/OiBzdHJpbmcpOiBQYXRoIHtcbiAgLy8gUmVnRXhwIHBhdGhzIGRvIG5vdCBuZWVkIG5vcm1hbGl6YXRpb24uXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIGNvbnN0IG1heWJlQWJzb2x1dGVVcmwgPSBnZXRBYnNvbHV0ZVVybChwYXRoLCBiYXNlVXJsKVxuXG4gIHJldHVybiBjbGVhblVybChtYXliZUFic29sdXRlVXJsKVxufVxuIiwgImltcG9ydCB7IG1hdGNoIH0gZnJvbSAncGF0aC10by1yZWdleHAnXG5pbXBvcnQgeyBnZXRDbGVhblVybCB9IGZyb20gJ0Btc3dqcy9pbnRlcmNlcHRvcnMnXG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnLi9ub3JtYWxpemVQYXRoJ1xuXG5leHBvcnQgdHlwZSBQYXRoID0gc3RyaW5nIHwgUmVnRXhwXG5leHBvcnQgdHlwZSBQYXRoUGFyYW1zPEtleVR5cGUgZXh0ZW5kcyBrZXlvZiBhbnkgPSBzdHJpbmc+ID0ge1xuICBbUGFyYW1OYW1lIGluIEtleVR5cGVdPzogc3RyaW5nIHwgUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2gge1xuICBtYXRjaGVzOiBib29sZWFuXG4gIHBhcmFtcz86IFBhdGhQYXJhbXNcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBwYXRoIHN1cHBvcnRlZCBieSBNU1cgaW50byBhIHBhdGhcbiAqIHN1cHBvcnRlZCBieSBcInBhdGgtdG8tcmVnZXhwXCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2VyY2VQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgcGF0aFxuICAgICAgLyoqXG4gICAgICAgKiBSZXBsYWNlIHdpbGRjYXJkcyAoXCIqXCIpIHdpdGggdW5uYW1lZCBjYXB0dXJpbmcgZ3JvdXBzXG4gICAgICAgKiBiZWNhdXNlIFwicGF0aC10by1yZWdleHBcIiBkb2Vzbid0IHN1cHBvcnQgd2lsZGNhcmRzLlxuICAgICAgICogSWdub3JlIHBhdGggcGFyYW1ldGVyJyBtb2RpZmllcnMgKGkuZS4gXCI6bmFtZSpcIikuXG4gICAgICAgKi9cbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAvKFs6YS16QS1aXy1dKikoXFwqezEsMn0pKy9nLFxuICAgICAgICAoXywgcGFyYW1ldGVyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCB3aWxkY2FyZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9ICcoLiopJ1xuXG4gICAgICAgICAgaWYgKCFwYXJhbWV0ZXJOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJOYW1lLnN0YXJ0c1dpdGgoJzonKVxuICAgICAgICAgICAgPyBgJHtwYXJhbWV0ZXJOYW1lfSR7d2lsZGNhcmR9YFxuICAgICAgICAgICAgOiBgJHtwYXJhbWV0ZXJOYW1lfSR7ZXhwcmVzc2lvbn1gXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAvKipcbiAgICAgICAqIEVzY2FwZSB0aGUgcG9ydCBzbyB0aGF0IFwicGF0aC10by1yZWdleHBcIiBjYW4gbWF0Y2hcbiAgICAgICAqIGFic29sdXRlIFVSTHMgaW5jbHVkaW5nIHBvcnQgbnVtYmVycy5cbiAgICAgICAqL1xuICAgICAgLnJlcGxhY2UoLyhbXi9dKSg6KSg/PVxcZCspLywgJyQxXFxcXCQyJylcbiAgICAgIC8qKlxuICAgICAgICogRXNjYXBlIHRoZSBwcm90b2NvbCBzbyB0aGF0IFwicGF0aC10by1yZWdleHBcIiBjb3VsZCBtYXRjaFxuICAgICAgICogYWJzb2x1dGUgVVJMLlxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGlsbGFyanMvcGF0aC10by1yZWdleHAvaXNzdWVzLzI1OVxuICAgICAgICovXG4gICAgICAucmVwbGFjZSgvXihbXi9dKykoOikoPz1cXC9cXC8pLywgJyQxXFxcXCQyJylcbiAgKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtYXRjaGluZyBnaXZlbiByZXF1ZXN0IFVSTCBhZ2FpbnN0IGEgbWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUmVxdWVzdFVybCh1cmw6IFVSTCwgcGF0aDogUGF0aCwgYmFzZVVybD86IHN0cmluZyk6IE1hdGNoIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGgsIGJhc2VVcmwpXG4gIGNvbnN0IGNsZWFuUGF0aCA9XG4gICAgdHlwZW9mIG5vcm1hbGl6ZWRQYXRoID09PSAnc3RyaW5nJ1xuICAgICAgPyBjb2VyY2VQYXRoKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgOiBub3JtYWxpemVkUGF0aFxuXG4gIGNvbnN0IGNsZWFuVXJsID0gZ2V0Q2xlYW5VcmwodXJsKVxuICBjb25zdCByZXN1bHQgPSBtYXRjaChjbGVhblBhdGgsIHsgZGVjb2RlOiBkZWNvZGVVUklDb21wb25lbnQgfSkoY2xlYW5VcmwpXG4gIGNvbnN0IHBhcmFtcyA9IChyZXN1bHQgJiYgKHJlc3VsdC5wYXJhbXMgYXMgUGF0aFBhcmFtcykpIHx8IHt9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiByZXN1bHQgIT09IGZhbHNlLFxuICAgIHBhcmFtcyxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXRoKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF0aCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwXG59XG4iLCAidmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZSgpIHtcbiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Nvb2tpZUAxLjAuMi9ub2RlX21vZHVsZXMvY29va2llL2Rpc3QvaW5kZXguanNcbnZhciByZXF1aXJlX2Rpc3QgPSBfX2NvbW1vbkpTKHtcbiAgXCJub2RlX21vZHVsZXMvLnBucG0vY29va2llQDEuMC4yL25vZGVfbW9kdWxlcy9jb29raWUvZGlzdC9pbmRleC5qc1wiKGV4cG9ydHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4gICAgZXhwb3J0cy5wYXJzZSA9IHBhcnNlMjtcbiAgICBleHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTI7XG4gICAgdmFyIGNvb2tpZU5hbWVSZWdFeHAgPSAvXltcXHUwMDIxLVxcdTAwM0FcXHUwMDNDXFx1MDAzRS1cXHUwMDdFXSskLztcbiAgICB2YXIgY29va2llVmFsdWVSZWdFeHAgPSAvXltcXHUwMDIxLVxcdTAwM0FcXHUwMDNDLVxcdTAwN0VdKiQvO1xuICAgIHZhciBkb21haW5WYWx1ZVJlZ0V4cCA9IC9eKFsuXT9bYS16MC05XShbYS16MC05LV17MCw2MX1bYS16MC05XSk/KShbLl1bYS16MC05XShbYS16MC05LV17MCw2MX1bYS16MC05XSk/KSokL2k7XG4gICAgdmFyIHBhdGhWYWx1ZVJlZ0V4cCA9IC9eW1xcdTAwMjAtXFx1MDAzQVxcdTAwM0QtXFx1MDA3RV0qJC87XG4gICAgdmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBOdWxsT2JqZWN0ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gICAgICBjb25zdCBDID0gZnVuY3Rpb24oKSB7XG4gICAgICB9O1xuICAgICAgQy5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHJldHVybiBDO1xuICAgIH0pKCk7XG4gICAgZnVuY3Rpb24gcGFyc2UyKHN0ciwgb3B0aW9ucykge1xuICAgICAgY29uc3Qgb2JqID0gbmV3IE51bGxPYmplY3QoKTtcbiAgICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgICBpZiAobGVuIDwgMilcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIGNvbnN0IGRlYyA9IG9wdGlvbnM/LmRlY29kZSB8fCBkZWNvZGU7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBlcUlkeCA9IHN0ci5pbmRleE9mKFwiPVwiLCBpbmRleCk7XG4gICAgICAgIGlmIChlcUlkeCA9PT0gLTEpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnN0IGNvbG9uSWR4ID0gc3RyLmluZGV4T2YoXCI7XCIsIGluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kSWR4ID0gY29sb25JZHggPT09IC0xID8gbGVuIDogY29sb25JZHg7XG4gICAgICAgIGlmIChlcUlkeCA+IGVuZElkeCkge1xuICAgICAgICAgIGluZGV4ID0gc3RyLmxhc3RJbmRleE9mKFwiO1wiLCBlcUlkeCAtIDEpICsgMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlTdGFydElkeCA9IHN0YXJ0SW5kZXgoc3RyLCBpbmRleCwgZXFJZHgpO1xuICAgICAgICBjb25zdCBrZXlFbmRJZHggPSBlbmRJbmRleChzdHIsIGVxSWR4LCBrZXlTdGFydElkeCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHN0ci5zbGljZShrZXlTdGFydElkeCwga2V5RW5kSWR4KTtcbiAgICAgICAgaWYgKG9ialtrZXldID09PSB2b2lkIDApIHtcbiAgICAgICAgICBsZXQgdmFsU3RhcnRJZHggPSBzdGFydEluZGV4KHN0ciwgZXFJZHggKyAxLCBlbmRJZHgpO1xuICAgICAgICAgIGxldCB2YWxFbmRJZHggPSBlbmRJbmRleChzdHIsIGVuZElkeCwgdmFsU3RhcnRJZHgpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVjKHN0ci5zbGljZSh2YWxTdGFydElkeCwgdmFsRW5kSWR4KSk7XG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IGVuZElkeCArIDE7XG4gICAgICB9IHdoaWxlIChpbmRleCA8IGxlbik7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEluZGV4KHN0ciwgaW5kZXgsIG1heCkge1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICBpZiAoY29kZSAhPT0gMzIgJiYgY29kZSAhPT0gOSlcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9IHdoaWxlICgrK2luZGV4IDwgbWF4KTtcbiAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVuZEluZGV4KHN0ciwgaW5kZXgsIG1pbikge1xuICAgICAgd2hpbGUgKGluZGV4ID4gbWluKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdCgtLWluZGV4KTtcbiAgICAgICAgaWYgKGNvZGUgIT09IDMyICYmIGNvZGUgIT09IDkpXG4gICAgICAgICAgcmV0dXJuIGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZTIobmFtZSwgdmFsLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBlbmMgPSBvcHRpb25zPy5lbmNvZGUgfHwgZW5jb2RlVVJJQ29tcG9uZW50O1xuICAgICAgaWYgKCFjb29raWVOYW1lUmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGVuYyh2YWwpO1xuICAgICAgaWYgKCFjb29raWVWYWx1ZVJlZ0V4cC50ZXN0KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBhcmd1bWVudCB2YWwgaXMgaW52YWxpZDogJHt2YWx9YCk7XG4gICAgICB9XG4gICAgICBsZXQgc3RyID0gbmFtZSArIFwiPVwiICsgdmFsdWU7XG4gICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICBpZiAob3B0aW9ucy5tYXhBZ2UgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob3B0aW9ucy5tYXhBZ2UpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIG1heEFnZSBpcyBpbnZhbGlkOiAke29wdGlvbnMubWF4QWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHN0ciArPSBcIjsgTWF4LUFnZT1cIiArIG9wdGlvbnMubWF4QWdlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZG9tYWluKSB7XG4gICAgICAgIGlmICghZG9tYWluVmFsdWVSZWdFeHAudGVzdChvcHRpb25zLmRvbWFpbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gZG9tYWluIGlzIGludmFsaWQ6ICR7b3B0aW9ucy5kb21haW59YCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBEb21haW49XCIgKyBvcHRpb25zLmRvbWFpbjtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnBhdGgpIHtcbiAgICAgICAgaWYgKCFwYXRoVmFsdWVSZWdFeHAudGVzdChvcHRpb25zLnBhdGgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIHBhdGggaXMgaW52YWxpZDogJHtvcHRpb25zLnBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBQYXRoPVwiICsgb3B0aW9ucy5wYXRoO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZXhwaXJlcykge1xuICAgICAgICBpZiAoIWlzRGF0ZShvcHRpb25zLmV4cGlyZXMpIHx8ICFOdW1iZXIuaXNGaW5pdGUob3B0aW9ucy5leHBpcmVzLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkOiAke29wdGlvbnMuZXhwaXJlc31gKTtcbiAgICAgICAgfVxuICAgICAgICBzdHIgKz0gXCI7IEV4cGlyZXM9XCIgKyBvcHRpb25zLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmh0dHBPbmx5KSB7XG4gICAgICAgIHN0ciArPSBcIjsgSHR0cE9ubHlcIjtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnNlY3VyZSkge1xuICAgICAgICBzdHIgKz0gXCI7IFNlY3VyZVwiO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucGFydGl0aW9uZWQpIHtcbiAgICAgICAgc3RyICs9IFwiOyBQYXJ0aXRpb25lZFwiO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucHJpb3JpdHkpIHtcbiAgICAgICAgY29uc3QgcHJpb3JpdHkgPSB0eXBlb2Ygb3B0aW9ucy5wcmlvcml0eSA9PT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMucHJpb3JpdHkudG9Mb3dlckNhc2UoKSA6IHZvaWQgMDtcbiAgICAgICAgc3dpdGNoIChwcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgXCJsb3dcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgUHJpb3JpdHk9TG93XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibWVkaXVtXCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PU1lZGl1bVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImhpZ2hcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgUHJpb3JpdHk9SGlnaFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBwcmlvcml0eSBpcyBpbnZhbGlkOiAke29wdGlvbnMucHJpb3JpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnNhbWVTaXRlKSB7XG4gICAgICAgIGNvbnN0IHNhbWVTaXRlID0gdHlwZW9mIG9wdGlvbnMuc2FtZVNpdGUgPT09IFwic3RyaW5nXCIgPyBvcHRpb25zLnNhbWVTaXRlLnRvTG93ZXJDYXNlKCkgOiBvcHRpb25zLnNhbWVTaXRlO1xuICAgICAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgIGNhc2UgXCJzdHJpY3RcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9U3RyaWN0XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibGF4XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPUxheFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9Tm9uZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBzYW1lU2l0ZSBpcyBpbnZhbGlkOiAke29wdGlvbnMuc2FtZVNpdGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlY29kZShzdHIpIHtcbiAgICAgIGlmIChzdHIuaW5kZXhPZihcIiVcIikgPT09IC0xKVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gICAgICByZXR1cm4gX190b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBEYXRlXVwiO1xuICAgIH1cbiAgfVxufSk7XG5cbi8vIHNyYy9zaGltcy9jb29raWUudHNcbnZhciBhbGxDb29raWUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBjb29raWUgPSBhbGxDb29raWUuZGVmYXVsdCB8fCBhbGxDb29raWU7XG52YXIgcGFyc2UgPSBjb29raWUucGFyc2U7XG52YXIgc2VyaWFsaXplID0gY29va2llLnNlcmlhbGl6ZTtcbnZhciBjb29raWVfZGVmYXVsdCA9IGNvb2tpZTtcbmV4cG9ydCB7XG4gIGNvb2tpZV9kZWZhdWx0IGFzIGRlZmF1bHQsXG4gIHBhcnNlLFxuICBzZXJpYWxpemVcbn07XG4iLCAiaW1wb3J0IHtcbiAgcGFyc2UgYXMgcGFyc2VDb29raWUsXG4gIHNlcmlhbGl6ZSBhcyBzZXJpYWxpemVDb29raWUsXG59IGZyb20gJy4uLy4uLy4uL3NoaW1zL2Nvb2tpZSdcbmltcG9ydCB7IGNvb2tpZVN0b3JlIH0gZnJvbSAnLi4vY29va2llU3RvcmUnXG5cbmZ1bmN0aW9uIHBhcnNlQ29va2llcyhpbnB1dDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhcnNlZENvb2tpZXMgPSBwYXJzZUNvb2tpZShpbnB1dClcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgZm9yIChjb25zdCBjb29raWVOYW1lIGluIHBhcnNlZENvb2tpZXMpIHtcbiAgICBpZiAodHlwZW9mIHBhcnNlZENvb2tpZXNbY29va2llTmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb29raWVzW2Nvb2tpZU5hbWVdID0gcGFyc2VkQ29va2llc1tjb29raWVOYW1lXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb29raWVzXG59XG5cbmZ1bmN0aW9uIGdldEFsbERvY3VtZW50Q29va2llcygpIHtcbiAgcmV0dXJuIHBhcnNlQ29va2llcyhkb2N1bWVudC5jb29raWUpXG59XG5cbmZ1bmN0aW9uIGdldERvY3VtZW50Q29va2llcyhyZXF1ZXN0OiBSZXF1ZXN0KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN3aXRjaCAocmVxdWVzdC5jcmVkZW50aWFscykge1xuICAgIGNhc2UgJ3NhbWUtb3JpZ2luJzoge1xuICAgICAgY29uc3QgcmVxdWVzdFVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG5cbiAgICAgIC8vIFJldHVybiBkb2N1bWVudCBjb29raWVzIG9ubHkgd2hlbiByZXF1ZXN0ZWQgYSByZXNvdXJjZVxuICAgICAgLy8gZnJvbSB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAgICByZXR1cm4gbG9jYXRpb24ub3JpZ2luID09PSByZXF1ZXN0VXJsLm9yaWdpblxuICAgICAgICA/IGdldEFsbERvY3VtZW50Q29va2llcygpXG4gICAgICAgIDoge31cbiAgICB9XG5cbiAgICBjYXNlICdpbmNsdWRlJzoge1xuICAgICAgLy8gUmV0dXJuIGFsbCBkb2N1bWVudCBjb29raWVzLlxuICAgICAgcmV0dXJuIGdldEFsbERvY3VtZW50Q29va2llcygpXG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxSZXF1ZXN0Q29va2llcyhyZXF1ZXN0OiBSZXF1ZXN0KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIC8qKlxuICAgKiBAbm90ZSBXaGlsZSB0aGUgXCJjb29raWVcIiBoZWFkZXIgaXMgYSBmb3JiaWRkZW4gaGVhZGVyIGZpZWxkXG4gICAqIGluIHRoZSBicm93c2VyLCB5b3UgY2FuIHJlYWQgaXQgaW4gTm9kZS5qcy4gV2UgbmVlZCB0byByZXNwZWN0XG4gICAqIGl0IGZvciBtb2NraW5nIGluIE5vZGUuanMuXG4gICAqL1xuICBjb25zdCByZXF1ZXN0Q29va2llSGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzLmdldCgnY29va2llJylcbiAgY29uc3QgY29va2llc0Zyb21IZWFkZXJzID0gcmVxdWVzdENvb2tpZUhlYWRlclxuICAgID8gcGFyc2VDb29raWVzKHJlcXVlc3RDb29raWVIZWFkZXIpXG4gICAgOiB7fVxuXG4gIGNvbnN0IGNvb2tpZXNGcm9tRG9jdW1lbnQgPSBnZXREb2N1bWVudENvb2tpZXMocmVxdWVzdClcblxuICAvLyBGb3J3YXJkIHRoZSBkb2N1bWVudCBjb29raWVzIHRvIHRoZSByZXF1ZXN0IGhlYWRlcnMuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBjb29raWVzRnJvbURvY3VtZW50KSB7XG4gICAgcmVxdWVzdC5oZWFkZXJzLmFwcGVuZChcbiAgICAgICdjb29raWUnLFxuICAgICAgc2VyaWFsaXplQ29va2llKG5hbWUsIGNvb2tpZXNGcm9tRG9jdW1lbnRbbmFtZV0pLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGNvb2tpZXNGcm9tU3RvcmUgPSBjb29raWVTdG9yZS5nZXRDb29raWVzKHJlcXVlc3QudXJsKVxuICBjb25zdCBzdG9yZWRDb29raWVzT2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIGNvb2tpZXNGcm9tU3RvcmUubWFwKChjb29raWUpID0+IFtjb29raWUua2V5LCBjb29raWUudmFsdWVdKSxcbiAgKVxuXG4gIC8vIEZvcndhcmQgdGhlIHJhdyBzdG9yZWQgY29va2llcyB0byByZXF1ZXN0IGhlYWRlcnNcbiAgLy8gc28gdGhleSBjb250YWluIG1ldGFkYXRhIGxpa2UgXCJleHBpcmVzXCIsIFwic2VjdXJlXCIsIGV0Yy5cbiAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llc0Zyb21TdG9yZSkge1xuICAgIHJlcXVlc3QuaGVhZGVycy5hcHBlbmQoJ2Nvb2tpZScsIGNvb2tpZS50b1N0cmluZygpKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb29raWVzRnJvbURvY3VtZW50LFxuICAgIC4uLnN0b3JlZENvb2tpZXNPYmplY3QsXG4gICAgLi4uY29va2llc0Zyb21IZWFkZXJzLFxuICB9XG59XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VSZXNvbHV0aW9uQ29udGV4dCB9IGZyb20gJy4uL3V0aWxzL2V4ZWN1dGVIYW5kbGVycydcbmltcG9ydCB7IGRldlV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvaW50ZXJuYWwvZGV2VXRpbHMnXG5pbXBvcnQgeyBpc1N0cmluZ0VxdWFsIH0gZnJvbSAnLi4vdXRpbHMvaW50ZXJuYWwvaXNTdHJpbmdFcXVhbCdcbmltcG9ydCB7IGdldFN0YXR1c0NvZGVDb2xvciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dpbmcvZ2V0U3RhdHVzQ29kZUNvbG9yJ1xuaW1wb3J0IHsgZ2V0VGltZXN0YW1wIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2luZy9nZXRUaW1lc3RhbXAnXG5pbXBvcnQgeyBzZXJpYWxpemVSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2luZy9zZXJpYWxpemVSZXF1ZXN0J1xuaW1wb3J0IHsgc2VyaWFsaXplUmVzcG9uc2UgfSBmcm9tICcuLi91dGlscy9sb2dnaW5nL3NlcmlhbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHtcbiAgbWF0Y2hSZXF1ZXN0VXJsLFxuICBNYXRjaCxcbiAgUGF0aCxcbiAgUGF0aFBhcmFtcyxcbn0gZnJvbSAnLi4vdXRpbHMvbWF0Y2hpbmcvbWF0Y2hSZXF1ZXN0VXJsJ1xuaW1wb3J0IHsgdG9QdWJsaWNVcmwgfSBmcm9tICcuLi91dGlscy9yZXF1ZXN0L3RvUHVibGljVXJsJ1xuaW1wb3J0IHsgZ2V0QWxsUmVxdWVzdENvb2tpZXMgfSBmcm9tICcuLi91dGlscy9yZXF1ZXN0L2dldFJlcXVlc3RDb29raWVzJ1xuaW1wb3J0IHsgY2xlYW5VcmwgfSBmcm9tICcuLi91dGlscy91cmwvY2xlYW5VcmwnXG5pbXBvcnQge1xuICBSZXF1ZXN0SGFuZGxlcixcbiAgUmVxdWVzdEhhbmRsZXJEZWZhdWx0SW5mbyxcbiAgUmVxdWVzdEhhbmRsZXJPcHRpb25zLFxuICBSZXNwb25zZVJlc29sdmVyLFxufSBmcm9tICcuL1JlcXVlc3RIYW5kbGVyJ1xuXG50eXBlIEh0dHBIYW5kbGVyTWV0aG9kID0gc3RyaW5nIHwgUmVnRXhwXG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEhhbmRsZXJJbmZvIGV4dGVuZHMgUmVxdWVzdEhhbmRsZXJEZWZhdWx0SW5mbyB7XG4gIG1ldGhvZDogSHR0cEhhbmRsZXJNZXRob2RcbiAgcGF0aDogSHR0cFJlcXVlc3RQcmVkaWNhdGU8UGF0aFBhcmFtcz5cbn1cblxuZXhwb3J0IGVudW0gSHR0cE1ldGhvZHMge1xuICBIRUFEID0gJ0hFQUQnLFxuICBHRVQgPSAnR0VUJyxcbiAgUE9TVCA9ICdQT1NUJyxcbiAgUFVUID0gJ1BVVCcsXG4gIFBBVENIID0gJ1BBVENIJyxcbiAgT1BUSU9OUyA9ICdPUFRJT05TJyxcbiAgREVMRVRFID0gJ0RFTEVURScsXG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RRdWVyeSA9IHtcbiAgW3F1ZXJ5TmFtZTogc3RyaW5nXTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEh0dHBSZXF1ZXN0UGFyc2VkUmVzdWx0ID0ge1xuICBtYXRjaDogTWF0Y2hcbiAgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdFJlc29sdmVyRXh0cmFzPFBhcmFtcyBleHRlbmRzIFBhdGhQYXJhbXM+ID0ge1xuICBwYXJhbXM6IFBhcmFtc1xuICBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCB0eXBlIEh0dHBDdXN0b21QcmVkaWNhdGU8UGFyYW1zIGV4dGVuZHMgUGF0aFBhcmFtcz4gPSAoYXJnczoge1xuICByZXF1ZXN0OiBSZXF1ZXN0XG4gIGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn0pID0+XG4gIHwgSHR0cEN1c3RvbVByZWRpY2F0ZVJlc3VsdDxQYXJhbXM+XG4gIHwgUHJvbWlzZTxIdHRwQ3VzdG9tUHJlZGljYXRlUmVzdWx0PFBhcmFtcz4+XG5cbmV4cG9ydCB0eXBlIEh0dHBDdXN0b21QcmVkaWNhdGVSZXN1bHQ8UGFyYW1zIGV4dGVuZHMgUGF0aFBhcmFtcz4gPVxuICB8IGJvb2xlYW5cbiAgfCB7XG4gICAgICBtYXRjaGVzOiBib29sZWFuXG4gICAgICBwYXJhbXM6IFBhcmFtc1xuICAgIH1cblxuZXhwb3J0IHR5cGUgSHR0cFJlcXVlc3RQcmVkaWNhdGU8UGFyYW1zIGV4dGVuZHMgUGF0aFBhcmFtcz4gPVxuICB8IFBhdGhcbiAgfCBIdHRwQ3VzdG9tUHJlZGljYXRlPFBhcmFtcz5cblxuLyoqXG4gKiBSZXF1ZXN0IGhhbmRsZXIgZm9yIEhUVFAgcmVxdWVzdHMuXG4gKiBQcm92aWRlcyByZXF1ZXN0IG1hdGNoaW5nIGJhc2VkIG9uIG1ldGhvZCBhbmQgVVJMLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cEhhbmRsZXIgZXh0ZW5kcyBSZXF1ZXN0SGFuZGxlcjxcbiAgSHR0cEhhbmRsZXJJbmZvLFxuICBIdHRwUmVxdWVzdFBhcnNlZFJlc3VsdCxcbiAgSHR0cFJlcXVlc3RSZXNvbHZlckV4dHJhczxhbnk+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWV0aG9kOiBIdHRwSGFuZGxlck1ldGhvZCxcbiAgICBwcmVkaWNhdGU6IEh0dHBSZXF1ZXN0UHJlZGljYXRlPFBhdGhQYXJhbXM+LFxuICAgIHJlc29sdmVyOiBSZXNwb25zZVJlc29sdmVyPEh0dHBSZXF1ZXN0UmVzb2x2ZXJFeHRyYXM8YW55PiwgYW55LCBhbnk+LFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0SGFuZGxlck9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IGRpc3BsYXlQYXRoID1cbiAgICAgIHR5cGVvZiBwcmVkaWNhdGUgPT09ICdmdW5jdGlvbicgPyAnW2N1c3RvbSBwcmVkaWNhdGVdJyA6IHByZWRpY2F0ZVxuXG4gICAgc3VwZXIoe1xuICAgICAgaW5mbzoge1xuICAgICAgICBoZWFkZXI6IGAke21ldGhvZH0ke2Rpc3BsYXlQYXRoID8gYCAke2Rpc3BsYXlQYXRofWAgOiAnJ31gLFxuICAgICAgICBwYXRoOiBwcmVkaWNhdGUsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSlcblxuICAgIHRoaXMuY2hlY2tSZWR1bmRhbnRRdWVyeVBhcmFtZXRlcnMoKVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlZHVuZGFudFF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gdGhpcy5pbmZvXG5cbiAgICBpZiAoIXBhdGggfHwgcGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCB8fCB0eXBlb2YgcGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gY2xlYW5VcmwocGF0aClcblxuICAgIC8vIEJ5cGFzcyByZXF1ZXN0IGhhbmRsZXIgVVJMcyB0aGF0IGhhdmUgbm8gcmVkdW5kYW50IGNoYXJhY3RlcnMuXG4gICAgaWYgKHVybCA9PT0gcGF0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGV2VXRpbHMud2FybihcbiAgICAgIGBGb3VuZCBhIHJlZHVuZGFudCB1c2FnZSBvZiBxdWVyeSBwYXJhbWV0ZXJzIGluIHRoZSByZXF1ZXN0IGhhbmRsZXIgVVJMIGZvciBcIiR7bWV0aG9kfSAke3BhdGh9XCIuIFBsZWFzZSBtYXRjaCBhZ2FpbnN0IGEgcGF0aCBpbnN0ZWFkIGFuZCBhY2Nlc3MgcXVlcnkgcGFyYW1ldGVycyB1c2luZyBcIm5ldyBVUkwocmVxdWVzdC51cmwpLnNlYXJjaFBhcmFtc1wiIGluc3RlYWQuIExlYXJuIG1vcmU6IGh0dHBzOi8vbXN3anMuaW8vZG9jcy9odHRwL2ludGVyY2VwdGluZy1yZXF1ZXN0cyNxdWVyeXNlYXJjaC1wYXJhbWV0ZXJzYCxcbiAgICApXG4gIH1cblxuICBhc3luYyBwYXJzZShhcmdzOiB7XG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICAgIHJlc29sdXRpb25Db250ZXh0PzogUmVzcG9uc2VSZXNvbHV0aW9uQ29udGV4dFxuICB9KSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChhcmdzLnJlcXVlc3QudXJsKVxuICAgIGNvbnN0IGNvb2tpZXMgPSBnZXRBbGxSZXF1ZXN0Q29va2llcyhhcmdzLnJlcXVlc3QpXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgY3VzdG9tIHByZWRpY2F0ZSBmdW5jdGlvbnMuXG4gICAgICogQG5vdGUgSW52b2tlIHRoaXMgZHVyaW5nIHBhcnNpbmcgc28gdGhlIHVzZXIgY2FuIHBhcnNlIHRoZSBwYXRoIHBhcmFtZXRlcnNcbiAgICAgKiBtYW51YWxseS4gT3RoZXJ3aXNlLCBgcGFyYW1zYCBpcyBhbHdheXMgYW4gZW1wdHkgb2JqZWN0LCB3aGljaCBpc24ndCBuaWNlLlxuICAgICAqL1xuICAgIGlmICh0eXBlb2YgdGhpcy5pbmZvLnBhdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGN1c3RvbVByZWRpY2F0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuaW5mby5wYXRoKHtcbiAgICAgICAgcmVxdWVzdDogYXJncy5yZXF1ZXN0LFxuICAgICAgICBjb29raWVzLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgbWF0Y2ggPVxuICAgICAgICB0eXBlb2YgY3VzdG9tUHJlZGljYXRlUmVzdWx0ID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWF0Y2hlczogY3VzdG9tUHJlZGljYXRlUmVzdWx0LFxuICAgICAgICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogY3VzdG9tUHJlZGljYXRlUmVzdWx0XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoLFxuICAgICAgICBjb29raWVzLFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5pbmZvLnBhdGhcbiAgICAgID8gbWF0Y2hSZXF1ZXN0VXJsKHVybCwgdGhpcy5pbmZvLnBhdGgsIGFyZ3MucmVzb2x1dGlvbkNvbnRleHQ/LmJhc2VVcmwpXG4gICAgICA6IHsgbWF0Y2hlczogZmFsc2UsIHBhcmFtczoge30gfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoLFxuICAgICAgY29va2llcyxcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcmVkaWNhdGUoYXJnczoge1xuICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgICBwYXJzZWRSZXN1bHQ6IEh0dHBSZXF1ZXN0UGFyc2VkUmVzdWx0XG4gICAgcmVzb2x1dGlvbkNvbnRleHQ/OiBSZXNwb25zZVJlc29sdXRpb25Db250ZXh0XG4gIH0pIHtcbiAgICBjb25zdCBoYXNNYXRjaGluZ01ldGhvZCA9IHRoaXMubWF0Y2hNZXRob2QoYXJncy5yZXF1ZXN0Lm1ldGhvZClcbiAgICBjb25zdCBoYXNNYXRjaGluZ1VybCA9IGFyZ3MucGFyc2VkUmVzdWx0Lm1hdGNoLm1hdGNoZXNcbiAgICByZXR1cm4gaGFzTWF0Y2hpbmdNZXRob2QgJiYgaGFzTWF0Y2hpbmdVcmxcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hNZXRob2QoYWN0dWFsTWV0aG9kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbmZvLm1ldGhvZCBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgPyB0aGlzLmluZm8ubWV0aG9kLnRlc3QoYWN0dWFsTWV0aG9kKVxuICAgICAgOiBpc1N0cmluZ0VxdWFsKHRoaXMuaW5mby5tZXRob2QsIGFjdHVhbE1ldGhvZClcbiAgfVxuXG4gIHByb3RlY3RlZCBleHRlbmRSZXNvbHZlckFyZ3MoYXJnczoge1xuICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgICBwYXJzZWRSZXN1bHQ6IEh0dHBSZXF1ZXN0UGFyc2VkUmVzdWx0XG4gIH0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyYW1zOiBhcmdzLnBhcnNlZFJlc3VsdC5tYXRjaD8ucGFyYW1zIHx8IHt9LFxuICAgICAgY29va2llczogYXJncy5wYXJzZWRSZXN1bHQuY29va2llcyxcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2coYXJnczogeyByZXF1ZXN0OiBSZXF1ZXN0OyByZXNwb25zZTogUmVzcG9uc2UgfSkge1xuICAgIGNvbnN0IHB1YmxpY1VybCA9IHRvUHVibGljVXJsKGFyZ3MucmVxdWVzdC51cmwpXG4gICAgY29uc3QgbG9nZ2VkUmVxdWVzdCA9IGF3YWl0IHNlcmlhbGl6ZVJlcXVlc3QoYXJncy5yZXF1ZXN0KVxuICAgIGNvbnN0IGxvZ2dlZFJlc3BvbnNlID0gYXdhaXQgc2VyaWFsaXplUmVzcG9uc2UoYXJncy5yZXNwb25zZSlcbiAgICBjb25zdCBzdGF0dXNDb2xvciA9IGdldFN0YXR1c0NvZGVDb2xvcihsb2dnZWRSZXNwb25zZS5zdGF0dXMpXG5cbiAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgZGV2VXRpbHMuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgYCR7Z2V0VGltZXN0YW1wKCl9ICR7YXJncy5yZXF1ZXN0Lm1ldGhvZH0gJHtwdWJsaWNVcmx9ICglYyR7XG4gICAgICAgICAgbG9nZ2VkUmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgIH0gJHtsb2dnZWRSZXNwb25zZS5zdGF0dXNUZXh0fSVjKWAsXG4gICAgICApLFxuICAgICAgYGNvbG9yOiR7c3RhdHVzQ29sb3J9YCxcbiAgICAgICdjb2xvcjppbmhlcml0JyxcbiAgICApXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnUmVxdWVzdCcsIGxvZ2dlZFJlcXVlc3QpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnSGFuZGxlcjonLCB0aGlzKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ1Jlc3BvbnNlJywgbG9nZ2VkUmVzcG9uc2UpXG4gICAgY29uc29sZS5ncm91cEVuZCgpXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBEZWZhdWx0Qm9keVR5cGUsXG4gIFJlcXVlc3RIYW5kbGVyT3B0aW9ucyxcbiAgUmVzcG9uc2VSZXNvbHZlcixcbn0gZnJvbSAnLi9oYW5kbGVycy9SZXF1ZXN0SGFuZGxlcidcbmltcG9ydCB7XG4gIEh0dHBNZXRob2RzLFxuICBIdHRwSGFuZGxlcixcbiAgSHR0cFJlcXVlc3RSZXNvbHZlckV4dHJhcyxcbiAgSHR0cFJlcXVlc3RQcmVkaWNhdGUsXG59IGZyb20gJy4vaGFuZGxlcnMvSHR0cEhhbmRsZXInXG5pbXBvcnQgdHlwZSB7IFBhdGhQYXJhbXMgfSBmcm9tICcuL3V0aWxzL21hdGNoaW5nL21hdGNoUmVxdWVzdFVybCdcblxuZXhwb3J0IHR5cGUgSHR0cFJlcXVlc3RIYW5kbGVyID0gPFxuICBQYXJhbXMgZXh0ZW5kcyBQYXRoUGFyYW1zPGtleW9mIFBhcmFtcz4gPSBQYXRoUGFyYW1zLFxuICBSZXF1ZXN0Qm9keVR5cGUgZXh0ZW5kcyBEZWZhdWx0Qm9keVR5cGUgPSBEZWZhdWx0Qm9keVR5cGUsXG4gIC8vIFJlc3BvbnNlIGJvZHkgdHlwZSBNVVNUIGJlIHVuZGVmaW5lZCBieSBkZWZhdWx0LlxuICAvLyBUaGlzIGlzIGhvdyB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGhhbmRsZXIgdGhhdFxuICAvLyByZXR1cm5zIHBsYWluIFwiUmVzcG9uc2VcIiBhbmQgdGhlIG9uZSByZXR1cm5pbmcgXCJIdHRwUmVzcG9uc2VcIlxuICAvLyB0byBlbmZvcmNlIGEgc3RyaWN0ZXIgcmVzcG9uc2UgYm9keSB0eXBlLlxuICBSZXNwb25zZUJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlID0gdW5kZWZpbmVkLFxuPihcbiAgcHJlZGljYXRlOiBIdHRwUmVxdWVzdFByZWRpY2F0ZTxQYXJhbXM+LFxuICByZXNvbHZlcjogSHR0cFJlc3BvbnNlUmVzb2x2ZXI8UGFyYW1zLCBSZXF1ZXN0Qm9keVR5cGUsIFJlc3BvbnNlQm9keVR5cGU+LFxuICBvcHRpb25zPzogUmVxdWVzdEhhbmRsZXJPcHRpb25zLFxuKSA9PiBIdHRwSGFuZGxlclxuXG5leHBvcnQgdHlwZSBIdHRwUmVzcG9uc2VSZXNvbHZlcjxcbiAgUGFyYW1zIGV4dGVuZHMgUGF0aFBhcmFtczxrZXlvZiBQYXJhbXM+ID0gUGF0aFBhcmFtcyxcbiAgUmVxdWVzdEJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlID0gRGVmYXVsdEJvZHlUeXBlLFxuICBSZXNwb25zZUJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlID0gRGVmYXVsdEJvZHlUeXBlLFxuPiA9IFJlc3BvbnNlUmVzb2x2ZXI8XG4gIEh0dHBSZXF1ZXN0UmVzb2x2ZXJFeHRyYXM8UGFyYW1zPixcbiAgUmVxdWVzdEJvZHlUeXBlLFxuICBSZXNwb25zZUJvZHlUeXBlXG4+XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBIYW5kbGVyPE1ldGhvZCBleHRlbmRzIEh0dHBNZXRob2RzIHwgUmVnRXhwPihcbiAgbWV0aG9kOiBNZXRob2QsXG4pOiBIdHRwUmVxdWVzdEhhbmRsZXIge1xuICByZXR1cm4gKHByZWRpY2F0ZSwgcmVzb2x2ZXIsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIHJldHVybiBuZXcgSHR0cEhhbmRsZXIobWV0aG9kLCBwcmVkaWNhdGUsIHJlc29sdmVyLCBvcHRpb25zKVxuICB9XG59XG5cbi8qKlxuICogQSBuYW1lc3BhY2UgdG8gaW50ZXJjZXB0IGFuZCBtb2NrIEhUVFAgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGh0dHAuZ2V0KCcvdXNlcicsIHJlc29sdmVyKVxuICogaHR0cC5wb3N0KCcvcG9zdC86aWQnLCByZXNvbHZlcilcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL21zd2pzLmlvL2RvY3MvYXBpL2h0dHAgYGh0dHBgIEFQSSByZWZlcmVuY2V9XG4gKi9cbmV4cG9ydCBjb25zdCBodHRwID0ge1xuICBhbGw6IGNyZWF0ZUh0dHBIYW5kbGVyKC8uKy8pLFxuICBoZWFkOiBjcmVhdGVIdHRwSGFuZGxlcihIdHRwTWV0aG9kcy5IRUFEKSxcbiAgZ2V0OiBjcmVhdGVIdHRwSGFuZGxlcihIdHRwTWV0aG9kcy5HRVQpLFxuICBwb3N0OiBjcmVhdGVIdHRwSGFuZGxlcihIdHRwTWV0aG9kcy5QT1NUKSxcbiAgcHV0OiBjcmVhdGVIdHRwSGFuZGxlcihIdHRwTWV0aG9kcy5QVVQpLFxuICBkZWxldGU6IGNyZWF0ZUh0dHBIYW5kbGVyKEh0dHBNZXRob2RzLkRFTEVURSksXG4gIHBhdGNoOiBjcmVhdGVIdHRwSGFuZGxlcihIdHRwTWV0aG9kcy5QQVRDSCksXG4gIG9wdGlvbnM6IGNyZWF0ZUh0dHBIYW5kbGVyKEh0dHBNZXRob2RzLk9QVElPTlMpLFxufVxuIiwgImltcG9ydCB7IEZldGNoUmVzcG9uc2UgfSBmcm9tICdAbXN3anMvaW50ZXJjZXB0b3JzJ1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0Qm9keVR5cGUsIEpzb25Cb2R5VHlwZSB9IGZyb20gJy4vaGFuZGxlcnMvUmVxdWVzdEhhbmRsZXInXG5pbXBvcnQgdHlwZSB7IE5vSW5mZXIgfSBmcm9tICcuL3R5cGVVdGlscydcbmltcG9ydCB7XG4gIGRlY29yYXRlUmVzcG9uc2UsXG4gIG5vcm1hbGl6ZVJlc3BvbnNlSW5pdCxcbn0gZnJvbSAnLi91dGlscy9IdHRwUmVzcG9uc2UvZGVjb3JhdG9ycydcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVzcG9uc2VJbml0IGV4dGVuZHMgUmVzcG9uc2VJbml0IHtcbiAgdHlwZT86IFJlc3BvbnNlVHlwZVxufVxuXG5leHBvcnQgY29uc3QgYm9keVR5cGU6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2JvZHlUeXBlJylcbmV4cG9ydCB0eXBlIERlZmF1bHRVbnNhZmVGZXRjaFJlc3BvbnNlID0gUmVzcG9uc2UgJiB7XG4gIFtib2R5VHlwZV0/OiBuZXZlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmljdFJlcXVlc3Q8Qm9keVR5cGUgZXh0ZW5kcyBKc29uQm9keVR5cGU+IGV4dGVuZHMgUmVxdWVzdCB7XG4gIGpzb24oKTogUHJvbWlzZTxCb2R5VHlwZT5cbiAgY2xvbmUoKTogU3RyaWN0UmVxdWVzdDxCb2R5VHlwZT5cbn1cblxuLyoqXG4gKiBPcGFxdWUgYFJlc3BvbnNlYCB0eXBlIHRoYXQgc3VwcG9ydHMgc3RyaWN0IGJvZHkgdHlwZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayBIdHRwUmVzcG9uc2V9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdFJlc3BvbnNlPEJvZHlUeXBlIGV4dGVuZHMgRGVmYXVsdEJvZHlUeXBlPiA9XG4gIEh0dHBSZXNwb25zZTxCb2R5VHlwZT5cblxuLyoqXG4gKiBBIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCBgUmVzcG9uc2VgIGNsYXNzXG4gKiB0byBhbGxvdyBhZGRpdGlvbmFsIGZlYXR1cmVzLCBsaWtlIG1vY2tpbmcgdGhlIHJlc3BvbnNlIGBTZXQtQ29va2llYCBoZWFkZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIG5ldyBIdHRwUmVzcG9uc2UoJ0hlbGxvIHdvcmxkJywgeyBzdGF0dXM6IDIwMSB9KVxuICogSHR0cFJlc3BvbnNlLmpzb24oeyBuYW1lOiAnSm9obicgfSlcbiAqIEh0dHBSZXNwb25zZS5mb3JtRGF0YShmb3JtKVxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbXN3anMuaW8vZG9jcy9hcGkvaHR0cC1yZXNwb25zZSBgSHR0cFJlc3BvbnNlYCBBUEkgcmVmZXJlbmNlfVxuICovXG5leHBvcnQgY2xhc3MgSHR0cFJlc3BvbnNlPFxuICBCb2R5VHlwZSBleHRlbmRzIERlZmF1bHRCb2R5VHlwZSxcbj4gZXh0ZW5kcyBGZXRjaFJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgW2JvZHlUeXBlXTogQm9keVR5cGUgPSBudWxsIGFzIGFueVxuXG4gIGNvbnN0cnVjdG9yKGJvZHk/OiBOb0luZmVyPEJvZHlUeXBlPiB8IG51bGwsIGluaXQ/OiBIdHRwUmVzcG9uc2VJbml0KSB7XG4gICAgY29uc3QgcmVzcG9uc2VJbml0ID0gbm9ybWFsaXplUmVzcG9uc2VJbml0KGluaXQpXG4gICAgc3VwZXIoYm9keSBhcyBCb2R5SW5pdCwgcmVzcG9uc2VJbml0KVxuICAgIGRlY29yYXRlUmVzcG9uc2UodGhpcywgcmVzcG9uc2VJbml0KVxuICB9XG5cbiAgc3RhdGljIGVycm9yKCk6IEh0dHBSZXNwb25zZTxhbnk+IHtcbiAgICByZXR1cm4gc3VwZXIuZXJyb3IoKSBhcyBIdHRwUmVzcG9uc2U8YW55PlxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGBSZXNwb25zZWAgd2l0aCBhIGBDb250ZW50LVR5cGU6IFwidGV4dC9wbGFpblwiYCBib2R5LlxuICAgKiBAZXhhbXBsZVxuICAgKiBIdHRwUmVzcG9uc2UudGV4dCgnaGVsbG8gd29ybGQnKVxuICAgKiBIdHRwUmVzcG9uc2UudGV4dCgnRXJyb3InLCB7IHN0YXR1czogNTAwIH0pXG4gICAqL1xuICBzdGF0aWMgdGV4dDxCb2R5VHlwZSBleHRlbmRzIHN0cmluZz4oXG4gICAgYm9keT86IE5vSW5mZXI8Qm9keVR5cGU+IHwgbnVsbCxcbiAgICBpbml0PzogSHR0cFJlc3BvbnNlSW5pdCxcbiAgKTogSHR0cFJlc3BvbnNlPEJvZHlUeXBlPiB7XG4gICAgY29uc3QgcmVzcG9uc2VJbml0ID0gbm9ybWFsaXplUmVzcG9uc2VJbml0KGluaXQpXG5cbiAgICBpZiAoIXJlc3BvbnNlSW5pdC5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHJlc3BvbnNlSW5pdC5oZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKVxuICAgIH1cblxuICAgIC8vIEF1dG9tYXRpY2FsbHkgc2V0IHRoZSBcIkNvbnRlbnQtTGVuZ3RoXCIgcmVzcG9uc2UgaGVhZGVyXG4gICAgLy8gZm9yIG5vbi1lbXB0eSB0ZXh0IHJlc3BvbnNlcy4gVGhpcyBlbmZvcmNlcyBjb25zaXN0ZW5jeSBhbmRcbiAgICAvLyBicmluZ3MgbW9ja2VkIHJlc3BvbnNlcyBjbG9zZXIgdG8gcHJvZHVjdGlvbi5cbiAgICBpZiAoIXJlc3BvbnNlSW5pdC5oZWFkZXJzLmhhcygnQ29udGVudC1MZW5ndGgnKSkge1xuICAgICAgcmVzcG9uc2VJbml0LmhlYWRlcnMuc2V0KFxuICAgICAgICAnQ29udGVudC1MZW5ndGgnLFxuICAgICAgICBib2R5ID8gbmV3IEJsb2IoW2JvZHldKS5zaXplLnRvU3RyaW5nKCkgOiAnMCcsXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VJbml0KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGBSZXNwb25zZWAgd2l0aCBhIGBDb250ZW50LVR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiYCBib2R5LlxuICAgKiBAZXhhbXBsZVxuICAgKiBIdHRwUmVzcG9uc2UuanNvbih7IGZpcnN0TmFtZTogJ0pvaG4nIH0pXG4gICAqIEh0dHBSZXNwb25zZS5qc29uKHsgZXJyb3I6ICdOb3QgQXV0aG9yaXplZCcgfSwgeyBzdGF0dXM6IDQwMSB9KVxuICAgKi9cbiAgc3RhdGljIGpzb248Qm9keVR5cGUgZXh0ZW5kcyBKc29uQm9keVR5cGU+KFxuICAgIGJvZHk/OiBOb0luZmVyPEJvZHlUeXBlPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgaW5pdD86IEh0dHBSZXNwb25zZUluaXQsXG4gICk6IEh0dHBSZXNwb25zZTxCb2R5VHlwZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlSW5pdCA9IG5vcm1hbGl6ZVJlc3BvbnNlSW5pdChpbml0KVxuXG4gICAgaWYgKCFyZXNwb25zZUluaXQuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICByZXNwb25zZUluaXQuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbm90ZSBUeXBlU2NyaXB0IGlzIGluY29ycmVjdCBoZXJlLlxuICAgICAqIFN0cmluZ2lmeWluZyB1bmRlZmluZWQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IEpTT04uc3RyaW5naWZ5KGJvZHkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFyZXNwb25zZUluaXQuaGVhZGVycy5oYXMoJ0NvbnRlbnQtTGVuZ3RoJykpIHtcbiAgICAgIHJlc3BvbnNlSW5pdC5oZWFkZXJzLnNldChcbiAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgICAgICAgcmVzcG9uc2VUZXh0ID8gbmV3IEJsb2IoW3Jlc3BvbnNlVGV4dF0pLnNpemUudG9TdHJpbmcoKSA6ICcwJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwb25zZVRleHQgYXMgQm9keVR5cGUsIHJlc3BvbnNlSW5pdClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgUmVzcG9uc2VgIHdpdGggYSBgQ29udGVudC1UeXBlOiBcImFwcGxpY2F0aW9uL3htbFwiYCBib2R5LlxuICAgKiBAZXhhbXBsZVxuICAgKiBIdHRwUmVzcG9uc2UueG1sKGA8dXNlciBuYW1lPVwiSm9oblwiIC8+YClcbiAgICogSHR0cFJlc3BvbnNlLnhtbChgPGFydGljbGUgaWQ9XCJhYmMtMTIzXCIgLz5gLCB7IHN0YXR1czogMjAxIH0pXG4gICAqL1xuICBzdGF0aWMgeG1sPEJvZHlUeXBlIGV4dGVuZHMgc3RyaW5nPihcbiAgICBib2R5PzogQm9keVR5cGUgfCBudWxsLFxuICAgIGluaXQ/OiBIdHRwUmVzcG9uc2VJbml0LFxuICApOiBIdHRwUmVzcG9uc2U8Qm9keVR5cGU+IHtcbiAgICBjb25zdCByZXNwb25zZUluaXQgPSBub3JtYWxpemVSZXNwb25zZUluaXQoaW5pdClcblxuICAgIGlmICghcmVzcG9uc2VJbml0LmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSkge1xuICAgICAgcmVzcG9uc2VJbml0LmhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAndGV4dC94bWwnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlSW5pdClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgUmVzcG9uc2VgIHdpdGggYSBgQ29udGVudC1UeXBlOiBcInRleHQvaHRtbFwiYCBib2R5LlxuICAgKiBAZXhhbXBsZVxuICAgKiBIdHRwUmVzcG9uc2UuaHRtbChgPHAgY2xhc3M9XCJhdXRob3JcIj5KYW5lIERvZTwvcD5gKVxuICAgKiBIdHRwUmVzcG9uc2UuaHRtbChgPG1haW4gaWQ9XCJhYmMtMTIzXCI+TWFpbiB0ZXh0PC9tYWluPmAsIHsgc3RhdHVzOiAyMDEgfSlcbiAgICovXG4gIHN0YXRpYyBodG1sPEJvZHlUeXBlIGV4dGVuZHMgc3RyaW5nPihcbiAgICBib2R5PzogQm9keVR5cGUgfCBudWxsLFxuICAgIGluaXQ/OiBIdHRwUmVzcG9uc2VJbml0LFxuICApOiBIdHRwUmVzcG9uc2U8Qm9keVR5cGU+IHtcbiAgICBjb25zdCByZXNwb25zZUluaXQgPSBub3JtYWxpemVSZXNwb25zZUluaXQoaW5pdClcblxuICAgIGlmICghcmVzcG9uc2VJbml0LmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSkge1xuICAgICAgcmVzcG9uc2VJbml0LmhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh0dHBSZXNwb25zZShib2R5LCByZXNwb25zZUluaXQpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYFJlc3BvbnNlYCB3aXRoIGFuIGBBcnJheUJ1ZmZlcmAgYm9keS5cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDMpXG4gICAqIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gICAqIHZpZXcuc2V0KFsxLCAyLCAzXSlcbiAgICpcbiAgICogSHR0cFJlc3BvbnNlLmFycmF5QnVmZmVyKGJ1ZmZlcilcbiAgICovXG4gIHN0YXRpYyBhcnJheUJ1ZmZlcjxCb2R5VHlwZSBleHRlbmRzIEFycmF5QnVmZmVyIHwgU2hhcmVkQXJyYXlCdWZmZXI+KFxuICAgIGJvZHk/OiBCb2R5VHlwZSxcbiAgICBpbml0PzogSHR0cFJlc3BvbnNlSW5pdCxcbiAgKTogSHR0cFJlc3BvbnNlPEJvZHlUeXBlPiB7XG4gICAgY29uc3QgcmVzcG9uc2VJbml0ID0gbm9ybWFsaXplUmVzcG9uc2VJbml0KGluaXQpXG5cbiAgICBpZiAoIXJlc3BvbnNlSW5pdC5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHJlc3BvbnNlSW5pdC5oZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpXG4gICAgfVxuXG4gICAgaWYgKGJvZHkgJiYgIXJlc3BvbnNlSW5pdC5oZWFkZXJzLmhhcygnQ29udGVudC1MZW5ndGgnKSkge1xuICAgICAgcmVzcG9uc2VJbml0LmhlYWRlcnMuc2V0KCdDb250ZW50LUxlbmd0aCcsIGJvZHkuYnl0ZUxlbmd0aC50b1N0cmluZygpKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlSW5pdClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgUmVzcG9uc2VgIHdpdGggYSBgRm9ybURhdGFgIGJvZHkuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgKiBkYXRhLnNldCgnbmFtZScsICdBbGljZScpXG4gICAqXG4gICAqIEh0dHBSZXNwb25zZS5mb3JtRGF0YShkYXRhKVxuICAgKi9cbiAgc3RhdGljIGZvcm1EYXRhKFxuICAgIGJvZHk/OiBGb3JtRGF0YSxcbiAgICBpbml0PzogSHR0cFJlc3BvbnNlSW5pdCxcbiAgKTogSHR0cFJlc3BvbnNlPEZvcm1EYXRhPiB7XG4gICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2UoYm9keSwgbm9ybWFsaXplUmVzcG9uc2VJbml0KGluaXQpKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgY2hlY2tHbG9iYWxzIH0gZnJvbSAnLi91dGlscy9pbnRlcm5hbC9jaGVja0dsb2JhbHMnXG5cbmV4cG9ydCB7IFNldHVwQXBpIH0gZnJvbSAnLi9TZXR1cEFwaSdcblxuLyogSFRUUCBoYW5kbGVycyAqL1xuZXhwb3J0IHsgUmVxdWVzdEhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXJzL1JlcXVlc3RIYW5kbGVyJ1xuZXhwb3J0IHsgaHR0cCB9IGZyb20gJy4vaHR0cCdcbmV4cG9ydCB7IEh0dHBIYW5kbGVyLCBIdHRwTWV0aG9kcyB9IGZyb20gJy4vaGFuZGxlcnMvSHR0cEhhbmRsZXInXG5leHBvcnQgeyBncmFwaHFsIH0gZnJvbSAnLi9ncmFwaHFsJ1xuZXhwb3J0IHsgR3JhcGhRTEhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXJzL0dyYXBoUUxIYW5kbGVyJ1xuXG4vKiBXZWJTb2NrZXQgaGFuZGxlciAqL1xuZXhwb3J0IHsgd3MsIHR5cGUgV2ViU29ja2V0TGluayB9IGZyb20gJy4vd3MnXG5leHBvcnQge1xuICBXZWJTb2NrZXRIYW5kbGVyLFxuICB0eXBlIFdlYlNvY2tldEhhbmRsZXJFdmVudE1hcCxcbiAgdHlwZSBXZWJTb2NrZXRIYW5kbGVyQ29ubmVjdGlvbixcbn0gZnJvbSAnLi9oYW5kbGVycy9XZWJTb2NrZXRIYW5kbGVyJ1xuXG4vKiBVdGlscyAqL1xuZXhwb3J0IHsgbWF0Y2hSZXF1ZXN0VXJsIH0gZnJvbSAnLi91dGlscy9tYXRjaGluZy9tYXRjaFJlcXVlc3RVcmwnXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2hhbmRsZVJlcXVlc3QnXG5leHBvcnQge1xuICBvblVuaGFuZGxlZFJlcXVlc3QsXG4gIHR5cGUgVW5oYW5kbGVkUmVxdWVzdFN0cmF0ZWd5LFxuICB0eXBlIFVuaGFuZGxlZFJlcXVlc3RDYWxsYmFjayxcbn0gZnJvbSAnLi91dGlscy9yZXF1ZXN0L29uVW5oYW5kbGVkUmVxdWVzdCdcbmV4cG9ydCB7IGdldFJlc3BvbnNlIH0gZnJvbSAnLi9nZXRSZXNwb25zZSdcbmV4cG9ydCB7IGNsZWFuVXJsIH0gZnJvbSAnLi91dGlscy91cmwvY2xlYW5VcmwnXG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9ucy5cbiAqL1xuXG5leHBvcnQgdHlwZSB7IFNoYXJlZE9wdGlvbnMsIExpZmVDeWNsZUV2ZW50c01hcCB9IGZyb20gJy4vc2hhcmVkT3B0aW9ucydcblxuZXhwb3J0IHR5cGUge1xuICBSZXNwb25zZVJlc29sdmVyLFxuICBSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZSxcbiAgQXN5bmNSZXNwb25zZVJlc29sdmVyUmV0dXJuVHlwZSxcbiAgUmVxdWVzdEhhbmRsZXJPcHRpb25zLFxuICBEZWZhdWx0Qm9keVR5cGUsXG4gIERlZmF1bHRSZXF1ZXN0TXVsdGlwYXJ0Qm9keSxcbiAgSnNvbkJvZHlUeXBlLFxufSBmcm9tICcuL2hhbmRsZXJzL1JlcXVlc3RIYW5kbGVyJ1xuXG5leHBvcnQgdHlwZSB7XG4gIFJlcXVlc3RRdWVyeSxcbiAgSHR0cFJlcXVlc3RQYXJzZWRSZXN1bHQsXG4gIEh0dHBDdXN0b21QcmVkaWNhdGUsXG59IGZyb20gJy4vaGFuZGxlcnMvSHR0cEhhbmRsZXInXG5leHBvcnQgdHlwZSB7IEh0dHBSZXF1ZXN0SGFuZGxlciwgSHR0cFJlc3BvbnNlUmVzb2x2ZXIgfSBmcm9tICcuL2h0dHAnXG5cbmV4cG9ydCB0eXBlIHtcbiAgR3JhcGhRTFF1ZXJ5LFxuICBHcmFwaFFMVmFyaWFibGVzLFxuICBHcmFwaFFMUmVxdWVzdEJvZHksXG4gIEdyYXBoUUxSZXNwb25zZUJvZHksXG4gIEdyYXBoUUxKc29uUmVxdWVzdEJvZHksXG4gIEdyYXBoUUxPcGVyYXRpb25UeXBlLFxuICBHcmFwaFFMQ3VzdG9tUHJlZGljYXRlLFxufSBmcm9tICcuL2hhbmRsZXJzL0dyYXBoUUxIYW5kbGVyJ1xuZXhwb3J0IHR5cGUgeyBHcmFwaFFMUmVxdWVzdEhhbmRsZXIsIEdyYXBoUUxSZXNwb25zZVJlc29sdmVyIH0gZnJvbSAnLi9ncmFwaHFsJ1xuXG5leHBvcnQgdHlwZSB7IFdlYlNvY2tldERhdGEsIFdlYlNvY2tldEV2ZW50TGlzdGVuZXIgfSBmcm9tICcuL3dzJ1xuXG5leHBvcnQgdHlwZSB7IFBhdGgsIFBhdGhQYXJhbXMsIE1hdGNoIH0gZnJvbSAnLi91dGlscy9tYXRjaGluZy9tYXRjaFJlcXVlc3RVcmwnXG5leHBvcnQgdHlwZSB7IFBhcnNlZEdyYXBoUUxSZXF1ZXN0IH0gZnJvbSAnLi91dGlscy9pbnRlcm5hbC9wYXJzZUdyYXBoUUxSZXF1ZXN0J1xuXG5leHBvcnQgKiBmcm9tICcuL0h0dHBSZXNwb25zZSdcbmV4cG9ydCAqIGZyb20gJy4vZGVsYXknXG5leHBvcnQgeyBieXBhc3MgfSBmcm9tICcuL2J5cGFzcydcbmV4cG9ydCB7IHBhc3N0aHJvdWdoIH0gZnJvbSAnLi9wYXNzdGhyb3VnaCdcbmV4cG9ydCB7IGlzQ29tbW9uQXNzZXRSZXF1ZXN0IH0gZnJvbSAnLi9pc0NvbW1vbkFzc2V0UmVxdWVzdCdcblxuLy8gVmFsaWRhdGUgZW52aXJvbm1lbnRhbCBnbG9iYWxzIGJlZm9yZSBleGVjdXRpbmcgYW55IGNvZGUuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbGlicmFyeSBnaXZlcyB1c2VyLWZyaWVuZGx5IGVycm9yc1xuLy8gd2hlbiByYW4gaW4gdGhlIGVudmlyb25tZW50cyB0aGF0IHJlcXVpcmUgYWRkaXRpb25hbCBwb2x5ZmlsbHNcbi8vIGZyb20gdGhlIGVuZCB1c2VyLlxuY2hlY2tHbG9iYWxzKClcbiIsICIvLyBJbi1tZW1vcnkgc3RvcmUgZm9yIEFQSSBrZXlzIChjYW1lbENhc2UgdG8gbWF0Y2ggeW91ciBVSSBjb2x1bW5zKVxuaW1wb3J0IHR5cGUgeyBBUElLZXkgfSBmcm9tIFwiLi4vXCI7XG5cbi8vIERldGVybWluaXN0aWMgUk5HXG5mdW5jdGlvbiBtdWxiZXJyeTMyKHNlZWQ6IG51bWJlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGxldCB0ID0gKHNlZWQgKz0gMHg2ZDJiNzlmNSk7XG4gICAgdCA9IE1hdGguaW11bCh0IF4gKHQgPj4+IDE1KSwgdCB8IDEpO1xuICAgIHQgXj0gdCArIE1hdGguaW11bCh0IF4gKHQgPj4+IDcpLCB0IHwgNjEpO1xuICAgIHJldHVybiAoKHQgXiAodCA+Pj4gMTQpKSA+Pj4gMCkgLyA0Mjk0OTY3Mjk2O1xuICB9O1xufVxuY29uc3QgcmFuZCA9IG11bGJlcnJ5MzIoNDIpO1xuXG5mdW5jdGlvbiByYW5kSW50KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICByZXR1cm4gTWF0aC5mbG9vcihyYW5kKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xufVxuZnVuY3Rpb24gY2hhbmNlKHA6IG51bWJlcikge1xuICByZXR1cm4gcmFuZCgpIDwgcDtcbn1cbmZ1bmN0aW9uIHNhbXBsZTxUPihhcnI6IFRbXSkge1xuICByZXR1cm4gYXJyW3JhbmRJbnQoMCwgYXJyLmxlbmd0aCAtIDEpXTtcbn1cblxuY29uc3QgYWRqZWN0aXZlcyA9IFtcbiAgXCJhbHBoYVwiLFwiYnJhdm9cIixcImNoYXJsaWVcIixcImRlbHRhXCIsXCJlY2hvXCIsXCJmb3h0cm90XCIsXCJnYW1tYVwiLFwib21lZ2FcIixcIm5vdmFcIixcInByaW1lXCIsXG4gIFwicmFwaWRcIixcInNpbGVudFwiLFwic3RlbGxhclwiLFwidGVycmFcIixcInVsdHJhXCIsXCJ2ZWN0b3JcIixcInplblwiLFwic3BhcmtcIixcInF1YW50dW1cIixcImx1bmFyXCIsXG5dO1xuY29uc3Qgbm91bnMgPSBbXG4gIFwia2V5XCIsXCJhY2Nlc3NcIixcInRva2VuXCIsXCJnYXRld2F5XCIsXCJzd2l0Y2hcIixcImJyaWRnZVwiLFwiYW5jaG9yXCIsXCJiZWFjb25cIixcInNpZ25hbFwiLFwicGlsb3RcIixcbiAgXCJydW5uZXJcIixcIm1pcnJvclwiLFwicm9ja2V0XCIsXCJlbmdpbmVcIixcImNpcmN1aXRcIixcInRlbnNvclwiLFwibWF0cml4XCIsXCJuZXh1c1wiLFwib3JiaXRcIixcInB1bHNlXCIsXG5dO1xuXG5mdW5jdGlvbiByYW5kb21OYW1lKCk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgJHtzYW1wbGUoYWRqZWN0aXZlcyl9LSR7c2FtcGxlKG5vdW5zKX1gO1xuICBjb25zdCBzdWZmaXggPSBjaGFuY2UoMC42KSA/IGBfJHtyYW5kSW50KDEsIDk5OSl9YCA6IGNoYW5jZSgwLjUpID8gYC52JHtyYW5kSW50KDEsIDkpfWAgOiBcIlwiO1xuICBjb25zdCBuYW1lID0gYmFzZSArIHN1ZmZpeDtcbiAgcmV0dXJuIG5hbWUuc2xpY2UoMCwgTWF0aC5tYXgoMywgTWF0aC5taW4oMzUsIG5hbWUubGVuZ3RoKSkpO1xufVxuXG5mdW5jdGlvbiByYW5kb21SYXdLZXkoKTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgyNCk7XG4gIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpO1xuICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydEtleUZyb20ocmF3OiBzdHJpbmcpIHtcbiAgaWYgKHJhdy5sZW5ndGggPD0gNikgcmV0dXJuIHJhdztcbiAgcmV0dXJuIGAke3Jhdy5zbGljZSgwLCAzKX0uLi4ke3Jhdy5zbGljZSgtMyl9YDtcbn1cblxuZnVuY3Rpb24gZGF0ZURheXNBZ28oZGF5czogbnVtYmVyKSB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSgpO1xuICBkLnNldERhdGUoZC5nZXREYXRlKCkgLSBkYXlzKTtcbiAgcmV0dXJuIGQ7XG59XG5mdW5jdGlvbiBkYXRlQmV0d2VlbkRheXNBZ28obWluRGF5czogbnVtYmVyLCBtYXhEYXlzOiBudW1iZXIpIHtcbiAgcmV0dXJuIGRhdGVEYXlzQWdvKHJhbmRJbnQobWluRGF5cywgbWF4RGF5cykpO1xufVxuZnVuY3Rpb24gaXNvKGQ6IERhdGUgfCBudWxsKSB7XG4gIHJldHVybiBkID8gZC50b0lTT1N0cmluZygpIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQVBJS2V5cyhjb3VudDogbnVtYmVyKTogQVBJS2V5W10ge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgb3V0OiBBUElLZXlbXSA9IFtdO1xuXG4gIHdoaWxlIChvdXQubGVuZ3RoIDwgY291bnQpIHtcbiAgICBsZXQgbmFtZSA9IHJhbmRvbU5hbWUoKTtcbiAgICB3aGlsZSAoc2V0LmhhcyhuYW1lKSkgbmFtZSA9IGAke25hbWV9LSR7cmFuZEludCgxLCA5OTk5KX1gO1xuICAgIHNldC5hZGQobmFtZSk7XG5cbiAgICBjb25zdCBjcmVhdGVkQXQgPSBkYXRlQmV0d2VlbkRheXNBZ28oMCwgNTQwKTtcbiAgICBjb25zdCBuZXZlclVzZWQgPSBjaGFuY2UoMC4yKTtcbiAgICBjb25zdCByZWNlbnRseVVzZWQgPSAhbmV2ZXJVc2VkICYmIGNoYW5jZSgwLjMpO1xuXG4gICAgY29uc3QgbWF4QWdlRGF5cyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKERhdGUubm93KCkgLSBjcmVhdGVkQXQuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKSk7XG4gICAgY29uc3QgbGFzdF91c2VkX2F0ID0gbmV2ZXJVc2VkXG4gICAgICA/IG51bGxcbiAgICAgIDogcmVjZW50bHlVc2VkXG4gICAgICA/IGRhdGVCZXR3ZWVuRGF5c0FnbygwLCBtYXhBZ2VEYXlzKVxuICAgICAgOiBkYXRlQmV0d2VlbkRheXNBZ28oTWF0aC5mbG9vcihtYXhBZ2VEYXlzIC8gMiksIG1heEFnZURheXMpO1xuXG4gICAgY29uc3QgZGlzYWJsZWQgPSBjaGFuY2UoMC4xNSk7XG4gICAgY29uc3QgZGlzYWJsZWRfYXQgPSBkaXNhYmxlZFxuICAgICAgPyBkYXRlQmV0d2VlbkRheXNBZ28oMCwgTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoKGxhc3RfdXNlZF9hdCA/PyBjcmVhdGVkQXQpLmdldFRpbWUoKSAtIGNyZWF0ZWRBdC5nZXRUaW1lKCkpIC8gODY0MDAwMDApKSlcbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHJhdyA9IHJhbmRvbVJhd0tleSgpO1xuICAgIG91dC5wdXNoKHtcbiAgICAgIG5hbWUsXG4gICAgICBzaG9ydF9rZXk6IHNob3J0S2V5RnJvbShyYXcpLFxuICAgICAgY3JlYXRlZF9hdDogY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0X3VzZWRfYXQ6IGlzbyhsYXN0X3VzZWRfYXQpLFxuICAgICAgZGlzYWJsZWRfYXQ6IGlzbyhkaXNhYmxlZF9hdCksXG4gICAgfSk7XG4gIH1cblxuICAvLyBFZGdlIGNhc2VzXG4gIGlmIChvdXRbMF0pIG91dFswXSA9IHsgLi4ub3V0WzBdLCBuYW1lOiBcImEtYlwiLCBsYXN0X3VzZWRfYXQ6IG51bGwgfTtcbiAgaWYgKG91dFsxXSkgb3V0WzFdID0geyAuLi5vdXRbMV0sIG5hbWU6IFwicHJvZC5rZXlfdjFcIiwgZGlzYWJsZWRfYXQ6IG91dFsxXS5kaXNhYmxlZF9hdCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcbiAgaWYgKG91dFsyXSkgb3V0WzJdID0geyAuLi5vdXRbMl0sIG5hbWU6IFwidGhpcy1pcy1hLXZlcnktbG9uZy1rZXktbmFtZS12ZXJzaW9uLTFcIiwgc2hvcnRfa2V5OiBcImFhYS4uLmJiYlwiIH07XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gUHVibGljIHN0YXRlIHRoYXQgbWF0Y2hlcyB5b3VyIGNsaWVudCBsaXN0IHNoYXBlXG5leHBvcnQgY29uc3QgYXBpS2V5czogeyBhcGlfa2V5czogQVBJS2V5W10gfSA9IHtcbiAgYXBpX2tleXM6IGdlbmVyYXRlQVBJS2V5cygxNTApLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleEJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFwaUtleXMuYXBpX2tleXMuZmluZEluZGV4KChrKSA9PiBrLm5hbWUgPT09IG5hbWUpO1xufSIsICJpbXBvcnQgeyBodHRwLCBIdHRwUmVzcG9uc2UsIHR5cGUgSHR0cEhhbmRsZXIgfSBmcm9tIFwibXN3XCI7XG5pbXBvcnQgdHlwZSB7IEFQSUtleSB9IGZyb20gXCIuLi9cIjtcbmltcG9ydCB7IGFwaUtleXMsIGZpbmRJbmRleEJ5TmFtZSwgc2hvcnRLZXlGcm9tIH0gZnJvbSBcIi4vc3RhdGVcIjtcblxuZnVuY3Rpb24gcmFuZG9tUmF3S2V5KCk6IHN0cmluZyB7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMjQpO1xuICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTtcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xufVxuXG4vLyBDcmVhdGUgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gYmFzZSBwcmVmaXgsIGUuZy4gXCIvbW9ja2VkLWFwaS1rZXlzXCJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIYW5kbGVycyhiYXNlUHJlZml4OiBzdHJpbmcpOiBIdHRwSGFuZGxlcltdIHtcbiAgY29uc3QgYmFzZSA9IGJhc2VQcmVmaXgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuICByZXR1cm4gW1xuICAgIC8vIEdFVCAvYXBpLWtleXMgXHUyMTkyIGxpbWl0IHRvIDEwIGl0ZW1zXG4gICAgaHR0cC5nZXQoYCR7YmFzZX0vYXBpLWtleXNgLCAoKSA9PiB7XG4gICAgICByZXR1cm4gSHR0cFJlc3BvbnNlLmpzb24oeyBhcGlfa2V5czogYXBpS2V5cy5hcGlfa2V5cy5zbGljZSgwLCAxMCkgfSk7XG4gICAgfSksXG5cbiAgICAvLyBDcmVhdGVcbiAgICBodHRwLnBvc3QoYCR7YmFzZX0vYXBpLWtleXNgLCBhc3luYyAoeyByZXF1ZXN0IH0pID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVxdWVzdC5qc29uKCkpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgICAgY29uc3QgbmFtZSA9IChib2R5Lm5hbWUgfHwgXCJcIikudHJpbSgpO1xuXG4gICAgICBpZiAoIS9eW0EtWmEtejAtOS5fLV17MywzNX0kLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UuanNvbih7IGVycm9yOiBcImludmFsaWQgbmFtZVwiIH0sIHsgc3RhdHVzOiA0MDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZmluZEluZGV4QnlOYW1lKG5hbWUpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCJuYW1lIGFscmVhZHkgZXhpc3RzXCIgfSwgeyBzdGF0dXM6IDQwOSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3ID0gcmFuZG9tUmF3S2V5KCk7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBjcmVhdGVkOiBBUElLZXkgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNob3J0X2tleTogc2hvcnRLZXlGcm9tKHJhdyksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IG5vdyxcbiAgICAgICAgbGFzdF91c2VkX2F0OiBudWxsLFxuICAgICAgICBkaXNhYmxlZF9hdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBhcGlLZXlzLmFwaV9rZXlzLnVuc2hpZnQoY3JlYXRlZCk7XG5cbiAgICAgIC8vIFJldHVybiBib3RoIGNhbWVsIGFuZCBzbmFrZSB2YXJpYW50cyBpZiB5b3VyIHNjaGVtYSBkaWZmZXJzOyBoYXJtbGVzcyBmb3IgVUkgbm90IHVzaW5nIGl0IHlldFxuICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZS5qc29uKHsgcmF3X2FwaV9rZXk6IHJhdywgYXBpX2tleTogY3JlYXRlZCB9KTtcbiAgICB9KSxcblxuICAgIC8vIEdldCBieSBuYW1lXG4gICAgaHR0cC5nZXQoYCR7YmFzZX0vYXBpLWtleXMvOm5hbWVgLCAoeyBwYXJhbXMgfSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gZmluZEluZGV4QnlOYW1lKFN0cmluZyhwYXJhbXMubmFtZSB8fCBcIlwiKSk7XG4gICAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIEh0dHBSZXNwb25zZS5qc29uKHsgZXJyb3I6IFwibm90IGZvdW5kXCIgfSwgeyBzdGF0dXM6IDQwNCB9KTtcbiAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UuanNvbih7IGFwaV9rZXk6IGFwaUtleXMuYXBpX2tleXNbaWR4XSB9KTtcbiAgICB9KSxcblxuICAgIC8vIERlbGV0ZVxuICAgIGh0dHAuZGVsZXRlKGAke2Jhc2V9L2FwaS1rZXlzLzpuYW1lYCwgKHsgcGFyYW1zIH0pID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IGZpbmRJbmRleEJ5TmFtZShTdHJpbmcocGFyYW1zLm5hbWUgfHwgXCJcIikpO1xuICAgICAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiBIdHRwUmVzcG9uc2UuanNvbih7IGVycm9yOiBcIm5vdCBmb3VuZFwiIH0sIHsgc3RhdHVzOiA0MDQgfSk7XG4gICAgICBhcGlLZXlzLmFwaV9rZXlzLnNwbGljZShpZHgsIDEpO1xuICAgICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDIwNCB9KTtcbiAgICB9KSxcblxuICAgIC8vIERpc2FibGVcbiAgICBodHRwLnBvc3QoYCR7YmFzZX0vYXBpLWtleXMvOm5hbWUvZGlzYWJsZWAsICh7IHBhcmFtcyB9KSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBmaW5kSW5kZXhCeU5hbWUoU3RyaW5nKHBhcmFtcy5uYW1lIHx8IFwiXCIpKTtcbiAgICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gSHR0cFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCJub3QgZm91bmRcIiB9LCB7IHN0YXR1czogNDA0IH0pO1xuICAgICAgYXBpS2V5cy5hcGlfa2V5c1tpZHhdLmRpc2FibGVkX2F0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZS5qc29uKHsgYXBpX2tleTogYXBpS2V5cy5hcGlfa2V5c1tpZHhdIH0pO1xuICAgIH0pLFxuXG4gICAgLy8gRW5hYmxlXG4gICAgaHR0cC5wb3N0KGAke2Jhc2V9L2FwaS1rZXlzLzpuYW1lL2VuYWJsZWAsICh7IHBhcmFtcyB9KSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBmaW5kSW5kZXhCeU5hbWUoU3RyaW5nKHBhcmFtcy5uYW1lIHx8IFwiXCIpKTtcbiAgICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gSHR0cFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCJub3QgZm91bmRcIiB9LCB7IHN0YXR1czogNDA0IH0pO1xuICAgICAgYXBpS2V5cy5hcGlfa2V5c1tpZHhdLmRpc2FibGVkX2F0ID0gbnVsbDtcbiAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UuanNvbih7IGFwaV9rZXk6IGFwaUtleXMuYXBpX2tleXNbaWR4XSB9KTtcbiAgICB9KSxcbiAgXTtcbn0iLCAiaW1wb3J0IHsgc2V0dXBXb3JrZXIgfSBmcm9tIFwibXN3L2Jyb3dzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUhhbmRsZXJzIH0gZnJvbSBcIi4vaGFuZGxlcnNcIjtcblxuLy8gU3RhcnQgTVNXIGZvciB0aGUgZ2l2ZW4gYmFzZSBwcmVmaXggKGUuZy4sIFwiL21vY2tlZC1hcGkta2V5c1wiIG9yIFwiaHR0cDovL2xvY2FsaG9zdDo4MDg4L21vY2tlZC1hcGkta2V5c1wiKVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TW9ja3MoYmFzZVByZWZpeDogc3RyaW5nKSB7XG4gIGNvbnN0IHdvcmtlciA9IHNldHVwV29ya2VyKC4uLmNyZWF0ZUhhbmRsZXJzKGJhc2VQcmVmaXgpKTtcbiAgYXdhaXQgd29ya2VyLnN0YXJ0KHtcbiAgICBvblVuaGFuZGxlZFJlcXVlc3Q6IFwiYnlwYXNzXCIsXG4gICAgc2VydmljZVdvcmtlcjogeyB1cmw6IFwiL21vY2tTZXJ2aWNlV29ya2VyLmpzXCIgfSwgLy8gY3JlYXRlZCBieSBgbXN3IGluaXQgLi9zdGF0aWNgXG4gIH0pO1xuICByZXR1cm4gd29ya2VyO1xufSIsICJpbXBvcnQgeyBjcmVhdGVBUElDbGllbnQgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBpbml0QXBpS2V5c1RhYmxlIH0gZnJvbSBcIi4vbGlzdC1rZXlzXCI7XG5pbXBvcnQgeyB1c2VBUElLZXlDcmVhdGlvbiB9IGZyb20gXCIuL2NyZWF0ZS1rZXlzXCI7XG5pbXBvcnQgeyBzdGFydE1vY2tzIH0gZnJvbSBcIi4vYXBpL21vY2tpbmcvYnJvd3NlclwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fQVBJS0VZTUFOQUdFTUVOVF9DT05GSUdfXzoge1xuICAgICAgYXBpQmFzZVVybDogc3RyaW5nO1xuICAgIH07XG4gIH1cbn1cblxuY29uc3QgQVBpQmFzZVVybCA9IHdpbmRvdy5fX0FQSUtFWU1BTkFHRU1FTlRfQ09ORklHX18uYXBpQmFzZVVybDtcblxuY29uc3QgQXBpQ2xpZW50ID0gY3JlYXRlQVBJQ2xpZW50KEFQaUJhc2VVcmwpO1xuXG5mdW5jdGlvbiBpbml0aWFsaXplQXBpS2V5TWFuYWdlbWVudCgpIHtcbiAgY29uc3QgYXBpS2V5c1RhYmxlcyA9IGluaXRBcGlLZXlzVGFibGUoQXBpQ2xpZW50KTtcblxuICB1c2VBUElLZXlDcmVhdGlvbihBcGlDbGllbnQsIHtcbiAgICBvbkNyZWF0ZWQ6ICgpID0+IHtcbiAgICAgIGFwaUtleXNUYWJsZXM/LmFqYXgucmVsb2FkKClcbiAgICB9LFxuICB9KTtcbiAgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjc2ltbXVsYXRlUmVsb2FkXCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIGFwaUtleXNUYWJsZXM/LmFqYXgucmVsb2FkKCk7XG4gIH0pO1xufVxuXG4oYXN5bmMgKCkgPT4ge1xuICAvLyBTdGFydCBNU1cgdW5jb25kaXRpb25hbGx5ICh0ZW1wb3JhcnkpXG4gIGF3YWl0IHN0YXJ0TW9ja3MoQVBpQmFzZVVybCk7XG5cbiAgaW5pdGlhbGl6ZUFwaUtleU1hbmFnZW1lbnQoKTtcblxufSkoKTtcblxuLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge1xuLy8gICBpbml0aWFsaXplQXBpS2V5TWFuYWdlbWVudCgpO1xuLy8gfSk7Il0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLElBQU0sZ0JBQWdCO0FBRXRCLElBQU0seUJBQXlCLE1BQU07QUFDbkMsU0FDRSxPQUFPLFlBQVksWUFDbkIsT0FBTyxTQUFTLFNBQVMsVUFBVSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FB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QUFDLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBYSxDQUFDLEdBQUUsRUFBQyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQWEsQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLFdBQVUsR0FBRSxDQUFDLEdBQUUsTUFBYSxDQUFDLEdBQUUsRUFBQyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE1BQWEsQ0FBQyxHQUFFLEVBQUMsTUFBSyxHQUFFLENBQUMsR0FBRSxNQUFhLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBYSxDQUFDLEdBQUUsRUFBQyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE1BQWEsQ0FBQyxHQUFFLEVBQUMsVUFBUyxHQUFFLENBQUMsR0FBRSxNQUFhLENBQUMsR0FBRSxFQUFDLFVBQVMsR0FBRSxDQUFDLEdBQUUsTUFBYSxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQWEsQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFhLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFhLENBQUMsR0FBRSxFQUFDLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBYSxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxHQUFFLENBQUM7QUFDNzFILFFBQU1DLFNBQWUsQ0FBQyxHQUFFLEVBQUMsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxRQUFPLENBQUMsR0FBRSxFQUFDLFdBQVUsSUFBRyxXQUFVLElBQUcsMEJBQXlCLElBQUcsdUJBQXNCLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLG9CQUFtQixJQUFHLHVCQUFzQixJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsYUFBWSxJQUFHLGVBQWMsSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxpQkFBZ0IsSUFBRyxnQkFBZSxJQUFHLFdBQVUsSUFBRyxpQkFBZ0IsSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsaUJBQWdCLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsa0JBQWlCLElBQUcsU0FBUSxJQUFHLGVBQWMsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLGVBQWMsSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxjQUFhLElBQUcsZUFBYyxJQUFHLGVBQWMsSUFBRyx5QkFBd0IsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFVBQVMsR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxRQUFPLENBQUMsR0FBRSxFQUFDLFFBQU8sSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxLQUFJLFFBQU8sQ0FBQyxHQUFFLEVBQUMsV0FBVSxJQUFHLFVBQVMsSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsS0FBSSxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxhQUFZLENBQUMsR0FBRSxFQUFDLFFBQU8sR0FBRSxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsRUFBQyxLQUFJLElBQUcsTUFBSyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsaUJBQWdCLElBQUcsaUJBQWdCLElBQUcsWUFBVyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsVUFBUyxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLGdCQUFlLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsYUFBWSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLGFBQVksQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxnQkFBZSxHQUFFLENBQUMsR0FBRSxPQUFNLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxPQUFNLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsV0FBVSxLQUFJLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLHNCQUFxQixDQUFDLEdBQUUsRUFBQyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFlBQVcsQ0FBQyxHQUFFLEVBQUMsV0FBVSxHQUFFLENBQUMsR0FBRSxjQUFhLElBQUcsZ0JBQWUsSUFBRyxZQUFXLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsT0FBTSxDQUFDLEdBQUUsRUFBQyxlQUFjLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxXQUFVLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsZUFBYyxJQUFHLGNBQWEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLFNBQVEsSUFBRyxjQUFhLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsS0FBSSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxpQkFBZ0IsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sQ0FBQyxHQUFFLEVBQUMsY0FBYSxHQUFFLENBQUMsR0FBRSxZQUFXLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLGFBQVksSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFVBQVMsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsT0FBTSxLQUFJLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsZUFBYyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLGFBQVksR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsU0FBUSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUss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QUFNLElBQUcsY0FBYSxJQUFHLGdCQUFLLElBQUcsY0FBYSxJQUFHLGdCQUFLLElBQUcsY0FBYSxJQUFHLGdCQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLGNBQWEsSUFBRyxhQUFZLEtBQUksZUFBYyxJQUFHLGdCQUFlLElBQUcsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsb0JBQW1CLElBQUcsUUFBTyxJQUFHLFlBQVcsQ0FBQyxHQUFFLEVBQUMsWUFBVyxJQUFHLFdBQVUsR0FBRSxDQUFDLEVBQUMsQ0FBQyxHQUFFLE9BQU0sQ0FBQyxHQUFFLEVBQUMsWUFBVyxJQUFHLFlBQVcsSUFBRyxpQkFBZ0IsQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxVQUFTLElBQUcsY0FBYSxJQUFHLGtCQUFpQixJQUFHLGFBQVksSUFBRyxhQUFZLENBQUMsR0FBRSxFQUFDLGNBQWEsS0FBSSxh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QUcsWUFBVyxJQUFHLFlBQVcsQ0FBQyxHQUFFLEVBQUMsU0FBUSxHQUFFLENBQUMsR0FBRSxXQUFVLElBQUcsYUFBWSxJQUFHLGVBQWMsSUFBRyxnQkFBZSxJQUFHLG1CQUFrQixDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLFlBQVcsR0FBRSxDQUFDLEdBQUUsWUFBVyxHQUFFLENBQUMsR0FBRSxRQUFPLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsZUFBYyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLGNBQWEsSUFBRyxDQUFDLEdBQUUsV0FBVSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLGlCQUFnQixDQUFDLEdB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RyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsWUFBVyxHQUFFLENBQUMsR0FBRSxPQUFNLENBQUMsR0FBRSxFQUFDLE9BQU0sQ0FBQyxHQUFFLEVBQUMsYUFBWSxHQUFFLENBQUMsRUFBQyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxLQUFJLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsZ0JBQWUsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLFdBQVUsSUFBRyxVQUFTLENBQUMsR0FBRSxFQUFDLFlBQVcsR0FBRSxDQUFDLEdBQUUsU0FBUSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLGVBQWMsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsTUFBSyxJQUFHLG1CQUFrQixJQUFHLGVBQVcsSUFBRyxPQUFNLElBQUcsaUJBQWdCLENBQUMsR0FBRSxFQUFDLE1BQUssR0FBRSxDQUFDLEdBQUUsY0FBYSxDQUFDLEdBQUUsRUFBQyxRQUFPLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxTQUFRLElBQUcsZUFBYyxJQUFHLGdCQUFlLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsb0JBQW1CLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxtQ0FBa0MsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcseUJBQXdCLElBQUcsc0JBQXFCLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxnQkFBZSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLFVBQVMsR0FBRSxDQUFDLEVBQUMsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsY0FBYSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGFBQVksSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGFBQVksSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxLQUFJLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxnQkFBZSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLFdBQVUsSUFBRyxXQUFVLElBQUcsY0FBYSxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsZ0JBQWUsQ0FBQyxHQUFFLEVBQUMsaUJBQWdCLElBQUcsZUFBYyxJQUFHLGNBQWEsSUFBRyxlQUFjLEdBQUUsQ0FBQyxHQUFFLGtDQUFRLENBQUMsR0FBRSxFQUFDLHdDQUFTLElBQUcsNEJBQU8sSUFBRyxzQkFBTSxJQUFHLDRCQUFPLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLFNBQVEsSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFH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SUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxRQUFPLENBQUMsR0FBRSxFQUFDLE1BQUssR0FBRSxDQUFDLEdBQUUsZUFBYyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLGdCQUFlLElBQUcsWUFBVyxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxLQUFJLE1BQUssQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsUUFBTyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsV0FBVSxLQUFJLFVBQVMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsU0FBUSxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGVBQWMsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxhQUFZLEdBQUUsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxTQUFRLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxjQUFhLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsaUJBQWdCLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxtQkFBa0IsSUFBRyxjQUFhLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLGVBQWMsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsY0FBYSxHQUFFLENBQUMsR0FBRSxTQUFRLENBQUMsR0FBRSxFQUFDLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFdBQVUsQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGFBQVksR0FBRSxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsRUFBQyxhQUFZLElBQUcsY0FBYSxJQUFHLGlCQUFnQixJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLGNBQWEsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxnQkFBZSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFVBQVMsR0FBRSxDQUFDLEdBQUUsUUFBTyxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxvQkFBbUIsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGVBQWMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxjQUFhLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxTQUFRLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLG1CQUFrQixJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxZQUFXLEdBQUUsQ0FBQyxHQUFFLGFBQVksQ0FBQyxHQUFFLEVBQUMsYUFBWSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsb0JBQW1CLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxpQkFBZ0IsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxZQUFXLEdBQUUsQ0FBQyxHQUFFLFlBQVcsQ0FBQyxHQUFFLEVBQUMsWUFBVyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsZ0JBQWUsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsZUFBYyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsZ0JBQWUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLGlCQUFnQixJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsZ0JBQWUsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxnQkFBZSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGdCQUFlLElBQUcsZ0JBQWUsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsZUFBYyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxnQkFBZSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxlQUFjLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxHQUFFLENBQUMsR0FBRSxXQUFVLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxlQUFjLElBQUcsZ0JBQWUsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsZUFBYyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxjQUFhLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLGVBQWMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsWUFBVyxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxpQkFBZ0IsSUFBRyxTQUFRLElBQUcsZUFBYyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsV0FBVSxJQUFHLGlCQUFnQixJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFlBQVcsR0FBRSxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxhQUFZLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxnQkFBZSxJQUFHLGlCQUFnQixJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxZQUFXLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsa0JBQWlCLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsZ0JBQWUsSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsR0FBRSxDQUFDLEdBQUUsWUFBVyxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGVBQWMsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLGVBQWMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsY0FBYSxHQUFFLENBQUMsR0FBRSxTQUFRLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxlQUFjLElBQUcsZUFBYyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxtQkFBa0IsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsVUFBUyxHQUFFLENBQUMsR0FBRSxPQUFNLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsYUFBWSxHQUFFLENBQUMsR0FBRSxVQUFTLENBQUMsR0FBRSxFQUFDLFlBQVcsSUFBRyxxQkFBb0IsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsaUJBQWdCLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLGlCQUFnQixJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLFlBQVcsQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxjQUFhLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxpQkFBZ0IsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxjQUFhLElBQUcsY0FBYSxJQUFHLGdCQUFlLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsZUFBYyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsZ0JBQWUsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxZQUFXLENBQUMsR0FBRSxFQUFDLFdBQVUsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLGdCQUFlLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFFBQU8sQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsa0JBQWlCLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxpQkFBZ0IsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsa0JBQWlCLElBQUcsZ0JBQWUsSUFBRyxXQUFVLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxXQUFVLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsZUFBYyxJQUFHLGdCQUFlLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFFBQU8sQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxXQUFVLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxHQUFFLENBQUMsR0FBRSxXQUFVLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLGtCQUFpQixJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLGtCQUFpQixJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsZ0JBQWUsSUFBRyxvQkFBbUIsSUFBRyxtQkFBa0IsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsZUFBYyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxlQUFjLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLGdCQUFlLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLFFBQU8sQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLGVBQWMsR0FBRSxDQUFDLEdBQUUsV0FBVSxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxtQkFBa0IsSUFBRyxvQkFBbUIsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxnQkFBZSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxTQUFRLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLFdBQVUsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLGdCQUFlLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGdCQUFlLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxZQUFXLENBQUMsR0FBRSxFQUFDLFFBQU8sSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxjQUFhLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxXQUFVLENBQUMsR0FBRSxFQUFDLFlBQVcsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsZ0JBQWUsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLGFBQVksQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxnQkFBZSxJQUFHLGNBQWEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsbUJBQWtCLElBQUcsaUJBQWdCLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxtQkFBa0IsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFdBQVUsR0FBRSxDQUFDLEdBQUUsV0FBVSxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLGVBQWMsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGVBQWMsSUFBRyxjQUFhLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFlBQVcsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxZQUFXLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxNQUFLLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLGFBQVksQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLGVBQWMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGtCQUFpQixJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxnQkFBZSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxhQUFZLEdBQUUsQ0FBQyxHQUFFLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGtCQUFpQixJQUFHLHNCQUFNLElBQUcsZUFBYyxJQUFHLGdCQUFLLElBQUcsaUJBQWdCLElBQUcsc0JBQU0sSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxhQUFZLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxhQUFZLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxhQUFZLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxjQUFhLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxrQkFBaUIsSUFBRyxzQkFBTSxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGVBQWMsSUFBRyxnQkFBSyxJQUFHLGNBQWEsSUFBRyxnQkFBSyxJQUFHLGdCQUFlLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxlQUFjLElBQUcsZ0JBQUssSUFBRyxrQkFBaUIsSUFBRyxzQkFBTSxJQUFHLFlBQVcsS0FBSSxjQUFhLEtBQUksUUFBTyxLQUFJLFVBQVMsS0FBSSxXQUFVLEtBQUksVUFBUyxLQUFJLFlBQVcsS0FBSSxXQUFVLElBQUcsZ0JBQWUsSUFBRyxlQUFjLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGVBQWMsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxhQUFZLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLGVBQWMsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsaUJBQWdCLENBQUMsR0FBRSxFQUFDLFNBQVEsS0FBSSxTQUFRLElBQUcsQ0FBQyxHQUFFLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFlBQVcsQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsWUFBVyxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLGVBQWMsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFVBQVMsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLGNBQWEsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxRQUFPLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLGVBQWMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsV0FBVSxLQUFJLFVBQVMsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLFVBQVMsR0FBRSxDQUFDLEdBQUUsTUFBSyxLQUFJLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsWUFBVyxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLFVBQVMsSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxP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QUssQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLEtBQUksSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLG1CQUFrQixJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLGdCQUFlLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLGFBQVksSUFBRyxjQUFhLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksYUFBWSxLQUFJ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QUFXLElBQUcsYUFBWSxJQUFHLGVBQWMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLG9CQUFtQixJQUFHLGdCQUFZLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsZUFBUSxJQUFHLFVBQVMsSUFBRyxjQUFhLElBQUcsdUJBQXNCLElBQUcsc0JBQWEsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLGlCQUFnQixJQUFHLGFBQVksSUFBRyxvQkFBbUIsSUFBRyxnQkFBWSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsaUJBQWdCLElBQUcsTUFBSyxJQUFHLGFBQVksSUFBRyxTQUFLLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxVQUFTLElBQUcscUJBQW9CLElBQUcsaUJBQWEsSUFBRyxjQUFhLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGdCQUFlLElBQUcsdUJBQXNCLElBQUcsc0JBQWUsSUFBRyxjQUFhLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsZ0JBQWUsSUFBRyxhQUFZLElBQUcsV0FBVSxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxHQUFFLENBQUMsR0FBRSxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsZUFBYyxJQUFHLFlBQVcsSUFBRyxtQkFBa0IsSUFBRyxlQUFXLElBQUcsYUFBWSxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLGFBQVksSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLGVBQVcsSUFBRyxhQUFZLElBQUcsb0JBQW1CLElBQUcsZ0JBQVksSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxrQkFBaUIsSUFBRyxjQUFVLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGtCQUFpQixJQUFHLGNBQVUsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLGtCQUFpQixJQUFHLGNBQVUsSUFBRyxjQUFhLElBQUcsdUJBQXNCLElBQUcseUJBQWEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxpQkFBZ0IsSUFBRyxhQUFTLElBQUcsY0FBYSxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLGVBQWMsSUFBRyxhQUFZLElBQUcsb0JBQW1CLElBQUcsZ0JBQVksSUFBRyxXQUFVLElBQUcsa0JBQWlCLElBQUcsY0FBVSxJQUFHLGdCQUFlLElBQUcsZ0JBQWUsSUFBRyxjQUFhLElBQUcscUJBQW9CLElBQUcsaUJBQWEsSUFBRyxtQkFBa0IsSUFBRyxlQUFXLElBQUcsb0JBQW1CLElBQUcsZ0JBQVksSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLGNBQWEsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLGtCQUFpQixJQUFHLGNBQVUsSUFBRyxnQkFBZSxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsc0JBQXFCLElBQUcsb0JBQWMsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLGVBQWMsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsZUFBVyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLG9CQUFtQixJQUFHLGdCQUFZLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLGVBQWMsSUFBRyxzQkFBcUIsSUFBRyxrQkFBYyxJQUFHLFdBQVUsSUFBRyxrQkFBaUIsSUFBRyxjQUFVLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsaUJBQWdCLElBQUcsZUFBUSxJQUFHLGlCQUFnQixJQUFHLHdCQUF1QixJQUFHLHVCQUFnQixJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxXQUFVLElBQUcsa0JBQWlCLElBQUcsY0FBVSxJQUFHLFdBQVUsSUFBRyxrQkFBaUIsSUFBRyxXQUFVLElBQUcsa0JBQWlCLElBQUcsY0FBVSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLG1CQUFrQixDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSwwQkFBeUIsQ0FBQyxHQUFFLEVBQUMsZ0JBQWUsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLHNCQUFrQixDQUFDLEdBQUUsRUFBQyxZQUFRLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLGtCQUFpQixJQUFHLHlCQUF3QixJQUFHLHdCQUFpQixJQUFHLGlCQUFnQixJQUFHLGVBQVEsSUFBRyxjQUFhLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxhQUFZLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxtQkFBa0IsSUFBRyxlQUFXLElBQUcsZUFBYyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLGVBQWMsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsWUFBVyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsYUFBWSxJQUFHLFNBQUssSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLEdBQUUsQ0FBQyxHQUFFLGVBQWMsSUFBRyxhQUFZLElBQUcsaUJBQWdCLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxtQkFBa0IsSUFBRyxrQkFBVyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLGVBQVcsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLGtCQUFpQixJQUFHLGNBQVUsSUFBRyxXQUFVLENBQUMsR0FBRSxFQUFDLFNBQVEsR0FBRSxDQUFDLEdBQUUsa0JBQWlCLENBQUMsR0FBRSxFQUFDLGdCQUFlLEdBQUUsQ0FBQyxHQUFFLGNBQVUsQ0FBQyxHQUFFLEVBQUMsWUFBUSxHQUFFLENBQUMsR0FBRSxlQUFjLElBQUcsc0JBQXFCLElBQUcsa0JBQWMsSUFBRyxhQUFZLElBQUcsY0FBYSxJQUFHLHFCQUFvQixJQUFHLGlCQUFhLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxXQUFPLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLGVBQVcsSUFBRyxpQkFBZ0IsSUFBRyx3QkFBdUIsSUFBRyxvQkFBZ0IsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLHFCQUFvQixJQUFHLG9CQUFXLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsV0FBTyxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxtQkFBa0IsSUFBRyxlQUFXLElBQUcsZUFBYyxJQUFHLHNCQUFxQixJQUFHLHFCQUFjLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsZUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxlQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsa0JBQWlCLElBQUcsY0FBVSxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxRQUFPLElBQUcsZUFBYyxJQUFHLFdBQU8sSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLFdBQVUsSUFBRyxrQkFBaUIsSUFBRyxjQUFVLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLGdCQUFlLElBQUcsZUFBUSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsY0FBYSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLGFBQVMsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsZUFBVyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsa0JBQWlCLElBQUcsY0FBVSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLGVBQVcsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLFVBQVMsSUFBRyxpQkFBZ0IsSUFBRyxhQUFTLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsZUFBYyxJQUFHLHNCQUFxQixJQUFHLGtCQUFjLElBQUcsYUFBWSxJQUFHLGNBQWEsSUFBRyxxQkFBb0IsSUFBRyxpQkFBYSxJQUFHLFlBQVcsSUFBRyxtQkFBa0IsSUFBRyxlQUFXLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLGVBQVcsSUFBRyxnQkFBZSxJQUFHLHVCQUFzQixJQUFHLG1CQUFlLElBQUcsV0FBVSxJQUFHLGtCQUFpQixJQUFHLGNBQVUsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsZUFBVyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsZUFBVyxJQUFHLFVBQVMsSUFBRyxlQUFjLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsWUFBVyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsYUFBWSxJQUFHLFNBQUssR0FBRSxDQUFDLEdBQUUsUUFBTyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxtQkFBa0IsSUFBRyxlQUFXLElBQUcsV0FBVSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsZUFBVyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsaUJBQWdCLElBQUcsYUFBUyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsZUFBYyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxpQkFBZ0IsSUFBRyxhQUFTLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxrQkFBaUIsSUFBRyxjQUFVLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsZ0JBQWUsSUFBRyxZQUFRLElBQUcsaUJBQWdCLElBQUcsZUFBUSxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsY0FBTyxJQUFHLFNBQVEsSUFBRyxnQkFBZSxJQUFHLFlBQVEsSUFBRyxVQUFTLElBQUcsa0JBQWlCLElBQUcsZ0JBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsWUFBUSxJQUFHLFdBQVUsSUFBRyxrQkFBaUIsSUFBRyxpQkFBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxvQkFBbUIsSUFBRyxnQkFBWSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxZQUFXLENBQUMsR0FBRSxFQUFDLFNBQVEsR0FBRSxDQUFDLEdBQUUsV0FBVSxJQUFHLGlCQUFnQixJQUFHLGdCQUFlLElBQUcsYUFBWSxJQUFHLHFCQUFvQixJQUFHLG1CQUFZLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLE1BQUssSUFBRyxpQkFBZ0IsSUFBRyxnQkFBZSxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssQ0FBQyxHQUFFLEVBQUMsWUFBVyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsbUJBQWtCLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLGdCQUFlLElBQUcsY0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxTQUFRLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxjQUFhLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsZUFBYyxJQUFHLFNBQVEsQ0FBQyxHQUFFLEVBQUMsS0FBSSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsZ0JBQWUsQ0FBQyxHQUFFLEVBQUMsVUFBUyxDQUFDLEdBQUUsRUFBQyxPQUFNLEdBQUUsQ0FBQyxFQUFDLENBQUMsR0FBRSxNQUFLLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxzQkFBcUIsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLGVBQWMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxpQkFBZ0IsSUFBRyxvQkFBbUIsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLGtCQUFpQixJQUFHLGtCQUFpQixJQUFHLG1CQUFrQixJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsZUFBYyxJQUFHLG1CQUFrQixJQUFHLGdCQUFlLElBQUcsZUFBYyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLGVBQWMsSUFBRyxnQkFBZSxJQUFHLGdCQUFlLElBQUcsZ0JBQWUsSUFBRyxpQkFBZ0IsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLGVBQWMsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxpQkFBZ0IsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxnQkFBZSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsZUFBYyxJQUFHLFVBQVMsSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxRQUFPLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsb0JBQW1CLElBQUcsZ0JBQWUsSUFBRyxpQkFBZ0IsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLE1BQUssS0FBSSxPQUFNLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxDQUFDLEVBQUMsQ0FBQyxHQUFFLGVBQWMsSUFBRyxlQUFjLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsTUFBSyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsa0JBQWlCLElBQUcsZUFBYyxJQUFHLGNBQWEsSUFBRyxvQkFBbUIsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxvQkFBbUIsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLGVBQWMsSUFBRyxjQUFhLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFdBQVUsS0FBSSxhQUFZLElBQUcsZUFBYyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsYUFBWSxJQUFHLFdBQVUsQ0FBQyxHQUFFLEVBQUMsUUFBTyxHQUFFLENBQUMsR0FBRSxXQUFVLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxLQUFJLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFdBQVUsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsaUJBQWdCLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsTUFBSyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLE9BQU0sQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLGFBQVksSUFBRyxNQUFLLElBQUcsUUFBTyxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxNQUFLLElBQUcsVUFBUyxHQUFFLENBQUMsR0FBRSxZQUFXLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLGVBQWMsSUFBRyxhQUFZLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLGdCQUFlLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsbUJBQWtCLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsY0FBYSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLGdCQUFlLElBQUcsZ0JBQWUsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsZUFBYyxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLGtCQUFpQixJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGdCQUFlLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLE1BQUssSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLGdCQUFlLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxXQUFVLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxRQUFPLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE9BQU0sQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsZ0JBQWUsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsV0FBVSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxRQUFPLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsUUFBTyxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxXQUFVLEtBQUksU0FBUSxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxjQUFhLElBQUcsT0FBTSxJQUFHLGVBQWMsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxVQUFTLENBQUMsR0FBRSxFQUFDLFdBQVUsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsV0FBVSxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFNBQVEsS0FBSSxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsS0FBSSxJQUFHLE1BQUssSUFBRyxLQUFJLElBQUcsTUFBSyxJQUFHLFNBQVEsSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLFdBQVUsSUFBRyxtQkFBa0IsSUFBRyxVQUFTLElBQUcsS0FBSSxJQUFHLFVBQVMsSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLGtCQUFpQixJQUFHLEtBQUksSUFBRyxPQUFNLElBQUcsS0FBSSxJQUFHLFNBQVEsSUFBRyxNQUFLLElBQUcsU0FBUSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLE1BQUssSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLEtBQUksSUFBRyxLQUFJLElBQUcsS0FBSSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLGdCQUFlLElBQUcsZ0JBQWUsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFlBQVcsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFlBQVcsQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFlBQVcsSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLFVBQVMsSUFBRyxXQUFVLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxXQUFVLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxhQUFZLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsWUFBVyxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsZUFBYyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLG1CQUFrQixJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLG9CQUFtQixJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxlQUFjLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsWUFBVyxJQUFHLFdBQVUsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssSUFBRyxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsVUFBUyxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGVBQWMsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxnQkFBZSxLQUFJLFdBQVUsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxlQUFjLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxjQUFhLElBQUcsUUFBTyxJQUFH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TSxJQUFHLFVBQVMsSUFBRyxPQUFNLEtBQUksUUFBTyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsMEJBQXlCLElBQUcsdUJBQXNCLElBQUcsdUJBQXNCLElBQUcscUJBQW9CLElBQUcsc0JBQXFCLElBQUcsa0JBQWlCLElBQUcsb0JBQW1CLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsc0JBQXFCLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLENBQUMsR0FBRSxFQUFDLFFBQU8sSUFBRyxVQUFTLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGFBQVksR0FBRSxDQUFDLEdBQUUsTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLENBQUMsR0FBRSxFQUFDLE9BQU0sSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxNQUFLLEtBQUksTUFBSyxLQUFJLFdBQVUsSUFBRyxTQUFRLElBQUcsZUFBYyxJQUFHLGdCQUFlLElBQUcsYUFBWSxJQUFHLFlBQVcsQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxZQUFXLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFlBQVcsSUFBRyxjQUFhLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxNQUFLLElBQUcsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxNQUFLLENBQUMsR0FBRSxFQUFDLEtBQUksR0FBRSxDQUFDLEdBQUUsTUFBSyxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxRQUFPLElBQUcsT0FBTSxJQUFHLE1BQUssSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxPQUFNLEdBQUUsQ0FBQyxHQUFFLE1BQUssQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGlCQUFnQixJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxxQkFB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SyxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsTUFBSyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxXQUFVLENBQUMsR0FBRSxFQUFDLFlBQVcsR0FBRSxDQUFDLEdBQUUsYUFBWSxJQUFHLGNBQWEsSUFBRyxlQUFjLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxtQkFBa0IsSUFBRyxrQkFBaUIsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxjQUFhLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxhQUFZLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxXQUFVLEdBQUUsQ0FBQyxHQUFFLFVBQVMsSUFBRyxRQUFPLElBQUcsa0JBQWlCLElBQUcsYUFBWSxJQUFHLFFBQU8sQ0FBQyxHQUFFLEVBQUMsWUFBVyxHQUFFLENBQUMsR0FBRSxhQUFZLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxXQUFVLEdBQUUsQ0FBQyxHQUFFLGVBQWMsSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLE9BQU0sSUFBRyxVQUFTLElB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SUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLGVBQWMsSUFBRyxlQUFjLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxjQUFhLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxZQUFXLEdBQUUsQ0FBQyxHQUFFLFlBQVcsQ0FBQyxHQUFFLEVBQUMsYUFBWSxHQUFFLENBQUMsR0FBRSxZQUFXLEtBQUksT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFFBQU8sQ0FBQyxHQUFFLEVBQUMsT0FBTSxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxFQUFDLENBQUMsR0FBRSxTQUFRLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFFBQU8sQ0FBQyxHQUFFLEVBQUMsUUFBTyxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxFQUFDLENBQUMsR0FBRSxRQUFPLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFdBQVUsSUFBRyxXQUFVLElBQUcsV0FBVSxDQUFDLEdBQUUsRUFBQyxRQUFPLEdBQUUsQ0FBQyxHQUFFLFVBQVMsSUFBRyxZQUFXLENBQUMsR0FBRSxFQUFDLE9BQU0sR0FBRSxDQUFDLEdBQUUsUUFBTyxJQUFHLGNBQWEsQ0FBQyxHQUFFLEVBQUMsU0FBUSxDQUFDLEdBQUUsRUFBQyxPQUFNLENBQUMsR0FBRSxFQUFDLE9BQU0sR0FBRSxDQUFDLEVBQUMsQ0FBQyxHQUFFLE9BQU0sR0FBRSxDQUFDLEdBQUUsV0FBVSxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLE9BQU0sQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsWUFBVyxDQUFDLEdBQUUsRUFBQyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFdBQVUsQ0FBQyxHQUFFLEVBQUMsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLGdCQUFlLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxNQUFLLEdBQUUsQ0FBQyxHQUFFLFFBQU8sSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLFVBQVMsSUFBRyxnQkFBZSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLE9BQU0sQ0FBQyxHQUFFLEVBQUMsYUFBWSxDQUFDLEdBQUUsRUFBQyxZQUFXLElBQUcsWUFBVyxJQUFHLFlBQVcsR0FBRSxDQUFDLEdBQUUsVUFBUyxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLGFBQVksR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLE9BQU0sS0FBSSxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsY0FBYSxJQUFHLFFBQU8sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLGFBQVksQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLFVBQVMsQ0FBQyxHQUFFLEVBQUMsV0FBVSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sS0FBSSxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsY0FBYSxJQUFHLFFBQU8sSUFBRyxPQUFNLEdBQUUsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsV0FBVSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sS0FBSSxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxNQUFLLElBQUcsY0FBYSxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsYUFBWSxJQUFHLGlCQUFnQixHQUFFLENBQUMsR0FBRSxhQUFZLElBQUcsYUFBWSxDQUFDLEdBQUUsRUFBQyxRQUFPLEdBQUUsQ0FBQyxHQUFFLGVBQWMsSUFBRyxtQkFBa0IsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsUUFBTyxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsUUFBTyxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLE9BQU0sR0FBRSxDQUFDLEdBQUUsVUFBUyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLGFBQVksQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLFdBQVUsSUFBRyxXQUFVLEdBQUUsQ0FBQyxHQUFFLFdBQVUsSUFBRyxXQUFVLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsZ0JBQWUsSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLGVBQWMsSUFBRyxXQUFVLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxhQUFZLElBQUcsTUFBSyxHQUFFLENBQUMsR0FBRSxXQUFVLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLGVBQWMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFVBQVMsQ0FBQyxHQUFFLEVBQUMsV0FBVSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsT0FBTSxDQUFDLEdBQUUsRUFBQyxXQUFVLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsWUFBVyxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsU0FBUSxJQUFHLE1BQUssSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLGdCQUFlLElBQUcsUUFBTyxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLFdBQVUsR0FBRSxDQUFDLEdBQUUsYUFBWSxJQUFHLE9BQU0sSUFBRyxpQkFBZ0IsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxpQkFBZ0IsSUFBRyxhQUFZLENBQUMsR0FBRSxFQUFDLFFBQU8sR0FBRSxDQUFDLEdBQUUsYUFBWSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxjQUFhLElBQUcsa0JBQWlCLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxlQUFjLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxVQUFTLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsTUFBSyxJQUFHLFdBQVUsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLE9BQU0sQ0FBQyxHQUFFLEVBQUMsS0FBSSxJQUFHLEtBQUksSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssSUFBRyxNQUFLLElBQUcsTUFBSyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsT0FBTSxLQUFJLFVBQVMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFFBQU8sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsV0FBVSxDQUFDLEdBQUUsRUFBQyxhQUFZLENBQUMsR0FBRSxFQUFDLFVBQVMsR0FBRSxDQUFDLEVBQUMsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsVUFBUyxHQUFFLENBQUMsR0FBRSxhQUFZLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxhQUFZLEtBQUksU0FBUSxDQUFDLEdBQUUsRUFBQyxTQUFRLENBQUMsR0FBRSxFQUFDLE1BQUssR0FBRSxDQUFDLEdBQUUsUUFBTyxLQUFJLFVBQVMsSUFBRyxDQUFDLEdBQUUsVUFBUyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsZUFBYyxJQUFHLGVBQWMsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFVBQVMsQ0FBQyxHQUFFLEVBQUMsV0FBVSxHQUFFLENBQUMsR0FBRSxjQUFhLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsQ0FBQyxHQUFFLFVBQVMsQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLE1BQUssR0FBRSxDQUFDLEdBQUUsWUFBVyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGNBQWEsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFdBQVUsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLGFBQVksS0FBSSxRQUFPLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLGNBQWEsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxPQUFNLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLFFBQU8sSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLE9BQU0sSUFBRyxVQUFTLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFFBQU8sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLFFBQU8sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLFFBQU8sSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxVQUFTLENBQUMsR0FBRSxFQUFDLFlBQVcsR0FBRSxDQUFDLEdBQUUsU0FBUSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxRQUFPLENBQUMsR0FBRSxFQUFDLFNBQVEsSUFBRyxhQUFZLElBQUcsZUFBYyxHQUFFLENBQUMsR0FBRSxVQUFTLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLGFBQVksR0FBRSxDQUFDLEdBQUUsU0FBUSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsVUFBUyxDQUFDLEdBQUUsRUFBQyxPQUFNLEdBQUUsQ0FBQyxHQUFFLGNBQWEsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxhQUFZLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxlQUFjLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLFdBQVUsQ0FBQyxHQUFFLEVBQUMsYUFBWSxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxPQUFNLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLGlCQUFnQixJQUFHLFVBQVMsSUFBRyxlQUFjLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsbUJBQWtCLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxNQUFLLElBQUcsT0FBTSxHQUFFLENBQUMsR0FBRSxRQUFPLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsZUFBYyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsaUJBQWdCLElBQUcsYUFBWSxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFFBQU8sQ0FBQyxHQUFFLEVBQUMsV0FBVSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsYUFBWSxJQUFHLGNBQWEsS0FBSSxTQUFRLElBQUcsWUFBVyxLQUFJLE9BQU0sSUFBRyxDQUFDLEdBQUUsUUFBTyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLE9BQU0sQ0FBQyxHQUFFLEVBQUMsT0FBTSxHQUFFLENBQUMsR0FBRSxVQUFTLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLGdCQUFlLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLFNBQVEsS0FBSSxRQUFPLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxZQUFXLElBQUcsT0FBTSxJQUFHLFFBQU8sQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLGVBQWMsR0FBRSxDQUFDLEdBQUUsU0FBUSxJQUFHLFlBQVcsSUFBRyxTQUFRLElBQUcsYUFBWSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLGNBQWEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFdBQVUsQ0FBQyxHQUFFLEVBQUMsT0FBTSxJQUFHLFNBQVEsSUFBRyxNQUFLLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxRQUFPLEdBQUUsQ0FBQyxHQUFFLFdBQVUsSUFBRyxPQUFNLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxjQUFhLEdBQUUsQ0FBQyxHQUFFLFFBQU8sSUFBRyxjQUFhLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsZUFBYyxJQUFHLFFBQU8sSUFBRyxTQUFRLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsV0FBVSxHQUFFLENBQUMsR0FBRSxPQUFNLENBQUMsR0FBRSxFQUFDLE9BQU0sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLFVBQVMsQ0FBQyxHQUFFLEVBQUMsUUFBTyxJQUFHLGNBQWEsSUFBRyxrQkFBaUIsSUFBRyxZQUFXLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLENBQUMsR0FBRSxFQUFDLFFBQU8sR0FBRSxDQUFDLEdBQUUsV0FBVSxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLFdBQVUsR0FBRSxDQUFDLEdBQUUsUUFBTyxDQUFDLEdBQUUsRUFBQyxPQUFNLElBQUcsT0FBTSxJQUFHLGNBQWEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFNBQVEsR0FBRSxDQUFDLEdBQUUsYUFBWSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsVUFBUyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsZUFBYyxJQUFHLFVBQVMsS0FBSSxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxZQUFXLENBQUMsR0FBRSxFQUFDLFFBQU8sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLFNBQVEsR0FBRSxDQUFDLEdBQUUsU0FBUSxLQUFJLFFBQU8sSUFBRyxlQUFjLElBQUcsWUFBVyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxlQUFjLElBQUcsUUFBTyxJQUFHLGVBQWMsSUFBRyxTQUFRLElBQUcsY0FBYSxJQUFHLFlBQVcsSUFBRyxjQUFhLElBQUcsT0FBTSxJQUFHLGNBQWEsSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLE1BQUssSUFBRyxPQUFNLElBQUcsU0FBUSxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsV0FBVSxJQUFHLE9BQU0sSUFBRyxlQUFjLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFlBQVcsSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxRQUFPLElBQUcsY0FBYSxJQUFHLFVBQVMsSUFBRyxXQUFVLENBQUMsR0FBRSxFQUFDLE9BQU0sR0FBRSxDQUFDLEdBQUUsV0FBVSxJQUFHLFFBQU8sSUFBRyxhQUFZLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxDQUFDLEdBQUUsRUFBQyxRQUFPLEdBQUUsQ0FBQyxHQUFFLFNBQVEsQ0FBQyxHQUFFLEVBQUMsVUFBUyxJQUFHLFdBQVUsSUFBRyxhQUFZLElBQUcsWUFBVyxHQUFFLENBQUMsR0FBRSxTQUFRLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxPQUFNLENBQUMsR0FBRSxFQUFDLFlBQVcsSUFBRyxTQUFRLElBQUcsZUFBYyxJQUFHLFdBQVUsSUFBRyxTQUFRLENBQUMsR0FBRSxFQUFDLFFBQU8sR0FBRSxDQUFDLEdBQUUsV0FBVSxJQUFHLFNBQVEsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxPQUFNLEtBQUksVUFBUyxJQUFHLE9BQU0sR0FBRSxDQUFDLEdBQUUsT0FBTSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxtQkFBa0IsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsUUFBTyxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxjQUFhLElBQUcsV0FBVSxJQUFHLGdCQUFlLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLFFBQU8sQ0FBQyxHQUFFLEVBQUMsT0FBTSxDQUFDLEdBQUUsRUFBQyxXQUFVLEdBQUUsQ0FBQyxFQUFDLENBQUMsR0FBRSxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsWUFBVyxDQUFDLEdBQUUsRUFBQyxhQUFZLEdBQUUsQ0FBQyxHQUFFLFNBQVEsSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsYUFBWSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsUUFBTyxDQUFDLEdBQUUsRUFBQyxRQUFPLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxlQUFjLElBQUcsWUFBVyxHQUFFLENBQUMsR0FBRSxZQUFXLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxRQUFPLENBQUMsR0FBRSxFQUFDLFVBQVMsSUFBRyxTQUFRLEtBQUksWUFBVyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFdBQVUsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLGFBQVksSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxjQUFhLElBQUcsWUFBVyxJQUFHLFdBQVUsSUFBRyxjQUFhLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFVBQVMsSUFBRyxhQUFZLElBQUcsZUFBYyxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsWUFBVyxJQUFHLFlBQVcsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsU0FBUSxDQUFDLEdBQUUsRUFBQyxVQUFTLElBQUcsU0FBUSxJQUFHLE1BQUssQ0FBQyxHQUFFLEVBQUMsVUFBUyxHQUFFLENBQUMsR0FBRSxhQUFZLElBQUcsV0FBVSxJQUFHLFFBQU8sSUFBRyxVQUFTLEdBQUUsQ0FBQyxHQUFFLFNBQVEsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLGFBQVksSUFBRyxhQUFZLElBQUcsT0FBTSxJQUFHLFlBQVcsSUFBRyxhQUFZLElBQUcsV0FBVSxJQUFHLFNBQVEsQ0FBQyxHQUFFLEVBQUMsU0FBUSxJQUFHLFVBQVMsSUFBRyxZQUFXLElBQUcsYUFBWSxHQUFFLENBQUMsR0FBRSxVQUFTLElBQUcsVUFBUyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFlBQVcsSUFBRyxVQUFTLElBQUcsV0FBVSxDQUFDLEdBQUUsRUFBQyxTQUFRLEdBQUUsQ0FBQyxHQUFFLFFBQU8sSUFBRyxXQUFVLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLFdBQVUsQ0FBQyxHQUFFLEVBQUMsZUFBYyxHQUFFLENBQUMsR0FBRSxPQUFNLElBQUcsVUFBUyxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLE9BQU0sSUFBRyxRQUFPLENBQUMsR0FBRSxFQUFDLGFBQVksSUFBRyxZQUFXLEdBQUUsQ0FBQyxHQUFFLFFBQU8sQ0FBQyxHQUFFLEVBQUMsY0FBYSxHQUFFLENBQUMsR0FBRSxjQUFhLEtBQUksV0FBVSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsT0FBTSxJQUFHLFdBQVUsSUFBRyxXQUFVLElBQUcsUUFBTyxJQUFHLFdBQVUsSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsVUFBUyxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsU0FBUSxJQUFHLFNBQVEsQ0FBQyxHQUFFLEVBQUMsZ0JBQWUsR0FBRSxDQUFDLEdBQUUsU0FBUSxJQUFHLFNBQVEsQ0FBQyxHQUFFLEVBQUMsUUFBTyxLQUFJLFVBQVMsR0FBRSxDQUFDLEdBQUUsT0FBTSxDQUFDLEdBQUUsRUFBQyxTQUFRLElBQUcsUUFBTyxHQUFFLENBQUMsR0FBRSxTQUFRLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxTQUFRLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsU0FBUSxJQUFHLFdBQVUsSUFBRyxZQUFXLElBQUcsVUFBUyxJQUFHLGFBQVksSUFBRyxzQkFBcUIsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFFBQU8sSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLFNBQVEsSUFBRyxPQUFNLElBQUcsU0FBUSxJQUFHLE9BQU0sSUFBRyxVQUFTLElBQUcsY0FBYSxJQUFHLE9BQU0sSUFBRyxPQUFNLElBQUcsT0FBTSxJQUFHLGFBQVksSUFBRyxRQUFPLElBQUcsWUFBVyxJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsWUFBVyxJQUFHLGdCQUFlLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsT0FBTSxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsT0FBTSxJQUFHLE9BQU0sQ0FBQyxHQUFFLEVBQUMsU0FBUSxHQUFFLENBQUMsR0FBRSxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsUUFBTyxJQUFHLGNBQWEsSUFBRyxTQUFRLElBQUcsU0FBUSxJQUFHLFFBQU8sSUFBRyxVQUFTLElBQUcsUUFBTyxJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FBVSxJQUFHLFVBQVMsSUFBRyxRQUFPLElBQUcsV0FBVSxJQUFHLFNBQVEsSUFBRyxXQUFVLElBQUcsV0FBVSxJQUFHLGtCQUFpQixJQUFHLFVBQVMsSUFBRyxTQUFRLElBQUcsV0FB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O0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBR0QsSUFBSSxtQkFBbUIsV0FBVztBQUFBLEVBQ2hDLG1FQUFtRSxTQUFTLFFBQVE7QUFDbEY7QUFD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QUFrQixXQUFXO0FBQUEsSUFDM0IsV0FBVyxNQUFNO0FBQ2YscUJBQWUsS0FBSyxPQUFPO0FBQUEsSUFDN0I7QUFBQSxFQUNGLENBQUM7QUFFRCxXQUFTLGNBQWMsa0JBQWtCLEdBQUcsaUJBQWlCLFNBQVMsTUFBTTtBQUMxRSxtQkFBZSxLQUFLLE9BQU87QUFBQSxFQUM3QixDQUFDO0FBQ0g7QUFBQSxDQUVDLFlBQVk7QUFFWCxRQUFNLFdBQVcsVUFBVTtBQUUzQiw2QkFBMkI7QUFFN0IsR0FBRzsiLAogICJuYW1lcyI6IFsiZmV0Y2giLCAiUmVxdWVzdCIsICJlcnJvciIsICJmaW5hbCIsICJqb2luZXIiLCAibWF0Y2giLCAiZXJyb3IiLCAiaXNvIiwgIm1lc3NhZ2UiLCAiJCIsICJERUZBVUxUT1BUSU9OUyIsICJtZXNzYWdlIiwgIm1hdGNoIiwgImVycm9yIiwgImZvcm1hdE1lc3NhZ2UiLCAibWVzc2FnZSIsICJlcnJvciIsICJlcnJvciIsICJlcnJvcjogYW55IiwgInN0cmF0ZWd5IiwgImV4dHJhY3RIb3N0bmFtZSIsICJzdWZmaXhMb29rdXAiLCAiZXhjZXB0aW9ucyIsICJydWxlcyIsICJfYSIsICJnZXREb21haW4iLCAiZ2V0RG9tYWluIiwgImVycm9yIiwgImNvb2tpZSIsICJpc09iamVjdCIsICJtZXNzYWdlIiwgImZvcm1hdERhdGUiLCAiX0Nvb2tpZSIsICJjYiIsICJ3aXRoQ29va2llIiwgImVyciIsICJodHRwIiwgIm5vdyIsICJyZW1vdmVDb29raWVDYiIsICJjb29raWUiLCAibWVzc2FnZTIiLCAiX19jb21tb25KUyIsICJpc05vbkVtcHR5U3RyaW5nIiwgImNvb2tpZSIsICJ2YWx1ZSIsICJwYXJzZSIsICJjb29raWVzIiwgInNwbGl0Q29va2llc1N0cmluZyIsICJfX3RvRVNNIiwgIkhlYWRlcnMiLCAibWVzc2FnZSIsICJIZWFkZXJzIiwgInNvdXJjZUVtaXQiLCAiX19kZWZQcm9wIiwgIm1lc3NhZ2UiLCAibWVzc2FnZTIiLCAid2FybiIsICJlcnJvciIsICJfYSIsICJtZXNzYWdlIiwgIl9hIiwgImtFbWl0dGVyIiwgImtCb3VuZExpc3RlbmVyIiwgImtFbWl0dGVyIiwgImludmFyaWFudCIsICJrQm91bmRMaXN0ZW5lciIsICJlcnJvciIsICJlcnJvciIsICJtZXNzYWdlIiwgIlBPU0lUSU9OQUxTX0VYUCIsICJzZXJpYWxpemVQb3NpdGlvbmFsIiwgImZvcm1hdCIsICJtZXNzYWdlIiwgIm1hdGNoIiwgIlNUQUNLX0ZSQU1FU19UT19JR05PUkUiLCAiY2xlYW5FcnJvclN0YWNrIiwgImVycm9yIiwgIkludmFyaWFudEVycm9yIiwgImludmFyaWFudCIsICJmb3JtYXRNZXNzYWdlIiwgImlzTm9kZVByb2Nlc3MiLCAiY3JlYXRlRGVmZXJyZWRFeGVjdXRvciIsICJEZWZlcnJlZFByb21pc2UiLCAidW50aWwiLCAiZXJyb3I6IGFueSIsICJ3b3JrZXIiLCAiZGV2VXRpbHMiLCAiX19kZWZQcm9wIiwgIl9fZXhwb3J0IiwgImNvbG9yc19leHBvcnRzIiwgImJsdWUiLCAiZ3JheSIsICJncmVlbiIsICJyZWQiLCAieWVsbG93IiwgIklTX05PREUiLCAiTG9nZ2VyIiwgImdldFZhcmlhYmxlIiwgImlzRGVmaW5lZEFuZE5vdEVxdWFscyIsICJub29wIiwgIlBlcmZvcm1hbmNlRW50cnkiLCAibWVzc2FnZTIiLCAic2VyaWFsaXplSW5wdXQiLCAibG9nIiwgIndhcm4iLCAiTWVtb3J5TGVha0Vycm9yIiwgIl9FbWl0dGVyIiwgIkVtaXR0ZXIiLCAiZ2V0R2xvYmFsU3ltYm9sIiwgInNldEdsb2JhbFN5bWJvbCIsICJkZWxldGVHbG9iYWxTeW1ib2wiLCAiSW50ZXJjZXB0b3IiLCAiX2EiLCAiY3JlYXRlUmVxdWVzdElkIiwgIl9fcHJpdmF0ZUFkZCIsICJfX3ByaXZhdGVHZXQiLCAic3ltYm9sIiwgImtEZWZhdWx0UHJldmVudGVkIiwgImVtaXRBc3luYyIsICJoYXNDb25maWd1cmFibGVHbG9iYWwiLCAiaXNPYmplY3QiLCAiaGFuZGxlUmVxdWVzdCIsICJyZWFkYWJsZSIsICJ0cmFuc2Zvcm1lcnMiLCAicmVzcG9uc2UiLCAibmV4dCIsICJpc0hhbmRsZXJLaW5kIiwgIm1lcmdlUmlnaHQiLCAibWVzc2FnZSIsICJwYXJzZSIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJyZXN1bHQiLCAiY2hhciIsICJwcmVmaXgiLCAiX2EiLCAiaSIsICJwYXJzZSIsICJfYiIsICJfYyIsICJlbmNvZGVyIiwgIklTX1BBVENIRURfTU9EVUxFIiwgIkludGVyY2VwdG9yRXJyb3IiLCAibWVzc2FnZSIsICJfaGFuZGxlZCIsICJoYW5kbGVkX2dldCIsICJfUmVxdWVzdENvbnRyb2xsZXIiLCAiUmVxdWVzdENvbnRyb2xsZXIiLCAiY2FuUGFyc2VVcmwiLCAiZ2V0VmFsdWVCeVN5bWJvbCIsICJzeW1ib2wiLCAiX0ZldGNoUmVzcG9uc2UiLCAiX2EiLCAiRmV0Y2hSZXNwb25zZSIsICJrUmF3UmVxdWVzdCIsICJjbGVhblVybCIsICJfX2NyZWF0ZSIsICJfX2RlZlByb3AiLCAiX19nZXRPd25Qcm9wRGVzYyIsICJfX2dldE93blByb3BOYW1lcyIsICJfX2dldFByb3RvT2YiLCAiX19oYXNPd25Qcm9wIiwgIl9fY29tbW9uSlMiLCAiX19jb3B5UHJvcHMiLCAiX190b0VTTSIsICJwYXJzZTIiLCAicGFyc2UiLCAicGFyc2UiLCAiY29va2llIiwgIkh0dHBNZXRob2RzIiwgIm1hdGNoIiwgIkZldGNoUmVzcG9uc2UiLCAicmFuZG9tUmF3S2V5Il0KfQo= diff --git a/static/mockServiceWorker.js b/static/mockServiceWorker.js new file mode 100644 index 0000000000..2f658e919a --- /dev/null +++ b/static/mockServiceWorker.js @@ -0,0 +1,349 @@ +/* eslint-disable */ +/* tslint:disable */ + +/** + * Mock Service Worker. + * @see https://github.com/mswjs/msw + * - Please do NOT modify this file. + */ + +const PACKAGE_VERSION = '2.11.6' +const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') +const activeClientIds = new Set() + +addEventListener('install', function () { + self.skipWaiting() +}) + +addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()) +}) + +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') + + if (!clientId || !self.clients) { + return + } + + const client = await self.clients.get(clientId) + + if (!client) { + return + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }) + break + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, + }) + break + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId) + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, + }) + break + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId) + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId + }) + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister() + } + + break + } + } +}) + +addEventListener('fetch', function (event) { + const requestInterceptedAt = Date.now() + + // Bypass navigation requests. + if (event.request.mode === 'navigate') { + return + } + + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { + return + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been terminated (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } + + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) +}) + +/** + * @param {FetchEvent} event + * @param {string} requestId + * @param {number} requestInterceptedAt + */ +async function handleRequest(event, requestId, requestInterceptedAt) { + const client = await resolveMainClient(event) + const requestCloneForEvents = event.request.clone() + const response = await getResponse( + event, + client, + requestId, + requestInterceptedAt, + ) + + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + const serializedRequest = await serializeRequest(requestCloneForEvents) + + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, + }, + }, + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) + } + + return response +} + +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ +async function resolveMainClient(event) { + const client = await self.clients.get(event.clientId) + + if (activeClientIds.has(event.clientId)) { + return client + } + + if (client?.frameType === 'top-level') { + return client + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) +} + +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @param {number} requestInterceptedAt + * @returns {Promise} + */ +async function getResponse(event, client, requestId, requestInterceptedAt) { + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = event.request.clone() + + function passthrough() { + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) + + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } + + return fetch(requestClone, { headers }) + } + + // Bypass mocking when the client is not active. + if (!client) { + return passthrough() + } + + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough() + } + + // Notify the client that a request has been intercepted. + const serializedRequest = await serializeRequest(event.request) + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + interceptedAt: requestInterceptedAt, + ...serializedRequest, + }, + }, + [serializedRequest.body], + ) + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) + } + + case 'PASSTHROUGH': { + return passthrough() + } + } + + return passthrough() +} + +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ +function sendToClient(client, message, transferrables = []) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel() + + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error) + } + + resolve(event.data) + } + + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) + }) +} + +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error() + } + + const mockedResponse = new Response(response.body, response) + + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }) + + return mockedResponse +} + +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } +} diff --git a/templates/components/apiBanner.html b/templates/components/apiBanner.html index 6fe371eca8..ae7c88bef5 100644 --- a/templates/components/apiBanner.html +++ b/templates/components/apiBanner.html @@ -24,7 +24,7 @@

Power Your ETH Validator Insights with Beaconcha.in APIs

diff --git a/templates/layout.html b/templates/layout.html index 02f10fda67..cdc05cd2f8 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -187,6 +187,7 @@